index.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. <template>
  2. <div class="p-2">
  3. <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
  4. <div v-show="showSearch" class="mb-[10px]">
  5. <el-card shadow="hover">
  6. <el-form ref="queryFormRef" :model="queryParams" :inline="true">
  7. <el-form-item>
  8. <!-- <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> -->
  9. <el-button icon="Refresh" @click="resetQuery">重置</el-button>
  10. </el-form-item>
  11. </el-form>
  12. </el-card>
  13. </div>
  14. </transition>
  15. <el-card shadow="hover">
  16. <template #header>
  17. <el-row :gutter="10">
  18. <el-col :span="1.5">
  19. <el-button v-hasPermi="['system:addressarea:add']" type="primary" plain icon="Plus" @click="handleAdd()">新增</el-button>
  20. </el-col>
  21. <!-- <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar> -->
  22. </el-row>
  23. </template>
  24. <el-table
  25. ref="areaTableRef"
  26. v-loading="loading"
  27. :data="addressareaList"
  28. row-key="id"
  29. border
  30. lazy
  31. :load="loadChildren"
  32. :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
  33. >
  34. <el-table-column prop="areaName" label="地区名称"></el-table-column>
  35. <el-table-column prop="areaCode" align="center" label="地区编码"></el-table-column>
  36. <el-table-column prop="level" align="center" label="地区等级">
  37. <template #default="scope">
  38. <el-tag v-if="scope.row.level === 1" type="success">省</el-tag>
  39. <el-tag v-else-if="scope.row.level === 2" type="warning">市</el-tag>
  40. <el-tag v-else-if="scope.row.level === 3">区/县</el-tag>
  41. <el-tag v-else type="info">{{ scope.row.level }}</el-tag>
  42. </template>
  43. </el-table-column>
  44. <el-table-column prop="simpleName" align="center" label="简称"></el-table-column>
  45. <el-table-column label="创建时间" align="center" prop="createTime"> </el-table-column>
  46. <el-table-column fixed="right" align="center" label="操作" width="280">
  47. <template #default="scope">
  48. <el-button v-hasPermi="['system:addressarea:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)">编辑</el-button>
  49. <el-button v-hasPermi="['system:addressarea:add']" link type="primary" icon="Plus" @click="handleAdd(scope.row)">新增</el-button>
  50. <el-button v-hasPermi="['system:addressarea:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
  51. </template>
  52. </el-table-column>
  53. </el-table>
  54. </el-card>
  55. <el-dialog v-model="dialog.visible" :title="dialog.title" destroy-on-close append-to-body width="600px">
  56. <el-form ref="addressareaFormRef" :model="form" :rules="rules" label-width="100px">
  57. <el-row>
  58. <el-col v-if="form.parentId !== 0" :span="24">
  59. <el-form-item label="上级地区" prop="parentId">
  60. <el-tree-select
  61. v-model="form.parentId"
  62. :data="areaOptions"
  63. :props="{ value: 'id', label: 'areaName', children: 'children' } as any"
  64. value-key="id"
  65. placeholder="选择上级地区"
  66. check-strictly
  67. />
  68. </el-form-item>
  69. </el-col>
  70. <el-col :span="12">
  71. <el-form-item label="地区名称" prop="areaName">
  72. <el-input v-model="form.areaName" placeholder="请输入地区名称" />
  73. </el-form-item>
  74. </el-col>
  75. <el-col :span="12">
  76. <el-form-item label="地区编码" prop="areaCode">
  77. <el-input v-model="form.areaCode" placeholder="请输入地区编码" />
  78. </el-form-item>
  79. </el-col>
  80. <el-col :span="12">
  81. <el-form-item label="地区等级" prop="level">
  82. <el-select v-model="form.level" placeholder="请选择地区等级" style="width: 100%">
  83. <el-option label="省" :value="1" />
  84. <el-option label="市" :value="2" />
  85. <el-option label="区/县" :value="3" />
  86. </el-select>
  87. </el-form-item>
  88. </el-col>
  89. <el-col :span="12">
  90. <el-form-item label="地区简称" prop="simpleName">
  91. <el-input v-model="form.simpleName" placeholder="请输入地区简称" />
  92. </el-form-item>
  93. </el-col>
  94. </el-row>
  95. </el-form>
  96. <template #footer>
  97. <div class="dialog-footer">
  98. <el-button type="primary" @click="submitForm">确 定</el-button>
  99. <el-button @click="cancel">取 消</el-button>
  100. </div>
  101. </template>
  102. </el-dialog>
  103. </div>
  104. </template>
  105. <script setup name="Addressarea" lang="ts">
  106. import { listAddressarea, getAddressarea, delAddressarea, addAddressarea, updateAddressarea } from '@/api/system/addressarea';
  107. import { AddressareaVO, AddressareaQuery, AddressareaForm } from '@/api/system/addressarea/types';
  108. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  109. interface AreaOptionsType {
  110. id: number | string;
  111. areaName: string;
  112. children: AreaOptionsType[];
  113. }
  114. const addressareaList = ref<AddressareaVO[]>([]);
  115. const loading = ref(true);
  116. const showSearch = ref(true);
  117. const areaOptions = ref<AreaOptionsType[]>([]);
  118. const isExpandAll = ref(true);
  119. const areaTableRef = ref<ElTableInstance>();
  120. const queryFormRef = ref<ElFormInstance>();
  121. const addressareaFormRef = ref<ElFormInstance>();
  122. const dialog = reactive<DialogOption>({
  123. visible: false,
  124. title: ''
  125. });
  126. const initFormData: AddressareaForm = {
  127. id: undefined,
  128. areaCode: undefined,
  129. areaName: undefined,
  130. parentId: undefined,
  131. simpleName: undefined,
  132. level: undefined,
  133. pinYin: undefined,
  134. dataSource: undefined
  135. };
  136. const data = reactive<PageData<AddressareaForm, AddressareaQuery>>({
  137. form: { ...initFormData },
  138. queryParams: {
  139. pageNum: 1,
  140. pageSize: 10,
  141. params: {}
  142. },
  143. rules: {
  144. areaName: [{ required: true, message: '地区名称不能为空', trigger: 'blur' }],
  145. areaCode: [{ required: true, message: '地区编码不能为空', trigger: 'blur' }],
  146. level: [{ required: true, message: '地区等级不能为空', trigger: 'blur' }]
  147. }
  148. });
  149. const { queryParams, form, rules } = toRefs(data);
  150. /** 查询地区列表列表 */
  151. const getList = async () => {
  152. loading.value = true;
  153. const res = await listAddressarea({ pageNum: 1, pageSize: 10000 });
  154. const level1Data = res.rows
  155. ?.filter((item) => item.parentId === null || item.parentId === 0)
  156. .map((item) => ({
  157. ...item,
  158. hasChildren: true
  159. }));
  160. if (level1Data) {
  161. addressareaList.value = level1Data;
  162. }
  163. loading.value = false;
  164. };
  165. /** 懒加载子节点 */
  166. const loadChildren = async (row: AddressareaVO, treeNode: any, resolve: (data: AddressareaVO[]) => void) => {
  167. const res = await listAddressarea({ pageNum: 1, pageSize: 10000 });
  168. const children = res.rows
  169. ?.filter((item) => item.parentId === row.id)
  170. .map((item) => ({
  171. ...item,
  172. hasChildren: item.level < 3
  173. }));
  174. resolve(children || []);
  175. };
  176. /** 取消按钮 */
  177. const cancel = () => {
  178. reset();
  179. dialog.visible = false;
  180. };
  181. /** 表单重置 */
  182. const reset = () => {
  183. form.value = { ...initFormData };
  184. addressareaFormRef.value?.resetFields();
  185. };
  186. /** 搜索按钮操作 */
  187. const handleQuery = () => {
  188. getList();
  189. };
  190. /** 重置按钮操作 */
  191. const resetQuery = () => {
  192. queryFormRef.value?.resetFields();
  193. handleQuery();
  194. };
  195. /** 新增按钮操作 */
  196. const handleAdd = async (row?: AddressareaVO) => {
  197. reset();
  198. const res = await listAddressarea({ pageNum: 1, pageSize: 10000 });
  199. const processedData = res.rows?.map((item) => ({
  200. ...item,
  201. parentId: item.parentId === null ? 0 : item.parentId
  202. }));
  203. const data = proxy?.handleTree<AreaOptionsType>(processedData, 'id', 'parentId');
  204. if (data) {
  205. areaOptions.value = data;
  206. if (row && row.id) {
  207. form.value.parentId = row.id as number;
  208. }
  209. }
  210. dialog.visible = true;
  211. dialog.title = '添加地区';
  212. };
  213. /** 修改按钮操作 */
  214. const handleUpdate = async (row: AddressareaVO) => {
  215. reset();
  216. const res = await getAddressarea(row.id);
  217. form.value = res.data;
  218. const response = await listAddressarea({ pageNum: 1, pageSize: 10000 });
  219. const processedData = response.rows?.map((item) => ({
  220. ...item,
  221. parentId: item.parentId === null ? 0 : item.parentId
  222. }));
  223. const data = proxy?.handleTree<AreaOptionsType>(processedData, 'id', 'parentId');
  224. if (data) {
  225. areaOptions.value = data;
  226. }
  227. dialog.visible = true;
  228. dialog.title = '修改地区';
  229. };
  230. /** 提交按钮 */
  231. const submitForm = () => {
  232. addressareaFormRef.value?.validate(async (valid: boolean) => {
  233. if (valid) {
  234. form.value.id ? await updateAddressarea(form.value) : await addAddressarea(form.value);
  235. proxy?.$modal.msgSuccess('操作成功');
  236. dialog.visible = false;
  237. await getList();
  238. }
  239. });
  240. };
  241. /** 删除按钮操作 */
  242. const handleDelete = async (row: AddressareaVO) => {
  243. await proxy?.$modal.confirm('是否确认删除地区"' + row.areaName + '"?');
  244. await delAddressarea(row.id);
  245. await getList();
  246. proxy?.$modal.msgSuccess('删除成功');
  247. };
  248. onMounted(() => {
  249. getList();
  250. });
  251. </script>