叶静 1 долоо хоног өмнө
parent
commit
3f7ab63c58

+ 20 - 1
src/app/admin/views/auth/role/edit.vue

@@ -5,7 +5,7 @@
         <el-form-item :label="t('modules.auth.roleName')" prop="name">
           <el-input v-model="form.model.name" :placeholder="t('modules.auth.roleRequired')"></el-input>
         </el-form-item>
-        <el-form-item :label="t('modules.auth.rolePermissions')">
+        <el-form-item :label="t('modules.auth.rolePermissions')" prop="permissionIds">
           <sa-access type="select" :isChangeParentId="isChangeParentId"
             :role_id="props.modal.params.type === 'edit' ? props.modal.params.id : null" :multiple="true"
             v-model="form.model.permissionIds">
@@ -50,6 +50,19 @@ const form = reactive({
   },
   rules: {
     name: [{ required: true, message: '请输入角色名称', trigger: 'blur' }],
+    permissionIds: [
+      {
+        required: true,
+        validator: (rule, value, callback) => {
+          if (!value || !Array.isArray(value) || value.length === 0) {
+            callback(new Error('请至少选择一个权限'));
+          } else {
+            callback();
+          }
+        },
+        trigger: 'change'
+      }
+    ],
   },
 });
 
@@ -99,6 +112,12 @@ function confirm() {
   unref(formRef).validate(async (valid) => {
     if (!valid) return;
 
+    // 额外检查权限是否为空
+    if (!form.model.permissionIds || !Array.isArray(form.model.permissionIds) || form.model.permissionIds.length === 0) {
+      ElMessage.warning('请至少选择一个权限');
+      return;
+    }
+
     try {
       let submitForm = cloneDeep(form.model);
       console.log('提交的表单数据:', submitForm);

+ 1 - 8
src/app/admin/views/payment/components/PaymentLimitModal.vue

@@ -88,7 +88,7 @@
                                         @confirm="handleDeleteGoods(row)">
                                         <template #reference>
                                             <el-button class="is-link" type="danger">{{ t('common.delete')
-                                            }}</el-button>
+                                                }}</el-button>
                                         </template>
                                     </el-popconfirm>
                                 </template>
@@ -99,12 +99,6 @@
             </div>
         </el-main>
 
-        <sa-view-bar>
-            <template #right>
-                <sa-pagination :pageData="pageData" @updateFn="getGoodsList" />
-            </template>
-        </sa-view-bar>
-
         <el-footer class="sa-footer--submit">
             <el-button @click="handleCancel">{{ t('common.close') }}</el-button>
         </el-footer>
@@ -193,7 +187,6 @@ async function getGoodsList() {
             // 根据真实数据结构处理
             if (Array.isArray(data.list)) {
                 tableData.value = data.list;
-                pageData.total = data.list.length;
 
                 // 同时更新金额区间配置
                 if (data.miniPrice !== undefined) {

+ 1 - 1
src/app/shop/admin/content/notification/index.vue

@@ -219,7 +219,7 @@ const handleSearch = () => {
 const handleReset = () => {
   // 由于使用了 v-model,currentSearchParams 会自动清空
   // 直接调用 getData,会自动使用当前的搜索条件
-  getData(1);
+  getData(1, {});
 };
 
 onMounted(() => {

+ 11 - 2
src/app/shop/admin/finance/commission/index.vue

@@ -10,7 +10,7 @@
       <div class="sa-title sa-flex sa-row-between">
         <div class="label sa-flex">{{ t('modules.commission.title') }}</div>
         <div>
-          <el-button class="sa-button-refresh" icon="RefreshRight" @click="getData()"></el-button>
+          <el-button class="sa-button-refresh" icon="RefreshRight" @click="handleRefresh"></el-button>
           <el-button icon="Download" type="primary" :loading="exportLoading" :disabled="exportLoading"
             @click="exportRecords">
             {{ exportLoading ? t('modules.commission.exporting') : t('modules.commission.exportRecords') }}
@@ -180,6 +180,13 @@ function handleReset() {
   getData(1, {});
 }
 
+// 刷新处理 - 保持当前筛选条件
+function handleRefresh() {
+  // 使用当前搜索条件刷新数据
+  const finalSearchParams = currentSearchParams.value || {};
+  getData(pageData.page, finalSearchParams);
+}
+
 // 列表
 const table = reactive({
   data: [],
@@ -281,7 +288,9 @@ async function getData(page, searchParams = null) {
 function fieldFilter({ prop, order }) {
   table.order = order == 'ascending' ? 'asc' : 'desc';
   table.sort = prop;
-  getData();
+  // 使用当前搜索条件进行排序
+  const finalSearchParams = currentSearchParams.value || {};
+  getData(pageData.page, finalSearchParams);
 }
 
 // 查看用户详情

+ 24 - 2
src/app/shop/admin/finance/recharge/index.vue

@@ -18,7 +18,7 @@
       <div class="sa-title sa-flex sa-row-between">
         <div class="label sa-flex">{{ t('modules.recharge.title') }}</div>
         <div>
-          <el-button class="sa-button-refresh" icon="RefreshRight" @click="getData()"></el-button>
+          <el-button class="sa-button-refresh" icon="RefreshRight" @click="handleRefresh"></el-button>
           <el-button icon="Download" type="primary" :loading="exportLoading" :disabled="exportLoading"
             @click="exportRecords">
             {{ exportLoading ? t('modules.recharge.exporting') : t('modules.recharge.exportRecords') }}
@@ -294,11 +294,33 @@ const handleReset = () => {
   getData(1, statusParams);
 };
 
+// 刷新处理 - 保持当前筛选条件
+const handleRefresh = () => {
+  // 获取当前tab的状态参数
+  let statusParams = {};
+  if (currentStatus.value !== 'all') {
+    statusParams.status = parseInt(currentStatus.value);
+  }
+
+  // 整合搜索条件和状态筛选
+  const allParams = { ...currentSearchParams.value, ...statusParams };
+  getData(pageData.page, allParams);
+};
+
 // table 字段排序
 function fieldFilter({ prop, order }) {
   table.order = order == 'ascending' ? 'asc' : 'desc';
   table.sort = prop;
-  getData();
+
+  // 获取当前tab的状态参数
+  let statusParams = {};
+  if (currentStatus.value !== 'all') {
+    statusParams.status = parseInt(currentStatus.value);
+  }
+
+  // 整合搜索条件和状态筛选
+  const allParams = { ...currentSearchParams.value, ...statusParams };
+  getData(pageData.page, allParams);
 }
 // 查看详情
 function viewDetail(row) {

+ 24 - 9
src/app/shop/admin/finance/report/index.vue

@@ -105,6 +105,7 @@
 import { onMounted, reactive, ref, computed } from 'vue';
 import { ArrowRight, ArrowDown } from '@element-plus/icons-vue';
 import { useI18n } from 'vue-i18n';
+import { ElMessage } from 'element-plus';
 import { api } from '../finance.service';
 
 const { t } = useI18n();
@@ -225,19 +226,20 @@ function formatAmount(amount) {
   });
 }
 
-// 刷新数据 - 使用默认时间范围
+// 刷新数据 - 保持当前筛选条件
 const refreshData = () => {
-  // 重置搜索参数为默认值
-  currentSearchParams.value = { ...defaultSearchValues };
-  // 使用默认时间范围刷新数据
-  getData(1, defaultSearchValues);
+  // 使用当前搜索条件刷新数据
+  const finalSearchParams = currentSearchParams.value || {};
+  getData(1, finalSearchParams);
 };
 
 // table 字段排序
 function fieldFilter({ prop, order }) {
   table.order = order == 'ascending' ? 'asc' : 'desc';
   table.sort = prop;
-  getData();
+  // 使用当前搜索条件进行排序
+  const finalSearchParams = currentSearchParams.value || {};
+  getData(pageData.page, finalSearchParams);
 }
 
 // 获取数据
@@ -245,6 +247,13 @@ async function getData(page = 1, searchParams = null) {
   // 构建请求参数 - 优先使用传入的参数,否则使用双向绑定的搜索条件
   const finalSearchParams = searchParams !== null ? searchParams : currentSearchParams.value;
 
+  // 验证时间范围是否必填
+  if (!finalSearchParams.createTime || finalSearchParams.createTime.length !== 2) {
+    ElMessage.warning(t('modules.finance.pleaseSelectTimeRange'));
+    loading.value = false;
+    return;
+  }
+
   // 保存搜索条件供导出使用
   if (Object.keys(finalSearchParams).length > 0) {
     currentSearchParams.value = { ...finalSearchParams };
@@ -292,16 +301,22 @@ function handleSearch(searchParams) {
 
 // 重置搜索参数处理函数
 function handleReset() {
-  // 手动清空搜索参数
-  currentSearchParams.value = {};
+  // 重置搜索参数为默认值(包含默认时间范围)
+  currentSearchParams.value = { ...defaultSearchValues };
   // 使用默认时间范围刷新数据
-  refreshData();
+  getData(1, defaultSearchValues);
 }
 
 // 导出报表
 async function exportReport() {
   if (exportLoading.value) return; // 防止重复点击
 
+  // 验证时间范围是否必填
+  if (!currentSearchParams.value.createTime || currentSearchParams.value.createTime.length !== 2) {
+    ElMessage.warning(t('modules.finance.pleaseSelectTimeRange'));
+    return;
+  }
+
   exportLoading.value = true;
   try {
     // 构建导出参数,与列表请求参数保持一致,但排除分页相关数据

+ 26 - 5
src/app/shop/admin/finance/withdraw/index.vue

@@ -19,7 +19,7 @@
       <div class="sa-title sa-flex sa-row-between">
         <div class="label sa-flex">{{ t('modules.withdraw.title') }}</div>
         <div>
-          <el-button class="sa-button-refresh" icon="RefreshRight" @click="getData()"></el-button>
+          <el-button class="sa-button-refresh" icon="RefreshRight" @click="handleRefresh"></el-button>
           <el-button icon="Download" type="primary" :loading="exportLoading" :disabled="exportLoading"
             @click="exportRecords">
             {{ exportLoading ? t('modules.withdraw.exporting') : t('modules.withdraw.exportRecords') }}
@@ -323,11 +323,33 @@ const handleReset = () => {
   getData(1, statusParams);
 };
 
+// 刷新处理 - 保持当前筛选条件
+const handleRefresh = () => {
+  // 获取当前tab的状态参数
+  let statusParams = {};
+  if (currentStatus.value !== 'all') {
+    statusParams.status = parseInt(currentStatus.value);
+  }
+
+  // 整合搜索条件和状态筛选
+  const allParams = { ...currentSearchParams.value, ...statusParams };
+  getData(pageData.page, allParams);
+};
+
 // table 字段排序
 function fieldFilter({ prop, order }) {
   table.order = order == 'ascending' ? 'asc' : 'desc';
   table.sort = prop;
-  getData();
+
+  // 获取当前tab的状态参数
+  let statusParams = {};
+  if (currentStatus.value !== 'all') {
+    statusParams.status = parseInt(currentStatus.value);
+  }
+
+  // 整合搜索条件和状态筛选
+  const allParams = { ...currentSearchParams.value, ...statusParams };
+  getData(pageData.page, allParams);
 }
 // 查看详情
 function viewDetail(row) {
@@ -341,11 +363,10 @@ function viewDetail(row) {
     },
     {
       confirm: () => {
-        // 审核操作后刷新列表
-        getData();
+        handleRefresh()
       },
       close: () => {
-        getData();
+        handleRefresh()
       },
     },
   );

+ 1 - 0
src/locales/en-US/index.json

@@ -711,6 +711,7 @@
     "finance": {
       "financeReport": "Finance Report",
       "timeRange": "Time Range",
+      "pleaseSelectTimeRange": "Please select time range",
       "exportReport": "Export Report",
       "exporting": "Exporting...",
       "serialNumber": "Serial No.",

+ 1 - 0
src/locales/zh-CN/index.json

@@ -906,6 +906,7 @@
     "finance": {
       "financeReport": "财务报表",
       "timeRange": "时间范围",
+      "pleaseSelectTimeRange": "请选择时间范围",
       "exportReport": "导出报表",
       "exporting": "导出中...",
       "serialNumber": "序号",