From e4148fe8b53741ef5bdf1e17ca08b545d9b874dc Mon Sep 17 00:00:00 2001 From: cc Date: Tue, 13 May 2025 01:00:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=80=BB=E8=BE=91=E7=BC=96=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-ele/src/cdcm/api/api.js | 17 + apps/web-ele/src/cdcm/api/api.ts | 39 +++ apps/web-ele/src/cdcm/api/req_code.ts | 60 ++++ apps/web-ele/src/cdcm/api/request.ts | 66 ++++ apps/web-ele/src/cdcm/protocol/point_ext.ts | 32 +- .../web-ele/src/router/routes/modules/vben.ts | 2 +- apps/web-ele/src/store/auth.ts | 8 +- apps/web-ele/src/views/detail/index.vue | 298 +++++++++++++++++- apps/web-ele/src/views/logic/add.vue | 52 +++ apps/web-ele/src/views/logic/index.vue | 185 ++++++++++- apps/web-ele/src/views/network/index.vue | 194 +++++++++++- apps/web-ele/src/views/template/index.vue | 2 +- apps/web-ele/src/views/template/point.vue | 31 +- apps/web-ele/vite.config.mts | 2 +- cspell.json | 4 + 15 files changed, 968 insertions(+), 24 deletions(-) create mode 100644 apps/web-ele/src/cdcm/api/api.ts create mode 100644 apps/web-ele/src/cdcm/api/request.ts create mode 100644 apps/web-ele/src/views/logic/add.vue diff --git a/apps/web-ele/src/cdcm/api/api.js b/apps/web-ele/src/cdcm/api/api.js index ead4666..97b19ee 100644 --- a/apps/web-ele/src/cdcm/api/api.js +++ b/apps/web-ele/src/cdcm/api/api.js @@ -1,5 +1,22 @@ import { cdcmRequestClient } from './request'; +export async function cdcmCDCMAPI(params, key) { + return cdcmRequestClient.post('/cdcm', params, { + responseReturn: 'data', + headers: { + action: key.code, + }, + }); +} + +export async function cdcmRuleAPI(params, key) { + return cdcmRequestClient.post('/rule', params, { + responseReturn: 'data', + headers: { + action: key.code, + }, + }); +} export async function cdcmTemplateAPI(params, key) { return cdcmRequestClient.post('/template', params, { headers: { diff --git a/apps/web-ele/src/cdcm/api/api.ts b/apps/web-ele/src/cdcm/api/api.ts new file mode 100644 index 0000000..c30af8b --- /dev/null +++ b/apps/web-ele/src/cdcm/api/api.ts @@ -0,0 +1,39 @@ +import { cdcmRequestClient } from './request'; + +export interface action { + code: number; +} + +export async function cdcmCDCMAPI(params: any, key: action) { + return cdcmRequestClient.post('/cdcm', params, { + responseReturn: 'data', + headers: { + action: key.code, + }, + }); +} + +export async function cdcmRuleAPI(params: any, key: action) { + return cdcmRequestClient.post('/rule', params, { + responseReturn: 'data', + headers: { + action: key.code, + }, + }); +} + +export async function cdcmTemplateAPI(params: any, key: action) { + return cdcmRequestClient.post('/template', params, { + headers: { + action: key.code, + }, + }); +} + +export async function cdcmDriverAPI(params: any, key: action) { + return cdcmRequestClient.post('/driver', params, { + headers: { + action: key.code, + }, + }); +} diff --git a/apps/web-ele/src/cdcm/api/req_code.ts b/apps/web-ele/src/cdcm/api/req_code.ts index a3d266e..bee8bb1 100644 --- a/apps/web-ele/src/cdcm/api/req_code.ts +++ b/apps/web-ele/src/cdcm/api/req_code.ts @@ -1,5 +1,57 @@ // 请求码 export default { + CDCMGetNetworkInfo: { + code: 51_002, + desc: '获取网络信息', + }, + CDCMGetSystemInfo: { + code: 51_001, + desc: '获取系统信息', + }, + CDCMSetNetworkInfo: { + code: 51_003, + desc: '设置网络信息', + }, + CruleAddFlow: { + code: 52_608, + desc: '添加规则引擎流程', + }, + CruleDeleteFlow: { + code: 52_609, + desc: '删除规则引擎流程', + }, + CruleGetFlows: { + code: 52_610, + desc: '获取规则引擎流程', + }, + CruleGetVersion: { + code: 52_605, + desc: '获取规则引擎版本', + }, + CruleInstall: { + code: 52_603, + desc: '安装规则引擎', + }, + CruleStart: { + code: 52_601, + desc: '启动规则引擎', + }, + CruleStartFlow: { + code: 52_606, + desc: '启动规则引擎流程', + }, + CruleStop: { + code: 52_602, + desc: '停止规则引擎', + }, + CruleStopFlow: { + code: 52_607, + desc: '停止规则引擎流程', + }, + CruleUninstall: { + code: 52_604, + desc: '卸载规则引擎', + }, DeviceCreate: { code: 52_302, desc: '创建设备', @@ -84,6 +136,14 @@ export default { code: 52_024, desc: '删除模板点位', }, + PointExport: { + code: 52_025, + desc: '导出模板点位', + }, + PointImport: { + code: 52_026, + desc: '导入模板点位', + }, PointQueryAll: { code: 52_021, desc: '查询所有模板点位', diff --git a/apps/web-ele/src/cdcm/api/request.ts b/apps/web-ele/src/cdcm/api/request.ts new file mode 100644 index 0000000..272a45b --- /dev/null +++ b/apps/web-ele/src/cdcm/api/request.ts @@ -0,0 +1,66 @@ +import type { RequestClientOptions } from '@vben/request'; + +import { useAppConfig } from '@vben/hooks'; +import { defaultResponseInterceptor, RequestClient } from '@vben/request'; + +import { useTokenStore } from '#/store'; + +const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD); +function createCDCMRequestClient( + baseURL: string, + options?: RequestClientOptions, +) { + const client = new RequestClient({ + ...options, + baseURL, + }); + + client.addResponseInterceptor( + defaultResponseInterceptor({ + codeField: 'code', + dataField: 'data', + successCode: 0, + }), + ); + + // 响应拦截器:自动更新 token + client.addResponseInterceptor({ + fulfilled: (response) => { + const token = response.headers?.token; + if (token) { + // 如果响应头中有新 token,自动更新 store + useTokenStore().setToken(token); + } + return response; + }, + rejected: (error) => { + // 统一错误处理(如 token 过期) + if (error.response?.status === 401) { + useTokenStore().deleteToken(); + // 这里要跳登录页面 + } + return Promise.reject(error); + }, + }); + + // 请求拦截器:自动添加 token + client.addRequestInterceptor({ + fulfilled: (config) => { + const token = useTokenStore().token; + if (token) { + // 添加 CDCM 自定义头部 + config.headers.set('cdcm', token, true); + } + return config; + }, + rejected: (error) => { + // 请求错误处理 + return Promise.reject(error); + }, + }); + return client; +} + +export const cdcmRequestClient = createCDCMRequestClient(apiURL, { + responseReturn: 'data', +}); diff --git a/apps/web-ele/src/cdcm/protocol/point_ext.ts b/apps/web-ele/src/cdcm/protocol/point_ext.ts index be17b75..54bb28e 100644 --- a/apps/web-ele/src/cdcm/protocol/point_ext.ts +++ b/apps/web-ele/src/cdcm/protocol/point_ext.ts @@ -1,6 +1,32 @@ -export default { +import type { VxeGridProps } from '#/adapter/vxe-table'; + +const base: VxeGridProps['columns'] = [ + { field: 'name', title: '名称', width: 200 }, + { field: 'point_type', title: '类型', width: 150 }, + { field: 'access', title: '权限', width: 80 }, + { field: 'calculation', title: '公式', width: 100 }, + { field: 'unit', title: '单位', width: 150 }, + { field: 'description', title: '描述' }, +]; + +export const point_table = { modbus: [ - { field: 'register_type', title: '寄存器类型' }, - { field: 'register_address', title: '寄存器地址' }, + { title: '序号', type: 'seq', width: 80 }, + { + title: '扩展配置', + children: [ + { + field: 'protocol_ext.register_type', + title: '寄存器类型', + width: 100, + }, + { + field: 'protocol_ext.register_address', + title: '寄存器地址', + width: 100, + }, + ], + }, + ...base, ], }; diff --git a/apps/web-ele/src/router/routes/modules/vben.ts b/apps/web-ele/src/router/routes/modules/vben.ts index 20fbc96..40676ae 100644 --- a/apps/web-ele/src/router/routes/modules/vben.ts +++ b/apps/web-ele/src/router/routes/modules/vben.ts @@ -50,7 +50,7 @@ const routes: RouteRecordRaw[] = [ meta: { badgeType: 'dot', icon: 'logos:naiveui', - link: VBEN_NAIVE_PREVIEW_URL, + iframeSrc: VBEN_NAIVE_PREVIEW_URL, title: $t('demos.vben.naive-ui'), }, }, diff --git a/apps/web-ele/src/store/auth.ts b/apps/web-ele/src/store/auth.ts index 88bf59e..79bb594 100644 --- a/apps/web-ele/src/store/auth.ts +++ b/apps/web-ele/src/store/auth.ts @@ -11,13 +11,13 @@ import { defineStore } from 'pinia'; import { getUserInfoApi, loginApi, logoutApi } from '#/api'; import { $t } from '#/locales'; -import { useStaticConfigStore } from '#/store'; +// import { useStaticConfigStore } from '#/store'; export const useAuthStore = defineStore('auth', () => { const accessStore = useAccessStore(); const userStore = useUserStore(); - const staticConfigStore = useStaticConfigStore(); + // const staticConfigStore = useStaticConfigStore(); const router = useRouter(); const loginLoading = ref(false); @@ -38,9 +38,9 @@ export const useAuthStore = defineStore('auth', () => { userInfo.roles = ['admin']; try { loginLoading.value = true; - const { data } = await loginApi(params); + await loginApi(params); // 保存静态配置 - staticConfigStore.setConfig(data); + // staticConfigStore.setConfig(data); // console.log('staticConfigStore', staticConfigStore.support_driver_types); // const { accessToken } = await loginApi(params); diff --git a/apps/web-ele/src/views/detail/index.vue b/apps/web-ele/src/views/detail/index.vue index 6c69b92..2cba6c0 100644 --- a/apps/web-ele/src/views/detail/index.vue +++ b/apps/web-ele/src/views/detail/index.vue @@ -1,3 +1,299 @@ + + + + diff --git a/apps/web-ele/src/views/logic/add.vue b/apps/web-ele/src/views/logic/add.vue new file mode 100644 index 0000000..abadcae --- /dev/null +++ b/apps/web-ele/src/views/logic/add.vue @@ -0,0 +1,52 @@ + + + diff --git a/apps/web-ele/src/views/logic/index.vue b/apps/web-ele/src/views/logic/index.vue index 01e56e5..5bb5e29 100644 --- a/apps/web-ele/src/views/logic/index.vue +++ b/apps/web-ele/src/views/logic/index.vue @@ -1,3 +1,186 @@ + + diff --git a/apps/web-ele/src/views/network/index.vue b/apps/web-ele/src/views/network/index.vue index 1f21e11..f3241b1 100644 --- a/apps/web-ele/src/views/network/index.vue +++ b/apps/web-ele/src/views/network/index.vue @@ -1,3 +1,195 @@ + + + diff --git a/apps/web-ele/src/views/template/index.vue b/apps/web-ele/src/views/template/index.vue index 43d818d..3861bf7 100644 --- a/apps/web-ele/src/views/template/index.vue +++ b/apps/web-ele/src/views/template/index.vue @@ -47,7 +47,7 @@ const gridOptions: VxeGridProps = { labelField: 'name', }, columns: [ - { title: '序号', type: 'seq', width: 100 }, + { title: '序号', type: 'seq', width: 80 }, { field: 'name', title: '模板名称', width: 300 }, { field: 'type', title: '模板类型', width: 200 }, { field: 'description', title: '模板描述' }, diff --git a/apps/web-ele/src/views/template/point.vue b/apps/web-ele/src/views/template/point.vue index f979ce4..849b85e 100644 --- a/apps/web-ele/src/views/template/point.vue +++ b/apps/web-ele/src/views/template/point.vue @@ -8,6 +8,9 @@ import { useVbenDrawer } from '@vben/common-ui'; import { ElButton } from 'element-plus'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; +import { cdcmTemplateAPI } from '#/cdcm/api/api'; +import req from '#/cdcm/api/req_code'; +import { point_table } from '#/cdcm/protocol/point_ext'; interface PointDataType { id: number; @@ -40,16 +43,14 @@ const gridOptions: VxeGridProps = { highlight: true, labelField: 'name', // 修改为实际的字段名,原代码中是 productName 可能不正确 }, - columns: [ - { title: '序号', type: 'seq', width: 100 }, - { field: 'name', title: '点位名称' }, - { field: 'point_type', title: '点位类型' }, - { field: 'description', title: '点位描述' }, - { field: 'access', title: '读写权限' }, - { field: 'calculation', title: '计算公式' }, - { field: 'unit', title: '单位' }, - { field: 'protocol_config', title: '扩展配置' }, - ], + proxyConfig: { + ajax: { + query: async () => { + await template_query(); + return null; + }, + }, + }, exportConfig: {}, toolbarConfig: { custom: true, @@ -73,12 +74,20 @@ const [Drawer, drawerApi] = useVbenDrawer({ if (data) { template_data.value = data.data; tableApi.setGridOptions({ - data: template_data.value.points, + columns: point_table.modbus, }); + tableApi.query({ id: template_data.value.id }); + // template_query(template_data.value.id); } } }, }); +const template_query = async (id: number = 3) => { + const ret = await cdcmTemplateAPI({ id }, req.TemplateQuery); + tableApi.setGridOptions({ + data: ret.data.data.points, + }); +}; function btn_add() { // 这里添加新增点位的逻辑 diff --git a/apps/web-ele/vite.config.mts b/apps/web-ele/vite.config.mts index dc1b5ce..0ac798f 100644 --- a/apps/web-ele/vite.config.mts +++ b/apps/web-ele/vite.config.mts @@ -18,7 +18,7 @@ export default defineConfig(async () => { rewrite: (path) => path.replace(/^\/api/, ''), // mock代理目标地址 // target: 'http://10.10.10.41:5566/api', - target: 'http://api.shikicc.com:8900/api', + target: 'http://10.10.10.123/api', ws: true, }, }, diff --git a/cspell.json b/cspell.json index 659857c..19942cb 100644 --- a/cspell.json +++ b/cspell.json @@ -4,13 +4,17 @@ "language": "en,en-US", "allowCompoundWords": true, "words": [ + "AAPI", "acmr", "antd", "antdv", "astro", + "BAPI", "brotli", "CDCM", + "CDCMAPI", "clsx", + "Crule", "defu", "demi", "echarts",