zs 1 年之前
父節點
當前提交
d80cac3cdb

+ 17 - 16
src/layout/site.ts

@@ -20,48 +20,49 @@ export const menuInfo = {
       index: '2',
       index: '2',
       type: '0',
       type: '0',
       children: [
       children: [
-        { icon: 'iconshouye', _id: 'admin_2_1', path: '/users/match', name: '比赛人员' },
-        { icon: 'iconshouye', _id: 'admin_2_2', path: '/users/team', name: '团队管理人员' }
+        { icon: 'iconshouye', _id: 'admin_2_1', path: '/users/user', name: '普通用户' },
+        { icon: 'iconshouye', _id: 'admin_2_2', path: '/users/admin', name: '街道管理员' },
+        { icon: 'iconshouye', _id: 'admin_2_3', path: '/users/firm', name: '厂商' },
       ]
       ]
     },
     },
     {
     {
       icon: 'iconshouye',
       icon: 'iconshouye',
       _id: 'admin_3',
       _id: 'admin_3',
-      name: '团队管理',
+      name: '商品管理',
       index: '3',
       index: '3',
-      type: '0',
-      children: [
-        { icon: 'iconshouye', _id: 'admin_3_1', path: '/team/examine', name: '团队信息审批' },
-        { icon: 'iconshouye', _id: 'admin_3_2', path: '/team/team', name: '团队信息列表' }
-      ]
+      path: '/goods/index'
     },
     },
     {
     {
       icon: 'iconshouye',
       icon: 'iconshouye',
       _id: 'admin_4',
       _id: 'admin_4',
-      name: '比赛管理',
+      name: '订单管理',
       index: '4',
       index: '4',
-      path: '/match/index'
+      path: '/order/index'
     },
     },
     {
     {
       icon: 'iconshouye',
       icon: 'iconshouye',
       _id: 'admin_5',
       _id: 'admin_5',
-      name: '账号管理',
+      name: '系统设置',
       index: '5',
       index: '5',
       type: '0',
       type: '0',
       children: [
       children: [
-        { icon: 'iconshouye', _id: 'admin_4_1', path: '/acccount/updatepd', name: '修改密码' }
+        { icon: 'iconshouye', _id: 'admin_5_1', path: '/system/config', name: '基础设置' },
+        { icon: 'iconshouye', _id: 'admin_5_2', path: '/system/dict', name: '字典管理' },
+        { icon: 'iconshouye', _id: 'admin_5_3', path: '/system/role', name: '角色设置' },
+        { icon: 'iconshouye', _id: 'admin_5_4', path: '/system/module', name: '首页模块设置' },
+        { icon: 'iconshouye', _id: 'admin_5_5', path: '/system/buy', name: '采购审批设置' },
+        { icon: 'iconshouye', _id: 'admin_5_6', path: '/system/money', name: '回款审批设置' },
       ]
       ]
     },
     },
     {
     {
       icon: 'iconshouye',
       icon: 'iconshouye',
       _id: 'admin_6',
       _id: 'admin_6',
-      name: '系统设置',
+      name: '账号管理',
       index: '6',
       index: '6',
       type: '0',
       type: '0',
       children: [
       children: [
-        { icon: 'iconshouye', _id: 'admin_5_2', path: '/system/config', name: '基础设置' },
-        { icon: 'iconshouye', _id: 'admin_5_1', path: '/system/dict', name: '字典管理' }
+        { icon: 'iconshouye', _id: 'admin_6_1', path: '/acccount/updatepd', name: '修改密码' }
       ]
       ]
-    }
+    },
   ]
   ]
 };
 };

+ 56 - 61
src/router/index.ts

@@ -11,98 +11,78 @@ const router = createRouter({
     {
     {
       path: '/login',
       path: '/login',
       name: 'login',
       name: 'login',
-      meta: { title: '羽毛球比赛-账号登录' },
+      meta: { title: '耗材管理系统-账号登录' },
       component: () => import('@/views/login/index.vue')
       component: () => import('@/views/login/index.vue')
     },
     },
     {
     {
       path: '/homeIndex',
       path: '/homeIndex',
-      meta: { title: '羽毛球比赛-系统首页' },
+      meta: { title: '耗材管理系统-系统首页' },
       component: () => import('@/components/admin-frame/home.vue'),
       component: () => import('@/components/admin-frame/home.vue'),
       children: [
       children: [
         {
         {
           path: '/homeIndex',
           path: '/homeIndex',
-          meta: { title: '羽毛球比赛-系统首页' },
+          meta: { title: '耗材管理系统-系统首页' },
           component: () => import('@/views/home/index.vue')
           component: () => import('@/views/home/index.vue')
         },
         },
         {
         {
-          path: '/users/match',
-          meta: { title: '比赛人员管理' },
-          component: () => import('@/views/users/match/index.vue')
+          path: '/users/user',
+          meta: { title: '普通用户管理' },
+          component: () => import('@/views/users/user/index.vue')
         },
         },
         {
         {
-          path: '/users/match/detail',
-          meta: { title: '信息修改' },
-          component: () => import('@/views/users/match/detail.vue')
-        },
-        {
-          path: '/users/team',
-          meta: { title: '团队管理人员管理' },
-          component: () => import('@/views/users/team/index.vue')
-        },
-        {
-          path: '/users/team/detail',
-          meta: { title: '团队管理人员信息管理' },
-          component: () => import('@/views/users/team/detail.vue')
-        },
-        {
-          path: '/team/examine',
-          meta: { title: '团队信息审批' },
-          component: () => import('@/views/team/examine/index.vue')
-        },
-        {
-          path: '/team/examine/detail',
-          meta: { title: '团队审批信息管理' },
-          component: () => import('@/views/team/examine/detail.vue')
+          path: '/users/user/detail',
+          meta: { title: '信息管理' },
+          component: () => import('@/views/users/user/detail.vue')
         },
         },
         {
         {
-          path: '/team/team',
-          meta: { title: '团队信息列表' },
-          component: () => import('@/views/team/team/index.vue')
+          path: '/users/admin',
+          meta: { title: '街道管理员管理' },
+          component: () => import('@/views/users/admin/index.vue')
         },
         },
         {
         {
-          path: '/team/team/detail',
-          meta: { title: '团队信息查看' },
-          component: () => import('@/views/team/team/detail.vue')
+          path: '/users/admin/detail',
+          meta: { title: '信息管理' },
+          component: () => import('@/views/users/admin/detail.vue')
         },
         },
         {
         {
-          path: '/match/index',
-          meta: { title: '比赛管理' },
-          component: () => import('@/views/match/index.vue')
+          path: '/users/firm',
+          meta: { title: '厂商管理' },
+          component: () => import('@/views/users/firm/index.vue')
         },
         },
         {
         {
-          path: '/match/detail',
+          path: '/users/firm/detail',
           meta: { title: '信息管理' },
           meta: { title: '信息管理' },
-          component: () => import('@/views/match/detail.vue')
+          component: () => import('@/views/users/firm/detail.vue')
         },
         },
         {
         {
-          path: '/match/enroll',
-          meta: { title: '团队报名情况' },
-          component: () => import('@/views/match/enroll/index.vue')
+          path: '/goods/index',
+          meta: { title: '商品管理' },
+          component: () => import('@/views/goods/index.vue')
         },
         },
         {
         {
-          path: '/match/enroll/detail',
-          meta: { title: '团队报名查看' },
-          component: () => import('@/views/match/enroll/detail.vue')
+          path: '/goods/detail',
+          meta: { title: '商品信息管理' },
+          component: () => import('@/views/goods/detail.vue')
         },
         },
         {
         {
-          path: '/match/course',
-          meta: { title: '赛程安排' },
-          component: () => import('@/views/match/course/index.vue')
+          path: '/order/index',
+          meta: { title: '订单管理' },
+          component: () => import('@/views/order/index.vue')
         },
         },
         {
         {
-          path: '/match/course/detail',
-          meta: { title: '赛程安排信息管理' },
-          component: () => import('@/views/match/course/detail.vue')
+          path: '/order/detail',
+          meta: { title: '订单信息管理' },
+          component: () => import('@/views/order/detail.vue')
         },
         },
         {
         {
-          path: '/match/ranking',
-          meta: { title: '团队排名' },
-          component: () => import('@/views/match/ranking/index.vue')
+          path: '/system/buy',
+          meta: { title: '采购审批设置' },
+          component: () => import('@/views/system/buy/index.vue')
         },
         },
         {
         {
-          path: '/acccount/updatepd',
-          meta: { title: '修改密码' },
-          component: () => import('@/views/updatepd/index.vue')
+          path: '/system/config',
+          meta: { title: '基础设置' },
+          component: () => import('@/views/system/config/index.vue')
         },
         },
         {
         {
           path: '/system/dict',
           path: '/system/dict',
@@ -115,9 +95,24 @@ const router = createRouter({
           component: () => import('@/views/system/dictData/index.vue')
           component: () => import('@/views/system/dictData/index.vue')
         },
         },
         {
         {
-          path: '/system/config',
-          meta: { title: '基础设置' },
-          component: () => import('@/views/system/config/index.vue')
+          path: '/system/module',
+          meta: { title: '首页模块设置' },
+          component: () => import('@/views/system/module/index.vue')
+        },
+        {
+          path: '/system/money',
+          meta: { title: '回款审批设置' },
+          component: () => import('@/views/system/money/index.vue')
+        },
+        {
+          path: '/system/role',
+          meta: { title: '角色设置' },
+          component: () => import('@/views/system/role/index.vue')
+        },
+        {
+          path: '/acccount/updatepd',
+          meta: { title: '修改密码' },
+          component: () => import('@/views/updatepd/index.vue')
         }
         }
       ]
       ]
     }
     }

+ 1 - 1
src/stores/config.ts

@@ -6,7 +6,7 @@ import _ from 'lodash';
 import type { IQueryType, IQueryResult, IQueryParams } from '@/util/types.util';
 import type { IQueryType, IQueryResult, IQueryParams } from '@/util/types.util';
 const axios = new AxiosWrapper();
 const axios = new AxiosWrapper();
 const api = {
 const api = {
-  url: `/ball/v1/api/config`
+  url: `/material/v1/api/Config`
 };
 };
 export const ConfigStore = defineStore('config', () => {
 export const ConfigStore = defineStore('config', () => {
   const count = ref(0);
   const count = ref(0);

+ 1 - 1
src/stores/dict/dictData.ts

@@ -6,7 +6,7 @@ import _ from 'lodash';
 import type { IQueryType, IQueryResult, IQueryParams } from '@/util/types.util';
 import type { IQueryType, IQueryResult, IQueryParams } from '@/util/types.util';
 const axios = new AxiosWrapper();
 const axios = new AxiosWrapper();
 const api = {
 const api = {
-  url: `/ball/v1/api/dictData`
+  url: `/material/v1/api/DictData`
 };
 };
 export const DictDataStore = defineStore('dictData', () => {
 export const DictDataStore = defineStore('dictData', () => {
   const count = ref(0);
   const count = ref(0);

+ 1 - 1
src/stores/dict/dictType.ts

@@ -6,7 +6,7 @@ import _ from 'lodash';
 import type { IQueryType, IQueryResult, IQueryParams } from '@/util/types.util';
 import type { IQueryType, IQueryResult, IQueryParams } from '@/util/types.util';
 const axios = new AxiosWrapper();
 const axios = new AxiosWrapper();
 const api = {
 const api = {
-  url: `/ball/v1/api/dictType`
+  url: `/material/v1/api/DictType`
 }
 }
 export const DictTypeStore = defineStore('dictType', () => {
 export const DictTypeStore = defineStore('dictType', () => {
   const count = ref(0);
   const count = ref(0);

+ 0 - 52
src/stores/match/application.ts

@@ -1,52 +0,0 @@
-import { ref, computed } from 'vue';
-import { defineStore } from 'pinia';
-import { AxiosWrapper } from '@/util/axios-wrapper';
-import _ from 'lodash';
-
-import type { IQueryType, IQueryResult, IQueryParams } from '@/util/types.util';
-const axios = new AxiosWrapper();
-const api = {
-  url: `/ball/v1/api/application`
-};
-export const ApplicationStore = defineStore('application', () => {
-  const count = ref(0);
-  const doubleCount = computed(() => count.value * 2);
-  function increment() {
-    count.value++;
-  }
-  const query = async ({ skip = 0, limit = undefined, ...info }: IQueryParams = {}): Promise<IQueryResult> => {
-    let cond: IQueryType = {};
-    if (skip) cond.skip = skip;
-    if (limit) cond.limit = limit;
-    cond = { ...cond, ...info };
-    const res = await axios.$get(`${api.url}`, cond);
-    return res;
-  };
-  const fetch = async (payload: any): Promise<IQueryResult> => {
-    const res = await axios.$get(`${api.url}/${payload}`);
-    return res;
-  };
-  const create = async (payload: any): Promise<IQueryResult> => {
-    const res = await axios.$post(`${api.url}`, payload);
-    return res;
-  };
-  const update = async (payload: any): Promise<IQueryResult> => {
-    const id = _.get(payload, 'id', _.get(payload, '_id'));
-    const res = await axios.$post(`${api.url}/${id}`, payload);
-    return res;
-  };
-  const del = async (payload: any): Promise<IQueryResult> => {
-    const res = await axios.$delete(`${api.url}/${payload}`);
-    return res;
-  };
-  return {
-    count,
-    doubleCount,
-    increment,
-    query,
-    fetch,
-    create,
-    update,
-    del
-  };
-});

+ 0 - 57
src/stores/match/course.ts

@@ -1,57 +0,0 @@
-import { ref, computed } from 'vue';
-import { defineStore } from 'pinia';
-import { AxiosWrapper } from '@/util/axios-wrapper';
-import _ from 'lodash';
-
-import type { IQueryType, IQueryResult, IQueryParams } from '@/util/types.util';
-const axios = new AxiosWrapper();
-const api = {
-  url: `/ball/v1/api/course`
-};
-export const CourseStore = defineStore('course', () => {
-  const count = ref(0);
-  const doubleCount = computed(() => count.value * 2);
-  function increment() {
-    count.value++;
-  }
-  const query = async ({ skip = 0, limit = undefined, ...info }: IQueryParams = {}): Promise<IQueryResult> => {
-    let cond: IQueryType = {};
-    if (skip) cond.skip = skip;
-    if (limit) cond.limit = limit;
-    cond = { ...cond, ...info };
-    const res = await axios.$get(`${api.url}`, cond);
-    return res;
-  };
-  const ranking = async ({ ...info }: IQueryParams = {}): Promise<IQueryResult> => {
-    const res = await axios.$get(`${api.url}/ranking`, info);
-    return res;
-  };
-  const fetch = async (payload: any): Promise<IQueryResult> => {
-    const res = await axios.$get(`${api.url}/${payload}`);
-    return res;
-  };
-  const create = async (payload: any): Promise<IQueryResult> => {
-    const res = await axios.$post(`${api.url}`, payload);
-    return res;
-  };
-  const update = async (payload: any): Promise<IQueryResult> => {
-    const id = _.get(payload, 'id', _.get(payload, '_id'));
-    const res = await axios.$post(`${api.url}/${id}`, payload);
-    return res;
-  };
-  const del = async (payload: any): Promise<IQueryResult> => {
-    const res = await axios.$delete(`${api.url}/${payload}`);
-    return res;
-  };
-  return {
-    count,
-    doubleCount,
-    increment,
-    query,
-    ranking,
-    fetch,
-    create,
-    update,
-    del
-  };
-});

+ 0 - 52
src/stores/match/match.ts

@@ -1,52 +0,0 @@
-import { ref, computed } from 'vue';
-import { defineStore } from 'pinia';
-import { AxiosWrapper } from '@/util/axios-wrapper';
-import _ from 'lodash';
-
-import type { IQueryType, IQueryResult, IQueryParams } from '@/util/types.util';
-const axios = new AxiosWrapper();
-const api = {
-  url: `/ball/v1/api/match`
-};
-export const MatchStore = defineStore('match', () => {
-  const count = ref(0);
-  const doubleCount = computed(() => count.value * 2);
-  function increment() {
-    count.value++;
-  }
-  const query = async ({ skip = 0, limit = undefined, ...info }: IQueryParams = {}): Promise<IQueryResult> => {
-    let cond: IQueryType = {};
-    if (skip) cond.skip = skip;
-    if (limit) cond.limit = limit;
-    cond = { ...cond, ...info };
-    const res = await axios.$get(`${api.url}`, cond);
-    return res;
-  };
-  const fetch = async (payload: any): Promise<IQueryResult> => {
-    const res = await axios.$get(`${api.url}/${payload}`);
-    return res;
-  };
-  const create = async (payload: any): Promise<IQueryResult> => {
-    const res = await axios.$post(`${api.url}`, payload);
-    return res;
-  };
-  const update = async (payload: any): Promise<IQueryResult> => {
-    const id = _.get(payload, 'id', _.get(payload, '_id'));
-    const res = await axios.$post(`${api.url}/${id}`, payload);
-    return res;
-  };
-  const del = async (payload: any): Promise<IQueryResult> => {
-    const res = await axios.$delete(`${api.url}/${payload}`);
-    return res;
-  };
-  return {
-    count,
-    doubleCount,
-    increment,
-    query,
-    fetch,
-    create,
-    update,
-    del
-  };
-});

+ 0 - 56
src/stores/team/team.ts

@@ -1,56 +0,0 @@
-import { ref, computed } from 'vue';
-import { defineStore } from 'pinia';
-import { AxiosWrapper } from '@/util/axios-wrapper';
-import _ from 'lodash';
-
-import type { IQueryType, IQueryResult, IQueryParams } from '@/util/types.util';
-const axios = new AxiosWrapper();
-const api = {
-  url: `/ball/v1/api/team`
-};
-export const TeamStore = defineStore('team', () => {
-  const count = ref(0);
-  const doubleCount = computed(() => count.value * 2);
-  function increment() {
-    count.value++;
-  }
-  const query = async ({
-    skip = 0,
-    limit = undefined,
-    ...info
-  }: IQueryParams = {}): Promise<IQueryResult> => {
-    let cond: IQueryType = {};
-    if (skip) cond.skip = skip;
-    if (limit) cond.limit = limit;
-    cond = { ...cond, ...info };
-    const res = await axios.$get(`${api.url}`, cond);
-    return res;
-  };
-  const fetch = async (payload: any): Promise<IQueryResult> => {
-    const res = await axios.$get(`${api.url}/${payload}`);
-    return res;
-  };
-  const create = async (payload: any): Promise<IQueryResult> => {
-    const res = await axios.$post(`${api.url}`, payload);
-    return res;
-  };
-  const update = async (payload: any): Promise<IQueryResult> => {
-    const id = _.get(payload, 'id', _.get(payload, '_id'));
-    const res = await axios.$post(`${api.url}/${id}`, payload);
-    return res;
-  };
-  const del = async (payload: any): Promise<IQueryResult> => {
-    const res = await axios.$delete(`${api.url}/${payload}`);
-    return res;
-  };
-  return {
-    count,
-    doubleCount,
-    increment,
-    query,
-    fetch,
-    create,
-    update,
-    del
-  };
-});

+ 1 - 1
src/stores/users/admin.ts

@@ -6,7 +6,7 @@ import _ from 'lodash';
 import type { IQueryType, IQueryResult, IQueryParams } from '@/util/types.util';
 import type { IQueryType, IQueryResult, IQueryParams } from '@/util/types.util';
 const axios = new AxiosWrapper();
 const axios = new AxiosWrapper();
 const api = {
 const api = {
-  url: `/ball/v1/api/admin`
+  url: `/material/v1/api/Admin`
 };
 };
 export const AdminStore = defineStore('admin', () => {
 export const AdminStore = defineStore('admin', () => {
   const count = ref(0);
   const count = ref(0);

+ 1 - 1
src/stores/users/user.ts

@@ -6,7 +6,7 @@ import _ from 'lodash';
 import type { IQueryType, IQueryResult, IQueryParams } from '@/util/types.util';
 import type { IQueryType, IQueryResult, IQueryParams } from '@/util/types.util';
 const axios = new AxiosWrapper();
 const axios = new AxiosWrapper();
 const api = {
 const api = {
-  url: `/ball/v1/api/user`
+  url: `/material/v1/api/User`
 };
 };
 export const UserStore = defineStore('user', () => {
 export const UserStore = defineStore('user', () => {
   const count = ref(0);
   const count = ref(0);

+ 0 - 0
src/views/goods/detail.vue


+ 38 - 0
src/views/goods/index.vue

@@ -0,0 +1,38 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
+        <el-col :span="24" class="one">系统首页</el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script setup lang="ts">
+// 基础
+import type { Ref } from 'vue';
+// reactive,
+import { onMounted, ref, getCurrentInstance } from 'vue';
+// 接口
+//import { TestStore } from '@common/src/stores/test';
+//import type { IQueryResult } from '@/util/types.util';
+//const testAxios = TestStore();
+const { proxy } = getCurrentInstance() as any;
+// 加载中
+const loading: Ref<any> = ref(false);
+// 分页数据
+//  const skip = 0;
+//  const limit = proxy.limit;;
+// 请求
+onMounted(async () => {
+  loading.value = true;
+  //  await search({ skip, limit });
+  loading.value = false;
+});
+//const search = async (e: { skip: number; limit: number }) => {
+//  const info = { skip: e.skip, limit: e.limit, ...searchInfo.value  };
+//  const res: IQueryResult = await testAxios.query(info);
+//  console.log(res);
+//};
+</script>
+<style scoped lang="scss"></style>

+ 0 - 125
src/views/match/course/detail.vue

@@ -1,125 +0,0 @@
-<template>
-  <div id="detail">
-    <el-row>
-      <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
-        <el-col :span="24" class="one">
-          <cSearch :is_title="false" :is_back="true" @toBack="toBack"></cSearch>
-        </el-col>
-        <el-col :span="24" class="two">
-          <cForm :span="24" :fields="fields" :form="form" :rules="rules" @save="toSave" label-width="auto">
-            <template #red_team_id>
-              <el-option v-for="i in applicationList" :key="i.team_id" :label="i.team_name" :value="i.team_id"></el-option>
-            </template>
-            <template #blue_team_id>
-              <el-option v-for="i in applicationList" :key="i.team_id" :label="i.team_name" :value="i.team_id"></el-option>
-            </template>
-          </cForm>
-        </el-col>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script setup lang="ts">
-// 基础
-import type { Ref } from 'vue';
-import { ref, reactive, onMounted } from 'vue';
-import type { FormRules } from 'element-plus';
-import { ElMessage } from 'element-plus';
-import { useRoute } from 'vue-router';
-// 接口
-import { MatchStore } from '@/stores/match/match';
-import { CourseStore } from '@/stores/match/course';
-import { ApplicationStore } from '@/stores/match/application';
-import { DictDataStore } from '@/stores/dict/dictData'; // 字典表
-import type { IQueryResult } from '@/util/types.util';
-const courseAxios = CourseStore();
-const applicationAxios = ApplicationStore();
-const matchAxios = MatchStore();
-const dictAxios = DictDataStore();
-const route = useRoute();
-// 加载中
-const loading: Ref<any> = ref(false);
-// 表单
-let form: Ref<any> = ref({});
-let match_id: Ref<any> = ref(route.query.match_id);
-const rules = reactive<FormRules>({
-  red_team_id: [{ required: true, message: '红方团队名称', trigger: 'blur' }],
-  blue_team_id: [{ required: true, message: '蓝方团队名称', trigger: 'blur' }],
-  match_time: [{ required: true, message: '比赛时间', trigger: 'blur' }]
-});
-let fields: Ref<any[]> = ref([
-  { label: '比赛名称', model: 'match_name', options: { disabled: true } },
-  { label: '红方团队名称', model: 'red_team_id', type: 'select' },
-  { label: '蓝方团队名称', model: 'blue_team_id', type: 'select' },
-  { label: '比赛时间', model: 'match_time', type: 'datetime' }
-]);
-// 字典表
-const statusList: Ref<any> = ref([]);
-const applicationList: Ref<any> = ref([]);
-// 请求
-onMounted(async () => {
-  loading.value = true;
-  await searchOther();
-  await search();
-  loading.value = false;
-});
-const search = async () => {
-  let id = route.query.id;
-  if (id) {
-    const list = [
-      { label: '比赛名称', model: 'match_name', options: { disabled: true } },
-      { label: '红方团队名称', model: 'red_team_id', type: 'select' },
-      { label: '蓝方团队名称', model: 'blue_team_id', type: 'select' },
-      { label: '比赛时间', model: 'match_time', type: 'datetime' }
-    ];
-    fields.value = list;
-    let res: IQueryResult = await courseAxios.fetch(id);
-    if (res.errcode == '0') {
-      let info: any = res.data as {};
-      form.value = info;
-    }
-  } else {
-    let res: any = await matchAxios.fetch(match_id.value);
-    if (res.errcode == '0') {
-      form.value.match_id = res.data._id;
-      form.value.match_name = res.data.name;
-    }
-  }
-};
-// 保存
-const toSave = async (data) => {
-  const red = applicationList.value.find((i) => i.team_id == data.red_team_id);
-  if (red) {
-    data.red_team_name = red.team_name;
-    data.red_person = red.user_id;
-  }
-  const blue = applicationList.value.find((i) => i.team_id == data.blue_team_id);
-  if (blue) {
-    data.blue_team_name = blue.team_name;
-    data.blue_person = blue.user_id;
-  }
-  let res: IQueryResult;
-  if (data._id) res = await courseAxios.update(data);
-  else res = await courseAxios.create(data);
-  if (res.errcode == 0) {
-    ElMessage({ type: `success`, message: `维护信息成功` });
-    toBack();
-  }
-};
-// 查询其他信息
-const searchOther = async () => {
-  let res: IQueryResult;
-  // 状态
-  res = await dictAxios.query({ type: 'course_status' });
-  if (res.errcode == '0') statusList.value = res.data;
-  // 报名情况
-  res = await applicationAxios.query({ match_id: match_id.value, status: '1' });
-  if (res.errcode == '0') applicationList.value = res.data;
-};
-// 返回上一页
-const toBack = () => {
-  window.history.go(-1);
-};
-</script>
-<style scoped lang="scss"></style>

+ 0 - 229
src/views/match/course/index.vue

@@ -1,229 +0,0 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
-        <el-col :span="24" class="one">
-          <cSearch :is_title="false" :is_search="true" :fields="fields" @search="toSearch">
-            <template #status>
-              <el-option v-for="(i, index) in statusList" :key="index" :label="i.label" :value="i.value"></el-option>
-            </template>
-          </cSearch>
-        </el-col>
-        <el-col :span="24" class="two">
-          <cButton @toAdd="toAdd()">
-            <template v-slot:custom>
-              <el-button type="primary" @click="toBack">返回</el-button>
-            </template>
-          </cButton>
-        </el-col>
-        <el-col :span="24" class="thr">
-          <cTable :fields="fields" :opera="opera" :list="list" @query="search" :total="total" @status="toStatus" @edit="toEdit" @del="toDel"> </cTable>
-        </el-col>
-      </el-col>
-    </el-row>
-    <cDialog :dialog="dialog" @toClose="toClose">
-      <template v-slot:info>
-        <el-col :span="24" class="dialog_one" v-if="dialog.type == '1'">
-          <cForm :span="24" :fields="formFields" :form="form" :rules="{}" @save="toSave" @dataChange="dataChange" label-width="auto">
-            <template #winner>
-              <el-option v-for="item in winnerList" :key="item._id" :label="item.name" :value="item._id">
-                <span style="float: left">{{ item.name }}</span>
-                <span style="float: right; color: #8492a6; font-size: 13px">{{ item.color }}</span>
-              </el-option>
-            </template>
-            <template #status>
-              <el-option v-for="i in statusList" :key="i.value" :label="i.label" :value="i.value"></el-option>
-            </template>
-          </cForm>
-        </el-col>
-      </template>
-    </cDialog>
-  </div>
-</template>
-
-<script setup lang="ts">
-// 基础
-import type { Ref } from 'vue';
-import { onMounted, ref, getCurrentInstance } from 'vue';
-import { ElMessage } from 'element-plus';
-import { useRouter, useRoute } from 'vue-router';
-// 接口
-import { CourseStore } from '@/stores/match/course';
-import { TeamStore } from '@/stores/team/team';
-import { ApplicationStore } from '@/stores/match/application';
-import { DictDataStore } from '@/stores/dict/dictData'; // 字典表
-import type { IQueryResult } from '@/util/types.util';
-const courseAxios = CourseStore();
-const dictAxios = DictDataStore();
-const teamAxios = TeamStore();
-const applicationAxios = ApplicationStore();
-const { proxy } = getCurrentInstance() as any;
-// 路由
-const router = useRouter();
-const route = useRoute();
-// 加载中
-const loading: Ref<any> = ref(false);
-let id: Ref<any> = ref(route.query.id);
-let list: Ref<any> = ref([]);
-let total: Ref<number> = ref(0);
-let skip = 0;
-let limit: number = proxy.$limit;
-let fields: Ref<any[]> = ref([
-  { label: '红方团队名称', model: 'red_team_name', isSearch: true },
-  { label: '红方分数', model: 'red_score' },
-  { label: '蓝方团队名称', model: 'blue_team_name' },
-  { label: '蓝方分数', model: 'blue_score' },
-  { label: '比赛时间', model: 'match_time' },
-  { label: '胜者', model: 'winner', format: (i: any) => getDict(i, 'winner') },
-  { label: '状态', model: 'status', type: 'select', isSearch: true, format: (i: any) => getDict(i, 'status') }
-]);
-// 操作
-let opera: Ref<any[]> = ref([
-  { label: '赛程状态', method: 'status' },
-  { label: '修改', method: 'edit', display: (i) => i.status == '0' },
-  { label: '删除', method: 'del', confirm: true, type: 'danger', display: (i) => i.status == '0' }
-]);
-// 查询数据
-let searchForm: Ref<any> = ref({});
-// 字典表
-const statusList: Ref<any> = ref([]);
-const applicaList: Ref<any> = ref([]);
-const winnerList: Ref<any> = ref([]);
-// 弹框
-const dialog: Ref<any> = ref({ title: '赛程状态', show: false, type: '1' });
-const form: Ref<any> = ref({ file: [] });
-const formFields: Ref<any> = ref([{ label: '状态', model: 'status', type: 'select' }]);
-// 请求
-onMounted(async () => {
-  loading.value = true;
-  await searchOther();
-  await search({ skip, limit });
-  loading.value = false;
-});
-const search = async (e: { skip: number; limit: number }) => {
-  const info = { skip: e.skip, limit: e.limit, ...searchForm.value, match_id: id.value };
-  const res: IQueryResult = await courseAxios.query(info);
-  if (res.errcode == '0') {
-    list.value = res.data;
-    total.value = res.total;
-  }
-};
-const toSearch = (query) => {
-  searchForm.value = query;
-  search({ skip, limit });
-};
-// 选择
-const dataChange = ({ model, value }) => {
-  if (model == 'status') {
-    if (value == '-1') {
-      formFields.value.splice(
-        3,
-        0,
-        { label: '红方分数', model: 'red_score' },
-        { label: '蓝方分数', model: 'blue_score' },
-        { label: '胜者', model: 'winner', type: 'select' }
-      );
-    } else {
-      formFields.value = [{ label: '状态', model: 'status', type: 'select' }];
-    }
-  }
-};
-const getDict = (e, model) => {
-  if (model == 'status') {
-    let data: any = statusList.value.find((i: any) => i.value == e);
-    if (data) return data.label;
-    else return '暂无';
-  } else if (model == 'winner') {
-    let name = '暂无';
-    if (e) {
-      let data: any = applicaList.value.find((i: any) => i.team_id == e);
-      if (data) name = data.team_name;
-    }
-    return name;
-  }
-};
-
-// 赛程状态
-const toStatus = async (data) => {
-  let res: any = await courseAxios.fetch(data._id);
-  if (res.errcode == '0') {
-    form.value = res.data;
-    // 胜者
-    const { red_team_id, blue_team_id } = res.data;
-    const red: any = await teamAxios.fetch(red_team_id);
-    const blue: any = await teamAxios.fetch(blue_team_id);
-    let list = [];
-    red.data.color = '红方';
-    blue.data.color = '蓝方';
-    list.push(red.data);
-    list.push(blue.data);
-    winnerList.value = list;
-    if (res.data.status == '-1') {
-      formFields.value.splice(
-        3,
-        0,
-        { label: '红方分数', model: 'red_score' },
-        { label: '蓝方分数', model: 'blue_score' },
-        { label: '胜者', model: 'winner', type: 'select' }
-      );
-    } else {
-      formFields.value = [{ label: '状态', model: 'status', type: 'select' }];
-    }
-    dialog.value = { title: '赛程状态', show: true, type: '1' };
-  }
-};
-// 添加
-const toAdd = () => {
-  router.push({ path: '/match/course/detail', query: { match_id: id.value } });
-};
-// 修改
-const toEdit = (data) => {
-  router.push({ path: '/match/course/detail', query: { id: data._id, match_id: id.value } });
-};
-// 删除
-const toDel = async (data: any) => {
-  let res: IQueryResult = await courseAxios.del(data._id);
-  if (res.errcode == 0) {
-    ElMessage({ type: `success`, message: `刪除信息成功` });
-    search({ skip, limit });
-  }
-};
-// 查询其他信息
-const searchOther = async () => {
-  let res: IQueryResult;
-  // 状态
-  res = await dictAxios.query({ type: 'course_status' });
-  if (res.errcode == '0') statusList.value = res.data;
-  // 报名团队
-  res = await applicationAxios.query({ match_id: id.value });
-  if (res.errcode == '0') applicaList.value = res.data;
-};
-// 提交保存
-const toSave = async (data) => {
-  let res: IQueryResult = await courseAxios.update(data);
-  if (res.errcode == '0') {
-    ElMessage({ message: '信息审核成功', type: 'success' });
-    toClose();
-  } else {
-    ElMessage({ message: `${res.errmsg}`, type: 'error' });
-  }
-};
-// 关闭弹框
-const toClose = () => {
-  form.value = {};
-  formFields.value = [{ label: '状态', model: 'status', type: 'select' }];
-  dialog.value = { show: false };
-  search({ skip, limit });
-};
-// 返回上一页
-const toBack = () => {
-  window.history.go(-1);
-};
-</script>
-<style scoped lang="scss">
-.main {
-  .two {
-    margin: 0 0 10px 0;
-  }
-}
-</style>

+ 0 - 92
src/views/match/detail.vue

@@ -1,92 +0,0 @@
-<template>
-  <div id="detail">
-    <el-row>
-      <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
-        <el-col :span="24" class="one">
-          <cSearch :is_title="false" :is_back="true" @toBack="toBack"></cSearch>
-        </el-col>
-        <el-col :span="24" class="two">
-          <cForm :span="24" :fields="fields" :form="form" :rules="rules" @save="toSave" label-width="auto">
-            <template #information>
-              <cEditor v-model="form.information" url="/files/ball/match/upload"></cEditor>
-            </template>
-            <template #status>
-              <el-option v-for="i in statusList" :key="i.value" :label="i.label" :value="i.value"></el-option>
-            </template>
-          </cForm>
-        </el-col>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script setup lang="ts">
-// 基础
-import type { Ref } from 'vue';
-import { ref, reactive, onMounted } from 'vue';
-import type { FormRules } from 'element-plus';
-import { ElMessage } from 'element-plus';
-import { useRoute } from 'vue-router';
-// 接口
-import { MatchStore } from '@/stores/match/match';
-import { DictDataStore } from '@/stores/dict/dictData'; // 字典表
-import type { IQueryResult } from '@/util/types.util';
-const matchAxios = MatchStore();
-const dictAxios = DictDataStore();
-const route = useRoute();
-// 加载中
-const loading: Ref<any> = ref(false);
-// 表单
-let form: Ref<any> = ref({});
-const rules = reactive<FormRules>({});
-let fields: Ref<any[]> = ref([
-  { label: '比赛名称', model: 'name' },
-  { label: '开始时间', model: 'start_time', type: 'datetime' },
-  { label: '结束时间', model: 'end_time', type: 'datetime' },
-  { label: '比赛地点', model: 'address' },
-  { label: '报名截止时间', model: 'sign_deadline', type: 'datetime' },
-  { label: '比赛信息', model: 'information', custom: true },
-  { label: '状态', model: 'status', type: 'select' }
-]);
-// 字典表
-const statusList: Ref<any> = ref([]);
-// 请求
-onMounted(async () => {
-  loading.value = true;
-  await searchOther();
-  await search();
-  loading.value = false;
-});
-const search = async () => {
-  let id = route.query.id;
-  if (id) {
-    let res: IQueryResult = await matchAxios.fetch(id);
-    if (res.errcode == '0') {
-      let info: any = res.data as {};
-      form.value = info;
-    }
-  }
-};
-// 保存
-const toSave = async (data) => {
-  let res: IQueryResult;
-  if (data._id) res = await matchAxios.update(data);
-  else res = await matchAxios.create(data);
-  if (res.errcode == 0) {
-    ElMessage({ type: `success`, message: `维护信息成功` });
-    toBack();
-  }
-};
-// 查询其他信息
-const searchOther = async () => {
-  let res: IQueryResult;
-  // 状态
-  res = await dictAxios.query({ type: 'match_status' });
-  if (res.errcode == '0') statusList.value = res.data;
-};
-// 返回上一页
-const toBack = () => {
-  window.history.go(-1);
-};
-</script>
-<style scoped lang="scss"></style>

+ 0 - 109
src/views/match/enroll/detail.vue

@@ -1,109 +0,0 @@
-<template>
-  <div id="detail">
-    <el-row>
-      <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
-        <el-col :span="24" class="one">
-          <cSearch :is_title="false" :is_back="true" @toBack="toBack"></cSearch>
-        </el-col>
-        <el-col :span="24" class="two">
-          <cForm :span="24" :fields="fields" :form="form" :rules="{}" :isSave="false" label-width="auto" :disabled="true">
-            <template #user_id>
-              <cTable :fields="memberfields" :opera="[]" :list="form.user_id" :usePage="false"> </cTable>
-            </template>
-          </cForm>
-        </el-col>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script setup lang="ts">
-// 基础
-import type { Ref } from 'vue';
-import { ref, onMounted } from 'vue';
-import { useRoute } from 'vue-router';
-// 接口
-import { UserStore } from '@/stores/users/user';
-import { ApplicationStore } from '@/stores/match/application';
-import { DictDataStore } from '@/stores/dict/dictData'; // 字典表
-import type { IQueryResult } from '@/util/types.util';
-const applicationAxios = ApplicationStore();
-const dictAxios = DictDataStore();
-const userAxios = UserStore();
-const route = useRoute();
-// 加载中
-const loading: Ref<any> = ref(false);
-// 表单
-let form: Ref<any> = ref({});
-let fields: Ref<any[]> = ref([
-  { label: '比赛名称', model: 'match_name' },
-  { label: '团队名称', model: 'team_name', isSearch: true },
-  { label: '参赛人数', model: 'num' },
-  { label: '报名时间', model: 'apply_time' },
-  { label: '分数', model: 'score' },
-  { label: '团队成员', model: 'user_id', custom: true }
-]);
-// 字典表
-const genderList: Ref<any> = ref([]);
-const userList: Ref<any> = ref([]);
-
-const memberfields: Ref<any> = ref([
-  { label: '姓名', model: 'name' },
-  { label: '性别', model: 'gender', format: (i: any) => getDict(i, 'gender') },
-  { label: '年龄', model: 'age' },
-  { label: '手机号', model: 'phone' }
-]);
-// 请求
-onMounted(async () => {
-  loading.value = true;
-  await searchOther();
-  await search();
-  loading.value = false;
-});
-const search = async () => {
-  let id = route.query.id;
-  if (id) {
-    let res: IQueryResult = await applicationAxios.fetch(id);
-    if (res.errcode == '0') {
-      let info: any = res.data as {};
-      let memberList = [];
-      for (const val of info.user_id) {
-        for (const as of userList.value) {
-          if (val == as._id)
-            memberList.push({
-              _id: val,
-              name: as.name || '暂无',
-              age: as.age || '暂无',
-              phone: as.phone || '暂无',
-              gender: as.gender || '暂无'
-            });
-        }
-      }
-      info.user_id = memberList;
-      form.value = info;
-    }
-  }
-};
-const getDict = (e, model) => {
-  if (model == 'gender') {
-    let data: any = genderList.value.find((i: any) => i.value == e);
-    if (data) return data.label;
-    else return '暂无';
-  }
-};
-// 查询其他信息
-const searchOther = async () => {
-  let res: IQueryResult;
-  // 性别
-  res = await dictAxios.query({ type: 'gender' });
-  if (res.errcode == '0') genderList.value = res.data;
-  // 管理员
-  res = await userAxios.query({ status: '1' });
-  if (res.errcode == '0') userList.value = res.data;
-};
-// 返回上一页
-const toBack = () => {
-  window.history.go(-1);
-};
-</script>
-<style scoped lang="scss"></style>

+ 0 - 131
src/views/match/enroll/index.vue

@@ -1,131 +0,0 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
-        <el-col :span="24" class="one">
-          <cSearch :is_title="false" :is_back="true" @toBack="toBack"></cSearch>
-        </el-col>
-        <el-col :span="24" class="two">
-          <cTable :fields="fields" :opera="opera" :list="list" @query="search" :total="total" @exam="toExam" @view="toView"> </cTable>
-        </el-col>
-      </el-col>
-    </el-row>
-    <cDialog :dialog="dialog" @toClose="toClose">
-      <template v-slot:info>
-        <el-col :span="24" class="dialog_one" v-if="dialog.type == '1'">
-          <cForm :span="24" :fields="formFields" :form="form" :rules="{}" @save="toSave" label-width="auto">
-            <template #status>
-              <el-option v-for="i in statusList" :key="i.value" :label="i.label" :value="i.value"></el-option>
-            </template>
-          </cForm>
-        </el-col>
-      </template>
-    </cDialog>
-  </div>
-</template>
-
-<script setup lang="ts">
-// 基础
-import type { Ref } from 'vue';
-import { onMounted, ref, getCurrentInstance } from 'vue';
-import { ElMessage } from 'element-plus';
-import { useRouter, useRoute } from 'vue-router';
-// 接口
-import { ApplicationStore } from '@/stores/match/application';
-import { DictDataStore } from '@/stores/dict/dictData'; // 字典表
-import type { IQueryResult } from '@/util/types.util';
-const applicationAxios = ApplicationStore();
-const dictAxios = DictDataStore();
-const route = useRoute();
-// 路由
-const router = useRouter();
-const { proxy } = getCurrentInstance() as any;
-// 加载中
-const loading: Ref<any> = ref(false);
-let id: Ref<any> = ref(route.query.id);
-let list: Ref<any> = ref([]);
-let total: Ref<number> = ref(0);
-let skip = 0;
-let limit: number = proxy.$limit;
-let fields: Ref<any[]> = ref([
-  { label: '团队名称', model: 'team_name', isSearch: true },
-  { label: '参赛人数', model: 'num' },
-  { label: '报名时间', model: 'apply_time' },
-  { label: '分数', model: 'score' },
-  { label: '状态', model: 'status', format: (i: any) => getDict(i, 'status') }
-]);
-// 操作
-let opera: Ref<any[]> = ref([
-  { label: '审核', method: 'exam', type: 'warning', display: (i) => i.status == '0' },
-  { label: '查看', method: 'view' }
-]);
-// 字典表
-const statusList: Ref<any> = ref([]);
-// 弹框
-const dialog: Ref<any> = ref({ title: '审核管理', show: false, type: '1' });
-const form: Ref<any> = ref({ file: [] });
-const formFields: Ref<any> = ref([{ label: '状态', model: 'status', type: 'select' }]);
-// 请求
-onMounted(async () => {
-  loading.value = true;
-  id.value = route.query.id;
-  await searchOther();
-  await search({ skip, limit });
-  loading.value = false;
-});
-const search = async (e: { skip: number; limit: number }) => {
-  const info = { skip: e.skip, limit: e.limit, match_id: id.value };
-  const res: IQueryResult = await applicationAxios.query(info);
-  if (res.errcode == '0') {
-    list.value = res.data;
-    total.value = res.total;
-  }
-};
-const getDict = (e, model) => {
-  if (model == 'status') {
-    let data: any = statusList.value.find((i: any) => i.value == e);
-    if (data) return data.label;
-    else return '暂无';
-  }
-};
-// 保存
-const toSave = async (data) => {
-  let res: IQueryResult;
-  if (data._id) res = await applicationAxios.update(data);
-  else res = await applicationAxios.create(data);
-  if (res.errcode == 0) {
-    ElMessage({ type: `success`, message: `维护信息成功` });
-    toClose();
-  }
-};
-// 审核
-const toExam = async (data) => {
-  let res: IQueryResult = await applicationAxios.fetch(data._id);
-  if (res.errcode == '0') {
-    form.value = res.data;
-    dialog.value = { title: '审核管理', show: true, type: '1' };
-  }
-};
-// 查看
-const toView = (data) => {
-  router.push({ path: '/match/enroll/detail', query: { id: data._id } });
-};
-// 关闭弹框
-const toClose = () => {
-  form.value = {};
-  dialog.value = { show: false };
-  search({ skip, limit });
-};
-// 查询其他信息
-const searchOther = async () => {
-  let res: IQueryResult;
-  // 状态
-  res = await dictAxios.query({ type: 'status' });
-  if (res.errcode == '0') statusList.value = res.data;
-};
-// 返回上一页
-const toBack = () => {
-  window.history.go(-1);
-};
-</script>
-<style scoped lang="scss"></style>

+ 0 - 144
src/views/match/index.vue

@@ -1,144 +0,0 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
-        <el-col :span="24" class="one">
-          <cSearch :is_title="false" :is_search="true" :fields="fields" @search="toSearch">
-            <template #status>
-              <el-option v-for="(i, index) in statusList" :key="index" :label="i.label" :value="i.value"></el-option>
-            </template>
-          </cSearch>
-        </el-col>
-        <el-col :span="24" class="two">
-          <cButton @toAdd="toAdd()"> </cButton>
-        </el-col>
-        <el-col :span="24" class="thr">
-          <cTable
-            :fields="fields"
-            :opera="opera"
-            :list="list"
-            @query="search"
-            :total="total"
-            @edit="toEdit"
-            @del="toDel"
-            @enroll="toEnroll"
-            @course="toCourse"
-            @rank="toRank"
-          >
-          </cTable>
-        </el-col>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script setup lang="ts">
-// 基础
-import type { Ref } from 'vue';
-import { onMounted, ref, getCurrentInstance } from 'vue';
-import { ElMessage } from 'element-plus';
-import { useRouter } from 'vue-router';
-// 接口
-import { MatchStore } from '@/stores/match/match';
-import { DictDataStore } from '@/stores/dict/dictData'; // 字典表
-import type { IQueryResult } from '@/util/types.util';
-const matchAxios = MatchStore();
-const dictAxios = DictDataStore();
-const { proxy } = getCurrentInstance() as any;
-// 路由
-const router = useRouter();
-// 加载中
-const loading: Ref<any> = ref(false);
-let list: Ref<any> = ref([]);
-let total: Ref<number> = ref(0);
-let skip = 0;
-let limit: number = proxy.$limit;
-let fields: Ref<any[]> = ref([
-  { label: '比赛名称', model: 'name', isSearch: true },
-  { label: '开始时间', model: 'start_time' },
-  { label: '结束时间', model: 'end_time' },
-  { label: '比赛地点', model: 'address' },
-  { label: '报名截止时间', model: 'sign_deadline' },
-  { label: '状态', model: 'status', type: 'select', isSearch: true, format: (i: any) => getDict(i, 'status') }
-]);
-// 操作
-let opera: Ref<any[]> = ref([
-  { label: '修改', method: 'edit' },
-  { label: '团队报名', method: 'enroll', display: (i) => i.status == '0' },
-  { label: '赛程安排', method: 'course', display: (i) => i.status == '1' || i.status == '2' || i.status == '-1' },
-  { label: '排名', method: 'rank', display: (i) => i.status == '-1' },
-  { label: '删除', method: 'del', confirm: true, type: 'danger' }
-]);
-// 查询数据
-let searchForm: Ref<any> = ref({});
-// 字典表
-const statusList: Ref<any> = ref([]);
-// 请求
-onMounted(async () => {
-  loading.value = true;
-  await searchOther();
-  await search({ skip, limit });
-  loading.value = false;
-});
-const search = async (e: { skip: number; limit: number }) => {
-  const info = { skip: e.skip, limit: e.limit, ...searchForm.value };
-  const res: IQueryResult = await matchAxios.query(info);
-  if (res.errcode == '0') {
-    list.value = res.data;
-    total.value = res.total;
-  }
-};
-const toSearch = (query) => {
-  searchForm.value = query;
-  search({ skip, limit });
-};
-const getDict = (e, model) => {
-  if (model == 'status') {
-    let data: any = statusList.value.find((i: any) => i.value == e);
-    if (data) return data.label;
-    else return '暂无';
-  }
-};
-// 添加
-const toAdd = () => {
-  router.push({ path: '/match/detail' });
-};
-// 查看
-const toEdit = (data) => {
-  router.push({ path: '/match/detail', query: { id: data._id } });
-};
-// 删除
-const toDel = async (data: any) => {
-  let res: IQueryResult = await matchAxios.del(data._id);
-  if (res.errcode == 0) {
-    ElMessage({ type: `success`, message: `刪除信息成功` });
-    search({ skip, limit });
-  }
-};
-// 报名情况
-const toEnroll = async (data: any) => {
-  router.push({ path: '/match/enroll', query: { id: data._id } });
-};
-// 赛程
-const toCourse = async (data: any) => {
-  router.push({ path: '/match/course', query: { id: data._id } });
-};
-// 排名
-const toRank = async (data: any) => {
-  router.push({ path: '/match/ranking', query: { id: data._id } });
-};
-// 查询其他信息
-const searchOther = async () => {
-  let res: IQueryResult;
-  // 状态
-  res = await dictAxios.query({ type: 'match_status' });
-  if (res.errcode == '0') statusList.value = res.data;
-};
-</script>
-<style scoped lang="scss">
-.main {
-  .two {
-    margin: 0 0 10px 0;
-  }
-}
-</style>

+ 0 - 49
src/views/match/ranking/index.vue

@@ -1,49 +0,0 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
-        <el-col :span="24" class="one">
-          <cSearch :is_title="false" :is_back="true" @toBack="toBack"></cSearch>
-        </el-col>
-        <el-col :span="24" class="two">
-          <cTable :fields="fields" :opera="[]" :list="list" :usePage="false"> </cTable>
-        </el-col>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script setup lang="ts">
-// 基础
-import type { Ref } from 'vue';
-import { ref, onMounted } from 'vue';
-import { useRoute } from 'vue-router';
-// 接口
-import { CourseStore } from '@/stores/match/course';
-const courseAxios = CourseStore();
-const route = useRoute();
-// 加载中
-const loading: Ref<any> = ref(false);
-// 表单
-let list: Ref<any> = ref([]);
-let id: Ref<any> = ref(route.query.id);
-let fields: Ref<any[]> = ref([
-  { label: '团队名称', model: 'name' },
-  { label: '分数', model: 'score' }
-]);
-// 请求
-onMounted(async () => {
-  loading.value = true;
-  await search();
-  loading.value = false;
-});
-const search = async () => {
-  let res: any = await courseAxios.ranking({ match_id: id.value });
-  if (res.errcode == '0') list.value = res.data.scoreList;
-};
-// 返回上一页
-const toBack = () => {
-  window.history.go(-1);
-};
-</script>
-<style scoped lang="scss"></style>

+ 0 - 0
src/views/order/detail.vue


+ 38 - 0
src/views/order/index.vue

@@ -0,0 +1,38 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
+        <el-col :span="24" class="one">系统首页</el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script setup lang="ts">
+// 基础
+import type { Ref } from 'vue';
+// reactive,
+import { onMounted, ref, getCurrentInstance } from 'vue';
+// 接口
+//import { TestStore } from '@common/src/stores/test';
+//import type { IQueryResult } from '@/util/types.util';
+//const testAxios = TestStore();
+const { proxy } = getCurrentInstance() as any;
+// 加载中
+const loading: Ref<any> = ref(false);
+// 分页数据
+//  const skip = 0;
+//  const limit = proxy.limit;;
+// 请求
+onMounted(async () => {
+  loading.value = true;
+  //  await search({ skip, limit });
+  loading.value = false;
+});
+//const search = async (e: { skip: number; limit: number }) => {
+//  const info = { skip: e.skip, limit: e.limit, ...searchInfo.value  };
+//  const res: IQueryResult = await testAxios.query(info);
+//  console.log(res);
+//};
+</script>
+<style scoped lang="scss"></style>

+ 38 - 0
src/views/system/buy/index.vue

@@ -0,0 +1,38 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
+        <el-col :span="24" class="one">系统首页</el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script setup lang="ts">
+// 基础
+import type { Ref } from 'vue';
+// reactive,
+import { onMounted, ref, getCurrentInstance } from 'vue';
+// 接口
+//import { TestStore } from '@common/src/stores/test';
+//import type { IQueryResult } from '@/util/types.util';
+//const testAxios = TestStore();
+const { proxy } = getCurrentInstance() as any;
+// 加载中
+const loading: Ref<any> = ref(false);
+// 分页数据
+//  const skip = 0;
+//  const limit = proxy.limit;;
+// 请求
+onMounted(async () => {
+  loading.value = true;
+  //  await search({ skip, limit });
+  loading.value = false;
+});
+//const search = async (e: { skip: number; limit: number }) => {
+//  const info = { skip: e.skip, limit: e.limit, ...searchInfo.value  };
+//  const res: IQueryResult = await testAxios.query(info);
+//  console.log(res);
+//};
+</script>
+<style scoped lang="scss"></style>

+ 38 - 0
src/views/system/module/index.vue

@@ -0,0 +1,38 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
+        <el-col :span="24" class="one">系统首页</el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script setup lang="ts">
+// 基础
+import type { Ref } from 'vue';
+// reactive,
+import { onMounted, ref, getCurrentInstance } from 'vue';
+// 接口
+//import { TestStore } from '@common/src/stores/test';
+//import type { IQueryResult } from '@/util/types.util';
+//const testAxios = TestStore();
+const { proxy } = getCurrentInstance() as any;
+// 加载中
+const loading: Ref<any> = ref(false);
+// 分页数据
+//  const skip = 0;
+//  const limit = proxy.limit;;
+// 请求
+onMounted(async () => {
+  loading.value = true;
+  //  await search({ skip, limit });
+  loading.value = false;
+});
+//const search = async (e: { skip: number; limit: number }) => {
+//  const info = { skip: e.skip, limit: e.limit, ...searchInfo.value  };
+//  const res: IQueryResult = await testAxios.query(info);
+//  console.log(res);
+//};
+</script>
+<style scoped lang="scss"></style>

+ 38 - 0
src/views/system/money/index.vue

@@ -0,0 +1,38 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
+        <el-col :span="24" class="one">系统首页</el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script setup lang="ts">
+// 基础
+import type { Ref } from 'vue';
+// reactive,
+import { onMounted, ref, getCurrentInstance } from 'vue';
+// 接口
+//import { TestStore } from '@common/src/stores/test';
+//import type { IQueryResult } from '@/util/types.util';
+//const testAxios = TestStore();
+const { proxy } = getCurrentInstance() as any;
+// 加载中
+const loading: Ref<any> = ref(false);
+// 分页数据
+//  const skip = 0;
+//  const limit = proxy.limit;;
+// 请求
+onMounted(async () => {
+  loading.value = true;
+  //  await search({ skip, limit });
+  loading.value = false;
+});
+//const search = async (e: { skip: number; limit: number }) => {
+//  const info = { skip: e.skip, limit: e.limit, ...searchInfo.value  };
+//  const res: IQueryResult = await testAxios.query(info);
+//  console.log(res);
+//};
+</script>
+<style scoped lang="scss"></style>

+ 38 - 0
src/views/system/role/index.vue

@@ -0,0 +1,38 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
+        <el-col :span="24" class="one">系统首页</el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script setup lang="ts">
+// 基础
+import type { Ref } from 'vue';
+// reactive,
+import { onMounted, ref, getCurrentInstance } from 'vue';
+// 接口
+//import { TestStore } from '@common/src/stores/test';
+//import type { IQueryResult } from '@/util/types.util';
+//const testAxios = TestStore();
+const { proxy } = getCurrentInstance() as any;
+// 加载中
+const loading: Ref<any> = ref(false);
+// 分页数据
+//  const skip = 0;
+//  const limit = proxy.limit;;
+// 请求
+onMounted(async () => {
+  loading.value = true;
+  //  await search({ skip, limit });
+  loading.value = false;
+});
+//const search = async (e: { skip: number; limit: number }) => {
+//  const info = { skip: e.skip, limit: e.limit, ...searchInfo.value  };
+//  const res: IQueryResult = await testAxios.query(info);
+//  console.log(res);
+//};
+</script>
+<style scoped lang="scss"></style>

+ 0 - 128
src/views/team/examine/detail.vue

@@ -1,128 +0,0 @@
-<template>
-  <div id="detail">
-    <el-row>
-      <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
-        <el-col :span="24" class="one">
-          <cSearch :is_title="false" :is_back="true" @toBack="toBack"></cSearch>
-        </el-col>
-        <el-col :span="24" class="two">
-          <cForm :span="24" :fields="fields" :form="form" :rules="{}" :isSave="false" label-width="auto" :disabled="true">
-            <template #administrator>
-              <el-option v-for="i in userList" :key="i._id" :label="i.name" :value="i._id"></el-option>
-            </template>
-            <template #logo>
-              <el-image class="image" v-for="i in form.logo" :key="i.uri" :src="i.url" @click="imgView(i.url)"></el-image>
-            </template>
-            <template #member>
-              <cTable :fields="memberfields" :opera="[]" :list="form.member" :usePage="false"> </cTable>
-            </template>
-          </cForm>
-        </el-col>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script setup lang="ts">
-// 基础
-import type { Ref } from 'vue';
-import { ref, onMounted } from 'vue';
-import { useRoute } from 'vue-router';
-// 接口
-import { TeamStore } from '@/stores/team/team';
-import { UserStore } from '@/stores/users/user';
-import { DictDataStore } from '@/stores/dict/dictData'; // 字典表
-import type { IQueryResult } from '@/util/types.util';
-const teamAxios = TeamStore();
-const userAxios = UserStore();
-const dictAxios = DictDataStore();
-const route = useRoute();
-// 加载中
-const loading: Ref<any> = ref(false);
-// 表单
-let form: Ref<any> = ref({});
-let fields: Ref<any[]> = ref([
-  { label: '所属管理员', model: 'administrator', type: 'select' },
-  { label: '团队名称', model: 'name' },
-  { label: '成立时间', model: 'create_time', type: 'date' },
-  { label: '单位地址', model: 'address' },
-  { label: '手机号', model: 'phone' },
-  { label: '团队人数', model: 'number' },
-  { label: '团队成员', model: 'member', custom: true },
-  { label: '团队logo', model: 'logo', custom: true }
-]);
-// 字典表
-const userList: Ref<any> = ref([]);
-const genderList: Ref<any> = ref([]);
-
-const memberfields: Ref<any> = ref([
-  { label: '姓名', model: 'name' },
-  { label: '性别', model: 'gender', format: (i: any) => getDict(i, 'gender') },
-  { label: '年龄', model: 'age' },
-  { label: '手机号', model: 'phone' }
-]);
-// 请求
-onMounted(async () => {
-  loading.value = true;
-  await searchOther();
-  await search();
-  loading.value = false;
-});
-const search = async () => {
-  let id = route.query.id;
-  if (id) {
-    let res: IQueryResult = await teamAxios.fetch(id);
-    if (res.errcode == '0') {
-      let info: any = res.data as {};
-      let memberList = [];
-      for (const val of info.member) {
-        for (const as of userList.value) {
-          if (val == as._id)
-            memberList.push({
-              _id: val,
-              name: as.name || '暂无',
-              age: as.age || '暂无',
-              phone: as.phone || '暂无',
-              gender: as.gender || '暂无'
-            });
-        }
-      }
-      info.member = memberList;
-      form.value = info;
-    }
-  }
-};
-const getDict = (e, model) => {
-  if (model == 'gender') {
-    let data: any = genderList.value.find((i: any) => i.value == e);
-    if (data) return data.label;
-    else return '暂无';
-  }
-};
-// 查询其他信息
-const searchOther = async () => {
-  let res: IQueryResult;
-  // 管理员
-  res = await userAxios.query({ status: '1' });
-  if (res.errcode == '0') userList.value = res.data;
-  // 性别
-  res = await dictAxios.query({ type: 'gender' });
-  if (res.errcode == '0') genderList.value = res.data;
-};
-// 图片预览
-const imgView = (url: any) => {
-  window.open(url);
-};
-// 返回上一页
-const toBack = () => {
-  window.history.go(-1);
-};
-</script>
-<style scoped lang="scss">
-.image {
-  width: 120px;
-  height: 120px;
-  overflow: hidden;
-  border-radius: 5px;
-}
-</style>

+ 0 - 128
src/views/team/team/detail.vue

@@ -1,128 +0,0 @@
-<template>
-  <div id="detail">
-    <el-row>
-      <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
-        <el-col :span="24" class="one">
-          <cSearch :is_title="false" :is_back="true" @toBack="toBack"></cSearch>
-        </el-col>
-        <el-col :span="24" class="two">
-          <cForm :span="24" :fields="fields" :form="form" :rules="{}" :isSave="false" label-width="auto" :disabled="true">
-            <template #administrator>
-              <el-option v-for="i in userList" :key="i._id" :label="i.name" :value="i._id"></el-option>
-            </template>
-            <template #logo>
-              <el-image class="image" v-for="i in form.logo" :key="i.uri" :src="i.url" @click="imgView(i.url)"></el-image>
-            </template>
-            <template #member>
-              <cTable :fields="memberfields" :opera="[]" :list="form.member" :usePage="false"> </cTable>
-            </template>
-          </cForm>
-        </el-col>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script setup lang="ts">
-// 基础
-import type { Ref } from 'vue';
-import { ref, onMounted } from 'vue';
-import { useRoute } from 'vue-router';
-// 接口
-import { TeamStore } from '@/stores/team/team';
-import { UserStore } from '@/stores/users/user';
-import { DictDataStore } from '@/stores/dict/dictData'; // 字典表
-import type { IQueryResult } from '@/util/types.util';
-const teamAxios = TeamStore();
-const userAxios = UserStore();
-const dictAxios = DictDataStore();
-const route = useRoute();
-// 加载中
-const loading: Ref<any> = ref(false);
-// 表单
-let form: Ref<any> = ref({});
-let fields: Ref<any[]> = ref([
-  { label: '所属管理员', model: 'administrator', type: 'select' },
-  { label: '团队名称', model: 'name' },
-  { label: '成立时间', model: 'create_time', type: 'date' },
-  { label: '单位地址', model: 'address' },
-  { label: '手机号', model: 'phone' },
-  { label: '团队人数', model: 'number' },
-  { label: '团队成员', model: 'member', custom: true },
-  { label: '团队logo', model: 'logo', custom: true }
-]);
-// 字典表
-const userList: Ref<any> = ref([]);
-const genderList: Ref<any> = ref([]);
-
-const memberfields: Ref<any> = ref([
-  { label: '姓名', model: 'name' },
-  { label: '性别', model: 'gender', format: (i: any) => getDict(i, 'gender') },
-  { label: '年龄', model: 'age' },
-  { label: '手机号', model: 'phone' }
-]);
-// 请求
-onMounted(async () => {
-  loading.value = true;
-  await searchOther();
-  await search();
-  loading.value = false;
-});
-const search = async () => {
-  let id = route.query.id;
-  if (id) {
-    let res: IQueryResult = await teamAxios.fetch(id);
-    if (res.errcode == '0') {
-      let info: any = res.data as {};
-      let memberList = [];
-      for (const val of info.member) {
-        for (const as of userList.value) {
-          if (val == as._id)
-            memberList.push({
-              _id: val,
-              name: as.name || '暂无',
-              age: as.age || '暂无',
-              phone: as.phone || '暂无',
-              gender: as.gender || '暂无'
-            });
-        }
-      }
-      info.member = memberList;
-      form.value = info;
-    }
-  }
-};
-const getDict = (e, model) => {
-  if (model == 'gender') {
-    let data: any = genderList.value.find((i: any) => i.value == e);
-    if (data) return data.label;
-    else return '暂无';
-  }
-};
-// 查询其他信息
-const searchOther = async () => {
-  let res: IQueryResult;
-  // 管理员
-  res = await userAxios.query({ status: '1' });
-  if (res.errcode == '0') userList.value = res.data;
-  // 性别
-  res = await dictAxios.query({ type: 'gender' });
-  if (res.errcode == '0') genderList.value = res.data;
-};
-// 图片预览
-const imgView = (url: any) => {
-  window.open(url);
-};
-// 返回上一页
-const toBack = () => {
-  window.history.go(-1);
-};
-</script>
-<style scoped lang="scss">
-.image {
-  width: 120px;
-  height: 120px;
-  overflow: hidden;
-  border-radius: 5px;
-}
-</style>

+ 0 - 121
src/views/team/team/index.vue

@@ -1,121 +0,0 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
-        <el-col :span="24" class="one">
-          <cSearch :is_title="false" :is_search="true" :fields="fields" @search="toSearch"> </cSearch>
-        </el-col>
-        <el-col :span="24" class="two">
-          <cTable :fields="fields" :opera="opera" :list="list" @query="search" :total="total" @view="toView"> </cTable>
-        </el-col>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script setup lang="ts">
-// 基础
-import type { Ref } from 'vue';
-import { onMounted, ref, getCurrentInstance } from 'vue';
-import { useRouter } from 'vue-router';
-// 接口
-import { TeamStore } from '@/stores/team/team';
-import { UserStore } from '@/stores/users/user';
-import { DictDataStore } from '@/stores/dict/dictData'; // 字典表
-import type { IQueryResult } from '@/util/types.util';
-const teamAxios = TeamStore();
-const userAxios = UserStore();
-const dictAxios = DictDataStore();
-const { proxy } = getCurrentInstance() as any;
-// 路由
-const router = useRouter();
-// 加载中
-const loading: Ref<any> = ref(false);
-let list: Ref<any> = ref([]);
-let total: Ref<number> = ref(0);
-let skip = 0;
-let limit: number = proxy.$limit;
-let fields: Ref<any[]> = ref([
-  { label: '所属管理员', model: 'administrator', format: (i: any) => getDict(i, 'administrator') },
-  { label: '团队名称', model: 'name', isSearch: true },
-  { label: '单位地址', model: 'address' },
-  { label: '手机号', model: 'phone', isSearch: true },
-  { label: '团队人数', model: 'number' },
-  { label: '成立时间', model: 'create_time' },
-  { label: '状态', model: 'status', format: (i: any) => getDict(i, 'status') }
-]);
-// 操作
-let opera: Ref<any[]> = ref([{ label: '查看', method: 'view', tpye: 'Info' }]);
-// 查询数据
-let searchForm: Ref<any> = ref({});
-// 字典表
-const genderList: Ref<any> = ref([]);
-const typeList: Ref<any> = ref([]);
-const statusList: Ref<any> = ref([]);
-const userList: Ref<any> = ref([]);
-// 请求
-onMounted(async () => {
-  loading.value = true;
-  await searchOther();
-  await search({ skip, limit });
-  loading.value = false;
-});
-const search = async (e: { skip: number; limit: number }) => {
-  const info = { skip: e.skip, limit: e.limit, ...searchForm.value, status: '1' };
-  const res: IQueryResult = await teamAxios.query(info);
-  if (res.errcode == '0') {
-    list.value = res.data;
-    total.value = res.total;
-  }
-};
-const toSearch = (query) => {
-  searchForm.value = query;
-  search({ skip, limit });
-};
-const getDict = (e, model) => {
-  if (model == 'administrator') {
-    let data: any = userList.value.find((i: any) => i._id == e);
-    if (data) return data.name;
-    else return '暂无';
-  } else if (model == 'status') {
-    let data: any = statusList.value.find((i: any) => i.value == e);
-    if (data) return data.label;
-    else return '暂无';
-  }
-};
-// 查看
-const toView = (data) => {
-  router.push({ path: '/team/team/detail', query: { id: data._id } });
-};
-
-// 查询其他信息
-const searchOther = async () => {
-  let res: IQueryResult;
-  // 性别
-  res = await dictAxios.query({ type: 'gender' });
-  if (res.errcode == '0') genderList.value = res.data;
-  // 类别
-  res = await dictAxios.query({ type: 'type' });
-  if (res.errcode == '0') typeList.value = res.data;
-  // 状态
-  res = await dictAxios.query({ type: 'status' });
-  if (res.errcode == '0') statusList.value = res.data;
-  // 管理员
-  res = await userAxios.query({ status: '1' });
-  if (res.errcode == '0') userList.value = res.data;
-};
-</script>
-<style scoped lang="scss">
-.main {
-  .two {
-    margin: 0 0 10px 0;
-  }
-}
-.dialog_one {
-  .image {
-    width: 120px;
-    height: 120px;
-    border-radius: 5px;
-  }
-}
-</style>

src/views/users/match/detail.vue → src/views/users/admin/detail.vue


src/views/users/match/index.vue → src/views/users/admin/index.vue


+ 154 - 0
src/views/users/firm/detail.vue

@@ -0,0 +1,154 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
+        <el-col :span="24" class="one">
+          <cSearch :is_back="true" @toBack="toBack"></cSearch>
+        </el-col>
+        <el-col :span="24" class="two">
+          <cForm :span="24" :fields="fields" :form="form" :rules="rules" @save="toSave" label-width="auto">
+            <template #gender>
+              <el-option v-for="i in genderList" :key="i.value" :label="i.label" :value="i.value"></el-option>
+            </template>
+            <template #type>
+              <el-option v-for="i in typeList" :key="i.value" :label="i.label" :value="i.value"></el-option>
+            </template>
+            <template #icon>
+              <cUpload :model="`${'icon'}`" listType="picture-card" :limit="1" url="/files/ball/match/upload" :list="form.icon" @change="onUpload"></cUpload>
+            </template>
+          </cForm>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script setup lang="ts">
+// 基础
+import type { Ref } from 'vue';
+import { ref, reactive, onMounted } from 'vue';
+import { ElMessage } from 'element-plus';
+import type { FormRules } from 'element-plus';
+import { useRoute } from 'vue-router';
+// 接口
+import { UserStore } from '@/stores/users/user';
+import { DictDataStore } from '@/stores/dict/dictData'; // 字典表
+import type { IQueryResult } from '@/util/types.util';
+const userAxios = UserStore();
+const dictAxios = DictDataStore();
+// 路由
+const route = useRoute();
+// 加载中
+const loading: Ref<any> = ref(false);
+// 表单
+let form: Ref<any> = ref({});
+let fields: Ref<any[]> = ref([
+  { label: '微信用户标识', model: 'openid', options: { disabled: true } },
+  { label: '账号', model: 'account', options: { disabled: true } },
+  { label: '名称', model: 'name' },
+  { label: '手机号', model: 'phone' },
+  { label: '电子邮箱', model: 'email' },
+  { label: '性别', model: 'gender', type: 'select' },
+  { label: '年龄', model: 'age' },
+  { label: '工作单位', model: 'work' },
+  { label: '头像', model: 'icon', custom: true }
+]);
+const rules = reactive<FormRules>({});
+// 字典表
+const genderList: Ref<any> = ref([]);
+const typeList: Ref<any> = ref([]);
+// 请求
+onMounted(async () => {
+  loading.value = true;
+  await searchOther();
+  await search();
+  loading.value = false;
+});
+const search = async () => {
+  let id = route.query.id;
+  if (id) {
+    let res: IQueryResult = await userAxios.fetch(id);
+    if (res.errcode == '0') {
+      let info: any = res.data as {};
+      form.value = info;
+    }
+  }
+};
+const onUpload = (e: { model: string; value: Array<[]> }) => {
+  const { model, value } = e;
+  form.value[model] = value;
+};
+// 保存
+const toSave = async (data) => {
+  let res: IQueryResult;
+  if (data._id) res = await userAxios.update(data);
+  else res = await userAxios.create(data);
+  if (res.errcode == 0) {
+    ElMessage({ type: `success`, message: `维护信息成功` });
+    toBack();
+  }
+};
+// 查询其他信息
+const searchOther = async () => {
+  let res: IQueryResult;
+  // 性别
+  res = await dictAxios.query({ type: 'gender' });
+  if (res.errcode == '0') genderList.value = res.data;
+  // 类别
+  res = await dictAxios.query({ type: 'type' });
+  if (res.errcode == '0') typeList.value = res.data;
+};
+// 返回上一页
+const toBack = () => {
+  window.history.go(-1);
+};
+</script>
+<style scoped lang="scss">
+.study {
+  width: 100%;
+  .study_1 {
+    margin: 0 0 10px 0;
+    span {
+      font-size: 16px;
+    }
+    span:first-child {
+      color: #ff0000;
+    }
+  }
+  .study_2 {
+    .study_2_info {
+      width: 100%;
+      display: flex;
+      .info_1 {
+        position: relative;
+        max-width: 24%;
+        border: 1px solid #67c23a;
+        padding: 0 10px;
+        border-radius: 5px;
+        margin: 0 10px 0 0;
+        .txt {
+          position: absolute;
+          top: -15px;
+          left: 10px;
+          span {
+            display: inline-block;
+            padding: 6px 15px;
+            background: #67c23a;
+            color: #fff;
+            border-radius: 5px;
+            font-size: 16px;
+            font-weight: bold;
+            line-height: 1;
+          }
+        }
+        .info {
+          margin: 15px 0 0 0;
+          .label {
+            margin: 0 0 10px 0;
+          }
+        }
+      }
+    }
+  }
+}
+</style>

+ 31 - 25
src/views/team/examine/index.vue

@@ -6,7 +6,7 @@
           <cSearch :is_title="false" :is_search="true" :fields="fields" @search="toSearch"> </cSearch>
           <cSearch :is_title="false" :is_search="true" :fields="fields" @search="toSearch"> </cSearch>
         </el-col>
         </el-col>
         <el-col :span="24" class="two">
         <el-col :span="24" class="two">
-          <cTable :fields="fields" :opera="opera" :list="list" @query="search" :total="total" @view="toView" @exam="toExam"> </cTable>
+          <cTable :fields="fields" :opera="opera" :list="list" @query="search" :total="total" @exam="toExam" @edit="toEdit" @del="toDel"> </cTable>
         </el-col>
         </el-col>
       </el-col>
       </el-col>
     </el-row>
     </el-row>
@@ -31,11 +31,9 @@ import { onMounted, ref, getCurrentInstance } from 'vue';
 import { ElMessage } from 'element-plus';
 import { ElMessage } from 'element-plus';
 import { useRouter } from 'vue-router';
 import { useRouter } from 'vue-router';
 // 接口
 // 接口
-import { TeamStore } from '@/stores/team/team';
 import { UserStore } from '@/stores/users/user';
 import { UserStore } from '@/stores/users/user';
 import { DictDataStore } from '@/stores/dict/dictData'; // 字典表
 import { DictDataStore } from '@/stores/dict/dictData'; // 字典表
 import type { IQueryResult } from '@/util/types.util';
 import type { IQueryResult } from '@/util/types.util';
-const teamAxios = TeamStore();
 const userAxios = UserStore();
 const userAxios = UserStore();
 const dictAxios = DictDataStore();
 const dictAxios = DictDataStore();
 const { proxy } = getCurrentInstance() as any;
 const { proxy } = getCurrentInstance() as any;
@@ -48,18 +46,21 @@ let total: Ref<number> = ref(0);
 let skip = 0;
 let skip = 0;
 let limit: number = proxy.$limit;
 let limit: number = proxy.$limit;
 let fields: Ref<any[]> = ref([
 let fields: Ref<any[]> = ref([
-  { label: '所属管理员', model: 'administrator', format: (i: any) => getDict(i, 'administrator') },
-  { label: '团队名称', model: 'name', isSearch: true },
-  { label: '单位地址', model: 'address' },
+  { label: '微信用户标识', model: 'openid' },
+  { label: '用户账号', model: 'account', isSearch: true },
+  { label: '姓名', model: 'name', isSearch: true },
+  { label: '性别', model: 'gender', format: (i: any) => getDict(i, 'gender') },
+  { label: '年龄', model: 'age' },
   { label: '手机号', model: 'phone', isSearch: true },
   { label: '手机号', model: 'phone', isSearch: true },
-  { label: '团队人数', model: 'number' },
-  { label: '成立时间', model: 'create_time' },
+  { label: '电子邮箱', model: 'email' },
+  { label: '工作单位', model: 'work' },
   { label: '状态', model: 'status', format: (i: any) => getDict(i, 'status') }
   { label: '状态', model: 'status', format: (i: any) => getDict(i, 'status') }
 ]);
 ]);
 // 操作
 // 操作
 let opera: Ref<any[]> = ref([
 let opera: Ref<any[]> = ref([
-  { label: '查看', method: 'view', tpye: 'Info' },
-  { label: '审核', method: 'exam', type: 'warning', display: (i) => i.status == '0' }
+  { label: '审核', method: 'exam', type: 'warning', display: (i) => i.status == '0' },
+  { label: '修改', method: 'edit' },
+  { label: '删除', method: 'del', confirm: true, type: 'danger' }
 ]);
 ]);
 // 查询数据
 // 查询数据
 let searchForm: Ref<any> = ref({});
 let searchForm: Ref<any> = ref({});
@@ -67,7 +68,6 @@ let searchForm: Ref<any> = ref({});
 const genderList: Ref<any> = ref([]);
 const genderList: Ref<any> = ref([]);
 const typeList: Ref<any> = ref([]);
 const typeList: Ref<any> = ref([]);
 const statusList: Ref<any> = ref([]);
 const statusList: Ref<any> = ref([]);
-const userList: Ref<any> = ref([]);
 // 弹框
 // 弹框
 const dialog: Ref<any> = ref({ title: '审核管理', show: false, type: '1' });
 const dialog: Ref<any> = ref({ title: '审核管理', show: false, type: '1' });
 const form: Ref<any> = ref({ file: [] });
 const form: Ref<any> = ref({ file: [] });
@@ -80,8 +80,8 @@ onMounted(async () => {
   loading.value = false;
   loading.value = false;
 });
 });
 const search = async (e: { skip: number; limit: number }) => {
 const search = async (e: { skip: number; limit: number }) => {
-  const info = { skip: e.skip, limit: e.limit, ...searchForm.value, status: '0' };
-  const res: IQueryResult = await teamAxios.query(info);
+  const info = { skip: e.skip, limit: e.limit, ...searchForm.value, type: '0' };
+  const res: IQueryResult = await userAxios.query(info);
   if (res.errcode == '0') {
   if (res.errcode == '0') {
     list.value = res.data;
     list.value = res.data;
     total.value = res.total;
     total.value = res.total;
@@ -92,9 +92,9 @@ const toSearch = (query) => {
   search({ skip, limit });
   search({ skip, limit });
 };
 };
 const getDict = (e, model) => {
 const getDict = (e, model) => {
-  if (model == 'administrator') {
-    let data: any = userList.value.find((i: any) => i._id == e);
-    if (data) return data.name;
+  if (model == 'gender') {
+    let data: any = genderList.value.find((i: any) => i.value == e);
+    if (data) return data.label;
     else return '暂无';
     else return '暂无';
   } else if (model == 'status') {
   } else if (model == 'status') {
     let data: any = statusList.value.find((i: any) => i.value == e);
     let data: any = statusList.value.find((i: any) => i.value == e);
@@ -102,13 +102,9 @@ const getDict = (e, model) => {
     else return '暂无';
     else return '暂无';
   }
   }
 };
 };
-// 查看
-const toView = (data) => {
-  router.push({ path: '/team/examine/detail', query: { id: data._id } });
-};
 // 审核
 // 审核
 const toExam = async (data) => {
 const toExam = async (data) => {
-  let res: IQueryResult = await teamAxios.fetch(data._id);
+  let res: IQueryResult = await userAxios.fetch(data._id);
   if (res.errcode == '0') {
   if (res.errcode == '0') {
     form.value = res.data;
     form.value = res.data;
     dialog.value = { title: '审核管理', show: true, type: '1' };
     dialog.value = { title: '审核管理', show: true, type: '1' };
@@ -116,7 +112,7 @@ const toExam = async (data) => {
 };
 };
 // 提交保存
 // 提交保存
 const toSave = async (data) => {
 const toSave = async (data) => {
-  let res: IQueryResult = await teamAxios.update(data);
+  let res: IQueryResult = await userAxios.update(data);
   if (res.errcode == '0') {
   if (res.errcode == '0') {
     ElMessage({ message: '信息审核成功', type: 'success' });
     ElMessage({ message: '信息审核成功', type: 'success' });
     toClose();
     toClose();
@@ -124,6 +120,19 @@ const toSave = async (data) => {
     ElMessage({ message: `${res.errmsg}`, type: 'error' });
     ElMessage({ message: `${res.errmsg}`, type: 'error' });
   }
   }
 };
 };
+// 修改
+const toEdit = (data) => {
+  router.push({ path: '/users/match/detail', query: { id: data._id } });
+};
+// 删除
+const toDel = async (data: any) => {
+  let res: IQueryResult = await userAxios.del(data._id);
+  if (res.errcode == 0) {
+    ElMessage({ type: `success`, message: `刪除信息成功` });
+    search({ skip, limit });
+  }
+};
+
 // 关闭弹框
 // 关闭弹框
 const toClose = () => {
 const toClose = () => {
   form.value = {};
   form.value = {};
@@ -143,9 +152,6 @@ const searchOther = async () => {
   // 状态
   // 状态
   res = await dictAxios.query({ type: 'status' });
   res = await dictAxios.query({ type: 'status' });
   if (res.errcode == '0') statusList.value = res.data;
   if (res.errcode == '0') statusList.value = res.data;
-  // 管理员
-  res = await userAxios.query({ status: '1' });
-  if (res.errcode == '0') userList.value = res.data;
 };
 };
 </script>
 </script>
 <style scoped lang="scss">
 <style scoped lang="scss">

+ 3 - 5
src/views/users/team/detail.vue

@@ -45,12 +45,11 @@ let form: Ref<any> = ref({});
 let fields: Ref<any[]> = ref([
 let fields: Ref<any[]> = ref([
   { label: '微信用户标识', model: 'openid', options: { disabled: true } },
   { label: '微信用户标识', model: 'openid', options: { disabled: true } },
   { label: '账号', model: 'account', options: { disabled: true } },
   { label: '账号', model: 'account', options: { disabled: true } },
-  // { label: '类别', model: 'type', type: 'select', options: { disabled: true } },
-  { label: '姓名', model: 'name' },
-  { label: '性别', model: 'gender', type: 'select' },
-  { label: '年龄', model: 'age' },
+  { label: '名称', model: 'name' },
   { label: '手机号', model: 'phone' },
   { label: '手机号', model: 'phone' },
   { label: '电子邮箱', model: 'email' },
   { label: '电子邮箱', model: 'email' },
+  { label: '性别', model: 'gender', type: 'select' },
+  { label: '年龄', model: 'age' },
   { label: '工作单位', model: 'work' },
   { label: '工作单位', model: 'work' },
   { label: '头像', model: 'icon', custom: true }
   { label: '头像', model: 'icon', custom: true }
 ]);
 ]);
@@ -58,7 +57,6 @@ const rules = reactive<FormRules>({});
 // 字典表
 // 字典表
 const genderList: Ref<any> = ref([]);
 const genderList: Ref<any> = ref([]);
 const typeList: Ref<any> = ref([]);
 const typeList: Ref<any> = ref([]);
-
 // 请求
 // 请求
 onMounted(async () => {
 onMounted(async () => {
   loading.value = true;
   loading.value = true;

+ 3 - 2
src/views/users/team/index.vue

@@ -80,7 +80,7 @@ onMounted(async () => {
   loading.value = false;
   loading.value = false;
 });
 });
 const search = async (e: { skip: number; limit: number }) => {
 const search = async (e: { skip: number; limit: number }) => {
-  const info = { skip: e.skip, limit: e.limit, ...searchForm.value, type: '1' };
+  const info = { skip: e.skip, limit: e.limit, ...searchForm.value, type: '0' };
   const res: IQueryResult = await userAxios.query(info);
   const res: IQueryResult = await userAxios.query(info);
   if (res.errcode == '0') {
   if (res.errcode == '0') {
     list.value = res.data;
     list.value = res.data;
@@ -122,7 +122,7 @@ const toSave = async (data) => {
 };
 };
 // 修改
 // 修改
 const toEdit = (data) => {
 const toEdit = (data) => {
-  router.push({ path: '/users/team/detail', query: { id: data._id } });
+  router.push({ path: '/users/match/detail', query: { id: data._id } });
 };
 };
 // 删除
 // 删除
 const toDel = async (data: any) => {
 const toDel = async (data: any) => {
@@ -139,6 +139,7 @@ const toClose = () => {
   dialog.value = { show: false };
   dialog.value = { show: false };
   search({ skip, limit });
   search({ skip, limit });
 };
 };
+
 // 查询其他信息
 // 查询其他信息
 const searchOther = async () => {
 const searchOther = async () => {
   let res: IQueryResult;
   let res: IQueryResult;

+ 2 - 2
vite.config.ts

@@ -17,8 +17,8 @@ export default defineConfig(({ mode }) => {
         '/files': {
         '/files': {
           target: 'https://broadcast.waityou24.cn'
           target: 'https://broadcast.waityou24.cn'
         },
         },
-        '/ball/v1/api': {
-          target: 'http://192.168.1.113:13005', //http://169.254.16.148:13005  http://192.168.1.113:13005
+        '/material/v1/api': {
+          target: 'http://192.168.255.1:13004',
           changeOrigin: true,
           changeOrigin: true,
           ws: false
           ws: false
         }
         }