diff --git a/apps/web-antd/package.json b/apps/web-antd/package.json index c2237dda6..dd8b2435c 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 5e4b6017d..da2e45a34 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 69e437341..192b9950f 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 80dcbec1a..2ffc842d8 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 d52dbfee5..266ca3474 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 deafcee82..364327cc1 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 6fac9d74b..03abc4e7b 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 4ca1fc7aa..a9863d27d 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 d8b5a9b3d..64cf36cb4 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 c7facf6ec..01f0fd2a5 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 0789071b2..99c1299e9 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 443b85c5e..cd2afbc84 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 32e0075b9..ecbc03855 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 1ab011925..63e1af886 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 c988b1286..502811665 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 3ad7b0990..2d66a422f 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 d332cc09e..afdface5a 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 9b7596e85..f7d82d352 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 3f8d1cb82..17b20e709 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 e36073820..47200ff2b 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 000000000..c982804c7 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 000000000..b85562e42 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 0f1ab09fb..be5a5eda7 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/bpmn-process-designer/package/index.ts b/apps/web-antd/src/components/bpmn-process-designer/package/index.ts deleted file mode 100644 index f5e6b117f..000000000 --- a/apps/web-antd/src/components/bpmn-process-designer/package/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -import './theme/index.scss'; -import 'bpmn-js/dist/assets/diagram-js.css'; -import 'bpmn-js/dist/assets/bpmn-font/css/bpmn.css'; -import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-codes.css'; -import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css'; -// TODO @puhui999:样式问题:设计器那,位置不太对; - -export { default as MyProcessDesigner } from './designer'; -// TODO @puhui999:流程发起时,预览相关的,需要使用; -export { default as MyProcessViewer } from './designer/index2'; -export { default as MyProcessPenal } from './penal'; - -// TODO @puhui999:【有个迁移的打印】【新增】流程打印,由 [@Lesan](https://gitee.com/LesanOuO) 贡献 [#816](https://gitee.com/yudaocode/yudao-ui-admin-vue3/pulls/816/)、[#1418](https://gitee.com/zhijiantianya/ruoyi-vue-pro/pulls/1418/)、[#817](https://gitee.com/yudaocode/yudao-ui-admin-vue3/pulls/817/)、[#1419](https://gitee.com/zhijiantianya/ruoyi-vue-pro/pulls/1419/)、[#1424](https://gitee.com/zhijiantianya/ruoyi-vue-pro/pulls/1424)、[#819](https://gitee.com/yudaocode/yudao-ui-admin-vue3/pulls/819)、[#821](https://gitee.com/yudaocode/yudao-ui-admin-vue3/pulls/821/) diff --git a/apps/web-antd/src/components/description/description.vue b/apps/web-antd/src/components/description/description.vue index c3f54695f..3d341596e 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 a0e997770..378f4a2ad 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; } -// 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 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; + }; +} + +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 7f99238bf..fd24920f0 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 { h, reactive } from 'vue'; import Description from './description.vue'; -/** 描述列表 api 定义 */ -class DescriptionApi { - private state = reactive>({}); +export function useDescription(options?: Partial) { + const propsState = reactive>(options || {}); - constructor(options: DescriptionsOptions) { - this.state = { ...options }; - } + const api: DescInstance = { + setDescProps: (descProps: Partial): void => { + Object.assign(propsState, descProps); + }, + }; - getState(): DescriptionsOptions { - return this.state as DescriptionsOptions; - } - - // TODO @xingyu:【setState】纠结下:1)vben2.0 是 data https://doc.vvbin.cn/components/desc.html#usage; - setState(newState: Partial) { - this.state = { ...this.state, ...newState }; - } -} - -export type ExtendedDescriptionApi = DescriptionApi; - -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 6d728715e..ead612517 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 0054cd41e..c486b6716 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 b89e6f780..35c1a39fc 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 88cda5978..df5bf1a77 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 4f0e9d1bf..a79f5b7cb 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 958b9d52b..d7b59b5b7 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 67f9f69d8..dc66c4927 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 21abaabe5..05e0e5664 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 54c0b27f8..3e7f87caf 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 e68bea65f..db8fcab5e 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 2ef4b0ff1..4837cf7dc 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 1bc7ad9b1..aba72ac83 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 08348f79c..7339c9e5b 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 () => {