From 7743cdc29a94810d1d0a8c6aecf59952e7c5114b Mon Sep 17 00:00:00 2001 From: liangzai <2440983361@qq.com> Date: Wed, 24 Dec 2025 14:42:57 +0800 Subject: [PATCH] fix: c --- .../src/api/product-manage/feature.ts | 56 + apps/web-antd/src/api/system/api.ts | 165 ++ apps/web-antd/src/api/system/index.ts | 1 + apps/web-antd/src/api/system/user.ts | 12 +- .../src/locales/langs/en-US/system.json | 24 +- .../src/locales/langs/zh-CN/system.json | 24 +- .../src/router/routes/modules/system.ts | 64 + .../src/views/product-manage/feature/data.ts | 16 +- .../src/views/product-manage/feature/list.vue | 19 +- .../feature/modules/example-config.vue | 151 ++ apps/web-antd/src/views/system/api/data.ts | 178 ++ apps/web-antd/src/views/system/api/list.vue | 171 ++ .../src/views/system/api/modules/form.vue | 77 + apps/web-antd/src/views/system/role/data.ts | 19 +- apps/web-antd/src/views/system/role/list.vue | 23 +- .../system/role/modules/api-permissions.vue | 214 +++ apps/web-antd/src/views/system/user/data.ts | 7 +- apps/web-antd/src/views/system/user/list.vue | 15 + .../user/modules/reset-password-form.vue | 83 + apps/web-antd/vite.config.mts | 4 +- cl.yaml | 1067 ----------- .../node-utils/src/__tests__/hash.test.ts | 52 - .../node-utils/src/__tests__/path.test.ts | 67 - .../cache/__tests__/storage-manager.test.ts | 130 -- .../src/color/__tests__/convert.test.ts | 58 - .../shared/src/utils/__tests__/diff.test.ts | 53 - .../shared/src/utils/__tests__/dom.test.ts | 127 -- .../src/utils/__tests__/inference.test.ts | 183 -- .../shared/src/utils/__tests__/letter.test.ts | 116 -- .../src/utils/__tests__/state-handler.test.ts | 60 - .../shared/src/utils/__tests__/tree.test.ts | 196 -- .../shared/src/utils/__tests__/unique.test.ts | 60 - .../__tests__/update-css-variables.test.ts | 30 - .../shared/src/utils/__tests__/util.test.ts | 156 -- .../shared/src/utils/__tests__/window.test.ts | 33 - .../src/__tests__/use-sortable.test.ts | 48 - .../__snapshots__/config.test.ts.snap | 122 -- .../preferences/__tests__/config.test.ts | 10 - .../preferences/__tests__/preferences.test.ts | 253 --- .../ui-kit/form-ui/__tests__/form-api.test.ts | 189 -- .../src/drawer/__tests__/drawer-api.test.ts | 116 -- .../src/modal/__tests__/modal-api.test.ts | 117 -- .../components/page/__tests__/page.test.ts | 89 - packages/locales/src/langs/zh-CN/ui.json | 4 +- .../__tests__/find-menu-by-path.test.ts | 88 - .../helpers/__tests__/generate-menus.test.ts | 236 --- .../generate-routes-frontend.test.ts | 105 -- .../__tests__/merge-route-modules.test.ts | 68 - pnpm-lock.yaml | 1598 +++++++++-------- 49 files changed, 2179 insertions(+), 4575 deletions(-) create mode 100644 apps/web-antd/src/api/system/api.ts create mode 100644 apps/web-antd/src/router/routes/modules/system.ts create mode 100644 apps/web-antd/src/views/product-manage/feature/modules/example-config.vue create mode 100644 apps/web-antd/src/views/system/api/data.ts create mode 100644 apps/web-antd/src/views/system/api/list.vue create mode 100644 apps/web-antd/src/views/system/api/modules/form.vue create mode 100644 apps/web-antd/src/views/system/role/modules/api-permissions.vue create mode 100644 apps/web-antd/src/views/system/user/modules/reset-password-form.vue delete mode 100644 cl.yaml delete mode 100644 internal/node-utils/src/__tests__/hash.test.ts delete mode 100644 internal/node-utils/src/__tests__/path.test.ts delete mode 100644 packages/@core/base/shared/src/cache/__tests__/storage-manager.test.ts delete mode 100644 packages/@core/base/shared/src/color/__tests__/convert.test.ts delete mode 100644 packages/@core/base/shared/src/utils/__tests__/diff.test.ts delete mode 100644 packages/@core/base/shared/src/utils/__tests__/dom.test.ts delete mode 100644 packages/@core/base/shared/src/utils/__tests__/inference.test.ts delete mode 100644 packages/@core/base/shared/src/utils/__tests__/letter.test.ts delete mode 100644 packages/@core/base/shared/src/utils/__tests__/state-handler.test.ts delete mode 100644 packages/@core/base/shared/src/utils/__tests__/tree.test.ts delete mode 100644 packages/@core/base/shared/src/utils/__tests__/unique.test.ts delete mode 100644 packages/@core/base/shared/src/utils/__tests__/update-css-variables.test.ts delete mode 100644 packages/@core/base/shared/src/utils/__tests__/util.test.ts delete mode 100644 packages/@core/base/shared/src/utils/__tests__/window.test.ts delete mode 100644 packages/@core/composables/src/__tests__/use-sortable.test.ts delete mode 100644 packages/@core/preferences/__tests__/__snapshots__/config.test.ts.snap delete mode 100644 packages/@core/preferences/__tests__/config.test.ts delete mode 100644 packages/@core/preferences/__tests__/preferences.test.ts delete mode 100644 packages/@core/ui-kit/form-ui/__tests__/form-api.test.ts delete mode 100644 packages/@core/ui-kit/popup-ui/src/drawer/__tests__/drawer-api.test.ts delete mode 100644 packages/@core/ui-kit/popup-ui/src/modal/__tests__/modal-api.test.ts delete mode 100644 packages/effects/common-ui/src/components/page/__tests__/page.test.ts delete mode 100644 packages/utils/src/helpers/__tests__/find-menu-by-path.test.ts delete mode 100644 packages/utils/src/helpers/__tests__/generate-menus.test.ts delete mode 100644 packages/utils/src/helpers/__tests__/generate-routes-frontend.test.ts delete mode 100644 packages/utils/src/helpers/__tests__/merge-route-modules.test.ts diff --git a/apps/web-antd/src/api/product-manage/feature.ts b/apps/web-antd/src/api/product-manage/feature.ts index 15a6525..cbf9de3 100644 --- a/apps/web-antd/src/api/product-manage/feature.ts +++ b/apps/web-antd/src/api/product-manage/feature.ts @@ -25,6 +25,37 @@ export namespace FeatureApi { api_id?: string; name?: string; } + + export interface FeatureExampleItem { + id: number; + feature_id: number; + api_id: string; + data: string; + create_time: string; + update_time: string; + } + + export interface ConfigFeatureExampleRequest { + feature_id: number; + data: string; + } + + export interface ConfigFeatureExampleResponse { + success: boolean; + } + + export interface GetFeatureExampleRequest { + feature_id: number; + } + + export interface GetFeatureExampleResponse { + id: number; + feature_id: number; + api_id: string; + data: string; + create_time: string; + update_time: string; + } } /** @@ -72,10 +103,35 @@ async function deleteFeature(id: number) { return requestClient.delete<{ success: boolean }>(`/feature/delete/${id}`); } +/** + * 配置功能示例数据 + * @param data 示例数据配置 + */ +async function configFeatureExample( + data: FeatureApi.ConfigFeatureExampleRequest, +) { + return requestClient.post( + '/feature/config-example', + data, + ); +} + +/** + * 获取功能示例数据 + * @param featureId 功能ID + */ +async function getFeatureExample(featureId: number) { + return requestClient.get( + `/feature/example/${featureId}`, + ); +} + export { + configFeatureExample, createFeature, deleteFeature, getFeatureDetail, + getFeatureExample, getFeatureList, updateFeature, }; diff --git a/apps/web-antd/src/api/system/api.ts b/apps/web-antd/src/api/system/api.ts new file mode 100644 index 0000000..0f4cd98 --- /dev/null +++ b/apps/web-antd/src/api/system/api.ts @@ -0,0 +1,165 @@ +import type { Recordable } from '@vben/types'; + +import { requestClient } from '#/api/request'; + +export namespace SystemApiApi { + export interface SystemApiItem { + id: number; + role_id?: number; + api_id?: number; + api_name: string; + api_code: string; + method: string; + url: string; + status: 0 | 1; + description?: string; + create_time?: string; + update_time?: string; + } + + export interface SystemApi { + list: SystemApiItem[]; + total: number; + } + + export interface SystemApiAllResponse { + items: SystemApiItem[]; + } + + export interface SystemRoleApiResponse { + items: null | SystemApiItem[]; + } + + export interface RoleApiItem { + id: number; + role_id: number; + api_id: number; + api_name: string; + api_code: string; + method: string; + url: string; + status: 0 | 1; + description?: string; + } + + export interface RoleApi { + list: RoleApiItem[]; + } +} + +/** + * 获取API列表数据 + */ +async function getApiList(params: Recordable) { + return requestClient.get('/api/list', { + params, + }); +} + +/** + * 获取API详情 + * @param id API ID + */ +async function getApiDetail(id: number) { + return requestClient.get(`/api/detail/${id}`); +} + +/** + * 创建API + * @param data API数据 + */ +async function createApi( + data: Omit, +) { + return requestClient.post('/api/create', data); +} + +/** + * 更新API + * @param id API ID + * @param data API数据 + */ +async function updateApi( + id: number, + data: Omit, +) { + return requestClient.put(`/api/update/${id}`, data); +} + +/** + * 删除API + * @param id API ID + */ +async function deleteApi(id: number) { + return requestClient.delete(`/api/delete/${id}`); +} + +/** + * 批量更新API状态 + * @param data.ids API ID数组 + * @param data.status 状态值 + */ +async function batchUpdateApiStatus(data: { ids: number[]; status: 0 | 1 }) { + return requestClient.put('/api/batch-update-status', data); +} + +/** + * 获取角色API权限列表 + * @param roleId 角色ID + */ +async function getRoleApiList(roleId: number) { + return requestClient.get( + `/role/${roleId}/api/list`, + ); +} + +/** + * 分配角色API权限 + * @param data.api_ids API ID数组 + * @param data.role_id 角色ID + */ +async function assignRoleApi(data: { api_ids: number[]; role_id: number }) { + return requestClient.post('/role/api/assign', data); +} + +/** + * 移除角色API权限 + * @param data.api_ids API ID数组 + * @param data.role_id 角色ID + */ +async function removeRoleApi(data: { api_ids: number[]; role_id: number }) { + return requestClient.post('/role/api/remove', data); +} + +/** + * 更新角色API权限(全量更新) + * @param data.api_ids API ID数组 + * @param data.role_id 角色ID + */ +async function updateRoleApi(data: { api_ids: number[]; role_id: number }) { + return requestClient.put('/role/api/update', data); +} + +/** + * 获取所有API列表(用于权限分配) + * @param params.status 状态过滤 + */ +async function getAllApiList(params?: { status?: number }) { + return requestClient.get('/api/all', { + params, + }); +} + +export { + assignRoleApi, + batchUpdateApiStatus, + createApi, + deleteApi, + getAllApiList, + getApiDetail, + getApiList, + getRoleApiList, + removeRoleApi, + updateApi, + updateRoleApi, +}; diff --git a/apps/web-antd/src/api/system/index.ts b/apps/web-antd/src/api/system/index.ts index 1b28fb6..36ce7fc 100644 --- a/apps/web-antd/src/api/system/index.ts +++ b/apps/web-antd/src/api/system/index.ts @@ -1,3 +1,4 @@ +export * from './api'; export * from './dept'; export * from './menu'; export * from './role'; diff --git a/apps/web-antd/src/api/system/user.ts b/apps/web-antd/src/api/system/user.ts index 27c761e..9f0649e 100644 --- a/apps/web-antd/src/api/system/user.ts +++ b/apps/web-antd/src/api/system/user.ts @@ -51,4 +51,14 @@ async function deleteUser(id: string) { return requestClient.delete(`/user/delete/${id}`); } -export { createUser, deleteUser, getUserList, updateUser }; +/** + * 重置用户密码 + * @param id 用户 ID + * @param data 新密码数据 + * @param data.password 新密码 + */ +async function resetPassword(id: string, data: { password: string }) { + return requestClient.post(`/reset-password/${id}`, data); +} + +export { createUser, deleteUser, getUserList, resetPassword, updateUser }; diff --git a/apps/web-antd/src/locales/langs/en-US/system.json b/apps/web-antd/src/locales/langs/en-US/system.json index 40eefdc..b8ec114 100644 --- a/apps/web-antd/src/locales/langs/en-US/system.json +++ b/apps/web-antd/src/locales/langs/en-US/system.json @@ -61,10 +61,27 @@ "operation": "Operation", "permissions": "Permissions", "setPermissions": "Permissions", + "setApiPermissions": "API Permissions", "roleCode": "Role Code", "description": "Description" }, + "api": { + "title": "API Management", + "list": "API List", + "name": "API", + "apiName": "API Name", + "apiCode": "API Code", + "method": "Request Method", + "url": "API URL", + "status": "Status", + "description": "Description", + "createTime": "Create Time", + "operation": "Operation", + "permissions": "Permissions", + "setPermissions": "Set Permissions" + }, "user": { + "title": "User Management", "name": "User", "list": "User List", "userName": "Username", @@ -72,6 +89,11 @@ "status": "Status", "setPermissions": "Set Permissions", "createTime": "Create Time", - "operation": "Operation" + "operation": "Operation", + "resetPassword": "Reset Password", + "newPassword": "New Password", + "confirmPassword": "Confirm Password", + "confirmPasswordRequired": "Please confirm password", + "passwordMismatch": "The two passwords do not match" } } diff --git a/apps/web-antd/src/locales/langs/zh-CN/system.json b/apps/web-antd/src/locales/langs/zh-CN/system.json index e1dee5f..904ea1f 100644 --- a/apps/web-antd/src/locales/langs/zh-CN/system.json +++ b/apps/web-antd/src/locales/langs/zh-CN/system.json @@ -62,11 +62,28 @@ "operation": "操作", "permissions": "权限", "setPermissions": "授权", + "setApiPermissions": "API权限", "roleCode": "角色编号", "description": "描述" }, "title": "系统管理", + "api": { + "title": "API管理", + "list": "API列表", + "name": "API", + "apiName": "API名称", + "apiCode": "API编码", + "method": "请求方法", + "url": "API地址", + "status": "状态", + "description": "描述", + "createTime": "创建时间", + "operation": "操作", + "permissions": "权限", + "setPermissions": "设置权限" + }, "user": { + "title": "用户管理", "name": "用户", "list": "用户列表", "userName": "用户名", @@ -74,6 +91,11 @@ "status": "状态", "setPermissions": "设置权限", "createTime": "创建时间", - "operation": "操作" + "operation": "操作", + "resetPassword": "重置密码", + "newPassword": "新密码", + "confirmPassword": "确认密码", + "confirmPasswordRequired": "请确认密码", + "passwordMismatch": "两次输入的密码不一致" } } diff --git a/apps/web-antd/src/router/routes/modules/system.ts b/apps/web-antd/src/router/routes/modules/system.ts new file mode 100644 index 0000000..b52a568 --- /dev/null +++ b/apps/web-antd/src/router/routes/modules/system.ts @@ -0,0 +1,64 @@ +import type { RouteRecordRaw } from 'vue-router'; + +import { $t } from '#/locales'; + +const routes: RouteRecordRaw[] = [ + { + meta: { + icon: 'ion:settings-outline', + order: 9997, + title: $t('system.title'), + }, + name: 'System', + path: '/system', + children: [ + { + path: '/system/user', + name: 'SystemUser', + meta: { + icon: 'mdi:account', + title: $t('system.user.title'), + }, + component: () => import('#/views/system/user/list.vue'), + }, + { + path: '/system/role', + name: 'SystemRole', + meta: { + icon: 'mdi:account-group', + title: $t('system.role.title'), + }, + component: () => import('#/views/system/role/list.vue'), + }, + { + path: '/system/api', + name: 'SystemApi', + meta: { + icon: 'mdi:api', + title: $t('system.api.title'), + }, + component: () => import('#/views/system/api/list.vue'), + }, + { + path: '/system/menu', + name: 'SystemMenu', + meta: { + icon: 'mdi:menu', + title: $t('system.menu.title'), + }, + component: () => import('#/views/system/menu/list.vue'), + }, + { + path: '/system/dept', + name: 'SystemDept', + meta: { + icon: 'charm:organisation', + title: $t('system.dept.title'), + }, + component: () => import('#/views/system/dept/list.vue'), + }, + ], + }, +]; + +export default routes; diff --git a/apps/web-antd/src/views/product-manage/feature/data.ts b/apps/web-antd/src/views/product-manage/feature/data.ts index 9f6853c..01af972 100644 --- a/apps/web-antd/src/views/product-manage/feature/data.ts +++ b/apps/web-antd/src/views/product-manage/feature/data.ts @@ -69,12 +69,26 @@ export function useColumns( nameTitle: '模块', onClick: onActionClick, }, + options: [ + { + code: 'edit', + text: '编辑', + }, + { + code: 'delete', + text: '删除', + }, + { + code: 'example', + text: '示例配置', + }, + ], name: 'CellOperation', }, field: 'operation', fixed: 'right', title: '操作', - width: 130, + width: 180, }, ]; } diff --git a/apps/web-antd/src/views/product-manage/feature/list.vue b/apps/web-antd/src/views/product-manage/feature/list.vue index b821f9f..9e58d0d 100644 --- a/apps/web-antd/src/views/product-manage/feature/list.vue +++ b/apps/web-antd/src/views/product-manage/feature/list.vue @@ -5,7 +5,7 @@ import type { } from '#/adapter/vxe-table'; import type { FeatureApi } from '#/api/product-manage'; -import { Page, useVbenDrawer } from '@vben/common-ui'; +import { Page, useVbenDrawer, useVbenModal } from '@vben/common-ui'; import { Plus } from '@vben/icons'; import { Button, message } from 'ant-design-vue'; @@ -14,6 +14,7 @@ import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { deleteFeature, getFeatureList } from '#/api/product-manage'; import { useColumns, useGridFormSchema } from './data'; +import ExampleConfig from './modules/example-config.vue'; import Form from './modules/form.vue'; // 表单抽屉 @@ -22,6 +23,12 @@ const [FormDrawer, formDrawerApi] = useVbenDrawer({ destroyOnClose: true, }); +// 示例配置弹窗 +const [ExampleConfigModal, exampleConfigModalApi] = useVbenModal({ + connectedComponent: ExampleConfig, + destroyOnClose: true, +}); + // 表格配置 const [Grid, gridApi] = useVbenVxeGrid({ formOptions: { @@ -67,6 +74,10 @@ function onActionClick(e: OnActionClickParams) { onEdit(e.row); break; } + case 'example': { + onExampleConfig(e.row); + break; + } } } @@ -104,11 +115,17 @@ function onRefresh() { function onCreate() { formDrawerApi.setData({}).open(); } + +// 示例配置处理 +function onExampleConfig(row: FeatureApi.FeatureItem) { + exampleConfigModalApi.setData(row).open(); +}