diff --git a/.workbuddy/memory/CHANGELOG.md b/.workbuddy/memory/CHANGELOG.md index 74db646..185e722 100644 --- a/.workbuddy/memory/CHANGELOG.md +++ b/.workbuddy/memory/CHANGELOG.md @@ -1,6 +1,7 @@ # admin.xpcool.com 变更记录 > 倒序:最新在上。格式:YYYY-MM-DD | 类型 | 摘要 +2026-08-27 | CHG | 三大改造:①移除国际化多语言仅留中文——preferences.ts 固定 locale=zh-CN;删除 header/toolbar/user-dropdown 三处语言切换入口、偏好面板语言选择项(general.vue/appLocale/widget.vue languageToggle 位置配置);config.ts 禁 languageToggle 且 order 移除;删除主应用与 packages/locales 的 en-US 语言包;locales/index.ts loadDayjsLocale 仅留 zh-CN。②新增主题色管理——theme.css 品牌色改为引用 --primary 变量(不再写死 #4f5bff),背景/主按钮渐变用 color-mix 跟随主题色,配合 useTDesignDesignTokens 使偏好面板 BuiltinTheme 切换主题色真正生效;constants.ts default 主题色与 config.ts colorPrimary 统一为靛蓝 hsl(235 100% 65%)。③业务弹窗统一为 vben 抽屉——6 页(system/{role,menu,admin}、recruitment/push、house/{listing,community})的 t-dialog 全部替换为 useVbenDrawer(),drawerApi.open/close/setState(标题)/lock(提交中);community/listing 抽屉加宽(class w-160/w-150) 2026-08-27 | CHG | 服务器安全日志页(挂在系统监控菜单下,id=96):views/monitor/security/index.vue——顶部 4 统计卡片(SSH爆破/fail2ban封禁/成功登录/总数)+ TOP 攻击源标签区 + 筛选(来源IP/事件类型/时间范围 t-date-range-picker)+ Vben VxeTable 列表(时间/来源IP/来源端口/目标端口/事件类型标签/详情 tooltip,事件标签按类型配色);api/serverSecurity.ts(list/stats 全 POST,无 URL 参数);typecheck 通过 2026-08-27 | CHG | 全量表格重构:views 下全部 11 个 t-table 页面统一改为 Vben Vxe Table(useVbenVxeGrid,#/adapter/vxe-table)+ Vben TableAction 行操作——system/{log(范式),login-log,admin,role}、recruitment/{info,crawler,push}、house/{data,listing,community,presale}、dashboard/workbench(两处本地小表 proxyConfig.enabled=false + gridApi.setGridOptions 写数据)。要点:gridOptions 需注解 VxeTableGridOptions(否则 type:'seq' 推断 string 报错);单元格自定义用 columns[].slots.default + h(TDesign组件);远程分页走 proxyConfig.ajax.query 返回 {items,total};筛选区保留手写 TDesign 组件不动;admin/role/listing/community 行操作 ActionItem 带 auth 权限码、删除 danger 标红;listing 多选批量标记改 vxe checkboxConfig + gridApi.grid.getCheckboxRecords();confirm 弹窗交互(删除/重置密码)保留 DialogPlugin 不变;typecheck 通过 diff --git a/apps/web-tdesign/src/locales/index.ts b/apps/web-tdesign/src/locales/index.ts index 6d98579..3982284 100644 --- a/apps/web-tdesign/src/locales/index.ts +++ b/apps/web-tdesign/src/locales/index.ts @@ -39,29 +39,13 @@ async function loadThirdPartyMessage(lang: SupportedLanguagesType) { } /** - * 加载dayjs的语言包 + * 加载dayjs的语言包(固定中文) * @param lang */ async function loadDayjsLocale(lang: SupportedLanguagesType) { - let locale; - switch (lang) { - case 'en-US': { - locale = await import('dayjs/locale/en'); - break; - } - case 'zh-CN': { - locale = await import('dayjs/locale/zh-cn'); - break; - } - // 默认使用英语 - default: { - locale = await import('dayjs/locale/en'); - } - } - if (locale) { + if (lang === 'zh-CN') { + const locale = await import('dayjs/locale/zh-cn'); dayjs.locale(locale); - } else { - console.error(`Failed to load dayjs locale for ${lang}`); } } diff --git a/apps/web-tdesign/src/locales/langs/en-US/demos.json b/apps/web-tdesign/src/locales/langs/en-US/demos.json deleted file mode 100644 index 0cb50b7..0000000 --- a/apps/web-tdesign/src/locales/langs/en-US/demos.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "title": "Demos", - "tdesign": "TDesign Vue", - "vben": { - "title": "Project", - "about": "About", - "document": "Document", - "antdv": "Ant Design Vue Version", - "antdv-next": "Antdv Next Version", - "naive-ui": "Naive UI Version", - "element-plus": "Element Plus Version" - } -} diff --git a/apps/web-tdesign/src/locales/langs/en-US/page.json b/apps/web-tdesign/src/locales/langs/en-US/page.json deleted file mode 100644 index 39f1641..0000000 --- a/apps/web-tdesign/src/locales/langs/en-US/page.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "auth": { - "login": "Login", - "register": "Register", - "codeLogin": "Code Login", - "qrcodeLogin": "Qr Code Login", - "forgetPassword": "Forget Password", - "profile": "Profile" - }, - "dashboard": { - "title": "Dashboard", - "analytics": "Analytics", - "workspace": "Workspace" - } -} diff --git a/apps/web-tdesign/src/preferences.ts b/apps/web-tdesign/src/preferences.ts index a5d49fd..762331b 100644 --- a/apps/web-tdesign/src/preferences.ts +++ b/apps/web-tdesign/src/preferences.ts @@ -16,6 +16,8 @@ export const overridesPreferences = defineOverridesPreferences({ accessMode: 'backend', // 后端暂未实现 refresh 接口,关闭 token 自动刷新 enableRefreshToken: false, + // 固定中文:移除国际化多语言,仅保留中文 + locale: 'zh-CN', }, copyright: appCopyrightPreferences, }); diff --git a/apps/web-tdesign/src/styles/theme.css b/apps/web-tdesign/src/styles/theme.css index be5ff2e..b6fce2b 100644 --- a/apps/web-tdesign/src/styles/theme.css +++ b/apps/web-tdesign/src/styles/theme.css @@ -1,19 +1,20 @@ /** * 全局主题美化 - * 设计语言:靛蓝(indigo)主色 + 紫(violet)渐变点缀;柔和圆角;轻投影;有纵深的浅色背景。 - * 说明:Vben 的 useTDesignDesignTokens 会用 JS 把品牌色写到 documentElement 上, - * 普通 :root 规则会被内联样式压过;因此对关键 --td-* 变量加 !important 强制生效。 + * 设计语言:跟随系统主题色(可在偏好设置中切换主题色);柔和圆角;轻投影;有纵深的浅色背景。 + * 说明:Vben 的 useTDesignDesignTokens 会用 JS 根据主题色动态把 --td-* 品牌色写到 + * documentElement 上,因此这里不再用固定色值覆盖品牌色,改为引用 --primary + * 变量,保证切换主题色时整个系统颜色同步变化。 */ :root { - /* —— 品牌主色(靛蓝 #4f5bff → 紫 #7c3aed 渐变体系) —— */ - --td-brand-color: #4f5bff !important; - --td-brand-color-hover: #6b75ff !important; - --td-brand-color-active: #3a45e0 !important; - --td-brand-color-disabled: #c2c7ff !important; - --td-brand-color-light: #eef0ff !important; - --td-brand-color-light-hover: #e0e3ff !important; - --td-brand-color-light-active: #d6daff !important; + /* —— 品牌主色:跟随系统主题色(--primary),支持在系统内切换 —— */ + --td-brand-color: var(--primary); + --td-brand-color-hover: var(--primary-600); + --td-brand-color-active: var(--primary-700); + --td-brand-color-disabled: var(--primary-200); + --td-brand-color-light: var(--primary-50); + --td-brand-color-light-hover: var(--primary-100); + --td-brand-color-light-active: var(--primary-200); /* —— 圆角:更现代、更柔 —— */ --td-radius-small: 6px !important; @@ -49,12 +50,12 @@ body { background-color: #f5f7fb; background-image: radial-gradient( 1200px 600px at 100% -10%, - rgb(79 91 255 / 6%), + color-mix(in srgb, var(--primary) 8%, transparent), transparent 60% ), radial-gradient( 900px 500px at -10% 110%, - rgb(124 58 237 / 5%), + color-mix(in srgb, var(--primary) 7%, transparent), transparent 55% ); background-attachment: fixed; @@ -94,20 +95,24 @@ body { background-color: #fafbff !important; } -/* 主按钮:带品牌渐变,更出彩 */ +/* 主按钮:带品牌渐变,更出彩(跟随主题色) */ .t-button--theme-primary:not(.t-button--variant-outline):not( .t-button--variant-text ):not(.t-button--variant-dashed) { - background: linear-gradient(135deg, #4f5bff 0%, #7c3aed 100%); + background: linear-gradient( + 135deg, + var(--primary) 0%, + var(--primary-700) 100% + ); border: none; - box-shadow: 0 4px 12px rgb(79 91 255 / 28%); + box-shadow: 0 4px 12px color-mix(in srgb, var(--primary) 28%, transparent); transition: transform 0.12s ease, box-shadow 0.12s ease, filter 0.12s ease; } .t-button--theme-primary:not(.t-button--variant-outline):not( .t-button--variant-text ):not(.t-button--variant-dashed):hover { - box-shadow: 0 6px 16px rgb(79 91 255 / 36%); + box-shadow: 0 6px 16px color-mix(in srgb, var(--primary) 36%, transparent); filter: brightness(1.05); transform: translateY(-1px); } @@ -142,12 +147,12 @@ html[theme-mode='dark'] body { background-color: #16171a; background-image: radial-gradient( 1200px 600px at 100% -10%, - rgb(79 91 255 / 12%), + color-mix(in srgb, var(--primary) 14%, transparent), transparent 60% ), radial-gradient( 900px 500px at -10% 110%, - rgb(124 58 237 / 10%), + color-mix(in srgb, var(--primary) 12%, transparent), transparent 55% ); } diff --git a/apps/web-tdesign/src/views/dashboard/workbench/index.vue b/apps/web-tdesign/src/views/dashboard/workbench/index.vue index 5c4aba9..6ed9481 100644 --- a/apps/web-tdesign/src/views/dashboard/workbench/index.vue +++ b/apps/web-tdesign/src/views/dashboard/workbench/index.vue @@ -93,13 +93,13 @@ const quickNavs = [ }, { title: '操作日志', - path: '/system/log/operation', + path: '/log/operation', icon: ICONS.log, gradient: 'linear-gradient(135deg,#8b5cf6,#a855f7)', }, { title: '登录日志', - path: '/system/log/login', + path: '/log/login', icon: ICONS.login, gradient: 'linear-gradient(135deg,#f59e0b,#fbbf24)', }, diff --git a/apps/web-tdesign/src/views/house/community/index.vue b/apps/web-tdesign/src/views/house/community/index.vue index fd1b4b8..e1c083f 100644 --- a/apps/web-tdesign/src/views/house/community/index.vue +++ b/apps/web-tdesign/src/views/house/community/index.vue @@ -5,7 +5,7 @@ import type { CommunityItem } from '#/api/house'; import { h, reactive, ref } from 'vue'; import { useAccess } from '@vben/access'; -import { Page, VbenTableAction } from '@vben/common-ui'; +import { Page, useVbenDrawer, VbenTableAction } from '@vben/common-ui'; import { DialogPlugin, MessagePlugin } from 'tdesign-vue-next'; @@ -17,12 +17,17 @@ import { updateCommunity, } from '#/api/house'; -// 小区管理:列表 + 新增/编辑弹窗 + 删除(软删除) +// 小区管理:列表 + 新增/编辑抽屉 + 删除(软删除) const { hasAccessByCodes } = useAccess(); -const dialogOpen = ref(false); const editing = ref(null); +// 新增/编辑小区抽屉(vben 封装抽屉组件) +const [Drawer, drawerApi] = useVbenDrawer({ + title: '新增小区', + onConfirm: submit, +}); + const regionOptions = [ '云岩区', '南明区', @@ -72,13 +77,15 @@ function openCreate() { propertyFee: 0, developer: '', }); - dialogOpen.value = true; + drawerApi.setState({ title: '新增小区' }); + drawerApi.open(); } function openEdit(row: CommunityItem) { editing.value = row; Object.assign(form, { ...row }); - dialogOpen.value = true; + drawerApi.setState({ title: '编辑小区' }); + drawerApi.open(); } async function submit() { @@ -87,7 +94,7 @@ async function submit() { ? await updateCommunity(editing.value.id, form) : await createCommunity(form); MessagePlugin.success('保存成功'); - dialogOpen.value = false; + drawerApi.close(); gridApi.query(); } @@ -178,7 +185,7 @@ function reset() { diff --git a/apps/web-tdesign/src/views/house/data/index.vue b/apps/web-tdesign/src/views/house/data/index.vue index b707ad7..edc3910 100644 --- a/apps/web-tdesign/src/views/house/data/index.vue +++ b/apps/web-tdesign/src/views/house/data/index.vue @@ -75,7 +75,7 @@ function reset() { diff --git a/packages/effects/layouts/src/basic/header/header.vue b/packages/effects/layouts/src/basic/header/header.vue index fac2ff9..305dbd6 100644 --- a/packages/effects/layouts/src/basic/header/header.vue +++ b/packages/effects/layouts/src/basic/header/header.vue @@ -18,7 +18,6 @@ import { useMagicKeys, whenever } from '@vueuse/core'; import { GlobalSearch, - LanguageToggle, LockScreenModal, Notification, PreferencesButton, @@ -163,12 +162,6 @@ const rightSlots = computed(() => { preferences.widget.themeToggleButtonPosition === 'header', slotName: 'theme-toggle', }, - languageToggle: { - visible: - preferences.widget.languageToggle && - preferences.widget.languageToggleButtonPosition === 'header', - slotName: 'language-toggle', - }, timezone: { visible: preferences.widget.timezone && @@ -337,14 +330,6 @@ function clearPreferencesAndLogout() { {{ $t('preferences.theme.title') }} -