diff --git a/apps/web-antd/package.json b/apps/web-antd/package.json index c2237dda62971e5910bf13a8ae50997097dd2007..dd8b2435c65d5563542d4187a929cb48acff8081 100644 --- a/apps/web-antd/package.json +++ b/apps/web-antd/package.json @@ -61,6 +61,7 @@ "vue": "catalog:", "vue-dompurify-html": "catalog:", "vue-router": "catalog:", - "vue3-signature": "catalog:" + "vue3-signature": "catalog:", + "vuedraggable": "catalog:" } } diff --git a/apps/web-antd/public/wx-xingyu.png b/apps/web-antd/public/wx-xingyu.png index 5e4b6017d18890f6d302a5d86de7eaf2196d83c9..da2e45a3468c0f621e3c2721f93f352379fc2883 100644 Binary files a/apps/web-antd/public/wx-xingyu.png and b/apps/web-antd/public/wx-xingyu.png differ diff --git a/apps/web-antd/src/api/ai/mindmap/index.ts b/apps/web-antd/src/api/ai/mindmap/index.ts index 69e437341c10acc119eeb071d3a447fb44d9ac6e..192b9950f95528204d881b097128d478d1269e48 100644 --- a/apps/web-antd/src/api/ai/mindmap/index.ts +++ b/apps/web-antd/src/api/ai/mindmap/index.ts @@ -6,6 +6,7 @@ import { requestClient } from '#/api/request'; const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD); const accessStore = useAccessStore(); + export namespace AiMindmapApi { // AI 思维导图 export interface MindMap { @@ -19,7 +20,7 @@ export namespace AiMindmapApi { } // AI 思维导图生成 - export interface AiMindMapGenerateReq { + export interface AiMindMapGenerateReqVO { prompt: string; } } @@ -32,7 +33,7 @@ export function generateMindMap({ ctrl, }: { ctrl: AbortController; - data: AiMindmapApi.AiMindMapGenerateReq; + data: AiMindmapApi.AiMindMapGenerateReqVO; onClose?: (...args: any[]) => void; onError?: (...args: any[]) => void; onMessage?: (res: any) => void; @@ -53,12 +54,12 @@ export function generateMindMap({ }); } -// 查询思维导图分页 +/** 查询思维导图分页 */ export function getMindMapPage(params: any) { return requestClient.get(`/ai/mind-map/page`, { params }); } -// 删除思维导图 +/** 删除思维导图 */ export function deleteMindMap(id: number) { return requestClient.delete(`/ai/mind-map/delete?id=${id}`); } diff --git a/apps/web-antd/src/api/ai/model/apiKey/index.ts b/apps/web-antd/src/api/ai/model/apiKey/index.ts index 80dcbec1a9f94cf8f0470eb700ca81599c5e09e6..2ffc842d8c631fcf570001029fcac82929e2900e 100644 --- a/apps/web-antd/src/api/ai/model/apiKey/index.ts +++ b/apps/web-antd/src/api/ai/model/apiKey/index.ts @@ -13,7 +13,7 @@ export namespace AiModelApiKeyApi { } } -// 查询 API 密钥分页 +/** 查询 API 密钥分页 */ export function getApiKeyPage(params: PageParam) { return requestClient.get>( '/ai/api-key/page', @@ -21,28 +21,29 @@ export function getApiKeyPage(params: PageParam) { ); } -// 获得 API 密钥列表 +/** 获得 API 密钥列表 */ export function getApiKeySimpleList() { return requestClient.get( '/ai/api-key/simple-list', ); } -// 查询 API 密钥详情 +/** 查询 API 密钥详情 */ export function getApiKey(id: number) { return requestClient.get(`/ai/api-key/get?id=${id}`); } -// 新增 API 密钥 + +/** 新增 API 密钥 */ export function createApiKey(data: AiModelApiKeyApi.ApiKey) { return requestClient.post('/ai/api-key/create', data); } -// 修改 API 密钥 +/** 修改 API 密钥 */ export function updateApiKey(data: AiModelApiKeyApi.ApiKey) { return requestClient.put('/ai/api-key/update', data); } -// 删除 API 密钥 +/** 删除 API 密钥 */ export function deleteApiKey(id: number) { return requestClient.delete(`/ai/api-key/delete?id=${id}`); } diff --git a/apps/web-antd/src/api/ai/model/chatRole/index.ts b/apps/web-antd/src/api/ai/model/chatRole/index.ts index d52dbfee53045758d735568d78e67ddbfae197eb..266ca3474c96ecf6f80856944f7cf3a8a01869fb 100644 --- a/apps/web-antd/src/api/ai/model/chatRole/index.ts +++ b/apps/web-antd/src/api/ai/model/chatRole/index.ts @@ -20,7 +20,7 @@ export namespace AiModelChatRoleApi { } // AI 聊天角色 分页请求 - export interface ChatRolePageReq { + export interface ChatRolePageReqVO { name?: string; // 角色名称 category?: string; // 角色类别 publicStatus: boolean; // 是否公开 @@ -29,7 +29,7 @@ export namespace AiModelChatRoleApi { } } -// 查询聊天角色分页 +/** 查询聊天角色分页 */ export function getChatRolePage(params: PageParam) { return requestClient.get>( '/ai/chat-role/page', @@ -37,49 +37,49 @@ export function getChatRolePage(params: PageParam) { ); } -// 查询聊天角色详情 +/** 查询聊天角色详情 */ export function getChatRole(id: number) { return requestClient.get( `/ai/chat-role/get?id=${id}`, ); } -// 新增聊天角色 + +/** 新增聊天角色 */ export function createChatRole(data: AiModelChatRoleApi.ChatRole) { return requestClient.post('/ai/chat-role/create', data); } -// 修改聊天角色 +/** 修改聊天角色 */ export function updateChatRole(data: AiModelChatRoleApi.ChatRole) { return requestClient.put('/ai/chat-role/update', data); } -// 删除聊天角色 +/** 删除聊天角色 */ export function deleteChatRole(id: number) { return requestClient.delete(`/ai/chat-role/delete?id=${id}`); } -// ======= chat 聊天 -// 获取 my role -export function getMyPage(params: AiModelChatRoleApi.ChatRolePageReq) { +/** 获取 my role */ +export function getMyPage(params: AiModelChatRoleApi.ChatRolePageReqVO) { return requestClient.get('/ai/chat-role/my-page', { params }); } -// 获取角色分类 +/** 获取角色分类 */ export function getCategoryList() { return requestClient.get('/ai/chat-role/category-list'); } -// 创建角色 +/** 创建角色 */ export function createMy(data: AiModelChatRoleApi.ChatRole) { return requestClient.post('/ai/chat-role/create-my', data); } -// 更新角色 +/** 更新角色 */ export function updateMy(data: AiModelChatRoleApi.ChatRole) { return requestClient.put('/ai/chat-role/update', data); } -// 删除角色 my +/** 删除角色 my */ export function deleteMy(id: number) { return requestClient.delete(`/ai/chat-role/delete-my?id=${id}`); } diff --git a/apps/web-antd/src/api/ai/model/model/index.ts b/apps/web-antd/src/api/ai/model/model/index.ts index deafcee820242d73dc100bc7b6b4bbb295b27ff8..364327cc1bf9c10703c6fb9d118146a51ed6a69f 100644 --- a/apps/web-antd/src/api/ai/model/model/index.ts +++ b/apps/web-antd/src/api/ai/model/model/index.ts @@ -18,7 +18,7 @@ export namespace AiModelModelApi { } } -// 查询模型分页 +/** 查询模型分页 */ export function getModelPage(params: PageParam) { return requestClient.get>( '/ai/model/page', @@ -26,7 +26,7 @@ export function getModelPage(params: PageParam) { ); } -// 获得模型列表 +/** 获得模型列表 */ export function getModelSimpleList(type?: number) { return requestClient.get('/ai/model/simple-list', { params: { @@ -35,21 +35,22 @@ export function getModelSimpleList(type?: number) { }); } -// 查询模型详情 +/** 查询模型详情 */ export function getModel(id: number) { return requestClient.get(`/ai/model/get?id=${id}`); } -// 新增模型 + +/** 新增模型 */ export function createModel(data: AiModelModelApi.Model) { return requestClient.post('/ai/model/create', data); } -// 修改模型 +/** 修改模型 */ export function updateModel(data: AiModelModelApi.Model) { return requestClient.put('/ai/model/update', data); } -// 删除模型 +/** 删除模型 */ export function deleteModel(id: number) { return requestClient.delete(`/ai/model/delete?id=${id}`); } diff --git a/apps/web-antd/src/api/ai/model/tool/index.ts b/apps/web-antd/src/api/ai/model/tool/index.ts index 6fac9d74bf4b46bd8b4c3174e0e6bc51ccfdf2c0..03abc4e7b3fac8488895ea0ece0bf91f42cebaba 100644 --- a/apps/web-antd/src/api/ai/model/tool/index.ts +++ b/apps/web-antd/src/api/ai/model/tool/index.ts @@ -11,33 +11,34 @@ export namespace AiModelToolApi { } } -// 查询工具分页 +/** 查询工具分页 */ export function getToolPage(params: PageParam) { return requestClient.get>('/ai/tool/page', { params, }); } -// 查询工具详情 +/** 查询工具详情 */ export function getTool(id: number) { return requestClient.get(`/ai/tool/get?id=${id}`); } -// 新增工具 + +/** 新增工具 */ export function createTool(data: AiModelToolApi.Tool) { return requestClient.post('/ai/tool/create', data); } -// 修改工具 +/** 修改工具 */ export function updateTool(data: AiModelToolApi.Tool) { return requestClient.put('/ai/tool/update', data); } -// 删除工具 +/** 删除工具 */ export function deleteTool(id: number) { return requestClient.delete(`/ai/tool/delete?id=${id}`); } -// 获取工具简单列表 +/** 获取工具简单列表 */ export function getToolSimpleList() { return requestClient.get('/ai/tool/simple-list'); } diff --git a/apps/web-antd/src/api/ai/write/index.ts b/apps/web-antd/src/api/ai/write/index.ts index 4ca1fc7aa94be389b96fd5ed313be831fa83487a..a9863d27d2b3fd5d586b883c93d29df0dff14e3e 100644 --- a/apps/web-antd/src/api/ai/write/index.ts +++ b/apps/web-antd/src/api/ai/write/index.ts @@ -9,8 +9,10 @@ import { requestClient } from '#/api/request'; const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD); const accessStore = useAccessStore(); + export namespace AiWriteApi { export interface Write { + id?: number; type: AiWriteTypeEnum.REPLY | AiWriteTypeEnum.WRITING; // 1:撰写 2:回复 prompt: string; // 写作内容提示 1。撰写 2回复 originalContent: string; // 原文 @@ -26,29 +28,12 @@ export namespace AiWriteApi { createTime?: Date; // 创建时间 } - export interface AiWritePageReq extends PageParam { + export interface AiWritePageReqVO extends PageParam { userId?: number; // 用户编号 type?: AiWriteTypeEnum; // 写作类型 platform?: string; // 平台 createTime?: [string, string]; // 创建时间 } - - export interface AiWriteResp { - id: number; - userId: number; - type: number; - platform: string; - model: string; - prompt: string; - generatedContent: string; - originalContent: string; - length: number; - format: number; - tone: number; - language: number; - errorMessage: string; - createTime: string; - } } export function writeStream({ @@ -80,15 +65,14 @@ export function writeStream({ }); } -// 获取写作列表 -export function getWritePage(params: any) { - return requestClient.get>( - `/ai/write/page`, - { params }, - ); +/** 获取写作列表 */ +export function getWritePage(params: AiWriteApi.AiWritePageReqVO) { + return requestClient.get>(`/ai/write/page`, { + params, + }); } -// 删除音乐 +/** 删除写作记录 */ export function deleteWrite(id: number) { return requestClient.delete(`/ai/write/delete`, { params: { id } }); } diff --git a/apps/web-antd/src/api/bpm/category/index.ts b/apps/web-antd/src/api/bpm/category/index.ts index d8b5a9b3db4efb8b6035f27d95db4cafbc4fd0e3..64cf36cb4e20fc88402d1b94471686d1e72885bf 100644 --- a/apps/web-antd/src/api/bpm/category/index.ts +++ b/apps/web-antd/src/api/bpm/category/index.ts @@ -10,7 +10,7 @@ export namespace BpmCategoryApi { code: string; status: number; description?: string; - sort: number; // 分类排序 + sort: number; } } diff --git a/apps/web-antd/src/api/bpm/definition/index.ts b/apps/web-antd/src/api/bpm/definition/index.ts index c7facf6ec56dfacd0785f22a95d1085ac4f39d6a..01f0fd2a5b8687bf5e0446247f78c855726cd239 100644 --- a/apps/web-antd/src/api/bpm/definition/index.ts +++ b/apps/web-antd/src/api/bpm/definition/index.ts @@ -1,23 +1,31 @@ import type { PageParam, PageResult } from '@vben/request'; +import type { BpmModelApi } from '#/api/bpm/model'; + import { requestClient } from '#/api/request'; export namespace BpmProcessDefinitionApi { /** 流程定义 */ export interface ProcessDefinition { id: string; + key?: string; version: number; name: string; + category: string; description: string; deploymentTime: number; suspensionState: number; modelType: number; modelId: string; formType?: number; + formId?: number; + formName?: string; + formCustomCreatePath?: string; bpmnXml?: string; simpleModel?: string; formFields?: string[]; icon?: string; + startUsers?: BpmModelApi.UserInfo[]; } } diff --git a/apps/web-antd/src/api/bpm/form/index.ts b/apps/web-antd/src/api/bpm/form/index.ts index 0789071b2511d89a3a36027b03a4ae683c5a09ae..99c1299e9e34678562e9bf38d4f4a26455ec2976 100644 --- a/apps/web-antd/src/api/bpm/form/index.ts +++ b/apps/web-antd/src/api/bpm/form/index.ts @@ -5,7 +5,7 @@ import { requestClient } from '#/api/request'; export namespace BpmFormApi { /** 流程表单 */ export interface Form { - id?: number | undefined; + id?: number; name: string; conf: string; fields: string[]; @@ -23,7 +23,7 @@ export async function getFormPage(params: PageParam) { } /** 获取表单详情 */ -export async function getFormDetail(id: number) { +export async function getForm(id: number) { return requestClient.get(`/bpm/form/get?id=${id}`); } diff --git a/apps/web-antd/src/api/bpm/model/index.ts b/apps/web-antd/src/api/bpm/model/index.ts index 443b85c5ea2187eda5ec8f4e421f9444409dde5e..cd2afbc84a5876b819227356e38d4aebd8968b28 100644 --- a/apps/web-antd/src/api/bpm/model/index.ts +++ b/apps/web-antd/src/api/bpm/model/index.ts @@ -52,7 +52,7 @@ export interface ModelCategoryInfo { } /** 获取流程模型列表 */ -export async function getModelList(name: string | undefined) { +export async function getModelList(name?: string) { return requestClient.get('/bpm/model/list', { params: { name }, }); diff --git a/apps/web-antd/src/api/bpm/processInstance/index.ts b/apps/web-antd/src/api/bpm/processInstance/index.ts index 32e0075b90bb0f223d1c25048997ac52062e92f0..ecbc038553afde7f7bb37e9d303496d9a768adb5 100644 --- a/apps/web-antd/src/api/bpm/processInstance/index.ts +++ b/apps/web-antd/src/api/bpm/processInstance/index.ts @@ -15,6 +15,7 @@ export namespace BpmProcessInstanceApi { export interface Task { id: number; name: string; + assigneeUser?: User; } export interface User { @@ -51,6 +52,7 @@ export namespace BpmProcessInstanceApi { export interface ProcessInstance { businessKey: string; category: string; + categoryName?: string; createTime: string; endTime: string; fields: string[]; @@ -64,6 +66,10 @@ export namespace BpmProcessInstanceApi { startTime?: Date; startUser?: User; status: number; + summary?: { + key: string; + value: string; + }[]; tasks?: BpmProcessInstanceApi.Task[]; } diff --git a/apps/web-antd/src/api/bpm/task/index.ts b/apps/web-antd/src/api/bpm/task/index.ts index 1ab01192560e8c68ec36de845610ee8f373465b4..63e1af8860ff357fc9622cbc20d10bd099e70079 100644 --- a/apps/web-antd/src/api/bpm/task/index.ts +++ b/apps/web-antd/src/api/bpm/task/index.ts @@ -13,6 +13,7 @@ export namespace BpmTaskApi { status: number; // 监听器状态 event: string; // 监听事件 valueType: string; // 监听器值类型 + processInstance?: BpmProcessInstanceApi.ProcessInstance; // 流程实例 } // 流程任务 diff --git a/apps/web-antd/src/api/erp/finance/payment/index.ts b/apps/web-antd/src/api/erp/finance/payment/index.ts index c988b128656a03579e6bc698d7410284823cd20e..50281166563fba340e521ddcda5beeebd0c347f4 100644 --- a/apps/web-antd/src/api/erp/finance/payment/index.ts +++ b/apps/web-antd/src/api/erp/finance/payment/index.ts @@ -20,9 +20,9 @@ export namespace ErpFinancePaymentApi { export interface FinancePayment { id?: number; // 付款单编号 no: string; // 付款单号 - supplierId: number; // 供应商编号 + supplierId?: number; // 供应商编号 supplierName?: string; // 供应商名称 - paymentTime: Date; // 付款时间 + paymentTime?: Date; // 付款时间 totalPrice: number; // 合计金额,单位:元 discountPrice: number; // 优惠金额 paymentPrice: number; // 实际付款金额 diff --git a/apps/web-antd/src/api/iot/ota/task/record/index.ts b/apps/web-antd/src/api/iot/ota/task/record/index.ts index 3ad7b0990d651fc9d2fd9a1e1e722c76a5d0b665..2d66a422f2bb486c49daea59030bc47513499822 100644 --- a/apps/web-antd/src/api/iot/ota/task/record/index.ts +++ b/apps/web-antd/src/api/iot/ota/task/record/index.ts @@ -22,6 +22,7 @@ export namespace IoTOtaTaskRecordApi { } } +// TODO @AI:这里应该拿到 IoTOtaTaskRecordApi 里 /** IoT OTA 升级任务记录 */ export interface OtaTaskRecord { id?: number; @@ -95,7 +96,7 @@ export function getOtaTaskRecordStatusStatistics( taskId?: number, ) { return requestClient.get>( - '/iot/ota/task/record/status-statistics', + '/iot/ota/task/record/get-status-statistics', { params: { firmwareId, taskId } }, ); } diff --git a/apps/web-antd/src/api/mall/promotion/diy/page.ts b/apps/web-antd/src/api/mall/promotion/diy/page.ts index d332cc09eca186b858722a04ffce61df19783de5..afdface5a3ed6490cf4705ce3278ca574af71266 100644 --- a/apps/web-antd/src/api/mall/promotion/diy/page.ts +++ b/apps/web-antd/src/api/mall/promotion/diy/page.ts @@ -5,12 +5,18 @@ import { requestClient } from '#/api/request'; export namespace MallDiyPageApi { /** 装修页面 */ export interface DiyPage { - id?: number; // 页面编号 - templateId?: number; // 模板编号 - name: string; // 页面名称 - remark: string; // 备注 - previewPicUrls: string[]; // 预览图片地址数组 - property: string; // 页面属性 + /** 页面编号 */ + id?: number; + /** 模板编号 */ + templateId?: number; + /** 页面名称 */ + name: string; + /** 备注 */ + remark: string; + /** 预览图片地址数组 */ + previewPicUrls: string[]; + /** 页面属性 */ + property: string; } } @@ -46,7 +52,7 @@ export function deleteDiyPage(id: number) { /** 获得装修页面属性 */ export function getDiyPageProperty(id: number) { - return requestClient.get(`/promotion/diy-page/get-property?id=${id}`); + return requestClient.get(`/promotion/diy-page/get-property?id=${id}`); } /** 更新装修页面属性 */ diff --git a/apps/web-antd/src/api/mall/promotion/diy/template.ts b/apps/web-antd/src/api/mall/promotion/diy/template.ts index 9b7596e85334dd36551af2257704bed4e542eb58..f7d82d35203112b4b90337b30374d646d25effb0 100644 --- a/apps/web-antd/src/api/mall/promotion/diy/template.ts +++ b/apps/web-antd/src/api/mall/promotion/diy/template.ts @@ -7,18 +7,26 @@ import { requestClient } from '#/api/request'; export namespace MallDiyTemplateApi { /** 装修模板 */ export interface DiyTemplate { - id?: number; // 模板编号 - name: string; // 模板名称 - used: boolean; // 是否使用 - usedTime?: Date; // 使用时间 - remark: string; // 备注 - previewPicUrls: string[]; // 预览图片地址数组 - property: string; // 模板属性 + /** 模板编号 */ + id?: number; + /** 模板名称 */ + name: string; + /** 是否使用 */ + used: boolean; + /** 使用时间 */ + usedTime?: Date; + /** 备注 */ + remark: string; + /** 预览图片地址数组 */ + previewPicUrls: string[]; + /** 模板属性 */ + property: string; } /** 装修模板属性(包含页面列表) */ export interface DiyTemplateProperty extends DiyTemplate { - pages: MallDiyPageApi.DiyPage[]; // 页面列表 + /** 页面列表 */ + pages: MallDiyPageApi.DiyPage[]; } } diff --git a/apps/web-antd/src/api/mall/statistics/trade.ts b/apps/web-antd/src/api/mall/statistics/trade.ts index 3f8d1cb8207a4a60a36e31ccebd2eb5cea28c2c3..17b20e70941adbdfdd139dc6376af68b0c27b885 100644 --- a/apps/web-antd/src/api/mall/statistics/trade.ts +++ b/apps/web-antd/src/api/mall/statistics/trade.ts @@ -76,31 +76,23 @@ export function getTradeStatisticsSummary() { } /** 获得交易状况统计 */ -export function getTradeStatisticsAnalyse( - params: MallTradeStatisticsApi.TradeTrendReq, -) { +export function getTradeStatisticsAnalyse(params: any) { return requestClient.get< DataComparisonRespVO - >('/statistics/trade/analyse', { params: formatDateParam(params) }); + >('/statistics/trade/analyse', { params }); } /** 获得交易状况明细 */ -export function getTradeStatisticsList( - params: MallTradeStatisticsApi.TradeTrendReq, -) { +export function getTradeStatisticsList(params: any) { return requestClient.get( '/statistics/trade/list', - { params: formatDateParam(params) }, + { params }, ); } /** 导出交易状况明细 */ -export function exportTradeStatisticsExcel( - params: MallTradeStatisticsApi.TradeTrendReq, -) { - return requestClient.download('/statistics/trade/export-excel', { - params: formatDateParam(params), - }); +export function exportTradeStatisticsExcel(params: any) { + return requestClient.download('/statistics/trade/export-excel', { params }); } /** 获得交易订单数量 */ diff --git a/apps/web-antd/src/api/mp/statistics/index.ts b/apps/web-antd/src/api/mp/statistics/index.ts index e36073820044be35a89d1ff7c9d7533e6b55ba9a..47200ff2b53d3f7cc047db9a4978145597d121a9 100644 --- a/apps/web-antd/src/api/mp/statistics/index.ts +++ b/apps/web-antd/src/api/mp/statistics/index.ts @@ -1,13 +1,10 @@ -import type { PageParam } from '@vben/request'; - import { requestClient } from '#/api/request'; export namespace MpStatisticsApi { /** 统计查询参数 */ - export interface StatisticsQuery extends PageParam { + export interface StatisticsQuery { accountId: number; - beginDate: string; - endDate: string; + date: Date[]; } /** 消息发送概况数据 */ diff --git a/apps/web-antd/src/assets/imgs/diy/app-nav-bar-mp.png b/apps/web-antd/src/assets/imgs/diy/app-nav-bar-mp.png new file mode 100644 index 0000000000000000000000000000000000000000..c982804c7287c904468dad6252fd393c6cbd271f Binary files /dev/null and b/apps/web-antd/src/assets/imgs/diy/app-nav-bar-mp.png differ diff --git a/apps/web-antd/src/assets/imgs/diy/statusBar.png b/apps/web-antd/src/assets/imgs/diy/statusBar.png new file mode 100644 index 0000000000000000000000000000000000000000..b85562e4236852358c93161735671f8f0466db71 Binary files /dev/null and b/apps/web-antd/src/assets/imgs/diy/statusBar.png differ diff --git a/apps/web-antd/src/bootstrap.ts b/apps/web-antd/src/bootstrap.ts index 0f1ab09fbc2f3d24ee477571b46dff5b3f9f9395..be5a5eda7e2a628043e65ea465c162c350c41b0b 100644 --- a/apps/web-antd/src/bootstrap.ts +++ b/apps/web-antd/src/bootstrap.ts @@ -35,6 +35,7 @@ async function bootstrap(namespace: string) { // }); const app = createApp(App); + app.use(VueDOMPurifyHTML); // 注册v-loading指令 registerLoadingDirective(app, { @@ -61,10 +62,6 @@ async function bootstrap(namespace: string) { // formCreate setupFormCreate(app); - // vue-dompurify-html - // TODO @dhb52:VueDOMPurifyHTML 是不是不用引入哈? - app.use(VueDOMPurifyHTML); - // 配置Motion插件 const { MotionPlugin } = await import('@vben/plugins/motion'); app.use(MotionPlugin); diff --git a/apps/web-antd/src/components/description/description.vue b/apps/web-antd/src/components/description/description.vue index c3f54695ff91d0af2bc88686b1f7de9876670703..3d341596e1d3a8c5ff2ce96de1db0d7a60fbdca2 100644 --- a/apps/web-antd/src/components/description/description.vue +++ b/apps/web-antd/src/components/description/description.vue @@ -1,82 +1,197 @@ diff --git a/apps/web-antd/src/components/description/typing.ts b/apps/web-antd/src/components/description/typing.ts index a0e997770d2937c8a6a995071d01872848237881..378f4a2ad5904edec583bd4cab8d19fc4fc6f692 100644 --- a/apps/web-antd/src/components/description/typing.ts +++ b/apps/web-antd/src/components/description/typing.ts @@ -1,27 +1,56 @@ -import type { DescriptionsProps } from 'ant-design-vue'; +import type { DescriptionsProps } from 'ant-design-vue/es/descriptions'; +import type { JSX } from 'vue/jsx-runtime'; import type { CSSProperties, VNode } from 'vue'; -// TODO @xingyu:【content】这个纠结下;1)vben2.0 是 render;https://doc.vvbin.cn/components/desc.html#usage 2) -// TODO @xingyu:vben2.0 还有 sapn【done】、labelMinWidth、contentMinWidth -// TODO @xingyu:【hidden】这个纠结下;1)vben2.0 是 show; +import type { Recordable } from '@vben/types'; + export interface DescriptionItemSchema { - label: string | VNode; // 内容的描述 - field?: string; // 对应 data 中的字段名 - content?: ((data: any) => string | VNode) | string | VNode; // 自定义需要展示的内容,比如说 dict-tag - span?: number; // 包含列的数量 - labelStyle?: CSSProperties; // 自定义标签样式 - contentStyle?: CSSProperties; // 自定义内容样式 - hidden?: ((data: any) => boolean) | boolean; // 是否显示 + labelMinWidth?: number; + contentMinWidth?: number; + // 自定义标签样式 + labelStyle?: CSSProperties; + // 对应 data 中的字段名 + field: string; + // 内容的描述 + label: JSX.Element | string | VNode; + // 包含列的数量 + span?: number; + // 是否显示 + show?: (...arg: any) => boolean; + // 插槽名称 + slot?: string; + // 自定义需要展示的内容 + render?: ( + val: any, + data?: Recordable, + ) => Element | JSX.Element | number | string | undefined | VNode; +} + +export interface DescriptionProps extends DescriptionsProps { + // 是否包含卡片组件 + useCard?: boolean; + // 描述项配置 + schema: DescriptionItemSchema[]; + // 数据 + data: Recordable; + // 标题 + title?: string; + // 是否包含边框 + bordered?: boolean; + // 列数 + column?: + | number + | { + lg: number; + md: number; + sm: number; + xl: number; + xs: number; + xxl: number; + }; } -// TODO @xingyu:vben2.0 还有 title【done】、bordered【done】d、useCollapse、collapseOptions -// TODO @xingyu:from 5.0:bordered 默认为 true -// TODO @xingyu:from 5.0:column 默认为 lg: 3, md: 3, sm: 2, xl: 3, xs: 1, xxl: 4 -// TODO @xingyu:from 5.0:size 默认为 small;有 'default', 'middle', 'small', undefined -// TODO @xingyu:from 5.0:useCollapse 默认为 true -export interface DescriptionsOptions { - data?: Record; // 数据 - schema?: DescriptionItemSchema[]; // 描述项配置 - componentProps?: DescriptionsProps; // antd Descriptions 组件参数 +export interface DescInstance { + setDescProps(descProps: Partial): void; } diff --git a/apps/web-antd/src/components/description/use-description.ts b/apps/web-antd/src/components/description/use-description.ts index 7f99238bf9e00dfafa7ac26e3c3b66b1bbfaa44b..fd24920f0c44fffa5e226a779a1129a8c68c1e63 100644 --- a/apps/web-antd/src/components/description/use-description.ts +++ b/apps/web-antd/src/components/description/use-description.ts @@ -1,71 +1,31 @@ -import type { DescriptionsOptions } from './typing'; +import type { Component } from 'vue'; -import { defineComponent, h, isReactive, reactive, watch } from 'vue'; +import type { DescInstance, DescriptionProps } from './typing'; -import Description from './description.vue'; - -/** 描述列表 api 定义 */ -class DescriptionApi { - private state = reactive>({}); - - constructor(options: DescriptionsOptions) { - this.state = { ...options }; - } +import { h, reactive } from 'vue'; - getState(): DescriptionsOptions { - return this.state as DescriptionsOptions; - } +import Description from './description.vue'; - // TODO @xingyu:【setState】纠结下:1)vben2.0 是 data https://doc.vvbin.cn/components/desc.html#usage; - setState(newState: Partial) { - this.state = { ...this.state, ...newState }; - } -} +export function useDescription(options?: Partial) { + const propsState = reactive>(options || {}); -export type ExtendedDescriptionApi = DescriptionApi; + const api: DescInstance = { + setDescProps: (descProps: Partial): void => { + Object.assign(propsState, descProps); + }, + }; -export function useDescription(options: DescriptionsOptions) { - const IS_REACTIVE = isReactive(options); - const api = new DescriptionApi(options); - // 扩展 API - const extendedApi: ExtendedDescriptionApi = api as never; - const Desc = defineComponent({ + // 创建一个包装组件,将 propsState 合并到 props 中 + const DescriptionWrapper: Component = { name: 'UseDescription', inheritAttrs: false, - setup(_, { attrs, slots }) { - // 合并props和attrs到state - api.setState({ ...attrs }); - - return () => - h( - Description, - { - ...api.getState(), - ...attrs, - }, - slots, - ); + setup(_props, { attrs, slots }) { + return () => { + // @ts-ignore - 避免类型实例化过深 + return h(Description, { ...propsState, ...attrs }, slots); + }; }, - }); - - // 响应式支持 - if (IS_REACTIVE) { - watch( - () => options.schema, - (newSchema) => { - api.setState({ schema: newSchema }); - }, - { immediate: true, deep: true }, - ); - - watch( - () => options.data, - (newData) => { - api.setState({ data: newData }); - }, - { immediate: true, deep: true }, - ); - } + }; - return [Desc, extendedApi] as const; + return [DescriptionWrapper, api] as const; } diff --git a/apps/web-antd/src/components/form-create/components/use-api-select.tsx b/apps/web-antd/src/components/form-create/components/use-api-select.tsx index 6d728715e6989a07892ac111051290fb5ee5f04b..ead612517b325565a501ae142540fe3676122044 100644 --- a/apps/web-antd/src/components/form-create/components/use-api-select.tsx +++ b/apps/web-antd/src/components/form-create/components/use-api-select.tsx @@ -202,7 +202,7 @@ export function useApiSelect(option: ApiSelectProps) { onUpdate:value={onUpdateModelValue as any} value={modelValue as any} {...restAttrs} - // TODO: remote 对等实现 + // TODO @xingyu remote 对等实现, 还是说没作用 // remote={props.remote} {...(props.remote && { remoteMethod })} > @@ -223,7 +223,7 @@ export function useApiSelect(option: ApiSelectProps) { onUpdate:value={onUpdateModelValue as any} value={modelValue as any} {...restAttrs} - // TODO: @dhb52 remote 对等实现, 还是说没作用 + // TODO: @xingyu remote 对等实现, 还是说没作用 // remote={props.remote} {...(props.remote && { remoteMethod })} > diff --git a/apps/web-antd/src/components/form-create/rules/use-dict-select.ts b/apps/web-antd/src/components/form-create/rules/use-dict-select.ts index 0054cd41e302c7ab9b4134ff33e9ee2a197d1e1f..c486b6716df6adf97fb2173b81e02dbf0acd6e53 100644 --- a/apps/web-antd/src/components/form-create/rules/use-dict-select.ts +++ b/apps/web-antd/src/components/form-create/rules/use-dict-select.ts @@ -1,8 +1,10 @@ +import type { SystemDictTypeApi } from '#/api/system/dict/type'; + import { onMounted, ref } from 'vue'; import { buildUUID, cloneDeep } from '@vben/utils'; -import * as DictDataApi from '#/api/system/dict/type'; +import { getSimpleDictTypeList } from '#/api/system/dict/type'; import { localeProps, makeRequiredRule, @@ -18,12 +20,12 @@ export function useDictSelectRule() { const rules = cloneDeep(selectRule); const dictOptions = ref<{ label: string; value: string }[]>([]); // 字典类型下拉数据 onMounted(async () => { - const data = await DictDataApi.getSimpleDictTypeList(); + const data = await getSimpleDictTypeList(); if (!data || data.length === 0) { return; } dictOptions.value = - data?.map((item: DictDataApi.SystemDictTypeApi.DictType) => ({ + data?.map((item: SystemDictTypeApi.DictType) => ({ label: item.name, value: item.type, })) ?? []; diff --git a/apps/web-antd/src/components/form-create/typing.ts b/apps/web-antd/src/components/form-create/typing.ts index b89e6f780703834816dc7e36bd29e86ce69a6790..35c1a39fcbff82f8f4cfc813f8feec799b376325 100644 --- a/apps/web-antd/src/components/form-create/typing.ts +++ b/apps/web-antd/src/components/form-create/typing.ts @@ -1,9 +1,7 @@ -import type { Rule } from '@form-create/ant-design-vue'; - /** 数据字典 Select 选择器组件 Props 类型 */ export interface DictSelectProps { dictType: string; // 字典类型 - valueType?: 'bool' | 'int' | 'str'; // 字典值类型 TODO @芋艿:'boolean' | 'number' | 'string';需要和 vue3 一起统一! + valueType?: 'bool' | 'int' | 'str'; // 字典值类型 selectType?: 'checkbox' | 'radio' | 'select'; // 选择器类型,下拉框 select、多选框 checkbox、单选框 radio formCreateInject?: any; } @@ -22,25 +20,6 @@ export interface Menu { list: MenuItem[]; } -export type MenuList = Array; - -// TODO @dhb52:MenuList、Menu、MenuItem、DragRule 这几个,是不是没用到呀? -// 拖拽组件的规则 -export interface DragRule { - icon: string; - name: string; - label: string; - children?: string; - inside?: true; - drag?: string | true; - dragBtn?: false; - mask?: false; - - rule(): Rule; - - props(v: any, v1: any): Rule[]; -} - /** 通用 API 下拉组件 Props 类型 */ export interface ApiSelectProps { name: string; // 组件名称 diff --git a/apps/web-antd/src/components/table-action/icons.ts b/apps/web-antd/src/components/table-action/icons.ts index 88cda5978b6cf8bb86b5835bf407ca2a91c963b2..df5bf1a779cb62fdab3eeccb7ff04c6986ae21ae 100644 --- a/apps/web-antd/src/components/table-action/icons.ts +++ b/apps/web-antd/src/components/table-action/icons.ts @@ -10,4 +10,5 @@ export const ACTION_ICON = { MORE: 'lucide:ellipsis-vertical', VIEW: 'lucide:eye', COPY: 'lucide:copy', + CLOSE: 'lucide:x', }; diff --git a/apps/web-antd/src/components/upload/image-upload.vue b/apps/web-antd/src/components/upload/image-upload.vue index 4f0e9d1bf13a5747d278889e9c8029ca8d7d3747..a79f5b7cb17eee8acdf1cd4a6c9b8582b370813e 100644 --- a/apps/web-antd/src/components/upload/image-upload.vue +++ b/apps/web-antd/src/components/upload/image-upload.vue @@ -241,7 +241,7 @@ function handleUploadSuccess(res: any, file: File) { // 处理上传错误 function handleUploadError(error: any) { console.error('上传错误:', error); - message.error($t('ui.upload.uploadError')); + message.error('上传错误!!!'); // 上传失败时减少计数器 uploadNumber.value = Math.max(0, uploadNumber.value - 1); } diff --git a/apps/web-antd/src/plugins/form-create/index.ts b/apps/web-antd/src/plugins/form-create/index.ts index 958b9d52bb482270156571bd32c1f47620b907a3..d7b59b5b7ced0bd2cc40df19e4379562c78fa114 100644 --- a/apps/web-antd/src/plugins/form-create/index.ts +++ b/apps/web-antd/src/plugins/form-create/index.ts @@ -91,10 +91,12 @@ const components = [ FileUpload, ]; +// 参考 https://www.form-create.com/v3/ant-design-vue/auto-import 文档 export function setupFormCreate(app: App) { components.forEach((component) => { app.component(component.name as string, component); }); + // TODO @xingyu:这里为啥 app.component('AMessage', message); 看官方是没有的; app.component('AMessage', message); formCreate.use(install); app.use(formCreate); diff --git a/apps/web-antd/src/router/routes/modules/ai.ts b/apps/web-antd/src/router/routes/modules/ai.ts index 67f9f69d8308ec96d7c4a3bb90d68424ee5a4456..dc66c492771266ea027932e7d75cf9f40c9d0ea2 100644 --- a/apps/web-antd/src/router/routes/modules/ai.ts +++ b/apps/web-antd/src/router/routes/modules/ai.ts @@ -83,7 +83,7 @@ const routes: RouteRecordRaw[] = [ }, }, { - path: 'console/workflow/create', + path: String.raw`workflow/create/:id(\d+)/:type(update|create)`, component: () => import('#/views/ai/workflow/form/index.vue'), name: 'AiWorkflowCreate', meta: { diff --git a/apps/web-antd/src/router/routes/modules/bpm.ts b/apps/web-antd/src/router/routes/modules/bpm.ts index 21abaabe5b39eedb27dc156e7d810efe19bc1058..05e0e5664449d9a75d283279db88a5022521111e 100644 --- a/apps/web-antd/src/router/routes/modules/bpm.ts +++ b/apps/web-antd/src/router/routes/modules/bpm.ts @@ -51,7 +51,7 @@ const routes: RouteRecordRaw[] = [ name: 'BpmFormEditor', component: () => import('#/views/bpm/form/designer/index.vue'), meta: { - title: '编辑流程表单', + title: '设计流程表单', activePath: '/bpm/manager/form', }, props: (route) => { diff --git a/apps/web-antd/src/router/routes/modules/iot.ts b/apps/web-antd/src/router/routes/modules/iot.ts index 54c0b27f8942595a76705fcf0e5f998a53ca027e..3e7f87cafd06047fd2b0f133a0e68a7a12e96b90 100644 --- a/apps/web-antd/src/router/routes/modules/iot.ts +++ b/apps/web-antd/src/router/routes/modules/iot.ts @@ -31,6 +31,16 @@ const routes: RouteRecordRaw[] = [ component: () => import('#/views/iot/device/device/modules/detail/index.vue'), }, + { + path: 'ota/firmware/detail/:id', + name: 'IoTOtaFirmwareDetail', + meta: { + title: '固件详情', + activePath: '/iot/ota', + }, + component: () => + import('#/views/iot/ota/modules/firmware-detail/index.vue'), + }, ], }, ]; diff --git a/apps/web-antd/src/router/routes/modules/mall.ts b/apps/web-antd/src/router/routes/modules/mall.ts index e68bea65f9c0639e9f7c86f15d8fd23d5dc15530..db8fcab5eb89ef2f5295fefa1d450d2f6ef6df60 100644 --- a/apps/web-antd/src/router/routes/modules/mall.ts +++ b/apps/web-antd/src/router/routes/modules/mall.ts @@ -18,7 +18,7 @@ const routes: RouteRecordRaw[] = [ title: '商品添加', activePath: '/mall/product/spu', }, - component: () => import('#/views/mall/product/spu/modules/form.vue'), + component: () => import('#/views/mall/product/spu/form/index.vue'), }, { path: String.raw`spu/edit/:id(\d+)`, @@ -27,16 +27,16 @@ const routes: RouteRecordRaw[] = [ title: '商品编辑', activePath: '/mall/product/spu', }, - component: () => import('#/views/mall/product/spu/modules/form.vue'), + component: () => import('#/views/mall/product/spu/form/index.vue'), }, { path: String.raw`spu/detail/:id(\d+)`, name: 'ProductSpuDetail', meta: { title: '商品详情', - activePath: '/crm/business', + activePath: '/mall/product/spu', }, - component: () => import('#/views/mall/product/spu/modules/detail.vue'), + component: () => import('#/views/mall/product/spu/form/index.vue'), }, ], }, @@ -71,6 +71,40 @@ const routes: RouteRecordRaw[] = [ }, ], }, + { + path: '/diy', + name: 'DiyCenter', + meta: { + title: '营销中心', + icon: 'lucide:shopping-bag', + keepAlive: true, + hideInMenu: true, + }, + children: [ + { + path: String.raw`template/decorate/:id(\d+)`, + name: 'DiyTemplateDecorate', + meta: { + title: '模板装修', + activePath: '/mall/promotion/diy-template/diy-template', + }, + component: () => + import('#/views/mall/promotion/diy/template/decorate/index.vue'), + }, + { + path: 'page/decorate/:id', + name: 'DiyPageDecorate', + meta: { + title: '页面装修', + noCache: false, + hidden: true, + activePath: '/mall/promotion/diy-template/diy-page', + }, + component: () => + import('#/views/mall/promotion/diy/page/decorate/index.vue'), + }, + ], + }, ]; export default routes; diff --git a/apps/web-antd/src/views/_core/authentication/forget-password.vue b/apps/web-antd/src/views/_core/authentication/forget-password.vue index 2ef4b0ff1b2f7db683a0b96c051b1d4d3c2dde1f..4837cf7dcf8b0166ff5f0d9d423b68b751aafaaa 100644 --- a/apps/web-antd/src/views/_core/authentication/forget-password.vue +++ b/apps/web-antd/src/views/_core/authentication/forget-password.vue @@ -197,7 +197,7 @@ async function handleSubmit(values: Recordable) { await smsResetPassword({ mobile, code, password }); message.success($t('authentication.resetPasswordSuccess')); // 重置成功后跳转到首页 - router.push('/'); + await router.push('/'); } catch (error) { console.error('重置密码失败:', error); } finally { diff --git a/apps/web-antd/src/views/_core/authentication/sso-login.vue b/apps/web-antd/src/views/_core/authentication/sso-login.vue index 1bc7ad9b1860489244a01cbb3f6376f164784c2a..aba72ac83f77bcafa54d81fff5278f6c6b55408b 100644 --- a/apps/web-antd/src/views/_core/authentication/sso-login.vue +++ b/apps/web-antd/src/views/_core/authentication/sso-login.vue @@ -11,7 +11,7 @@ import { authorize, getAuthorize } from '#/api/system/oauth2/open'; defineOptions({ name: 'SSOLogin' }); -const { query } = useRoute(); // 路由参数 +const { query } = useRoute(); const client = ref({ name: '', diff --git a/apps/web-antd/src/views/ai/chat/index/components/conversation/ConversationList.vue b/apps/web-antd/src/views/ai/chat/index/components/conversation/ConversationList.vue index 08348f79cb9316e9cb4dea6f8605cf7ff988069e..7339c9e5b8c1ca37e27b6e4d6d92f4021535eeb2 100644 --- a/apps/web-antd/src/views/ai/chat/index/components/conversation/ConversationList.vue +++ b/apps/web-antd/src/views/ai/chat/index/components/conversation/ConversationList.vue @@ -17,6 +17,7 @@ import { getChatConversationMyList, updateChatConversationMy, } from '#/api/ai/chat/conversation'; +import { $t } from '#/locales'; import RoleRepository from '../role/RoleRepository.vue'; @@ -201,7 +202,8 @@ async function updateConversationTitle( if ( filterConversationList.length > 0 && filterConversationList[0] && // tip:避免切换对话 - activeConversationId.value === filterConversationList[0].id + activeConversationId.value === + (filterConversationList[0].id as number) ) { emits('onConversationClick', filterConversationList[0]); } @@ -249,7 +251,7 @@ async function handleClearConversation() { try { await confirm('确认后对话会全部清空,置顶的对话除外。'); await deleteChatConversationMyByUnpinned(); - message.success('操作成功!'); + message.success($t('ui.actionMessage.operationSuccess')); // 清空 对话 和 对话内容 activeConversationId.value = null; // 获取 对话列表 @@ -305,7 +307,7 @@ onMounted(async () => {