diff --git a/apps/web-antd/src/locales/langs/en-US/page.json b/apps/web-antd/src/locales/langs/en-US/page.json index 409137ee3..40a19ac6b 100644 --- a/apps/web-antd/src/locales/langs/en-US/page.json +++ b/apps/web-antd/src/locales/langs/en-US/page.json @@ -4,7 +4,8 @@ "register": "Register", "codeLogin": "Code Login", "qrcodeLogin": "Qr Code Login", - "forgetPassword": "Forget Password" + "forgetPassword": "Forget Password", + "profile": "Profile" }, "dashboard": { "title": "Dashboard", diff --git a/apps/web-antd/src/locales/langs/zh-CN/page.json b/apps/web-antd/src/locales/langs/zh-CN/page.json index f56160a6a..5d1c246e1 100644 --- a/apps/web-antd/src/locales/langs/zh-CN/page.json +++ b/apps/web-antd/src/locales/langs/zh-CN/page.json @@ -4,7 +4,8 @@ "register": "注册", "codeLogin": "验证码登录", "qrcodeLogin": "二维码登录", - "forgetPassword": "忘记密码" + "forgetPassword": "忘记密码", + "profile": "个人中心" }, "dashboard": { "title": "概览", diff --git a/apps/web-antd/src/store/mall/kefu.ts b/apps/web-antd/src/store/mall/kefu.ts index 6fe0b6c25..c30087375 100644 --- a/apps/web-antd/src/store/mall/kefu.ts +++ b/apps/web-antd/src/store/mall/kefu.ts @@ -90,7 +90,7 @@ export const useMallKefuStore = defineStore('mall-kefu', { }, conversationSort() { // 按置顶属性和最后消息时间排序 - this.conversationList.sort((a, b) => { + this.conversationList.toSorted((a, b) => { // 按照置顶排序,置顶的会在前面 if (a.adminPinned !== b.adminPinned) { return a.adminPinned ? -1 : 1; diff --git a/apps/web-antd/src/views/_core/profile/base-setting.vue b/apps/web-antd/src/views/_core/profile/base-setting.vue new file mode 100644 index 000000000..0a10f1304 --- /dev/null +++ b/apps/web-antd/src/views/_core/profile/base-setting.vue @@ -0,0 +1,102 @@ + + diff --git a/apps/web-antd/src/views/_core/profile/notification-setting.vue b/apps/web-antd/src/views/_core/profile/notification-setting.vue new file mode 100644 index 000000000..324a4b393 --- /dev/null +++ b/apps/web-antd/src/views/_core/profile/notification-setting.vue @@ -0,0 +1,31 @@ + + diff --git a/apps/web-antd/src/views/_core/profile/password-setting.vue b/apps/web-antd/src/views/_core/profile/password-setting.vue new file mode 100644 index 000000000..b246bc37e --- /dev/null +++ b/apps/web-antd/src/views/_core/profile/password-setting.vue @@ -0,0 +1,66 @@ + + diff --git a/apps/web-antd/src/views/_core/profile/security-setting.vue b/apps/web-antd/src/views/_core/profile/security-setting.vue new file mode 100644 index 000000000..be30db58e --- /dev/null +++ b/apps/web-antd/src/views/_core/profile/security-setting.vue @@ -0,0 +1,43 @@ + + diff --git a/apps/web-antd/src/views/ai/chat/index/index.vue b/apps/web-antd/src/views/ai/chat/index/index.vue index 5f09fbc6c..f97ccb405 100644 --- a/apps/web-antd/src/views/ai/chat/index/index.vue +++ b/apps/web-antd/src/views/ai/chat/index/index.vue @@ -403,8 +403,8 @@ async function doSendMessageStream(userMessage: AiChatMessageApi.ChatMessage) { const lastMessage = activeMessageList.value[activeMessageList.value.length - 1]; // 累加推理内容 - lastMessage.reasoningContent = - (lastMessage.reasoningContent || '') + + lastMessage!.reasoningContent = + (lastMessage!.reasoningContent || '') + data.receive.reasoningContent; } @@ -554,7 +554,7 @@ onMounted(async () => {
{{ activeConversation?.title ? activeConversation?.title : '对话' }} diff --git a/apps/web-antd/src/views/ai/chat/index/modules/conversation/list.vue b/apps/web-antd/src/views/ai/chat/index/modules/conversation/list.vue index 5c1692eab..a672576d6 100644 --- a/apps/web-antd/src/views/ai/chat/index/modules/conversation/list.vue +++ b/apps/web-antd/src/views/ai/chat/index/modules/conversation/list.vue @@ -90,7 +90,7 @@ async function getChatConversationList() { // 1.1 获取 对话数据 conversationList.value = await getChatConversationMyList(); // 1.2 排序 - conversationList.value.sort((a, b) => { + conversationList.value.toSorted((a, b) => { return Number(b.createTime) - Number(a.createTime); }); // 1.3 没有任何对话情况 diff --git a/apps/web-antd/src/views/ai/chat/index/modules/message/file-upload.vue b/apps/web-antd/src/views/ai/chat/index/modules/message/file-upload.vue index d0de7fdc4..029e4c68d 100644 --- a/apps/web-antd/src/views/ai/chat/index/modules/message/file-upload.vue +++ b/apps/web-antd/src/views/ai/chat/index/modules/message/file-upload.vue @@ -138,14 +138,14 @@ async function uploadFile(fileItem: FileItem) { fileItem.progress = 100; // 调试日志 - console.log('上传响应:', response); + console.warn('上传响应:', response); // 兼容不同的返回格式:{ url: '...' } 或 { data: '...' } 或直接是字符串 const fileUrl = (response as any)?.url || (response as any)?.data || response; fileItem.url = fileUrl; - console.log('提取的文件 URL:', fileUrl); + console.warn('提取的文件 URL:', fileUrl); // 只有当 URL 有效时才添加到列表 if (fileUrl && typeof fileUrl === 'string') { diff --git a/apps/web-antd/src/views/ai/model/chatRole/modules/form.vue b/apps/web-antd/src/views/ai/model/chatRole/modules/form.vue index 8388f9740..e5abac2b7 100644 --- a/apps/web-antd/src/views/ai/model/chatRole/modules/form.vue +++ b/apps/web-antd/src/views/ai/model/chatRole/modules/form.vue @@ -13,7 +13,6 @@ import { getChatRole, updateChatRole, } from '#/api/ai/model/chatRole'; -import {} from '#/api/bpm/model'; import { $t } from '#/locales'; import { useFormSchema } from '../data'; diff --git a/apps/web-antd/src/views/ai/model/model/modules/form.vue b/apps/web-antd/src/views/ai/model/model/modules/form.vue index 1f5f9a8f1..3a47c5910 100644 --- a/apps/web-antd/src/views/ai/model/model/modules/form.vue +++ b/apps/web-antd/src/views/ai/model/model/modules/form.vue @@ -9,7 +9,6 @@ import { message } from 'ant-design-vue'; import { useVbenForm } from '#/adapter/form'; import { createModel, getModel, updateModel } from '#/api/ai/model/model'; -import {} from '#/api/bpm/model'; import { $t } from '#/locales'; import { useFormSchema } from '../data'; diff --git a/apps/web-antd/src/views/ai/music/index/list/index.vue b/apps/web-antd/src/views/ai/music/index/list/index.vue index 1975973db..3076d35b3 100644 --- a/apps/web-antd/src/views/ai/music/index/list/index.vue +++ b/apps/web-antd/src/views/ai/music/index/list/index.vue @@ -17,7 +17,7 @@ const currentSong = ref({}); // 当前音乐 const mySongList = ref[]>([]); const squareSongList = ref[]>([]); -function generateMusic(formData: Recordable) { +function generateMusic(_formData: Recordable) { loading.value = true; setTimeout(() => { mySongList.value = Array.from({ length: 20 }, (_, index) => { diff --git a/apps/web-antd/src/views/ai/write/index/modules/tag.vue b/apps/web-antd/src/views/ai/write/index/modules/tag.vue index f199a8dd1..f68df2641 100644 --- a/apps/web-antd/src/views/ai/write/index/modules/tag.vue +++ b/apps/web-antd/src/views/ai/write/index/modules/tag.vue @@ -21,7 +21,7 @@ const emits = defineEmits<{ { bpmnInstances().moddle.create('bpmn:ExtensionElements', { values: [] }); // 是否开启自定义用户任务超时处理 - boundaryEventType.value = elExtensionElements.value.values?.filter( + boundaryEventType.value = elExtensionElements.value.values?.find( (ex: any) => ex.$type === `${prefix}:BoundaryEventType`, - )?.[0]; + ); if (boundaryEventType.value && boundaryEventType.value.value === 1) { timeoutHandlerEnable.value = true; configExtensions.value.push(boundaryEventType.value); } // 执行动作 - timeoutHandlerType.value = elExtensionElements.value.values?.filter( + timeoutHandlerType.value = elExtensionElements.value.values?.find( (ex: any) => ex.$type === `${prefix}:TimeoutHandlerType`, )?.[0]; if (timeoutHandlerType.value) { diff --git a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/custom-config/components/UserTaskCustomConfig.vue b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/custom-config/components/UserTaskCustomConfig.vue index 2271d6f91..d7730e291 100644 --- a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/custom-config/components/UserTaskCustomConfig.vue +++ b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/custom-config/components/UserTaskCustomConfig.vue @@ -112,7 +112,7 @@ const resetCustomConfigList = () => { // 审批类型 approveType.value = - elExtensionElements.value.values?.filter( + elExtensionElements.value.values?.find( (ex: any) => ex.$type === `${prefix}:ApproveType`, )?.[0] || bpmnInstances().moddle.create(`${prefix}:ApproveType`, { @@ -121,7 +121,7 @@ const resetCustomConfigList = () => { // 审批人与提交人为同一人时 assignStartUserHandlerTypeEl.value = - elExtensionElements.value.values?.filter( + elExtensionElements.value.values?.find( (ex: any) => ex.$type === `${prefix}:AssignStartUserHandlerType`, )?.[0] || bpmnInstances().moddle.create(`${prefix}:AssignStartUserHandlerType`, { @@ -131,13 +131,13 @@ const resetCustomConfigList = () => { // 审批人拒绝时 rejectHandlerTypeEl.value = - elExtensionElements.value.values?.filter( + elExtensionElements.value.values?.find( (ex: any) => ex.$type === `${prefix}:RejectHandlerType`, )?.[0] || bpmnInstances().moddle.create(`${prefix}:RejectHandlerType`, { value: 1 }); rejectHandlerType.value = rejectHandlerTypeEl.value.value; returnNodeIdEl.value = - elExtensionElements.value.values?.filter( + elExtensionElements.value.values?.find( (ex: any) => ex.$type === `${prefix}:RejectReturnTaskId`, )?.[0] || bpmnInstances().moddle.create(`${prefix}:RejectReturnTaskId`, { @@ -147,7 +147,7 @@ const resetCustomConfigList = () => { // 审批人为空时 assignEmptyHandlerTypeEl.value = - elExtensionElements.value.values?.filter( + elExtensionElements.value.values?.find( (ex: any) => ex.$type === `${prefix}:AssignEmptyHandlerType`, )?.[0] || bpmnInstances().moddle.create(`${prefix}:AssignEmptyHandlerType`, { @@ -155,7 +155,7 @@ const resetCustomConfigList = () => { }); assignEmptyHandlerType.value = assignEmptyHandlerTypeEl.value.value; assignEmptyUserIdsEl.value = - elExtensionElements.value.values?.filter( + elExtensionElements.value.values?.find( (ex: any) => ex.$type === `${prefix}:AssignEmptyUserIds`, )?.[0] || bpmnInstances().moddle.create(`${prefix}:AssignEmptyUserIds`, { @@ -172,7 +172,7 @@ const resetCustomConfigList = () => { }); // 操作按钮 - buttonsSettingEl.value = elExtensionElements.value.values?.filter( + buttonsSettingEl.value = elExtensionElements.value.values?.find( (ex: any) => ex.$type === `${prefix}:ButtonsSetting`, ); if (buttonsSettingEl.value.length === 0) { @@ -189,7 +189,7 @@ const resetCustomConfigList = () => { // 字段权限 if (formType.value === BpmModelFormType.NORMAL) { - const fieldsPermissionList = elExtensionElements.value.values?.filter( + const fieldsPermissionList = elExtensionElements.value.values?.find( (ex: any) => ex.$type === `${prefix}:FieldsPermission`, ); fieldsPermissionEl.value = []; @@ -206,21 +206,21 @@ const resetCustomConfigList = () => { // 是否需要签名 signEnable.value = - elExtensionElements.value.values?.filter( + elExtensionElements.value.values?.find( (ex: any) => ex.$type === `${prefix}:SignEnable`, - )?.[0] || + ) || bpmnInstances().moddle.create(`${prefix}:SignEnable`, { value: false }); // 审批意见 reasonRequire.value = - elExtensionElements.value.values?.filter( + elExtensionElements.value.values?.find( (ex: any) => ex.$type === `${prefix}:ReasonRequire`, - )?.[0] || + ) || bpmnInstances().moddle.create(`${prefix}:ReasonRequire`, { value: false }); // 保留剩余扩展元素,便于后面更新该元素对应属性 otherExtensions.value = - elExtensionElements.value.values?.filter( + elExtensionElements.value.values?.find( (ex: any) => ex.$type !== `${prefix}:AssignStartUserHandlerType` && ex.$type !== `${prefix}:RejectHandlerType` && diff --git a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/task/task-components/UserTask.vue b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/task/task-components/UserTask.vue index 6eb41df3c..c13a8bf72 100644 --- a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/task/task-components/UserTask.vue +++ b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/task/task-components/UserTask.vue @@ -118,10 +118,10 @@ const resetTaskForm = () => { const extensionElements = businessObject?.extensionElements ?? bpmnInstances().moddle.create('bpmn:ExtensionElements', { values: [] }); - userTaskForm.value.candidateStrategy = extensionElements.values?.filter( + userTaskForm.value.candidateStrategy = extensionElements.values?.find( (ex: any) => ex.$type === `${prefix}:CandidateStrategy`, )?.[0]?.value; - const candidateParamStr = extensionElements.values?.filter( + const candidateParamStr = extensionElements.values?.find( (ex: any) => ex.$type === `${prefix}:CandidateParam`, )?.[0]?.value; if (candidateParamStr && candidateParamStr.length > 0) { diff --git a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/time-event-config/CycleConfig.vue b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/time-event-config/CycleConfig.vue index c5add5e9c..493681f1f 100644 --- a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/time-event-config/CycleConfig.vue +++ b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/time-event-config/CycleConfig.vue @@ -112,7 +112,7 @@ function setDuration(type, val) { // 组装ISO 8601字符串 let d = isoDuration.value; if (d.includes(type)) { - d = d.replace(new RegExp(`\\d+${type}`), val + type); + d = d.replace(new RegExp(String.raw`\d+${type}`), val + type); } else { d += val + type; } diff --git a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/utils.ts b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/utils.ts index 5a904331d..f1c082f1a 100644 --- a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/utils.ts +++ b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/utils.ts @@ -82,10 +82,12 @@ export function updateElementExtensions(element, extensionList) { } // 创建一个id -export function uuid(length = 8, chars?) { +export function uuid( + length = 8, + charsString = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', +) { let result = ''; - const charsString = - chars || '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + for (let i = length; i > 0; --i) { result += charsString[Math.floor(Math.random() * charsString.length)]; } diff --git a/apps/web-antd/src/views/crm/statistics/rank/chartOptions.ts b/apps/web-antd/src/views/crm/statistics/rank/chartOptions.ts index 7234687c5..a6c36e958 100644 --- a/apps/web-antd/src/views/crm/statistics/rank/chartOptions.ts +++ b/apps/web-antd/src/views/crm/statistics/rank/chartOptions.ts @@ -6,7 +6,7 @@ export function getChartOptions(activeTabName: any, res: any): any { return { dataset: { dimensions: ['nickname', 'count'], - source: cloneDeep(res).reverse(), + source: cloneDeep(res).toReversed(), }, grid: { left: 20, @@ -54,7 +54,7 @@ export function getChartOptions(activeTabName: any, res: any): any { return { dataset: { dimensions: ['nickname', 'count'], - source: cloneDeep(res).reverse(), + source: cloneDeep(res).toReversed(), }, grid: { left: 20, @@ -102,7 +102,7 @@ export function getChartOptions(activeTabName: any, res: any): any { return { dataset: { dimensions: ['nickname', 'count'], - source: cloneDeep(res).reverse(), + source: cloneDeep(res).toReversed(), }, grid: { left: 20, @@ -150,7 +150,7 @@ export function getChartOptions(activeTabName: any, res: any): any { return { dataset: { dimensions: ['nickname', 'count'], - source: cloneDeep(res).reverse(), + source: cloneDeep(res).toReversed(), }, grid: { left: 20, @@ -198,7 +198,7 @@ export function getChartOptions(activeTabName: any, res: any): any { return { dataset: { dimensions: ['nickname', 'count'], - source: cloneDeep(res).reverse(), + source: cloneDeep(res).toReversed(), }, grid: { left: 20, @@ -246,7 +246,7 @@ export function getChartOptions(activeTabName: any, res: any): any { return { dataset: { dimensions: ['nickname', 'count'], - source: cloneDeep(res).reverse(), + source: cloneDeep(res).toReversed(), }, grid: { left: 20, @@ -294,7 +294,7 @@ export function getChartOptions(activeTabName: any, res: any): any { return { dataset: { dimensions: ['nickname', 'count'], - source: cloneDeep(res).reverse(), + source: cloneDeep(res).toReversed(), }, grid: { left: 20, @@ -342,7 +342,7 @@ export function getChartOptions(activeTabName: any, res: any): any { return { dataset: { dimensions: ['nickname', 'count'], - source: cloneDeep(res).reverse(), + source: cloneDeep(res).toReversed(), }, grid: { left: 20, diff --git a/apps/web-antd/src/views/dashboard/analytics/analytics-visits-sales.vue b/apps/web-antd/src/views/dashboard/analytics/analytics-visits-sales.vue index 02f509123..6ff52086f 100644 --- a/apps/web-antd/src/views/dashboard/analytics/analytics-visits-sales.vue +++ b/apps/web-antd/src/views/dashboard/analytics/analytics-visits-sales.vue @@ -24,7 +24,7 @@ onMounted(() => { { name: '定制', value: 310 }, { name: '技术支持', value: 274 }, { name: '远程', value: 400 }, - ].sort((a, b) => { + ].toSorted((a, b) => { return a.value - b.value; }), name: '商业占比', diff --git a/apps/web-antd/src/views/erp/finance/receipt/modules/item-form.vue b/apps/web-antd/src/views/erp/finance/receipt/modules/item-form.vue index 93cd3f4d8..ddb029312 100644 --- a/apps/web-antd/src/views/erp/finance/receipt/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/finance/receipt/modules/item-form.vue @@ -128,6 +128,7 @@ function handleOpenSaleOut() { function handleAddSaleOut(rows: ErpSaleOutApi.SaleOut[]) { rows.forEach((row) => { + // TODO 芋艿 const newItem: ErpFinanceReceiptApi.FinanceReceiptItem = { bizId: row.id, bizType: ErpBizType.SALE_OUT, @@ -153,6 +154,7 @@ function handleOpenSaleReturn() { } function handleAddSaleReturn(rows: ErpSaleReturnApi.SaleReturn[]) { + // TODO 芋艿 rows.forEach((row) => { const newItem: ErpFinanceReceiptApi.FinanceReceiptItem = { bizId: row.id, diff --git a/apps/web-antd/src/views/erp/purchase/in/modules/item-form.vue b/apps/web-antd/src/views/erp/purchase/in/modules/item-form.vue index 282466669..62584dc13 100644 --- a/apps/web-antd/src/views/erp/purchase/in/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/purchase/in/modules/item-form.vue @@ -151,6 +151,7 @@ async function handleWarehouseChange(row: ErpPurchaseInApi.PurchaseInItem) { /** 处理行数据变更 */ function handleRowChange(row: any) { + // TODO 芋艿 const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index === -1) { tableData.value.push(row); diff --git a/apps/web-antd/src/views/erp/purchase/order/modules/item-form.vue b/apps/web-antd/src/views/erp/purchase/order/modules/item-form.vue index a1d768ab8..e40c3d208 100644 --- a/apps/web-antd/src/views/erp/purchase/order/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/purchase/order/modules/item-form.vue @@ -142,6 +142,7 @@ function handleAdd() { /** 处理删除 */ function handleDelete(row: ErpPurchaseOrderApi.PurchaseOrderItem) { + // TODO 芋艿 const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); diff --git a/apps/web-antd/src/views/erp/purchase/return/modules/item-form.vue b/apps/web-antd/src/views/erp/purchase/return/modules/item-form.vue index d15302237..569f7e276 100644 --- a/apps/web-antd/src/views/erp/purchase/return/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/purchase/return/modules/item-form.vue @@ -131,6 +131,7 @@ watch( /** 处理删除 */ function handleDelete(row: ErpPurchaseReturnApi.PurchaseReturnItem) { + // TODO 芋艿 const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); @@ -153,6 +154,7 @@ async function handleWarehouseChange( /** 处理行数据变更 */ function handleRowChange(row: any) { + // TODO 芋艿 const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index === -1) { tableData.value.push(row); diff --git a/apps/web-antd/src/views/erp/sale/order/modules/item-form.vue b/apps/web-antd/src/views/erp/sale/order/modules/item-form.vue index faefd5db8..c1c40b3d7 100644 --- a/apps/web-antd/src/views/erp/sale/order/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/sale/order/modules/item-form.vue @@ -142,6 +142,7 @@ function handleAdd() { /** 处理删除 */ function handleDelete(row: ErpSaleOrderApi.SaleOrderItem) { + // TODO 芋艿 const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); diff --git a/apps/web-antd/src/views/erp/sale/out/modules/item-form.vue b/apps/web-antd/src/views/erp/sale/out/modules/item-form.vue index ba432144a..ff12b58ce 100644 --- a/apps/web-antd/src/views/erp/sale/out/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/sale/out/modules/item-form.vue @@ -131,6 +131,7 @@ watch( /** 处理删除 */ function handleDelete(row: ErpSaleOutApi.SaleOutItem) { + // TODO 芋艿 const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); diff --git a/apps/web-antd/src/views/erp/sale/return/modules/item-form.vue b/apps/web-antd/src/views/erp/sale/return/modules/item-form.vue index ccc0fa9ef..3e355af72 100644 --- a/apps/web-antd/src/views/erp/sale/return/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/sale/return/modules/item-form.vue @@ -131,6 +131,7 @@ watch( /** 处理删除 */ function handleDelete(row: ErpSaleReturnApi.SaleReturnItem) { + // TODO 芋艿 const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); diff --git a/apps/web-antd/src/views/erp/stock/check/modules/item-form.vue b/apps/web-antd/src/views/erp/stock/check/modules/item-form.vue index 46564c7f1..f4865982a 100644 --- a/apps/web-antd/src/views/erp/stock/check/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/stock/check/modules/item-form.vue @@ -106,6 +106,7 @@ function handleAdd() { /** 处理删除 */ function handleDelete(row: ErpStockCheckApi.StockCheckItem) { + // TODO 芋艿 const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); diff --git a/apps/web-antd/src/views/erp/stock/in/modules/item-form.vue b/apps/web-antd/src/views/erp/stock/in/modules/item-form.vue index 4470b8600..2d9f82dec 100644 --- a/apps/web-antd/src/views/erp/stock/in/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/stock/in/modules/item-form.vue @@ -98,6 +98,7 @@ function handleAdd() { totalPrice: undefined, remark: undefined, }; + // TODO 芋艿 tableData.value.push(newRow); // 通知父组件更新 emit('update:items', [...tableData.value]); @@ -105,6 +106,7 @@ function handleAdd() { /** 处理删除 */ function handleDelete(row: ErpStockInApi.StockInItem) { + // TODO 芋艿 const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); diff --git a/apps/web-antd/src/views/erp/stock/move/modules/item-form.vue b/apps/web-antd/src/views/erp/stock/move/modules/item-form.vue index d8e0e5c0a..11f55db3d 100644 --- a/apps/web-antd/src/views/erp/stock/move/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/stock/move/modules/item-form.vue @@ -106,6 +106,7 @@ function handleAdd() { /** 处理删除 */ function handleDelete(row: ErpStockMoveApi.StockMoveItem) { + // TODO 芋艿 const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); diff --git a/apps/web-antd/src/views/erp/stock/out/modules/item-form.vue b/apps/web-antd/src/views/erp/stock/out/modules/item-form.vue index 16ac8154a..0f81a03bc 100644 --- a/apps/web-antd/src/views/erp/stock/out/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/stock/out/modules/item-form.vue @@ -105,6 +105,7 @@ function handleAdd() { /** 处理删除 */ function handleDelete(row: ErpStockOutApi.StockOutItem) { + // TODO 芋艿 const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); diff --git a/apps/web-antd/src/views/infra/webSocket/index.vue b/apps/web-antd/src/views/infra/webSocket/index.vue index 371967586..bcb7ccc27 100644 --- a/apps/web-antd/src/views/infra/webSocket/index.vue +++ b/apps/web-antd/src/views/infra/webSocket/index.vue @@ -47,7 +47,7 @@ const { status, data, send, close, open } = useWebSocket(server.value, { const messageList = ref( [] as { text: string; time: number; type?: string; userId?: string }[], ); // 消息列表 -const messageReverseList = computed(() => [...messageList.value].reverse()); +const messageReverseList = computed(() => [...messageList.value].toReversed()); watchEffect(() => { if (!data.value) { return; diff --git a/apps/web-antd/src/views/iot/device/device/modules/detail/device-details-thing-model-property-history.vue b/apps/web-antd/src/views/iot/device/device/modules/detail/device-details-thing-model-property-history.vue index 998486742..1b1be35db 100644 --- a/apps/web-antd/src/views/iot/device/device/modules/detail/device-details-thing-model-property-history.vue +++ b/apps/web-antd/src/views/iot/device/device/modules/detail/device-details-thing-model-property-history.vue @@ -553,17 +553,17 @@ defineExpose({ open }); // 提供 open 方法,用于打开弹窗 .toolbar-wrapper { padding: 16px; - background-color: hsl(var(--card) / 0.9); + background-color: hsl(var(--card) / 90%); + border: 1px solid hsl(var(--border) / 60%); border-radius: 8px; - border: 1px solid hsl(var(--border) / 0.6); } .chart-container, .table-container { padding: 16px; background-color: hsl(var(--card)); + border: 1px solid hsl(var(--border) / 60%); border-radius: 8px; - border: 1px solid hsl(var(--border) / 0.6); } } diff --git a/apps/web-antd/src/views/iot/device/device/modules/detail/device-details-thing-model-property.vue b/apps/web-antd/src/views/iot/device/device/modules/detail/device-details-thing-model-property.vue index d15e649c7..46445479d 100644 --- a/apps/web-antd/src/views/iot/device/device/modules/detail/device-details-thing-model-property.vue +++ b/apps/web-antd/src/views/iot/device/device/modules/detail/device-details-thing-model-property.vue @@ -22,8 +22,7 @@ import { import { getLatestDeviceProperties } from '#/api/iot/device/device'; -import DeviceDetailsThingModelPropertyHistory - from './device-details-thing-model-property-history.vue'; +import DeviceDetailsThingModelPropertyHistory from './device-details-thing-model-property-history.vue'; const props = defineProps<{ deviceId: number }>(); diff --git a/apps/web-antd/src/views/iot/device/device/modules/device-card-view.vue b/apps/web-antd/src/views/iot/device/device/modules/device-card-view.vue index f80cff92a..19f5412e5 100644 --- a/apps/web-antd/src/views/iot/device/device/modules/device-card-view.vue +++ b/apps/web-antd/src/views/iot/device/device/modules/device-card-view.vue @@ -176,7 +176,7 @@ function getDeviceTypeColor(deviceType: number) { } // 获取设备状态信息 -function getStatusInfo(state: number | string | null | undefined) { +function getStatusInfo(state: null | number | string | undefined) { const parsedState = Number(state); const hasNumericState = Number.isFinite(parsedState); const fallback = hasNumericState @@ -396,21 +396,21 @@ defineExpose({ .device-card { height: 100%; overflow: hidden; - background: hsl(var(--card) / 0.95); - border: 1px solid hsl(var(--border) / 0.6); + background: hsl(var(--card) / 95%); + border: 1px solid hsl(var(--border) / 60%); border-radius: 8px; box-shadow: - 0 1px 2px 0 hsl(var(--foreground) / 0.04), - 0 1px 6px -1px hsl(var(--foreground) / 0.05), - 0 2px 4px 0 hsl(var(--foreground) / 0.05); + 0 1px 2px 0 hsl(var(--foreground) / 4%), + 0 1px 6px -1px hsl(var(--foreground) / 5%), + 0 2px 4px 0 hsl(var(--foreground) / 5%); transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); &:hover { border-color: hsl(var(--border)); box-shadow: - 0 1px 2px -2px hsl(var(--foreground) / 0.12), - 0 3px 6px 0 hsl(var(--foreground) / 0.1), - 0 5px 12px 4px hsl(var(--foreground) / 0.08); + 0 1px 2px -2px hsl(var(--foreground) / 12%), + 0 3px 6px 0 hsl(var(--foreground) / 10%), + 0 5px 12px 4px hsl(var(--foreground) / 8%); transform: translateY(-4px); } @@ -473,7 +473,7 @@ defineExpose({ font-size: 16px; font-weight: 600; line-height: 24px; - color: hsl(var(--foreground) / 0.9); + color: hsl(var(--foreground) / 90%); white-space: nowrap; } @@ -496,7 +496,7 @@ defineExpose({ .label { flex-shrink: 0; font-size: 13px; - color: hsl(var(--foreground) / 0.6); + color: hsl(var(--foreground) / 60%); } .value { @@ -505,7 +505,7 @@ defineExpose({ overflow: hidden; text-overflow: ellipsis; font-size: 13px; - color: hsl(var(--foreground) / 0.85); + color: hsl(var(--foreground) / 85%); text-align: right; white-space: nowrap; @@ -515,7 +515,7 @@ defineExpose({ transition: color 0.2s; &:hover { - color: hsl(var(--primary) / 0.85); + color: hsl(var(--primary) / 85%); } } @@ -524,7 +524,7 @@ defineExpose({ 'SF Mono', Monaco, Inconsolata, 'Fira Code', Consolas, monospace; font-size: 12px; font-weight: 500; - color: hsl(var(--foreground) / 0.6); + color: hsl(var(--foreground) / 60%); } } } @@ -537,7 +537,7 @@ defineExpose({ display: flex; gap: 8px; padding-top: 12px; - border-top: 1px solid hsl(var(--border) / 0.4); + border-top: 1px solid hsl(var(--border) / 40%); .action-btn { display: flex; @@ -561,8 +561,8 @@ defineExpose({ &.btn-edit { color: hsl(var(--primary)); - background: hsl(var(--primary) / 0.12); - border-color: hsl(var(--primary) / 0.25); + background: hsl(var(--primary) / 12%); + border-color: hsl(var(--primary) / 25%); &:hover { color: hsl(var(--primary-foreground)); @@ -573,8 +573,8 @@ defineExpose({ &.btn-view { color: hsl(var(--warning)); - background: hsl(var(--warning) / 0.12); - border-color: hsl(var(--warning) / 0.25); + background: hsl(var(--warning) / 12%); + border-color: hsl(var(--warning) / 25%); &:hover { color: #fff; @@ -590,11 +590,7 @@ defineExpose({ hsl(var(--accent)) 40%, hsl(var(--card)) 60% ); - border-color: color-mix( - in srgb, - hsl(var(--accent)) 55%, - transparent - ); + border-color: color-mix(in srgb, hsl(var(--accent)) 55%, transparent); &:hover { color: hsl(var(--accent-foreground)); @@ -607,8 +603,8 @@ defineExpose({ flex: 0 0 32px; padding: 4px; color: hsl(var(--destructive)); - background: hsl(var(--destructive) / 0.12); - border-color: hsl(var(--destructive) / 0.3); + background: hsl(var(--destructive) / 12%); + border-color: hsl(var(--destructive) / 30%); &:hover { color: hsl(var(--destructive-foreground)); diff --git a/apps/web-antd/src/views/iot/home/index.vue b/apps/web-antd/src/views/iot/home/index.vue index e2d7723f6..763c03e0c 100644 --- a/apps/web-antd/src/views/iot/home/index.vue +++ b/apps/web-antd/src/views/iot/home/index.vue @@ -1,12 +1,16 @@ + + diff --git a/apps/web-antd/src/views/mp/menu/index.vue b/apps/web-antd/src/views/mp/menu/index.vue index 615c631a6..5669ae4b4 100644 --- a/apps/web-antd/src/views/mp/menu/index.vue +++ b/apps/web-antd/src/views/mp/menu/index.vue @@ -134,20 +134,20 @@ function menuListToFrontend(list: any[]) { list.forEach((item: RawMenu) => { const menu: any = { ...item, - }; - menu.reply = { - type: item.replyMessageType, - accountId: item.accountId, - content: item.replyContent, - mediaId: item.replyMediaId, - url: item.replyMediaUrl, - title: item.replyTitle, - description: item.replyDescription, - thumbMediaId: item.replyThumbMediaId, - thumbMediaUrl: item.replyThumbMediaUrl, - articles: item.replyArticles, - musicUrl: item.replyMusicUrl, - hqMusicUrl: item.replyHqMusicUrl, + reply: { + type: item.replyMessageType, + accountId: item.accountId, + content: item.replyContent, + mediaId: item.replyMediaId, + url: item.replyMediaUrl, + title: item.replyTitle, + description: item.replyDescription, + thumbMediaId: item.replyThumbMediaId, + thumbMediaUrl: item.replyThumbMediaUrl, + articles: item.replyArticles, + musicUrl: item.replyMusicUrl, + hqMusicUrl: item.replyHqMusicUrl, + }, }; result.push(menu as RawMenu); }); @@ -275,23 +275,22 @@ function menuListToBackend() { /** 将前端的 menu,转换成后端接收的 menu */ // TODO: @芋艿,需要根据后台 API 删除不需要的字段 function menuToBackend(menu: any) { - const result = { + return { ...menu, children: undefined, // 不处理子节点 reply: undefined, // 稍后复制 + replyMessageType: menu.reply.type, + replyContent: menu.reply.content, + replyMediaId: menu.reply.mediaId, + replyMediaUrl: menu.reply.url, + replyTitle: menu.reply.title, + replyDescription: menu.reply.description, + replyThumbMediaId: menu.reply.thumbMediaId, + replyThumbMediaUrl: menu.reply.thumbMediaUrl, + replyArticles: menu.reply.articles, + replyMusicUrl: menu.reply.musicUrl, + replyHqMusicUrl: menu.reply.hqMusicUrl, }; - result.replyMessageType = menu.reply.type; - result.replyContent = menu.reply.content; - result.replyMediaId = menu.reply.mediaId; - result.replyMediaUrl = menu.reply.url; - result.replyTitle = menu.reply.title; - result.replyDescription = menu.reply.description; - result.replyThumbMediaId = menu.reply.thumbMediaId; - result.replyThumbMediaUrl = menu.reply.thumbMediaUrl; - result.replyArticles = menu.reply.articles; - result.replyMusicUrl = menu.reply.musicUrl; - result.replyHqMusicUrl = menu.reply.hqMusicUrl; - return result; } diff --git a/apps/web-antd/src/views/pay/app/data.ts b/apps/web-antd/src/views/pay/app/data.ts index 2de2057f2..d46607ca3 100644 --- a/apps/web-antd/src/views/pay/app/data.ts +++ b/apps/web-antd/src/views/pay/app/data.ts @@ -258,9 +258,7 @@ export function useAppFormSchema(): VbenFormSchema[] { /** 渠道新增/修改的表单 */ export function useChannelFormSchema(formType: string = ''): VbenFormSchema[] { - const schema: VbenFormSchema[] = []; - // 添加通用字段 - schema.push( + const schema: VbenFormSchema[] = [ { component: 'Input', fieldName: 'id', @@ -309,7 +307,8 @@ export function useChannelFormSchema(formType: string = ''): VbenFormSchema[] { optionType: 'button', }, }, - ); + ]; + // 添加通用字段 // 根据类型添加特定字段 if (formType.includes('alipay_')) { schema.push( diff --git a/apps/web-ele/src/locales/langs/en-US/page.json b/apps/web-ele/src/locales/langs/en-US/page.json index 00a8c90b2..130cb88ac 100644 --- a/apps/web-ele/src/locales/langs/en-US/page.json +++ b/apps/web-ele/src/locales/langs/en-US/page.json @@ -4,7 +4,8 @@ "register": "Register", "codeLogin": "Code Login", "qrcodeLogin": "Qr Code Login", - "forgetPassword": "Forget Password" + "forgetPassword": "Forget Password", + "profile": "Profile" }, "dashboard": { "title": "Dashboard", diff --git a/apps/web-ele/src/locales/langs/zh-CN/page.json b/apps/web-ele/src/locales/langs/zh-CN/page.json index 30180ddf8..8a30c0c7e 100644 --- a/apps/web-ele/src/locales/langs/zh-CN/page.json +++ b/apps/web-ele/src/locales/langs/zh-CN/page.json @@ -4,7 +4,8 @@ "register": "注册", "codeLogin": "验证码登录", "qrcodeLogin": "二维码登录", - "forgetPassword": "忘记密码" + "forgetPassword": "忘记密码", + "profile": "个人中心" }, "dashboard": { "title": "概览", diff --git a/apps/web-ele/src/router/routes/modules/crm.ts b/apps/web-ele/src/router/routes/modules/crm.ts index 599a3b409..f9e05b35e 100644 --- a/apps/web-ele/src/router/routes/modules/crm.ts +++ b/apps/web-ele/src/router/routes/modules/crm.ts @@ -90,8 +90,7 @@ const routes: RouteRecordRaw[] = [ title: '客户统计', activePath: '/crm/statistics/customer', }, - component: () => - import('#/views/crm/statistics/customer/index.vue'), + component: () => import('#/views/crm/statistics/customer/index.vue'), }, { path: 'statistics/funnel', @@ -109,8 +108,7 @@ const routes: RouteRecordRaw[] = [ title: '员工业绩', activePath: '/crm/statistics/performance', }, - component: () => - import('#/views/crm/statistics/performance/index.vue'), + component: () => import('#/views/crm/statistics/performance/index.vue'), }, { path: 'statistics/portrait', @@ -119,8 +117,7 @@ const routes: RouteRecordRaw[] = [ title: '客户画像', activePath: '/crm/statistics/portrait', }, - component: () => - import('#/views/crm/statistics/portrait/index.vue'), + component: () => import('#/views/crm/statistics/portrait/index.vue'), }, { path: 'statistics/rank', diff --git a/apps/web-ele/src/store/mall/kefu.ts b/apps/web-ele/src/store/mall/kefu.ts index 85f4023e7..b9197d3e6 100644 --- a/apps/web-ele/src/store/mall/kefu.ts +++ b/apps/web-ele/src/store/mall/kefu.ts @@ -80,7 +80,7 @@ export const useMallKefuStore = defineStore('mall-kefu', { }, conversationSort() { // 按置顶属性和最后消息时间排序 - this.conversationList.sort((a, b) => { + this.conversationList.toSorted((a, b) => { // 按照置顶排序,置顶的会在前面 if (a.adminPinned !== b.adminPinned) { return a.adminPinned ? -1 : 1; diff --git a/apps/web-ele/src/views/_core/profile/base-setting.vue b/apps/web-ele/src/views/_core/profile/base-setting.vue new file mode 100644 index 000000000..aa8a4c260 --- /dev/null +++ b/apps/web-ele/src/views/_core/profile/base-setting.vue @@ -0,0 +1,65 @@ + + diff --git a/apps/web-ele/src/views/_core/profile/notification-setting.vue b/apps/web-ele/src/views/_core/profile/notification-setting.vue new file mode 100644 index 000000000..324a4b393 --- /dev/null +++ b/apps/web-ele/src/views/_core/profile/notification-setting.vue @@ -0,0 +1,31 @@ + + diff --git a/apps/web-ele/src/views/_core/profile/password-setting.vue b/apps/web-ele/src/views/_core/profile/password-setting.vue new file mode 100644 index 000000000..4d80d74c6 --- /dev/null +++ b/apps/web-ele/src/views/_core/profile/password-setting.vue @@ -0,0 +1,66 @@ + + diff --git a/apps/web-ele/src/views/_core/profile/security-setting.vue b/apps/web-ele/src/views/_core/profile/security-setting.vue new file mode 100644 index 000000000..be30db58e --- /dev/null +++ b/apps/web-ele/src/views/_core/profile/security-setting.vue @@ -0,0 +1,43 @@ + + diff --git a/apps/web-ele/src/views/ai/chat/index/index.vue b/apps/web-ele/src/views/ai/chat/index/index.vue index 745d68eac..98b3b73d8 100644 --- a/apps/web-ele/src/views/ai/chat/index/index.vue +++ b/apps/web-ele/src/views/ai/chat/index/index.vue @@ -411,8 +411,8 @@ async function doSendMessageStream(userMessage: AiChatMessageApi.ChatMessage) { const lastMessage = activeMessageList.value[activeMessageList.value.length - 1]; // 累加推理内容 - lastMessage.reasoningContent = - (lastMessage.reasoningContent || '') + + lastMessage!.reasoningContent = + (lastMessage!.reasoningContent || '') + data.receive.reasoningContent; } @@ -565,7 +565,7 @@ onMounted(async () => {
{{ activeConversation?.title ? activeConversation?.title : '对话' }} diff --git a/apps/web-ele/src/views/ai/chat/index/modules/conversation/list.vue b/apps/web-ele/src/views/ai/chat/index/modules/conversation/list.vue index 17340f446..1b864dd66 100644 --- a/apps/web-ele/src/views/ai/chat/index/modules/conversation/list.vue +++ b/apps/web-ele/src/views/ai/chat/index/modules/conversation/list.vue @@ -97,7 +97,7 @@ async function getChatConversationList() { // 1.1 获取 对话数据 conversationList.value = await getChatConversationMyList(); // 1.2 排序 - conversationList.value.sort((a, b) => { + conversationList.value.toSorted((a, b) => { return Number(b.createTime) - Number(a.createTime); }); // 1.3 没有任何对话情况 diff --git a/apps/web-ele/src/views/ai/chat/index/modules/message/file-upload.vue b/apps/web-ele/src/views/ai/chat/index/modules/message/file-upload.vue index 6d6b69179..a4c52db77 100644 --- a/apps/web-ele/src/views/ai/chat/index/modules/message/file-upload.vue +++ b/apps/web-ele/src/views/ai/chat/index/modules/message/file-upload.vue @@ -138,14 +138,14 @@ async function uploadFile(fileItem: FileItem) { fileItem.progress = 100; // 调试日志 - console.log('上传响应:', response); + console.warn('上传响应:', response); // 兼容不同的返回格式:{ url: '...' } 或 { data: '...' } 或直接是字符串 const fileUrl = (response as any)?.url || (response as any)?.data || response; fileItem.url = fileUrl; - console.log('提取的文件 URL:', fileUrl); + console.warn('提取的文件 URL:', fileUrl); // 只有当 URL 有效时才添加到列表 if (fileUrl && typeof fileUrl === 'string') { diff --git a/apps/web-ele/src/views/ai/image/index/modules/list.vue b/apps/web-ele/src/views/ai/image/index/modules/list.vue index d958cf464..646622b52 100644 --- a/apps/web-ele/src/views/ai/image/index/modules/list.vue +++ b/apps/web-ele/src/views/ai/image/index/modules/list.vue @@ -144,7 +144,7 @@ async function handleImageMidjourneyButtonClick( const data = { id: imageDetail.id, customId: button.customId, - } as AiImageApi.ImageMidjourneyActionVO; + } as AiImageApi.ImageMidjourneyAction; // 2. 发送 action await midjourneyAction(data); // 3. 刷新列表 diff --git a/apps/web-ele/src/views/ai/model/chatRole/modules/form.vue b/apps/web-ele/src/views/ai/model/chatRole/modules/form.vue index 11b9e0eb9..35c44d2aa 100644 --- a/apps/web-ele/src/views/ai/model/chatRole/modules/form.vue +++ b/apps/web-ele/src/views/ai/model/chatRole/modules/form.vue @@ -13,7 +13,6 @@ import { getChatRole, updateChatRole, } from '#/api/ai/model/chatRole'; -import {} from '#/api/bpm/model'; import { $t } from '#/locales'; import { useFormSchema } from '../data'; diff --git a/apps/web-ele/src/views/ai/model/model/modules/form.vue b/apps/web-ele/src/views/ai/model/model/modules/form.vue index 14a1bdc43..10727a642 100644 --- a/apps/web-ele/src/views/ai/model/model/modules/form.vue +++ b/apps/web-ele/src/views/ai/model/model/modules/form.vue @@ -9,7 +9,6 @@ import { ElMessage } from 'element-plus'; import { useVbenForm } from '#/adapter/form'; import { createModel, getModel, updateModel } from '#/api/ai/model/model'; -import {} from '#/api/bpm/model'; import { $t } from '#/locales'; import { useFormSchema } from '../data'; diff --git a/apps/web-ele/src/views/ai/music/index/list/index.vue b/apps/web-ele/src/views/ai/music/index/list/index.vue index 50dbf3385..1e0dde387 100644 --- a/apps/web-ele/src/views/ai/music/index/list/index.vue +++ b/apps/web-ele/src/views/ai/music/index/list/index.vue @@ -17,7 +17,7 @@ const currentSong = ref({}); // 当前音乐 const mySongList = ref[]>([]); const squareSongList = ref[]>([]); -function generateMusic(formData: Recordable) { +function generateMusic(_formData: Recordable) { loading.value = true; setTimeout(() => { mySongList.value = Array.from({ length: 20 }, (_, index) => { diff --git a/apps/web-ele/src/views/ai/write/index/modules/tag.vue b/apps/web-ele/src/views/ai/write/index/modules/tag.vue index f199a8dd1..f68df2641 100644 --- a/apps/web-ele/src/views/ai/write/index/modules/tag.vue +++ b/apps/web-ele/src/views/ai/write/index/modules/tag.vue @@ -21,7 +21,7 @@ const emits = defineEmits<{ { { name: '定制', value: 310 }, { name: '技术支持', value: 274 }, { name: '远程', value: 400 }, - ].sort((a, b) => { + ].toSorted((a, b) => { return a.value - b.value; }), name: '商业占比', diff --git a/apps/web-ele/src/views/erp/finance/payment/modules/item-form.vue b/apps/web-ele/src/views/erp/finance/payment/modules/item-form.vue index dcd93d79b..604b8e3da 100644 --- a/apps/web-ele/src/views/erp/finance/payment/modules/item-form.vue +++ b/apps/web-ele/src/views/erp/finance/payment/modules/item-form.vue @@ -128,6 +128,7 @@ const handleOpenPurchaseIn = () => { const handleAddPurchaseIn = (rows: ErpPurchaseInApi.PurchaseIn[]) => { rows.forEach((row) => { + // TODO @芋艿 const newItem: ErpFinancePaymentApi.FinancePaymentItem = { bizId: row.id, bizType: ErpBizType.PURCHASE_IN, diff --git a/apps/web-ele/src/views/erp/finance/receipt/modules/item-form.vue b/apps/web-ele/src/views/erp/finance/receipt/modules/item-form.vue index 311e1c576..73e5f5cc5 100644 --- a/apps/web-ele/src/views/erp/finance/receipt/modules/item-form.vue +++ b/apps/web-ele/src/views/erp/finance/receipt/modules/item-form.vue @@ -127,6 +127,7 @@ function handleOpenSaleOut() { } function handleAddSaleOut(rows: ErpSaleOutApi.SaleOut[]) { + // TODO @芋艿 rows.forEach((row) => { const newItem: ErpFinanceReceiptApi.FinanceReceiptItem = { bizId: row.id, diff --git a/apps/web-ele/src/views/erp/purchase/in/modules/item-form.vue b/apps/web-ele/src/views/erp/purchase/in/modules/item-form.vue index 492618675..9dc903b2e 100644 --- a/apps/web-ele/src/views/erp/purchase/in/modules/item-form.vue +++ b/apps/web-ele/src/views/erp/purchase/in/modules/item-form.vue @@ -131,6 +131,7 @@ watch( /** 处理删除 */ function handleDelete(row: ErpPurchaseInApi.PurchaseInItem) { + // TODO @芋艿 const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); diff --git a/apps/web-ele/src/views/erp/purchase/order/modules/item-form.vue b/apps/web-ele/src/views/erp/purchase/order/modules/item-form.vue index d32daafae..7a0fa87c8 100644 --- a/apps/web-ele/src/views/erp/purchase/order/modules/item-form.vue +++ b/apps/web-ele/src/views/erp/purchase/order/modules/item-form.vue @@ -142,6 +142,7 @@ function handleAdd() { /** 处理删除 */ function handleDelete(row: ErpPurchaseOrderApi.PurchaseOrderItem) { + // TODO @芋艿 const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); @@ -169,6 +170,7 @@ async function handleProductChange(productId: any, row: any) { /** 处理行数据变更 */ function handleRowChange(row: any) { + // TODO @芋艿 const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index === -1) { tableData.value.push(row); diff --git a/apps/web-ele/src/views/erp/purchase/return/modules/item-form.vue b/apps/web-ele/src/views/erp/purchase/return/modules/item-form.vue index 2010c5cb0..8974fe052 100644 --- a/apps/web-ele/src/views/erp/purchase/return/modules/item-form.vue +++ b/apps/web-ele/src/views/erp/purchase/return/modules/item-form.vue @@ -131,6 +131,7 @@ watch( /** 处理删除 */ function handleDelete(row: ErpPurchaseReturnApi.PurchaseReturnItem) { + // TODO @芋艿 const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); diff --git a/apps/web-ele/src/views/erp/sale/order/modules/item-form.vue b/apps/web-ele/src/views/erp/sale/order/modules/item-form.vue index 84a698cf9..7ea01a887 100644 --- a/apps/web-ele/src/views/erp/sale/order/modules/item-form.vue +++ b/apps/web-ele/src/views/erp/sale/order/modules/item-form.vue @@ -142,6 +142,7 @@ function handleAdd() { /** 处理删除 */ function handleDelete(row: ErpSaleOrderApi.SaleOrderItem) { + // TODO @芋艿 const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); diff --git a/apps/web-ele/src/views/erp/sale/out/modules/item-form.vue b/apps/web-ele/src/views/erp/sale/out/modules/item-form.vue index 85122ebe0..32c835e2e 100644 --- a/apps/web-ele/src/views/erp/sale/out/modules/item-form.vue +++ b/apps/web-ele/src/views/erp/sale/out/modules/item-form.vue @@ -131,6 +131,7 @@ watch( /** 处理删除 */ function handleDelete(row: ErpSaleOutApi.SaleOutItem) { + // TODO @芋艿 const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); diff --git a/apps/web-ele/src/views/erp/sale/return/modules/item-form.vue b/apps/web-ele/src/views/erp/sale/return/modules/item-form.vue index 442baf663..75009be28 100644 --- a/apps/web-ele/src/views/erp/sale/return/modules/item-form.vue +++ b/apps/web-ele/src/views/erp/sale/return/modules/item-form.vue @@ -131,6 +131,7 @@ watch( /** 处理删除 */ function handleDelete(row: ErpSaleReturnApi.SaleReturnItem) { + // TODO @芋艿 const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); diff --git a/apps/web-ele/src/views/erp/stock/check/modules/item-form.vue b/apps/web-ele/src/views/erp/stock/check/modules/item-form.vue index 19f78cf7c..6fb1f9d98 100644 --- a/apps/web-ele/src/views/erp/stock/check/modules/item-form.vue +++ b/apps/web-ele/src/views/erp/stock/check/modules/item-form.vue @@ -106,6 +106,7 @@ function handleAdd() { /** 处理删除 */ function handleDelete(row: ErpStockCheckApi.StockCheckItem) { + // TODO @芋艿 const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); diff --git a/apps/web-ele/src/views/erp/stock/in/modules/item-form.vue b/apps/web-ele/src/views/erp/stock/in/modules/item-form.vue index 21145e370..24456de71 100644 --- a/apps/web-ele/src/views/erp/stock/in/modules/item-form.vue +++ b/apps/web-ele/src/views/erp/stock/in/modules/item-form.vue @@ -86,6 +86,7 @@ watch( /** 处理新增 */ function handleAdd() { + // TODO @芋艿 const newRow = { id: undefined, warehouseId: undefined, diff --git a/apps/web-ele/src/views/erp/stock/out/modules/item-form.vue b/apps/web-ele/src/views/erp/stock/out/modules/item-form.vue index 4a0610bf2..07e120944 100644 --- a/apps/web-ele/src/views/erp/stock/out/modules/item-form.vue +++ b/apps/web-ele/src/views/erp/stock/out/modules/item-form.vue @@ -105,6 +105,7 @@ function handleAdd() { /** 处理删除 */ function handleDelete(row: ErpStockOutApi.StockOutItem) { + // TODO @芋艿 const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); diff --git a/apps/web-ele/src/views/infra/webSocket/index.vue b/apps/web-ele/src/views/infra/webSocket/index.vue index 8f493bc7a..ac364c565 100644 --- a/apps/web-ele/src/views/infra/webSocket/index.vue +++ b/apps/web-ele/src/views/infra/webSocket/index.vue @@ -47,7 +47,7 @@ const { status, data, send, close, open } = useWebSocket(server.value, { const messageList = ref( [] as { text: string; time: number; type?: string; userId?: string }[], ); // 消息列表 -const messageReverseList = computed(() => [...messageList.value].reverse()); +const messageReverseList = computed(() => [...messageList.value].toReversed()); watchEffect(() => { if (!data.value) { return; diff --git a/apps/web-ele/src/views/mall/promotion/combination/components/showcase.vue b/apps/web-ele/src/views/mall/promotion/combination/components/showcase.vue index 748db18b8..679a21826 100644 --- a/apps/web-ele/src/views/mall/promotion/combination/components/showcase.vue +++ b/apps/web-ele/src/views/mall/promotion/combination/components/showcase.vue @@ -111,6 +111,7 @@ function emitActivityChange() { >
+ { // 使用展开运算符创建新数组,避免直接修改原数组 - return [...messageList.value].sort( + return [...messageList.value].toSorted( (a: any, b: any) => a.createTime - b.createTime, ); }); diff --git a/apps/web-ele/src/views/mall/promotion/seckill/components/showcase.vue b/apps/web-ele/src/views/mall/promotion/seckill/components/showcase.vue index 6143063c8..608b1c804 100644 --- a/apps/web-ele/src/views/mall/promotion/seckill/components/showcase.vue +++ b/apps/web-ele/src/views/mall/promotion/seckill/components/showcase.vue @@ -110,6 +110,7 @@ function emitActivityChange() { >
+ (accountList = data)); + +/** 搜索表单配置 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'accountId', + label: '公众号', + component: 'Select', + componentProps: { + options: accountList.map((item) => ({ + label: item.name, + value: item.id, + })), + placeholder: '请选择公众号', + clearable: true, + }, + }, + ]; +} + +/** 表格列配置 */ +export function useGridColumns(): VxeGridPropTypes.Columns { + return [ + { + field: 'cover', + title: '图片', + width: 360, + slots: { default: 'cover' }, + }, + { + field: 'title', + title: '标题', + slots: { default: 'title' }, + }, + { + field: 'updateTime', + title: '修改时间', + formatter: ({ row }) => { + return formatDateTime(row.updateTime * 1000); + }, + }, + { + title: '操作', + width: 120, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-ele/src/views/mp/freePublish/index.vue b/apps/web-ele/src/views/mp/freePublish/index.vue new file mode 100644 index 000000000..c126c7f01 --- /dev/null +++ b/apps/web-ele/src/views/mp/freePublish/index.vue @@ -0,0 +1,173 @@ + + + + + diff --git a/apps/web-ele/src/views/mp/menu/index.vue b/apps/web-ele/src/views/mp/menu/index.vue index 097ea52ad..688b1f268 100644 --- a/apps/web-ele/src/views/mp/menu/index.vue +++ b/apps/web-ele/src/views/mp/menu/index.vue @@ -134,20 +134,20 @@ function menuListToFrontend(list: any[]) { list.forEach((item: RawMenu) => { const menu: any = { ...item, - }; - menu.reply = { - type: item.replyMessageType, - accountId: item.accountId, - content: item.replyContent, - mediaId: item.replyMediaId, - url: item.replyMediaUrl, - title: item.replyTitle, - description: item.replyDescription, - thumbMediaId: item.replyThumbMediaId, - thumbMediaUrl: item.replyThumbMediaUrl, - articles: item.replyArticles, - musicUrl: item.replyMusicUrl, - hqMusicUrl: item.replyHqMusicUrl, + reply: { + type: item.replyMessageType, + accountId: item.accountId, + content: item.replyContent, + mediaId: item.replyMediaId, + url: item.replyMediaUrl, + title: item.replyTitle, + description: item.replyDescription, + thumbMediaId: item.replyThumbMediaId, + thumbMediaUrl: item.replyThumbMediaUrl, + articles: item.replyArticles, + musicUrl: item.replyMusicUrl, + hqMusicUrl: item.replyHqMusicUrl, + }, }; result.push(menu as RawMenu); }); @@ -277,18 +277,18 @@ function menuToBackend(menu: any) { ...menu, children: undefined, // 不处理子节点 reply: undefined, // 稍后复制 + replyMessageType: menu.reply.type, + replyContent: menu.reply.content, + replyMediaId: menu.reply.mediaId, + replyMediaUrl: menu.reply.url, + replyTitle: menu.reply.title, + replyDescription: menu.reply.description, + replyThumbMediaId: menu.reply.thumbMediaId, + replyThumbMediaUrl: menu.reply.thumbMediaUrl, + replyArticles: menu.reply.articles, + replyMusicUrl: menu.reply.musicUrl, + replyHqMusicUrl: menu.reply.hqMusicUrl, }; - result.replyMessageType = menu.reply.type; - result.replyContent = menu.reply.content; - result.replyMediaId = menu.reply.mediaId; - result.replyMediaUrl = menu.reply.url; - result.replyTitle = menu.reply.title; - result.replyDescription = menu.reply.description; - result.replyThumbMediaId = menu.reply.thumbMediaId; - result.replyThumbMediaUrl = menu.reply.thumbMediaUrl; - result.replyArticles = menu.reply.articles; - result.replyMusicUrl = menu.reply.musicUrl; - result.replyHqMusicUrl = menu.reply.hqMusicUrl; return result; } diff --git a/apps/web-ele/src/views/pay/app/data.ts b/apps/web-ele/src/views/pay/app/data.ts index 9204bac98..8ee19190c 100644 --- a/apps/web-ele/src/views/pay/app/data.ts +++ b/apps/web-ele/src/views/pay/app/data.ts @@ -256,9 +256,7 @@ export function useAppFormSchema(): VbenFormSchema[] { /** 渠道新增/修改的表单 */ export function useChannelFormSchema(formType: string = ''): VbenFormSchema[] { - const schema: VbenFormSchema[] = []; - // 添加通用字段 - schema.push( + const schema: VbenFormSchema[] = [ { component: 'Input', fieldName: 'id', @@ -307,7 +305,8 @@ export function useChannelFormSchema(formType: string = ''): VbenFormSchema[] { options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), }, }, - ); + ]; + // 添加通用字段 // 根据类型添加特定字段 if (formType.includes('alipay_')) { schema.push( @@ -402,7 +401,10 @@ export function useChannelFormSchema(formType: string = ''): VbenFormSchema[] { fieldName: 'config.appCertContent', component: h(InputUpload, { inputType: 'textarea', - textareaProps: { rows: 3, placeholder: '请上传商户公钥应用证书' }, + textareaProps: { + rows: 3, + placeholder: '请上传商户公钥应用证书', + }, fileUploadProps: { accept: ['crt'], }, diff --git a/apps/web-ele/src/views/system/user/modules/import-form.vue b/apps/web-ele/src/views/system/user/modules/import-form.vue index 0004b04ce..6222bf437 100644 --- a/apps/web-ele/src/views/system/user/modules/import-form.vue +++ b/apps/web-ele/src/views/system/user/modules/import-form.vue @@ -1,6 +1,4 @@ + diff --git a/apps/web-naive/src/views/_core/profile/index.vue b/apps/web-naive/src/views/_core/profile/index.vue new file mode 100644 index 000000000..8740894e3 --- /dev/null +++ b/apps/web-naive/src/views/_core/profile/index.vue @@ -0,0 +1,49 @@ + + diff --git a/apps/web-naive/src/views/_core/profile/notification-setting.vue b/apps/web-naive/src/views/_core/profile/notification-setting.vue new file mode 100644 index 000000000..324a4b393 --- /dev/null +++ b/apps/web-naive/src/views/_core/profile/notification-setting.vue @@ -0,0 +1,31 @@ + + diff --git a/apps/web-naive/src/views/_core/profile/password-setting.vue b/apps/web-naive/src/views/_core/profile/password-setting.vue new file mode 100644 index 000000000..1132a51fb --- /dev/null +++ b/apps/web-naive/src/views/_core/profile/password-setting.vue @@ -0,0 +1,66 @@ + + diff --git a/apps/web-naive/src/views/_core/profile/security-setting.vue b/apps/web-naive/src/views/_core/profile/security-setting.vue new file mode 100644 index 000000000..be30db58e --- /dev/null +++ b/apps/web-naive/src/views/_core/profile/security-setting.vue @@ -0,0 +1,43 @@ + + diff --git a/apps/web-naive/src/views/dashboard/analytics/analytics-visits-sales.vue b/apps/web-naive/src/views/dashboard/analytics/analytics-visits-sales.vue index 02f509123..6ff52086f 100644 --- a/apps/web-naive/src/views/dashboard/analytics/analytics-visits-sales.vue +++ b/apps/web-naive/src/views/dashboard/analytics/analytics-visits-sales.vue @@ -24,7 +24,7 @@ onMounted(() => { { name: '定制', value: 310 }, { name: '技术支持', value: 274 }, { name: '远程', value: 400 }, - ].sort((a, b) => { + ].toSorted((a, b) => { return a.value - b.value; }), name: '商业占比', diff --git a/apps/web-naive/src/views/infra/webSocket/index.vue b/apps/web-naive/src/views/infra/webSocket/index.vue index e76f502f9..e8728a79a 100644 --- a/apps/web-naive/src/views/infra/webSocket/index.vue +++ b/apps/web-naive/src/views/infra/webSocket/index.vue @@ -48,7 +48,7 @@ const { status, data, send, close, open } = useWebSocket(server.value, { const messageList = ref( [] as { text: string; time: number; type?: string; userId?: string }[], ); // 消息列表 -const messageReverseList = computed(() => [...messageList.value].reverse()); +const messageReverseList = computed(() => [...messageList.value].toReversed()); watchEffect(() => { if (!data.value) { return; diff --git a/apps/web-tdesign/package.json b/apps/web-tdesign/package.json index 6386cce56..c84b35a10 100644 --- a/apps/web-tdesign/package.json +++ b/apps/web-tdesign/package.json @@ -44,14 +44,11 @@ "@vueuse/core": "catalog:", "cropperjs": "catalog:", "dayjs": "catalog:", - "lodash-es": "^4.17.21", + "es-toolkit": "catalog:", "pinia": "catalog:", - "tdesign-vue-next": "^1.17.1", + "tdesign-vue-next": "catalog:", "tinymce": "catalog:", "vue": "catalog:", "vue-router": "catalog:" - }, - "devDependencies": { - "@types/lodash-es": "^4.17.12" } } diff --git a/apps/web-tdesign/src/app.vue b/apps/web-tdesign/src/app.vue index 57d5951cc..f37688b67 100644 --- a/apps/web-tdesign/src/app.vue +++ b/apps/web-tdesign/src/app.vue @@ -5,7 +5,7 @@ import { onMounted } from 'vue'; import { usePreferences } from '@vben/preferences'; -import { merge } from 'lodash-es'; +import { merge } from 'es-toolkit/compat'; import { ConfigProvider } from 'tdesign-vue-next'; import zhConfig from 'tdesign-vue-next/es/locale/zh_CN'; diff --git a/apps/web-tdesign/src/bootstrap.ts b/apps/web-tdesign/src/bootstrap.ts index edcccea4c..732030e1a 100644 --- a/apps/web-tdesign/src/bootstrap.ts +++ b/apps/web-tdesign/src/bootstrap.ts @@ -5,7 +5,6 @@ import { registerLoadingDirective } from '@vben/common-ui/es/loading'; import { preferences } from '@vben/preferences'; import { initStores } from '@vben/stores'; import '@vben/styles'; -import '@vben/styles/antd'; import { useTitle } from '@vueuse/core'; @@ -16,7 +15,9 @@ import { initSetupVbenForm } from './adapter/form'; import App from './app.vue'; import { router } from './router'; +// import '@vben/styles/antd'; // 引入组件库的少量全局样式变量 +import 'tdesign-vue-next/es/style/index.css'; async function bootstrap(namespace: string) { // 初始化组件适配器 diff --git a/apps/web-tdesign/src/layouts/basic.vue b/apps/web-tdesign/src/layouts/basic.vue index 805b8a73d..2226c68a2 100644 --- a/apps/web-tdesign/src/layouts/basic.vue +++ b/apps/web-tdesign/src/layouts/basic.vue @@ -2,6 +2,7 @@ import type { NotificationItem } from '@vben/layouts'; import { computed, ref, watch } from 'vue'; +import { useRouter } from 'vue-router'; import { AuthenticationLoginExpiredModal } from '@vben/common-ui'; import { VBEN_DOC_URL, VBEN_GITHUB_URL } from '@vben/constants'; @@ -23,6 +24,7 @@ import LoginForm from '#/views/_core/authentication/login.vue'; const notifications = ref([ { + id: 1, avatar: 'https://avatar.vercel.sh/vercel.svg?text=VB', date: '3小时前', isRead: true, @@ -30,6 +32,7 @@ const notifications = ref([ title: '收到了 14 份新周报', }, { + id: 2, avatar: 'https://avatar.vercel.sh/1', date: '刚刚', isRead: false, @@ -37,6 +40,7 @@ const notifications = ref([ title: '朱偏右 回复了你', }, { + id: 3, avatar: 'https://avatar.vercel.sh/1', date: '2024-01-01', isRead: false, @@ -44,14 +48,34 @@ const notifications = ref([ title: '曲丽丽 评论了你', }, { + id: 4, avatar: 'https://avatar.vercel.sh/satori', date: '1天前', isRead: false, message: '描述信息描述信息描述信息', title: '代办提醒', }, + { + id: 5, + avatar: 'https://avatar.vercel.sh/satori', + date: '1天前', + isRead: false, + message: '描述信息描述信息描述信息', + title: '跳转Workspace示例', + link: '/workspace', + }, + { + id: 6, + avatar: 'https://avatar.vercel.sh/satori', + date: '1天前', + isRead: false, + message: '描述信息描述信息描述信息', + title: '跳转外部链接示例', + link: 'https://doc.vben.pro', + }, ]); +const router = useRouter(); const userStore = useUserStore(); const authStore = useAuthStore(); const accessStore = useAccessStore(); @@ -61,6 +85,13 @@ const showDot = computed(() => ); const menus = computed(() => [ + { + handler: () => { + router.push({ name: 'Profile' }); + }, + icon: 'lucide:user', + text: $t('page.auth.profile'), + }, { handler: () => { openWindow(VBEN_DOC_URL, { @@ -102,6 +133,17 @@ function handleNoticeClear() { notifications.value = []; } +function markRead(id: number | string) { + const item = notifications.value.find((item) => item.id === id); + if (item) { + item.isRead = true; + } +} + +function remove(id: number | string) { + notifications.value = notifications.value.filter((item) => item.id !== id); +} + function handleMakeAll() { notifications.value.forEach((item) => (item.isRead = true)); } @@ -144,6 +186,8 @@ watch( :dot="showDot" :notifications="notifications" @clear="handleNoticeClear" + @read="(item) => item.id && markRead(item.id)" + @remove="(item) => item.id && remove(item.id)" @make-all="handleMakeAll" /> diff --git a/apps/web-tdesign/src/locales/langs/en-US/page.json b/apps/web-tdesign/src/locales/langs/en-US/page.json index 00a8c90b2..130cb88ac 100644 --- a/apps/web-tdesign/src/locales/langs/en-US/page.json +++ b/apps/web-tdesign/src/locales/langs/en-US/page.json @@ -4,7 +4,8 @@ "register": "Register", "codeLogin": "Code Login", "qrcodeLogin": "Qr Code Login", - "forgetPassword": "Forget Password" + "forgetPassword": "Forget Password", + "profile": "Profile" }, "dashboard": { "title": "Dashboard", diff --git a/apps/web-tdesign/src/locales/langs/zh-CN/page.json b/apps/web-tdesign/src/locales/langs/zh-CN/page.json index eefc4924b..d2af3b1eb 100644 --- a/apps/web-tdesign/src/locales/langs/zh-CN/page.json +++ b/apps/web-tdesign/src/locales/langs/zh-CN/page.json @@ -4,7 +4,8 @@ "register": "注册", "codeLogin": "验证码登录", "qrcodeLogin": "二维码登录", - "forgetPassword": "忘记密码" + "forgetPassword": "忘记密码", + "profile": "个人中心" }, "dashboard": { "title": "概览", diff --git a/apps/web-tdesign/src/views/_core/profile/base-setting.vue b/apps/web-tdesign/src/views/_core/profile/base-setting.vue new file mode 100644 index 000000000..aa8a4c260 --- /dev/null +++ b/apps/web-tdesign/src/views/_core/profile/base-setting.vue @@ -0,0 +1,65 @@ + + diff --git a/apps/web-tdesign/src/views/_core/profile/notification-setting.vue b/apps/web-tdesign/src/views/_core/profile/notification-setting.vue new file mode 100644 index 000000000..324a4b393 --- /dev/null +++ b/apps/web-tdesign/src/views/_core/profile/notification-setting.vue @@ -0,0 +1,31 @@ + + diff --git a/apps/web-tdesign/src/views/_core/profile/password-setting.vue b/apps/web-tdesign/src/views/_core/profile/password-setting.vue new file mode 100644 index 000000000..7e1c0f082 --- /dev/null +++ b/apps/web-tdesign/src/views/_core/profile/password-setting.vue @@ -0,0 +1,66 @@ + + diff --git a/apps/web-tdesign/src/views/_core/profile/security-setting.vue b/apps/web-tdesign/src/views/_core/profile/security-setting.vue new file mode 100644 index 000000000..be30db58e --- /dev/null +++ b/apps/web-tdesign/src/views/_core/profile/security-setting.vue @@ -0,0 +1,43 @@ + + diff --git a/apps/web-tdesign/src/views/dashboard/analytics/analytics-visits-sales.vue b/apps/web-tdesign/src/views/dashboard/analytics/analytics-visits-sales.vue index 02f509123..6ff52086f 100644 --- a/apps/web-tdesign/src/views/dashboard/analytics/analytics-visits-sales.vue +++ b/apps/web-tdesign/src/views/dashboard/analytics/analytics-visits-sales.vue @@ -24,7 +24,7 @@ onMounted(() => { { name: '定制', value: 310 }, { name: '技术支持', value: 274 }, { name: '远程', value: 400 }, - ].sort((a, b) => { + ].toSorted((a, b) => { return a.value - b.value; }), name: '商业占比', diff --git a/apps/web-tdesign/src/views/infra/webSocket/index.vue b/apps/web-tdesign/src/views/infra/webSocket/index.vue index c4fd5fa54..466939377 100644 --- a/apps/web-tdesign/src/views/infra/webSocket/index.vue +++ b/apps/web-tdesign/src/views/infra/webSocket/index.vue @@ -47,7 +47,7 @@ const { status, data, send, close, open } = useWebSocket(server.value, { const messageList = ref( [] as { text: string; time: number; type?: string; userId?: string }[], ); // 消息列表 -const messageReverseList = computed(() => [...messageList.value].reverse()); +const messageReverseList = computed(() => [...messageList.value].toReversed()); watchEffect(() => { if (!data.value) { return; diff --git a/cspell.json b/cspell.json index ce570510f..9bacfa30e 100644 --- a/cspell.json +++ b/cspell.json @@ -54,6 +54,7 @@ "styl", "taze", "Tinymce", + "tdesign", "ui-kit", "uicons", "unplugin", diff --git a/docs/.vitepress/components/preview-group.vue b/docs/.vitepress/components/preview-group.vue index 2fb02d3fd..660a6f2f4 100644 --- a/docs/.vitepress/components/preview-group.vue +++ b/docs/.vitepress/components/preview-group.vue @@ -48,7 +48,7 @@ const toggleOpen = () => {