From a8e4ead618a3ca7b7d3f731b1c2ab731eb3aae3a Mon Sep 17 00:00:00 2001 From: Mars <3361409208a@gmail.com> Date: Thu, 4 Jun 2026 11:36:53 +0800 Subject: [PATCH] =?UTF-8?q?feat(admin,player,api):=20=E7=8E=A9=E5=AE=B6?= =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E5=AF=86=E7=A0=81=E7=AE=A1=E7=90=86=E4=B8=8E?= =?UTF-8?q?=E4=BB=A3=E7=90=86=E4=B8=8A=E4=B8=8B=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增玩家头像、可查密码与全局改密/改账号开关;玩家资料页合并账号密码展示;代理直属玩家列表支持自定义上下分。 Co-authored-by: Cursor --- apps/admin/src/i18n/admin-pages-ms.ts | 24 ++ apps/admin/src/i18n/admin-pages.ts | 48 +++ apps/admin/src/views/Users.vue | 242 +++++++++--- apps/admin/src/views/agent/Players.vue | 202 ++++++---- apps/admin/src/views/user-form.ts | 7 + apps/api/package.json | 2 +- .../migration.sql | 2 + .../migration.sql | 4 + apps/api/prisma/schema.prisma | 18 +- apps/api/prisma/seed.ts | 2 +- apps/api/src/app.module.ts | 2 + .../applications/admin/admin.controller.ts | 43 ++ .../applications/player/player.controller.ts | 41 +- apps/api/src/domains/agent/agents.service.ts | 1 + apps/api/src/domains/identity/auth.service.ts | 11 + .../api/src/domains/identity/users.service.ts | 142 ++++++- .../src/shared/config/system-config.module.ts | 9 + .../shared/config/system-config.service.ts | 59 +++ apps/player/src/assets/images/vs.png | Bin 0 -> 124985 bytes .../src/components/PlayerAvatarModal.vue | 125 ++++++ .../src/components/PlayerAvatarPicker.vue | 162 ++++++++ apps/player/src/components/UserAvatarMenu.vue | 27 +- apps/player/src/composables/usePlayerHome.ts | 2 + .../src/composables/usePlayerProfile.ts | 143 +++++++ apps/player/src/layouts/MainLayout.vue | 8 +- apps/player/src/main.ts | 54 +++ apps/player/src/views/HomeView.vue | 127 +++++- apps/player/src/views/ProfileEditView.vue | 367 +++++++++++++++--- package.json | 1 + .../球员/乌古尔坎·卡基尔-守門員-土耳其.jpg | Bin 0 -> 1810 bytes .../球员/乔治亚·德·阿拉斯凯塔-中场-乌拉圭.jpg | Bin 0 -> 1879 bytes .../球员/亚历杭德罗·曾德哈斯-前锋-美国.jpg | Bin 0 -> 2792 bytes .../public/球员/伦纳特·卡尔-中场-德国.jpg | Bin 0 -> 2029 bytes .../球员/何塞·曼努埃尔·洛佩斯-前锋-阿根廷.jpg | Bin 0 -> 2159 bytes .../shared/public/球员/佩德里-中场-西班牙.jpg | Bin 0 -> 1977 bytes .../克里斯蒂亚诺·罗纳尔多-前锋-葡萄牙.jpg | Bin 0 -> 1615 bytes .../球员/克里斯蒂安·罗梅罗-后卫-阿根廷.jpg | Bin 0 -> 1703 bytes .../shared/public/球员/内马尔-前锋-巴西.jpg | Bin 0 -> 2045 bytes .../public/球员/凯南·耶尔德兹-前锋-土耳其.jpg | Bin 0 -> 1720 bytes .../public/球员/华金·皮克雷斯-中场-乌拉圭.jpg | Bin 0 -> 1830 bytes .../shared/public/球员/卡塞米罗-中场-巴西.jpg | Bin 0 -> 1614 bytes .../球员/卢卡·莫德里奇-中场-克罗地亚.jpg | Bin 0 -> 1995 bytes .../public/球员/卢卡斯·帕奎塔-中场-巴西.jpg | Bin 0 -> 1862 bytes .../球员/吉列尔莫·奥乔亚-守門員-墨西哥.jpg | Bin 0 -> 1687 bytes .../public/球员/哈里·凯恩-前锋-英格兰.jpg | Bin 0 -> 1832 bytes .../球员/圣地亚哥·吉梅内斯-前锋-墨西哥.jpg | Bin 0 -> 1956 bytes .../public/球员/埃尔林·哈兰德-前锋-挪威.jpg | Bin 0 -> 1618 bytes .../球员/埃德森·阿尔瓦雷斯-后卫-墨西哥.jpg | Bin 0 -> 2004 bytes .../public/球员/埃贝雷奇·埃泽-中场-英格兰.jpg | Bin 0 -> 1906 bytes .../public/球员/基利安·姆巴佩-前锋-法国.jpg | Bin 0 -> 1888 bytes .../public/球员/奥斯曼·登贝莱-前锋-法国.jpg | Bin 0 -> 1647 bytes .../public/球员/孟菲斯·德派-前锋-荷兰.jpg | Bin 0 -> 1730 bytes .../public/球员/尼科·威廉斯-前锋-西班牙.jpg | Bin 0 -> 1713 bytes .../public/球员/巴勃罗·加维-中场-西班牙.jpg | Bin 0 -> 1670 bytes .../public/球员/布卡约·萨卡-前锋-英格兰.jpg | Bin 0 -> 1625 bytes .../public/球员/布鲁诺·吉马良斯-中场-巴西.jpg | Bin 0 -> 1639 bytes .../球员/布鲁诺·费尔南德斯-中场-葡萄牙.jpg | Bin 0 -> 1716 bytes .../public/球员/德尼兹·居尔-前锋-土耳其.jpg | Bin 0 -> 1665 bytes .../public/球员/德尼兹·温达夫-前锋-德国.jpg | Bin 0 -> 1741 bytes .../shared/public/球员/恩德里克-前锋-巴西.jpg | Bin 0 -> 1941 bytes .../球员/拉斐尔·迪亚斯·贝洛利-前锋-巴西.jpg | Bin 0 -> 1941 bytes .../public/球员/拉明·亚马尔-前锋-西班牙.jpg | Bin 0 -> 2049 bytes .../球员/曼努埃尔·诺伊尔-守門員-德国.jpg | Bin 0 -> 1701 bytes .../球员/朱利安·阿尔瓦雷斯-前锋-阿根廷.jpg | Bin 0 -> 1878 bytes .../shared/public/球员/梅西-前锋-阿根廷.jpg | Bin 0 -> 1827 bytes .../public/球员/祖德·贝林厄姆-中场-英格兰.jpg | Bin 0 -> 1835 bytes .../public/球员/穆罕默德·萨拉赫-前锋-埃及.jpg | Bin 0 -> 2020 bytes .../public/球员/维克托·哲凯赖什-前锋-瑞典.jpg | Bin 0 -> 1915 bytes .../球员/维尼修斯·儒尼奥尔-前锋-巴西.jpg | Bin 0 -> 1508 bytes .../球员/蒂博·库尔图瓦-守門員-比利时.jpg | Bin 0 -> 1826 bytes .../球员/费德里科·巴尔韦德-中场-乌拉圭.jpg | Bin 0 -> 1786 bytes .../public/球员/贾马尔·慕斯拉-中场-德国.jpg | Bin 0 -> 1743 bytes .../球员/路易斯·迪亚斯-前锋-哥伦比亚.jpg | Bin 0 -> 2480 bytes .../public/球员/迈克尔·奥利塞-前锋-法国.jpg | Bin 0 -> 1783 bytes .../球员/阿什拉夫·哈基米-后卫-摩洛哥.jpg | Bin 0 -> 2003 bytes .../public/球员/阿利松·贝克尔-守門員-巴西.jpg | Bin 0 -> 1710 bytes .../public/球员/阿尔达·居莱尔-前锋-土耳其.jpg | Bin 0 -> 1764 bytes .../球员/马库斯·拉什福德-前锋-英格兰.jpg | Bin 0 -> 1456 bytes .../球员/马西斯·拉扬·切尔基-中场-法国.jpg | Bin 0 -> 1965 bytes packages/shared/src/builtinPlayers.ts | 104 +++++ packages/shared/src/index.ts | 1 + 81 files changed, 1763 insertions(+), 217 deletions(-) create mode 100644 apps/api/prisma/migrations/20260603120000_user_avatar_key/migration.sql create mode 100644 apps/api/prisma/migrations/20260604120000_user_account_controls/migration.sql create mode 100644 apps/api/src/shared/config/system-config.module.ts create mode 100644 apps/api/src/shared/config/system-config.service.ts create mode 100644 apps/player/src/assets/images/vs.png create mode 100644 apps/player/src/components/PlayerAvatarModal.vue create mode 100644 apps/player/src/components/PlayerAvatarPicker.vue create mode 100644 apps/player/src/composables/usePlayerProfile.ts create mode 100644 packages/shared/public/球员/乌古尔坎·卡基尔-守門員-土耳其.jpg create mode 100644 packages/shared/public/球员/乔治亚·德·阿拉斯凯塔-中场-乌拉圭.jpg create mode 100644 packages/shared/public/球员/亚历杭德罗·曾德哈斯-前锋-美国.jpg create mode 100644 packages/shared/public/球员/伦纳特·卡尔-中场-德国.jpg create mode 100644 packages/shared/public/球员/何塞·曼努埃尔·洛佩斯-前锋-阿根廷.jpg create mode 100644 packages/shared/public/球员/佩德里-中场-西班牙.jpg create mode 100644 packages/shared/public/球员/克里斯蒂亚诺·罗纳尔多-前锋-葡萄牙.jpg create mode 100644 packages/shared/public/球员/克里斯蒂安·罗梅罗-后卫-阿根廷.jpg create mode 100644 packages/shared/public/球员/内马尔-前锋-巴西.jpg create mode 100644 packages/shared/public/球员/凯南·耶尔德兹-前锋-土耳其.jpg create mode 100644 packages/shared/public/球员/华金·皮克雷斯-中场-乌拉圭.jpg create mode 100644 packages/shared/public/球员/卡塞米罗-中场-巴西.jpg create mode 100644 packages/shared/public/球员/卢卡·莫德里奇-中场-克罗地亚.jpg create mode 100644 packages/shared/public/球员/卢卡斯·帕奎塔-中场-巴西.jpg create mode 100644 packages/shared/public/球员/吉列尔莫·奥乔亚-守門員-墨西哥.jpg create mode 100644 packages/shared/public/球员/哈里·凯恩-前锋-英格兰.jpg create mode 100644 packages/shared/public/球员/圣地亚哥·吉梅内斯-前锋-墨西哥.jpg create mode 100644 packages/shared/public/球员/埃尔林·哈兰德-前锋-挪威.jpg create mode 100644 packages/shared/public/球员/埃德森·阿尔瓦雷斯-后卫-墨西哥.jpg create mode 100644 packages/shared/public/球员/埃贝雷奇·埃泽-中场-英格兰.jpg create mode 100644 packages/shared/public/球员/基利安·姆巴佩-前锋-法国.jpg create mode 100644 packages/shared/public/球员/奥斯曼·登贝莱-前锋-法国.jpg create mode 100644 packages/shared/public/球员/孟菲斯·德派-前锋-荷兰.jpg create mode 100644 packages/shared/public/球员/尼科·威廉斯-前锋-西班牙.jpg create mode 100644 packages/shared/public/球员/巴勃罗·加维-中场-西班牙.jpg create mode 100644 packages/shared/public/球员/布卡约·萨卡-前锋-英格兰.jpg create mode 100644 packages/shared/public/球员/布鲁诺·吉马良斯-中场-巴西.jpg create mode 100644 packages/shared/public/球员/布鲁诺·费尔南德斯-中场-葡萄牙.jpg create mode 100644 packages/shared/public/球员/德尼兹·居尔-前锋-土耳其.jpg create mode 100644 packages/shared/public/球员/德尼兹·温达夫-前锋-德国.jpg create mode 100644 packages/shared/public/球员/恩德里克-前锋-巴西.jpg create mode 100644 packages/shared/public/球员/拉斐尔·迪亚斯·贝洛利-前锋-巴西.jpg create mode 100644 packages/shared/public/球员/拉明·亚马尔-前锋-西班牙.jpg create mode 100644 packages/shared/public/球员/曼努埃尔·诺伊尔-守門員-德国.jpg create mode 100644 packages/shared/public/球员/朱利安·阿尔瓦雷斯-前锋-阿根廷.jpg create mode 100644 packages/shared/public/球员/梅西-前锋-阿根廷.jpg create mode 100644 packages/shared/public/球员/祖德·贝林厄姆-中场-英格兰.jpg create mode 100644 packages/shared/public/球员/穆罕默德·萨拉赫-前锋-埃及.jpg create mode 100644 packages/shared/public/球员/维克托·哲凯赖什-前锋-瑞典.jpg create mode 100644 packages/shared/public/球员/维尼修斯·儒尼奥尔-前锋-巴西.jpg create mode 100644 packages/shared/public/球员/蒂博·库尔图瓦-守門員-比利时.jpg create mode 100644 packages/shared/public/球员/费德里科·巴尔韦德-中场-乌拉圭.jpg create mode 100644 packages/shared/public/球员/贾马尔·慕斯拉-中场-德国.jpg create mode 100644 packages/shared/public/球员/路易斯·迪亚斯-前锋-哥伦比亚.jpg create mode 100644 packages/shared/public/球员/迈克尔·奥利塞-前锋-法国.jpg create mode 100644 packages/shared/public/球员/阿什拉夫·哈基米-后卫-摩洛哥.jpg create mode 100644 packages/shared/public/球员/阿利松·贝克尔-守門員-巴西.jpg create mode 100644 packages/shared/public/球员/阿尔达·居莱尔-前锋-土耳其.jpg create mode 100644 packages/shared/public/球员/马库斯·拉什福德-前锋-英格兰.jpg create mode 100644 packages/shared/public/球员/马西斯·拉扬·切尔基-中场-法国.jpg create mode 100644 packages/shared/src/builtinPlayers.ts diff --git a/apps/admin/src/i18n/admin-pages-ms.ts b/apps/admin/src/i18n/admin-pages-ms.ts index a90e235..fc3066e 100644 --- a/apps/admin/src/i18n/admin-pages-ms.ts +++ b/apps/admin/src/i18n/admin-pages-ms.ts @@ -51,6 +51,22 @@ export const adminPagesMs: Record = { 'user.field.login_fail': 'Log masuk gagal', 'user.field.phone': 'Telefon', 'user.field.email': 'E-mel', + 'user.field.allow_password_change': 'Benarkan pemain tukar kata laluan', + 'user.field.allow_username_change': 'Benarkan pemain tukar nama akaun', + 'user.field.view_password': 'Kata laluan log masuk', + 'user.field.reset_password': 'Set semula kata laluan', + 'user.password_not_stored': 'Tiada rekod (pemain telah ubah sendiri)', + 'user.btn.show_password': 'Lihat', + 'user.btn.hide_password': 'Sembunyi', + 'user.ph.reset_password': 'Biarkan kosong untuk kekalkan; nilai baharu boleh dilihat', + 'user.ph.reset_password_short': 'Biarkan kosong', + 'user.global_settings': 'Kata laluan & akaun (global)', + 'user.global_settings_hint': 'Kawal sama ada semua pemain boleh ubah kata laluan/nama akaun dalam app', + 'user.section.password_mgmt': 'Pengurusan kata laluan', + 'user.field.current_password': 'Kata laluan semasa', + 'user.msg.created_with_password': 'Pemain dicipta. Kata laluan: {password}', + 'user.msg.password_saved': 'Kata laluan dikemas kini: {password}', + 'user.hint.password_reset_to_view': 'Tiada rekod. Isi Set semula kata laluan di bawah dan simpan untuk lihat di sini.', 'user.ph.username_unique': 'Nama log masuk unik', 'user.ph.no_agent': 'Tiada (terus platform)', 'user.hint.no_agent': 'Biarkan kosong untuk pemain diurus platform', @@ -58,6 +74,10 @@ export const adminPagesMs: Record = { 'user.hint.deposit_remark': 'Ditulis ke lejar jika baki permulaan > 0', 'user.hint.freeze_in_list': 'Beku/nyahbeku dari lajur tindakan senarai', 'user.hint.agent_change': 'Kosong = terus platform; perubahan dikira semula kredit ejen', + 'user.hint.allow_password_change': 'Matikan: semua pemain tidak boleh ubah kata laluan', + 'user.hint.allow_username_change': 'Hidupkan: semua pemain boleh ubah nama log masuk', + 'user.hint.view_password': 'Hanya kata laluan cipta/set semula admin; dibersihkan jika pemain ubah sendiri', + 'user.hint.reset_password': 'Berkuat kuasa serta-merta dan kemas kini kata laluan boleh lihat', 'user.btn.create': 'Cipta', 'user.btn.save_profile': 'Simpan', 'user.btn.confirm_deposit': 'Sahkan tambah baki', @@ -222,6 +242,9 @@ export const adminPagesMs: Record = { 'agent_portal.agent_username_ph': 'Nama pengguna ejen', 'agent_portal.player_id_ph': 'ID pemain', 'agent_portal.withdraw_btn': 'Keluarkan {amount}', + 'agent_portal.withdraw_btn_label': 'Keluarkan', + 'agent_portal.transfer_title_deposit': 'Tambah baki {name}', + 'agent_portal.transfer_title_withdraw': 'Keluarkan dari {name}', 'msg.agent_sub_created': 'Sub-ejen dicipta', 'msg.withdraw_ok': 'Pengeluaran berjaya', @@ -241,6 +264,7 @@ export const adminPagesMs: Record = { 'msg.import_done': 'Import: {imported} ok, {skipped} dilangkau, {failed} gagal / {total} jumlah', 'msg.topup_ok': 'Tambah baki berjaya', 'msg.topup_failed': 'Tambah baki gagal', + 'msg.transfer_failed': 'Operasi gagal', 'msg.amount_gt_zero': 'Jumlah mesti lebih daripada 0', 'msg.credit_zero': 'Pelarasan tidak boleh 0', 'msg.credit_adjusted': 'Kredit dikemas kini', diff --git a/apps/admin/src/i18n/admin-pages.ts b/apps/admin/src/i18n/admin-pages.ts index 90a7057..d56e438 100644 --- a/apps/admin/src/i18n/admin-pages.ts +++ b/apps/admin/src/i18n/admin-pages.ts @@ -51,6 +51,22 @@ export const adminPagesZh: Record = { 'user.field.login_fail': '登录失败', 'user.field.phone': '手机', 'user.field.email': '邮箱', + 'user.field.allow_password_change': '允许玩家改密码', + 'user.field.allow_username_change': '允许玩家改账号名', + 'user.field.view_password': '登录密码', + 'user.field.reset_password': '重置密码', + 'user.password_not_stored': '未记录(玩家已自行修改或未保存)', + 'user.btn.show_password': '查看', + 'user.btn.hide_password': '隐藏', + 'user.ph.reset_password': '留空则不修改;填写后将更新并可查看', + 'user.ph.reset_password_short': '留空不修改', + 'user.global_settings': '密码与账号管理(全局)', + 'user.global_settings_hint': '控制所有玩家是否可在 App 内改密码、改账号名', + 'user.section.password_mgmt': '密码管理', + 'user.field.current_password': '当前密码', + 'user.msg.created_with_password': '玩家已创建,登录密码:{password}', + 'user.msg.password_saved': '密码已更新,当前可查密码:{password}', + 'user.hint.password_reset_to_view': '旧账号暂无记录。请在下方「重置密码」填写新密码并保存,即可在此查看。', 'user.ph.username_unique': '登录用户名,唯一', 'user.ph.no_agent': '不设置(平台直属玩家)', 'user.hint.no_agent': '留空表示不挂靠代理,由平台直接管理', @@ -58,6 +74,10 @@ export const adminPagesZh: Record = { 'user.hint.deposit_remark': '有初始余额时写入流水备注', 'user.hint.freeze_in_list': '冻结/解冻请在列表操作列进行', 'user.hint.agent_change': '留空表示平台直属;变更后会重算相关代理已用授信', + 'user.hint.allow_password_change': '关闭后所有玩家均不可在客户端修改密码', + 'user.hint.allow_username_change': '开启后所有玩家均可在资料页修改登录账号名', + 'user.hint.view_password': '仅保存后台创建或重置时的密码;玩家自行改密后会清除', + 'user.hint.reset_password': '重置后立即生效,并更新上方可查密码', 'user.btn.create': '创建', 'user.btn.save_profile': '保存资料', 'user.btn.confirm_deposit': '确认上分', @@ -222,6 +242,9 @@ export const adminPagesZh: Record = { 'agent_portal.agent_username_ph': '代理用户名', 'agent_portal.player_id_ph': '玩家 ID', 'agent_portal.withdraw_btn': '下分 {amount}', + 'agent_portal.withdraw_btn_label': '下分', + 'agent_portal.transfer_title_deposit': '给 {name} 上分', + 'agent_portal.transfer_title_withdraw': '从 {name} 下分', 'msg.agent_sub_created': '下级代理已创建', 'msg.withdraw_ok': '下分成功', @@ -241,6 +264,7 @@ export const adminPagesZh: Record = { 'msg.import_done': '导入完成:成功 {imported},跳过 {skipped},失败 {failed} / 共 {total}', 'msg.topup_ok': '上分成功', 'msg.topup_failed': '上分失败', + 'msg.transfer_failed': '操作失败', 'msg.amount_gt_zero': '金额须大于 0', 'msg.credit_zero': '调整金额不能为 0', 'msg.credit_adjusted': '授信已调整', @@ -403,6 +427,22 @@ export const adminPagesEn: Record = { 'user.field.login_fail': 'Failed logins', 'user.field.phone': 'Phone', 'user.field.email': 'Email', + 'user.field.allow_password_change': 'Allow player password change', + 'user.field.allow_username_change': 'Allow player username change', + 'user.field.view_password': 'Login password', + 'user.field.reset_password': 'Reset password', + 'user.password_not_stored': 'Not stored (player changed it or never saved)', + 'user.btn.show_password': 'Show', + 'user.btn.hide_password': 'Hide', + 'user.ph.reset_password': 'Leave empty to keep; new value will be viewable', + 'user.ph.reset_password_short': 'Leave empty to keep', + 'user.global_settings': 'Password & account (global)', + 'user.global_settings_hint': 'Controls whether all players can change password or username in the app', + 'user.section.password_mgmt': 'Password management', + 'user.field.current_password': 'Current password', + 'user.msg.created_with_password': 'Player created. Login password: {password}', + 'user.msg.password_saved': 'Password updated. Viewable password: {password}', + 'user.hint.password_reset_to_view': 'No stored password. Set one below under Reset password and save to view it here.', 'user.ph.username_unique': 'Unique login username', 'user.ph.no_agent': 'None (platform direct)', 'user.hint.no_agent': 'Leave empty for platform-managed player', @@ -410,6 +450,10 @@ export const adminPagesEn: Record = { 'user.hint.deposit_remark': 'Written to ledger when initial balance > 0', 'user.hint.freeze_in_list': 'Freeze/unfreeze from the list actions', 'user.hint.agent_change': 'Empty = platform direct; changes recalc agent credit', + 'user.hint.allow_password_change': 'When off, no player can change password in the app', + 'user.hint.allow_username_change': 'When on, all players can change login username in profile', + 'user.hint.view_password': 'Only passwords set on create/reset; cleared after player self-change', + 'user.hint.reset_password': 'Takes effect immediately and updates viewable password above', 'user.btn.create': 'Create', 'user.btn.save_profile': 'Save', 'user.btn.confirm_deposit': 'Confirm top-up', @@ -574,6 +618,9 @@ export const adminPagesEn: Record = { 'agent_portal.agent_username_ph': 'Agent username', 'agent_portal.player_id_ph': 'Player ID', 'agent_portal.withdraw_btn': 'Withdraw {amount}', + 'agent_portal.withdraw_btn_label': 'Withdraw', + 'agent_portal.transfer_title_deposit': 'Top up {name}', + 'agent_portal.transfer_title_withdraw': 'Withdraw from {name}', 'msg.agent_sub_created': 'Sub-agent created', 'msg.withdraw_ok': 'Withdrawal successful', @@ -593,6 +640,7 @@ export const adminPagesEn: Record = { 'msg.import_done': 'Import: {imported} ok, {skipped} skipped, {failed} failed / {total} total', 'msg.topup_ok': 'Top-up successful', 'msg.topup_failed': 'Top-up failed', + 'msg.transfer_failed': 'Operation failed', 'msg.amount_gt_zero': 'Amount must be greater than 0', 'msg.credit_zero': 'Adjustment cannot be 0', 'msg.credit_adjusted': 'Credit updated', diff --git a/apps/admin/src/views/Users.vue b/apps/admin/src/views/Users.vue index bff7ee2..0ae57ec 100644 --- a/apps/admin/src/views/Users.vue +++ b/apps/admin/src/views/Users.vue @@ -46,12 +46,39 @@ const detail = ref(null); const editingId = ref(''); const depositForm = ref({ userId: '', amount: 100, remark: '' }); +const playerSettings = ref({ allowPasswordChange: true, allowUsernameChange: false }); +const settingsSaving = ref(false); onMounted(() => { loadAgentOptions(); + loadPlayerSettings(); load(); }); +async function loadPlayerSettings() { + try { + const { data } = await api.get('/admin/users/settings/account'); + playerSettings.value = data.data; + } catch { + /* 使用默认值 */ + } +} + +async function savePlayerSettings() { + settingsSaving.value = true; + try { + const { data } = await api.put('/admin/users/settings/account', playerSettings.value); + playerSettings.value = data.data; + ElMessage.success(t('msg.saved')); + } catch (e: unknown) { + const err = e as { response?: { data?: { error?: string } } }; + ElMessage.error(err.response?.data?.error ?? t('msg.save_failed')); + loadPlayerSettings(); + } finally { + settingsSaving.value = false; + } +} + async function loadAgentOptions() { const { data } = await api.get('/admin/agents/options'); agentOptions.value = data.data; @@ -122,7 +149,9 @@ async function submitCreate() { try { await api.post('/admin/users', payload); ElMessage.success( - createForm.value.asTier1Agent ? t('msg.agent_created') : t('msg.player_created'), + createForm.value.asTier1Agent + ? t('msg.agent_created') + : t('user.msg.created_with_password', { password: createForm.value.password }), ); createVisible.value = false; load(); @@ -163,13 +192,27 @@ async function toggleFreeze(row: PlayerRow) { } async function submitEdit() { + if (editForm.value.newPassword && editForm.value.newPassword.length < 8) { + ElMessage.warning(t('err.password_min')); + return; + } editLoading.value = true; try { - await api.put(`/admin/users/${editingId.value}`, { + const newPwd = editForm.value.newPassword.trim(); + const { data } = await api.put(`/admin/users/${editingId.value}`, { + username: editForm.value.username.trim(), parentId: editForm.value.parentId || '', phone: editForm.value.phone.trim() || undefined, email: editForm.value.email.trim() || undefined, + password: newPwd || undefined, }); + const updated = data.data as PlayerDetail; + if (newPwd) { + editForm.value.managedPassword = updated.managedPassword ?? newPwd; + editForm.value.newPassword = ''; + ElMessage.success(t('user.msg.password_saved', { password: editForm.value.managedPassword })); + return; + } ElMessage.success(t('msg.saved')); editVisible.value = false; load(); @@ -246,6 +289,29 @@ function statusLabel(s: string) { {{ t('user.create_btn') }} + +
+ {{ t('user.global_settings') }} + {{ t('user.global_settings_hint') }} + + + + + + + + +
+
+ @@ -455,20 +521,42 @@ function statusLabel(s: string) { - - - - - + + +
+ ID {{ editForm.id }} + {{ statusLabel(editForm.status) }} +
+ - - - - - {{ statusLabel(editForm.status) }} - - {{ t('user.hint.freeze_in_list') }} + + +
+
{{ t('user.section.password_mgmt') }}
+ + {{ editForm.managedPassword }} + + +

+ {{ t('user.hint.password_reset_to_view') }} +

+ + + +
+ -
{{ t('user.hint.agent_change') }}
- - - - - - - - - - - - - - - - - - - - - - + + + + {{ formatAmount(editForm.availableBalance) }} + + + {{ formatAmount(editForm.frozenBalance) }} + + + {{ t('user.bets_edit_value', { n: editForm.betCount, stake: formatAmount(editForm.totalStake) }) }} + + + {{ formatAmount(editForm.totalReturn) }} + + + {{ editForm.lastLoginAt ? formatTime(editForm.lastLoginAt) : t('common.never_login') }} + · {{ t('user.login_fail_value', { n: editForm.loginFailCount }) }} + +
@@ -549,6 +629,12 @@ function statusLabel(s: string) { {{ detail.id }} {{ detail.username }} + + {{ detail.managedPassword ?? '—' }} + + + {{ t('user.hint.password_reset_to_view') }} + {{ statusLabel(detail.status) }} @@ -588,7 +674,8 @@ function statusLabel(s: string) { diff --git a/apps/admin/src/views/user-form.ts b/apps/admin/src/views/user-form.ts index 9eb3e56..b0a2a5a 100644 --- a/apps/admin/src/views/user-form.ts +++ b/apps/admin/src/views/user-form.ts @@ -31,6 +31,8 @@ export interface PlayerEditForm { loginFailCount: number; phone: string; email: string; + managedPassword: string | null; + newPassword: string; } export interface PlayerRow { @@ -42,6 +44,7 @@ export interface PlayerRow { parentUsername: string | null; phone: string | null; email: string | null; + managedPassword: string | null; availableBalance: string; frozenBalance: string; lastLoginAt: string | null; @@ -90,6 +93,8 @@ export function emptyPlayerEditForm(): PlayerEditForm { loginFailCount: 0, phone: '', email: '', + managedPassword: null, + newPassword: '', }; } @@ -110,6 +115,8 @@ export function editFormFromDetail(d: PlayerDetail): PlayerEditForm { loginFailCount: d.loginFailCount, phone: d.phone ?? '', email: d.email ?? '', + managedPassword: d.managedPassword ?? null, + newPassword: '', }; } diff --git a/apps/api/package.json b/apps/api/package.json index 6ef20c4..58d9d07 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -11,7 +11,7 @@ "test:cov": "jest --coverage", "db:generate": "prisma generate", "db:migrate": "prisma migrate dev", - "db:migrate:deploy": "prisma migrate deploy", + "db:migrate:deploy": "prisma migrate deploy && prisma generate", "db:seed": "ts-node prisma/seed.ts", "db:studio": "prisma studio" }, diff --git a/apps/api/prisma/migrations/20260603120000_user_avatar_key/migration.sql b/apps/api/prisma/migrations/20260603120000_user_avatar_key/migration.sql new file mode 100644 index 0000000..efcf599 --- /dev/null +++ b/apps/api/prisma/migrations/20260603120000_user_avatar_key/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable: user_preferences 增加头像(内置球员 key) +ALTER TABLE "user_preferences" ADD COLUMN IF NOT EXISTS "avatar_key" VARCHAR(128); diff --git a/apps/api/prisma/migrations/20260604120000_user_account_controls/migration.sql b/apps/api/prisma/migrations/20260604120000_user_account_controls/migration.sql new file mode 100644 index 0000000..df01d08 --- /dev/null +++ b/apps/api/prisma/migrations/20260604120000_user_account_controls/migration.sql @@ -0,0 +1,4 @@ +-- AlterTable: 玩家账号权限与后台可查密码 +ALTER TABLE "user_preferences" ADD COLUMN IF NOT EXISTS "allow_password_change" BOOLEAN NOT NULL DEFAULT true; +ALTER TABLE "user_preferences" ADD COLUMN IF NOT EXISTS "allow_username_change" BOOLEAN NOT NULL DEFAULT false; +ALTER TABLE "user_preferences" ADD COLUMN IF NOT EXISTS "managed_password" VARCHAR(128); diff --git a/apps/api/prisma/schema.prisma b/apps/api/prisma/schema.prisma index bab2d2d..a9f31da 100644 --- a/apps/api/prisma/schema.prisma +++ b/apps/api/prisma/schema.prisma @@ -52,13 +52,17 @@ model UserAuth { } model UserPreference { - id BigInt @id @default(autoincrement()) - userId BigInt @unique @map("user_id") - locale String @default("en-US") @db.VarChar(10) - phone String? @db.VarChar(32) - email String? @db.VarChar(128) - createdAt DateTime @default(now()) @map("created_at") - updatedAt DateTime @updatedAt @map("updated_at") + id BigInt @id @default(autoincrement()) + userId BigInt @unique @map("user_id") + locale String @default("en-US") @db.VarChar(10) + phone String? @db.VarChar(32) + email String? @db.VarChar(128) + avatarKey String? @map("avatar_key") @db.VarChar(128) + allowPasswordChange Boolean @default(true) @map("allow_password_change") + allowUsernameChange Boolean @default(false) @map("allow_username_change") + managedPassword String? @map("managed_password") @db.VarChar(128) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") user User @relation(fields: [userId], references: [id]) diff --git a/apps/api/prisma/seed.ts b/apps/api/prisma/seed.ts index 8533514..64029fd 100644 --- a/apps/api/prisma/seed.ts +++ b/apps/api/prisma/seed.ts @@ -579,7 +579,7 @@ async function main() { parentId: agent1.id, auth: { create: { passwordHash: playerHash } }, wallet: { create: { availableBalance: 1000 } }, - preferences: { create: { locale: 'zh-CN' } }, + preferences: { create: { locale: 'zh-CN', managedPassword: 'Player@123' } }, }, update: {}, }); diff --git a/apps/api/src/app.module.ts b/apps/api/src/app.module.ts index 1534ef9..b4fb56d 100644 --- a/apps/api/src/app.module.ts +++ b/apps/api/src/app.module.ts @@ -4,6 +4,7 @@ import { ScheduleModule } from '@nestjs/schedule'; import { APP_GUARD } from '@nestjs/core'; import { JwtAuthGuard } from './domains/identity/guards'; import { PrismaModule } from './shared/prisma/prisma.module'; +import { SystemConfigModule } from './shared/config/system-config.module'; import { IdentityModule } from './domains/identity/identity.module'; import { AgentsModule } from './domains/agent/agents.module'; import { WalletModule } from './domains/ledger/wallet.module'; @@ -21,6 +22,7 @@ import { AgentPortalModule } from './applications/agent/agent-portal.module'; ConfigModule.forRoot({ isGlobal: true }), ScheduleModule.forRoot(), PrismaModule, + SystemConfigModule, IdentityModule, AgentsModule, WalletModule, diff --git a/apps/api/src/applications/admin/admin.controller.ts b/apps/api/src/applications/admin/admin.controller.ts index b745463..6057d85 100644 --- a/apps/api/src/applications/admin/admin.controller.ts +++ b/apps/api/src/applications/admin/admin.controller.ts @@ -29,6 +29,7 @@ import { AuditService } from '../../domains/operations/audit/audit.service'; import { BetsService } from '../../domains/betting/bets.service'; import { PrismaService } from '../../shared/prisma/prisma.service'; import { AdminDashboardService } from './admin-dashboard.service'; +import { SystemConfigService } from '../../shared/config/system-config.service'; import { IsString, IsNumber, @@ -127,6 +128,25 @@ class UpdatePlayerAdminDto { @IsOptional() @IsString() parentId?: string; + + @IsOptional() + @IsString() + username?: string; + + @IsOptional() + @IsString() + @MinLength(8) + password?: string; +} + +class PlayerAccountSettingsDto { + @IsOptional() + @IsBoolean() + allowPasswordChange?: boolean; + + @IsOptional() + @IsBoolean() + allowUsernameChange?: boolean; } class CreateAgentAdminDto { @@ -442,6 +462,7 @@ export class AdminController { private bets: BetsService, private prisma: PrismaService, private readonly dashboardService: AdminDashboardService, + private systemConfig: SystemConfigService, ) {} @Get('dashboard') @@ -450,6 +471,28 @@ export class AdminController { return jsonResponse(overview); } + @Get('users/settings/account') + async getPlayerAccountSettings() { + const settings = await this.systemConfig.getPlayerAccountSettings(); + return jsonResponse(settings); + } + + @Put('users/settings/account') + async updatePlayerAccountSettings( + @CurrentUser('id') operatorId: bigint, + @Body() dto: PlayerAccountSettingsDto, + ) { + const settings = await this.systemConfig.updatePlayerAccountSettings(dto); + await this.audit.log({ + operatorId, + operatorType: 'ADMIN', + action: 'UPDATE_PLAYER_ACCOUNT_SETTINGS', + module: 'USERS', + afterData: JSON.stringify(settings), + }); + return jsonResponse(settings); + } + @Get('users') async listUsers( @Query('page') page?: string, diff --git a/apps/api/src/applications/player/player.controller.ts b/apps/api/src/applications/player/player.controller.ts index e555d74..7a6cb63 100644 --- a/apps/api/src/applications/player/player.controller.ts +++ b/apps/api/src/applications/player/player.controller.ts @@ -13,6 +13,7 @@ import { JwtAuthGuard, PlayerGuard } from '../../domains/identity/guards'; import { CurrentUser } from '../../shared/common/decorators'; import { jsonResponse } from '../../shared/common/filters'; import { UsersService } from '../../domains/identity/users.service'; +import { SystemConfigService } from '../../shared/config/system-config.service'; import { WalletService } from '../../domains/ledger/wallet.service'; import { MatchesService } from '../../domains/catalog/matches.service'; import { OutrightService } from '../../domains/catalog/outright.service'; @@ -72,6 +73,14 @@ class UpdateProfileDto { @IsOptional() @IsString() email?: string; + + @IsOptional() + @IsString() + avatarKey?: string; + + @IsOptional() + @IsString() + username?: string; } @ApiTags('Player') @@ -87,12 +96,39 @@ export class PlayerController { private bets: BetsService, private content: ContentService, private cashback: CashbackService, + private systemConfig: SystemConfigService, ) {} + private async formatPlayerProfile(user: NonNullable>>) { + const accountSettings = await this.systemConfig.getPlayerAccountSettings(); + const prefs = user.preferences; + const viewablePassword = prefs?.managedPassword ?? null; + const safePrefs = prefs + ? (({ + managedPassword: _m, + allowPasswordChange: _a, + allowUsernameChange: _b, + ...rest + }) => rest)(prefs) + : {}; + return { + ...user, + id: user.id.toString(), + parentId: user.parentId?.toString() ?? null, + preferences: { + ...safePrefs, + viewablePassword, + allowPasswordChange: accountSettings.allowPasswordChange, + allowUsernameChange: accountSettings.allowUsernameChange, + }, + }; + } + @Get('profile') async profile(@CurrentUser('id') userId: bigint) { const user = await this.users.findById(userId); - return jsonResponse(user); + if (!user) return jsonResponse(null); + return jsonResponse(await this.formatPlayerProfile(user)); } @Post('language') @@ -104,7 +140,8 @@ export class PlayerController { @Patch('profile') async updateProfile(@CurrentUser('id') userId: bigint, @Body() dto: UpdateProfileDto) { const user = await this.users.updateProfile(userId, dto); - return jsonResponse(user); + if (!user) return jsonResponse(null); + return jsonResponse(await this.formatPlayerProfile(user)); } @Get('home') diff --git a/apps/api/src/domains/agent/agents.service.ts b/apps/api/src/domains/agent/agents.service.ts index a7e2aa7..503f818 100644 --- a/apps/api/src/domains/agent/agents.service.ts +++ b/apps/api/src/domains/agent/agents.service.ts @@ -626,6 +626,7 @@ export class AgentsService { locale, phone: data.phone?.trim() || null, email: data.email?.trim() || null, + managedPassword: data.password, }, }); diff --git a/apps/api/src/domains/identity/auth.service.ts b/apps/api/src/domains/identity/auth.service.ts index 902eaf5..670a773 100644 --- a/apps/api/src/domains/identity/auth.service.ts +++ b/apps/api/src/domains/identity/auth.service.ts @@ -3,6 +3,7 @@ import { JwtService } from '@nestjs/jwt'; import { ConfigService } from '@nestjs/config'; import * as bcrypt from 'bcryptjs'; import { PrismaService } from '../../shared/prisma/prisma.service'; +import { SystemConfigService } from '../../shared/config/system-config.service'; const MAX_LOGIN_FAILS = 5; const LOCK_DURATION_MS = 15 * 60 * 1000; @@ -20,6 +21,7 @@ export class AuthService { private prisma: PrismaService, private jwt: JwtService, private config: ConfigService, + private systemConfig: SystemConfigService, ) {} /** 平台管理员 / 代理统一登录(按 userType 签发对应 JWT) */ @@ -107,6 +109,11 @@ export class AuthService { const auth = await this.prisma.userAuth.findUnique({ where: { userId } }); if (!auth) throw new UnauthorizedException('User not found'); + const settings = await this.systemConfig.getPlayerAccountSettings(); + if (!settings.allowPasswordChange) { + throw new ForbiddenException('当前平台未开放玩家自行修改密码'); + } + const valid = await bcrypt.compare(oldPassword, auth.passwordHash); if (!valid) throw new UnauthorizedException('Invalid old password'); @@ -115,6 +122,10 @@ export class AuthService { where: { userId }, data: { passwordHash: hash }, }); + await this.prisma.userPreference.updateMany({ + where: { userId }, + data: { managedPassword: null }, + }); return { success: true }; } diff --git a/apps/api/src/domains/identity/users.service.ts b/apps/api/src/domains/identity/users.service.ts index 3cf256b..42ec1b1 100644 --- a/apps/api/src/domains/identity/users.service.ts +++ b/apps/api/src/domains/identity/users.service.ts @@ -1,6 +1,8 @@ -import { BadRequestException, Injectable, NotFoundException } from '@nestjs/common'; -import { SUPPORTED_LOCALES } from '@thebet365/shared'; +import { BadRequestException, ForbiddenException, Injectable, NotFoundException } from '@nestjs/common'; +import * as bcrypt from 'bcryptjs'; +import { SUPPORTED_LOCALES, isValidAvatarKey } from '@thebet365/shared'; import { PrismaService } from '../../shared/prisma/prisma.service'; +import { SystemConfigService } from '../../shared/config/system-config.service'; import { AgentsService } from '../agent/agents.service'; export type PlayerListFilters = { @@ -14,6 +16,7 @@ export class UsersService { constructor( private prisma: PrismaService, private agents: AgentsService, + private systemConfig: SystemConfigService, ) {} private formatPlayerRow( @@ -26,7 +29,11 @@ export class UsersService { createdAt: Date; updatedAt: Date; wallet?: { availableBalance: { toString(): string }; frozenBalance: { toString(): string } } | null; - preferences?: { phone: string | null; email: string | null } | null; + preferences?: { + phone: string | null; + email: string | null; + managedPassword?: string | null; + } | null; parent?: { username: string } | null; auth?: { lastLoginAt: Date | null } | null; }, @@ -41,6 +48,7 @@ export class UsersService { parentUsername: u.parent?.username ?? null, phone: u.preferences?.phone ?? null, email: u.preferences?.email ?? null, + managedPassword: u.preferences?.managedPassword ?? null, availableBalance: u.wallet?.availableBalance?.toString() ?? '0', frozenBalance: u.wallet?.frozenBalance?.toString() ?? '0', lastLoginAt: u.auth?.lastLoginAt ?? null, @@ -81,13 +89,61 @@ export class UsersService { }); } - async updateProfile(userId: bigint, data: { phone?: string; email?: string }) { - const phone = data.phone?.trim() || null; - const email = data.email?.trim() || null; + async updateProfile( + userId: bigint, + data: { phone?: string; email?: string; avatarKey?: string | null; username?: string }, + ) { + const user = await this.prisma.user.findUnique({ + where: { id: userId }, + include: { preferences: true }, + }); + if (!user) throw new NotFoundException('User not found'); + + if (data.username !== undefined) { + const nextUsername = data.username.trim(); + if (!nextUsername) throw new BadRequestException('账号名称不能为空'); + const settings = await this.systemConfig.getPlayerAccountSettings(); + if (!settings.allowUsernameChange) { + throw new ForbiddenException('当前平台未开放玩家自行修改账号名称'); + } + if (nextUsername !== user.username) { + const taken = await this.prisma.user.findUnique({ where: { username: nextUsername } }); + if (taken) throw new BadRequestException('账号名称已被占用'); + await this.prisma.user.update({ + where: { id: userId }, + data: { username: nextUsername }, + }); + } + } + + const phone = data.phone !== undefined ? data.phone.trim() || null : undefined; + const email = data.email !== undefined ? data.email.trim() || null : undefined; + let avatarKey: string | null | undefined; + if (data.avatarKey !== undefined) { + avatarKey = data.avatarKey?.trim() || null; + if (avatarKey && !isValidAvatarKey(avatarKey)) { + throw new BadRequestException('无效头像'); + } + } + + const existing = await this.prisma.userPreference.findUnique({ where: { userId } }); + if (!existing && phone === undefined && email === undefined && avatarKey === undefined) { + return this.findById(userId); + } + await this.prisma.userPreference.upsert({ where: { userId }, - create: { userId, phone, email }, - update: { phone, email }, + create: { + userId, + phone: phone ?? null, + email: email ?? null, + ...(avatarKey !== undefined ? { avatarKey } : {}), + }, + update: { + ...(phone !== undefined ? { phone } : {}), + ...(email !== undefined ? { email } : {}), + ...(avatarKey !== undefined ? { avatarKey } : {}), + }, }); return this.findById(userId); } @@ -195,10 +251,13 @@ export class UsersService { phone?: string; email?: string; parentId?: string | null; + username?: string; + password?: string; }, ) { const user = await this.prisma.user.findFirst({ where: { id: playerId, userType: 'PLAYER', deletedAt: null }, + include: { auth: true }, }); if (!user) throw new NotFoundException('玩家不存在'); @@ -206,6 +265,35 @@ export class UsersService { throw new BadRequestException('无效状态'); } + if (data.username !== undefined) { + const nextUsername = data.username.trim(); + if (!nextUsername) throw new BadRequestException('账号名称不能为空'); + if (nextUsername !== user.username) { + const taken = await this.prisma.user.findUnique({ where: { username: nextUsername } }); + if (taken) throw new BadRequestException('账号名称已被占用'); + await this.prisma.user.update({ + where: { id: playerId }, + data: { username: nextUsername }, + }); + } + } + + if (data.password !== undefined) { + const nextPassword = data.password; + if (nextPassword.length < 8) throw new BadRequestException('密码至少 8 位'); + if (!user.auth) throw new BadRequestException('账号认证信息缺失'); + const hash = await bcrypt.hash(nextPassword, 10); + await this.prisma.userAuth.update({ + where: { userId: playerId }, + data: { passwordHash: hash, loginFailCount: 0, lockedUntil: null }, + }); + await this.prisma.userPreference.upsert({ + where: { userId: playerId }, + create: { userId: playerId, managedPassword: nextPassword }, + update: { managedPassword: nextPassword }, + }); + } + if (data.status) { await this.prisma.user.update({ where: { id: playerId }, @@ -253,25 +341,43 @@ export class UsersService { }); } - if (data.phone !== undefined || data.email !== undefined || data.locale) { - const phone = data.phone !== undefined ? data.phone?.trim() || null : undefined; - const email = data.email !== undefined ? data.email?.trim() || null : undefined; + const prefPatch: { + locale?: string; + phone?: string | null; + email?: string | null; + } = {}; + + if (data.locale) prefPatch.locale = data.locale; + if (data.phone !== undefined) prefPatch.phone = data.phone.trim() || null; + if (data.email !== undefined) prefPatch.email = data.email.trim() || null; + + if (Object.keys(prefPatch).length > 0) { await this.prisma.userPreference.upsert({ where: { userId: playerId }, create: { userId: playerId, locale: data.locale ?? user.locale, - phone: phone ?? null, - email: email ?? null, - }, - update: { - ...(data.locale ? { locale: data.locale } : {}), - ...(phone !== undefined ? { phone } : {}), - ...(email !== undefined ? { email } : {}), + phone: prefPatch.phone ?? null, + email: prefPatch.email ?? null, }, + update: prefPatch, }); } return this.getPlayerAdminDetail(playerId); } + + async getPlayerAccountPermissions() { + return this.systemConfig.getPlayerAccountSettings(); + } + + async clearManagedPassword(userId: bigint) { + const pref = await this.prisma.userPreference.findUnique({ where: { userId } }); + if (pref?.managedPassword) { + await this.prisma.userPreference.update({ + where: { userId }, + data: { managedPassword: null }, + }); + } + } } diff --git a/apps/api/src/shared/config/system-config.module.ts b/apps/api/src/shared/config/system-config.module.ts new file mode 100644 index 0000000..9f88521 --- /dev/null +++ b/apps/api/src/shared/config/system-config.module.ts @@ -0,0 +1,9 @@ +import { Global, Module } from '@nestjs/common'; +import { SystemConfigService } from './system-config.service'; + +@Global() +@Module({ + providers: [SystemConfigService], + exports: [SystemConfigService], +}) +export class SystemConfigModule {} diff --git a/apps/api/src/shared/config/system-config.service.ts b/apps/api/src/shared/config/system-config.service.ts new file mode 100644 index 0000000..096cdaf --- /dev/null +++ b/apps/api/src/shared/config/system-config.service.ts @@ -0,0 +1,59 @@ +import { Injectable } from '@nestjs/common'; +import { PrismaService } from '../prisma/prisma.service'; + +export const PLAYER_ALLOW_PASSWORD_CHANGE = 'player.allow_password_change'; +export const PLAYER_ALLOW_USERNAME_CHANGE = 'player.allow_username_change'; + +export type PlayerAccountSettings = { + allowPasswordChange: boolean; + allowUsernameChange: boolean; +}; + +@Injectable() +export class SystemConfigService { + constructor(private prisma: PrismaService) {} + + async getBoolean(key: string, defaultValue: boolean): Promise { + const row = await this.prisma.systemConfig.findUnique({ where: { configKey: key } }); + if (!row) return defaultValue; + return row.configValue === 'true' || row.configValue === '1'; + } + + async setBoolean(key: string, value: boolean, description?: string) { + await this.prisma.systemConfig.upsert({ + where: { configKey: key }, + create: { + configKey: key, + configValue: value ? 'true' : 'false', + description, + }, + update: { configValue: value ? 'true' : 'false' }, + }); + } + + async getPlayerAccountSettings(): Promise { + const [allowPasswordChange, allowUsernameChange] = await Promise.all([ + this.getBoolean(PLAYER_ALLOW_PASSWORD_CHANGE, true), + this.getBoolean(PLAYER_ALLOW_USERNAME_CHANGE, false), + ]); + return { allowPasswordChange, allowUsernameChange }; + } + + async updatePlayerAccountSettings(data: Partial) { + if (data.allowPasswordChange !== undefined) { + await this.setBoolean( + PLAYER_ALLOW_PASSWORD_CHANGE, + data.allowPasswordChange, + '玩家是否可在客户端修改密码', + ); + } + if (data.allowUsernameChange !== undefined) { + await this.setBoolean( + PLAYER_ALLOW_USERNAME_CHANGE, + data.allowUsernameChange, + '玩家是否可在客户端修改登录账号名', + ); + } + return this.getPlayerAccountSettings(); + } +} diff --git a/apps/player/src/assets/images/vs.png b/apps/player/src/assets/images/vs.png new file mode 100644 index 0000000000000000000000000000000000000000..323b66e95bbd692ac78998658e7ffd58122a8c39 GIT binary patch literal 124985 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

A9YLV6-Jicxrk(iqlHku_3|uB`Sq@bQl6 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 literal 0 HcmV?d00001 diff --git a/apps/player/src/components/PlayerAvatarModal.vue b/apps/player/src/components/PlayerAvatarModal.vue new file mode 100644 index 0000000..6dd6887 --- /dev/null +++ b/apps/player/src/components/PlayerAvatarModal.vue @@ -0,0 +1,125 @@ + + + + + diff --git a/apps/player/src/components/PlayerAvatarPicker.vue b/apps/player/src/components/PlayerAvatarPicker.vue new file mode 100644 index 0000000..ef2645b --- /dev/null +++ b/apps/player/src/components/PlayerAvatarPicker.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/apps/player/src/components/UserAvatarMenu.vue b/apps/player/src/components/UserAvatarMenu.vue index aa335cb..05f0377 100644 --- a/apps/player/src/components/UserAvatarMenu.vue +++ b/apps/player/src/components/UserAvatarMenu.vue @@ -1,17 +1,25 @@ diff --git a/apps/player/src/main.ts b/apps/player/src/main.ts index 5ae24e2..66d2f7b 100644 --- a/apps/player/src/main.ts +++ b/apps/player/src/main.ts @@ -174,6 +174,20 @@ const i18n = createI18n({ profile: { edit: '修改资料', language: '语言', + avatar: '选择头像', + avatar_change: '修改头像', + avatar_confirm: '确定', + section_contact: '联系方式', + section_account: '账号信息', + change_password: '修改密码', + show_password: '查看', + hide_password: '隐藏', + password_unavailable: '••••••••', + password_unavailable_hint: '密码不可查看,如需重置请联系客服', + section_password: '修改密码(可选)', + avatar_hint: '从内置球员中选择头像', + avatar_search: '搜索球员、位置或国家', + avatar_empty: '未找到匹配球员', phone: '手机号', email: '邮箱', phone_placeholder: '请输入手机号', @@ -193,6 +207,10 @@ const i18n = createI18n({ password_failed: '密码修改失败', password_mismatch: '两次新密码不一致', password_incomplete: '修改密码需填写当前密码、新密码及确认密码', + username_placeholder: '登录账号名', + username_readonly_hint: '账号名称由后台管理,如需修改请联系客服', + username_updated: '账号名称已更新', + password_disabled: '当前账号不允许自行修改密码,请联系客服', rules_title: '投注规则', rules_p1: '本平台第一版仅支持足球赛前盘,不含滚球、Cash Out、改单及系统串关。', rules_p2: '串关为 2 串 1 至 5 串 1,不可同场串关;冠军盘、四分盘让球/大小不可进入串关。', @@ -365,6 +383,20 @@ const i18n = createI18n({ profile: { edit: 'Edit Profile', language: 'Language', + avatar: 'Avatar', + avatar_change: 'Change avatar', + avatar_confirm: 'Confirm', + section_contact: 'Contact', + section_account: 'Account', + change_password: 'Change password', + show_password: 'Show', + hide_password: 'Hide', + password_unavailable: '••••••••', + password_unavailable_hint: 'Password not available; contact support to reset', + section_password: 'Change password (optional)', + avatar_hint: 'Choose from built-in player portraits', + avatar_search: 'Search player, position or country', + avatar_empty: 'No players found', phone: 'Phone', email: 'Email', phone_placeholder: 'Phone number', @@ -384,6 +416,10 @@ const i18n = createI18n({ password_failed: 'Password change failed', password_mismatch: 'Passwords do not match', password_incomplete: 'Fill current, new and confirm password to change password', + username_placeholder: 'Login username', + username_readonly_hint: 'Username is managed by admin; contact support to change', + username_updated: 'Username updated', + password_disabled: 'Password change is disabled for this account; contact support', rules_title: 'Betting Rules', rules_p1: 'Football pre-match only in v1. No live betting, Cash Out, bet edits, or system parlays.', rules_p2: 'Parlays: 2–5 legs, different matches only. Outright and quarter-ball HDP/O-U are excluded from parlays.', @@ -562,6 +598,20 @@ const i18n = createI18n({ profile: { edit: 'Edit Profil', language: 'Bahasa', + avatar: 'Avatar', + avatar_change: 'Tukar avatar', + avatar_confirm: 'Sahkan', + section_contact: 'Maklumat hubungan', + section_account: 'Akaun', + change_password: 'Tukar kata laluan', + show_password: 'Lihat', + hide_password: 'Sembunyi', + password_unavailable: '••••••••', + password_unavailable_hint: 'Kata laluan tidak tersedia; hubungi sokongan', + section_password: 'Tukar kata laluan (pilihan)', + avatar_hint: 'Pilih dari potret pemain terbina', + avatar_search: 'Cari pemain, posisi atau negara', + avatar_empty: 'Tiada pemain dijumpai', phone: 'Telefon', email: 'E-mel', phone_placeholder: 'Nombor telefon', @@ -581,6 +631,10 @@ const i18n = createI18n({ password_failed: 'Gagal tukar kata laluan', password_mismatch: 'Kata laluan tidak sepadan', password_incomplete: 'Isi kata laluan semasa, baharu dan pengesahan untuk menukar', + username_placeholder: 'Nama log masuk', + username_readonly_hint: 'Nama akaun diurus admin; hubungi sokongan untuk ubah', + username_updated: 'Nama akaun dikemas kini', + password_disabled: 'Akaun ini tidak dibenarkan tukar kata laluan; hubungi sokongan', rules_title: 'Peraturan Pertaruhan', rules_p1: 'Versi pertama: hanya bola sepak pra-perlawanan. Tiada live, Cash Out, edit pertaruhan atau parlay sistem.', rules_p2: 'Parlay 2–5 perlawanan, bukan perlawanan sama. Outright dan suku bola HDP/O-U tidak boleh parlay.', diff --git a/apps/player/src/views/HomeView.vue b/apps/player/src/views/HomeView.vue index 16b7952..fed4d44 100644 --- a/apps/player/src/views/HomeView.vue +++ b/apps/player/src/views/HomeView.vue @@ -4,14 +4,34 @@ import { useI18n } from 'vue-i18n'; import emptyMatchesImg from '../assets/images/empty-matches.svg'; import BannerCarousel from '../components/BannerCarousel.vue'; import { usePlayerHome } from '../composables/usePlayerHome'; +import { teamFlagUrl } from '../utils/teamFlag'; -const { t } = useI18n(); +const { t, locale } = useI18n(); const router = useRouter(); const { banners, hotMatches, loading } = usePlayerHome(); function goMatch(id: string) { router.push(`/match/${id}`); } + +function formatKickoff(startTime: string) { + return new Date(startTime).toLocaleString(locale.value, { + year: 'numeric', + month: 'numeric', + day: 'numeric', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + }); +} + +function homeFlag(match: (typeof hotMatches.value)[number]) { + return teamFlagUrl(match.homeTeamCode, match.homeTeamName); +} + +function awayFlag(match: (typeof hotMatches.value)[number]) { + return teamFlagUrl(match.awayTeamCode, match.awayTeamName); +} diff --git a/apps/player/src/views/ProfileEditView.vue b/apps/player/src/views/ProfileEditView.vue index 1c051e5..9a4e0bb 100644 --- a/apps/player/src/views/ProfileEditView.vue +++ b/apps/player/src/views/ProfileEditView.vue @@ -1,15 +1,25 @@