detail.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <template>
  2. <div id="index">
  3. <el-row>
  4. <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
  5. <el-col :span="24" class="one">
  6. <c-search :is_title="false" :is_back="true" @toBack="toBack" :is_search="true" :fields="fields" @search="toSearch">
  7. <template #type>
  8. <el-select v-model="searchForm.type" filterable placeholder="请选择" style="width: 100%" @change="changeType">
  9. <el-option v-for="(item, index) in typeList" :key="index" :label="item.name" :value="item.type"></el-option>
  10. </el-select>
  11. </template>
  12. </c-search>
  13. </el-col>
  14. <el-col :span="24" class="two">
  15. <cButton @toAdd="toAdd()"> </cButton>
  16. </el-col>
  17. <el-col :span="24" class="fou">
  18. <cTable :fields="fields" :opera="opera" :list="list" @query="search" :total="total" @edit="toEdit" @del="toDel">
  19. <template #type="{ item, row }">
  20. <template v-if="item.model === 'type'">
  21. {{ getProps(row, item.model) }}
  22. </template>
  23. </template>
  24. </cTable>
  25. </el-col>
  26. </el-col>
  27. </el-row>
  28. <cDialog :dialog="dialog" @handleClose="toClose">
  29. <template v-slot:info>
  30. <cForm v-if="dialog.type == '1'" :span="24" :fields="formFields" :form="form" :rules="rules" @save="onSubmit">
  31. <template #is_use>
  32. <el-radio v-for="(i, index) in is_useList" :key="index" :label="i.value">{{ i.label }}</el-radio>
  33. </template>
  34. </cForm>
  35. </template>
  36. </cDialog>
  37. </div>
  38. </template>
  39. <script lang="ts" setup>
  40. import _ from 'lodash';
  41. // import search1 from './parts_two/search-1.vue'
  42. import type { FormRules } from 'element-plus';
  43. import type { Ref } from 'vue';
  44. import { ref, onMounted, getCurrentInstance, reactive } from 'vue';
  45. import { ElMessage } from 'element-plus';
  46. import { useRoute } from 'vue-router';
  47. import { DictDataStore } from '@common/src/stores/system/dictData'; // 字典表
  48. import { DictTypeStore } from '@common/src/stores/system/dictType'; // 字典表
  49. import type { IQueryResult } from '@/util/types.util';
  50. const dictType = DictTypeStore();
  51. const dictData = DictDataStore();
  52. const route = useRoute();
  53. const { proxy } = getCurrentInstance() as any;
  54. const loading = ref(false);
  55. // 列表数据
  56. let list: Ref<any> = ref([]);
  57. // 总数
  58. let total: Ref<number> = ref(0);
  59. let skip = 0;
  60. let limit: number = proxy.$limit;
  61. // 列表
  62. let fields: Ref<any[]> = ref([
  63. { label: '字典类型', model: 'type', isSearch: true, custom: true },
  64. { label: '字典标签', model: 'label', isSearch: true },
  65. { label: '字典键值', model: 'value' },
  66. { label: '字典排序', model: 'sort' },
  67. { label: '是否使用', model: 'is_use', format: (i) => (i == '0' ? '使用' : '禁用') }
  68. ]);
  69. // 操作
  70. let opera: Ref<any[]> = ref([
  71. { label: '修改', method: 'edit' },
  72. { label: '删除', method: 'del', confirm: true, type: 'danger' }
  73. ]);
  74. const dialog: Ref<{ type: string; show: boolean; title: string }> = ref({ type: '1', show: false, title: '信息管理' });
  75. let form: Ref<any> = ref({});
  76. let is_useList: Ref<any> = ref([]);
  77. // 表单
  78. let formFields: Ref<any[]> = ref([
  79. { label: '字典类型', model: 'type' },
  80. { label: '字典标签', model: 'label' },
  81. { label: '字典键值', model: 'value' },
  82. { label: '显示排序', model: 'sort', type: 'number' },
  83. { label: '状态', model: 'is_use', type: 'radio' }
  84. ]);
  85. const rules = reactive<FormRules>({
  86. type: [{ required: true, message: '请输入字典类型', trigger: 'blur' }],
  87. label: [{ required: true, message: '请输入字典标签', trigger: 'blur' }],
  88. value: [{ required: true, message: '请输入字典键值', trigger: 'blur' }],
  89. sort: [{ required: true, message: '请输入显示排序', trigger: 'blur' }]
  90. // is_use: [{ required: true, message: '请选择是否启用', trigger: 'change' }]
  91. });
  92. // 查询数据
  93. let searchForm: Ref<any> = ref({});
  94. let type: Ref<any> = ref('');
  95. let typeList: Ref<any> = ref([]);
  96. onMounted(async () => {
  97. loading.value = true;
  98. await searchOther();
  99. await search({ skip, limit });
  100. loading.value = false;
  101. });
  102. // 查询
  103. const search = async (e: { skip: number; limit: number }) => {
  104. const { skip, limit } = e;
  105. const condition = _.cloneDeep(searchForm.value);
  106. let info = { limit: limit, skip: skip, ...condition };
  107. let res: IQueryResult = await dictData.query(info);
  108. if (res.errcode == 0) {
  109. list.value = res.data as any[];
  110. total.value = res.total;
  111. }
  112. };
  113. const toSearch = () => {
  114. search({ skip, limit });
  115. };
  116. const searchOther = async () => {
  117. if (route.query.type) type.value = route.query.type;
  118. form.value.type = type.value;
  119. searchForm.value.type = type.value;
  120. let res: IQueryResult = await dictType.query();
  121. if (res.errcode == 0) typeList.value = res.data;
  122. let aee: IQueryResult = await dictData.query({ type: 'common_use' });
  123. if (aee.errcode == 0) is_useList.value = aee.data;
  124. };
  125. // 新增
  126. const toAdd = () => {
  127. dialog.value = { title: '信息管理', show: true, type: '1' };
  128. };
  129. // 修改
  130. const toEdit = async (data) => {
  131. let res: IQueryResult = await dictData.fetch(data._id);
  132. if (res.errcode == 0) {
  133. form.value = res.data as {};
  134. dialog.value = { title: '信息管理', show: true, type: '1' };
  135. }
  136. };
  137. // 提交
  138. const onSubmit = async (data) => {
  139. let res: IQueryResult;
  140. if (data._id) res = await dictData.update(data);
  141. else res = await dictData.create(data);
  142. if (res.errcode == 0) {
  143. ElMessage({ type: `success`, message: `维护信息成功` });
  144. toClose();
  145. }
  146. };
  147. const getProps = (e, model) => {
  148. if (model == 'type') {
  149. let data = typeList.value.find((i) => i.type == e.type);
  150. if (data) return data.name;
  151. }
  152. };
  153. // 删除
  154. const toDel = async (data) => {
  155. let res: IQueryResult = await dictData.del(data._id);
  156. if (res.errcode == 0) {
  157. ElMessage({ type: `success`, message: `刪除信息成功` });
  158. search({ skip, limit });
  159. }
  160. };
  161. // 选择字典名称
  162. const changeType = (value) => {
  163. type.value = value;
  164. form.value.type = value;
  165. };
  166. // 返回
  167. const toBack = () => {
  168. window.history.go(-1);
  169. };
  170. // 弹框关闭
  171. const toClose = () => {
  172. form.value = { type: type.value };
  173. searchForm.value = { type: type.value };
  174. dialog.value = { title: '信息管理', show: false, type: '1' };
  175. search({ skip, limit });
  176. };
  177. </script>
  178. <style lang="scss" scoped>
  179. .main {
  180. .one {
  181. margin: 0 0 10px 0;
  182. }
  183. .two {
  184. margin: 0 0 10px 0;
  185. }
  186. }
  187. </style>