zs 1 год назад
Родитель
Сommit
18abf374ab
4 измененных файлов с 208 добавлено и 68 удалено
  1. 52 0
      src/stores/other/article.ts
  2. 52 0
      src/stores/other/group.ts
  3. 60 18
      src/views/article/index.vue
  4. 44 50
      src/views/group/index.vue

+ 52 - 0
src/stores/other/article.ts

@@ -0,0 +1,52 @@
+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: `/article`
+};
+export const ArticleStore = defineStore('article', () => {
+  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
+  };
+});

+ 52 - 0
src/stores/other/group.ts

@@ -0,0 +1,52 @@
+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: `/group`
+};
+export const GroupStore = defineStore('group', () => {
+  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
+  };
+});

+ 60 - 18
src/views/article/index.vue

@@ -3,7 +3,11 @@
     <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>
+          <cSearch :is_title="false" :is_search="true" :fields="fields" @search="toSearch">
+            <template #doctor>
+              <el-option v-for="i in doctorList" :key="i._id" :label="i.name" :value="i._id"></el-option>
+            </template>
+          </cSearch>
         </el-col>
         <el-col :span="24" class="two">
           <cButton @toAdd="toAdd()"> </cButton>
@@ -29,17 +33,29 @@
       <template v-slot:info>
         <el-col :span="24" class="dialog_one" v-if="dialog.type == '1'">
           <cForm :span="24" :fields="formFields" :form="form" :rules="rules" @save="toSave" label-width="auto">
-            <template #image>
+            <template #img_url>
               <cUpload
-                :model="`${'image'}`"
+                :model="`${'img_url'}`"
                 :limit="1"
                 listType="picture-card"
-                url="/visit/api/files/adv/upload"
+                url="/visit/api/files/group/upload"
                 accept="*"
-                :list="form.image"
+                :list="form.img_url"
                 @change="onUpload"
               ></cUpload>
             </template>
+            <template #files>
+              <cUpload :model="`${'files'}`" :limit="1" url="/visit/api/files/group/upload" accept="*" :list="form.files" @change="onUpload"></cUpload>
+            </template>
+            <template #doctor>
+              <el-option v-for="i in doctorList" :key="i._id" :label="i.name" :value="i._id"></el-option>
+            </template>
+            <template #brief>
+              <cEditor v-model="form.brief" url="/visit/api/files/group/upload"></cEditor>
+            </template>
+            <template #content>
+              <cEditor v-model="form.content" url="/visit/api/files/group/upload"></cEditor>
+            </template>
             <template #is_use>
               <el-option v-for="i in is_useList" :key="i.value" :label="i.label" :value="i.value"></el-option>
             </template>
@@ -52,14 +68,17 @@
 
 <script setup lang="ts">
 // 基础
+import store from '@/stores/counter';
 import type { FormRules } from 'element-plus';
 import type { Ref } from 'vue';
 import { ref, onMounted, getCurrentInstance, reactive } from 'vue';
 import { ElMessage, ElMessageBox } from 'element-plus';
 // 接口
-import { AdvStore } from '@/stores/other/adv';
+import { ArticleStore } from '@/stores/other/article';
+import { DoctorStore } from '@/stores/users/doctor';
 import type { IQueryResult } from '@/util/types.util';
-const advAxios = AdvStore();
+const articleAxios = ArticleStore();
+const doctorAxios = DoctorStore();
 const { proxy } = getCurrentInstance() as any;
 // 加载中
 const loading: Ref<any> = ref(false);
@@ -69,7 +88,8 @@ let skip = 0;
 let limit: number = proxy.$limit;
 let fields: Ref<any[]> = ref([
   { label: '标题', model: 'title', isSearch: true },
-  { label: '跳转路径', model: 'url' },
+  { label: '来源', model: 'origin' },
+  { label: '医生', model: 'doctor', type: 'select', isSearch: true, format: (i: any) => getDict(i) },
   { label: '是否启用', model: 'is_use', custom: true }
 ]);
 // 操作
@@ -79,19 +99,26 @@ let opera: Ref<any[]> = ref([
 ]);
 // 查询数据
 let searchForm: Ref<any> = ref({});
+// 字典表
+let doctorList: Ref<any> = ref([]);
 // 弹框
 const dialog: Ref<any> = ref({ title: '信息管理', show: false, type: '1' });
 const form: Ref<any> = ref({ image: [] });
 const formFields: Ref<any> = ref([
   { label: '标题', model: 'title' },
-  { label: '图片', model: 'image', custom: true },
-  { label: '跳转路径', model: 'url' },
+  { label: '医生', model: 'doctor', type: 'select' },
+  { label: '来源', model: 'origin' },
+  { label: '图片', model: 'img_url', custom: true },
+  { label: '简介', model: 'brief', custom: true },
+  { label: '内容', model: 'content', custom: true },
+  { label: '附件', model: 'files', custom: true },
+  { label: '备注', model: 'remark', type: 'textarea' },
   { label: '是否启用', model: 'is_use', type: 'select' }
 ]);
 const rules = reactive<FormRules>({
   title: [{ required: true, message: '请输入标题', trigger: 'blur' }],
-  image: [{ required: true, message: '请输入图片', trigger: 'blur' }],
-  url: [{ required: true, message: '请输入跳转路径', trigger: 'blur' }],
+  doctor: [{ required: true, message: '请选择医生', trigger: 'blur' }],
+  origin: [{ required: true, message: '请输入来源', trigger: 'blur' }],
   is_use: [{ required: true, message: '请选择是否启用', trigger: 'blur' }]
 });
 // 字典表
@@ -102,17 +129,23 @@ const is_useList: 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 advAxios.query(info);
+  const res: IQueryResult = await articleAxios.query(info);
   if (res.errcode == '0') {
     list.value = res.data;
     total.value = res.total;
   }
 };
+const getDict = (value: any) => {
+  let data = doctorList.value.find((i: any) => i._id == value);
+  if (data) return data.name;
+  else return '暂无';
+};
 const toSearch = (query: any) => {
   searchForm.value = query;
   search({ skip, limit });
@@ -124,8 +157,8 @@ const onUpload = (e: { model: string; value: Array<[]> }) => {
 // 提交保存
 const toSave = async (data: any) => {
   let res: IQueryResult;
-  if (data._id) res = await advAxios.update(data);
-  else res = await advAxios.create(data);
+  if (data._id) res = await articleAxios.update(data);
+  else res = await articleAxios.create(data);
   if (res.errcode == 0) {
     ElMessage({ type: `success`, message: `维护信息成功` });
     toClose();
@@ -137,7 +170,7 @@ const toAdd = () => {
 };
 // 修改
 const toEdit = async (data: any) => {
-  let res: IQueryResult = await advAxios.fetch(data._id);
+  let res: IQueryResult = await articleAxios.fetch(data._id);
   if (res.errcode == '0') {
     form.value = res.data;
     dialog.value = { title: '信息管理', show: true, type: '1' };
@@ -145,7 +178,7 @@ const toEdit = async (data: any) => {
 };
 // 删除
 const toDel = async (data: any) => {
-  let res: IQueryResult = await advAxios.del(data._id);
+  let res: IQueryResult = await articleAxios.del(data._id);
   if (res.errcode == 0) {
     ElMessage({ type: `success`, message: `刪除信息成功` });
     search({ skip, limit });
@@ -167,7 +200,7 @@ const handleChange = (row: any) => {
   })
     .then(async () => {
       let res: IQueryResult;
-      if (row._id) res = await advAxios.update(row);
+      if (row._id) res = await articleAxios.update(row);
       if (res.errcode == 0) {
         ElMessage({ type: `success`, message: `修改成功` });
       }
@@ -176,6 +209,15 @@ const handleChange = (row: any) => {
       row.is_use = row.is_use === '0' ? '1' : '0';
     });
 };
+// 查询其他信息
+const searchOther = async () => {
+  let res: IQueryResult;
+  let user = store.state.user;
+  if (user.role == 'Admin') res = await doctorAxios.query({});
+  else if (user.role == 'Doctor') res = await doctorAxios.fetch(user._id);
+  else if (user.role == 'Nurse') res = await doctorAxios.fetch(user.doctor);
+  if (res.errcode == '0') doctorList.value = res.data;
+};
 </script>
 <style scoped lang="scss">
 .main {

+ 44 - 50
src/views/group/index.vue

@@ -3,13 +3,17 @@
     <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>
+          <cSearch :is_title="false" :is_search="true" :fields="fields" @search="toSearch">
+            <template #doctor>
+              <el-option v-for="i in doctorList" :key="i._id" :label="i.name" :value="i._id"></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"></cTable>
+          <cTable :fields="fields" :opera="opera" :list="list" @query="search" :total="total" @edit="toEdit" @del="toDel"> </cTable>
         </el-col>
       </el-col>
     </el-row>
@@ -17,16 +21,8 @@
       <template v-slot:info>
         <el-col :span="24" class="dialog_one" v-if="dialog.type == '1'">
           <cForm :span="24" :fields="formFields" :form="form" :rules="rules" @save="toSave" label-width="auto">
-            <template #icon>
-              <cUpload
-                :model="`${'icon'}`"
-                :limit="1"
-                listType="picture-card"
-                url="/visit/api/files/group/upload"
-                accept="*"
-                :list="form.icon"
-                @change="onUpload"
-              ></cUpload>
+            <template #doctor>
+              <el-option v-for="i in doctorList" :key="i._id" :label="i.name" :value="i._id"></el-option>
             </template>
           </cForm>
         </el-col>
@@ -37,14 +33,17 @@
 
 <script setup lang="ts">
 // 基础
+import store from '@/stores/counter';
 import type { FormRules } from 'element-plus';
 import type { Ref } from 'vue';
 import { ref, onMounted, getCurrentInstance, reactive } from 'vue';
 import { ElMessage } from 'element-plus';
 // 接口
-import { NurseStore } from '@/stores/users/nurse';
+import { GroupStore } from '@/stores/other/group';
+import { DoctorStore } from '@/stores/users/doctor';
 import type { IQueryResult } from '@/util/types.util';
-const nurseAxios = NurseStore();
+const groupAxios = GroupStore();
+const doctorAxios = DoctorStore();
 const { proxy } = getCurrentInstance() as any;
 // 加载中
 const loading: Ref<any> = ref(false);
@@ -53,73 +52,59 @@ let total: Ref<number> = ref(0);
 let skip = 0;
 let limit: number = proxy.$limit;
 let fields: Ref<any[]> = ref([
-  { label: '账号', model: 'account', isSearch: true },
-  { label: '姓名', model: 'name', isSearch: true },
-  { label: '手机号', model: 'mobile', isSearch: true },
-  { label: '医院名称', model: 'hos_name', isSearch: true },
-  { label: '科室名称', model: 'dept_name', isSearch: true },
-  { label: '职务', model: 'title', isSearch: true },
-  { label: '职称', model: 'post', isSearch: true }
+  { label: '群组名称', model: 'name', isSearch: true },
+  { label: '管理医生', model: 'doctor', type: 'select', isSearch: true, format: (i: any) => getDict(i) }
 ]);
 // 操作
 let opera: Ref<any[]> = ref([
   { label: '修改', method: 'edit' },
   { label: '删除', method: 'del', confirm: true, type: 'danger' }
 ]);
+// 字典表
+let doctorList: Ref<any> = ref([]);
 // 查询数据
 let searchForm: Ref<any> = ref({});
 // 弹框
 const dialog: Ref<any> = ref({ title: '信息管理', show: false, type: '1' });
-const form: Ref<any> = ref({ file: [] });
+const form: Ref<any> = ref({});
 const formFields: Ref<any> = ref([
-  { label: '账号', model: 'account' },
-  { label: '密码', model: 'password', type: 'password' },
-  { label: '姓名', model: 'name' },
-  { label: '头像', model: 'icon', custom: true },
-  { label: '手机号', model: 'mobile' },
-  { label: '医院名称', model: 'hos_name' },
-  { label: '科室名称', model: 'dept_name' },
-  { label: '职务', model: 'title' },
-  { label: '职称', model: 'post' },
-  { label: '简介', model: 'content', type: 'textarea' }
+  { label: '群组名称', model: 'name' },
+  { label: '管理医生', model: 'doctor', type: 'select' },
+  { label: '群简介', model: 'content', type: 'textarea' }
 ]);
 const rules = reactive<FormRules>({
-  account: [{ required: true, message: '请输入账号', trigger: 'blur' }],
-  password: [{ required: true, message: '请输入密码', trigger: 'blur' }],
-  name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
-  mobile: [{ required: true, message: '请输入手机号', trigger: 'blur' }],
-  hos_name: [{ required: true, message: '请输入医院名称', trigger: 'blur' }],
-  dept_name: [{ required: true, message: '请输入科室名称', trigger: 'blur' }],
-  title: [{ required: true, message: '请输入职务', trigger: 'blur' }],
-  post: [{ required: true, message: '请输入职称', trigger: 'blur' }]
+  name: [{ required: true, message: '请输入群组名称', trigger: 'blur' }],
+  doctor: [{ required: true, message: '请选择管理医生', trigger: 'blur' }]
 });
 // 请求
 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 nurseAxios.query(info);
+  const res: IQueryResult = await groupAxios.query(info);
   if (res.errcode == '0') {
     list.value = res.data;
     total.value = res.total;
   }
 };
+const getDict = (value: any) => {
+  let data = doctorList.value.find((i: any) => i._id == value);
+  if (data) return data.name;
+  else return '暂无';
+};
 const toSearch = (query: any) => {
   searchForm.value = query;
   search({ skip, limit });
 };
-const onUpload = (e: { model: string; value: Array<[]> }) => {
-  const { model, value } = e;
-  form.value[model] = value;
-};
 // 提交保存
 const toSave = async (data: any) => {
   let res: IQueryResult;
-  if (data._id) res = await nurseAxios.update(data);
-  else res = await nurseAxios.create(data);
+  if (data._id) res = await groupAxios.update(data);
+  else res = await groupAxios.create(data);
   if (res.errcode == 0) {
     ElMessage({ type: `success`, message: `维护信息成功` });
     toClose();
@@ -131,7 +116,7 @@ const toAdd = () => {
 };
 // 修改
 const toEdit = async (data: any) => {
-  let res: IQueryResult = await nurseAxios.fetch(data._id);
+  let res: IQueryResult = await groupAxios.fetch(data._id);
   if (res.errcode == '0') {
     form.value = res.data;
     dialog.value = { title: '信息管理', show: true, type: '1' };
@@ -139,7 +124,7 @@ const toEdit = async (data: any) => {
 };
 // 删除
 const toDel = async (data: any) => {
-  let res: IQueryResult = await nurseAxios.del(data._id);
+  let res: IQueryResult = await groupAxios.del(data._id);
   if (res.errcode == 0) {
     ElMessage({ type: `success`, message: `刪除信息成功` });
     search({ skip, limit });
@@ -147,10 +132,19 @@ const toDel = async (data: any) => {
 };
 // 关闭弹框
 const toClose = () => {
-  form.value = { file: [] };
+  form.value = {};
   dialog.value = { show: false };
   search({ skip, limit });
 };
+// 查询其他信息
+const searchOther = async () => {
+  let res: IQueryResult;
+  let user = store.state.user;
+  if (user.role == 'Admin') res = await doctorAxios.query({});
+  else if (user.role == 'Doctor') res = await doctorAxios.fetch(user._id);
+  else if (user.role == 'Nurse') res = await doctorAxios.fetch(user.doctor);
+  if (res.errcode == '0') doctorList.value = res.data;
+};
 </script>
 <style scoped lang="scss">
 .main {