index.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. <template>
  2. <div class="table-box">
  3. <div class="card table-main">
  4. <!-- 表格头部 操作按钮 -->
  5. <div class="table-header">
  6. <div class="header-button-lf">
  7. <el-form :model="queryParams" label-width="auto" :inline="true">
  8. <el-form-item label="角色名称:">
  9. <el-input v-model="queryParams.name" style="width: 200px" placeholder="请输入角色名称" clearable />
  10. </el-form-item>
  11. <el-form-item>
  12. <el-button type="primary" @click="handleQuery"> 查询 </el-button>
  13. <el-button style="margin-left: 10px" @click="resetQuery"> 重置 </el-button>
  14. <el-button style="margin-left: 10px" type="primary" plain @click="handleAdd" disabled> 新增 </el-button>
  15. </el-form-item>
  16. </el-form>
  17. </div>
  18. </div>
  19. <!-- 表格主体 -->
  20. <el-table stripe ref="tableRef" :border="true" :data="filteredData" size="small">
  21. <el-table-column align="left" label="序号" width="45px" :show-overflow-tooltip="true">
  22. <template #default="scope">
  23. {{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}
  24. </template>
  25. </el-table-column>
  26. <template v-for="item in columns" :key="item">
  27. <el-table-column v-bind="item" :align="item.align ?? 'left'" :reserve-selection="item.type == 'selection'" :show-overflow-tooltip="true">
  28. <template #default="scope">
  29. <template v-if="item.prop === 'operation'">
  30. <el-tooltip
  31. class="box-item"
  32. effect="dark"
  33. content="编辑"
  34. placement="top"
  35. >
  36. <el-button type="primary" link @click="handleUpdate(scope.row)">
  37. <el-icon >
  38. <Edit />
  39. </el-icon>
  40. </el-button>
  41. </el-tooltip>
  42. <el-tooltip
  43. class="box-item"
  44. effect="dark"
  45. content="删除"
  46. placement="top"
  47. >
  48. <el-button disabled type="primary" link @click="handleDelete(scope.row)">
  49. <el-icon >
  50. <Delete />
  51. </el-icon>
  52. </el-button>
  53. </el-tooltip>
  54. </template>
  55. </template>
  56. </el-table-column>
  57. </template>
  58. <!-- 无数据 -->
  59. <template #empty>
  60. <div class="table-empty">
  61. <slot name="empty">
  62. <img src="@/assets/images/notData.png" alt="notData" />
  63. <div>暂无数据</div>
  64. </slot>
  65. </div>
  66. </template>
  67. </el-table>
  68. <!-- 分页组件 -->
  69. <Pagination :pageable="pageable" :handle-size-change="handleSizeChange" :handle-current-change="handleCurrentChange" />
  70. </div>
  71. <!-- 添加或修改对话框 -->
  72. <el-dialog :title="dialog.title" v-model="dialog.visible" width="800px" append-to-body>
  73. <el-form ref="formRef" :model="roleForm" :rules="rules" label-width="120px">
  74. <el-form-item label="角色名称" prop="roleName">
  75. <el-input v-model="roleForm.roleName" placeholder="请输入角色名称" disabled/>
  76. </el-form-item>
  77. <el-form-item label="菜单权限">
  78. <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand()">展开/折叠</el-checkbox>
  79. <el-checkbox v-model="roleForm.menuCheckStrictly" @change="handleCheckedTreeConnect()" disabled>父子联动</el-checkbox>
  80. <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll()" disabled>全选/全不选</el-checkbox>
  81. <el-tree
  82. style="height: 400px;overflow-y: auto"
  83. disabled
  84. class="tree-border"
  85. :data="menuOptions"
  86. show-checkbox
  87. ref="menuRef"
  88. node-key="id"
  89. :check-strictly="!roleForm.menuCheckStrictly"
  90. :default-expanded-keys="menuData2"
  91. :default-checked-keys="menuData"
  92. empty-text="加载中,请稍候"
  93. :props="{ label: 'title', children: 'children' }"
  94. ></el-tree>
  95. </el-form-item>
  96. </el-form>
  97. <template #footer>
  98. <div class="dialog-footer">
  99. <el-button @click="cancel">取 消</el-button>
  100. <el-button type="primary" @click="submitForm" disabled>确 定</el-button>
  101. </div>
  102. </template>
  103. </el-dialog>
  104. </div>
  105. </template>
  106. <script setup lang="ts" name="useProTable">
  107. import Pagination from "@/components/ProTable/components/Pagination.vue";
  108. import authMenuList from "@/assets/json/authMenuList.json";//管理员
  109. import {ref, reactive, computed, onMounted} from "vue";
  110. import { ColumnProps } from "@/components/ProTable/interface";
  111. import { ElMessageBox } from 'element-plus'
  112. const menuExpand = ref(false)
  113. const menuNodeAll = ref(false)
  114. const menuOptions = ref<any>([])
  115. const menuRef = ref<any>();
  116. const menuOptionsData= ref([])
  117. /** 树权限(展开/折叠)*/
  118. const handleCheckedTreeExpand = () => {
  119. if (menuExpand.value) {
  120. menuExpand.value = true;
  121. Object.values(menuRef.value.store.nodesMap).forEach((v: any) => v.expand());
  122. return;
  123. }
  124. menuExpand.value = false;
  125. Object.values(menuRef.value.store.nodesMap).forEach((v: any) => v.collapse());
  126. };
  127. /** 树权限(全选/全不选) */
  128. const handleCheckedTreeNodeAll = (value: any, type: string) => {
  129. if (menuNodeAll.value) {
  130. const allKeys = getAllKeys(menuOptions.value);
  131. menuRef.value.setCheckedKeys(allKeys);
  132. } else {
  133. menuRef.value.setCheckedKeys([]);
  134. }
  135. }
  136. const getAllKeys = (data) => {
  137. let keys = [];
  138. data.forEach(item => {
  139. keys.push(item.id);
  140. if (item.children) {
  141. keys = keys.concat(getAllKeys(item.children));
  142. }
  143. });
  144. return keys;
  145. };
  146. /** 树权限(父子联动) */
  147. const handleCheckedTreeConnect = (value: any, type: string) => {
  148. }
  149. const convertData = (data: any[]) => {
  150. return data.map(item => {
  151. const { meta, children } = item;
  152. return {
  153. title: meta.title,
  154. children: children ? convertData(children) : []
  155. };
  156. });
  157. };
  158. const menuData = ref([])
  159. const menuData2 = ref([])
  160. const adminData = ref([1,2,3,4,5,6,7,8,100,101,102,103,104,105,200,201,202,203,204,205,206,207,208,209,300,301,302,303,304,400,401])//管理员
  161. const observerData = ref([1,2,3,4,5,6,7,8,100,101,102,103,104,105,200,201,202,203,204,205,206,207,208,209,300,303,304,400,401])//观测员
  162. const forecasterData = ref([1,2,3,4,5,6,7,8,100,101,102,103,104,105,200,201,202,203,204,205,206,207,208,209,400,401])//预报员、装备管理人员
  163. /** 修改按钮操作 */
  164. const handleUpdate = async (row?: any) => {
  165. reset();
  166. dialog.visible = true;
  167. dialog.title = "编辑";
  168. roleForm.value.roleName = row.a
  169. if(row.a==="管理员"){
  170. menuData.value = adminData.value
  171. }else if(row.a ==="观测员"){
  172. menuData.value = observerData.value
  173. }else if(row.a ==="观测员"){
  174. menuData.value = adminData.value
  175. }else if(row.a ==="预报员"){
  176. menuData.value = forecasterData.value
  177. }else if(row.a ==="装备管理人员"){
  178. menuData.value = forecasterData.value
  179. }
  180. getMenuList()
  181. }
  182. // 获取菜单列表
  183. const getMenuList= () => {
  184. const data = [
  185. {
  186. title: "实时监测报警",
  187. id:1,
  188. disabled: true,
  189. children: [
  190. {
  191. title: "全网实时数据监测报警",
  192. children: [],
  193. id:2,
  194. disabled: true
  195. },
  196. {
  197. title: "全网危险天气监测报警",
  198. children: [],
  199. id:3,
  200. disabled: true
  201. },
  202. {
  203. title: "全网设备状态监测报警",
  204. children: [],
  205. id:4,
  206. disabled: true
  207. },
  208. {
  209. title: "单站实时数据监测报警",
  210. children: [],
  211. id:5,
  212. disabled: true
  213. },
  214. {
  215. title: "单站设备状态监测报警",
  216. children: [],
  217. id:6,
  218. disabled: true
  219. },
  220. {
  221. title: "软件状态监测报警",
  222. children: [],
  223. id:7,
  224. disabled: true
  225. },
  226. {
  227. title: "GIS展示",
  228. children: [],
  229. id:8,
  230. disabled: true
  231. }
  232. ]
  233. },
  234. {
  235. title: "数据分析显示",
  236. id:100,
  237. disabled: true,
  238. children: [
  239. {
  240. title: "数据综合分析",
  241. children: [],
  242. id:101,
  243. disabled: true,
  244. },
  245. {
  246. title: "要素曲线分析",
  247. children: [],
  248. id:102,
  249. disabled: true,
  250. },
  251. {
  252. title: "风速风向玫瑰图",
  253. children: [],
  254. id:103,
  255. disabled: true,
  256. },
  257. {
  258. title: "雨量柱状图分析",
  259. disabled: true,
  260. id:104,
  261. children: []
  262. },
  263. {
  264. title: "雷电区域分析",
  265. disabled: true,
  266. id:105,
  267. children: []
  268. }
  269. ]
  270. },
  271. {
  272. title: "数据查询输出",
  273. disabled: true,
  274. id:200,
  275. children: [
  276. {
  277. title: "观测数据查询",
  278. disabled: true,
  279. id:201,
  280. children: []
  281. },
  282. {
  283. title: "设备健康信息查询",
  284. disabled: true,
  285. id:202,
  286. children: []
  287. },
  288. {
  289. title: "危险天气记录查询",
  290. disabled: true,
  291. id:203,
  292. children: []
  293. },
  294. {
  295. title: "质量审核记录",
  296. disabled: true,
  297. id:204,
  298. children: []
  299. },
  300. // {
  301. // title: "值班过程管理",
  302. // id:205,
  303. // disabled: true,
  304. // children: []
  305. // },
  306. // {
  307. // title: "日观测纪要",
  308. // id:206,
  309. // disabled: true,
  310. // children: []
  311. // },
  312. // {
  313. // title: "记录簿",
  314. // disabled: true,
  315. // id:207,
  316. // children: []
  317. // },
  318. // {
  319. // title: "月报表查询",
  320. // disabled: true,
  321. // id:208,
  322. // children: []
  323. // },
  324. // {
  325. // title: "天气日志",
  326. // disabled: true,
  327. // id:209,
  328. // children: []
  329. // }
  330. ]
  331. },
  332. {
  333. title: "系统管理",
  334. disabled: true,
  335. id:300,
  336. children: [
  337. {
  338. title: "用户管理",
  339. disabled: true,
  340. id:301,
  341. children: []
  342. },
  343. {
  344. title: "角色管理",
  345. disabled: true,
  346. id:302,
  347. children: []
  348. },
  349. {
  350. title: "台站管理",
  351. disabled: true,
  352. id:303,
  353. children: []
  354. },
  355. {
  356. title: "系统配置",
  357. disabled: true,
  358. id:304,
  359. children: []
  360. }
  361. ]
  362. },
  363. {
  364. title: "维护管理",
  365. disabled: true,
  366. id:400,
  367. children: [
  368. {
  369. title: "站点维护记录",
  370. id:401,
  371. disabled: true,
  372. children: []
  373. }
  374. ]
  375. }
  376. ]
  377. menuOptions.value = data
  378. }
  379. const pageable = ref<any>({
  380. pageNum: 1,
  381. pageSize: 20,
  382. total: 4
  383. });
  384. const queryParams = ref({
  385. name: '',
  386. pageNum: 1,
  387. pageSize: 20,
  388. total: 4
  389. });
  390. // 查询功能
  391. const handleQuery = () => {
  392. queryParams.value.pageNum = 1;
  393. };
  394. //搜索功能
  395. const resetQuery = () => {
  396. queryParams.value.name = ''
  397. queryParams.value.pageNum = 1;
  398. };
  399. /**
  400. * @description 每页条数改变
  401. * @param {Number} val 当前条数
  402. * @return void
  403. * */
  404. const handleSizeChange = (val: number) => {
  405. console.log(val);
  406. };
  407. /**
  408. * @description 当前页改变
  409. * @param {Number} val 当前页
  410. * @return void
  411. * */
  412. const handleCurrentChange = (val: number) => {
  413. console.log(val);
  414. };
  415. const filteredData = computed(() => {
  416. if (!queryParams.value.name) {
  417. return processTableData.value;
  418. }
  419. return processTableData.value.filter(item => item.a.includes(queryParams.value.name));
  420. });
  421. const processTableData = ref([
  422. {
  423. id: "1",
  424. a: "管理员",
  425. },
  426. {
  427. id: "2",
  428. a: "观测员",
  429. }, {
  430. id: "3",
  431. a: "预报员",
  432. }, {
  433. id: "4",
  434. a: "装备管理人员",
  435. }
  436. ]);
  437. // 表格配置项
  438. const columns = reactive<ColumnProps[]>([
  439. { prop: "a", label: "角色名称" },
  440. { prop: "operation", label: "操作", width:150,align: 'center' }
  441. ]);
  442. const dialog = reactive<any>({
  443. visible: false,
  444. title: ''
  445. });
  446. const formRef = ref<any>();
  447. const rules = ref<any>(
  448. {
  449. roleName: [{ required: true, message: "角色名称不能为空", trigger: "blur" }],
  450. }
  451. );
  452. const initFormData = ref<any>(
  453. {
  454. roleName: "",
  455. menuCheckStrictly: true
  456. }
  457. );
  458. const roleForm = ref<any>({...initFormData});
  459. /** 新增按钮操作 */
  460. const handleAdd = () => {
  461. reset();
  462. dialog.visible = true;
  463. dialog.title = "新增";
  464. getMenuList()
  465. }
  466. /** 取消按钮 */
  467. const cancel = () => {
  468. reset();
  469. dialog.visible = false;
  470. }
  471. /** 表单重置 */
  472. const reset = () => {
  473. roleForm.value = { ...initFormData };
  474. formRef.value?.resetFields();
  475. }
  476. /** 提交按钮 */
  477. const submitForm = () => {
  478. formRef.value?.validate(async (valid: boolean) => {
  479. if (valid) {
  480. dialog.visible = false;
  481. }
  482. });
  483. }
  484. /** 删除按钮操作 */
  485. const handleDelete = async (row?: any) => {
  486. ElMessageBox.confirm('是否确认删除角色编号为"' + row.a + '"的数据项?', {
  487. confirmButtonText: '删除',
  488. cancelButtonText: '取消',
  489. type: 'warning',
  490. title:'删除数据',
  491. draggable: true
  492. })
  493. .then(() => {
  494. })
  495. .catch(() => {
  496. })
  497. }
  498. onMounted(() => {
  499. console.log(authMenuList.data)
  500. })
  501. </script>