diff --git a/apps/web-ele/src/adapter/component/index.ts b/apps/web-ele/src/adapter/component/index.ts index 0804f9f6..7a5d9f07 100644 --- a/apps/web-ele/src/adapter/component/index.ts +++ b/apps/web-ele/src/adapter/component/index.ts @@ -163,6 +163,7 @@ const withDefaultPlaceholder = ( // 这里需要自行根据业务组件库进行适配,需要用到的组件都需要在这里类型说明 export type ComponentType = + | 'ApiCascader' | 'ApiSelect' | 'ApiTreeSelect' | 'Checkbox' @@ -184,7 +185,6 @@ export type ComponentType = | 'TimePicker' | 'TreeSelect' | 'Upload' - | 'ApiCascader' | BaseFormComponentType; async function initComponentAdapter() { @@ -212,13 +212,6 @@ async function initComponentAdapter() { 'select', { component: ElCascader, - props: { - props: { - label: 'label', - value: 'value', - children: 'children', - }, - }, }, ), ApiTreeSelect: withDefaultPlaceholder( @@ -229,7 +222,6 @@ async function initComponentAdapter() { 'select', { component: ElTreeSelect, - props: { label: 'label', children: 'children' }, nodeKey: 'value', loadingSlot: 'loading', optionsPropName: 'data', diff --git a/apps/web-ele/src/api/mall/product/category.ts b/apps/web-ele/src/api/mall/product/category.ts index 3ca05b0f..12d7202f 100644 --- a/apps/web-ele/src/api/mall/product/category.ts +++ b/apps/web-ele/src/api/mall/product/category.ts @@ -53,6 +53,6 @@ export function getCategoryList(params: any) { // 获得商品分类列表 export function getCategorySimpleList() { return requestClient.get( - '/product/category/list-all-simple', + '/product/category/list', ); } diff --git a/apps/web-ele/src/api/mall/statistics/member.ts b/apps/web-ele/src/api/mall/statistics/member.ts index fb7a6b01..bcc99304 100644 --- a/apps/web-ele/src/api/mall/statistics/member.ts +++ b/apps/web-ele/src/api/mall/statistics/member.ts @@ -1,6 +1,6 @@ import type { MallDataComparisonResp } from './common'; -import { formatDate } from '@vben/utils'; +import { formatDate2 } from '@vben/utils'; import { requestClient } from '#/api/request'; @@ -84,7 +84,10 @@ export function getMemberAnalyse(params: MallMemberStatisticsApi.AnalyseReq) { '/statistics/member/analyse', { params: { - times: [formatDate(params.times[0]), formatDate(params.times[1])], + times: [ + formatDate2(params.times[0] || new Date()), + formatDate2(params.times[1] || new Date()), + ], }, }, ); @@ -124,7 +127,7 @@ export function getMemberRegisterCountList(beginTime: Date, endTime: Date) { '/statistics/member/register-count-list', { params: { - times: [formatDate(beginTime), formatDate(endTime)], + times: [formatDate2(beginTime), formatDate2(endTime)], }, }, ); diff --git a/apps/web-ele/src/api/mall/statistics/product.ts b/apps/web-ele/src/api/mall/statistics/product.ts index d458d435..089da4af 100644 --- a/apps/web-ele/src/api/mall/statistics/product.ts +++ b/apps/web-ele/src/api/mall/statistics/product.ts @@ -2,6 +2,8 @@ import type { PageParam, PageResult } from '@vben/request'; import type { MallDataComparisonResp } from './common'; +import { formatDate2 } from '@vben/utils'; + import { requestClient } from '#/api/request'; export namespace MallProductStatisticsApi { @@ -38,26 +40,58 @@ export namespace MallProductStatisticsApi { /** 浏览转化率 */ browseConvertPercent: number; } + + /** 会员分析 Request */ + export interface ProductStatisticsReq { + times: Date[]; + } } /** 获得商品统计分析 */ -export function getProductStatisticsAnalyse(params: PageParam) { +export function getProductStatisticsAnalyse( + params: MallProductStatisticsApi.ProductStatisticsReq, +) { return requestClient.get< MallDataComparisonResp - >('/statistics/product/analyse', { params }); + >('/statistics/product/analyse', { + params: { + times: [ + formatDate2(params.times[0] || new Date()), + formatDate2(params.times[1] || new Date()), + ], + }, + }); } /** 获得商品状况明细 */ -export function getProductStatisticsList(params: PageParam) { +export function getProductStatisticsList( + params: MallProductStatisticsApi.ProductStatisticsReq, +) { return requestClient.get( '/statistics/product/list', - { params }, + { + params: { + times: [ + formatDate2(params.times[0] || new Date()), + formatDate2(params.times[1] || new Date()), + ], + }, + }, ); } /** 导出获得商品状况明细 Excel */ -export function exportProductStatisticsExcel(params: PageParam) { - return requestClient.download('/statistics/product/export-excel', { params }); +export function exportProductStatisticsExcel( + params: MallProductStatisticsApi.ProductStatisticsReq, +) { + return requestClient.download('/statistics/product/export-excel', { + params: { + times: [ + formatDate2(params.times[0] || new Date()), + formatDate2(params.times[1] || new Date()), + ], + }, + }); } /** 获得商品排行榜分页 */ diff --git a/apps/web-ele/src/api/mall/statistics/trade.ts b/apps/web-ele/src/api/mall/statistics/trade.ts index 1f866c63..0b52be51 100644 --- a/apps/web-ele/src/api/mall/statistics/trade.ts +++ b/apps/web-ele/src/api/mall/statistics/trade.ts @@ -1,6 +1,6 @@ import type { MallDataComparisonResp } from './common'; -import { formatDate } from '@vben/utils'; +import { formatDate2 } from '@vben/utils'; import { requestClient } from '#/api/request'; @@ -15,7 +15,7 @@ export namespace MallTradeStatisticsApi { /** 交易状况 Request */ export interface TradeTrendReq { - times: [Date, Date]; + times: Date[]; } /** 交易状况统计 Response */ @@ -64,8 +64,11 @@ export namespace MallTradeStatisticsApi { /** 时间参数需要格式化, 确保接口能识别 */ const formatDateParam = (params: MallTradeStatisticsApi.TradeTrendReq) => { return { - times: [formatDate(params.times[0]), formatDate(params.times[1])], - } as MallTradeStatisticsApi.TradeTrendReq; + times: [ + formatDate2(params.times[0] || new Date()), + formatDate2(params.times[1] || new Date()), + ], + }; }; /** 查询交易统计 */ @@ -128,8 +131,8 @@ export function getOrderCountTrendComparison( >('/statistics/trade/order-count-trend', { params: { type, - beginTime: formatDate(beginTime), - endTime: formatDate(endTime), + beginTime: formatDate2(beginTime), + endTime: formatDate2(endTime), }, }); } diff --git a/apps/web-ele/src/api/mall/trade/afterSale/index.ts b/apps/web-ele/src/api/mall/trade/afterSale/index.ts index 95326af0..2aed74c2 100644 --- a/apps/web-ele/src/api/mall/trade/afterSale/index.ts +++ b/apps/web-ele/src/api/mall/trade/afterSale/index.ts @@ -1,5 +1,7 @@ import type { PageParam, PageResult } from '@vben/request'; +import type { MallOrderApi } from '#/api/mall/trade/order'; + import { requestClient } from '#/api/request'; export namespace MallAfterSaleApi { @@ -75,6 +77,21 @@ export namespace MallAfterSaleApi { receiveTime?: Date; /** 收货备注 */ receiveReason?: string; + /** 订单 */ + order?: MallOrderApi.Order; + /** 订单操作日志 */ + logs?: MallOrderApi.OrderLog[]; + /** 订单项 */ + orderItem?: MallOrderApi.OrderItem; + /** 用户信息 */ + user?: { + /** 用户头像 */ + avatar?: string; + /** 用户编号 */ + id?: null | number; + /** 用户昵称 */ + nickname?: string; + }; } /** 拒绝售后请求 */ diff --git a/apps/web-ele/src/api/mall/trade/order/index.ts b/apps/web-ele/src/api/mall/trade/order/index.ts index 6017fa5f..a9d7d188 100644 --- a/apps/web-ele/src/api/mall/trade/order/index.ts +++ b/apps/web-ele/src/api/mall/trade/order/index.ts @@ -53,6 +53,8 @@ export namespace MallOrderApi { /** 订单日志 */ export interface OrderLog { + /** 日志编号 */ + id: number; /** 日志内容 */ content?: string; /** 创建时间 */ @@ -108,7 +110,7 @@ export namespace MallOrderApi { /** 订单调价(总) */ adjustPrice?: null | number; /** 应付金额(总) */ - payPrice?: null | number; + payPrice?: null | number | string; /** 发货方式 */ deliveryType?: null | number; /** 自提门店编号 */ @@ -226,6 +228,13 @@ export namespace MallOrderApi { /** 收件人详细地址 */ receiverDetailAddress: string; } + + export interface OrderExpressTrackRespDTO { + /** 发生时间 */ + time: Date; + /** 快递状态 */ + content: string; + } } /** 查询交易订单列表 */ @@ -254,7 +263,9 @@ export function getOrder(id: number) { /** 查询交易订单物流详情 */ export function getExpressTrackList(id: number) { - return requestClient.get(`/trade/order/get-express-track-list?id=${id}`); + return requestClient.get( + `/trade/order/get-express-track-list?id=${id}`, + ); } /** 订单发货 */ 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 eefc4924..30180ddf 100644 --- a/apps/web-ele/src/locales/langs/zh-CN/page.json +++ b/apps/web-ele/src/locales/langs/zh-CN/page.json @@ -29,5 +29,62 @@ "tenant": { "placeholder": "请选择租户", "success": "切换租户成功" + }, + "common": { + "inputText": "请输入", + "selectText": "请选择", + "startTimeText": "开始时间", + "endTimeText": "结束时间", + "login": "登录", + "required": "该项为必填项", + "loginOut": "退出系统", + "document": "项目文档", + "profile": "个人中心", + "reminder": "温馨提示", + "loginOutMessage": "是否退出本系统?", + "back": "返回", + "ok": "确定", + "save": "保存", + "cancel": "取消", + "close": "关闭", + "reload": "重新加载", + "success": "成功", + "closeTab": "关闭标签页", + "closeTheLeftTab": "关闭左侧标签页", + "closeTheRightTab": "关闭右侧标签页", + "closeOther": "关闭其他标签页", + "closeAll": "关闭全部标签页", + "prevLabel": "上一步", + "nextLabel": "下一步", + "skipLabel": "跳过", + "doneLabel": "结束", + "menu": "菜单", + "menuDes": "以路由的结构渲染的菜单栏", + "collapse": "展开缩收", + "collapseDes": "展开和缩放菜单栏", + "tagsView": "标签页", + "tagsViewDes": "用于记录路由历史记录", + "tool": "工具", + "toolDes": "用于设置定制系统", + "query": "查询", + "reset": "重置", + "shrink": "收起", + "expand": "展开", + "confirmTitle": "系统提示", + "exportMessage": "是否确认导出数据项?", + "importMessage": "是否确认导入数据项?", + "createSuccess": "新增成功", + "updateSuccess": "修改成功", + "delMessage": "是否删除所选中数据?", + "delDataMessage": "是否删除数据?", + "delNoData": "请选择需要删除的数据", + "delSuccess": "删除成功", + "index": "序号", + "status": "状态", + "createTime": "创建时间", + "updateTime": "更新时间", + "copy": "复制", + "copySuccess": "复制成功", + "copyError": "复制失败" } } diff --git a/apps/web-ele/src/router/routes/modules/mall.ts b/apps/web-ele/src/router/routes/modules/mall.ts index 80416ba6..d5d39646 100644 --- a/apps/web-ele/src/router/routes/modules/mall.ts +++ b/apps/web-ele/src/router/routes/modules/mall.ts @@ -40,37 +40,37 @@ const routes: RouteRecordRaw[] = [ }, ], }, - // { - // path: '/mall/trade', - // name: 'TradeCenter', - // meta: { - // title: '交易中心', - // icon: 'lucide:shopping-cart', - // keepAlive: true, - // hideInMenu: true, - // }, - // children: [ - // { - // path: String.raw`order/detail/:id(\d+)`, - // name: 'TradeOrderDetail', - // meta: { - // title: '订单详情', - // activeMenu: '/mall/trade/order', - // }, - // component: () => import('#/views/mall/trade/order/detail/index.vue'), - // }, - // { - // path: String.raw`after-sale/detail/:id(\d+)`, - // name: 'TradeAfterSaleDetail', - // meta: { - // title: '退款详情', - // activeMenu: '/mall/trade/after-sale', - // }, - // component: () => - // import('#/views/mall/trade/afterSale/detail/index.vue'), - // }, - // ], - // }, + { + path: '/mall/trade', + name: 'TradeCenter', + meta: { + title: '交易中心', + icon: 'lucide:shopping-cart', + keepAlive: true, + hideInMenu: true, + }, + children: [ + { + path: String.raw`order/detail/:id(\d+)`, + name: 'TradeOrderDetail', + meta: { + title: '订单详情', + activeMenu: '/mall/trade/order', + }, + component: () => import('#/views/mall/trade/order/modules/detail.vue'), + }, + { + path: String.raw`after-sale/detail/:id(\d+)`, + name: 'TradeAfterSaleDetail', + meta: { + title: '退款详情', + activeMenu: '/mall/trade/after-sale', + }, + component: () => + import('#/views/mall/trade/afterSale/modules/detail.vue'), + }, + ], + }, ]; export default routes; diff --git a/apps/web-ele/src/utils/constants.ts b/apps/web-ele/src/utils/constants.ts index 78da9f94..9b684696 100644 --- a/apps/web-ele/src/utils/constants.ts +++ b/apps/web-ele/src/utils/constants.ts @@ -201,6 +201,16 @@ export const PayOrderStatusEnum = { }; // ========== MALL - 商品模块 ========== +/** + * 商品 首页 日期类型 + */ +export enum TimeRangeTypeEnum { + DAY30 = 1, + MONTH = 30, + WEEK = 7, + YEAR = 365, +} + /** * 商品 SPU 状态 */ diff --git a/apps/web-ele/src/views/infra/codegen/index.vue b/apps/web-ele/src/views/infra/codegen/index.vue index a34039df..e116e064 100644 --- a/apps/web-ele/src/views/infra/codegen/index.vue +++ b/apps/web-ele/src/views/infra/codegen/index.vue @@ -12,7 +12,7 @@ import { useRouter } from 'vue-router'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { isEmpty } from '@vben/utils'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElLoading, ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -73,47 +73,38 @@ function onEdit(row: InfraCodegenApi.CodegenTable) { /** 删除代码生成配置 */ async function onDelete(row: InfraCodegenApi.CodegenTable) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.tableName]), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该代码生成配置吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteCodegenTable(row.id); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.tableName])); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteCodegenTable(row.id); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.tableName])); + onRefresh(); } /** 批量删除代码生成配置 */ async function onDeleteBatch() { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting'), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该代码生成配置吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteCodegenTableList(checkedIds.value); - ElMessage.success($t('ui.actionMessage.deleteSuccess')); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteCodegenTableList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); } /** 同步数据库 */ async function onSync(row: InfraCodegenApi.CodegenTable) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.updating', [row.tableName]), - fullscreen: true, + await ElMessageBox.confirm('确定要同步该代码生成配置吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await syncCodegenFromDB(row.id); - ElMessage.success($t('ui.actionMessage.updateSuccess', [row.tableName])); - onRefresh(); - } finally { - loadingInstance.close(); - } + await syncCodegenFromDB(row.id); + ElMessage.success($t('ui.actionMessage.updateSuccess', [row.tableName])); + onRefresh(); } /** 生成代码 */ diff --git a/apps/web-ele/src/views/infra/config/index.vue b/apps/web-ele/src/views/infra/config/index.vue index d73251df..c77ce8ce 100644 --- a/apps/web-ele/src/views/infra/config/index.vue +++ b/apps/web-ele/src/views/infra/config/index.vue @@ -10,7 +10,7 @@ import { ref } from 'vue'; import { Page, useVbenModal } from '@vben/common-ui'; import { downloadFileFromBlobPart, isEmpty } from '@vben/utils'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -52,34 +52,26 @@ function onEdit(row: InfraConfigApi.Config) { /** 删除参数 */ async function onDelete(row: InfraConfigApi.Config) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.name]), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该参数吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteConfig(row.id as number); - loadingInstance.close(); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteConfig(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); + onRefresh(); } /** 批量删除参数 */ async function onDeleteBatch() { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting'), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该参数吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteConfigList(checkedIds.value); - loadingInstance.close(); - ElMessage.success($t('ui.actionMessage.deleteSuccess')); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteConfigList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); } const checkedIds = ref([]); diff --git a/apps/web-ele/src/views/infra/dataSourceConfig/index.vue b/apps/web-ele/src/views/infra/dataSourceConfig/index.vue index 65eacafe..f99b5653 100644 --- a/apps/web-ele/src/views/infra/dataSourceConfig/index.vue +++ b/apps/web-ele/src/views/infra/dataSourceConfig/index.vue @@ -10,7 +10,7 @@ import { onMounted, ref } from 'vue'; import { Page, useVbenModal } from '@vben/common-ui'; import { isEmpty } from '@vben/utils'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -40,34 +40,26 @@ function onEdit(row: InfraDataSourceConfigApi.DataSourceConfig) { /** 删除数据源 */ async function onDelete(row: InfraDataSourceConfigApi.DataSourceConfig) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.name]), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该数据源吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteDataSourceConfig(row.id as number); - loadingInstance.close(); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); - await handleLoadData(); - } finally { - loadingInstance.close(); - } + await deleteDataSourceConfig(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); + onRefresh(); } /** 批量删除数据源 */ async function onDeleteBatch() { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting'), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该数据源吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteDataSourceConfigList(checkedIds.value); - loadingInstance.close(); - ElMessage.success($t('ui.actionMessage.deleteSuccess')); - await handleLoadData(); - } finally { - loadingInstance.close(); - } + await deleteDataSourceConfigList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); } const checkedIds = ref([]); diff --git a/apps/web-ele/src/views/infra/file/index.vue b/apps/web-ele/src/views/infra/file/index.vue index 6b6134a9..37d40a21 100644 --- a/apps/web-ele/src/views/infra/file/index.vue +++ b/apps/web-ele/src/views/infra/file/index.vue @@ -11,7 +11,7 @@ import { Page, useVbenModal } from '@vben/common-ui'; import { isEmpty, openWindow } from '@vben/utils'; import { useClipboard } from '@vueuse/core'; -import { ElButton, ElImage, ElLoading, ElMessage } from 'element-plus'; +import { ElButton, ElImage, ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { deleteFile, deleteFileList, getFilePage } from '#/api/infra/file'; @@ -60,36 +60,28 @@ function openUrl(url?: string) { /** 删除文件 */ async function onDelete(row: InfraFileApi.File) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.name || row.path]), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该文件吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteFile(row.id as number); - loadingInstance.close(); - ElMessage.success( - $t('ui.actionMessage.deleteSuccess', [row.name || row.path]), - ); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteFile(row.id as number); + ElMessage.success( + $t('ui.actionMessage.deleteSuccess', [row.name || row.path]), + ); + onRefresh(); } /** 批量删除文件 */ async function onDeleteBatch() { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting'), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该文件吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteFileList(checkedIds.value); - loadingInstance.close(); - ElMessage.success($t('ui.actionMessage.deleteSuccess')); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteFileList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); } const checkedIds = ref([]); diff --git a/apps/web-ele/src/views/infra/fileConfig/index.vue b/apps/web-ele/src/views/infra/fileConfig/index.vue index 96201c45..8ab9d351 100644 --- a/apps/web-ele/src/views/infra/fileConfig/index.vue +++ b/apps/web-ele/src/views/infra/fileConfig/index.vue @@ -10,7 +10,7 @@ import { ref } from 'vue'; import { confirm, Page, useVbenModal } from '@vben/common-ui'; import { isEmpty, openWindow } from '@vben/utils'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElLoading, ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -86,34 +86,26 @@ async function onTest(row: InfraFileConfigApi.FileConfig) { /** 删除文件配置 */ async function onDelete(row: InfraFileConfigApi.FileConfig) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.name]), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该文件配置吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteFileConfig(row.id as number); - loadingInstance.close(); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteFileConfig(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); + onRefresh(); } /** 批量删除文件配置 */ async function onDeleteBatch() { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting'), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该文件配置吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteFileConfigList(checkedIds.value); - loadingInstance.close(); - ElMessage.success($t('ui.actionMessage.deleteSuccess')); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteFileConfigList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); } const checkedIds = ref([]); diff --git a/apps/web-ele/src/views/infra/job/index.vue b/apps/web-ele/src/views/infra/job/index.vue index eeb191e0..f631e944 100644 --- a/apps/web-ele/src/views/infra/job/index.vue +++ b/apps/web-ele/src/views/infra/job/index.vue @@ -11,7 +11,7 @@ import { useRouter } from 'vue-router'; import { confirm, DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { downloadFileFromBlobPart, isEmpty } from '@vben/utils'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -105,32 +105,26 @@ function onLog(row?: InfraJobApi.Job) { /** 删除任务 */ async function onDelete(row: InfraJobApi.Job) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.name]), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该任务吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteJob(row.id as number); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteJob(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); + onRefresh(); } /** 批量删除任务 */ async function onDeleteBatch() { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting'), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该任务吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteJobList(checkedIds.value); - ElMessage.success($t('ui.actionMessage.deleteSuccess')); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteJobList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); } const checkedIds = ref([]); diff --git a/apps/web-ele/src/views/mall/home/components/analysis-chart-card.vue b/apps/web-ele/src/views/mall/home/components/analysis-chart-card.vue new file mode 100644 index 00000000..807b6bad --- /dev/null +++ b/apps/web-ele/src/views/mall/home/components/analysis-chart-card.vue @@ -0,0 +1,25 @@ + + + diff --git a/apps/web-ele/src/views/mall/home/components/analysis-overview-icon.vue b/apps/web-ele/src/views/mall/home/components/analysis-overview-icon.vue new file mode 100644 index 00000000..80ebbbd8 --- /dev/null +++ b/apps/web-ele/src/views/mall/home/components/analysis-overview-icon.vue @@ -0,0 +1,100 @@ + + + diff --git a/apps/web-ele/src/views/mall/home/components/analysis-overview.vue b/apps/web-ele/src/views/mall/home/components/analysis-overview.vue new file mode 100644 index 00000000..6e1aa439 --- /dev/null +++ b/apps/web-ele/src/views/mall/home/components/analysis-overview.vue @@ -0,0 +1,174 @@ + + + + diff --git a/apps/web-ele/src/views/mall/home/components/analysis-trade-overview.vue b/apps/web-ele/src/views/mall/home/components/analysis-trade-overview.vue new file mode 100644 index 00000000..b188a9d2 --- /dev/null +++ b/apps/web-ele/src/views/mall/home/components/analysis-trade-overview.vue @@ -0,0 +1,87 @@ + + + diff --git a/apps/web-ele/src/views/mall/home/components/data.ts b/apps/web-ele/src/views/mall/home/components/data.ts new file mode 100644 index 00000000..021a20e5 --- /dev/null +++ b/apps/web-ele/src/views/mall/home/components/data.ts @@ -0,0 +1,39 @@ +export interface WorkbenchQuickDataShowItem { + name: string; + value: number; + prefix: string; + decimals: number; + routerName: string; +} + +export interface AnalysisOverviewItem { + title: string; + totalTitle?: string; + totalValue?: number; + value: number; + prefix?: string; + tooltip?: string; + // 环比增长相关字段 + showGrowthRate?: boolean; // 是否显示环比增长率,默认为false +} + +export interface AnalysisOverviewIconItem { + icon: string; + title: string; + value: number; + prefix?: string; + iconBgColor: string; + iconColor: string; + tooltip?: string; + decimals?: number; + percent?: number; +} + +export interface AnalysisOverviewTradeItem { + title: string; + value: number; + prefix?: string; + decimals?: number; + percent?: number; + tooltip?: string; +} diff --git a/apps/web-ele/src/views/mall/home/components/member-funnel-card.vue b/apps/web-ele/src/views/mall/home/components/member-funnel-card.vue new file mode 100644 index 00000000..089e507a --- /dev/null +++ b/apps/web-ele/src/views/mall/home/components/member-funnel-card.vue @@ -0,0 +1,162 @@ + + + diff --git a/apps/web-ele/src/views/mall/home/components/member-statistics-card.vue b/apps/web-ele/src/views/mall/home/components/member-statistics-card.vue new file mode 100644 index 00000000..603e9bbc --- /dev/null +++ b/apps/web-ele/src/views/mall/home/components/member-statistics-card.vue @@ -0,0 +1,101 @@ + + diff --git a/apps/web-ele/src/views/mall/home/components/member-terminal-card.vue b/apps/web-ele/src/views/mall/home/components/member-terminal-card.vue new file mode 100644 index 00000000..6631ef7b --- /dev/null +++ b/apps/web-ele/src/views/mall/home/components/member-terminal-card.vue @@ -0,0 +1,80 @@ + + diff --git a/apps/web-ele/src/views/mall/home/components/shortcut-date-range-picker.vue b/apps/web-ele/src/views/mall/home/components/shortcut-date-range-picker.vue new file mode 100644 index 00000000..a8431d5c --- /dev/null +++ b/apps/web-ele/src/views/mall/home/components/shortcut-date-range-picker.vue @@ -0,0 +1,87 @@ + + diff --git a/apps/web-ele/src/views/mall/home/components/trade-trend-card.vue b/apps/web-ele/src/views/mall/home/components/trade-trend-card.vue new file mode 100644 index 00000000..8c2b2b69 --- /dev/null +++ b/apps/web-ele/src/views/mall/home/components/trade-trend-card.vue @@ -0,0 +1,225 @@ + + diff --git a/apps/web-ele/src/views/mall/home/components/workbench-quick-data-show.vue b/apps/web-ele/src/views/mall/home/components/workbench-quick-data-show.vue new file mode 100644 index 00000000..3d55ccb8 --- /dev/null +++ b/apps/web-ele/src/views/mall/home/components/workbench-quick-data-show.vue @@ -0,0 +1,72 @@ + + + diff --git a/apps/web-ele/src/views/mall/home/index.vue b/apps/web-ele/src/views/mall/home/index.vue index 21b6279b..3ebbe281 100644 --- a/apps/web-ele/src/views/mall/home/index.vue +++ b/apps/web-ele/src/views/mall/home/index.vue @@ -1,29 +1,30 @@ + + diff --git a/apps/web-ele/src/views/mall/statistics/member/components/member-sex-card.vue b/apps/web-ele/src/views/mall/statistics/member/components/member-sex-card.vue new file mode 100644 index 00000000..84b8c7e6 --- /dev/null +++ b/apps/web-ele/src/views/mall/statistics/member/components/member-sex-card.vue @@ -0,0 +1,72 @@ + + + diff --git a/apps/web-ele/src/views/mall/statistics/member/index.vue b/apps/web-ele/src/views/mall/statistics/member/index.vue index 203b6d91..c98ec1b2 100644 --- a/apps/web-ele/src/views/mall/statistics/member/index.vue +++ b/apps/web-ele/src/views/mall/statistics/member/index.vue @@ -1,7 +1,64 @@ diff --git a/apps/web-ele/src/views/mall/statistics/product/components/product-rank.vue b/apps/web-ele/src/views/mall/statistics/product/components/product-rank.vue new file mode 100644 index 00000000..09ba064c --- /dev/null +++ b/apps/web-ele/src/views/mall/statistics/product/components/product-rank.vue @@ -0,0 +1,153 @@ + + + diff --git a/apps/web-ele/src/views/mall/statistics/product/components/product-summary.vue b/apps/web-ele/src/views/mall/statistics/product/components/product-summary.vue new file mode 100644 index 00000000..41e7a94a --- /dev/null +++ b/apps/web-ele/src/views/mall/statistics/product/components/product-summary.vue @@ -0,0 +1,331 @@ + + + diff --git a/apps/web-ele/src/views/mall/statistics/product/index.vue b/apps/web-ele/src/views/mall/statistics/product/index.vue index cfc1f5ce..26d1b86c 100644 --- a/apps/web-ele/src/views/mall/statistics/product/index.vue +++ b/apps/web-ele/src/views/mall/statistics/product/index.vue @@ -1,7 +1,8 @@ diff --git a/apps/web-ele/src/views/mall/statistics/trade/components/trade-transaction-card.vue b/apps/web-ele/src/views/mall/statistics/trade/components/trade-transaction-card.vue new file mode 100644 index 00000000..9087e0ef --- /dev/null +++ b/apps/web-ele/src/views/mall/statistics/trade/components/trade-transaction-card.vue @@ -0,0 +1,280 @@ + + diff --git a/apps/web-ele/src/views/mall/statistics/trade/index.vue b/apps/web-ele/src/views/mall/statistics/trade/index.vue index dd0e7eb2..4aae9367 100644 --- a/apps/web-ele/src/views/mall/statistics/trade/index.vue +++ b/apps/web-ele/src/views/mall/statistics/trade/index.vue @@ -1,7 +1,76 @@ diff --git a/apps/web-ele/src/views/mall/trade/afterSale/modules/detail.vue b/apps/web-ele/src/views/mall/trade/afterSale/modules/detail.vue new file mode 100644 index 00000000..1c35bcef --- /dev/null +++ b/apps/web-ele/src/views/mall/trade/afterSale/modules/detail.vue @@ -0,0 +1,450 @@ + + + diff --git a/apps/web-ele/src/views/mall/trade/afterSale/modules/disagree-form.vue b/apps/web-ele/src/views/mall/trade/afterSale/modules/disagree-form.vue new file mode 100644 index 00000000..54081616 --- /dev/null +++ b/apps/web-ele/src/views/mall/trade/afterSale/modules/disagree-form.vue @@ -0,0 +1,129 @@ + + + diff --git a/apps/web-ele/src/views/mall/trade/brokerage/user/index.vue b/apps/web-ele/src/views/mall/trade/brokerage/user/index.vue index fc5d9966..7841ac73 100644 --- a/apps/web-ele/src/views/mall/trade/brokerage/user/index.vue +++ b/apps/web-ele/src/views/mall/trade/brokerage/user/index.vue @@ -6,7 +6,7 @@ import { useAccess } from '@vben/access'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { $t } from '@vben/locales'; -import { ElLoading, ElMessage, ElSwitch } from 'element-plus'; +import { ElLoading, ElMessage, ElMessageBox, ElSwitch } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -68,17 +68,14 @@ function openCreateUserForm() { /** 清除上级推广人 */ async function handleClearBindUser(row: MallBrokerageUserApi.BrokerageUser) { - const loadingInstance = ElLoading.service({ - text: `正在清除"${row.nickname}"的上级推广人...`, - fullscreen: true, + await ElMessageBox.confirm(`确定清除"${row.nickname}"的上级推广人吗?`, { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await clearBindUser({ id: row.id as number }); - ElMessage.success('清除成功'); - onRefresh(); - } finally { - loadingInstance.close(); - } + await clearBindUser({ id: row.id as number }); + ElMessage.success('清除成功'); + onRefresh(); } /** 推广资格:开通/关闭 */ diff --git a/apps/web-ele/src/views/mall/trade/brokerage/withdraw/index.vue b/apps/web-ele/src/views/mall/trade/brokerage/withdraw/index.vue index 8158bedf..7fd2915f 100644 --- a/apps/web-ele/src/views/mall/trade/brokerage/withdraw/index.vue +++ b/apps/web-ele/src/views/mall/trade/brokerage/withdraw/index.vue @@ -4,10 +4,10 @@ import type { MallBrokerageWithdrawApi } from '#/api/mall/trade/brokerage/withdr import { h } from 'vue'; -import { confirm, Page, prompt } from '@vben/common-ui'; +import { Page, prompt } from '@vben/common-ui'; import { formatDateTime } from '@vben/utils'; -import { ElInput, ElMessage } from 'element-plus'; +import { ElInput, ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -35,14 +35,14 @@ function onRefresh() { /** 审核通过 */ async function handleApprove(row: MallBrokerageWithdrawApi.BrokerageWithdraw) { - try { - await confirm('确定要审核通过吗?'); - await approveBrokerageWithdraw(row.id); - ElMessage.success($t('ui.actionMessage.operationSuccess')); - onRefresh(); - } catch (error) { - console.error('审核失败:', error); - } + await ElMessageBox.confirm('确定要审核通过吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }); + await approveBrokerageWithdraw(row.id); + ElMessage.success($t('ui.actionMessage.operationSuccess')); + onRefresh(); } /** 审核驳回 */ @@ -73,14 +73,14 @@ function handleReject(row: MallBrokerageWithdrawApi.BrokerageWithdraw) { async function handleRetryTransfer( row: MallBrokerageWithdrawApi.BrokerageWithdraw, ) { - try { - await confirm('确定要重新转账吗?'); - await approveBrokerageWithdraw(row.id); - ElMessage.success($t('ui.actionMessage.operationSuccess')); - onRefresh(); - } catch (error) { - console.error('重新转账失败:', error); - } + await ElMessageBox.confirm('确定要重新转账吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }); + await approveBrokerageWithdraw(row.id); + ElMessage.success($t('ui.actionMessage.operationSuccess')); + onRefresh(); } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-ele/src/views/mall/trade/delivery/express/index.vue b/apps/web-ele/src/views/mall/trade/delivery/express/index.vue index 15bc231d..73091003 100644 --- a/apps/web-ele/src/views/mall/trade/delivery/express/index.vue +++ b/apps/web-ele/src/views/mall/trade/delivery/express/index.vue @@ -5,7 +5,7 @@ import type { MallDeliveryExpressApi } from '#/api/mall/trade/delivery/express'; import { Page, useVbenModal } from '@vben/common-ui'; import { downloadFileFromBlobPart } from '@vben/utils'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -46,16 +46,14 @@ function handleEdit(row: MallDeliveryExpressApi.DeliveryExpress) { /** 删除快递公司 */ async function handleDelete(row: MallDeliveryExpressApi.DeliveryExpress) { - const hideLoading = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.name]), + await ElMessageBox.confirm($t('ui.actionMessage.deleting', [row.name]), { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteDeliveryExpress(row.id as number); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); - onRefresh(); - } finally { - hideLoading.close(); - } + await deleteDeliveryExpress(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); + onRefresh(); } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-ele/src/views/mall/trade/delivery/expressTemplate/index.vue b/apps/web-ele/src/views/mall/trade/delivery/expressTemplate/index.vue index b3b68be7..594d2869 100644 --- a/apps/web-ele/src/views/mall/trade/delivery/expressTemplate/index.vue +++ b/apps/web-ele/src/views/mall/trade/delivery/expressTemplate/index.vue @@ -4,7 +4,7 @@ import type { MallDeliveryExpressTemplateApi } from '#/api/mall/trade/delivery/e import { Page, useVbenModal } from '@vben/common-ui'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -40,16 +40,14 @@ function handleEdit(row: MallDeliveryExpressTemplateApi.ExpressTemplate) { async function handleDelete( row: MallDeliveryExpressTemplateApi.ExpressTemplate, ) { - const hideLoading = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.name]), + await ElMessageBox.confirm($t('ui.actionMessage.deleting', [row.name]), { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteDeliveryExpressTemplate(row.id as number); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); - onRefresh(); - } finally { - hideLoading.close(); - } + await deleteDeliveryExpressTemplate(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); + onRefresh(); } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-ele/src/views/mall/trade/delivery/pickUpOrder/data.ts b/apps/web-ele/src/views/mall/trade/delivery/pickUpOrder/data.ts index a0208038..8b03d72c 100644 --- a/apps/web-ele/src/views/mall/trade/delivery/pickUpOrder/data.ts +++ b/apps/web-ele/src/views/mall/trade/delivery/pickUpOrder/data.ts @@ -35,10 +35,8 @@ export function useGridFormSchema(): VbenFormSchema[] { component: 'ApiSelect', componentProps: { api: getSimpleDeliveryPickUpStoreList, - fieldNames: { - label: 'name', - value: 'id', - }, + labelField: 'name', + valueField: 'id', }, dependencies: { triggerFields: ['deliveryType'], diff --git a/apps/web-ele/src/views/mall/trade/delivery/pickUpStore/data.ts b/apps/web-ele/src/views/mall/trade/delivery/pickUpStore/data.ts index ac3e0828..86b08471 100644 --- a/apps/web-ele/src/views/mall/trade/delivery/pickUpStore/data.ts +++ b/apps/web-ele/src/views/mall/trade/delivery/pickUpStore/data.ts @@ -51,7 +51,9 @@ export function useFormSchema(): VbenFormSchema[] { component: 'ApiTreeSelect', componentProps: { api: () => getAreaTree(), - fieldNames: { label: 'name', value: 'id', children: 'children' }, + labelField: 'name', + valueField: 'id', + childrenField: 'children', }, }, { @@ -130,7 +132,8 @@ export function useBindFormSchema(): VbenFormSchema[] { rules: 'required', componentProps: { api: () => getSimpleUserList(), - fieldNames: { label: 'nickname', value: 'id' }, + labelField: 'nickname', + valueField: 'id', mode: 'tags', allowClear: true, }, diff --git a/apps/web-ele/src/views/mall/trade/delivery/pickUpStore/index.vue b/apps/web-ele/src/views/mall/trade/delivery/pickUpStore/index.vue index 57214fb3..bd471629 100644 --- a/apps/web-ele/src/views/mall/trade/delivery/pickUpStore/index.vue +++ b/apps/web-ele/src/views/mall/trade/delivery/pickUpStore/index.vue @@ -4,7 +4,7 @@ import type { MallDeliveryPickUpStoreApi } from '#/api/mall/trade/delivery/pickU import { Page, useVbenModal } from '@vben/common-ui'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -49,16 +49,14 @@ function handleBind(row: MallDeliveryPickUpStoreApi.PickUpStore) { /** 删除门店 */ async function handleDelete(row: MallDeliveryPickUpStoreApi.PickUpStore) { - const hideLoading = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.name]), + await ElMessageBox.confirm('确定要删除该门店吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteDeliveryPickUpStore(row.id as number); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); - onRefresh(); - } finally { - hideLoading.close(); - } + await deleteDeliveryPickUpStore(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); + onRefresh(); } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-ele/src/views/mall/trade/order/modules/delevery-form.vue b/apps/web-ele/src/views/mall/trade/order/modules/delevery-form.vue index 92fd9fec..54081616 100644 --- a/apps/web-ele/src/views/mall/trade/order/modules/delevery-form.vue +++ b/apps/web-ele/src/views/mall/trade/order/modules/delevery-form.vue @@ -54,10 +54,8 @@ const [Form, formApi] = useVbenForm({ component: 'ApiSelect', componentProps: { api: getSimpleDeliveryExpressList, - fieldNames: { - label: 'name', - value: 'id', - }, + labelField: 'name', + valueField: 'id', }, dependencies: { triggerFields: ['expressType'], diff --git a/apps/web-ele/src/views/mall/trade/order/modules/detail.vue b/apps/web-ele/src/views/mall/trade/order/modules/detail.vue new file mode 100644 index 00000000..b7536688 --- /dev/null +++ b/apps/web-ele/src/views/mall/trade/order/modules/detail.vue @@ -0,0 +1,561 @@ + + + diff --git a/apps/web-ele/src/views/mall/trade/order/modules/update-address-form.vue b/apps/web-ele/src/views/mall/trade/order/modules/update-address-form.vue new file mode 100644 index 00000000..c68d5fe7 --- /dev/null +++ b/apps/web-ele/src/views/mall/trade/order/modules/update-address-form.vue @@ -0,0 +1,131 @@ + + + diff --git a/apps/web-ele/src/views/mall/trade/order/modules/update-price-form.vue b/apps/web-ele/src/views/mall/trade/order/modules/update-price-form.vue new file mode 100644 index 00000000..1728944c --- /dev/null +++ b/apps/web-ele/src/views/mall/trade/order/modules/update-price-form.vue @@ -0,0 +1,134 @@ + + + diff --git a/apps/web-ele/src/views/mall/trade/order/modules/update-remark-form.vue b/apps/web-ele/src/views/mall/trade/order/modules/update-remark-form.vue new file mode 100644 index 00000000..b84767ca --- /dev/null +++ b/apps/web-ele/src/views/mall/trade/order/modules/update-remark-form.vue @@ -0,0 +1,94 @@ + + + diff --git a/apps/web-ele/src/views/member/group/index.vue b/apps/web-ele/src/views/member/group/index.vue index 69ae7a4e..4bfbe132 100644 --- a/apps/web-ele/src/views/member/group/index.vue +++ b/apps/web-ele/src/views/member/group/index.vue @@ -4,7 +4,7 @@ import type { MemberGroupApi } from '#/api/member/group'; import { Page, useVbenModal } from '@vben/common-ui'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { deleteGroup, getGroupPage } from '#/api/member/group'; @@ -35,17 +35,14 @@ function handleEdit(row: MemberGroupApi.Group) { /** 删除分组 */ async function handleDelete(row: MemberGroupApi.Group) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.name]), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该分组吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteGroup(row.id as number); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteGroup(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); + onRefresh(); } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-ele/src/views/member/level/index.vue b/apps/web-ele/src/views/member/level/index.vue index ede8ea00..3f3e9e55 100644 --- a/apps/web-ele/src/views/member/level/index.vue +++ b/apps/web-ele/src/views/member/level/index.vue @@ -4,7 +4,7 @@ import type { MemberLevelApi } from '#/api/member/level'; import { Page, useVbenModal } from '@vben/common-ui'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { deleteLevel, getLevelList } from '#/api/member/level'; @@ -35,17 +35,14 @@ function handleEdit(row: MemberLevelApi.Level) { /** 删除等级 */ async function handleDelete(row: MemberLevelApi.Level) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.name]), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该等级吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteLevel(row.id as number); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteLevel(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); + onRefresh(); } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-ele/src/views/member/tag/index.vue b/apps/web-ele/src/views/member/tag/index.vue index 08ed6c91..7c88b9ca 100644 --- a/apps/web-ele/src/views/member/tag/index.vue +++ b/apps/web-ele/src/views/member/tag/index.vue @@ -4,7 +4,7 @@ import type { MemberTagApi } from '#/api/member/tag'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { deleteMemberTag, getMemberTagPage } from '#/api/member/tag'; @@ -35,17 +35,14 @@ function handleEdit(row: MemberTagApi.Tag) { /** 删除会员标签 */ async function handleDelete(row: MemberTagApi.Tag) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.name]), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该会员标签吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteMemberTag(row.id as number); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteMemberTag(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); + onRefresh(); } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-ele/src/views/member/user/data.ts b/apps/web-ele/src/views/member/user/data.ts index 12c5353a..aaadde5f 100644 --- a/apps/web-ele/src/views/member/user/data.ts +++ b/apps/web-ele/src/views/member/user/data.ts @@ -86,7 +86,9 @@ export function useFormSchema(): VbenFormSchema[] { label: '所在地', componentProps: { api: () => getAreaTree(), - fieldNames: { label: 'name', value: 'id', children: 'children' }, + labelField: 'name', + valueField: 'id', + childrenField: 'children', }, }, { @@ -95,7 +97,8 @@ export function useFormSchema(): VbenFormSchema[] { label: '用户标签', componentProps: { api: () => getSimpleTagList(), - fieldNames: { label: 'name', value: 'id' }, + labelField: 'name', + valueField: 'id', mode: 'multiple', }, }, @@ -105,7 +108,8 @@ export function useFormSchema(): VbenFormSchema[] { label: '用户分组', componentProps: { api: () => getSimpleGroupList(), - fieldNames: { label: 'name', value: 'id' }, + labelField: 'name', + valueField: 'id', }, }, { @@ -151,7 +155,8 @@ export function useGridFormSchema(): VbenFormSchema[] { component: 'ApiSelect', componentProps: { api: () => getSimpleTagList(), - fieldNames: { label: 'name', value: 'id' }, + labelField: 'name', + valueField: 'id', mode: 'multiple', }, }, @@ -161,7 +166,8 @@ export function useGridFormSchema(): VbenFormSchema[] { component: 'ApiSelect', componentProps: { api: () => getSimpleLevelList(), - fieldNames: { label: 'name', value: 'id' }, + labelField: 'name', + valueField: 'id', }, }, { @@ -170,7 +176,8 @@ export function useGridFormSchema(): VbenFormSchema[] { component: 'ApiSelect', componentProps: { api: () => getSimpleGroupList(), - fieldNames: { label: 'name', value: 'id' }, + labelField: 'name', + valueField: 'id', }, }, ]; @@ -290,7 +297,8 @@ export function useLeavelFormSchema(): VbenFormSchema[] { component: 'ApiSelect', componentProps: { api: () => getSimpleLevelList(), - fieldNames: { label: 'name', value: 'id' }, + labelField: 'name', + valueField: 'id', }, }, { diff --git a/apps/web-ele/src/views/pay/app/index.vue b/apps/web-ele/src/views/pay/app/index.vue index e5547027..ce68d0b1 100644 --- a/apps/web-ele/src/views/pay/app/index.vue +++ b/apps/web-ele/src/views/pay/app/index.vue @@ -4,7 +4,7 @@ import type { PayAppApi } from '#/api/pay/app/index'; import { confirm, DocAlert, Page, useVbenModal } from '@vben/common-ui'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { changeAppStatus, deleteApp, getAppPage } from '#/api/pay/app/index'; @@ -39,17 +39,14 @@ function handleEdit(row: Required) { } async function handleDelete(row: Required) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.name]), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该应用吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteApp(row.id as number); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteApp(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); + onRefresh(); } /** 更新状态 */ diff --git a/apps/web-ele/src/views/pay/wallet/rechargePackage/index.vue b/apps/web-ele/src/views/pay/wallet/rechargePackage/index.vue index e4d9ed3f..9212b783 100644 --- a/apps/web-ele/src/views/pay/wallet/rechargePackage/index.vue +++ b/apps/web-ele/src/views/pay/wallet/rechargePackage/index.vue @@ -3,7 +3,7 @@ import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import { Page, useVbenModal } from '@vben/common-ui'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -37,17 +37,14 @@ function handleEdit(row: any) { /** 删除套餐 */ async function handleDelete(row: any) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.name]), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该充值套餐吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deletePackage(row.id as number); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deletePackage(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); + onRefresh(); } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-ele/src/views/system/dept/index.vue b/apps/web-ele/src/views/system/dept/index.vue index 5497dbf7..6672671b 100644 --- a/apps/web-ele/src/views/system/dept/index.vue +++ b/apps/web-ele/src/views/system/dept/index.vue @@ -11,7 +11,7 @@ import { onMounted, ref } from 'vue'; import { Page, useVbenModal } from '@vben/common-ui'; import { Plus } from '@vben/icons'; -import { ElButton, ElLoading, ElMessage } from 'element-plus'; +import { ElButton, ElMessage, ElMessageBox } from 'element-plus'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { deleteDept, getDeptList } from '#/api/system/dept'; @@ -62,19 +62,14 @@ function onEdit(row: SystemDeptApi.Dept) { /** 删除部门 */ async function onDelete(row: SystemDeptApi.Dept) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.name]), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该部门吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteDept(row.id as number); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); - onRefresh(); - } catch { - // 异常处理 - } finally { - loadingInstance.close(); - } + await deleteDept(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); + onRefresh(); } /** 表格操作按钮的回调函数 */ diff --git a/apps/web-ele/src/views/system/dict/modules/data-grid.vue b/apps/web-ele/src/views/system/dict/modules/data-grid.vue index feac8d7d..1f62c829 100644 --- a/apps/web-ele/src/views/system/dict/modules/data-grid.vue +++ b/apps/web-ele/src/views/system/dict/modules/data-grid.vue @@ -10,7 +10,7 @@ import { ref, watch } from 'vue'; import { useVbenModal } from '@vben/common-ui'; import { downloadFileFromBlobPart, isEmpty } from '@vben/utils'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -59,32 +59,26 @@ function onEdit(row: any) { /** 删除字典数据 */ async function onDelete(row: any) { - const loadingInstance = ElLoading.service({ - text: $t('common.processing'), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该字典数据吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteDictData(row.id); - ElMessage.success($t('common.operationSuccess')); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteDictData(row.id); + ElMessage.success($t('common.operationSuccess')); + onRefresh(); } /** 批量删除字典数据 */ async function onDeleteBatch() { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting'), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该字典数据吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteDictDataList(checkedIds.value); - ElMessage.success($t('ui.actionMessage.deleteSuccess')); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteDictDataList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); } const checkedIds = ref([]); diff --git a/apps/web-ele/src/views/system/dict/modules/type-grid.vue b/apps/web-ele/src/views/system/dict/modules/type-grid.vue index bc769e8f..76eb3b7a 100644 --- a/apps/web-ele/src/views/system/dict/modules/type-grid.vue +++ b/apps/web-ele/src/views/system/dict/modules/type-grid.vue @@ -10,7 +10,7 @@ import { ref } from 'vue'; import { useVbenModal } from '@vben/common-ui'; import { downloadFileFromBlobPart, isEmpty } from '@vben/utils'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -54,32 +54,26 @@ function onEdit(row: any) { /** 删除字典类型 */ async function onDelete(row: SystemDictTypeApi.DictType) { - const loadingInstance = ElLoading.service({ - text: $t('common.processing'), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该字典类型吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteDictType(row.id as number); - ElMessage.success($t('common.operationSuccess')); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteDictType(row.id as number); + ElMessage.success($t('common.operationSuccess')); + onRefresh(); } /** 批量删除字典类型 */ async function onDeleteBatch() { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting'), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该字典类型吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteDictTypeList(checkedIds.value); - ElMessage.success($t('ui.actionMessage.deleteSuccess')); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteDictTypeList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); } const checkedIds = ref([]); diff --git a/apps/web-ele/src/views/system/mail/account/index.vue b/apps/web-ele/src/views/system/mail/account/index.vue index ec5086fe..cad8e037 100644 --- a/apps/web-ele/src/views/system/mail/account/index.vue +++ b/apps/web-ele/src/views/system/mail/account/index.vue @@ -10,7 +10,7 @@ import { ref } from 'vue'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { isEmpty } from '@vben/utils'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -45,32 +45,26 @@ function onEdit(row: SystemMailAccountApi.MailAccount) { /** 删除邮箱账号 */ async function onDelete(row: SystemMailAccountApi.MailAccount) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.mail]), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该邮箱账号吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteMailAccount(row.id as number); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.mail])); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteMailAccount(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.mail])); + onRefresh(); } /** 批量删除邮箱账号 */ async function onDeleteBatch() { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting'), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该邮箱账号吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteMailAccountList(checkedIds.value); - ElMessage.success($t('ui.actionMessage.deleteSuccess')); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteMailAccountList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); } const checkedIds = ref([]); diff --git a/apps/web-ele/src/views/system/mail/template/index.vue b/apps/web-ele/src/views/system/mail/template/index.vue index 4ff1c606..505eff17 100644 --- a/apps/web-ele/src/views/system/mail/template/index.vue +++ b/apps/web-ele/src/views/system/mail/template/index.vue @@ -11,7 +11,7 @@ import { onMounted, ref } from 'vue'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { isEmpty } from '@vben/utils'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { getSimpleMailAccountList } from '#/api/system/mail/account'; @@ -65,32 +65,26 @@ function onSend(row: SystemMailTemplateApi.MailTemplate) { /** 删除邮件模板 */ async function onDelete(row: SystemMailTemplateApi.MailTemplate) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.name]), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该邮件模板吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteMailTemplate(row.id as number); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteMailTemplate(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); + onRefresh(); } /** 批量删除邮件模板 */ async function onDeleteBatch() { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting'), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该邮件模板吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteMailTemplateList(checkedIds.value); - ElMessage.success($t('ui.actionMessage.deleteSuccess')); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteMailTemplateList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); } const checkedIds = ref([]); diff --git a/apps/web-ele/src/views/system/menu/index.vue b/apps/web-ele/src/views/system/menu/index.vue index 50bfb50f..a9dffccc 100644 --- a/apps/web-ele/src/views/system/menu/index.vue +++ b/apps/web-ele/src/views/system/menu/index.vue @@ -10,7 +10,7 @@ import { ref } from 'vue'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { IconifyIcon, Plus } from '@vben/icons'; -import { ElButton, ElLoading, ElMessage } from 'element-plus'; +import { ElButton, ElMessage, ElMessageBox } from 'element-plus'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { deleteMenu, getMenuList } from '#/api/system/menu'; @@ -47,19 +47,14 @@ function onEdit(row: SystemMenuApi.Menu) { /** 删除菜单 */ async function onDelete(row: SystemMenuApi.Menu) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.name]), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该菜单吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteMenu(row.id as number); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); - onRefresh(); - } catch { - // 异常处理 - } finally { - loadingInstance.close(); - } + await deleteMenu(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); + onRefresh(); } /** 表格操作按钮的回调函数 */ diff --git a/apps/web-ele/src/views/system/notice/index.vue b/apps/web-ele/src/views/system/notice/index.vue index 150efc40..2835e8b5 100644 --- a/apps/web-ele/src/views/system/notice/index.vue +++ b/apps/web-ele/src/views/system/notice/index.vue @@ -10,7 +10,7 @@ import { ref } from 'vue'; import { Page, useVbenModal } from '@vben/common-ui'; import { isEmpty } from '@vben/utils'; -import { ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -46,36 +46,26 @@ function onEdit(row: SystemNoticeApi.Notice) { /** 删除公告 */ async function onDelete(row: SystemNoticeApi.Notice) { - const loadingInstance = ElMessage({ - message: $t('ui.actionMessage.deleting', [row.title]), - type: 'info', - duration: 0, + await ElMessageBox.confirm('确定要删除该公告吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteNotice(row.id as number); - loadingInstance.close(); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.title])); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteNotice(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.title])); + onRefresh(); } /** 批量删除公告 */ async function onDeleteBatch() { - const loadingInstance = ElMessage({ - message: $t('ui.actionMessage.deleting'), - type: 'info', - duration: 0, + await ElMessageBox.confirm('确定要删除该公告吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteNoticeList(checkedIds.value); - loadingInstance.close(); - ElMessage.success($t('ui.actionMessage.deleteSuccess')); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteNoticeList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); } const checkedIds = ref([]); diff --git a/apps/web-ele/src/views/system/oauth2/client/index.vue b/apps/web-ele/src/views/system/oauth2/client/index.vue index 4329a8a4..61530839 100644 --- a/apps/web-ele/src/views/system/oauth2/client/index.vue +++ b/apps/web-ele/src/views/system/oauth2/client/index.vue @@ -10,7 +10,7 @@ import { ref } from 'vue'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { isEmpty } from '@vben/utils'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -45,32 +45,26 @@ function onEdit(row: SystemOAuth2ClientApi.OAuth2Client) { /** 删除 OAuth2 客户端 */ async function onDelete(row: SystemOAuth2ClientApi.OAuth2Client) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.name]), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该 OAuth2 客户端吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteOAuth2Client(row.id as number); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteOAuth2Client(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); + onRefresh(); } /** 批量删除 OAuth2 客户端 */ async function onDeleteBatch() { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting'), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该 OAuth2 客户端吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteOAuth2ClientList(checkedIds.value); - ElMessage.success($t('ui.actionMessage.deleteSuccess')); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteOAuth2ClientList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); } const checkedIds = ref([]); diff --git a/apps/web-ele/src/views/system/oauth2/token/index.vue b/apps/web-ele/src/views/system/oauth2/token/index.vue index fabc8de0..e0edcf38 100644 --- a/apps/web-ele/src/views/system/oauth2/token/index.vue +++ b/apps/web-ele/src/views/system/oauth2/token/index.vue @@ -7,7 +7,7 @@ import type { SystemOAuth2TokenApi } from '#/api/system/oauth2/token'; import { DocAlert, Page } from '@vben/common-ui'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -25,19 +25,14 @@ function onRefresh() { /** 删除 OAuth2 令牌 */ async function onDelete(row: SystemOAuth2TokenApi.OAuth2Token) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', ['令牌']), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该令牌吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteOAuth2Token(row.accessToken); - ElMessage.success($t('ui.actionMessage.operationSuccess')); - onRefresh(); - } catch { - // 异常处理 - } finally { - loadingInstance.close(); - } + await deleteOAuth2Token(row.accessToken); + ElMessage.success($t('ui.actionMessage.operationSuccess')); + onRefresh(); } /** 表格操作按钮的回调函数 */ diff --git a/apps/web-ele/src/views/system/operatelog/data.ts b/apps/web-ele/src/views/system/operatelog/data.ts index e7c74247..d23d210f 100644 --- a/apps/web-ele/src/views/system/operatelog/data.ts +++ b/apps/web-ele/src/views/system/operatelog/data.ts @@ -18,7 +18,7 @@ export function useGridFormSchema(): VbenFormSchema[] { component: 'ApiSelect', componentProps: { api: getSimpleUserList, - fieldNames: { + props: { label: 'nickname', value: 'id', }, diff --git a/apps/web-ele/src/views/system/post/index.vue b/apps/web-ele/src/views/system/post/index.vue index 16c24a83..ba3d5364 100644 --- a/apps/web-ele/src/views/system/post/index.vue +++ b/apps/web-ele/src/views/system/post/index.vue @@ -10,7 +10,7 @@ import { ref } from 'vue'; import { Page, useVbenModal } from '@vben/common-ui'; import { downloadFileFromBlobPart, isEmpty } from '@vben/utils'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -52,32 +52,26 @@ function onEdit(row: SystemPostApi.Post) { /** 删除岗位 */ async function onDelete(row: SystemPostApi.Post) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.name]), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该岗位吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deletePost(row.id as number); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deletePost(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); + onRefresh(); } /** 批量删除岗位 */ async function onDeleteBatch() { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting'), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该岗位吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deletePostList(checkedIds.value); - ElMessage.success($t('ui.actionMessage.deleteSuccess')); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deletePostList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); } const checkedIds = ref([]); diff --git a/apps/web-ele/src/views/system/role/index.vue b/apps/web-ele/src/views/system/role/index.vue index bc4fb531..6efc6068 100644 --- a/apps/web-ele/src/views/system/role/index.vue +++ b/apps/web-ele/src/views/system/role/index.vue @@ -11,7 +11,7 @@ import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { Download, Plus } from '@vben/icons'; import { downloadFileFromBlobPart, isEmpty } from '@vben/utils'; -import { ElButton, ElLoading, ElMessage } from 'element-plus'; +import { ElButton, ElMessage, ElMessageBox } from 'element-plus'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -66,32 +66,26 @@ function onCreate() { /** 删除角色 */ async function onDelete(row: SystemRoleApi.Role) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.name]), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该角色吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteRole(row.id as number); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteRole(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); + onRefresh(); } /** 批量删除角色 */ async function onDeleteBatch() { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting'), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该角色吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteRoleList(checkedIds.value); - ElMessage.success($t('ui.actionMessage.deleteSuccess')); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteRoleList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); } const checkedIds = ref([]); diff --git a/apps/web-ele/src/views/system/sms/channel/index.vue b/apps/web-ele/src/views/system/sms/channel/index.vue index 98e644f9..0ba7e318 100644 --- a/apps/web-ele/src/views/system/sms/channel/index.vue +++ b/apps/web-ele/src/views/system/sms/channel/index.vue @@ -10,7 +10,7 @@ import { ref } from 'vue'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { downloadFileFromBlobPart, isEmpty } from '@vben/utils'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -52,32 +52,26 @@ function onEdit(row: SystemSmsChannelApi.SmsChannel) { /** 删除短信渠道 */ async function onDelete(row: SystemSmsChannelApi.SmsChannel) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.signature]), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该短信渠道吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteSmsChannel(row.id as number); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.signature])); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteSmsChannel(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.signature])); + onRefresh(); } /** 批量删除短信渠道 */ async function onDeleteBatch() { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting'), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该短信渠道吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteSmsChannelList(checkedIds.value); - ElMessage.success($t('ui.actionMessage.deleteSuccess')); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteSmsChannelList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); } const checkedIds = ref([]); diff --git a/apps/web-ele/src/views/system/sms/template/index.vue b/apps/web-ele/src/views/system/sms/template/index.vue index 0b1ea4b6..4e8a1567 100644 --- a/apps/web-ele/src/views/system/sms/template/index.vue +++ b/apps/web-ele/src/views/system/sms/template/index.vue @@ -10,7 +10,7 @@ import { ref } from 'vue'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { downloadFileFromBlobPart, isEmpty } from '@vben/utils'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -63,32 +63,26 @@ function onSend(row: SystemSmsTemplateApi.SmsTemplate) { /** 删除短信模板 */ async function onDelete(row: SystemSmsTemplateApi.SmsTemplate) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.name]), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该短信模板吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteSmsTemplate(row.id as number); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteSmsTemplate(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); + onRefresh(); } /** 批量删除短信模板 */ async function onDeleteBatch() { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting'), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该短信模板吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteSmsTemplateList(checkedIds.value); - ElMessage.success($t('ui.actionMessage.deleteSuccess')); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteSmsTemplateList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); } const checkedIds = ref([]); diff --git a/apps/web-ele/src/views/system/social/client/index.vue b/apps/web-ele/src/views/system/social/client/index.vue index f761ba02..2e85a190 100644 --- a/apps/web-ele/src/views/system/social/client/index.vue +++ b/apps/web-ele/src/views/system/social/client/index.vue @@ -10,7 +10,7 @@ import { ref } from 'vue'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { isEmpty } from '@vben/utils'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -45,32 +45,26 @@ function onEdit(row: SystemSocialClientApi.SocialClient) { /** 删除社交客户端 */ async function onDelete(row: SystemSocialClientApi.SocialClient) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.name]), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该社交客户端吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteSocialClient(row.id as number); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteSocialClient(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); + onRefresh(); } /** 批量删除社交客户端 */ async function onDeleteBatch() { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting'), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该社交客户端吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteSocialClientList(checkedIds.value); - ElMessage.success($t('ui.actionMessage.deleteSuccess')); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteSocialClientList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); } const checkedIds = ref([]); diff --git a/apps/web-ele/src/views/system/tenant/index.vue b/apps/web-ele/src/views/system/tenant/index.vue index b2c0aeff..35005c0e 100644 --- a/apps/web-ele/src/views/system/tenant/index.vue +++ b/apps/web-ele/src/views/system/tenant/index.vue @@ -11,7 +11,7 @@ import { onMounted, ref } from 'vue'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { downloadFileFromBlobPart, isEmpty } from '@vben/utils'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -64,34 +64,26 @@ function onEdit(row: SystemTenantApi.Tenant) { /** 删除租户 */ async function onDelete(row: SystemTenantApi.Tenant) { - const loading = ElLoading.service({ - lock: true, - text: $t('ui.actionMessage.deleting', [row.name]), - background: 'rgba(0, 0, 0, 0.7)', + await ElMessageBox.confirm('确定要删除该租户吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteTenant(row.id as number); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); - onRefresh(); - } finally { - loading.close(); - } + await deleteTenant(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); + onRefresh(); } /** 批量删除租户 */ async function onDeleteBatch() { - const loading = ElLoading.service({ - lock: true, - text: $t('ui.actionMessage.deleting'), - background: 'rgba(0, 0, 0, 0.7)', + await ElMessageBox.confirm('确定要删除该租户吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteTenantList(checkedIds.value); - ElMessage.success($t('ui.actionMessage.deleteSuccess')); - onRefresh(); - } finally { - loading.close(); - } + await deleteTenantList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); } const checkedIds = ref([]); diff --git a/apps/web-ele/src/views/system/tenantPackage/index.vue b/apps/web-ele/src/views/system/tenantPackage/index.vue index 2d4ed2ac..b4af443f 100644 --- a/apps/web-ele/src/views/system/tenantPackage/index.vue +++ b/apps/web-ele/src/views/system/tenantPackage/index.vue @@ -10,7 +10,7 @@ import { ref } from 'vue'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { isEmpty } from '@vben/utils'; -import { ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -45,36 +45,26 @@ function onEdit(row: SystemTenantPackageApi.TenantPackage) { /** 删除租户套餐 */ async function onDelete(row: SystemTenantPackageApi.TenantPackage) { - const loadingInstance = ElMessage({ - message: $t('ui.actionMessage.deleting', [row.name]), - type: 'info', - duration: 0, + await ElMessageBox.confirm('确定要删除该租户套餐吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteTenantPackage(row.id as number); - loadingInstance.close(); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteTenantPackage(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); + onRefresh(); } /** 批量删除租户套餐 */ async function onDeleteBatch() { - const loadingInstance = ElMessage({ - message: $t('ui.actionMessage.deleting'), - type: 'info', - duration: 0, + await ElMessageBox.confirm('确定要删除该租户套餐吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteTenantPackageList(checkedIds.value); - loadingInstance.close(); - ElMessage.success($t('ui.actionMessage.deleteSuccess')); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteTenantPackageList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); } const checkedIds = ref([]); diff --git a/apps/web-ele/src/views/system/user/index.vue b/apps/web-ele/src/views/system/user/index.vue index e0a8b6f4..f74ae90d 100644 --- a/apps/web-ele/src/views/system/user/index.vue +++ b/apps/web-ele/src/views/system/user/index.vue @@ -8,7 +8,7 @@ import { ref } from 'vue'; import { confirm, DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { downloadFileFromBlobPart, isEmpty } from '@vben/utils'; -import { ElLoading, ElMessage } from 'element-plus'; +import { ElMessage, ElMessageBox } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -83,32 +83,26 @@ function onEdit(row: SystemUserApi.User) { /** 删除用户 */ async function onDelete(row: SystemUserApi.User) { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting', [row.username]), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该用户吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteUser(row.id as number); - ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.username])); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteUser(row.id as number); + ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.username])); + onRefresh(); } /** 批量删除用户 */ async function onDeleteBatch() { - const loadingInstance = ElLoading.service({ - text: $t('ui.actionMessage.deleting'), - fullscreen: true, + await ElMessageBox.confirm('确定要删除该用户吗?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', }); - try { - await deleteUserList(checkedIds.value); - ElMessage.success($t('ui.actionMessage.deleteSuccess')); - onRefresh(); - } finally { - loadingInstance.close(); - } + await deleteUserList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); } const checkedIds = ref([]); diff --git a/packages/@core/base/shared/src/utils/date.ts b/packages/@core/base/shared/src/utils/date.ts index b66654d0..8cc41b41 100644 --- a/packages/@core/base/shared/src/utils/date.ts +++ b/packages/@core/base/shared/src/utils/date.ts @@ -26,6 +26,15 @@ export function formatDateTime(time: Date | number | string | undefined) { return formatDate(time, 'YYYY-MM-DD HH:mm:ss'); } +export function formatDate2(date: Date, format?: string): string { + // 日期不存在,则返回空 + if (!date) { + return ''; + } + // 日期存在,则进行格式化 + return date ? dayjs(date).format(format ?? 'YYYY-MM-DD HH:mm:ss') : ''; +} + export function isDate(value: any): value is Date { return value instanceof Date; } diff --git a/packages/@core/base/shared/src/utils/index.ts b/packages/@core/base/shared/src/utils/index.ts index 7a22c972..0323d031 100644 --- a/packages/@core/base/shared/src/utils/index.ts +++ b/packages/@core/base/shared/src/utils/index.ts @@ -22,3 +22,18 @@ export { default as cloneDeep } from 'lodash.clonedeep'; export { default as get } from 'lodash.get'; export { default as isEqual } from 'lodash.isequal'; export { default as set } from 'lodash.set'; + +/** + * 构建排序字段 + * @param prop 字段名称 + * @param order 顺序 + */ +export const buildSortingField = ({ + prop, + order, +}: { + order: 'ascending' | 'descending'; + prop: string; +}) => { + return { field: prop, order: order === 'ascending' ? 'asc' : 'desc' }; +};