Bläddra i källkod

```
feat(router): 新增h5管理模块路由配置

新增h5管理模块的完整路由配置,包括渠道管理和用户列表页面
的路由定义、组件导入和路径映射,以及相应的类型定义更新。

- 添加h5-manage主路由及其子路由
- 配置channel-manage和user-list页面路由
- 更新路由映射表和类型声明文件
```

wenjie 2 dagar sedan
förälder
incheckning
c4da4f4436

+ 3 - 3
.env.test

@@ -2,15 +2,15 @@
 
 # VITE_SERVICE_BASE_URL=https://522d2ea1.r39.cpolar.top #王
 # VITE_SERVICE_BASE_URL=http://89561bkaq794.vicp.fun:53846 #张
-# VITE_SERVICE_BASE_URL=https://7f3f47fe.r3.cpolar.top#田
+# VITE_SERVICE_BASE_URL=https://5cb31c38.r3.cpolar.top#田
 # VITE_SERVICE_BASE_URL=https://425f86e6.r24.cpolar.top #邓
 # VITE_SERVICE_BASE_URL=http://74949mkfh190.vicp.fun #付
 # VITE_SERVICE_BASE_URL=https://smqjh.api.zswlgz.com
 # VITE_SERVICE_BASE_URL=https://735a1bda.r24.cpolar.top #黄
-VITE_SERVICE_BASE_URL=http://192.168.0.11:8080 #wzq
+# VITE_SERVICE_BASE_URL=http://192.168.0.11:8080 #wzq
 # VITE_SERVICE_BASE_URL=http://89561bkaq794.vicp.fun:53846
 
-#VITE_SERVICE_BASE_URL=http://47.109.84.152:8081#打包测试本地服务器
+VITE_SERVICE_BASE_URL=http://47.109.84.152:8081#打包测试本地服务器
 # VITE_SERVICE_BASE_URL=https://smqjh.api.zswlgz.com #服务器
 
 # other backend service base url, test environment

+ 5 - 1
src/locales/langs/en-us.ts

@@ -302,7 +302,11 @@ const local: App.I18n.Schema = {
     tenant: 'Tenant Management',
     tenant_tenant: 'Tenant Management',
     'tenant_tenant-package': 'Tenant Package',
-    'tenant_tenant-change': ''
+    'tenant_tenant-change': '',
+    'h5-manage': '',
+    'h5-manage_channel-manage': '',
+    'h5-manage_edit-channel': '',
+    'h5-manage_user-list': ''
   },
   page: {
     login: {

+ 5 - 1
src/locales/langs/zh-cn.ts

@@ -299,7 +299,11 @@ const local: App.I18n.Schema = {
     tenant: '租户管理',
     tenant_tenant: '租户管理',
     'tenant_tenant-package': '租户套餐',
-    'tenant_tenant-change': '租户切换'
+    'tenant_tenant-change': '租户切换',
+    'h5-manage': '',
+    'h5-manage_channel-manage': '',
+    'h5-manage_edit-channel': '',
+    'h5-manage_user-list': ''
   },
   page: {
     login: {

+ 3 - 0
src/router/elegant/imports.ts

@@ -38,6 +38,9 @@ export const views: Record<LastLevelRouteKey, RouteComponent | (() => Promise<Ro
   "government_government-list": () => import("@/views/government/government-list/index.vue"),
   government_points: () => import("@/views/government/points/index.vue"),
   "government_user-list": () => import("@/views/government/user-list/index.vue"),
+  "h5-manage_channel-manage": () => import("@/views/h5-manage/channel-manage/index.vue"),
+  "h5-manage_edit-channel": () => import("@/views/h5-manage/edit-channel/index.vue"),
+  "h5-manage_user-list": () => import("@/views/h5-manage/user-list/index.vue"),
   home: () => import("@/views/home/index.vue"),
   "jy-manage_activity": () => import("@/views/jy-manage/activity/index.vue"),
   manage_config: () => import("@/views/manage/config/index.vue"),

+ 38 - 0
src/router/elegant/routes.ts

@@ -256,6 +256,44 @@ export const generatedRoutes: GeneratedRoute[] = [
       }
     ]
   },
+  {
+    name: 'h5-manage',
+    path: '/h5-manage',
+    component: 'layout.base',
+    meta: {
+      title: 'h5-manage',
+      i18nKey: 'route.h5-manage'
+    },
+    children: [
+      {
+        name: 'h5-manage_channel-manage',
+        path: '/h5-manage/channel-manage',
+        component: 'view.h5-manage_channel-manage',
+        meta: {
+          title: 'h5-manage_channel-manage',
+          i18nKey: 'route.h5-manage_channel-manage'
+        }
+      },
+      {
+        name: 'h5-manage_edit-channel',
+        path: '/h5-manage/edit-channel',
+        component: 'view.h5-manage_edit-channel',
+        meta: {
+          title: 'h5-manage_edit-channel',
+          i18nKey: 'route.h5-manage_edit-channel'
+        }
+      },
+      {
+        name: 'h5-manage_user-list',
+        path: '/h5-manage/user-list',
+        component: 'view.h5-manage_user-list',
+        meta: {
+          title: 'h5-manage_user-list',
+          i18nKey: 'route.h5-manage_user-list'
+        }
+      }
+    ]
+  },
   {
     name: 'home',
     path: '/home',

+ 4 - 0
src/router/elegant/transform.ts

@@ -204,6 +204,10 @@ const routeMap: RouteMap = {
   "government_government-list": "/government/government-list",
   "government_points": "/government/points",
   "government_user-list": "/government/user-list",
+  "h5-manage": "/h5-manage",
+  "h5-manage_channel-manage": "/h5-manage/channel-manage",
+  "h5-manage_edit-channel": "/h5-manage/edit-channel",
+  "h5-manage_user-list": "/h5-manage/user-list",
   "home": "/home",
   "iframe-page": "/iframe-page/:url",
   "jy-manage": "/jy-manage",

+ 82 - 0
src/service/api/h5-manage/channel-manage/index.ts

@@ -0,0 +1,82 @@
+import { request } from '@/service/request';
+/**
+ * 分页获取
+ * @param params
+ * @returns
+ */
+export function fetchChannelList(data: any) {
+  return request({
+    url: '/smqjh-system/api/v1/access/page',
+    method: 'get',
+    params: data
+  });
+}
+
+/**
+ *
+ * 删除
+ * @returns
+ */
+export function fetchDelChannel(ids: string) {
+  return request({
+    url: `/smqjh-system/api/v1/access/${ids}`,
+    method: 'delete'
+  });
+}
+
+/**
+ * 保存
+ * @returns
+ */
+export function fetchAddChannel(data: any) {
+  return request({
+    url: '/smqjh-system/api/v1/access',
+    method: 'post',
+    data
+  });
+}
+
+/**
+ * 编辑
+ * @returns
+ */
+export function fetchEditChannel(data: any) {
+  return request({
+    url: `/smqjh-system/api/v1/access/${data.id}`,
+    method: 'put',
+    data
+  });
+}
+
+/**
+ * 详情
+ * @returns
+ */
+export function fetchChannelDetail(id: any) {
+  return request({
+    url: `/smqjh-system/api/v1/access/${id}`,
+    method: 'get'
+  });
+}
+
+/**
+ * 查看秘钥
+ * @returns
+ */
+export function fetchAppSecret(id: any) {
+  return request({
+    url: `/smqjh-system/api/v1/access/${id}/app-secret`,
+    method: 'get'
+  });
+}
+
+/**
+ * 重置秘钥
+ * @returns
+ */
+export function fetchResetAppSecret(id: any) {
+  return request({
+    url: `/smqjh-system/api/v1/access/${id}/app-secret/reset`,
+    method: 'patch'
+  });
+}

+ 26 - 0
src/service/api/h5-manage/user-list/index.ts

@@ -0,0 +1,26 @@
+import { request } from '@/service/request';
+/**
+ * 分页获取
+ * @param params
+ * @returns
+ */
+export function fetchUserList(data: any) {
+  return request({
+    url: '/smqjh-system/app-api/v1/members/page/accessPage',
+    method: 'get',
+    params: data
+  });
+}
+
+/**
+ * 获取当前所属渠道
+ * @param params
+ * @returns
+ */
+export function fetchUserAccess(data: any) {
+  return request({
+    url: '/smqjh-system/app-api/v1/members/access',
+    method: 'get',
+    params: data
+  });
+}

+ 8 - 0
src/typings/elegant-router.d.ts

@@ -58,6 +58,10 @@ declare module "@elegant-router/types" {
     "government_government-list": "/government/government-list";
     "government_points": "/government/points";
     "government_user-list": "/government/user-list";
+    "h5-manage": "/h5-manage";
+    "h5-manage_channel-manage": "/h5-manage/channel-manage";
+    "h5-manage_edit-channel": "/h5-manage/edit-channel";
+    "h5-manage_user-list": "/h5-manage/user-list";
     "home": "/home";
     "iframe-page": "/iframe-page/:url";
     "jy-manage": "/jy-manage";
@@ -155,6 +159,7 @@ declare module "@elegant-router/types" {
     | "film-manage"
     | "goods-center"
     | "government"
+    | "h5-manage"
     | "home"
     | "iframe-page"
     | "jy-manage"
@@ -208,6 +213,9 @@ declare module "@elegant-router/types" {
     | "government_government-list"
     | "government_points"
     | "government_user-list"
+    | "h5-manage_channel-manage"
+    | "h5-manage_edit-channel"
+    | "h5-manage_user-list"
     | "home"
     | "jy-manage_activity"
     | "manage_config"

+ 194 - 0
src/views/h5-manage/channel-manage/index.vue

@@ -0,0 +1,194 @@
+<script setup lang="tsx">
+import { useRouter } from 'vue-router';
+import { NButton, NSwitch } from 'naive-ui';
+// import dayjs from 'dayjs';
+import { fetchChannelList, fetchDelChannel } from '@/service/api/h5-manage/channel-manage';
+import { useTable } from '@/components/zt/Table/hooks/useTable';
+const router = useRouter();
+
+const columns: NaiveUI.TableColumn<Api.goods.ShopSku>[] = [
+  {
+    key: 'accessId',
+    title: '渠道ID',
+    align: 'center',
+    width: 100
+  },
+  {
+    key: 'accessName',
+    title: '渠道名称',
+    align: 'center',
+    width: 100
+  },
+  {
+    key: 'tenantCode',
+    title: '租户编号',
+    align: 'center',
+    width: 100
+  },
+  {
+    key: 'payOwnership',
+    title: '支付归属',
+    align: 'center',
+    width: 100,
+    render: row => {
+      return row.payOwnership === 1 ? '平台支付' : '第三方支付';
+    }
+  },
+  {
+    key: 'status',
+    title: '状态',
+    align: 'center',
+    width: 100,
+    render: row => {
+      return <NSwitch uncheckedValue={0} checkedValue={1} value={row.status} disabled={true}></NSwitch>;
+    }
+  },
+
+  {
+    key: 'themeMainColor',
+    title: '主题样式',
+    align: 'center',
+    width: 100,
+    render: (row: any) => {
+      return (
+        <div>
+          <div>主色:{row.themeMainColor}</div>
+          <div>辅色:{row.themeSubColor}</div>
+        </div>
+      );
+    }
+  },
+  {
+    key: 'updateTime',
+    title: '更新时间',
+    align: 'center',
+    width: 100
+  }
+];
+
+const [registerTable, { refresh }] = useTable({
+  searchFormConfig: {
+    schemas: [
+      {
+        label: '渠道名称',
+        component: 'NInput',
+        field: 'accessName'
+      },
+      // {
+      //   label: '开放渠道',
+      //   component: 'dictSelect',
+      //   field: 'openChannel',
+      //   componentProps: {
+      //     dictCode: 'open_channel',
+      //     immediate: true
+      //   }
+      // },
+      {
+        label: '状态',
+        field: 'status',
+        component: 'NSelect',
+        componentProps: {
+          options: [
+            {
+              label: '禁用',
+              value: 0
+            },
+            {
+              label: '启用',
+              value: 1
+            }
+          ]
+        }
+      },
+      {
+        label: '支付归属',
+        field: 'payOwnership',
+        component: 'NSelect',
+        componentProps: {
+          options: [
+            {
+              label: '平台支付',
+              value: 1
+            },
+            {
+              label: '第三方支付',
+              value: 2
+            }
+          ]
+        }
+      }
+    ],
+    inline: false,
+    size: 'small',
+    labelPlacement: 'left',
+    isFull: false
+  },
+  tableConfig: {
+    opWdith: 160,
+    keyField: 'skuId',
+    title: '活动列表',
+    showAddButton: true,
+    scrollX: 1800,
+    fieldMapToTime: [
+      ['price', ['minPrice', 'maxPrice']],
+      ['createTime', ['startTime', 'endTime']]
+    ]
+  }
+});
+
+function handleAdd() {
+  router.push({
+    path: '/h5-manage/edit-channel'
+  });
+}
+function handleDetail(row: any) {
+  router.push({
+    path: '/h5-manage/edit-channel',
+    query: {
+      id: row.id,
+      mode: 'detail'
+    }
+  });
+}
+function handleEdit(row: any) {
+  console.log('edit', row);
+  router.push({
+    path: '/h5-manage/edit-channel',
+    query: {
+      id: row.id,
+      mode: 'edit'
+    }
+  });
+}
+
+function handleDelete(row: any) {
+  window.$dialog?.info({
+    title: '提示',
+    content: `你确定要删除吗?`,
+    positiveText: '确定',
+    negativeText: '取消',
+    onPositiveClick: async () => {
+      const { error } = await fetchDelChannel(row.id as string);
+      if (!error) {
+        refresh();
+      }
+    }
+  });
+}
+</script>
+
+<template>
+  <LayoutTable>
+    <ZTable :columns="columns" :api="fetchChannelList" @add="handleAdd" @register="registerTable">
+      <template #op="{ row }">
+        <NSpace>
+          <NButton size="small" @click="handleEdit(row)">编辑</NButton>
+          <NButton size="small" @click="handleDelete(row)">删除</NButton>
+          <NButton size="small" @click="handleDetail(row)">详情</NButton>
+        </NSpace>
+      </template>
+    </ZTable>
+  </LayoutTable>
+</template>
+
+<style scoped></style>

+ 339 - 0
src/views/h5-manage/edit-channel/index.vue

@@ -0,0 +1,339 @@
+<script setup lang="tsx">
+import { onMounted, ref, watch } from 'vue';
+import { useRoute, useRouter } from 'vue-router';
+import type { FormInst } from 'naive-ui';
+import { NForm, NInput, useMessage } from 'naive-ui';
+import {
+  fetchAddChannel,
+  fetchAppSecret,
+  fetchChannelDetail,
+  fetchEditChannel,
+  fetchResetAppSecret
+} from '@/service/api/h5-manage/channel-manage';
+import { fetchGetTenantList } from '@/service/api/tenant';
+import ZUpload from '../../../components/zt/upload/z-upload.vue';
+const router = useRouter();
+const route = useRoute();
+const formRef = ref<FormInst | null>(null);
+const message = useMessage();
+const disabled = ref(false);
+const isShow = ref(false);
+const payOwnershipDisabled = ref(false);
+const loading = ref(false);
+
+const model = ref({
+  appId: '',
+  appSecret: '',
+  id: 0,
+  accessName: '',
+  tenantId: undefined,
+  status: 0,
+  logoUrl: '',
+  remark: '',
+  payOwnership: 1,
+  shareRatio: 0,
+  thirdCallbackUrl: '',
+  themeMainColor: '',
+  themeSubColor: '',
+  h5Url: '',
+  authCallbackUrl: '',
+  payCallbackUrl: ''
+});
+
+const rules = ref({
+  accessName: {
+    required: true,
+    trigger: ['blur', 'input'],
+    message: '请输入'
+  },
+
+  logoUrl: {
+    required: true,
+    trigger: ['blur', 'change'],
+    message: '请上传'
+  },
+  remark: {
+    required: true,
+    trigger: ['blur', 'change'],
+    message: '请输入'
+  },
+  tenantId: {
+    type: 'number' as const,
+    required: true,
+    trigger: ['blur', 'change'],
+    message: '请输入'
+  },
+  themeMainColor: {
+    required: true,
+    trigger: ['blur', 'change'],
+    message: '请选择'
+  },
+  themeSubColor: {
+    required: true,
+    trigger: ['blur', 'change'],
+    message: '请输入'
+  },
+  authCallbackUrl: {
+    required: true,
+    trigger: ['blur', 'change'],
+    message: '请输入'
+  },
+  payCallbackUrl: {
+    required: true,
+    trigger: ['blur', 'change'],
+    message: '请选择'
+  },
+  shareRatio: {
+    type: 'number' as const,
+    required: true,
+    trigger: ['blur', 'change'],
+    message: '请输入分账比例'
+  },
+  thirdCallbackUrl: {
+    required: true,
+    trigger: ['blur', 'change'],
+    message: '请输入回调地址'
+  }
+  // thirdCallbackUrl: {}
+});
+
+watch(
+  () => model.value.payOwnership,
+  newVal => {
+    if (newVal === 1) {
+      rules.value.shareRatio.required = true;
+      rules.value.thirdCallbackUrl.required = false;
+    } else if (newVal === 2) {
+      // 第三方账户:显示回调地址
+      rules.value.thirdCallbackUrl.required = true;
+      rules.value.shareRatio.required = false;
+    }
+  },
+  { immediate: true }
+);
+
+function handleValidateButtonClick(e: MouseEvent) {
+  e.preventDefault();
+  formRef.value?.validate(async errors => {
+    if (!errors) {
+      loading.value = true;
+
+      const form = JSON.parse(JSON.stringify(model.value));
+
+      let res;
+      if (route.query.mode == 'edit') {
+        res = await fetchEditChannel(form);
+      } else {
+        res = await fetchAddChannel(form);
+      }
+      loading.value = false;
+      console.log(res);
+
+      if (!res.error) {
+        router.push({
+          path: '/h5-manage/channel-manage'
+        });
+      }
+    } else {
+      console.log(errors);
+      message.error('验证失败');
+    }
+  });
+}
+
+async function getSecret() {
+  if (isShow.value) {
+    return;
+  }
+
+  // 获取appSecret接口
+  const res = await fetchAppSecret(route.query.id);
+  if (res.data) {
+    model.value.appSecret = res.data.appSecret;
+    isShow.value = true;
+  }
+}
+
+async function handleResetSecret() {
+  window.$dialog?.info({
+    title: '提示',
+    content: `你确定要重置秘钥吗?`,
+    positiveText: '确定',
+    negativeText: '取消',
+    onPositiveClick: async () => {
+      // 重置秘钥接口
+      const res = await fetchResetAppSecret(route.query.id);
+      if (res.data) {
+        model.value.appSecret = res.data.appSecret;
+        isShow.value = true;
+        message.success('重置成功');
+      }
+    }
+  });
+}
+
+async function getDetail() {
+  // 获取详情接口
+  const res = await fetchChannelDetail(route.query.id);
+  if (res.data) {
+    model.value = res.data;
+    model.value.id = Number(route.query.id);
+  }
+}
+
+onMounted(() => {
+  if (route.query.id) {
+    payOwnershipDisabled.value = true;
+    if (route.query.mode === 'detail') {
+      disabled.value = true;
+    }
+    getDetail();
+  }
+  console.log(route.query);
+});
+</script>
+
+<template>
+  <div class="edit-health-goods pl-20px pt-20px">
+    <NForm
+      ref="formRef"
+      :model="model"
+      :rules="rules"
+      label-placement="left"
+      label-width="120px"
+      require-mark-placement="right-hanging"
+      size="medium"
+      class="max-w-840px"
+      :disabled="disabled"
+    >
+      <div class="font-600">基本信息</div>
+      <template v-if="disabled">
+        <NFormItem label="app_id">
+          <div>{{ model.appId }}</div>
+          <!-- <NInput v-model:value="model.appId" placeholder="" /> -->
+        </NFormItem>
+        <NFormItem label="app_secret">
+          <div class="flex items-center">
+            <div>{{ model.appSecret }}</div>
+            <div @click="getSecret">
+              <SvgIcon v-if="!isShow" icon="weui:eyes-off-filled" class="ml-10px"></SvgIcon>
+            </div>
+            <NButton class="ml-10px" round type="primary" size="small" :loading="loading" @click="handleResetSecret">
+              重置秘钥
+            </NButton>
+          </div>
+          <!-- <NInput v-model:value="model.appSecret" placeholder="" /> -->
+        </NFormItem>
+      </template>
+      <NFormItem label="渠道名称" path="accessName">
+        <div class="w-100%">
+          <NInput v-model:value="model.accessName" :maxlength="20" placeholder="" />
+          <div class="text-12px">最多支持20个汉字;</div>
+        </div>
+      </NFormItem>
+
+      <NFormItem label="租户编号" path="tenantId">
+        <ApiSelect
+          v-model:value="model.tenantId"
+          :api="fetchGetTenantList"
+          result-feild="data.list"
+          label-field="tenantCode"
+          value-field="id"
+        ></ApiSelect>
+      </NFormItem>
+
+      <NFormItem label="状态">
+        <NSwitch v-model:value="model.status" :unchecked-value="0" :checked-value="1" />
+      </NFormItem>
+
+      <NFormItem label="渠道LOGO" path="logoUrl">
+        <ZUpload v-model:value="model.logoUrl" :max="1"></ZUpload>
+      </NFormItem>
+      <NFormItem label="备注" path="remark">
+        <div class="w-100%">
+          <NInput v-model:value="model.remark" type="textarea" show-count :maxlength="500" placeholder="" />
+          <div class="text-12px">最多支持500个汉字;</div>
+        </div>
+      </NFormItem>
+
+      <div class="flex">
+        <div class="items-center font-600">支付归属</div>
+        <div class="ml-20px text-12px">支付归属影响资金流向,一旦确定不可变更。如需切换,建议新建渠道后迁移。</div>
+      </div>
+
+      <NFormItem label="支付方式设置" path="payType">
+        <!-- 平台支付 -->
+        <NRadioGroup v-model:value="model.payOwnership" :disabled="payOwnershipDisabled" name="radiogroup">
+          <NFormItem label="" path="shareRatio">
+            <div class="flex-col">
+              <div class="flex items-center">
+                <NRadio :value="1" class="mr-2" />
+                <span class="text-sm">平台支付(资金进入平台商户号,平台统一收款)</span>
+              </div>
+
+              <div v-if="model.payOwnership === 1" class="flex items-center gap-2 pl-6 text-sm">
+                <span>分账比例设置</span>
+                <NInputNumber
+                  v-model:value="model.shareRatio"
+                  :disabled="payOwnershipDisabled"
+                  :min="0"
+                  :max="100"
+                  :precision="2"
+                />
+                <span>% 给渠道方</span>
+              </div>
+              <p v-if="model.payOwnership === 1" class="ml-120px text-xs text-gray-500">范围:0-100,保留两位小数</p>
+            </div>
+          </NFormItem>
+          <!-- 第三方支付 -->
+          <NFormItem label="" path="thirdCallbackUrl">
+            <div class="flex items-center">
+              <NRadio :value="2" class="mr-2" />
+              <span class="text-sm">第三方支付(资金进入第三方商户,平台只提供技术服务)</span>
+            </div>
+
+            <div v-if="model.payOwnership === 2" class="flex items-center gap-2 pl-6 text-sm">
+              <span>第三方回调地址</span>
+              <NInput
+                v-model:value="model.thirdCallbackUrl"
+                :disabled="payOwnershipDisabled"
+                placeholder="请输入回调地址"
+                class="flex-1"
+              />
+            </div>
+          </NFormItem>
+        </NRadioGroup>
+      </NFormItem>
+
+      <div class="font-600">主题样式</div>
+      <NFormItem label="主色" path="themeMainColor">
+        <NInput v-model:value="model.themeMainColor" placeholder="" />
+      </NFormItem>
+      <NFormItem label="辅色" path="themeSubColor">
+        <NInput v-model:value="model.themeSubColor" placeholder="" />
+      </NFormItem>
+
+      <div class="font-600">对接配置</div>
+
+      <NFormItem label="授权回调地址" path="authCallbackUrl">
+        <NInput v-model:value="model.authCallbackUrl" placeholder="" />
+      </NFormItem>
+      <NFormItem label="支付回调地址" path="payCallbackUrl">
+        <NInput v-model:value="model.payCallbackUrl" placeholder="" />
+      </NFormItem>
+
+      <div v-if="!disabled" class="flex justify-end">
+        <NButton round type="primary" :loading="loading" @click="handleValidateButtonClick">保存</NButton>
+      </div>
+    </NForm>
+  </div>
+</template>
+
+<style lang="scss" scoped>
+::v-deep .n-form-item-blank {
+  z-index: 6 !important;
+}
+.edit-health-goods {
+  background: #fff;
+}
+</style>

+ 123 - 0
src/views/h5-manage/user-list/index.vue

@@ -0,0 +1,123 @@
+<script setup lang="tsx">
+import { NImage } from 'naive-ui';
+import { fetchUserList } from '@/service/api/h5-manage/user-list';
+import { fetchChannelList } from '@/service/api/h5-manage/channel-manage';
+import { fetchBackendChannelSelect } from '@/service/api/xsb-manage/store-info';
+import { useTable } from '@/components/zt/Table/hooks/useTable';
+
+const columns: NaiveUI.TableColumn<Api.goods.ShopSku>[] = [
+  {
+    key: 'id',
+    title: '用户ID',
+    align: 'center'
+  },
+  {
+    key: 'accessId',
+    title: '渠道ID',
+    align: 'center'
+  },
+  {
+    key: 'accessName',
+    title: '渠道',
+    align: 'center'
+  },
+
+  {
+    key: 'realName',
+    title: '姓名',
+    align: 'center'
+  },
+  {
+    key: 'nickName',
+    title: '用户昵称',
+    align: 'center'
+  },
+  {
+    key: 'avatarUrl',
+    title: '头像',
+    align: 'center',
+    render: row => <NImage src={row.avatarUrl} class="h-[80px] min-w-80px w-[80px]" lazy />
+  },
+  {
+    key: 'mobile',
+    title: '手机号码',
+    align: 'center'
+  },
+  {
+    key: 'channelName',
+    title: '企业',
+    align: 'center'
+  },
+  {
+    key: 'createTime',
+    title: '注册时间',
+    align: 'center'
+  }
+];
+
+const [registerTable] = useTable({
+  searchFormConfig: {
+    schemas: [
+      {
+        field: 'mobile',
+        label: '用户手机号',
+        component: 'NInput'
+      },
+      {
+        field: 'id',
+        label: '用户ID',
+        component: 'NInput'
+      },
+      {
+        field: 'accessId',
+        label: '渠道',
+        component: 'ApiSelect',
+        componentProps: {
+          api: fetchChannelList,
+          resultFeild: 'data.list',
+          labelFeild: 'accessName',
+          valueFeild: 'accessId'
+        }
+      },
+      {
+        label: '企业',
+        field: 'channelId',
+        component: 'ApiSelect',
+        componentProps: {
+          api: fetchBackendChannelSelect,
+          multiple: true,
+          labelFeild: 'name',
+          valueFeild: 'id'
+        }
+      },
+      {
+        label: '注册时间',
+        component: 'NDatePicker',
+        field: 'createTime',
+        componentProps: {
+          type: 'datetimerange',
+          defaultTime: ['00:00:00', '23:59:59']
+        }
+      }
+    ],
+    inline: false,
+    size: 'small',
+    labelPlacement: 'left',
+    isFull: false
+  },
+  tableConfig: {
+    keyField: 'id',
+    title: '用户列表',
+    showAddButton: false,
+    fieldMapToTime: [['createTime', ['startTime', 'endTime']]]
+  }
+});
+</script>
+
+<template>
+  <LayoutTable>
+    <ZTable :columns="columns" :api="fetchUserList" :show-table-action="false" @register="registerTable"></ZTable>
+  </LayoutTable>
+</template>
+
+<style scoped></style>

+ 9 - 1
src/views/order-manage/order-detail/index.vue

@@ -501,6 +501,10 @@ function getRefundRecordText() {
                   <NTd>{{ orderInfo.freightAmount }}</NTd>
                   <NTd></NTd>
                 </NTr>
+                <NTr v-if="orderInfo.memberDiscountAmount">
+                  <NTd>{{ orderInfo.memberDiscountDesc }}</NTd>
+                  <NTd>-{{ orderInfo.memberDiscountAmount }}</NTd>
+                </NTr>
                 <NTr v-if="orderInfo.couponBaseInfoDTO">
                   <NTd>优惠券</NTd>
                   <NTd>-{{ orderInfo.couponBaseInfoDTO?.discountMoney || 0 }}</NTd>
@@ -662,7 +666,11 @@ function getRefundRecordText() {
                   </NTr>
                   <NTr>
                     <NTd>订单金额</NTd>
-                    <NTd>{{ orderInfo.actualTotal }}</NTd>
+                    <NTd>{{ orderInfo.orderMoney }}</NTd>
+                  </NTr>
+                  <NTr v-if="orderInfo.chargeOrder.memberDiscountAmount">
+                    <NTd>会员权益(每度电立减{{ orderInfo.chargeOrder.memberPerKwhDiscount }}元)</NTd>
+                    <NTd>-{{ orderInfo.chargeOrder.memberDiscountAmount }}</NTd>
                   </NTr>
                   <NTr>
                     <NTd>积分抵扣</NTd>