Bladeren bron

律师模块菜单配置,添加用户菜单,和注册模块

sgc 4 weken geleden
bovenliggende
commit
0c7f6f92b3
34 gewijzigde bestanden met toevoegingen van 523 en 5401 verwijderingen
  1. 4 3
      .env.development
  2. 16 0
      src/api/interface/index.ts
  3. 5 0
      src/api/modules/login.ts
  4. 2 2
      src/api/modules/user.ts
  5. 4 253
      src/assets/json/authMenuList.json
  6. 11 1
      src/config/index.ts
  7. 9 1
      src/routers/modules/staticRouter.ts
  8. 68 5
      src/views/login/components/LoginForm.vue
  9. 10 0
      src/views/login/index.scss
  10. 153 0
      src/views/register/components/RegisterForm.vue
  11. 1 0
      src/views/register/index.scss
  12. 25 0
      src/views/register/index.vue
  13. 0 230
      src/views/store/Reconciliation/detail.vue
  14. 0 410
      src/views/store/Reconciliation/index.vue
  15. 0 264
      src/views/store/Reconciliation/withDrawal.vue
  16. 0 228
      src/views/store/Reconciliation/withDrawalDetail.vue
  17. 0 198
      src/views/store/talent/apply/index.vue
  18. 0 261
      src/views/store/talent/expertList/detailDialog.vue
  19. 0 388
      src/views/store/talent/expertList/index.vue
  20. 0 248
      src/views/store/talent/firstPayment/detailDialog.vue
  21. 0 311
      src/views/store/talent/firstPayment/index.vue
  22. 0 354
      src/views/store/talent/firstPayment/reviewDialog.vue
  23. 0 290
      src/views/store/talent/lastPayment/detailDialog.vue
  24. 0 390
      src/views/store/talent/lastPayment/index.vue
  25. 0 401
      src/views/store/talent/lastPayment/reviewDialog.vue
  26. 0 88
      src/views/store/talent/orderList/dataDetailDialog.vue
  27. 0 247
      src/views/store/talent/orderList/detailDialog.vue
  28. 0 303
      src/views/store/talent/orderList/index.vue
  29. 0 80
      src/views/store/talent/orderList/paymentDetailDialog.vue
  30. 0 276
      src/views/store/user/detail.vue
  31. 0 169
      src/views/store/user/index.vue
  32. 0 0
      src/views/userManagement/detailDialog.vue
  33. 215 0
      src/views/userManagement/index.vue
  34. 0 0
      src/views/userManagement/reviewDialog.vue

+ 4 - 3
.env.development

@@ -15,17 +15,18 @@ VITE_DROP_CONSOLE = true
 VITE_PWA = false
 
 # 开发环境接口地址
-# VITE_API_URL_STORE = /api  # 开发环境使用
-VITE_API_URL_STORE = /api/alienStore #生产环境使用
+VITE_API_URL_STORE = /api  # 开发环境使用
+# VITE_API_URL_STORE = /api/alienStore #生产环境使用
 VITE_API_URL = /api/alienStore
 VITE_API_URL_SECOND = /api/alienSecond
 
 
 # 开发环境跨域代理,支持配置多个
-VITE_PROXY = [["/api","https://api.ailien.shop"]] #生产环境
+# VITE_PROXY = [["/api","https://api.ailien.shop"]] #生产环境
 # VITE_PROXY = [["/api","http://192.168.2.58:8888"]] # 孙
 # VITE_PROXY = [["/api","http://192.168.2.114:8888"]] # 秦旭阳
 # VITE_PROXY = [["/api","http://192.168.2.118:8888"]] # 刘云鑫
 # VITE_PROXY = [["/api","http://192.168.2.119:8888"]] # 张忱
 # VITE_PROXY = [["/api","http://192.168.2.141:8888"]] # 贾友晨
+VITE_PROXY = [["/api","http://192.168.2.64:7000"]] # 秦旭阳
 # VITE_PROXY = [["/api-easymock","https://mock.mengxuegu.com"],["/api-fastmock","https://www.fastmock.site"]]

+ 16 - 0
src/api/interface/index.ts

@@ -43,11 +43,21 @@ export namespace Login {
     username: string; // 用户名
     password: string; // 密码
   }
+  // 注册请求参数接口
+  export interface ReqRegisterForm {
+    username: string; // 用户名
+    password: string; // 密码
+  }
   // 登录响应接口
   export interface ResLogin {
     token: string; // 登录令牌
     result: boolean; // 登录结果
   }
+  // 注册响应接口
+  export interface ResRegister {
+    result: boolean; // 注册结果
+    token?: string; // 可选的登录令牌
+  }
   // 权限按钮响应接口
   export interface ResAuthButtons {
     [key: string]: string[]; // 权限按钮列表,key为页面名称,value为按钮权限数组
@@ -72,13 +82,19 @@ export namespace User {
   export interface ResUserList {
     id: string; // 用户ID
     username: string; // 用户名
+    realName?: string; // 真实姓名
     gender: number; // 性别
     user: { detail: { age: number } }; // 用户详细信息
+    userPhone?: string; // 联系电话
+    loginAccount?: string; // 登录账号
+    roleId?: string; // 角色ID
     idCard: string; // 身份证号
     email: string; // 邮箱
     address: string; // 地址
     createTime: string; // 创建时间
     status: number; // 状态
+    roleName?: string; // 角色名称
+    remark?: string; // 备注
     avatar: string; // 头像
     photo: any[]; // 照片列表
     children?: ResUserList[]; // 子级用户列表

+ 5 - 0
src/api/modules/login.ts

@@ -16,6 +16,11 @@ export const loginApi = (params: Login.ReqLoginForm): Promise<{ data: Login.ResL
   // return http.get<Login.ResLogin>(PORT1 + `/login?${qs.stringify(params, { arrayFormat: "repeat" })}`); // get 请求可以携带数组等复杂参数
 };
 
+// 用户注册
+export const registerApi = (params: Login.ReqRegisterForm): Promise<{ data: Login.ResRegister }> => {
+  return httpLogin.post<Login.ResRegister>(PORT1 + `/register`, params, { loading: false });
+};
+
 // 获取菜单列表
 export const getAuthMenuListApi = () => {
   // return http.get<Menu.MenuOptions[]>(PORT1 + `/menu/list`, {}, { loading: false });

+ 2 - 2
src/api/modules/user.ts

@@ -31,7 +31,7 @@ export const getUserTreeList = (params: User.ReqUserParams) => {
 };
 
 // 新增用户
-export const addUser = (params: { id: string }) => {
+export const addUser = (params: Record<string, any>) => {
   return http.post(PORT1 + `/user/add`, params);
 };
 
@@ -41,7 +41,7 @@ export const BatchAddUser = (params: FormData) => {
 };
 
 // 编辑用户
-export const editUser = (params: { id: string }) => {
+export const editUser = (params: Record<string, any>) => {
   return http.post(PORT1 + `/user/edit`, params);
 };
 

+ 4 - 253
src/assets/json/authMenuList.json

@@ -91,7 +91,7 @@
           "component": "/lawyerManagement/reconciliation/index",
           "meta": {
             "icon": "Briefcase",
-            "title": "律所对账总览",
+            "title": "对账总览",
             "isLink": "",
             "isHide": false,
             "isFull": false,
@@ -102,23 +102,9 @@
       ]
     },
     {
-      "path": "/proTable/useProTable",
-      "name": "useProTable",
-      "component": "/proTable/useProTable/index",
-      "meta": {
-        "icon": "Menu",
-        "title": "代金券",
-        "isLink": "",
-        "isHide": true,
-        "isFull": false,
-        "isAffix": false,
-        "isKeepAlive": false
-      }
-    },
-    {
-      "path": "/store/user",
-      "name": "user",
-      "component": "/store/user/index",
+      "path": "/userManagement",
+      "name": "userManagement",
+      "component": "/userManagement/index",
       "meta": {
         "icon": "UserFilled",
         "title": "用户管理",
@@ -128,241 +114,6 @@
         "isAffix": false,
         "isKeepAlive": false
       }
-    },
-    {
-      "path": "/store/storeUser/storeStaffConfigManagementDetail",
-      "name": "storeStaffConfigManagementDetail",
-      "component": "/store/storeUser/storeStaffConfigManagement/detail",
-      "meta": {
-        "icon": "Menu",
-        "title": "员工信息详细",
-        "activeMenu": "/store/storeUser/storeStaffConfigManagement",
-        "isLink": "",
-        "isHide": true,
-        "isFull": false,
-        "isAffix": false,
-        "isKeepAlive": false
-      }
-    },
-    {
-      "path": "/store/userDetail",
-      "name": "userDetail",
-      "component": "/store/user/detail",
-      "meta": {
-        "icon": "UserFilled",
-        "title": "用户管理详情",
-        "activeMenu": "/store/user",
-        "isLink": "",
-        "isHide": true,
-        "isFull": false,
-        "isAffix": false,
-        "isKeepAlive": false
-      }
-    },
-    {
-      "path": "/store/talent",
-      "name": "talent",
-      "component": "/store/talent/index",
-      "meta": {
-        "icon": "Opportunity",
-        "title": "达人管理",
-        "isLink": "",
-        "isHide": false,
-        "isFull": false,
-        "isAffix": false,
-        "isKeepAlive": false
-      },
-      "children": [
-        {
-          "path": "/store/talent/expertList",
-          "name": "expertList",
-          "component": "/store/talent/expertList/index",
-          "meta": {
-            "icon": "Briefcase",
-            "title": "达人用户",
-            "isLink": "",
-            "isHide": false,
-            "isFull": false,
-            "isAffix": false,
-            "isKeepAlive": false
-          }
-        },
-        {
-          "path": "/store/talent/orderList",
-          "name": "orderList",
-          "component": "/store/talent/orderList/index",
-          "meta": {
-            "icon": "Briefcase",
-            "title": "达人订单",
-            "isLink": "",
-            "isHide": false,
-            "isFull": false,
-            "isAffix": false,
-            "isKeepAlive": false
-          }
-        },
-        {
-          "path": "/store/talent/apply",
-          "name": "talentApply",
-          "component": "/store/talent/apply/index",
-          "meta": {
-            "icon": "Briefcase",
-            "title": "达人申请",
-            "isLink": "",
-            "isHide": false,
-            "isFull": false,
-            "isAffix": false,
-            "isKeepAlive": false
-          }
-        },
-        {
-          "path": "/store/talent/firstPayment",
-          "name": "talentFirstPayment",
-          "component": "/store/talent/firstPayment/index",
-          "meta": {
-            "icon": "Briefcase",
-            "title": "预付款审核",
-            "isLink": "",
-            "isHide": false,
-            "isFull": false,
-            "isAffix": false,
-            "isKeepAlive": false
-          }
-        },
-        {
-          "path": "/store/talent/lastPayment",
-          "name": "talentLastPayment",
-          "component": "/store/talent/lastPayment/index",
-          "meta": {
-            "icon": "Briefcase",
-            "title": "尾款审核",
-            "isLink": "",
-            "isHide": false,
-            "isFull": false,
-            "isAffix": false,
-            "isKeepAlive": false
-          }
-        }
-      ]
-    },
-    {
-      "path": "/store/groupPackageDetail",
-      "name": "groupPackageDetail",
-      "component": "/store/groupPackage/detail",
-      "meta": {
-        "icon": "Menu",
-        "title": "套餐详情",
-        "activeMenu": "/store/groupPackage",
-        "isLink": "",
-        "isHide": true,
-        "isFull": false,
-        "isAffix": false,
-        "isKeepAlive": false
-      }
-    },
-    {
-      "path": "/store/groupPackageStatusDetail",
-      "name": "groupPackageStatusDetail",
-      "component": "/store/groupPackage/status/detail",
-      "meta": {
-        "icon": "Menu",
-        "title": "套餐状态详情",
-        "activeMenu": "/store/groupPackage/status",
-        "isLink": "",
-        "isHide": true,
-        "isFull": false,
-        "isAffix": false,
-        "isKeepAlive": false
-      }
-    },
-    {
-      "path": "/store/Reconciliation",
-      "name": "Reconciliation",
-      "redirect": "/store/Reconciliation1",
-      "meta": {
-        "icon": "List",
-        "title": "对账结算",
-        "isLink": "",
-        "isHide": false,
-        "isFull": false,
-        "isAffix": false,
-        "isKeepAlive": false
-      },
-      "children": [
-        {
-          "path": "/store/Reconciliation1",
-          "name": "Reconciliation1",
-          "component": "/store/Reconciliation/index",
-          "meta": {
-            "icon": "List",
-            "title": "商户对账",
-            "isLink": "",
-            "isHide": false,
-            "isFull": false,
-            "isAffix": false,
-            "isKeepAlive": false
-          }
-        },
-        {
-          "path": "/store/ReconciliationDetail",
-          "name": "Reconciliation/detail",
-          "component": "/store/Reconciliation/detail",
-          "meta": {
-            "icon": "Menu",
-            "title": "对账详情",
-            "activeMenu": "/store/Reconciliation1",
-            "isLink": "",
-            "isHide": true,
-            "isFull": false,
-            "isAffix": false,
-            "isKeepAlive": false
-          }
-        },
-        {
-          "path": "/store/withDrawal",
-          "name": "withDrawal",
-          "component": "/store/Reconciliation/withDrawal",
-          "meta": {
-            "icon": "Sell",
-            "title": "商户提现",
-            "isLink": "",
-            "isHide": false,
-            "isFull": false,
-            "isAffix": false,
-            "isKeepAlive": false
-          },
-          "children": [
-            {
-              "path": "/store/withDrawalDetail",
-              "name": "withDrawalDetail",
-              "component": "/store/Reconciliation/withDrawalDetail",
-              "meta": {
-                "icon": "Menu",
-                "title": "提现详情",
-                "activeMenu": "/store/withDrawal",
-                "isLink": "",
-                "isHide": true,
-                "isFull": false,
-                "isAffix": false
-              }
-            }
-          ]
-        }
-      ]
-    },
-    {
-      "path": "/system/upgrade",
-      "name": "upgrade",
-      "component": "/system/upgrade/index",
-      "meta": {
-        "icon": "List",
-        "title": "APP升级版本",
-        "isLink": "",
-        "isHide": false,
-        "isFull": false,
-        "isAffix": false,
-        "isKeepAlive": false
-      }
     }
   ],
   "msg": "成功"

+ 11 - 1
src/config/index.ts

@@ -6,11 +6,21 @@ export const HOME_URL: string = "/home/index";
 // 登录页地址(默认)
 export const LOGIN_URL: string = "/login";
 
+// 注册页地址
+export const REGISTER_URL: string = "/register";
+
 // 默认主题颜色
 export const DEFAULT_PRIMARY: string = "#009688";
 
 // 路由白名单地址(本地存在的路由 staticRouter.ts 中)
-export const ROUTER_WHITE_LIST: string[] = ["/500", "/store/privacyAgreement","/store/storeUserPrivacyAgreement","/store/storePrivacyAgreement","/store/storeUserPrivacyAgreements"];
+export const ROUTER_WHITE_LIST: string[] = [
+  "/500",
+  "/store/privacyAgreement",
+  "/store/storeUserPrivacyAgreement",
+  "/store/storePrivacyAgreement",
+  "/store/storeUserPrivacyAgreements",
+  REGISTER_URL
+];
 
 // 高德地图 key
 export const AMAP_MAP_KEY: string = "";

+ 9 - 1
src/routers/modules/staticRouter.ts

@@ -1,5 +1,5 @@
 import { RouteRecordRaw } from "vue-router";
-import { HOME_URL, LOGIN_URL } from "@/config";
+import { HOME_URL, LOGIN_URL, REGISTER_URL } from "@/config";
 
 /**
  * staticRouter (静态路由)
@@ -18,6 +18,14 @@ export const staticRouter: RouteRecordRaw[] = [
     }
   },
   {
+    path: REGISTER_URL,
+    name: "register",
+    component: () => import("@/views/register/index.vue"),
+    meta: {
+      title: "注册"
+    }
+  },
+  {
     path: "/layout",
     name: "layout",
     component: () => import("@/layouts/index.vue"),

+ 68 - 5
src/views/login/components/LoginForm.vue

@@ -18,6 +18,14 @@
         </template>
       </el-input>
     </el-form-item>
+    <el-form-item prop="captcha">
+      <div class="captcha-row">
+        <el-input v-model="loginForm.captcha" placeholder="请输入验证码" maxlength="6" />
+        <div class="captcha-code" @click="refreshCaptcha" title="点击刷新验证码">
+          {{ captchaCode }}
+        </div>
+      </div>
+    </el-form-item>
   </el-form>
   <div class="login-btn">
     <el-button :icon="CircleClose" round size="large" @click="resetForm(loginFormRef)"> 重置 </el-button>
@@ -25,12 +33,16 @@
       登录
     </el-button>
   </div>
+  <!-- <div class="form-footer">
+    还没有账号?
+    <el-button link type="primary" @click="goRegister">立即注册</el-button>
+  </div> -->
 </template>
 
 <script setup lang="ts">
 import { ref, reactive, onMounted, onBeforeUnmount } from "vue";
 import { useRouter } from "vue-router";
-import { HOME_URL } from "@/config";
+import { HOME_URL, REGISTER_URL } from "@/config";
 // import { getTimeState } from "@/utils";
 import { Login } from "@/api/interface/index";
 import { ElNotification } from "element-plus";
@@ -52,24 +64,52 @@ type FormInstance = InstanceType<typeof ElForm>;
 const loginFormRef = ref<FormInstance>();
 const loginRules = reactive({
   username: [{ required: true, message: "请输入用户名", trigger: "blur" }],
-  password: [{ required: true, message: "请输入密码", trigger: "blur" }]
+  password: [{ required: true, message: "请输入密码", trigger: "blur" }],
+  captcha: [{ required: true, message: "请输入验证码", trigger: "blur" }]
 });
 
 const loading = ref(false);
-const loginForm = reactive<Login.ReqLoginForm>({
+const loginForm = reactive<Login.ReqLoginForm & { captcha: string }>({
   username: "",
-  password: ""
+  password: "",
+  captcha: ""
 });
+const captchaCode = ref("");
+
+const generateCaptcha = () => {
+  captchaCode.value = Math.floor(Math.random() * 1000000)
+    .toString()
+    .padStart(6, "0");
+};
+
+const refreshCaptcha = () => {
+  generateCaptcha();
+  loginForm.captcha = "";
+};
 
 // login
 const login = (formEl: FormInstance | undefined) => {
   if (!formEl) return;
   formEl.validate(async valid => {
     if (!valid) return;
+    if (loginForm.captcha !== captchaCode.value) {
+      ElNotification({
+        title: "验证码错误",
+        message: "请重新输入验证码",
+        type: "error",
+        duration: 5000
+      });
+      refreshCaptcha();
+      return;
+    }
     loading.value = true;
     try {
       // 1.执行登录接口
-      const { data } = (await loginApi({ ...loginForm, password: md5(loginForm.password) })) as { data: Login.ResLogin };
+      const loginPayload = {
+        username: loginForm.username,
+        password: md5(loginForm.password)
+      };
+      const { data } = (await loginApi(loginPayload)) as { data: Login.ResLogin };
       console.log(data);
       if (data.result) {
         userStore.setToken(data.token);
@@ -113,9 +153,11 @@ const login = (formEl: FormInstance | undefined) => {
 const resetForm = (formEl: FormInstance | undefined) => {
   if (!formEl) return;
   formEl.resetFields();
+  refreshCaptcha();
 };
 
 onMounted(() => {
+  generateCaptcha();
   // 监听 enter 事件(调用登录)
   document.onkeydown = (e: KeyboardEvent) => {
     if (e.code === "Enter" || e.code === "enter" || e.code === "NumpadEnter") {
@@ -128,8 +170,29 @@ onMounted(() => {
 onBeforeUnmount(() => {
   document.onkeydown = null;
 });
+
+const goRegister = () => {
+  router.push(REGISTER_URL);
+};
 </script>
 
 <style scoped lang="scss">
 @import "../index";
+.captcha-row {
+  display: flex;
+  gap: 12px;
+  align-items: center;
+}
+.captcha-code {
+  padding: 0 16px;
+  font-weight: 600;
+  color: var(--el-color-primary);
+  text-align: center;
+  letter-spacing: 4px;
+  cursor: pointer;
+  user-select: none;
+  background-color: var(--el-color-primary-light-9);
+  border: 1px solid var(--el-color-primary);
+  border-radius: 6px;
+}
 </style>

+ 10 - 0
src/views/login/index.scss

@@ -66,6 +66,16 @@
           width: 185px;
         }
       }
+      .form-footer {
+        margin-top: 16px;
+        font-size: 14px;
+        color: var(--el-text-color-secondary);
+        text-align: right;
+        .el-button {
+          padding: 0 8px;
+          font-size: 14px;
+        }
+      }
     }
   }
 }

+ 153 - 0
src/views/register/components/RegisterForm.vue

@@ -0,0 +1,153 @@
+<template>
+  <el-form ref="registerFormRef" :model="registerForm" :rules="registerRules" size="large">
+    <el-form-item prop="username">
+      <el-input v-model="registerForm.username" placeholder="请输入用户名">
+        <template #prefix>
+          <el-icon class="el-input__icon">
+            <user />
+          </el-icon>
+        </template>
+      </el-input>
+    </el-form-item>
+    <el-form-item prop="password">
+      <el-input
+        v-model="registerForm.password"
+        type="password"
+        placeholder="请输入密码"
+        show-password
+        autocomplete="new-password"
+      >
+        <template #prefix>
+          <el-icon class="el-input__icon">
+            <lock />
+          </el-icon>
+        </template>
+      </el-input>
+    </el-form-item>
+    <el-form-item prop="confirmPassword">
+      <el-input
+        v-model="registerForm.confirmPassword"
+        type="password"
+        placeholder="请再次输入密码"
+        show-password
+        autocomplete="new-password"
+      >
+        <template #prefix>
+          <el-icon class="el-input__icon">
+            <lock />
+          </el-icon>
+        </template>
+      </el-input>
+    </el-form-item>
+  </el-form>
+  <div class="login-btn">
+    <el-button :icon="CircleClose" round size="large" @click="resetForm(registerFormRef)"> 重置 </el-button>
+    <el-button :icon="Check" round size="large" type="primary" :loading="loading" @click="submit(registerFormRef)">
+      注册
+    </el-button>
+  </div>
+  <div class="form-footer">
+    已有账号?
+    <el-button link type="primary" @click="goLogin"> 返回登录 </el-button>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, onMounted, onBeforeUnmount } from "vue";
+import { useRouter } from "vue-router";
+import type { ElForm } from "element-plus";
+import { ElNotification } from "element-plus";
+import md5 from "md5";
+import { LOGIN_URL } from "@/config";
+import { Login } from "@/api/interface";
+import { registerApi } from "@/api/modules/login";
+import { CircleClose, Check } from "@element-plus/icons-vue";
+
+type FormInstance = InstanceType<typeof ElForm>;
+
+const router = useRouter();
+const registerFormRef = ref<FormInstance>();
+const loading = ref(false);
+
+const registerForm = reactive<Login.ReqRegisterForm & { confirmPassword: string }>({
+  username: "",
+  password: "",
+  confirmPassword: ""
+});
+
+const validateConfirmPassword = (_rule: any, value: string, callback: (error?: Error) => void) => {
+  if (!value) {
+    callback(new Error("请再次输入密码"));
+    return;
+  }
+  if (value !== registerForm.password) {
+    callback(new Error("两次输入的密码不一致"));
+    return;
+  }
+  callback();
+};
+
+const registerRules = reactive({
+  username: [{ required: true, message: "请输入用户名", trigger: "blur" }],
+  password: [{ required: true, message: "请输入密码", trigger: "blur" }],
+  confirmPassword: [{ validator: validateConfirmPassword, trigger: "blur" }]
+});
+
+const submit = (formEl: FormInstance | undefined) => {
+  if (!formEl) return;
+  formEl.validate(async valid => {
+    if (!valid) return;
+    loading.value = true;
+    try {
+      const payload: Login.ReqRegisterForm = {
+        username: registerForm.username,
+        password: md5(registerForm.password)
+      };
+      const { data } = (await registerApi(payload)) as { data: Login.ResRegister };
+      if (data.result) {
+        ElNotification({
+          title: "注册成功",
+          message: "请使用新账号登录",
+          type: "success",
+          duration: 6000
+        });
+        goLogin();
+      } else {
+        ElNotification({
+          title: "注册失败,请稍后重试",
+          type: "error",
+          duration: 8000
+        });
+      }
+    } finally {
+      loading.value = false;
+    }
+  });
+};
+
+const resetForm = (formEl: FormInstance | undefined) => {
+  if (!formEl) return;
+  formEl.resetFields();
+};
+
+const goLogin = () => {
+  router.push(LOGIN_URL);
+};
+
+onMounted(() => {
+  document.onkeydown = (e: KeyboardEvent) => {
+    if (e.code === "Enter" || e.code === "enter" || e.code === "NumpadEnter") {
+      if (loading.value) return;
+      submit(registerFormRef.value);
+    }
+  };
+});
+
+onBeforeUnmount(() => {
+  document.onkeydown = null;
+});
+</script>
+
+<style scoped lang="scss">
+@import "../../login/index";
+</style>

+ 1 - 0
src/views/register/index.scss

@@ -0,0 +1 @@
+@import "../login/index";

+ 25 - 0
src/views/register/index.vue

@@ -0,0 +1,25 @@
+<template>
+  <div class="login-container flx-center">
+    <div class="login-box">
+      <SwitchDark class="dark" />
+      <div class="login-left">
+        <img class="login-left-img" src="@/assets/images/login_left.png" alt="register" />
+      </div>
+      <div class="login-form">
+        <div class="login-logo">
+          <h2 class="logo-text">Alien-Store</h2>
+        </div>
+        <RegisterForm />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts" name="register">
+import SwitchDark from "@/components/SwitchDark/index.vue";
+import RegisterForm from "./components/RegisterForm.vue";
+</script>
+
+<style scoped lang="scss">
+@import "./index";
+</style>

+ 0 - 230
src/views/store/Reconciliation/detail.vue

@@ -1,230 +0,0 @@
-<template>
-  <div class="table-box">
-    <el-card style="margin-bottom: 15px">
-      <el-row :gutter="10">
-        <el-col :xs="4" :sm="4" :md="4" :lg="4" :xl="4">
-          <div class="form-box borderRight">
-            <div class="form-title">
-              总交易金额
-              <el-tooltip class="box-item" effect="dark" content="总成交金额" placement="top">
-                <el-icon><QuestionFilled /></el-icon>
-              </el-tooltip>
-            </div>
-            <div class="form-num">
-              {{ formatAmount(form.allOrderAmount) }}
-            </div>
-          </div>
-        </el-col>
-
-        <el-col :xs="4" :sm="4" :md="4" :lg="4" :xl="4">
-          <div class="form-box borderRight">
-            <div class="form-title">
-              交易笔数
-              <el-tooltip class="box-item" effect="dark" content="成交订单总数" placement="top">
-                <el-icon><QuestionFilled /></el-icon>
-              </el-tooltip>
-            </div>
-            <div class="form-num">
-              {{ formatAmount2(form.orderTransactionNumber) }}
-            </div>
-          </div>
-        </el-col>
-
-        <el-col :xs="4" :sm="4" :md="4" :lg="4" :xl="4">
-          <div class="form-box borderRight">
-            <div class="form-title">
-              核销金额
-              <el-tooltip class="box-item" effect="dark" content="已完成核销的金额" placement="top">
-                <el-icon><QuestionFilled /></el-icon>
-              </el-tooltip>
-            </div>
-            <div class="form-num">
-              {{ formatAmount(form.verificationAmount) }}
-            </div>
-          </div>
-        </el-col>
-
-        <el-col :xs="4" :sm="4" :md="4" :lg="4" :xl="4">
-          <div class="form-box borderRight">
-            <div class="form-title">
-              已提现金额
-              <el-tooltip class="box-item" effect="dark" content="用户已成功提现的金额" placement="top">
-                <el-icon><QuestionFilled /></el-icon>
-              </el-tooltip>
-            </div>
-            <div class="form-num">
-              {{ formatAmount(form.totalWithdrawalAmount) }}
-            </div>
-          </div>
-        </el-col>
-
-        <el-col :xs="4" :sm="4" :md="4" :lg="4" :xl="4">
-          <div class="form-box borderRight">
-            <div class="form-title">
-              冻结金额
-              <el-tooltip class="box-item" effect="dark" content="当前冻结中的金额(未可提现)" placement="top">
-                <el-icon><QuestionFilled /></el-icon>
-              </el-tooltip>
-            </div>
-            <div class="form-num">
-              {{ formatAmount(form.freezeAmounts) }}
-            </div>
-          </div>
-        </el-col>
-
-        <el-col :xs="4" :sm="4" :md="4" :lg="4" :xl="4">
-          <div class="form-box">
-            <div class="form-title">
-              冻结待提现金额
-              <el-tooltip class="box-item" effect="dark" content="已申请提现但仍在冻结中的金额" placement="top">
-                <el-icon><QuestionFilled /></el-icon>
-              </el-tooltip>
-            </div>
-            <div class="form-num">
-              {{ formatAmount(form.unwithdrawnAmountsFrozen) }}
-            </div>
-          </div>
-        </el-col>
-      </el-row>
-    </el-card>
-
-    <ProTable ref="proTable" :columns="columns" :request-api="getTableList" :init-param="initParam" :data-callback="dataCallback">
-      <template #buyAmount="scope">
-        {{ formatAmount(scope.row.buyAmount) }}
-      </template>
-    </ProTable>
-  </div>
-</template>
-
-<script setup lang="tsx" name="useProTable">
-import { ref, reactive, onMounted, onActivated } from "vue";
-import { useRoute } from "vue-router";
-import { Reconciliation } from "@/api/interface";
-import { ElMessage } from "element-plus";
-import ProTable from "@/components/ProTable/index.vue";
-import { ProTableInstance, ColumnProps } from "@/components/ProTable/interface";
-import { getDetails, getDetailStatis } from "@/api/modules/Reconciliation";
-import { QuestionFilled } from "@element-plus/icons-vue";
-
-const route = useRoute();
-
-const form = ref({ allOrderAmount: 0, orderTransactionNumber: 0, userCount: 0, verificationAmount: 0 });
-
-// ProTable 实例
-const proTable = ref<ProTableInstance>();
-const id = ref((route.query.id as string) || "");
-const initParam = reactive({ storeId: id.value });
-// 页面加载时触发查询
-onMounted(() => {
-  proTable.value?.getTableList();
-  getStatis();
-});
-
-// 从其他页面返回时触发查询
-onActivated(() => {
-  proTable.value?.getTableList();
-  getStatis();
-});
-
-// 或者直接去 hooks/useTable.ts 文件中把字段改为你后端对应的就行
-const dataCallback = (data: any) => {
-  return {
-    list: data.records,
-    total: data.total
-  };
-};
-
-// 如果你想在请求之前对当前请求参数做一些操作,可以自定义如下函数:params 为当前所有的请求参数(包括分页),最后返回请求列表接口
-// 默认不做操作就直接在 ProTable 组件上绑定	:requestApi="getUserList"
-const getTableList = (params: any) => {
-  let newParams = JSON.parse(JSON.stringify(params));
-  newParams.page = newParams.pageNum;
-  newParams.size = newParams.pageSize;
-  delete newParams.pageNum;
-  delete newParams.pageSize;
-  return getDetails(newParams);
-};
-const status = ref<any[]>([
-  { value: 0, label: "待支付" },
-  { value: 1, label: "已支付(待使用)" },
-  { value: 2, label: "已核销" },
-  { value: 3, label: "已过期" },
-  { value: 4, label: "已取消" },
-  { value: 5, label: "已退款" },
-  { value: 6, label: "退款失败" },
-  { value: 7, label: "已完成" }
-]);
-const couponType = ref<any[]>([
-  { value: "1", label: "代金券" },
-  { value: "2", label: "套餐" }
-]);
-
-// 表格配置项
-const columns = reactive<ColumnProps<Reconciliation.ResDetailList>[]>([
-  { prop: "userId", label: "用户ID", search: { el: "input", tooltip: "用户ID" } },
-  { prop: "userName", label: "用户名", search: { el: "input", tooltip: "用户名" } },
-  { prop: "orderNo", label: "订单编号", search: { el: "input", tooltip: "订单编号" } },
-  { prop: "couponType", label: "订单类型", enum: couponType },
-  { prop: "buyAmount", label: "订单金额" },
-  { prop: "buyTime", label: "购买时间" },
-  { prop: "status", label: "状态", enum: status }
-]);
-
-const getStatis = async () => {
-  try {
-    if (id.value) {
-      const res = await getDetailStatis({ storeId: id.value });
-      if (res.code == 200) {
-        form.value = res.data;
-      }
-    }
-  } catch (error) {
-    // ElMessage.error("获取详情失败");
-  }
-};
-// 交易金额格式化
-const formatAmount2 = (amount: number | string) => {
-  const num = Number(amount);
-  if (isNaN(num)) return "0";
-
-  if (Math.abs(num) >= 1000) {
-    return `${num / 10000}万笔`;
-  } else if (num === 0) {
-    return "0";
-  } else {
-    return `${num}`;
-  }
-};
-// 添加金额格式化函数
-const formatAmount = (amount: number | string) => {
-  const num = Number(amount);
-  if (isNaN(num)) return "0";
-
-  if (Math.abs(num) >= 1000) {
-    return `${(num / 10000).toFixed(2)}万元`;
-  } else if (num === 0) {
-    return "0";
-  } else {
-    return `${num.toFixed(2)}元`;
-  }
-};
-</script>
-<style lang="scss" scoped>
-.form-box {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  margin-bottom: 20px;
-  .form-title {
-    font-size: 14px;
-  }
-  .form-num {
-    margin-top: 20px;
-    font-size: 18px;
-    font-weight: 500;
-  }
-}
-.borderRight {
-  border-right: 1px solid #e6e6e6;
-}
-</style>

+ 0 - 410
src/views/store/Reconciliation/index.vue

@@ -1,410 +0,0 @@
-<template>
-  <div class="table-box">
-    <el-card style="margin-bottom: 15px">
-      <el-row :gutter="10">
-        <el-col :xs="8" :sm="8" :md="8" :lg="8" :xl="8">
-          <div class="form-search">
-            <div class="form-search-title">本期账单排名</div>
-            <el-select
-              v-model="queryType"
-              placeholder="Select"
-              style="width: 240px; margin-left: 10px"
-              @change="getTotalStatistics()"
-            >
-              <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
-            </el-select>
-          </div>
-          <el-table :data="totalStatistics?.billingRanking" height="250">
-            <el-table-column type="index" label="排名" width="80" />
-            <el-table-column prop="storeName" label="商家名称" />
-            <el-table-column label="核销金额">
-              <template #default="{ row }">
-                <span v-if="Number(row.incomeMoney) >= 1000"> {{ (row.incomeMoney / 10000).toFixed(2) }}万元 </span>
-                <span v-else> {{ row.incomeMoney }}元 </span>
-              </template>
-            </el-table-column>
-          </el-table>
-        </el-col>
-        <el-col :xs="16" :sm="16" :md="16" :lg="16" :xl="16">
-          <el-button type="primary" @click="handleLockUpPeriod" style="float: right"> 冻结期设置 </el-button>
-          <el-row>
-            <el-col :xs="6" :sm="6" :md="6" :lg="6" :xl="6">
-              <div class="form-box borderRight">
-                <div class="form-title">
-                  总交易金额
-                  <el-tooltip class="box-item" effect="dark" content="总成交金额" placement="top">
-                    <el-icon><QuestionFilled /></el-icon>
-                  </el-tooltip>
-                </div>
-                <div class="form-num">
-                  {{ formatAmount(totalStatistics?.totalTransactionAmount) }}
-                </div>
-              </div>
-            </el-col>
-
-            <el-col :xs="6" :sm="6" :md="6" :lg="6" :xl="6">
-              <div class="form-box borderRight">
-                <div class="form-title">
-                  已提现金额
-                  <el-tooltip class="box-item" effect="dark" content="用户已成功提现的金额" placement="top">
-                    <el-icon><QuestionFilled /></el-icon>
-                  </el-tooltip>
-                </div>
-                <div class="form-num">
-                  {{ formatAmount(totalStatistics?.withdrawalAmount) }}
-                </div>
-              </div>
-            </el-col>
-            <el-col :xs="6" :sm="6" :md="6" :lg="6" :xl="6">
-              <div class="form-box borderRight">
-                <div class="form-title">未核销金额</div>
-                <div class="form-num">
-                  {{ formatAmount(totalStatistics?.amountNotWrittenOff) }}
-                </div>
-              </div>
-            </el-col>
-            <el-col :xs="6" :sm="6" :md="6" :lg="6" :xl="6">
-              <div class="form-box">
-                <div class="form-title">
-                  冻结金额
-                  <el-tooltip class="box-item" effect="dark" content="当前冻结中的金额(未可提现)" placement="top">
-                    <el-icon><QuestionFilled /></el-icon>
-                  </el-tooltip>
-                </div>
-                <div class="form-num">
-                  {{ formatAmount(totalStatistics?.freezeAmounts) }}
-                </div>
-              </div>
-            </el-col>
-          </el-row>
-          <el-row style="margin-top: 20px">
-            <el-col :xs="6" :sm="6" :md="6" :lg="6" :xl="6">
-              <div class="form-box borderRight">
-                <div class="form-title">
-                  交易总笔数
-                  <el-tooltip class="box-item" effect="dark" content="成交订单总数" placement="top">
-                    <el-icon><QuestionFilled /></el-icon>
-                  </el-tooltip>
-                </div>
-                <div class="form-num">
-                  {{ formatAmount2(totalStatistics?.transactionNumber) }}
-                </div>
-              </div>
-            </el-col>
-            <el-col :xs="6" :sm="6" :md="6" :lg="6" :xl="6">
-              <div class="form-box borderRight">
-                <div class="form-title">解冻未提现金额</div>
-                <div class="form-num">
-                  {{ formatAmount(totalStatistics?.unwithdrawnAmountsFrozen) }}
-                </div>
-              </div>
-            </el-col>
-            <el-col :xs="6" :sm="6" :md="6" :lg="6" :xl="6">
-              <div class="form-box">
-                <div class="form-title">
-                  已核销金额
-                  <el-tooltip class="box-item" effect="dark" content="已完成核销的金额" placement="top">
-                    <el-icon><QuestionFilled /></el-icon>
-                  </el-tooltip>
-                </div>
-                <div class="form-num">
-                  {{ formatAmount(totalStatistics?.amountWrittenOff) }}
-                </div>
-              </div>
-            </el-col>
-          </el-row>
-        </el-col>
-      </el-row>
-    </el-card>
-
-    <ProTable ref="proTable" :columns="columns" :request-api="getTableList" :init-param="initParam" :data-callback="dataCallback">
-      <!-- Expand -->
-      <template #expand="scope">
-        {{ scope.row }}
-      </template>
-      <!-- usernameHeader -->
-      <template #usernameHeader="scope">
-        <el-button type="primary" @click="ElMessage.success('我是通过作用域插槽渲染的表头')">
-          {{ scope.column.label }}
-        </el-button>
-      </template>
-      <!-- createTime -->
-      <template #createTime="scope">
-        <el-button type="primary" link @click="ElMessage.success('我是通过作用域插槽渲染的内容')">
-          {{ scope.row.createTime }}
-        </el-button>
-      </template>
-
-      <!-- 套餐购买金额格式化 -->
-      <template #mealOrderAmount="scope">
-        {{ formatAmount(scope.row.mealOrderAmount) }}
-      </template>
-
-      <!-- 用户核验套餐金额格式化 -->
-      <template #mealIncomeMoney="scope">
-        {{ formatAmount(scope.row.mealIncomeMoney) }}
-      </template>
-
-      <!-- 代金券购买金额格式化 -->
-      <template #couponOrderAmount="scope">
-        {{ formatAmount(scope.row.couponOrderAmount) }}
-      </template>
-
-      <!-- 用户核验代金券金额格式化 -->
-      <template #couponIncomeMoney="scope">
-        {{ formatAmount(scope.row.couponIncomeMoney) }}
-      </template>
-
-      <!-- 结算金额格式化 -->
-      <template #cashoutMoney="scope">
-        {{ formatAmount(scope.row.cashoutMoney) }}
-      </template>
-
-      <!-- 冻结金额格式化 -->
-      <template #accountFrozen="scope">
-        {{ formatAmount(scope.row.accountFrozen) }}
-      </template>
-
-      <!-- 表格操作 -->
-      <template #operation="scope">
-        <el-button type="primary" link @click="toDetail(scope.row)"> 查看详情 </el-button>
-      </template>
-    </ProTable>
-
-    <!-- 冻结期弹窗 -->
-    <el-dialog v-model="dialogFormVisibleLockUpPeriod" title="冻结期设置" width="500">
-      <el-radio-group v-model="radioLockUpPeriod" @change="handleRadioChange">
-        <el-radio value="1" size="large">
-          核销后 <el-input type="number" v-model="LockUpPeriodValue" @input="handleInput" /> 天解冻
-        </el-radio>
-        <el-radio value="0" size="large"> 无解冻期 </el-radio>
-      </el-radio-group>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button @click="dialogFormVisibleLockUpPeriod = false"> 取消 </el-button>
-          <el-button type="primary" @click="handleLockUpPeriodOk"> 确定 </el-button>
-        </div>
-      </template>
-    </el-dialog>
-  </div>
-</template>
-
-<script setup lang="tsx" name="useProTable">
-import { ref, reactive, onMounted, onActivated } from "vue";
-import { useRouter } from "vue-router";
-import { Reconciliation } from "@/api/interface";
-import { ElMessage } from "element-plus";
-import ProTable from "@/components/ProTable/index.vue";
-import { ProTableInstance, ColumnProps } from "@/components/ProTable/interface";
-import { getReconciliationList, getStatistics, editConfig, getConfig } from "@/api/modules/Reconciliation";
-import { QuestionFilled } from "@element-plus/icons-vue";
-const dialogFormVisibleLockUpPeriod = ref(false);
-const radioLockUpPeriod = ref("2");
-const LockUpPeriodValue = ref(null);
-const router = useRouter();
-const queryType = ref("week");
-const options = ref([
-  {
-    value: "week",
-    label: "本周"
-  },
-  {
-    value: "month",
-    label: "本月"
-  },
-  {
-    value: "year",
-    label: "本年"
-  }
-]);
-const totalStatistics = ref<Reconciliation.ResReconciliation>();
-// 跳转详情页
-const toDetail = row => {
-  router.push(`/store/ReconciliationDetail?id=${row.storeId}`);
-};
-
-// ProTable 实例
-const proTable = ref<ProTableInstance>();
-// 如果表格需要初始化请求参数,直接定义传给 ProTable (之后每次请求都会自动带上该参数,此参数更改之后也会一直带上,改变此参数会自动刷新表格数据)
-const initParam = reactive({});
-// 页面加载时触发查询
-onMounted(() => {
-  proTable.value?.getTableList();
-  getTotalStatistics();
-});
-
-// 从其他页面返回时触发查询
-onActivated(() => {
-  proTable.value?.getTableList();
-});
-
-// 或者直接去 hooks/useTable.ts 文件中把字段改为你后端对应的就行
-const dataCallback = (data: any) => {
-  return {
-    list: data.records,
-    total: data.total
-  };
-};
-const handleGetConfig = () => {
-  LockUpPeriodValue.value = null;
-  getConfig({
-    dictType: "freeze"
-  }).then(res => {
-    radioLockUpPeriod.value = res.data.configValue1;
-    if (res.data.configValue1 === "1") {
-      LockUpPeriodValue.value = res.data.configValue2;
-    }
-  });
-};
-// 如果你想在请求之前对当前请求参数做一些操作,可以自定义如下函数:params 为当前所有的请求参数(包括分页),最后返回请求列表接口
-// 默认不做操作就直接在 ProTable 组件上绑定	:requestApi="getUserList"
-const getTableList = (params: any) => {
-  let newParams = JSON.parse(JSON.stringify(params));
-  newParams.page = newParams.pageNum;
-  newParams.size = newParams.pageSize;
-  delete newParams.pageNum;
-  delete newParams.pageSize;
-  return getReconciliationList(newParams);
-};
-// 添加金额格式化函数
-const formatAmount = (amount: number | string) => {
-  const num = Number(amount);
-  if (isNaN(num)) return "0";
-
-  if (Math.abs(num) >= 1000) {
-    return `${(num / 10000).toFixed(2)}万元`;
-  } else if (num === 0) {
-    return "0";
-  } else {
-    return `${num.toFixed(2)}元`;
-  }
-};
-// 交易金额格式化
-const formatAmount2 = (amount: number | string) => {
-  const num = Number(amount);
-  if (isNaN(num)) return "0";
-
-  if (Math.abs(num) >= 1000) {
-    return `${num / 10000}万笔`;
-  } else if (num === 0) {
-    return "0";
-  } else {
-    return `${num}`;
-  }
-};
-// 表格配置项
-const columns = reactive<ColumnProps<Reconciliation.ReconciliationList>[]>([
-  { prop: "index", label: "排名", type: "index", width: 100 },
-  { prop: "storeName", label: "商家名称", search: { el: "input" } },
-  { prop: "storeId", label: "商家ID" },
-  { prop: "mealOrderCount", label: "套餐购买数量" },
-  { prop: "mealOrderAmount", label: "套餐购买金额" },
-  { prop: "mealIncomeCount", label: "用户核验套餐数量" },
-  { prop: "mealIncomeMoney", label: "用户核验套餐金额" },
-  { prop: "couponOrderCount", label: "代金券购买数量" },
-  { prop: "couponOrderAmount", label: "代金券购买金额" },
-  { prop: "couponIncomeCount", label: "用户核验代金券数量" },
-  { prop: "couponIncomeMoney", label: "用户核验代金券金额" },
-  { prop: "cashoutMoney", label: "结算金额" },
-  { prop: "accountFrozen", label: "冻结金额" },
-  { prop: "operation", label: "操作", fixed: "right", width: 120 }
-]);
-
-const getTotalStatistics = async () => {
-  try {
-    totalStatistics.value = {};
-    let resdata = await getStatistics({ queryType: queryType.value });
-    if (resdata.code == 200) {
-      totalStatistics.value = resdata.data;
-    }
-    console.log(resdata);
-  } catch (error) {
-    console.log(error);
-  }
-};
-const handleInput = value => {
-  // 确保值在允许范围内
-  if (value !== "" && value < 1) {
-    LockUpPeriodValue.value = 1;
-  } else if (value > 999) {
-    LockUpPeriodValue.value = 999;
-  }
-};
-// 打开设置冻结期的弹窗
-const handleLockUpPeriod = () => {
-  handleGetConfig();
-  dialogFormVisibleLockUpPeriod.value = true;
-};
-// 确定设置冻结期
-const handleLockUpPeriodOk = async () => {
-  if (!LockUpPeriodValue.value && radioLockUpPeriod.value === "1") {
-    ElMessage.error("请输入解冻期");
-    return;
-  }
-  const FREEZE_TYPE = "freeze";
-  const baseConfig = {
-    dictType: FREEZE_TYPE,
-    configValue1: radioLockUpPeriod.value === "1" ? 1 : 0
-  };
-  const enhancedConfig = radioLockUpPeriod.value === "1" ? { ...baseConfig, configValue2: LockUpPeriodValue.value } : baseConfig;
-
-  try {
-    const res = await editConfig(enhancedConfig);
-    if (res.code === 200) {
-      ElMessage.success("设置成功");
-      dialogFormVisibleLockUpPeriod.value = false;
-    }
-  } catch (error) {
-    ElMessage.error(error.message);
-  }
-};
-const handleRadioChange = value => {
-  if (value === "0") {
-    LockUpPeriodValue.value = null;
-  }
-};
-</script>
-<style lang="scss" scoped>
-.form-search {
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-  margin-bottom: 10px;
-  &-title {
-    font-size: 20px;
-    font-weight: 500;
-  }
-}
-.form-box {
-  margin-bottom: 20px;
-  text-align: center;
-  .form-title {
-    font-size: 14px;
-  }
-  .form-num {
-    margin-top: 20px;
-    font-size: 18px;
-    font-weight: 500;
-  }
-}
-.borderRight {
-  border-right: 1px solid #e6e6e6;
-}
-
-// 确保整个页面可以滚动
-.table-box {
-  min-height: 150vh; // 超过视窗高度以确保可滚动
-  padding-bottom: 50px;
-}
-
-// 针对 ProTable 组件的样式调整
-:deep(.pro-table) {
-  // transition: height 0.3s ease; // 平滑高度变化
-  height: auto !important;
-}
-:deep(.el-radio-group) {
-  display: flex;
-  flex-direction: column !important;
-  align-items: baseline;
-}
-</style>

+ 0 - 264
src/views/store/Reconciliation/withDrawal.vue

@@ -1,264 +0,0 @@
-<template>
-  <div class="table-box">
-    <!-- 表格操作 -->
-    <ProTable ref="proTable" :columns="columns" :request-api="getTableList" :data-callback="dataCallback">
-      <template #operation="scope">
-        <el-button type="primary" link @click="showDetail(scope.row)" v-if="scope.row.paymentStatus == 1"> 查看 </el-button>
-      </template>
-
-      <template #operationRight="scope">
-        <el-button
-          type="primary"
-          link
-          @click="okFuKuan(scope.row)"
-          v-if="scope.row.paymentStatus == 3 || scope.row.paymentStatus == 0"
-        >
-          付款
-        </el-button>
-        <el-button
-          type="primary"
-          link
-          @click="okReject(scope.row)"
-          v-if="scope.row.paymentStatus == 3 || scope.row.paymentStatus == 0"
-        >
-          拒接
-        </el-button>
-        <el-button type="primary" link @click="okFuKuan(scope.row)" v-if="scope.row.paymentStatus == 2"> 重新付款 </el-button>
-        <el-button type="primary" link @click="handleToDetail(scope.row.cashId)"> 查看详情 </el-button>
-      </template>
-    </ProTable>
-
-    <!-- 查看结算回执单 弹窗 -->
-    <el-dialog v-model="dialogTableVisible" title="结算回执单" width="800">
-      <div class="title">基本信息</div>
-      <div class="form-item">
-        <div>商家名称:{{ showForm.storeName }}</div>
-        <div>商家账号:{{ showForm.storeId }}</div>
-        <div>联系方式:{{ showForm.storePhone }}</div>
-      </div>
-
-      <div class="title">结算金额</div>
-      <div class="table">
-        <div class="row header">
-          <div class="cell">账单金额</div>
-          <div class="cell">已付金额</div>
-          <div class="cell">提现到账时间</div>
-        </div>
-        <div class="row">
-          <div class="cell">
-            {{ showForm.money }}
-          </div>
-          <div class="cell">
-            {{ showForm.money }}
-          </div>
-          <div class="cell">
-            {{ showForm.payDate }}
-          </div>
-        </div>
-      </div>
-
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="handleDownload"> 下载 </el-button>
-        </div>
-      </template>
-    </el-dialog>
-
-    <!-- 拒接弹窗 -->
-    <el-dialog v-model="dialogTableVisibleJj" title="拒接原因" width="600">
-      <div class="form-item">
-        <el-input v-model="cause" style="width: 600" :rows="2" type="textarea" placeholder="请输入拒绝原因" />
-      </div>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="handlerefusalToAccept"> 完成 </el-button>
-        </div>
-      </template>
-    </el-dialog>
-  </div>
-</template>
-
-<script setup lang="tsx" name="useProTable">
-import { ref, reactive, onMounted, onActivated } from "vue";
-import { Reconciliation } from "@/api/interface";
-import { ElMessage, ElMessageBox } from "element-plus";
-import ProTable from "@/components/ProTable/index.vue";
-import { ProTableInstance, ColumnProps } from "@/components/ProTable/interface";
-import { getWithdrawalList, getDownloadUrl, approveCashOut } from "@/api/modules/Reconciliation";
-import { useRouter } from "vue-router";
-const router = useRouter();
-
-
-const dialogTableVisible = ref(false);
-const dialogTableVisibleJj = ref(false);
-const showForm = ref({});
-const cause = ref("");
-const itemValue = ref({});
-// 打开结算回执单
-const showDetail = row => {
-  showForm.value = row;
-  dialogTableVisible.value = true;
-};
-
-// ProTable 实例
-const proTable = ref<ProTableInstance>();
-// 页面加载时触发查询
-onMounted(() => {
-  proTable.value?.getTableList();
-});
-
-// 从其他页面返回时触发查询
-onActivated(() => {
-  proTable.value?.getTableList();
-});
-
-// 或者直接去 hooks/useTable.ts 文件中把字段改为你后端对应的就行
-const dataCallback = (data: any) => {
-  return {
-    list: data.records,
-    total: data.total
-  };
-};
-
-// 如果你想在请求之前对当前请求参数做一些操作,可以自定义如下函数:params 为当前所有的请求参数(包括分页),最后返回请求列表接口
-// 默认不做操作就直接在 ProTable 组件上绑定	:requestApi="getUserList"
-const getTableList = (params: any) => {
-  let newParams = JSON.parse(JSON.stringify(params));
-  newParams.page = newParams.pageNum;
-  newParams.size = newParams.pageSize;
-  delete newParams.pageNum;
-  delete newParams.pageSize;
-  return getWithdrawalList(newParams);
-};
-// 门店审核状态列表
-const paymentStatus = ref<any[]>([
-  { value: 0, label: "进行中" },
-  { value: 1, label: "已付款" },
-  { value: 2, label: "付款失败" },
-  { value: 3, label: "待审核" },
-  { value: 4, label: "已拒接" },
-  { value: 5, label: "审核通过" }
-]);
-// 表格配置项
-const columns = reactive<ColumnProps<Reconciliation.WithdrawalList>[]>([
-  { prop: "index", label: "排名", type: "index", width: 80 },
-  { prop: "storeName", label: "商家名称", search: { el: "input" } },
-  { prop: "storeId", label: "商家ID" },
-  { prop: "cashOutTypeName", label: "提现类型" },
-  { prop: "money", label: "提现金额" },
-  { prop: "createdTime", label: "发起时间" },
-  { prop: "approveTime", label: "审批时间" },
-  { prop: "payDate", label: "支付时间" },
-  { prop: "operation", label: "结算回执单", width: 120 },
-  { prop: "paymentStatus", label: "状态", enum: paymentStatus, fieldNames: { label: "label", value: "value" } },
-  { prop: "failReason", label: "拒接原因" },
-  { prop: "operationRight", label: "操作", fixed: "right", width: 220 }
-]);
-
-const handleDownload = async () => {
-  try {
-    let res = await getDownloadUrl({ cashId: showForm.value.cashId });
-    if (res.code == "200") {
-      if (!res.data.filePath) {
-        ElMessage.error("暂无可下载结算单");
-        return;
-      }
-      const exportFile = document.createElement("a");
-      exportFile.style.display = "none";
-      exportFile.download = `${showForm.value.storeName}_结算单.xlsx`;
-      // return;
-      exportFile.href = `${res.data.filePath}?timestamp=${new Date().getTime()}`; // 添加时间戳防止缓存
-      document.body.appendChild(exportFile);
-      exportFile.click();
-      // 去除下载对 url 的影响
-      document.body.removeChild(exportFile);
-      ElMessage.success("下载成功");
-      dialogTableVisible.value = false;
-    }
-  } catch (err) {
-    ElMessage.error("下载失败");
-  }
-};
-// 点击同意付款
-const okFuKuan = row => {
-  ElMessageBox.confirm("同意后不可撤销,请仔细核对", "同意付款", {
-    confirmButtonText: "继续付款",
-    cancelButtonText: "取消"
-  })
-    .then(() => {
-      approveCashOut({
-        approveStatus: 0,
-        cashOutId: row.cashId
-      }).then((res: any) => {
-        if (res.code == 200) {
-          ElMessage.success("付款成功");
-          proTable.value?.getTableList();
-        }
-      });
-    })
-    .catch(() => {});
-};
-// 点击拒绝
-const okReject = row => {
-  itemValue.value = row;
-  dialogTableVisibleJj.value = true;
-};
-//点击拒接完成
-const handlerefusalToAccept = () => {
-  approveCashOut({
-    approveStatus: 1,
-    cashOutId: itemValue.value.cashId,
-    failReason: cause.value
-  }).then((res: any) => {
-    if (res.code == 200) {
-      ElMessage.success("已拒接!");
-      proTable.value?.getTableList();
-      cause.value = "";
-    }
-  });
-
-  dialogTableVisibleJj.value = false;
-};
-
-//跳转详情页
-const handleToDetail = (id)=>{
-  router.push({
-    path: '/store/withDrawalDetail',
-    query: {
-      id: id
-    }
-  })
-}
-</script>
-<style scoped lang="scss">
-.table {
-  display: table;
-  width: 100%;
-  border-collapse: collapse; /* 合并边框 */
-}
-.row {
-  display: table-row;
-}
-.cell {
-  box-sizing: border-box; /* 确保边框和内边距包含在宽度内 */
-  display: table-cell;
-  padding: 8px;
-  text-align: left;
-  text-align: center;
-  border: 1px solid #cccccc;
-}
-.header .cell {
-  font-weight: bold;
-}
-.form-item {
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-}
-.title {
-  margin: 15px 0;
-  font-size: 16px;
-  font-weight: 500;
-  color: #333333;
-}
-</style>

+ 0 - 228
src/views/store/Reconciliation/withDrawalDetail.vue

@@ -1,228 +0,0 @@
-<template>
-  <el-card style="width: 100%; min-height: 85vh">
-    <template #header>
-      <div class="card-header">
-        <span>提现详情</span>
-      </div>
-    </template>
-    <el-form :model="form" label-width="auto" style="max-width: 600px">
-      <el-form-item label="商家名称">
-        {{ form.storeName }}
-      </el-form-item>
-      <el-form-item label="商家ID">
-        {{ form.storeId }}
-      </el-form-item>
-      <el-form-item label="提现类型">
-        {{ form.cashOutTypeName }}
-      </el-form-item>
-      <el-form-item label="提现金额">
-        {{ formatAmount(form.money) }}
-      </el-form-item>
-      <el-form-item label="发起时间">
-        {{ form.createdTime }}
-      </el-form-item>
-      <el-form-item label="审批时间">
-        {{ form.approveTime }}
-      </el-form-item>
-      <el-form-item label="支付时间">
-        {{ form.payDate }}
-      </el-form-item>
-      <el-form-item label="结算回执单">
-        <el-button type="primary" @click="showDetail"> 点击查看 </el-button>
-      </el-form-item>
-      <el-form-item label="状态">
-        {{ paymentStatusName(form.paymentStatus) }}
-      </el-form-item>
-      <el-form-item label="失败原因">
-        {{ form.failReason }}
-      </el-form-item>
-      <el-form-item label="拒绝原因">
-        {{ form.approveFailReason }}
-      </el-form-item>
-    </el-form>
-
-    <view style=" display: flex; justify-content: center;width: 100%">
-      <el-button @click="goBack"> 返回 </el-button>
-    </view>
-  </el-card>
-
-  <!-- 查看结算回执单 弹窗 -->
-  <el-dialog v-model="dialogTableVisible" title="结算回执单" width="800">
-    <div class="title">基本信息</div>
-    <div class="form-item">
-      <div>商家名称:{{ showForm.storeName }}</div>
-      <div>商家账号:{{ showForm.storeId }}</div>
-      <div>联系方式:{{ showForm.storePhone }}</div>
-    </div>
-
-    <div class="title">结算金额</div>
-    <div class="table">
-      <div class="row header">
-        <div class="cell">账单金额</div>
-        <div class="cell">已付金额</div>
-        <div class="cell">提现到账时间</div>
-      </div>
-      <div class="row">
-        <div class="cell">
-          {{ showForm.money }}
-        </div>
-        <div class="cell">
-          {{ showForm.money }}
-        </div>
-        <div class="cell">
-          {{ showForm.payDate }}
-        </div>
-      </div>
-    </div>
-
-    <template #footer>
-      <div class="dialog-footer">
-        <el-button type="primary" @click="handleDownload"> 下载 </el-button>
-      </div>
-    </template>
-  </el-dialog>
-</template>
-
-<script setup lang="tsx" name="useProTable">
-import { ref, reactive, onMounted, computed, nextTick } from "vue";
-import { ElMessage } from "element-plus";
-import { getDownloadUrl, getCashOutDetail } from "@/api/modules/Reconciliation";
-import { useRouter, useRoute } from "vue-router";
-const router = useRouter();
-const route = useRoute();
-
-const form = ref({ allOrderAmount: 0, orderTransactionNumber: 0, userCount: 0, verificationAmount: 0 });
-
-const paymentStatusName = paymentStatus => {
-  return paymentStatusNameMap.value.find(item => item.value == paymentStatus)?.label;
-};
-
-const paymentStatusNameMap = ref([
-  {
-    value: "0",
-    label: "进行中"
-  },
-  {
-    value: "1",
-    label: "成功"
-  },
-  {
-    value: "2",
-    label: "失败"
-  },
-  {
-    value: "3",
-    label: "待审核"
-  },
-  {
-    value: "4",
-    label: "已拒绝"
-  },
-  {
-    value: "5",
-    label: "审核通过"
-  }
-]);
-
-// 添加金额格式化函数
-const formatAmount = (amount: number | string) => {
-  const num = Number(amount);
-  if (isNaN(num)) return "0";
-
-  if (Math.abs(num) >= 10000) {
-    return `${(num / 10000).toFixed(2)}万元`;
-  } else if (num === 0) {
-    return "0";
-  } else {
-    return `${num.toFixed(2)}元`;
-  }
-};
-const dialogTableVisible = ref(false);
-const showForm = ref({});
-
-// 打开结算回执单
-const showDetail = () => {
-  showForm.value = form.value;
-  dialogTableVisible.value = true;
-};
-
-const handleDownload = async () => {
-  try {
-    let res = await getDownloadUrl({ cashId: showForm.value.cashId });
-    if (res.code == "200") {
-      if (!res.data.filePath) {
-        ElMessage.error("暂无可下载结算单");
-        return;
-      }
-      const exportFile = document.createElement("a");
-      exportFile.style.display = "none";
-      exportFile.download = `${showForm.value.storeName}_结算单.xlsx`;
-      // return;
-      exportFile.href = `${res.data.filePath}?timestamp=${new Date().getTime()}`; // 添加时间戳防止缓存
-      document.body.appendChild(exportFile);
-      exportFile.click();
-      // 去除下载对 url 的影响
-      document.body.removeChild(exportFile);
-      ElMessage.success("下载成功");
-      dialogTableVisible.value = false;
-    }
-  } catch (err) {
-    ElMessage.error("下载失败");
-  }
-};
-
-onMounted(() => {
-  getDetail(route.query.id);
-});
-
-const getDetail = async id => {
-  let params = {
-    id: id
-  };
-
-  try {
-    let res = await getCashOutDetail(params);
-    if (res.code == 200) {
-      form.value = res.data;
-    }
-  } catch (error) {
-    ElMessage.error("获取详情失败");
-  }
-};
-
-const goBack = () => {
-  router.go(-1);
-};
-</script>
-<style lang="scss" scoped>
-.table {
-  display: table;
-  width: 100%;
-  border-collapse: collapse; /* 合并边框 */
-}
-.row {
-  display: table-row;
-}
-.cell {
-  box-sizing: border-box; /* 确保边框和内边距包含在宽度内 */
-  display: table-cell;
-  padding: 8px;
-  text-align: left;
-  text-align: center;
-  border: 1px solid #cccccc;
-}
-.header .cell {
-  font-weight: bold;
-}
-.form-item {
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-}
-.title {
-  margin: 15px 0;
-  font-size: 16px;
-  font-weight: 500;
-  color: #333333;
-}
-</style>

+ 0 - 198
src/views/store/talent/apply/index.vue

@@ -1,198 +0,0 @@
-<template>
-  <div class="table-box">
-    <ProTable ref="proTable" :columns="columns" :request-api="getTableList" :data-callback="dataCallback">
-      <template #expertStatus="scope">
-        <el-tag v-if="scope.row.expertStatus == 0" type="success"> 已通过 </el-tag>
-        <el-tag v-if="scope.row.expertStatus == 1" type="primary"> 待审核 </el-tag>
-        <el-tag v-if="scope.row.expertStatus == 2" type="danger"> 已驳回 </el-tag>
-      </template>
-      <template #promoteType="scope">
-        <el-tag v-for="(item, index) in getPromoteTypes(scope.row.promoteType)" :key="index">
-          {{ item }}
-        </el-tag>
-      </template>
-
-      <template #operation="scope">
-        <el-button type="primary" :icon="Search" link @click="handleDetail(scope.row)"> 查看详情 </el-button>
-        <el-button type="primary" :icon="Setting" v-if="scope.row.expertStatus == 1" link @click="handleReview(scope.row)">
-          审核
-        </el-button>
-      </template>
-    </ProTable>
-
-    <ReviewDialog ref="reviewDialog" @approve="handleApprove" @reject="handleReject" />
-    <DetailDialog ref="detailDialog" />
-  </div>
-</template>
-
-<script setup lang="ts">
-import ReviewDialog from "./reviewDialog.vue";
-import DetailDialog from "./detailDialog.vue";
-import { ref, reactive, onActivated } from "vue";
-import type { Course } from "@/api/interface";
-import { ElMessage } from "element-plus";
-import ProTable from "@/components/ProTable/index.vue";
-import type { ProTableInstance, ColumnProps } from "@/components/ProTable/interface";
-import { becomeExpert } from "@/api/modules/user";
-import { getApplicationExpertList } from "@/api/modules/masterManagemen";
-import { Search, Setting } from "@element-plus/icons-vue";
-
-const proTable = ref<ProTableInstance>();
-
-const reviewDialog = ref<any>(null);
-const detailDialog = ref<any>(null);
-// 门店审核状态列表
-const applyStatus = ref<any[]>([
-  { value: 0, label: "审核通过" },
-  { value: 1, label: "待审核" },
-  { value: 2, label: "审核拒绝" }
-]);
-
-const columns = reactive<ColumnProps<Course.ReqCourseParams>[]>([
-  {
-    label: "序号",
-    type: "index",
-    width: 60,
-    align: "center"
-  },
-  {
-    label: "ID",
-    prop: "id",
-    width: 80
-  },
-  {
-    label: "用户昵称",
-    prop: "userName",
-    search: { el: "input", tooltip: "请输入用户昵称" }
-  },
-  {
-    label: "姓名",
-    prop: "realName",
-    search: { el: "input", tooltip: "请输入姓名" }
-  },
-  {
-    label: "联系电话",
-    prop: "userPhone",
-    search: { el: "input", tooltip: "请输入手机号码" }
-  },
-  {
-    label: "推广板块",
-    prop: "promoteType"
-  },
-  {
-    label: "状态",
-    prop: "expertStatus",
-    search: { el: "select", tooltip: "请输入状态" },
-    enum: applyStatus,
-    fieldNames: { label: "label", value: "value" }
-  },
-  {
-    label: "申请时间",
-    prop: "createdTime"
-  },
-  {
-    label: "申请时间",
-    prop: "time",
-    isShow: false, // 关键:不在表格中显示
-    search: {
-      label: "申请时间范围", // 搜索区域显示的标签
-      el: "date-picker",
-      props: {
-        type: "datetimerange",
-        valueFormat: "YYYY-MM-DD HH:mm:ss",
-        rangeSeparator: "至",
-        startPlaceholder: "开始时间",
-        endPlaceholder: "结束时间"
-      }
-    }
-  },
-  {
-    label: "操作",
-    prop: "operation",
-    width: 200
-  }
-]);
-const getTableList = async (params: any) => {
-  let tempParams = JSON.parse(JSON.stringify(params));
-  delete tempParams.time;
-  // 深拷贝原始参数
-  let newParams = JSON.parse(JSON.stringify(tempParams));
-  newParams.page = newParams.pageNum;
-  newParams.size = newParams.pageSize;
-  delete newParams.pageNum;
-  delete newParams.pageSize;
-  if (params.time) {
-    newParams.createdTime = params.time[0];
-    newParams.endTime = params.time[1];
-  }
-
-  const res = await getApplicationExpertList(newParams);
-  return res;
-};
-const dataCallback = (data: any) => {
-  return {
-    list: data.records,
-    total: data.total
-  };
-};
-
-// 处理推广板块字符串
-const getPromoteTypes = (promoteType: string) => {
-  if (!promoteType) return [];
-  return promoteType.split(",");
-};
-
-//详情
-const handleDetail = row => {
-  detailDialog.value?.open(row.userId);
-};
-
-// 审核
-const handleReview = (row: any) => {
-  // 打开弹窗并传入当前行数据
-  reviewDialog.value?.open(row);
-};
-
-// 处理同意操作 expertStatus: 0  包含佣金和预付款比例
-const handleApprove = async (payload: { id: number; commissionRate: number; advanceRate: number; userPhone: string }) => {
-  try {
-    await becomeExpert({
-      id: payload.id,
-      expertStatus: 0,
-      commissionRate: payload.commissionRate,
-      advanceRate: payload.advanceRate,
-      userPhone: payload.userPhone
-    });
-
-    ElMessage.success("审核通过");
-    proTable.value?.getTableList();
-  } catch (error) {
-    console.error("审核通过失败:", error);
-    ElMessage.error("审核通过失败");
-  }
-};
-
-// 处理驳回操作 expertStatus: 2 包含驳回原因
-const handleReject = async (payload: { id: number; comment: string; userPhone: string }) => {
-  try {
-    await becomeExpert({
-      id: payload.id,
-      expertStatus: 2,
-      comment: payload.comment,
-      userPhone: payload.userPhone
-    });
-
-    ElMessage.success("审核驳回");
-    proTable.value?.getTableList();
-  } catch (error) {
-    console.error("审核驳回失败:", error);
-    ElMessage.error("审核驳回失败");
-  }
-};
-
-onActivated(() => {
-  proTable.value?.getTableList();
-});
-</script>
-
-<style scoped lang="scss"></style>

+ 0 - 261
src/views/store/talent/expertList/detailDialog.vue

@@ -1,261 +0,0 @@
-<template>
-  <el-dialog v-model="dialogShow" title="达人详情" draggable width="700px" @close="handleClose">
-    <!-- 关键指标区域 -->
-    <div class="metrics-sections">
-      <div class="metrics-section">
-        <div class="section-header">达人数据</div>
-        <div class="metrics-cards">
-          <div class="metric-card">
-            <div class="metric-label">粉丝量</div>
-            <div class="metric-value">
-              {{ detailData.fansNum || 0 }}
-            </div>
-          </div>
-          <div class="metric-card">
-            <div class="metric-label">作品数</div>
-            <div class="metric-value">
-              {{ detailData.worksNum || 0 }}
-            </div>
-          </div>
-          <div class="metric-card">
-            <div class="metric-label">播放量</div>
-            <div class="metric-value">
-              {{ detailData.playNum || 0 }}
-            </div>
-          </div>
-          <div class="metric-card">
-            <div class="metric-label">点赞量</div>
-            <div class="metric-value">
-              {{ detailData.likeNum || 0 }}
-            </div>
-          </div>
-          <div class="metric-card">
-            <div class="metric-label">评论量</div>
-            <div class="metric-value">
-              {{ detailData.commitCountSum || 0 }}
-            </div>
-          </div>
-          <!-- todo  后端还没有这个字段,后续需要调整 -->
-          <div class="metric-card">
-            <div class="metric-label">转发量</div>
-            <div class="metric-value">
-              {{ detailData.commitCountSum || 0 }}
-            </div>
-          </div>
-        </div>
-      </div>
-    </div>
-
-    <!-- 详情展示区域 -->
-    <div class="review-container">
-      <div class="review-detail">
-        <el-descriptions :column="2" border>
-          <!-- 基本信息 -->
-          <el-descriptions-item label="姓名" :span="2">
-            {{ detailData.realName }}
-          </el-descriptions-item>
-          <el-descriptions-item label="达人ID">
-            {{ detailData.id }}
-          </el-descriptions-item>
-          <el-descriptions-item label="达人昵称">
-            {{ detailData.userName }}
-          </el-descriptions-item>
-          <el-descriptions-item label="身份证号码">
-            {{ detailData.idCard }}
-          </el-descriptions-item>
-          <el-descriptions-item label="联系电话">
-            {{ detailData.userPhone }}
-          </el-descriptions-item>
-
-          <!-- 推广信息 -->
-          <el-descriptions-item label="推广板块" :span="2">
-            <el-tag
-              v-for="(item, index) in getPromoteTypes(detailData.promoteType)"
-              :key="index"
-              style="margin-right: 5px; margin-bottom: 5px"
-            >
-              {{ item }}
-            </el-tag>
-          </el-descriptions-item>
-
-          <!-- 金额部分 -->
-          <el-descriptions-item label="订单总额(元)">
-            {{ formatAmount(detailData.orderMoney) }}
-          </el-descriptions-item>
-          <el-descriptions-item label="佣金总额(元)">
-            {{ formatAmount(detailData.commissionSum) }}
-          </el-descriptions-item>
-          <el-descriptions-item label="到账总额(元)">
-            {{ formatAmount(detailData.accountMoney) }}
-          </el-descriptions-item>
-          <el-descriptions-item label="未到账(元)">
-            {{ formatAmount(detailData.pendMoney) }}
-          </el-descriptions-item>
-          <el-descriptions-item label="简介" :span="2">
-            <div class="introduction">
-              {{ detailData.addExplanation || "暂无简介" }}
-            </div>
-          </el-descriptions-item>
-        </el-descriptions>
-      </div>
-    </div>
-  </el-dialog>
-</template>
-
-<script setup lang="ts">
-import { ref, defineExpose, defineEmits } from "vue";
-
-// 定义弹窗状态
-const dialogShow = ref(false);
-
-// 详情数据
-const detailData: any = ref({});
-
-// 处理推广板块字符串
-const getPromoteTypes = (promoteType: string) => {
-  if (!promoteType) return [];
-  return promoteType.split(",");
-};
-
-// 金额格式化
-const formatAmount = (amount: number | string) => {
-  const num = typeof amount === "string" ? parseFloat(amount) : amount;
-  return isNaN(num) ? "¥0.00" : `¥${num.toFixed(2)}`;
-};
-
-// 事件触发
-const emit = defineEmits(["close"]);
-
-// 显示弹窗方法
-const open = (data: any) => {
-  detailData.value = {
-    ...data
-  };
-  dialogShow.value = true;
-};
-
-// 关闭弹窗
-const handleClose = () => {
-  dialogShow.value = false;
-  emit("close");
-};
-
-// 暴露给父组件的方法
-defineExpose({
-  open,
-  close: handleClose
-});
-</script>
-
-<style lang="scss" scoped>
-.section-header {
-  padding-left: 5px;
-  margin: 10px 0 12px;
-  font-size: 16px;
-  font-weight: 600;
-  color: #303133;
-  border-left: 3px solid #409eff;
-}
-.metrics-sections {
-  display: flex;
-  gap: 20px;
-  margin-bottom: 15px;
-
-  @media (width <=600px) {
-    flex-direction: column;
-    gap: 10px;
-  }
-}
-.metrics-section {
-  flex: 1;
-  min-width: 0;
-  .section-header {
-    padding-left: 5px;
-    margin: 0 0 8px;
-    font-size: 14px;
-    font-weight: 600;
-    color: #303133;
-    border-left: 3px solid #409eff;
-  }
-}
-.metrics-cards {
-  display: grid;
-  grid-template-columns: repeat(6, 1fr);
-  gap: 8px;
-
-  @media (width <=600px) {
-    grid-template-columns: 1fr 1fr;
-  }
-}
-.metric-card {
-  padding: 8px 10px;
-  background: #f8f9fa;
-  border: 1px solid #ebeef5;
-  border-radius: 6px;
-  transition: all 0.2s ease;
-  &:hover {
-    background: #f0f7ff;
-    border-color: #d6e4ff;
-  }
-}
-.metric-label {
-  margin-bottom: 4px;
-  font-size: 12px;
-  font-weight: 500;
-  color: #606266;
-}
-.metric-value {
-  font-size: 15px;
-  font-weight: 600;
-  color: #303133;
-}
-.review-container {
-  margin-bottom: 15px;
-
-  /* 滚动条样式优化 */
-  &::-webkit-scrollbar {
-    width: 6px;
-  }
-  &::-webkit-scrollbar-track {
-    background: #f1f1f1;
-    border-radius: 3px;
-  }
-  &::-webkit-scrollbar-thumb {
-    background: #c1c1c1;
-    border-radius: 3px;
-  }
-  &::-webkit-scrollbar-thumb:hover {
-    background: #a8a8a8;
-  }
-}
-.review-detail {
-  .introduction {
-    min-height: 80px;
-    padding: 8px 12px;
-    line-height: 1.5;
-    word-break: break-word;
-    white-space: pre-wrap;
-    background: #f8f9fa;
-    border-radius: 4px;
-  }
-}
-
-/* 隐藏预览时的操作栏 */
-:deep(.el-image-viewer__btn) {
-  display: none !important;
-}
-
-/* 或者更精确地隐藏操作栏区域 */
-:deep(.el-image-viewer__actions) {
-  display: none !important;
-}
-
-/* 调整描述项的间距 */
-:deep(.el-descriptions__label) {
-  font-weight: 600;
-  background-color: #fafafa;
-}
-:deep(.el-descriptions__cell) {
-  padding: 8px 15px;
-}
-</style>

+ 0 - 388
src/views/store/talent/expertList/index.vue

@@ -1,388 +0,0 @@
-<template>
-  <div class="table-box">
-    <ProTable ref="proTable" :columns="columns" :request-api="getTableList" :data-callback="dataCallback">
-      <template #expertStatus="scope">
-        <el-tag v-if="scope.row.expertStatus == 0" type="success"> 已通过 </el-tag>
-        <el-tag v-if="scope.row.expertStatus == 1" type="primary"> 待审核 </el-tag>
-        <el-tag v-if="scope.row.expertStatus == 2" type="danger"> 已驳回 </el-tag>
-      </template>
-      <template #promoteType="scope">
-        <el-tag v-for="(item, index) in getPromoteTypes(scope.row.promoteType)" :key="index">
-          {{ item }}
-        </el-tag>
-      </template>
-
-      <template #operation="scope">
-        <el-button type="primary" :icon="Search" link @click="handleDetail(scope.row)"> 详情 </el-button>
-        <el-button type="primary" :icon="Setting" link @click="handleSettingCommission(scope.row)"> 设置佣金比例 </el-button>
-      </template>
-    </ProTable>
-
-    <!-- 设置佣金及预付款弹窗 -->
-    <el-dialog
-      title="设置佣金及预付款"
-      v-model="commissionDialogVisible"
-      width="400px"
-      append-to-body
-      @closed="resetCommissionForm"
-    >
-      <el-form :model="commissionForm" :rules="commissionRules" ref="commissionFormRef" label-width="120px">
-        <el-form-item label="佣金比例" prop="commissionRate">
-          <el-input-number
-            v-model="commissionForm.commissionRate"
-            :min="0"
-            :max="99"
-            :precision="0"
-            controls-position="right"
-            style="width: 80%"
-          />
-          <div class="form-tip">范围:0-99的整数,表示百分比</div>
-        </el-form-item>
-        <el-form-item label="预付款比例" prop="advanceRate">
-          <el-input-number
-            v-model="commissionForm.advanceRate"
-            :min="1"
-            :max="99"
-            :precision="0"
-            controls-position="right"
-            style="width: 80%"
-          />
-          <div class="form-tip">范围:1-99的整数,表示百分比</div>
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="cancelCommission">取消</el-button>
-          <el-button type="primary" @click="submitCommission">确认</el-button>
-        </span>
-      </template>
-    </el-dialog>
-
-    <DetailDialog ref="detailDialog" />
-  </div>
-</template>
-
-<script setup lang="ts">
-import DetailDialog from "./detailDialog.vue";
-import { ref, reactive, onActivated } from "vue";
-import type { Course } from "@/api/interface";
-import ProTable from "@/components/ProTable/index.vue";
-import type { ProTableInstance, ColumnProps } from "@/components/ProTable/interface";
-import { getUserExpertList, updateProportion } from "@/api/modules/masterManagemen";
-import { ElMessage, ElMessageBox, FORWARD_REF_INJECTION_KEY } from "element-plus";
-import { Search, Setting } from "@element-plus/icons-vue";
-import type { FormInstance, FormRules } from "element-plus";
-import { IndentStyle } from "typescript";
-import { LOGIN_URL } from "@/config";
-import Index from "@/layouts/index.vue";
-
-const proTable = ref<ProTableInstance>();
-
-// 定义弹窗状态
-const commissionDialogVisible = ref(false);
-const commissionFormRef = ref<FormInstance>();
-const detailDialog = ref<any>(null);
-
-// 添加当前行数据引用
-const currentRow = ref<any>(null);
-
-// 佣金表单
-const commissionForm = reactive({
-  commissionRate: 0,
-  advanceRate: 1
-});
-
-// 重置表单
-const resetCommissionForm = () => {
-  commissionForm.commissionRate = 0;
-  commissionForm.advanceRate = 1;
-  currentRow.value = null;
-};
-
-// 佣金表单验证规则
-const commissionRules: FormRules = {
-  commissionRate: [
-    { required: true, message: "请输入佣金比例", trigger: "blur" },
-    { type: "number", min: 0, max: 99, message: "佣金比例必须是0-99的整数", trigger: "blur" }
-  ],
-  advanceRate: [
-    { required: true, message: "请输入预付款比例", trigger: "blur" },
-    { type: "number", min: 1, max: 99, message: "预付款比例必须是1-99的整数", trigger: "blur" }
-  ]
-};
-
-const columns = reactive<ColumnProps<Course.ReqCourseParams>[]>([
-  {
-    label: "序号",
-    type: "index",
-    width: 60,
-    align: "center",
-    fixed: "left"
-  },
-  {
-    label: "达人昵称",
-    prop: "userName",
-    width: 120,
-    fixed: "left",
-    showOverflowTooltip: true
-  },
-  {
-    label: "姓名",
-    prop: "realName",
-    search: { el: "input", tooltip: "请输入姓名" },
-    width: 100,
-    showOverflowTooltip: true
-  },
-  {
-    label: "联系电话",
-    prop: "userPhone",
-    search: { el: "input", tooltip: "请输入手机号码" },
-    width: 120,
-    showOverflowTooltip: true
-  },
-  {
-    label: "推广板块",
-    prop: "promoteType",
-    width: 150,
-    showOverflowTooltip: true
-  },
-  {
-    label: "粉丝量",
-    prop: "fansNum",
-    sortable: true,
-    width: 100,
-    align: "center"
-  },
-  {
-    label: "作品数",
-    prop: "worksNum",
-    sortable: true,
-    width: 100,
-    align: "center"
-  },
-  {
-    label: "播放量",
-    prop: "playNum",
-    sortable: true,
-    width: 100,
-    align: "center"
-  },
-  {
-    label: "点赞量",
-    prop: "likeNum",
-    sortable: true,
-    width: 100,
-    align: "center"
-  },
-  {
-    label: "评论量",
-    prop: "commitCountSum",
-    sortable: true,
-    width: 100,
-    align: "center"
-  },
-  // todo  后端还没有这个字段,后续需要调整
-  {
-    label: "转发量",
-    prop: "commitCountSum",
-    sortable: true,
-    width: 100,
-    align: "center"
-  },
-  {
-    label: "订单总额(元)",
-    prop: "orderMoney",
-    sortable: true,
-    width: 140,
-    align: "center",
-    className: "financial-column"
-  },
-  {
-    label: "佣金总额(元)",
-    prop: "commissionSum",
-    sortable: true,
-    width: 140,
-    align: "center",
-    className: "financial-column"
-  },
-  {
-    label: "到账总额(元)",
-    prop: "accountMoney",
-    sortable: true,
-    width: 140,
-    align: "center",
-    className: "financial-column"
-  },
-  {
-    label: "未到账总额(元)",
-    prop: "pendMoney",
-    sortable: true,
-    width: 160,
-    align: "center",
-    className: "financial-column"
-  },
-  {
-    label: "操作",
-    prop: "operation",
-    width: 240,
-    fixed: "right"
-  }
-]);
-
-const getTableList = async (params: any) => {
-  let tempParams = JSON.parse(JSON.stringify(params));
-  delete tempParams.time;
-  // 深拷贝原始参数
-  let newParams = JSON.parse(JSON.stringify(tempParams));
-  newParams.page = newParams.pageNum;
-  newParams.size = newParams.pageSize;
-  delete newParams.pageNum;
-  delete newParams.pageSize;
-  if (params.time) {
-    newParams.createdTime = params.time[0];
-    newParams.endTime = params.time[1];
-  }
-  const res: any = await getUserExpertList(newParams);
-  return res;
-};
-
-const dataCallback = (data: any) => {
-  return {
-    list: data.records,
-    total: data.total
-  };
-};
-
-// 处理推广板块字符串
-const getPromoteTypes = (promoteType: string) => {
-  if (!promoteType) return [];
-  return promoteType.split(",");
-};
-
-//详情
-const handleDetail = row => {
-  detailDialog.value?.open(row);
-};
-
-//设置佣金
-const handleSettingCommission = (row: any) => {
-  currentRow.value = row;
-  // 回显当前行的佣金和预付款比例
-  commissionForm.commissionRate = row.commissionRate ? Number(row.commissionRate) : 0;
-  commissionForm.advanceRate = row.advanceRate ? Number(row.advanceRate) : 1;
-  commissionDialogVisible.value = true;
-};
-
-// 取消设置
-const cancelCommission = () => {
-  resetCommissionForm();
-  commissionDialogVisible.value = false;
-};
-
-// 提交佣金设置
-const submitCommission = async () => {
-  if (!commissionFormRef.value) return;
-
-  const valid = await commissionFormRef.value.validate();
-  if (!valid) return;
-
-  try {
-    // 二次确认弹窗
-    await ElMessageBox.confirm(
-      `确认设置佣金比例为 ${commissionForm.commissionRate}%,预付款比例为 ${commissionForm.advanceRate}%?`,
-      "确认设置",
-      {
-        confirmButtonText: "确认",
-        cancelButtonText: "取消",
-        type: "warning"
-      }
-    );
-
-    // 调用保存接口
-    const res: any = await updateProportion({
-      id: currentRow.value.id,
-      commissionRate: commissionForm.commissionRate,
-      advanceRate: commissionForm.advanceRate
-    });
-
-    if (res.code == 200) {
-      ElMessage.success(res.msg);
-      resetCommissionForm();
-      commissionDialogVisible.value = false;
-      proTable.value?.getTableList();
-    } else {
-      ElMessage.error(res.msg || "设置失败");
-    }
-  } catch (error) {
-    console.log("用户取消了设置操作");
-  }
-};
-
-onActivated(() => {
-  proTable.value?.getTableList();
-});
-</script>
-
-<style scoped lang="scss">
-/* 表单提示文字样式 */
-.form-tip {
-  margin-top: 5px;
-  font-size: 12px;
-  line-height: 1.3;
-  color: #909399;
-}
-
-/* 操作列按钮间距优化 */
-:deep(.operation-column .cell) {
-  display: flex;
-  gap: 12px;
-  justify-content: flex-end;
-  .el-button {
-    height: auto;
-    padding: 5px 10px;
-    &.is-link {
-      min-width: auto;
-      padding: 0;
-    }
-  }
-}
-
-/* 金额列高亮显示 */
-:deep(.financial-column .cell) {
-  font-weight: 600;
-  color: #e6a23c;
-  text-align: c;
-}
-
-/* 表格行悬停效果增强 */
-:deep(.el-table--enable-row-hover .el-table__body tr:hover > td) {
-  background-color: #f5f9ff !important;
-  transition: background-color 0.3s;
-}
-
-/* 优化表单验证错误提示 */
-:deep(.el-form-item.is-error .el-input__inner) {
-  border-color: #f56c6c;
-  animation: shake 0.5s;
-}
-
-@keyframes shake {
-  0%,
-  100% {
-    transform: translateX(0);
-  }
-  10%,
-  30%,
-  50%,
-  70%,
-  90% {
-    transform: translateX(-5px);
-  }
-  20%,
-  40%,
-  60%,
-  80% {
-    transform: translateX(5px);
-  }
-}
-</style>

+ 0 - 248
src/views/store/talent/firstPayment/detailDialog.vue

@@ -1,248 +0,0 @@
-<template>
-  <el-dialog v-model="dialogShow" title="预付款详情" draggable width="700px" @close="handleClose">
-    <!-- 预计指标标题 -->
-    <div class="section-header">预计指标</div>
-
-    <!-- 关键指标卡片区域 -->
-    <div class="metrics-cards">
-      <div class="metric-card">
-        <div class="metric-label">GMV(元)</div>
-        <div class="metric-value" style="margin-left: 70px">
-          {{ formatAmount(detailData.orderNewGmv) }}
-        </div>
-      </div>
-      <div class="metric-card">
-        <div class="metric-label">播放量</div>
-        <div class="metric-value" style="margin-left: 70px">
-          {{ detailData.orderPlayCount }}
-        </div>
-      </div>
-    </div>
-
-    <!-- 详情展示区域 -->
-    <div class="review-container">
-      <div class="review-detail">
-        <el-descriptions :column="2" border>
-          <!-- 第一列:重要信息 -->
-          <el-descriptions-item label="订单编号" :span="2">
-            {{ detailData.orderNo }}
-          </el-descriptions-item>
-          <el-descriptions-item label="套餐名称" :span="2">
-            {{ detailData.name }}
-          </el-descriptions-item>
-          <el-descriptions-item label="商家ID">
-            {{ detailData.id }}
-          </el-descriptions-item>
-          <el-descriptions-item label="商家昵称">
-            {{ detailData.storeName }}
-          </el-descriptions-item>
-          <el-descriptions-item label="姓名">
-            {{ detailData.realName }}
-          </el-descriptions-item>
-          <el-descriptions-item label="身份证号码" :span="2">
-            {{ detailData.idCard }}
-          </el-descriptions-item>
-          <el-descriptions-item label="联系电话">
-            {{ detailData.userPhone }}
-          </el-descriptions-item>
-          <el-descriptions-item label="实付款(元)">
-            {{ formatAmount(detailData.orderMoney) }}
-          </el-descriptions-item>
-
-          <!-- 第二列:财务信息 -->
-          <el-descriptions-item label="预付款比例"> {{ detailData.advanceRate || 0 }}% </el-descriptions-item>
-          <el-descriptions-item label="预付款(元)">
-            {{ formatAmount(detailData.advance) }}
-          </el-descriptions-item>
-
-          <el-descriptions-item label="佣金比例"> {{ detailData.commissionRate || 0 }}% </el-descriptions-item>
-          <el-descriptions-item label="佣金(元)">
-            {{ formatAmount(detailData.commission) }}
-          </el-descriptions-item>
-
-          <!-- 底部重要信息 -->
-          <el-descriptions-item label="推广模块" :span="2">
-            <el-tag
-              v-for="(item, index) in getPromoteTypes(detailData.promoteType)"
-              :key="index"
-              style="margin-right: 5px; margin-bottom: 5px"
-            >
-              {{ item }}
-            </el-tag>
-          </el-descriptions-item>
-
-          <el-descriptions-item label="状态" :span="2">
-            <el-tag v-if="detailData.advancePaymentStatus == 0" type="success"> 审核通过 </el-tag>
-            <el-tag v-if="detailData.advancePaymentStatus == 1" type="success"> 待完成 </el-tag>
-            <el-tag v-if="detailData.advancePaymentStatus == 2" type="primary"> 已完成 </el-tag>
-          </el-descriptions-item>
-
-          <el-descriptions-item label="下单时间">
-            {{ detailData.orderTime || "--" }}
-          </el-descriptions-item>
-          <el-descriptions-item label="支付时间">
-            {{ detailData.payTime || "--" }}
-          </el-descriptions-item>
-          <el-descriptions-item
-            label="审核时间"
-            v-if="detailData.advancePaymentTime && detailData.advancePaymentTime.trim() !== ''"
-          >
-            {{ detailData.advancePaymentTime }}
-          </el-descriptions-item>
-          <el-descriptions-item label="驳回原因" v-if="detailData.reasonRefusal">
-            {{ detailData.reasonRefusal }}
-          </el-descriptions-item>
-        </el-descriptions>
-      </div>
-    </div>
-  </el-dialog>
-</template>
-
-<script setup lang="ts">
-import { ref, defineExpose, defineEmits } from "vue";
-
-// 定义弹窗状态
-const dialogShow = ref(false);
-
-// 详情数据
-const detailData: any = ref({});
-
-// 处理推广板块字符串
-const getPromoteTypes = (promoteType: string) => {
-  if (!promoteType) return [];
-  return promoteType.split(",");
-};
-
-// 金额格式化
-const formatAmount = (amount: number | string) => {
-  const num = typeof amount === "string" ? parseFloat(amount) : amount;
-  return isNaN(num) ? "¥0.00" : `¥${num.toFixed(2)}`;
-};
-
-// 事件触发
-const emit = defineEmits(["close"]);
-
-// 显示弹窗方法
-const open = (data: any) => {
-  detailData.value = {
-    ...data
-  };
-  dialogShow.value = true;
-};
-
-// 关闭弹窗
-const handleClose = () => {
-  dialogShow.value = false;
-  emit("close");
-};
-
-// 暴露给父组件的方法
-defineExpose({
-  open,
-  close: handleClose
-});
-</script>
-
-<style lang="scss" scoped>
-.section-header {
-  padding-left: 5px;
-  margin: 10px 0 12px;
-  font-size: 16px;
-  font-weight: 600;
-  color: #303133;
-  border-left: 3px solid #409eff;
-}
-.metrics-cards {
-  display: grid;
-  grid-template-columns: 1fr 1fr;
-  gap: 12px;
-  padding: 10px 0;
-  margin-bottom: 20px;
-}
-.metric-card {
-  padding: 12px 15px;
-  background: #f8f9fa;
-  border: 1px solid #ebeef5;
-  border-radius: 8px;
-  box-shadow: 0 2px 6px rgb(0 0 0 / 5%);
-  transition: all 0.3s ease;
-  &:hover {
-    background: #f0f7ff;
-    border-color: #d6e4ff;
-    box-shadow: 0 4px 12px rgb(0 0 0 / 8%);
-    transform: translateY(-2px);
-  }
-}
-.metric-label {
-  margin-bottom: 6px;
-  font-size: 13px;
-  font-weight: 600;
-  color: #606266;
-}
-.metric-value {
-  font-size: 18px;
-  font-weight: 700;
-  line-height: 1.2;
-  color: #303133;
-}
-.review-container {
-  margin-bottom: 15px;
-
-  /* 滚动条样式优化 */
-  &::-webkit-scrollbar {
-    width: 6px;
-  }
-  &::-webkit-scrollbar-track {
-    background: #f1f1f1;
-    border-radius: 3px;
-  }
-  &::-webkit-scrollbar-thumb {
-    background: #c1c1c1;
-    border-radius: 3px;
-  }
-  &::-webkit-scrollbar-thumb:hover {
-    background: #a8a8a8;
-  }
-}
-.review-detail {
-  .introduction {
-    line-height: 1.5;
-    word-break: break-word;
-    white-space: pre-wrap;
-  }
-}
-
-/* 隐藏预览时的操作栏 */
-:deep(.el-image-viewer__btn) {
-  display: none !important;
-}
-
-/* 或者更精确地隐藏操作栏区域 */
-:deep(.el-image-viewer__actions) {
-  display: none !important;
-}
-.image-grid {
-  display: grid;
-  grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
-  gap: 8px;
-}
-.image-item {
-  aspect-ratio: 1;
-  overflow: hidden;
-}
-.gallery-image {
-  width: 100%;
-  height: 100%;
-  cursor: pointer;
-  object-fit: cover;
-}
-
-/* 调整描述项的间距 */
-:deep(.el-descriptions__label) {
-  font-weight: 600;
-  background-color: #fafafa;
-}
-:deep(.el-descriptions__cell) {
-  padding: 10px 20px;
-}
-</style>

+ 0 - 311
src/views/store/talent/firstPayment/index.vue

@@ -1,311 +0,0 @@
-<template>
-  <div class="table-box">
-    <ProTable ref="proTable" :columns="columns" :request-api="getTableList" :data-callback="dataCallback">
-      <template #advancePaymentStatus="scope">
-        <el-tag v-if="scope.row.advancePaymentStatus == 0" type="success"> 审核通过 </el-tag>
-        <el-tag v-if="scope.row.advancePaymentStatus == 1" type="success"> 待完成 </el-tag>
-        <el-tag v-if="scope.row.advancePaymentStatus == 2" type="primary"> 已完成 </el-tag>
-      </template>
-      <template #promoteType="scope">
-        <el-tag v-for="(item, index) in getPromoteTypes(scope.row.promoteType)" :key="index">
-          {{ item }}
-        </el-tag>
-      </template>
-
-      <template #operation="scope">
-        <el-button type="primary" :icon="Search" link @click="handleDetail(scope.row)"> 查看详情 </el-button>
-        <el-button
-          type="primary"
-          :icon="Setting"
-          v-if="scope.row.advancePaymentStatus == 1"
-          link
-          @click="handleReview(scope.row)"
-        >
-          审核
-        </el-button>
-      </template>
-    </ProTable>
-
-    <ReviewDialog ref="reviewDialog" @approve="handleApprove" @reject="handleReject" />
-    <DetailDialog ref="detailDialog" />
-  </div>
-</template>
-
-<script setup lang="ts">
-import ReviewDialog from "./reviewDialog.vue";
-import DetailDialog from "./detailDialog.vue";
-import { ref, reactive, onActivated } from "vue";
-import type { Course } from "@/api/interface";
-import { ElMessage } from "element-plus";
-import ProTable from "@/components/ProTable/index.vue";
-import type { ProTableInstance, ColumnProps } from "@/components/ProTable/interface";
-import { getAdvancePaymentList, getAdvancePaymentReview } from "@/api/modules/masterManagemen";
-import { Search, Setting } from "@element-plus/icons-vue";
-
-const proTable = ref<ProTableInstance>();
-
-const reviewDialog = ref<any>(null);
-const detailDialog = ref<any>(null);
-// 门店审核状态列表
-const applyStatus = ref<any[]>([
-  { value: 0, label: "审核通过" },
-  { value: 1, label: "待审核" },
-  { value: 2, label: "审核拒绝" }
-]);
-
-const columns = reactive<ColumnProps<Course.ReqCourseParams>[]>([
-  {
-    label: "序号",
-    type: "index",
-    width: 60,
-    align: "center",
-    fixed: "left" // 固定在左侧
-  },
-  {
-    label: "订单编号",
-    prop: "orderNo",
-    width: 200,
-    search: { el: "input", tooltip: "请输入订单编号" },
-    fixed: "left", // 固定在左侧
-    showOverflowTooltip: true
-  },
-  {
-    label: "套餐名称",
-    prop: "name",
-    width: 150,
-    search: { el: "input", tooltip: "请输入套餐名称" },
-    showOverflowTooltip: true
-  },
-  {
-    label: "商家昵称",
-    prop: "storeName",
-    width: 120,
-    search: { el: "input", tooltip: "请输入商家昵称" },
-    showOverflowTooltip: true
-  },
-  {
-    label: "姓名",
-    prop: "realName",
-    width: 100,
-    search: { el: "input", tooltip: "请输入姓名" },
-    showOverflowTooltip: true
-  },
-  {
-    label: "联系电话",
-    prop: "userPhone",
-    width: 120,
-    search: { el: "input", tooltip: "请输入手机号码" },
-    showOverflowTooltip: true
-  },
-  {
-    label: "推广板块",
-    prop: "promoteType",
-    width: 150,
-    showOverflowTooltip: true
-  },
-  {
-    label: "订单金额(元)",
-    prop: "orderMoney",
-    width: 120,
-    align: "right",
-    className: "financial-column" // 财务列样式
-  },
-  {
-    label: "佣金(元)",
-    prop: "commission",
-    width: 100,
-    align: "right",
-    className: "financial-column" // 财务列样式
-  },
-  {
-    label: "预付款(元)",
-    prop: "advance",
-    width: 120,
-    align: "right",
-    className: "financial-column" // 财务列样式
-  },
-  {
-    label: "状态",
-    prop: "advancePaymentStatus",
-    width: 100,
-    search: { el: "select", tooltip: "请输入状态" },
-    enum: applyStatus,
-    fieldNames: { label: "label", value: "value" }
-  },
-  {
-    label: "下单时间",
-    prop: "orderTime",
-    width: 180
-  },
-  {
-    label: "支付时间",
-    prop: "paymentTime",
-    width: 180
-  },
-  {
-    label: "下单开始时间",
-    prop: "orderCreatedTime",
-    isShow: false, // 不在表格中显示
-    search: {
-      el: "date-picker",
-      props: { type: "date", valueFormat: "YYYY-MM-DD" }
-    }
-  },
-  {
-    label: "下单结束时间",
-    prop: "orderEndTime",
-    isShow: false, // 不在表格中显示
-    search: {
-      el: "date-picker",
-      props: { type: "date", valueFormat: "YYYY-MM-DD" }
-    }
-  },
-  {
-    label: "操作",
-    prop: "operation",
-    width: 200,
-    fixed: "right" // 固定在右侧
-  }
-]);
-
-const getTableList = async (params: any) => {
-  // 深拷贝原始参数
-  let newParams = JSON.parse(JSON.stringify(params));
-  newParams.page = newParams.pageNum;
-  newParams.size = newParams.pageSize;
-  delete newParams.pageNum;
-  delete newParams.pageSize;
-  const res = await getAdvancePaymentList(newParams);
-  return res;
-};
-
-const dataCallback = (data: any) => {
-  return {
-    list: data.records,
-    total: data.total
-  };
-};
-
-// 处理推广板块字符串
-const getPromoteTypes = (promoteType: string) => {
-  if (!promoteType) return [];
-  return promoteType.split(",");
-};
-
-//详情
-const handleDetail = row => {
-  detailDialog.value?.open(row);
-};
-
-// 审核
-const handleReview = (row: any) => {
-  reviewDialog.value?.open(row);
-};
-
-// 处理同意操作 advancePaymentStatus: 0
-const handleApprove = async (payload: {
-  id: number;
-  name: string;
-  storeTel: number;
-  userPhone: string;
-  advance: number | string;
-}) => {
-  try {
-    const res: any = await getAdvancePaymentReview({
-      ...payload,
-      advancePaymentStatus: 0
-    });
-    if (res.data.status == 0) {
-      ElMessage.success(res.msg);
-    }
-    if (res.data.status == 1) {
-      ElMessage.error(res.data.codeMsg);
-    }
-    proTable.value?.getTableList();
-  } catch (error) {
-    console.error("审核通过失败:", error);
-    ElMessage.error("审核通过失败");
-  }
-};
-
-// 处理驳回操作 advancePaymentStatus: 2
-const handleReject = async (payload: {
-  id: number;
-  name: string;
-  storeTel: number;
-  userPhone: string;
-  reasonRefusal: string;
-  orderMoney: number | string;
-  orderNo: number | string;
-  advance: number | string;
-}) => {
-  try {
-    const res: any = await getAdvancePaymentReview({
-      ...payload,
-      advancePaymentStatus: 2
-    });
-    if (res.data.status == 0) {
-      ElMessage.success(res.msg);
-    }
-    if (res.data.status == 1) {
-      ElMessage.error(res.data.codeMsg);
-    }
-    proTable.value?.getTableList();
-  } catch (error) {
-    console.error("审核驳回失败:", error);
-    ElMessage.error("审核驳回失败");
-  }
-};
-
-onActivated(() => {
-  proTable.value?.getTableList();
-});
-</script>
-
-<style scoped lang="scss">
-/* 操作列按钮间距优化 */
-:deep(.operation-column .cell) {
-  display: flex;
-  gap: 12px;
-  justify-content: flex-end;
-  .el-button {
-    height: auto;
-    padding: 5px 10px;
-    &.is-link {
-      min-width: auto;
-      padding: 0;
-    }
-  }
-}
-
-/* 金额列高亮显示 */
-:deep(.financial-column .cell) {
-  font-weight: 600;
-  color: #e6a23c; // Element Plus 橙色
-  text-align: center;
-}
-
-/* 表格行悬停效果增强 */
-:deep(.el-table--enable-row-hover .el-table__body tr:hover > td) {
-  background-color: #f5f9ff !important;
-  transition: background-color 0.3s;
-}
-
-/* 表头样式优化 */
-:deep(.el-table__header-wrapper th) {
-  padding: 10px 0;
-  font-weight: 600;
-  color: #303133;
-  background-color: #f8f9fa;
-  .cell {
-    display: flex;
-    align-items: center;
-    justify-content: center;
-  }
-}
-
-/* 单元格内边距优化 */
-:deep(.el-table__cell) {
-  padding: 8px 0;
-}
-</style>

+ 0 - 354
src/views/store/talent/firstPayment/reviewDialog.vue

@@ -1,354 +0,0 @@
-<template>
-  <el-dialog v-model="dialogShow" title="预付款审核" draggable width="700px" @close="handleClose">
-    <!-- 预计指标标题 -->
-    <div class="section-header">预计指标</div>
-
-    <!-- 关键指标卡片区域 -->
-    <div class="metrics-cards">
-      <div class="metric-card">
-        <div class="metric-label">GMV(元)</div>
-        <div class="metric-value" style="margin-left: 70px">
-          {{ formatAmount(detailData.orderNewGmv) }}
-        </div>
-      </div>
-      <div class="metric-card">
-        <div class="metric-label">播放量</div>
-        <div class="metric-value" style="margin-left: 70px">
-          {{ detailData.orderPlayCount }}
-        </div>
-      </div>
-    </div>
-
-    <!-- 详情展示区域 -->
-    <div class="review-container">
-      <div class="review-detail">
-        <el-descriptions :column="2" border>
-          <!-- 第一列:重要信息 -->
-          <el-descriptions-item label="订单编号" :span="2">
-            {{ detailData.orderNo }}
-          </el-descriptions-item>
-          <el-descriptions-item label="套餐名称" :span="2">
-            {{ detailData.name }}
-          </el-descriptions-item>
-          <el-descriptions-item label="商家ID">
-            {{ detailData.id }}
-          </el-descriptions-item>
-          <el-descriptions-item label="商家昵称">
-            {{ detailData.storeName }}
-          </el-descriptions-item>
-          <el-descriptions-item label="姓名">
-            {{ detailData.realName }}
-          </el-descriptions-item>
-          <el-descriptions-item label="身份证号码" :span="2">
-            {{ detailData.idCard }}
-          </el-descriptions-item>
-          <el-descriptions-item label="联系电话">
-            {{ detailData.userPhone }}
-          </el-descriptions-item>
-          <el-descriptions-item label="实付款(元)">
-            {{ formatAmount(detailData.orderMoney) }}
-          </el-descriptions-item>
-
-          <!-- 第二列:财务信息 -->
-          <el-descriptions-item label="预付款比例"> {{ detailData.advanceRate || 0 }}% </el-descriptions-item>
-          <el-descriptions-item label="预付款(元)">
-            {{ formatAmount(detailData.advance) }}
-          </el-descriptions-item>
-          <el-descriptions-item label="佣金比例"> {{ detailData.commissionRate || 0 }}% </el-descriptions-item>
-          <el-descriptions-item label="佣金(元)">
-            {{ formatAmount(detailData.commission) }}
-          </el-descriptions-item>
-
-          <!-- 底部重要信息 -->
-          <el-descriptions-item label="推广模块" :span="2">
-            <el-tag
-              v-for="(item, index) in getPromoteTypes(detailData.promoteType)"
-              :key="index"
-              style="margin-right: 5px; margin-bottom: 5px"
-            >
-              {{ item }}
-            </el-tag>
-          </el-descriptions-item>
-
-          <el-descriptions-item label="状态" :span="2">
-            <el-tag v-if="detailData.advancePaymentStatus == 0" type="success"> 审核通过 </el-tag>
-            <el-tag v-if="detailData.advancePaymentStatus == 1" type="success"> 待完成 </el-tag>
-            <el-tag v-if="detailData.advancePaymentStatus == 2" type="primary"> 已完成 </el-tag>
-          </el-descriptions-item>
-
-          <el-descriptions-item label="下单时间">
-            {{ detailData.orderTime || "--" }}
-          </el-descriptions-item>
-          <el-descriptions-item label="支付时间">
-            {{ detailData.payTime || "--" }}
-          </el-descriptions-item>
-        </el-descriptions>
-      </div>
-    </div>
-
-    <!-- 操作按钮区域 -->
-    <template #footer>
-      <span class="dialog-footer">
-        <el-button type="success" @click="confirmApprove"> 同意 </el-button>
-        <el-button type="warning" @click="openRejectDialog"> 驳回 </el-button>
-        <el-button @click="handleClose">关闭</el-button>
-      </span>
-    </template>
-
-    <!-- 驳回原因弹窗 -->
-    <el-dialog title="驳回原因" v-model="rejectDialogVisible" width="400px" append-to-body>
-      <el-form :model="rejectForm" :rules="rejectRules" ref="rejectFormRef" label-width="80px">
-        <el-form-item label="原因" prop="reasonRefusal">
-          <el-input v-model="rejectForm.reasonRefusal" type="textarea" :rows="3" placeholder="请输入驳回原因" />
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="cancelRejectDialog">取消</el-button>
-          <el-button type="primary" @click="confirmReject">确认</el-button>
-        </span>
-      </template>
-    </el-dialog>
-  </el-dialog>
-</template>
-
-<script setup lang="ts">
-import { ref, reactive, defineExpose, defineEmits } from "vue";
-import { ElMessageBox } from "element-plus";
-import type { FormInstance, FormRules } from "element-plus";
-
-// 定义弹窗状态
-const dialogShow = ref(false);
-const rejectDialogVisible = ref(false);
-
-// 详情数据
-const detailData: any = ref({});
-
-// 处理推广板块字符串
-const getPromoteTypes = (promoteType: string) => {
-  if (!promoteType) return [];
-  return promoteType.split(",");
-};
-
-// 金额格式化
-const formatAmount = (amount: number | string) => {
-  const num = typeof amount === "string" ? parseFloat(amount) : amount;
-  return isNaN(num) ? "¥0.00" : `¥${num.toFixed(2)}`;
-};
-
-// 驳回表单
-const rejectForm = reactive({
-  reasonRefusal: ""
-});
-
-// 驳回表单验证规则
-const rejectRules: FormRules = {
-  reasonRefusal: [
-    { required: true, message: "请输入驳回原因", trigger: "blur" },
-    { min: 2, max: 200, message: "驳回原因长度为2-200个字符", trigger: "blur" }
-  ]
-};
-
-// 表单引用
-const rejectFormRef = ref<FormInstance>();
-
-// 事件触发
-const emit = defineEmits(["approve", "reject", "close", "refresh"]);
-
-// 显示弹窗方法
-const open = (data: any) => {
-  detailData.value = {
-    ...data
-  };
-  dialogShow.value = true;
-};
-
-// 关闭弹窗
-const handleClose = () => {
-  dialogShow.value = false;
-  emit("close");
-};
-
-// 直接确认同意发放预付款
-const confirmApprove = async () => {
-  try {
-    await ElMessageBox.confirm("确认同意发放预付款?", "确认同意", {
-      confirmButtonText: "确认",
-      cancelButtonText: "取消",
-      type: "warning"
-    });
-
-    // 触发同意事件
-    emit("approve", {
-      id: detailData.value.id,
-      userPhone: detailData.value.userPhone,
-      name: detailData.value.name,
-      storeTel: detailData.value.storeTel,
-      orderNo: detailData.value.orderNo,
-      advance: detailData.value.advance
-    });
-
-    // 关闭弹窗并通知刷新
-    dialogShow.value = false;
-    emit("refresh");
-  } catch (error) {
-    // 用户取消,不执行操作
-  }
-};
-
-// 打开驳回原因弹窗
-const openRejectDialog = () => {
-  rejectForm.reasonRefusal = "";
-  rejectDialogVisible.value = true;
-};
-
-// 取消驳回
-const cancelRejectDialog = () => {
-  rejectDialogVisible.value = false;
-};
-
-// 确认驳回(二次确认)
-const confirmReject = async () => {
-  if (!rejectFormRef.value) return;
-
-  const valid = await rejectFormRef.value.validate();
-  if (!valid) return;
-
-  try {
-    await ElMessageBox.confirm("确认取消发放预付款?", "确认驳回", {
-      confirmButtonText: "确认",
-      cancelButtonText: "取消",
-      type: "warning"
-    });
-
-    // 触发驳回事件
-    emit("reject", {
-      id: detailData.value.id,
-      userPhone: detailData.value.userPhone,
-      name: detailData.value.name,
-      storeTel: detailData.value.storeTel,
-      reasonRefusal: rejectForm.reasonRefusal,
-      orderMoney: detailData.value.orderMoney,
-      orderNo: detailData.value.orderNo,
-      advance: detailData.value.advance
-    });
-
-    // 关闭所有弹窗并通知刷新
-    rejectDialogVisible.value = false;
-    dialogShow.value = false;
-    emit("refresh");
-  } catch (error) {
-    // 用户取消二次确认
-  }
-};
-
-// 暴露给父组件的方法
-defineExpose({
-  open,
-  close: handleClose
-});
-</script>
-
-<style lang="scss" scoped>
-.section-header {
-  padding-left: 5px;
-  margin: 10px 0 12px;
-  font-size: 16px;
-  font-weight: 600;
-  color: #303133;
-  border-left: 3px solid #409eff;
-}
-.metrics-cards {
-  display: grid;
-  grid-template-columns: 1fr 1fr;
-  gap: 12px;
-  padding: 10px 0;
-  margin-bottom: 20px;
-}
-.metric-card {
-  padding: 12px 15px;
-  background: #f8f9fa;
-  border: 1px solid #ebeef5;
-  border-radius: 8px;
-  box-shadow: 0 2px 6px rgb(0 0 0 / 5%);
-  transition: all 0.3s ease;
-  &:hover {
-    background: #f0f7ff;
-    border-color: #d6e4ff;
-    box-shadow: 0 4px 12px rgb(0 0 0 / 8%);
-    transform: translateY(-2px);
-  }
-}
-.metric-label {
-  margin-bottom: 6px;
-  font-size: 13px;
-  font-weight: 600;
-  color: #606266;
-}
-.metric-value {
-  font-size: 18px;
-  font-weight: 700;
-  line-height: 1.2;
-  color: #303133;
-}
-.review-container {
-  margin-bottom: 15px;
-
-  /* 滚动条样式优化 */
-  &::-webkit-scrollbar {
-    width: 6px;
-  }
-  &::-webkit-scrollbar-track {
-    background: #f1f1f1;
-    border-radius: 3px;
-  }
-  &::-webkit-scrollbar-thumb {
-    background: #c1c1c1;
-    border-radius: 3px;
-  }
-  &::-webkit-scrollbar-thumb:hover {
-    background: #a8a8a8;
-  }
-}
-.review-detail {
-  .introduction {
-    line-height: 1.5;
-    word-break: break-word;
-    white-space: pre-wrap;
-  }
-}
-
-/* 隐藏预览时的操作栏 */
-:deep(.el-image-viewer__btn) {
-  display: none !important;
-}
-
-/* 或者更精确地隐藏操作栏区域 */
-:deep(.el-image-viewer__actions) {
-  display: none !important;
-}
-.image-grid {
-  display: grid;
-  grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
-  gap: 8px;
-}
-.image-item {
-  aspect-ratio: 1;
-  overflow: hidden;
-}
-.gallery-image {
-  width: 100%;
-  height: 100%;
-  cursor: pointer;
-  object-fit: cover;
-}
-
-/* 调整描述项的间距 */
-:deep(.el-descriptions__label) {
-  font-weight: 600;
-  background-color: #fafafa;
-}
-:deep(.el-descriptions__cell) {
-  padding: 10px 20px;
-}
-</style>

+ 0 - 290
src/views/store/talent/lastPayment/detailDialog.vue

@@ -1,290 +0,0 @@
-<template>
-  <el-dialog v-model="dialogShow" title="尾款详情" draggable width="700px" @close="handleClose">
-    <!-- 合并指标区域为一行 -->
-    <div class="metrics-sections">
-      <div class="metrics-section">
-        <div class="section-header">预计指标</div>
-        <div class="metrics-cards">
-          <div class="metric-card">
-            <div class="metric-label">GMV(元)</div>
-            <div class="metric-value">
-              {{ formatAmount(detailData.orderGmv) }}
-            </div>
-          </div>
-          <div class="metric-card">
-            <div class="metric-label">播放量</div>
-            <div class="metric-value">
-              {{ detailData.orderPlayCount || 0 }}
-            </div>
-          </div>
-        </div>
-      </div>
-
-      <div class="metrics-section">
-        <div class="section-header">实际完成</div>
-        <div class="metrics-cards">
-          <div class="metric-card">
-            <div class="metric-label">GMV(元)</div>
-            <div class="metric-value">
-              {{ formatAmount(detailData.actualGmv) }}
-            </div>
-          </div>
-          <div class="metric-card">
-            <div class="metric-label">播放量</div>
-            <div class="metric-value">
-              {{ detailData.actualPlayCount || 0 }}
-            </div>
-          </div>
-        </div>
-      </div>
-    </div>
-
-    <!-- 详情展示区域 -->
-    <div class="review-container">
-      <div class="review-detail">
-        <el-descriptions :column="2" border>
-          <!-- 第一列:重要信息 -->
-          <el-descriptions-item label="套餐名称">
-            {{ detailData.name }}
-          </el-descriptions-item>
-          <el-descriptions-item label="订单编号">
-            {{ detailData.orderNo }}
-          </el-descriptions-item>
-          <el-descriptions-item label="达人ID">
-            {{ detailData.expertId }}
-          </el-descriptions-item>
-          <el-descriptions-item label="达人昵称">
-            {{ detailData.userName }}
-          </el-descriptions-item>
-          <el-descriptions-item label="姓名">
-            {{ detailData.realName }}
-          </el-descriptions-item>
-          <el-descriptions-item label="联系电话">
-            {{ detailData.userPhone }}
-          </el-descriptions-item>
-          <el-descriptions-item label="身份证号码" :span="2">
-            {{ detailData.idCard }}
-          </el-descriptions-item>
-
-          <!-- 第二列:财务信息 -->
-          <el-descriptions-item label="订单金额(元)" :span="2">
-            {{ formatAmount(detailData.orderMoney) }}
-          </el-descriptions-item>
-          <el-descriptions-item label="尾款比例"> {{ detailData.endPaymentRate || 0 }}% </el-descriptions-item>
-          <el-descriptions-item label="尾款(元)">
-            {{ formatAmount(detailData.endPayment) }}
-          </el-descriptions-item>
-          <el-descriptions-item label="预付款比例"> {{ detailData.advanceRate || 0 }}% </el-descriptions-item>
-          <el-descriptions-item label="预付款(元)">
-            {{ formatAmount(detailData.advance) }}
-          </el-descriptions-item>
-          <el-descriptions-item label="佣金比例"> {{ detailData.commissionRate || 0 }}% </el-descriptions-item>
-          <el-descriptions-item label="佣金(元)">
-            {{ formatAmount(detailData.commission) }}
-          </el-descriptions-item>
-
-          <!-- 底部重要信息 -->
-          <el-descriptions-item label="推广模块" :span="2">
-            <el-tag
-              v-for="(item, index) in getPromoteTypes(detailData.promoteType)"
-              :key="index"
-              style="margin-right: 5px; margin-bottom: 5px"
-            >
-              {{ item }}
-            </el-tag>
-          </el-descriptions-item>
-
-          <el-descriptions-item label="状态" :span="2">
-            <el-tag v-if="detailData.advancePaymentStatus == 0" type="success"> 审核通过 </el-tag>
-            <el-tag v-if="detailData.advancePaymentStatus == 1" type="success"> 待完成 </el-tag>
-            <el-tag v-if="detailData.advancePaymentStatus == 2" type="primary"> 已完成 </el-tag>
-          </el-descriptions-item>
-
-          <el-descriptions-item label="下单时间">
-            {{ detailData.orderTime || "--" }}
-          </el-descriptions-item>
-          <el-descriptions-item label="支付时间">
-            {{ detailData.payTime || "--" }}
-          </el-descriptions-item>
-          <el-descriptions-item label="完成时间" v-if="detailData.completeTime">
-            {{ detailData.completeTime || "--" }}
-          </el-descriptions-item>
-          <el-descriptions-item label="申请时间" v-if="detailData.endFundsTime">
-            {{ detailData.endFundsTime || "--" }}
-          </el-descriptions-item>
-          <el-descriptions-item label="审核时间" v-if="detailData.endPaymentTime">
-            {{ detailData.endPaymentTime }}
-          </el-descriptions-item>
-          <el-descriptions-item label="驳回原因" v-if="detailData.endPaymentRefusal">
-            {{ detailData.endPaymentRefusal }}
-          </el-descriptions-item>
-        </el-descriptions>
-      </div>
-    </div>
-  </el-dialog>
-</template>
-
-<script setup lang="ts">
-import { ref, defineExpose, defineEmits } from "vue";
-
-// 定义弹窗状态
-const dialogShow = ref(false);
-
-// 详情数据
-const detailData: any = ref({});
-// 处理推广板块字符串
-const getPromoteTypes = (promoteType: string) => {
-  if (!promoteType) return [];
-  return promoteType.split(",");
-};
-
-// 金额格式化
-const formatAmount = (amount: number | string) => {
-  const num = typeof amount === "string" ? parseFloat(amount) : amount;
-  return isNaN(num) ? "¥0.00" : `¥${num.toFixed(2)}`;
-};
-
-// 事件触发
-const emit = defineEmits(["close"]);
-
-// 显示弹窗方法
-const open = (data: any) => {
-  detailData.value = {
-    ...data
-  };
-  dialogShow.value = true;
-};
-
-// 关闭弹窗
-const handleClose = () => {
-  dialogShow.value = false;
-  emit("close");
-};
-
-// 暴露给父组件的方法
-defineExpose({
-  open,
-  close: handleClose
-});
-</script>
-
-<style lang="scss" scoped>
-.section-header {
-  padding-left: 5px;
-  margin: 10px 0 12px;
-  font-size: 16px;
-  font-weight: 600;
-  color: #303133;
-  border-left: 3px solid #409eff;
-}
-.metrics-sections {
-  display: flex;
-  gap: 20px;
-  margin-bottom: 15px;
-
-  /* 在小屏幕上自动堆叠 */
-  @media (width <=600px) {
-    flex-direction: column;
-    gap: 10px;
-  }
-}
-.metrics-section {
-  flex: 1;
-  min-width: 0;
-  .section-header {
-    padding-left: 5px;
-    margin: 0 0 8px;
-    font-size: 14px;
-    font-weight: 600;
-    color: #303133;
-    border-left: 3px solid #409eff;
-  }
-}
-.metrics-cards {
-  display: grid;
-  grid-template-columns: 1fr 1fr;
-  gap: 8px;
-}
-.metric-card {
-  padding: 8px 10px;
-  background: #f8f9fa;
-  border: 1px solid #ebeef5;
-  border-radius: 6px;
-  transition: all 0.2s ease;
-  &:hover {
-    background: #f0f7ff;
-    border-color: #d6e4ff;
-  }
-}
-.metric-label {
-  margin-bottom: 4px;
-  font-size: 12px;
-  font-weight: 500;
-  color: #606266;
-}
-.metric-value {
-  font-size: 15px;
-  font-weight: 600;
-  color: #303133;
-}
-.review-container {
-  margin-bottom: 15px;
-
-  /* 滚动条样式优化 */
-  &::-webkit-scrollbar {
-    width: 6px;
-  }
-  &::-webkit-scrollbar-track {
-    background: #f1f1f1;
-    border-radius: 3px;
-  }
-  &::-webkit-scrollbar-thumb {
-    background: #c1c1c1;
-    border-radius: 3px;
-  }
-  &::-webkit-scrollbar-thumb:hover {
-    background: #a8a8a8;
-  }
-}
-.review-detail {
-  .introduction {
-    line-height: 1.5;
-    word-break: break-word;
-    white-space: pre-wrap;
-  }
-}
-
-/* 隐藏预览时的操作栏 */
-:deep(.el-image-viewer__btn) {
-  display: none !important;
-}
-
-/* 或者更精确地隐藏操作栏区域 */
-:deep(.el-image-viewer__actions) {
-  display: none !important;
-}
-.image-grid {
-  display: grid;
-  grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
-  gap: 8px;
-}
-.image-item {
-  aspect-ratio: 1;
-  overflow: hidden;
-}
-.gallery-image {
-  width: 100%;
-  height: 100%;
-  cursor: pointer;
-  object-fit: cover;
-}
-
-/* 调整描述项的间距 */
-:deep(.el-descriptions__label) {
-  font-weight: 600;
-  background-color: #fafafa;
-}
-:deep(.el-descriptions__cell) {
-  padding: 10px 20px;
-}
-</style>

+ 0 - 390
src/views/store/talent/lastPayment/index.vue

@@ -1,390 +0,0 @@
-<template>
-  <div class="table-box">
-    <ProTable ref="proTable" :columns="columns" :request-api="getTableList" :data-callback="dataCallback">
-      <template #endFundsButton="scope">
-        <el-tag v-if="scope.row.endFundsButton == 1" type="success"> 审核中 </el-tag>
-        <el-tag v-if="scope.row.endFundsButton == 2" type="success"> 已通过 </el-tag>
-        <el-tag v-if="scope.row.endFundsButton == 3" type="primary"> 已驳回 </el-tag>
-      </template>
-      <template #promoteType="scope">
-        <el-tag v-for="(item, index) in getPromoteTypes(scope.row.promoteType)" :key="index">
-          {{ item }}
-        </el-tag>
-      </template>
-
-      <template #operation="scope">
-        <el-button type="primary" :icon="Search" link @click="handleDetail(scope.row)"> 查看详情 </el-button>
-        <el-button type="primary" :icon="Setting" v-if="scope.row.endFundsButton == 1" link @click="handleReview(scope.row)">
-          审核
-        </el-button>
-      </template>
-    </ProTable>
-
-    <ReviewDialog ref="reviewDialog" @approve="handleApprove" @reject="handleReject" />
-    <DetailDialog ref="detailDialog" />
-  </div>
-</template>
-
-<script setup lang="ts">
-import ReviewDialog from "./reviewDialog.vue";
-import DetailDialog from "./detailDialog.vue";
-import { ref, reactive, onActivated } from "vue";
-import type { Course } from "@/api/interface";
-import { ElMessage } from "element-plus";
-import ProTable from "@/components/ProTable/index.vue";
-import type { ProTableInstance, ColumnProps } from "@/components/ProTable/interface";
-import { getFinalPaymentList, getFinalPaymentReview } from "@/api/modules/masterManagemen";
-import { Search, Setting } from "@element-plus/icons-vue";
-
-const proTable = ref<ProTableInstance>();
-
-const reviewDialog = ref<any>(null);
-const detailDialog = ref<any>(null);
-
-const columns = reactive<ColumnProps<Course.ReqCourseParams>[]>([
-  {
-    label: "序号",
-    type: "index",
-    width: 60,
-    align: "center",
-    fixed: "left" // 固定在左侧
-  },
-  {
-    label: "订单编号",
-    prop: "orderNo",
-    width: 200,
-    search: { el: "input", tooltip: "请输入订单编号" },
-    fixed: "left", // 固定在左侧
-    showOverflowTooltip: true
-  },
-  {
-    label: "套餐名称",
-    prop: "name",
-    width: 150,
-    search: { el: "input", tooltip: "请输入套餐名称" },
-    showOverflowTooltip: true
-  },
-  {
-    label: "达人昵称",
-    prop: "userName",
-    width: 120,
-    showOverflowTooltip: true
-  },
-  {
-    label: "姓名",
-    prop: "realName",
-    width: 100,
-    search: { el: "input", tooltip: "请输入姓名" },
-    showOverflowTooltip: true
-  },
-  {
-    label: "联系电话",
-    prop: "userPhone",
-    width: 120,
-    search: { el: "input", tooltip: "请输入手机号码" },
-    showOverflowTooltip: true
-  },
-  {
-    label: "推广板块",
-    prop: "promoteType",
-    width: 150,
-    showOverflowTooltip: true
-  },
-  {
-    label: "订单金额(元)",
-    prop: "orderMoney",
-    width: 130,
-    align: "right",
-    className: "financial-column" // 财务列样式
-  },
-  {
-    label: "佣金(元)",
-    prop: "commission",
-    width: 120,
-    align: "right",
-    className: "financial-column" // 财务列样式
-  },
-  {
-    label: "预付款(元)",
-    prop: "advance",
-    width: 120,
-    align: "right",
-    className: "financial-column" // 财务列样式
-  },
-  {
-    label: "尾款(元)",
-    prop: "endPayment",
-    width: 120,
-    align: "right",
-    className: "financial-column" // 财务列样式
-  },
-  {
-    label: "状态",
-    prop: "endFundsButton",
-    width: 100,
-    search: {
-      el: "select",
-      tooltip: "请选择状态",
-      props: { clearable: true }
-    },
-    enum: [
-      { value: 1, label: "审核中" },
-      { value: 2, label: "已通过" },
-      { value: 3, label: "已驳回" }
-    ],
-    fieldNames: { label: "label", value: "value" }
-  },
-  {
-    label: "下单时间",
-    prop: "orderTime",
-    width: 180
-  },
-  {
-    label: "支付时间",
-    prop: "orderTime",
-    width: 180
-  },
-  {
-    label: "完成时间",
-    prop: "completeTime",
-    width: 180
-  },
-  {
-    label: "申请时间",
-    prop: "endFundsTime",
-    width: 180
-  },
-  {
-    label: "下单时间",
-    prop: "time1",
-    isShow: false, // 关键:不在表格中显示
-    search: {
-      el: "date-picker",
-      props: {
-        type: "datetimerange",
-        valueFormat: "YYYY-MM-DD HH:mm:ss",
-        rangeSeparator: "至",
-        startPlaceholder: "开始时间",
-        endPlaceholder: "结束时间"
-      }
-    }
-  },
-  {
-    label: "支付时间",
-    prop: "time2",
-    isShow: false, // 关键:不在表格中显示
-    search: {
-      el: "date-picker",
-      props: {
-        type: "datetimerange",
-        valueFormat: "YYYY-MM-DD HH:mm:ss",
-        rangeSeparator: "至",
-        startPlaceholder: "开始时间",
-        endPlaceholder: "结束时间"
-      }
-    }
-  },
-  {
-    label: "完成时间",
-    prop: "time3",
-    isShow: false, // 关键:不在表格中显示
-    search: {
-      el: "date-picker",
-      props: {
-        type: "datetimerange",
-        valueFormat: "YYYY-MM-DD HH:mm:ss",
-        rangeSeparator: "至",
-        startPlaceholder: "开始时间",
-        endPlaceholder: "结束时间"
-      }
-    }
-  },
-  {
-    label: "申请时间",
-    prop: "time4",
-    isShow: false, // 关键:不在表格中显示
-    search: {
-      el: "date-picker",
-      props: {
-        type: "datetimerange",
-        valueFormat: "YYYY-MM-DD HH:mm:ss",
-        rangeSeparator: "至",
-        startPlaceholder: "开始时间",
-        endPlaceholder: "结束时间"
-      }
-    }
-  },
-  {
-    label: "操作",
-    prop: "operation",
-    width: 200,
-    fixed: "right" // 固定在右侧
-  }
-]);
-
-const getTableList = async (params: any) => {
-  let tempParams = JSON.parse(JSON.stringify(params));
-  delete tempParams.time1;
-  delete tempParams.time2;
-  delete tempParams.time3;
-  delete tempParams.time4;
-  // 深拷贝原始参数
-  let newParams = JSON.parse(JSON.stringify(tempParams));
-  newParams.page = newParams.pageNum;
-  newParams.size = newParams.pageSize;
-  delete newParams.pageNum;
-  delete newParams.pageSize;
-  if (params.time1) {
-    newParams.orderCreatedTime = params.time1[0];
-    newParams.orderEndTime = params.time1[1];
-  }
-  // todo  后端 现在下单时间和支付时间是一个字段,后续调整 在改动
-  if (params.time2) {
-    newParams.payCreatedTime = params.time2[0];
-    newParams.payEndTime = params.time2[1];
-  }
-  if (params.time3) {
-    newParams.firstCompleteTime = params.time3[0];
-    newParams.endCompleteTime = params.time3[1];
-  }
-  if (params.time4) {
-    newParams.createdEndPaymentTime = params.time4[0];
-    newParams.endEndPaymentTime = params.time4[1];
-  }
-  const res = await getFinalPaymentList(newParams);
-  return res;
-};
-
-const dataCallback = (data: any) => {
-  return {
-    list: data.records,
-    total: data.total
-  };
-};
-
-// 处理推广板块字符串
-const getPromoteTypes = (promoteType: string) => {
-  if (!promoteType) return [];
-  return promoteType.split(",");
-};
-
-//详情
-const handleDetail = row => {
-  detailDialog.value?.open(row);
-};
-
-// 审核
-const handleReview = (row: any) => {
-  reviewDialog.value?.open(row);
-};
-
-// 处理同意操作 endFundsButton: 2
-const handleApprove = async (payload: {
-  id: number;
-  name: string;
-  orderMoney: number;
-  orderNo: string;
-  storeTel: string;
-  userPhone: string;
-  endPaymentRefusal: string;
-  endPayment: number | string;
-}) => {
-  try {
-    const res: any = await getFinalPaymentReview({
-      ...payload,
-      endFundsButton: 2
-    });
-    if (res.data.status == 0) {
-      ElMessage.success(res.msg);
-    }
-    if (res.data.status == 1) {
-      ElMessage.error(res.data.codeMsg);
-    }
-    proTable.value?.getTableList();
-  } catch (error) {
-    console.error("审核通过失败:", error);
-    ElMessage.error("审核通过失败");
-  }
-};
-
-// 处理驳回操作 endFundsButton: 3
-const handleReject = async (payload: {
-  id: number;
-  name: string;
-  orderMoney: number;
-  orderNo: string;
-  storeTel: string;
-  userPhone: string;
-  endPaymentRefusal: string;
-  endPayment: number | string;
-}) => {
-  try {
-    const res: any = await getFinalPaymentReview({
-      ...payload,
-      endFundsButton: 3
-    });
-    if (res.data.status == 0) {
-      ElMessage.success(res.msg);
-    }
-    if (res.data.status == 1) {
-      ElMessage.error(res.data.codeMsg);
-    }
-    proTable.value?.getTableList();
-  } catch (error) {
-    console.error("审核驳回失败:", error);
-    ElMessage.error("审核驳回失败");
-  }
-};
-
-onActivated(() => {
-  proTable.value?.getTableList();
-});
-</script>
-
-<style scoped lang="scss">
-/* 操作列按钮间距优化 */
-:deep(.operation-column .cell) {
-  display: flex;
-  gap: 12px;
-  justify-content: flex-end;
-  .el-button {
-    height: auto;
-    padding: 5px 10px;
-    &.is-link {
-      min-width: auto;
-      padding: 0;
-    }
-  }
-}
-
-/* 金额列高亮显示 */
-:deep(.financial-column .cell) {
-  font-weight: 600;
-  color: #e6a23c; // Element Plus 橙色
-  text-align: center;
-}
-
-/* 表格行悬停效果增强 */
-:deep(.el-table--enable-row-hover .el-table__body tr:hover > td) {
-  background-color: #f5f9ff !important;
-  transition: background-color 0.3s;
-}
-
-/* 表头样式优化 */
-:deep(.el-table__header-wrapper th) {
-  padding: 10px 0;
-  font-weight: 600;
-  color: #303133;
-  background-color: #f8f9fa;
-  .cell {
-    display: flex;
-    align-items: center;
-    justify-content: center;
-  }
-}
-
-/* 单元格内边距优化 */
-:deep(.el-table__cell) {
-  padding: 8px 0;
-}
-</style>

+ 0 - 401
src/views/store/talent/lastPayment/reviewDialog.vue

@@ -1,401 +0,0 @@
-<template>
-  <el-dialog v-model="dialogShow" title="尾款审核" draggable width="700px" @close="handleClose">
-    <!-- 合并指标区域为一行 -->
-    <div class="metrics-sections">
-      <div class="metrics-section">
-        <div class="section-header">预计指标</div>
-        <div class="metrics-cards">
-          <div class="metric-card">
-            <div class="metric-label">GMV(元)</div>
-            <div class="metric-value">
-              {{ formatAmount(detailData.orderGmv) }}
-            </div>
-          </div>
-          <div class="metric-card">
-            <div class="metric-label">播放量</div>
-            <div class="metric-value">
-              {{ detailData.orderPlayCount || 0 }}
-            </div>
-          </div>
-        </div>
-      </div>
-
-      <div class="metrics-section">
-        <div class="section-header">实际完成</div>
-        <div class="metrics-cards">
-          <div class="metric-card">
-            <div class="metric-label">GMV(元)</div>
-            <div class="metric-value">
-              {{ formatAmount(detailData.actualGmv) }}
-            </div>
-          </div>
-          <div class="metric-card">
-            <div class="metric-label">播放量</div>
-            <div class="metric-value">
-              {{ detailData.actualPlayCount || 0 }}
-            </div>
-          </div>
-        </div>
-      </div>
-    </div>
-
-    <!-- 详情展示区域 -->
-    <div class="review-container">
-      <div class="review-detail">
-        <el-descriptions :column="2" border>
-          <!-- 第一列:重要信息 -->
-          <el-descriptions-item label="套餐名称">
-            {{ detailData.name }}
-          </el-descriptions-item>
-          <el-descriptions-item label="订单编号">
-            {{ detailData.orderNo }}
-          </el-descriptions-item>
-          <el-descriptions-item label="达人ID">
-            {{ detailData.expertId }}
-          </el-descriptions-item>
-          <el-descriptions-item label="达人昵称">
-            {{ detailData.userName }}
-          </el-descriptions-item>
-          <el-descriptions-item label="姓名">
-            {{ detailData.realName }}
-          </el-descriptions-item>
-          <el-descriptions-item label="联系电话">
-            {{ detailData.userPhone }}
-          </el-descriptions-item>
-          <el-descriptions-item label="身份证号码" :span="2">
-            {{ detailData.idCard }}
-          </el-descriptions-item>
-
-          <!-- 第二列:财务信息 -->
-          <el-descriptions-item label="订单金额(元)" :span="2">
-            {{ formatAmount(detailData.orderMoney) }}
-          </el-descriptions-item>
-          <el-descriptions-item label="尾款比例"> {{ detailData.endPaymentRate || 0 }}% </el-descriptions-item>
-          <el-descriptions-item label="尾款(元)">
-            {{ formatAmount(detailData.endPayment) }}
-          </el-descriptions-item>
-          <el-descriptions-item label="预付款比例"> {{ detailData.advanceRate || 0 }}% </el-descriptions-item>
-          <el-descriptions-item label="预付款(元)">
-            {{ formatAmount(detailData.advance) }}
-          </el-descriptions-item>
-          <el-descriptions-item label="佣金比例"> {{ detailData.commissionRate || 0 }}% </el-descriptions-item>
-          <el-descriptions-item label="佣金(元)">
-            {{ formatAmount(detailData.commission) }}
-          </el-descriptions-item>
-
-          <!-- 底部重要信息 -->
-          <el-descriptions-item label="推广模块" :span="2">
-            <el-tag
-              v-for="(item, index) in getPromoteTypes(detailData.promoteType)"
-              :key="index"
-              style="margin-right: 5px; margin-bottom: 5px"
-            >
-              {{ item }}
-            </el-tag>
-          </el-descriptions-item>
-
-          <el-descriptions-item label="状态" :span="2">
-            <el-tag v-if="detailData.advancePaymentStatus == 0" type="success"> 审核通过 </el-tag>
-            <el-tag v-if="detailData.advancePaymentStatus == 1" type="success"> 待完成 </el-tag>
-            <el-tag v-if="detailData.advancePaymentStatus == 2" type="primary"> 已完成 </el-tag>
-          </el-descriptions-item>
-
-          <el-descriptions-item label="下单时间">
-            {{ detailData.orderTime || "--" }}
-          </el-descriptions-item>
-          <el-descriptions-item label="支付时间">
-            {{ detailData.payTime || "--" }}
-          </el-descriptions-item>
-          <el-descriptions-item label="完成时间" v-if="detailData.completeTime">
-            {{ detailData.completeTime }}
-          </el-descriptions-item>
-          <el-descriptions-item label="申请时间" v-if="detailData.endFundsTime">
-            {{ detailData.endFundsTime }}
-          </el-descriptions-item>
-        </el-descriptions>
-      </div>
-    </div>
-
-    <!-- 操作按钮区域 -->
-    <template #footer>
-      <span class="dialog-footer">
-        <el-button type="success" @click="confirmApprove"> 同意 </el-button>
-        <el-button type="warning" @click="openRejectDialog"> 驳回 </el-button>
-        <el-button @click="handleClose">关闭</el-button>
-      </span>
-    </template>
-
-    <!-- 驳回原因弹窗 -->
-    <el-dialog title="驳回原因" v-model="rejectDialogVisible" width="400px" append-to-body>
-      <el-form :model="rejectForm" :rules="rejectRules" ref="rejectFormRef" label-width="80px">
-        <el-form-item label="原因" prop="reasonRefusal">
-          <el-input v-model="rejectForm.reasonRefusal" type="textarea" :rows="3" placeholder="请输入驳回原因" />
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="cancelRejectDialog">取消</el-button>
-          <el-button type="primary" @click="confirmReject">确认</el-button>
-        </span>
-      </template>
-    </el-dialog>
-  </el-dialog>
-</template>
-
-<script setup lang="ts">
-import { ref, reactive, defineExpose, defineEmits } from "vue";
-import { ElMessageBox } from "element-plus";
-import type { FormInstance, FormRules } from "element-plus";
-
-// 定义弹窗状态
-const dialogShow = ref(false);
-const rejectDialogVisible = ref(false);
-
-// 详情数据
-const detailData: any = ref({});
-// 处理推广板块字符串
-const getPromoteTypes = (promoteType: string) => {
-  if (!promoteType) return [];
-  return promoteType.split(",");
-};
-
-// 金额格式化
-const formatAmount = (amount: number | string) => {
-  const num = typeof amount === "string" ? parseFloat(amount) : amount;
-  return isNaN(num) ? "¥0.00" : `¥${num.toFixed(2)}`;
-};
-
-// 驳回表单
-const rejectForm = reactive({
-  reasonRefusal: ""
-});
-
-// 驳回表单验证规则
-const rejectRules: FormRules = {
-  reasonRefusal: [
-    { required: true, message: "请输入驳回原因", trigger: "blur" },
-    { min: 2, max: 200, message: "驳回原因长度为2-200个字符", trigger: "blur" }
-  ]
-};
-
-// 表单引用
-const rejectFormRef = ref<FormInstance>();
-
-// 事件触发
-const emit = defineEmits(["approve", "reject", "close", "refresh"]);
-
-// 显示弹窗方法
-const open = (data: any) => {
-  detailData.value = {
-    ...data
-  };
-  dialogShow.value = true;
-};
-
-// 关闭弹窗
-const handleClose = () => {
-  dialogShow.value = false;
-  emit("close");
-};
-
-// 直接确认同意发放尾款
-const confirmApprove = async () => {
-  try {
-    await ElMessageBox.confirm("确认同意发放尾款?", "确认同意", {
-      confirmButtonText: "确认",
-      cancelButtonText: "取消",
-      type: "warning"
-    });
-
-    // 触发同意事件
-    emit("approve", {
-      id: detailData.value.id,
-      name: detailData.value.name,
-      orderMoney: detailData.value.orderMoney,
-      orderNo: detailData.value.orderNo,
-      storeTel: detailData.value.storeTel,
-      userPhone: detailData.value.userPhone,
-      endPayment: detailData.value.endPayment
-    });
-
-    // 关闭弹窗并通知刷新
-    dialogShow.value = false;
-    emit("refresh");
-  } catch (error) {
-    // 用户取消,不执行操作
-  }
-};
-
-// 打开驳回原因弹窗
-const openRejectDialog = () => {
-  rejectForm.reasonRefusal = "";
-  rejectDialogVisible.value = true;
-};
-
-// 取消驳回
-const cancelRejectDialog = () => {
-  rejectDialogVisible.value = false;
-};
-
-// 确认驳回(二次确认)
-const confirmReject = async () => {
-  if (!rejectFormRef.value) return;
-
-  const valid = await rejectFormRef.value.validate();
-  if (!valid) return;
-
-  try {
-    await ElMessageBox.confirm("确认取消发放尾款?", "确认驳回", {
-      confirmButtonText: "确认",
-      cancelButtonText: "取消",
-      type: "warning"
-    });
-
-    // 触发驳回事件
-    emit("reject", {
-      id: detailData.value.id,
-      name: detailData.value.name,
-      orderMoney: detailData.value.orderMoney,
-      orderNo: detailData.value.orderNo,
-      storeTel: detailData.value.storeTel,
-      userPhone: detailData.value.userPhone,
-      endPayment: detailData.value.endPayment,
-      endPaymentRefusal: rejectForm.reasonRefusal
-    });
-
-    // 关闭所有弹窗并通知刷新
-    rejectDialogVisible.value = false;
-    dialogShow.value = false;
-    emit("refresh");
-  } catch (error) {
-    // 用户取消二次确认
-  }
-};
-
-// 暴露给父组件的方法
-defineExpose({
-  open,
-  close: handleClose
-});
-</script>
-
-<style lang="scss" scoped>
-.section-header {
-  padding-left: 5px;
-  margin: 10px 0 12px;
-  font-size: 16px;
-  font-weight: 600;
-  color: #303133;
-  border-left: 3px solid #409eff;
-}
-.metrics-sections {
-  display: flex;
-  gap: 20px;
-  margin-bottom: 15px;
-
-  /* 在小屏幕上自动堆叠 */
-  @media (width <=600px) {
-    flex-direction: column;
-    gap: 10px;
-  }
-}
-.metrics-section {
-  flex: 1;
-  min-width: 0;
-  .section-header {
-    padding-left: 5px;
-    margin: 0 0 8px;
-    font-size: 14px;
-    font-weight: 600;
-    color: #303133;
-    border-left: 3px solid #409eff;
-  }
-}
-.metrics-cards {
-  display: grid;
-  grid-template-columns: 1fr 1fr;
-  gap: 8px;
-}
-.metric-card {
-  padding: 8px 10px;
-  background: #f8f9fa;
-  border: 1px solid #ebeef5;
-  border-radius: 6px;
-  transition: all 0.2s ease;
-  &:hover {
-    background: #f0f7ff;
-    border-color: #d6e4ff;
-  }
-}
-.metric-label {
-  margin-bottom: 4px;
-  font-size: 12px;
-  font-weight: 500;
-  color: #606266;
-}
-.metric-value {
-  font-size: 15px;
-  font-weight: 600;
-  color: #303133;
-}
-.review-container {
-  margin-bottom: 15px;
-
-  /* 滚动条样式优化 */
-  &::-webkit-scrollbar {
-    width: 6px;
-  }
-  &::-webkit-scrollbar-track {
-    background: #f1f1f1;
-    border-radius: 3px;
-  }
-  &::-webkit-scrollbar-thumb {
-    background: #c1c1c1;
-    border-radius: 3px;
-  }
-  &::-webkit-scrollbar-thumb:hover {
-    background: #a8a8a8;
-  }
-}
-.review-detail {
-  .introduction {
-    line-height: 1.5;
-    word-break: break-word;
-    white-space: pre-wrap;
-  }
-}
-
-/* 隐藏预览时的操作栏 */
-:deep(.el-image-viewer__btn) {
-  display: none !important;
-}
-
-/* 或者更精确地隐藏操作栏区域 */
-:deep(.el-image-viewer__actions) {
-  display: none !important;
-}
-.image-grid {
-  display: grid;
-  grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
-  gap: 8px;
-}
-.image-item {
-  aspect-ratio: 1;
-  overflow: hidden;
-}
-.gallery-image {
-  width: 100%;
-  height: 100%;
-  cursor: pointer;
-  object-fit: cover;
-}
-
-/* 调整描述项的间距 */
-:deep(.el-descriptions__label) {
-  font-weight: 600;
-  background-color: #fafafa;
-}
-:deep(.el-descriptions__cell) {
-  padding: 10px 20px;
-}
-</style>

+ 0 - 88
src/views/store/talent/orderList/dataDetailDialog.vue

@@ -1,88 +0,0 @@
-<template>
-  <el-dialog v-model="dialogShow" title="数据明细" draggable width="650px" @close="handleClose">
-    <div class="metrics-section">
-      <div class="section-header">套餐指标</div>
-      <el-descriptions border>
-        <el-descriptions-item label="GMV(元)">
-          {{ formatAmount(detailData.orderGmv) }}
-        </el-descriptions-item>
-        <el-descriptions-item label="播放量">
-          {{ detailData.orderPlayCount || 0 }}
-        </el-descriptions-item>
-      </el-descriptions>
-    </div>
-
-    <div class="metrics-section" style="margin-top: 20px">
-      <div class="section-header">完成指标</div>
-      <el-descriptions :column="2" border>
-        <el-descriptions-item :span="2" label="进店浏览数">
-          {{ detailData.storeVisitViewCount || 0 }}
-        </el-descriptions-item>
-        <el-descriptions-item label="成交订单数">
-          {{ detailData.completedOrdersNumber || 0 }}
-        </el-descriptions-item>
-        <el-descriptions-item label="成交金额(元)">
-          {{ formatAmount(detailData.amount) }}
-        </el-descriptions-item>
-        <el-descriptions-item label="GMV(元)">
-          {{ formatAmount(detailData.orderNewGmv) }}
-        </el-descriptions-item>
-        <el-descriptions-item label="实际GMV(元)">
-          {{ formatAmount(detailData.actualGmv) }}
-        </el-descriptions-item>
-        <el-descriptions-item label="播放量">
-          {{ detailData.playCount || 0 }}
-        </el-descriptions-item>
-        <el-descriptions-item label="实际播放量">
-          {{ detailData.actualPlayCount || 0 }}
-        </el-descriptions-item>
-      </el-descriptions>
-    </div>
-  </el-dialog>
-</template>
-
-<script setup lang="ts">
-import { ref, defineExpose } from "vue";
-
-// 定义弹窗状态
-const dialogShow = ref(false);
-
-// 详情数据
-const detailData: any = ref({});
-// 金额格式化
-const formatAmount = (amount: number | string) => {
-  const num = typeof amount === "string" ? parseFloat(amount) : amount;
-  return isNaN(num) ? "¥0.00" : `¥${num.toLocaleString("zh-CN", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
-};
-
-// 显示弹窗方法
-const open = (data: any) => {
-  // 修正数据字段映射
-  detailData.value = {
-    ...data
-  };
-  dialogShow.value = true;
-};
-
-// 关闭弹窗
-const handleClose = () => {
-  dialogShow.value = false;
-};
-
-// 暴露给父组件的方法
-defineExpose({
-  open,
-  close: handleClose
-});
-</script>
-
-<style scoped lang="scss">
-.section-header {
-  padding-left: 6px;
-  margin: 10px 0 12px;
-  font-size: 14px;
-  font-weight: 600;
-  color: #303133;
-  border-left: 3px solid #409eff;
-}
-</style>

+ 0 - 247
src/views/store/talent/orderList/detailDialog.vue

@@ -1,247 +0,0 @@
-<template>
-  <el-dialog v-model="dialogShow" title="达人订单详情" draggable width="700px" @close="handleClose">
-    <!-- 详情展示区域 -->
-    <div class="review-container">
-      <div class="review-detail">
-        <el-descriptions :column="2" border>
-          <el-descriptions-item label="支付明细" :span="2" class="clickable-item">
-            <div @click="handlePaymentDetail" class="detail">查看支付明细</div>
-          </el-descriptions-item>
-          <el-descriptions-item label="数据明细" :span="2" class="clickable-item">
-            <div @click="handleDataDetail" class="detail">查看数据明细</div>
-          </el-descriptions-item>
-
-          <!-- 基本信息 -->
-          <el-descriptions-item label="订单编号" :span="2">
-            {{ detailData.orderNo }}
-          </el-descriptions-item>
-          <el-descriptions-item label="套餐名称" :span="2">
-            {{ detailData.name }}
-          </el-descriptions-item>
-          <el-descriptions-item label="商家昵称">
-            {{ detailData.storeName }}
-          </el-descriptions-item>
-          <el-descriptions-item label="姓名">
-            {{ detailData.realName }}
-          </el-descriptions-item>
-          <el-descriptions-item label="身份证号码">
-            {{ detailData.idCard }}
-          </el-descriptions-item>
-          <el-descriptions-item label="联系电话">
-            {{ detailData.userPhone }}
-          </el-descriptions-item>
-          <el-descriptions-item label="订单金额(元)">
-            {{ formatAmount(detailData.orderMoney) }}
-          </el-descriptions-item>
-          <el-descriptions-item label="佣金(元)">
-            {{ formatAmount(detailData.commission) }}
-          </el-descriptions-item>
-
-          <!-- 状态信息 -->
-          <el-descriptions-item label="状态" :span="2">
-            <el-tag :type="getStatusType(detailData.status)">
-              {{ getStatusText(detailData.status) }}
-            </el-tag>
-          </el-descriptions-item>
-
-          <!-- 推广信息 -->
-          <el-descriptions-item label="推广模块" :span="2">
-            <el-tag
-              v-for="(item, index) in getPromoteTypes(detailData.promoteType)"
-              :key="index"
-              :title="item"
-              style="margin-right: 5px; margin-bottom: 5px"
-            >
-              {{ item }}
-            </el-tag>
-          </el-descriptions-item>
-
-          <!-- 时间信息 -->
-          <el-descriptions-item label="下单时间">
-            {{ detailData.orderTime || "--" }}
-          </el-descriptions-item>
-          <el-descriptions-item label="取消时间">
-            {{ detailData.cancelTime || "--" }}
-          </el-descriptions-item>
-          <el-descriptions-item label="支付时间">
-            {{ detailData.payTime || "--" }}
-          </el-descriptions-item>
-          <el-descriptions-item label="完成时间">
-            {{ detailData.completeTime || "--" }}
-          </el-descriptions-item>
-          <el-descriptions-item label="退款时间">
-            {{ detailData.endFundsTime || "--" }}
-          </el-descriptions-item>
-        </el-descriptions>
-      </div>
-    </div>
-
-    <!-- 支付明细弹窗 -->
-    <PaymentDetailDialog ref="paymentDetailDialog" />
-
-    <!-- 数据明细弹窗 -->
-    <DataDetailDialog ref="dataDetailDialog" />
-  </el-dialog>
-</template>
-
-<script setup lang="ts">
-import { ref, defineExpose, defineEmits } from "vue";
-import PaymentDetailDialog from "./paymentDetailDialog.vue";
-import DataDetailDialog from "./dataDetailDialog.vue";
-import { getDataDetails } from "@/api/modules/masterManagemen";
-
-// 定义弹窗状态
-const dialogShow = ref(false);
-
-// 详情数据
-const detailData: any = ref({});
-
-// 支付明细弹窗引用
-const paymentDetailDialog = ref<InstanceType<typeof PaymentDetailDialog> | null>(null);
-// 数据明细弹窗引用
-const dataDetailDialog = ref<InstanceType<typeof DataDetailDialog> | null>(null);
-
-// 状态类型处理
-const getStatusType = (status: number) => {
-  if (status === 5 || status === 6) return "success";
-  if (status === 1 || status === 3) return "primary";
-  return "danger";
-};
-
-// 状态文本处理
-const getStatusText = (status: number) => {
-  if (status === 1) return "待支付";
-  if (status === 2) return "交易关闭";
-  if (status === 3) return "待履约";
-  if (status === 4) return "履约中";
-  if (status === 5) return "已完成";
-  if (status === 6) return "已退款";
-  return "未知状态";
-};
-
-// 处理推广板块字符串
-const getPromoteTypes = (promoteType: string) => {
-  if (!promoteType) return [];
-  return promoteType.split(",");
-};
-
-// 金额格式化
-const formatAmount = (amount: number | string) => {
-  const num = typeof amount === "string" ? parseFloat(amount) : amount;
-  if (isNaN(num)) return "¥0.00";
-
-  return `¥${num.toLocaleString("zh-CN", {
-    minimumFractionDigits: 2,
-    maximumFractionDigits: 2
-  })}`;
-};
-
-// 事件触发
-const emit = defineEmits(["close"]);
-
-// 显示弹窗方法
-const open = (data: any) => {
-  detailData.value = {
-    ...data
-  };
-  dialogShow.value = true;
-};
-
-// 关闭弹窗
-const handleClose = () => {
-  dialogShow.value = false;
-  emit("close");
-};
-
-// 处理支付明细点击
-const handlePaymentDetail = () => {
-  if (paymentDetailDialog.value) {
-    paymentDetailDialog.value.open({
-      ...detailData.value
-    });
-  }
-};
-
-// 处理数据明细点击
-const handleDataDetail = async () => {
-  try {
-    const res: any = await getDataDetails({
-      id: detailData.value.id
-    });
-    if (dataDetailDialog.value) {
-      dataDetailDialog.value.open({
-        ...res.data
-      });
-    }
-  } catch (error) {
-    console.log(error);
-  }
-};
-
-// 暴露给父组件的方法
-defineExpose({
-  open,
-  close: handleClose
-});
-</script>
-
-<style scoped lang="scss">
-/* 可点击项样式 */
-.clickable-item {
-  font-weight: 600;
-  color: #409eff;
-  cursor: pointer;
-  &:hover {
-    background-color: #f5f9ff;
-  }
-}
-
-/* 表格容器优化 */
-.review-container {
-  margin-bottom: 15px;
-
-  /* 滚动条样式优化 */
-  &::-webkit-scrollbar {
-    width: 6px;
-  }
-  &::-webkit-scrollbar-track {
-    background: #f1f1f1;
-    border-radius: 3px;
-  }
-  &::-webkit-scrollbar-thumb {
-    background: #c1c1c1;
-    border-radius: 3px;
-  }
-  &::-webkit-scrollbar-thumb:hover {
-    background: #a8a8a8;
-  }
-}
-
-/* 表头样式优化 */
-:deep(.el-table__header-wrapper th) {
-  padding: 10px 0;
-  font-weight: 600;
-  color: #303133;
-  background-color: #f8f9fa;
-  .cell {
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    .caret-wrapper {
-      margin-left: 4px;
-    }
-  }
-}
-
-/* 单元格内边距优化 */
-:deep(.el-table__cell) {
-  padding: 8px 0;
-  .cell {
-    line-height: 1.5;
-  }
-}
-.detail {
-  color: #409eff;
-  cursor: pointer;
-}
-</style>

+ 0 - 303
src/views/store/talent/orderList/index.vue

@@ -1,303 +0,0 @@
-<template>
-  <div class="table-box">
-    <ProTable ref="proTable" :columns="columns" :request-api="getTableList" :data-callback="dataCallback">
-      <template #advancePaymentStatus="scope">
-        <el-tag v-if="scope.row.advancePaymentStatus == 0" type="success"> 审核通过 </el-tag>
-        <el-tag v-if="scope.row.advancePaymentStatus == 1" type="success"> 待完成 </el-tag>
-        <el-tag v-if="scope.row.advancePaymentStatus == 2" type="primary"> 已完成 </el-tag>
-      </template>
-      <template #promoteType="scope">
-        <el-tag v-for="(item, index) in getPromoteTypes(scope.row.promoteType)" :key="index">
-          {{ item }}
-        </el-tag>
-      </template>
-
-      <template #operation="scope">
-        <el-button type="primary" :icon="Search" link @click="handleDetail(scope.row)"> 查看详情 </el-button>
-      </template>
-    </ProTable>
-
-    <DetailDialog ref="detailDialog" />
-  </div>
-</template>
-
-<script setup lang="ts">
-import DetailDialog from "./detailDialog.vue";
-import { ref, reactive, onActivated } from "vue";
-import type { Course } from "@/api/interface";
-import ProTable from "@/components/ProTable/index.vue";
-import type { ProTableInstance, ColumnProps } from "@/components/ProTable/interface";
-import { getOrderList } from "@/api/modules/masterManagemen";
-import { Search } from "@element-plus/icons-vue";
-
-const proTable = ref<ProTableInstance>();
-
-const detailDialog = ref<any>(null);
-// 门店审核状态列表
-const applyStatus = ref<any[]>([
-  { value: 0, label: "审核通过" },
-  { value: 1, label: "待审核" },
-  { value: 2, label: "审核拒绝" }
-]);
-
-const columns = reactive<ColumnProps<Course.ReqCourseParams>[]>([
-  {
-    label: "序号",
-    type: "index",
-    width: 60,
-    align: "center",
-    fixed: "left" // 固定在左侧
-  },
-  {
-    label: "订单编号",
-    prop: "orderNo",
-    width: 200,
-    search: { el: "input", tooltip: "请输入订单编号" },
-    fixed: "left", // 固定在左侧
-    showOverflowTooltip: true
-  },
-  {
-    label: "套餐名称",
-    prop: "name",
-    width: 150,
-    search: { el: "input", tooltip: "请输入套餐名称" },
-    showOverflowTooltip: true
-  },
-  {
-    label: "商家昵称",
-    prop: "storeName",
-    width: 120,
-    search: { el: "input", tooltip: "请输入商家昵称" },
-    showOverflowTooltip: true
-  },
-  {
-    label: "姓名",
-    prop: "realName",
-    width: 100,
-    search: { el: "input", tooltip: "请输入姓名" },
-    showOverflowTooltip: true
-  },
-  {
-    label: "联系电话",
-    prop: "userPhone",
-    width: 120,
-    search: { el: "input", tooltip: "请输入手机号码" },
-    showOverflowTooltip: true
-  },
-  {
-    label: "推广板块",
-    prop: "promoteType",
-    width: 150,
-    showOverflowTooltip: true
-  },
-  {
-    label: "订单金额(元)",
-    prop: "orderMoney",
-    width: 120,
-    align: "right",
-    className: "financial-column" // 财务列样式
-  },
-  {
-    label: "订单状态",
-    prop: "advancePaymentStatus",
-    width: 100,
-    search: { el: "select", tooltip: "请输入状态" },
-    enum: applyStatus,
-    fieldNames: { label: "label", value: "value" }
-  },
-  {
-    label: "下单时间",
-    prop: "orderTime",
-    width: 180
-  },
-  {
-    label: "取消时间",
-    prop: "orderTime",
-    width: 180
-  },
-  {
-    label: "支付时间",
-    prop: "payTime",
-    width: 180
-  },
-  {
-    label: "完成时间",
-    prop: "completeTime",
-    width: 180
-  },
-  {
-    label: "退款时间",
-    prop: "endFundsTime",
-    width: 180
-  },
-  {
-    label: "下单时间",
-    prop: "time1",
-    isShow: false, // 关键:不在表格中显示
-    search: {
-      el: "date-picker",
-      props: {
-        type: "datetimerange",
-        valueFormat: "YYYY-MM-DD HH:mm:ss",
-        rangeSeparator: "至",
-        startPlaceholder: "开始时间",
-        endPlaceholder: "结束时间"
-      }
-    }
-  },
-  {
-    label: "支付时间",
-    prop: "time2",
-    isShow: false, // 关键:不在表格中显示
-    search: {
-      el: "date-picker",
-      props: {
-        type: "datetimerange",
-        valueFormat: "YYYY-MM-DD HH:mm:ss",
-        rangeSeparator: "至",
-        startPlaceholder: "开始时间",
-        endPlaceholder: "结束时间"
-      }
-    }
-  },
-  {
-    label: "完成时间",
-    prop: "time3",
-    isShow: false, // 关键:不在表格中显示
-    search: {
-      el: "date-picker",
-      props: {
-        type: "datetimerange",
-        valueFormat: "YYYY-MM-DD HH:mm:ss",
-        rangeSeparator: "至",
-        startPlaceholder: "开始时间",
-        endPlaceholder: "结束时间"
-      }
-    }
-  },
-  {
-    label: "退款时间",
-    prop: "time4",
-    isShow: false, // 关键:不在表格中显示
-    search: {
-      el: "date-picker",
-      props: {
-        type: "datetimerange",
-        valueFormat: "YYYY-MM-DD HH:mm:ss",
-        rangeSeparator: "至",
-        startPlaceholder: "开始时间",
-        endPlaceholder: "结束时间"
-      }
-    }
-  },
-  {
-    label: "操作",
-    prop: "operation",
-    width: 200,
-    fixed: "right" // 固定在右侧
-  }
-]);
-
-const getTableList = async (params: any) => {
-  let tempParams = JSON.parse(JSON.stringify(params));
-  delete tempParams.time1;
-  delete tempParams.time2;
-  delete tempParams.time3;
-  delete tempParams.time4;
-  // 深拷贝原始参数
-  let newParams = JSON.parse(JSON.stringify(tempParams));
-  newParams.page = newParams.pageNum;
-  newParams.size = newParams.pageSize;
-  delete newParams.pageNum;
-  delete newParams.pageSize;
-  if (params.time1) {
-    newParams.orderCreatedTime = params.time1[0];
-    newParams.orderEndTime = params.time1[1];
-  }
-  // todo  后端 现在下单时间和支付时间是一个字段,后续调整 在改动
-  if (params.time2) {
-    newParams.payCreatedTime = params.time2[0];
-    newParams.payEndTime = params.time2[1];
-  }
-  if (params.time3) {
-    newParams.completeCreatedTime = params.time3[0];
-    newParams.completeEndTime = params.time3[1];
-  }
-  if (params.time4) {
-    newParams.endFundsCreatedTime = params.time4[0];
-    newParams.endFundsEndTime = params.time4[1];
-  }
-  const res = await getOrderList(newParams);
-  return res;
-};
-
-const dataCallback = (data: any) => {
-  return {
-    list: data.records,
-    total: data.total
-  };
-};
-
-// 处理推广板块字符串
-const getPromoteTypes = (promoteType: string) => {
-  if (!promoteType) return [];
-  return promoteType.split(",");
-};
-
-//详情
-const handleDetail = row => {
-  detailDialog.value?.open(row);
-};
-
-onActivated(() => {
-  proTable.value?.getTableList();
-});
-</script>
-
-<style scoped lang="scss">
-/* 操作列按钮间距优化 */
-:deep(.operation-column .cell) {
-  display: flex;
-  gap: 12px;
-  justify-content: flex-end;
-  .el-button {
-    height: auto;
-    padding: 5px 10px;
-    &.is-link {
-      min-width: auto;
-      padding: 0;
-    }
-  }
-}
-
-/* 金额列高亮显示 */
-:deep(.financial-column .cell) {
-  font-weight: 600;
-  color: #e6a23c; // Element Plus 橙色
-  text-align: center;
-}
-
-/* 表格行悬停效果增强 */
-:deep(.el-table--enable-row-hover .el-table__body tr:hover > td) {
-  background-color: #f5f9ff !important;
-  transition: background-color 0.3s;
-}
-
-/* 表头样式优化 */
-:deep(.el-table__header-wrapper th) {
-  padding: 10px 0;
-  font-weight: 600;
-  color: #303133;
-  background-color: #f8f9fa;
-  .cell {
-    display: flex;
-    align-items: center;
-    justify-content: center;
-  }
-}
-
-/* 单元格内边距优化 */
-:deep(.el-table__cell) {
-  padding: 8px 0;
-}
-</style>

+ 0 - 80
src/views/store/talent/orderList/paymentDetailDialog.vue

@@ -1,80 +0,0 @@
-<template>
-  <el-dialog v-model="dialogShow" title="支付明细" draggable width="500px" @close="handleClose">
-    <el-descriptions :column="1" border>
-      <el-descriptions-item label="订单金额(元)">
-        {{ formatAmount(detailData.orderMoney) }}
-      </el-descriptions-item>
-      <el-descriptions-item label="佣金比例"> {{ detailData.commissionRate || 0 }}% </el-descriptions-item>
-      <el-descriptions-item label="佣金(元)">
-        {{ formatAmount(detailData.commission) }}
-      </el-descriptions-item>
-      <el-descriptions-item label="预付款比例"> {{ detailData.advanceRate || 0 }}% </el-descriptions-item>
-      <el-descriptions-item label="预付款金额(元)">
-        {{ formatAmount(detailData.advance) }}
-      </el-descriptions-item>
-      <el-descriptions-item label="预付款到账时间">
-        {{ formatDate(detailData.advancePaymentTime) || "--" }}
-      </el-descriptions-item>
-      <el-descriptions-item label="尾款比例(%)"> {{ 100 - detailData.advanceRate || "--" }}% </el-descriptions-item>
-      <el-descriptions-item label="尾款金额(元)">
-        {{ formatAmount(detailData.endPayment) }}
-      </el-descriptions-item>
-      <el-descriptions-item label="尾款到账时间">
-        {{ formatDate(detailData.finalPaymentTime) || "--" }}
-      </el-descriptions-item>
-    </el-descriptions>
-  </el-dialog>
-</template>
-
-<script setup lang="ts">
-import { ref, defineExpose } from "vue";
-
-// 定义弹窗状态
-const dialogShow = ref(false);
-
-// 详情数据
-const detailData: any = ref({});
-
-// 金额格式化
-const formatAmount = (amount: number | string) => {
-  const num = typeof amount === "string" ? parseFloat(amount) : amount;
-  return isNaN(num) ? "¥0.00" : `¥${num.toLocaleString("zh-CN", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
-};
-
-// 日期格式化
-const formatDate = (dateString: string) => {
-  if (!dateString) return "—";
-  const date = new Date(dateString);
-  return date
-    .toLocaleString("zh-CN", {
-      year: "numeric",
-      month: "2-digit",
-      day: "2-digit",
-      hour: "2-digit",
-      minute: "2-digit",
-      second: "2-digit"
-    })
-    .replace(/\//g, "-");
-};
-
-// 显示弹窗方法
-const open = (data: any) => {
-  detailData.value = {
-    ...data
-  };
-  dialogShow.value = true;
-};
-
-// 关闭弹窗
-const handleClose = () => {
-  dialogShow.value = false;
-};
-
-// 暴露给父组件的方法
-defineExpose({
-  open,
-  close: handleClose
-});
-</script>
-
-<style scoped lang="scss"></style>

+ 0 - 276
src/views/store/user/detail.vue

@@ -1,276 +0,0 @@
-<template>
-  <div>
-    <div class="user-card-area">
-      <div class="block-title">用户个人信息</div>
-      <el-form :model="formData" label-width="140px">
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="用户头像 :">
-              <el-image :src="formData.userImage" style="width: 100px; height: 100px" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="用户昵称 :">
-              <el-input v-model="formData.userName" disabled />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="性别 :">
-              <el-input v-model="formData.userSex" disabled />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="生日 :">
-              <el-input v-model="formData.userBirthday" disabled />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="简介 :">
-              <el-input v-model="formData.jianjie" type="textarea" rows="5" :autosize="false" resize="none" disabled />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="居住地 :">
-              <el-input v-model="formData.address" disabled />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="真实姓名 :">
-              <el-input v-model="formData.realName" disabled />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="绑定手机号 :">
-              <el-input v-model="formData.userPhone" disabled />
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <!--        <el-form-item label="团购价格 :">-->
-        <!--          <el-input :value="`${formData.preferentialPrice}元`" disabled />-->
-        <!--        </el-form-item>-->
-
-        <!--        <el-form-item label="有效期:">-->
-        <!--          <el-input :value="`${formData.effectiveDateValue}`" disabled />-->
-        <!--        </el-form-item>-->
-        <!--        <el-form-item label="活动日期 :">-->
-        <!--          <el-input v-if="formData.startTimeType === 0" value="审核通过后立即开始" disabled style="width: 200px" />-->
-        <!--          <el-date-picker v-else v-model="formData.startTimeValue" type="date" disabled />-->
-        <!--          <el-col :span="1" class="text-center">-->
-        <!--            <span class="text-gray-500">至</span>-->
-        <!--          </el-col>-->
-        <!--          <el-date-picker v-model="formData.endTime" type="date" disabled />-->
-        <!--        </el-form-item>-->
-        <!--        <el-form-item label="不可用日期:" v-if="formData.disableDateType === 0">-->
-        <!--          <el-input value="全部日期可用" disabled />-->
-        <!--        </el-form-item>-->
-        <!--        <el-form-item label="不可用日期:" v-else-if="formData.disableDateType !== 0">-->
-        <!--          <div v-for="item in formData.unusedDate" :key="item" style="margin-right: 10px">-->
-        <!--            <el-check-tag disabled>-->
-        <!--              {{ item }}-->
-        <!--            </el-check-tag>-->
-        <!--          </div>-->
-        <!--        </el-form-item>-->
-        <!--        <el-form-item label="限购数量:">-->
-        <!--          <el-input v-if="formData.quotaType === 0" value="不限量" disabled />-->
-        <!--          <el-input v-else v-model="formData.quotaValue" disabled />-->
-        <!--        </el-form-item>-->
-        <!--        <el-form-item label="库存数量:">-->
-        <!--          <el-input v-model="formData.inventoryNum" disabled />-->
-        <!--        </el-form-item>-->
-        <!--        <el-form-item label="使用规则:">-->
-        <!--          <el-input v-model="formData.useRules" type="textarea" disabled />-->
-        <!--        </el-form-item>-->
-        <!--        <el-form-item label="发票信息:">-->
-        <!--          <div v-for="item in formData.invoiceType" :key="item" style="margin-right: 10px">-->
-        <!--            <el-check-tag v-if="item === '0'" disabled> 电子发票</el-check-tag>-->
-        <!--            <el-check-tag v-if="item === '1'" disabled> 纸质发票</el-check-tag>-->
-        <!--          </div>-->
-        <!--        </el-form-item>-->
-      </el-form>
-    </div>
-    <ProTable
-      ref="proTable"
-      :columns="columns"
-      :request-api="getTableList"
-      :init-param="initParam"
-      :data-callback="dataCallback"
-      @drag-sort="sortTable"
-    >
-      <!-- 表格 header 按钮 -->
-      <template #tableHeader="scope">
-        <div class="block-title">用户购买记录</div>
-      </template>
-      <!-- Expand -->
-      <template #expand="scope">
-        {{ scope.row }}
-      </template>
-      <!-- usernameHeader -->
-      <template #usernameHeader="scope">
-        <el-button type="primary" @click="ElMessage.success('我是通过作用域插槽渲染的表头')">
-          {{ scope.column.label }}
-        </el-button>
-      </template>
-      <!-- createTime -->
-      <template #createTime="scope">
-        <el-button type="primary" link @click="ElMessage.success('我是通过作用域插槽渲染的内容')">
-          {{ scope.row.createTime }}
-        </el-button>
-      </template>
-    </ProTable>
-    <ImportExcel ref="dialogRef" />
-  </div>
-</template>
-
-<script setup lang="tsx" name="useDetail">
-import { ref, reactive, onMounted } from "vue";
-import { StoreUser } from "@/api/interface";
-import { ElMessage } from "element-plus";
-import ProTable from "@/components/ProTable/index.vue";
-import ImportExcel from "@/components/ImportExcel/index.vue";
-import { ProTableInstance, ColumnProps } from "@/components/ProTable/interface";
-import { getUserDetail, getUserById } from "@/api/modules/user";
-// import { deleteStoreUser } from "@/api/modules/storeUser";
-// import { useHandleData } from "@/hooks/useHandleData";
-import { useRoute } from "vue-router";
-
-const route = useRoute();
-const userId = route.query.id;
-
-const formData = ref({});
-
-onMounted(() => {
-  getUserById({ id: userId }).then(res => {
-    formData.value = res.data;
-  });
-});
-
-// 表格拖拽排序
-const sortTable = ({ newIndex, oldIndex }: { newIndex?: number; oldIndex?: number }) => {
-  console.log(newIndex, oldIndex);
-  console.log(proTable.value?.tableData);
-  ElMessage.success("修改列表排序成功");
-};
-
-// ProTable 实例
-const proTable = ref<ProTableInstance>();
-
-// 如果表格需要初始化请求参数,直接定义传给 ProTable (之后每次请求都会自动带上该参数,此参数更改之后也会一直带上,改变此参数会自动刷新表格数据)
-const initParam = reactive({ type: 1 });
-
-// dataCallback 是对于返回的表格数据做处理,如果你后台返回的数据不是 list && total 这些字段,可以在这里进行处理成这些字段
-// 或者直接去 hooks/useTable.ts 文件中把字段改为你后端对应的就行
-const dataCallback = (data: any) => {
-  return {
-    list: data.records,
-    total: data.total
-  };
-};
-
-// 如果你想在请求之前对当前请求参数做一些操作,可以自定义如下函数:params 为当前所有的请求参数(包括分页),最后返回请求列表接口
-// 默认不做操作就直接在 ProTable 组件上绑定	:requestApi="getUserList"
-const getTableList = (params: any) => {
-  let newParams = JSON.parse(JSON.stringify(params));
-  newParams.page = newParams.pageNum;
-  newParams.size = newParams.pageSize;
-  delete newParams.pageNum;
-  delete newParams.pageSize;
-  // newParams.createTime && (newParams.startTime = newParams.createTime[0]);
-  // newParams.createTime && (newParams.endTime = newParams.createTime[1]);
-  newParams.userId = userId;
-  // delete newParams.createTime;
-  return getUserDetail(newParams);
-};
-
-// 表格配置项
-const columns = reactive<ColumnProps<StoreUser.ResStoreUserList>[]>([
-  { type: "index", fixed: "left", label: "序号" },
-  {
-    prop: "type",
-    label: "套餐类型",
-    render: scope => {
-      let couponTypeStr = "";
-      if (scope?.row?.couponType == 1) {
-        couponTypeStr = "代金券";
-      } else if (scope?.row?.couponType == 2) {
-        couponTypeStr = "团购";
-      }
-      return couponTypeStr;
-    }
-  },
-  { prop: "userPhone", label: "联系电话" },
-  { prop: "couponName", label: "商品名称" },
-  { prop: "couponCount", label: "购买数量" },
-  {
-    prop: "finalPrice",
-    label: "购买金额",
-    render: scope => {
-      const finalPrice = scope.row.finalPrice;
-      // 将数字金额格式化为千位符显示,保留2位小数
-      if (typeof finalPrice === "number") {
-        return finalPrice.toLocaleString("zh-CN", { minimumFractionDigits: 2, maximumFractionDigits: 2 });
-      } else if (!isNaN(Number(finalPrice))) {
-        return Number(finalPrice).toLocaleString("zh-CN", { minimumFractionDigits: 2, maximumFractionDigits: 2 });
-      }
-      return finalPrice || "-";
-    }
-  },
-  { prop: "buyTime", label: "购买时间" },
-  { prop: "finishTime", label: "核验时间" },
-  {
-    prop: "status",
-    label: "状态",
-    render: scope => {
-      let statusStr = "";
-      if (scope?.row?.status == 0) {
-        statusStr = "待支付";
-      } else if (scope?.row?.status == 1) {
-        statusStr = "待使用";
-      } else if (scope?.row?.status == 2) {
-        statusStr = "已核销";
-      } else if (scope?.row?.status == 3) {
-        statusStr = "已过期;";
-      } else if (scope?.row?.status == 4) {
-        statusStr = "已取消";
-      } else if (scope?.row?.status == 5) {
-        statusStr = "已退款";
-      } else if (scope?.row?.status == 6) {
-        statusStr = "退款失败";
-      } else if (scope?.row?.status == 7) {
-        statusStr = "已完成";
-      }
-      return statusStr;
-    }
-  }
-]);
-
-// 删除商户信息
-// const deleteAccount = async (params: StoreUser.ResStoreUserList) => {
-//   await useHandleData(deleteStoreUser, { id: params.id }, `删除【${params.storeName}】商铺与管理账户`);
-//   proTable.value?.getTableList();
-// };
-</script>
-<style scoped lang="scss">
-.block-title {
-  font-size: 20px;
-  font-weight: bold;
-}
-.user-card-area {
-  padding: 20px;
-  margin-bottom: 20px;
-  overflow-x: hidden;
-  background-color: var(--el-bg-color);
-  border: 1px solid var(--el-border-color-light);
-  border-radius: 6px;
-  box-shadow: 0 0 12px rgb(0 0 0 / 5%);
-  .block-title {
-    margin-bottom: 10px;
-  }
-}
-</style>

+ 0 - 169
src/views/store/user/index.vue

@@ -1,169 +0,0 @@
-<template>
-  <div class="table-box">
-    <ProTable
-      ref="proTable"
-      :columns="columns"
-      :request-api="getTableList"
-      :init-param="initParam"
-      :data-callback="dataCallback"
-      @drag-sort="sortTable"
-    >
-      <!-- 表格操作 -->
-      <template #operation="scope">
-        <el-button type="primary" link @click="toDetail(scope.row)"> 查看详情 </el-button>
-        <el-button v-if="!scope.row.expertCode" type="primary" link @click="openExpertTypeDialog(scope.row)">
-          设置达人
-        </el-button>
-        <el-button v-else type="danger" link @click="cancelExpertUser(scope.row)"> 取消达人 </el-button>
-      </template>
-    </ProTable>
-
-    <!-- 达人类型选择对话框 -->
-    <el-dialog v-model="expertTypeDialogVisible" title="选择达人类型">
-      <el-checkbox-group v-model="selectedExpertTypes">
-        <el-checkbox v-for="type in expertTypes" :key="type.value" :label="type.value">
-          {{ type.label }}
-        </el-checkbox>
-      </el-checkbox-group>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="expertTypeDialogVisible = false">取消</el-button>
-          <el-button type="primary" @click="confirmSetExpert">确定</el-button>
-        </span>
-      </template>
-    </el-dialog>
-  </div>
-</template>
-
-<script setup lang="tsx" name="useProTable">
-import { ref, reactive, onMounted, watch } from "vue";
-import { useRouter, useRoute } from "vue-router";
-import { User } from "@/api/interface";
-import { ElMessage, ElDialog } from "element-plus";
-import ProTable from "@/components/ProTable/index.vue";
-import ImportExcel from "@/components/ImportExcel/index.vue";
-import { ProTableInstance, ColumnProps } from "@/components/ProTable/interface";
-import { getUserList, becomeExpert, cancelExpert } from "@/api/modules/user";
-import { debounce } from "lodash";
-
-const router = useRouter();
-const route = useRoute();
-
-// ProTable 实例
-const proTable = ref<ProTableInstance>();
-const initParam = reactive({});
-
-// 跳转详情页
-const toDetail = row => {
-  router.push({
-    path: "/store/userDetail",
-    query: {
-      id: row.id
-    }
-  });
-  //   /${Math.random().toFixed(3)}?params=detail-page
-};
-
-// 数据处理
-const dataCallback = (data: any) => ({ list: data.records, total: data.total });
-
-// 请求处理
-const getTableList = (params: any) => {
-  let newParams = JSON.parse(JSON.stringify(params));
-  newParams.createTime && (newParams.startTime = newParams.createTime[0]);
-  newParams.createTime && (newParams.endTime = newParams.createTime[1]);
-  newParams.page = newParams.pageNum;
-  newParams.size = newParams.pageSize;
-  delete newParams.createTime;
-  delete newParams.pageNum;
-  delete newParams.pageSize;
-  return getUserList(newParams);
-};
-// 表格拖拽排序
-const sortTable = ({ newIndex, oldIndex }: { newIndex?: number; oldIndex?: number }) => {
-  console.log(newIndex, oldIndex);
-  console.log(proTable.value?.tableData);
-  ElMessage.success("修改列表排序成功");
-};
-
-// 达人类型选择相关
-const expertTypeDialogVisible = ref(false);
-const selectedExpertTypes = ref<string[]>([]);
-const currentUserForExpert = ref(null);
-
-// 达人类型定义(使用你提供的类型)
-const expertTypes = [
-  { value: "1", label: "特色美食" },
-  { value: "2", label: "酒店民宿" },
-  { value: "3", label: "KTV" },
-  { value: "4", label: "洗浴汗蒸" },
-  { value: "5", label: "按摩足浴" },
-  { value: "6", label: "丽人美发" },
-  { value: "7", label: "运动健身" },
-  { value: "8", label: "医美医疗" }
-];
-
-// 打开达人类型选择对话框
-const openExpertTypeDialog = row => {
-  console.log("打开达人类型对话框", row); // 添加日志
-  console.log("打开expertTypeDialogVisible", expertTypeDialogVisible); // 添加日志
-  currentUserForExpert.value = row;
-  selectedExpertTypes.value = [];
-  expertTypeDialogVisible.value = true;
-};
-
-// 确认设置达人
-const confirmSetExpert = debounce(async () => {
-  if (!currentUserForExpert.value) return ElMessage.error("用户信息不存在");
-  if (selectedExpertTypes.value.length === 0) return ElMessage.warning("请至少选择一种达人类型");
-
-  try {
-    // 将选中的达人类型value用逗号拼接成字符串
-    const expertTypeStr = selectedExpertTypes.value.join(",");
-
-    const params = {
-      userId: currentUserForExpert.value.id,
-      expertType: expertTypeStr // 使用expertType字段传递拼接后的字符串
-    };
-    console.log("params", params);
-    await becomeExpert(params);
-    ElMessage.success("设置达人成功");
-    proTable.value?.getTableList();
-    expertTypeDialogVisible.value = false;
-  } catch (error) {
-    ElMessage.error("设置达人失败:" + (error.message || "未知错误"));
-  }
-}, 500);
-
-// 取消达人
-const cancelExpertUser = debounce(async (params: any) => {
-  let newParams = JSON.parse(JSON.stringify(params));
-  newParams.id = newParams.expertId;
-  await cancelExpert(newParams);
-  proTable.value?.getTableList();
-}, 500);
-
-// 表格列配置
-const columns = reactive<ColumnProps<User.ResUserList>[]>([
-  { prop: "userName", label: "用户名" },
-  { prop: "realName", label: "真实姓名", search: { el: "input" } },
-  { prop: "userPhone", label: "联系电话", search: { el: "input" } },
-  { prop: "fansCount", label: "粉丝量" },
-  { prop: "likesNumber", label: "获赞量" },
-  { prop: "consumeNum", label: "消费次数" },
-  { prop: "badNum", label: "差评次数" },
-  { prop: "expertCode", label: "达人号" },
-  { prop: "operation", label: "操作", fixed: "right", width: 330 }
-]);
-
-// 路由监听与初始化
-watch(
-  () => route.path,
-  newVal => {
-    if (newVal === "/store/user") proTable.value?.getTableList();
-  },
-  { immediate: true }
-);
-
-onMounted(() => proTable.value?.getTableList());
-</script>

+ 0 - 0
src/views/store/talent/apply/detailDialog.vue → src/views/userManagement/detailDialog.vue


+ 215 - 0
src/views/userManagement/index.vue

@@ -0,0 +1,215 @@
+<template>
+  <div class="table-box">
+    <ProTable ref="proTable" :columns="columns" :request-api="getTableList" :data-callback="dataCallback" row-key="id">
+      <template #tableHeader>
+        <el-button type="primary" :icon="CirclePlus" @click="openDialog()"> 新增账号 </el-button>
+      </template>
+      <template #operation="scope">
+        <el-button type="primary" link :icon="EditPen" @click="openDialog(scope.row)"> 编辑 </el-button>
+      </template>
+    </ProTable>
+
+    <el-dialog v-model="dialogVisible" :title="dialogTitle" width="520px" destroy-on-close>
+      <el-form ref="dialogFormRef" :model="dialogForm" :rules="dialogRules" label-width="100px" label-suffix=":">
+        <el-form-item label="登录账号" prop="loginAccount">
+          <el-input v-model="dialogForm.loginAccount" placeholder="请输入登录账号" />
+        </el-form-item>
+
+        <el-form-item label="关联律所" prop="roleId">
+          <el-select v-model="dialogForm.roleId" placeholder="请选择关联律所">
+            <el-option v-for="item in roleOptions" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="登录密码" prop="loginPassword">
+          <el-input v-model="dialogForm.loginPassword" placeholder="请输入登录密码" type="password" show-password />
+          <span class="form-tip" v-if="isEdit"> 若无需修改密码,可留空 </span>
+        </el-form-item>
+        <el-form-item label="账号状态" prop="status">
+          <el-switch v-model="dialogForm.status" :active-value="1" :inactive-value="0" active-text="启用" inactive-text="禁用" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input
+            v-model="dialogForm.remark"
+            type="textarea"
+            :autosize="{ minRows: 2, maxRows: 4 }"
+            placeholder="请输入备注信息"
+          />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="dialogVisible = false"> 取 消 </el-button>
+        <el-button type="primary" :loading="dialogLoading" @click="submitDialog"> 保 存 </el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, computed, nextTick } from "vue";
+import { ElMessage, type FormInstance } from "element-plus";
+import md5 from "md5";
+import ProTable from "@/components/ProTable/index.vue";
+import type { ProTableInstance, ColumnProps } from "@/components/ProTable/interface";
+import type { User } from "@/api/interface";
+import { getUserList, addUser, editUser } from "@/api/modules/user";
+import { CirclePlus, EditPen } from "@element-plus/icons-vue";
+
+const proTable = ref<ProTableInstance>();
+
+const statusOptions = [
+  { label: "启用", value: 1 },
+  { label: "禁用", value: 0 }
+];
+
+const roleOptions = ref<{ label: string; value: string }[]>([]);
+
+const columns = reactive<ColumnProps<User.ResUserList>[]>([
+  { type: "index", label: "序号", width: 60 },
+  { prop: "loginAccount", label: "登录账号", search: { el: "input", props: { placeholder: "请输入登录账号" } } },
+  { prop: "loginPassword", label: "登录密码" },
+  { prop: "roleId", label: "关联律所" },
+  {
+    prop: "status",
+    label: "账号状态",
+    width: 100,
+    enum: statusOptions,
+    fieldNames: { label: "label", value: "value" },
+    search: { el: "select", props: { placeholder: "请选择状态" } },
+    tag: true
+  },
+  { prop: "remark", label: "备注", width: 220 },
+  { prop: "createTime", label: "创建时间", width: 200 },
+  { prop: "operation", label: "操作", width: 150, fixed: "right" }
+]);
+
+const getTableList = (params: any) => {
+  const tempParams = { ...params };
+  tempParams.page = tempParams.pageNum;
+  tempParams.size = tempParams.pageSize;
+  delete tempParams.pageNum;
+  delete tempParams.pageSize;
+  return getUserList(tempParams);
+};
+
+const dataCallback = (data: any) => ({
+  list: data.records,
+  total: data.total
+});
+
+const dialogVisible = ref(false);
+const dialogLoading = ref(false);
+const dialogMode = ref<"add" | "edit">("add");
+const dialogTitle = computed(() => (dialogMode.value === "add" ? "新增账号" : "编辑账号"));
+const dialogFormRef = ref<FormInstance>();
+
+const dialogForm = reactive({
+  id: "",
+  loginAccount: "",
+  roleId: "",
+  loginPassword: "",
+  status: 1,
+  remark: ""
+});
+
+const dialogRules = reactive({
+  loginAccount: [{ required: true, message: "请输入登录账号", trigger: "blur" }],
+  roleId: [{ required: true, message: "请选择账号角色", trigger: "change" }],
+  loginPassword: [
+    {
+      validator: (_: any, value: string, callback: (error?: Error) => void) => {
+        if (dialogMode.value === "add" && !value) return callback(new Error("请输入登录密码"));
+        callback();
+      },
+      trigger: "blur"
+    }
+  ]
+});
+
+const isEdit = computed(() => dialogMode.value === "edit");
+
+const resetDialogForm = () => {
+  dialogForm.id = "";
+  dialogForm.loginAccount = "";
+  dialogForm.roleId = "";
+  dialogForm.loginPassword = "";
+  dialogForm.status = 1;
+  dialogForm.remark = "";
+};
+
+const openDialog = (row?: Partial<User.ResUserList>) => {
+  resetDialogForm();
+  if (row && row.id) {
+    dialogMode.value = "edit";
+    dialogForm.id = row.id as string;
+    dialogForm.loginAccount = (row.loginAccount as string) || "";
+    dialogForm.roleId = (row.roleId as string) || "";
+    dialogForm.status = (row.status as number) ?? 1;
+    dialogForm.remark = (row.remark as string) || "";
+  } else {
+    dialogMode.value = "add";
+  }
+  dialogVisible.value = true;
+  nextTick(() => dialogFormRef.value?.clearValidate());
+};
+
+const buildPayload = () => {
+  const payload: Record<string, any> = {
+    id: dialogForm.id,
+    loginAccount: dialogForm.loginAccount,
+    roleId: dialogForm.roleId,
+    status: dialogForm.status,
+    remark: dialogForm.remark
+  };
+  if (!payload.id) delete payload.id;
+  if (dialogForm.loginPassword) {
+    payload.loginPassword = md5(dialogForm.loginPassword);
+  }
+  return payload;
+};
+
+const submitDialog = () => {
+  dialogFormRef.value?.validate(async valid => {
+    if (!valid) return;
+    dialogLoading.value = true;
+    try {
+      const payload = buildPayload();
+      if (dialogMode.value === "add") {
+        await addUser(payload);
+        ElMessage.success("新增账号成功");
+      } else {
+        await editUser(payload);
+        ElMessage.success("编辑账号成功");
+      }
+      dialogVisible.value = false;
+      proTable.value?.getTableList();
+    } finally {
+      dialogLoading.value = false;
+    }
+  });
+};
+
+const mockFetchRoleOptions = async () => {
+  // 模拟异步接口
+  const res = await new Promise<{ label: string; value: string }[]>(resolve => {
+    setTimeout(() => {
+      resolve([
+        { label: "运营管理员", value: "ops" },
+        { label: "内容管理员", value: "content" },
+        { label: "系统管理员", value: "admin" }
+      ]);
+    }, 200);
+  });
+  roleOptions.value = res;
+};
+
+mockFetchRoleOptions();
+</script>
+
+<style scoped lang="scss">
+.form-tip {
+  display: inline-block;
+  margin-left: 12px;
+  font-size: 12px;
+  color: var(--el-text-color-secondary);
+}
+</style>

+ 0 - 0
src/views/store/talent/apply/reviewDialog.vue → src/views/userManagement/reviewDialog.vue