index.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. <template>
  2. <div class="sy-content">
  3. <el-row>
  4. <el-col :span="24">
  5. <!-- 表单查询 -->
  6. <el-form
  7. ref="queryForm"
  8. :model="queryParams"
  9. :inline="true"
  10. size="small"
  11. >
  12. <el-form-item
  13. label="菜单名称"
  14. prop="menuName"
  15. >
  16. <el-input
  17. v-model="queryParams.menuName"
  18. placeholder="请输入菜单名称"
  19. clear
  20. />
  21. </el-form-item>
  22. <el-form-item>
  23. <el-button
  24. type="primary"
  25. icon="el-icon-search"
  26. size="mini"
  27. @click="handelSearch"
  28. >搜索</el-button>
  29. <el-button
  30. icon="el-icon-refresh"
  31. size="mini"
  32. @click="handelReset"
  33. >重置</el-button>
  34. </el-form-item>
  35. </el-form>
  36. <el-button
  37. size="mini"
  38. icon="el-icon-plus"
  39. type="primary"
  40. plain
  41. @click="handelAdd"
  42. >新增</el-button>
  43. <!-- 表格数据信息 -->
  44. <el-table
  45. v-loading="loading"
  46. :data="menuList"
  47. row-key="id"
  48. >
  49. <el-table-column
  50. type="index"
  51. width="50"
  52. align="center"
  53. />
  54. <el-table-column
  55. key="menuName"
  56. label="菜单名称"
  57. align="center"
  58. prop="menuName"
  59. />
  60. <el-table-column
  61. key="menuIcon"
  62. label="菜单图标"
  63. align="center"
  64. prop="menuIcon"
  65. />
  66. <el-table-column
  67. key="menuUrl"
  68. label="路由地址"
  69. align="center"
  70. prop="menuUrl"
  71. />
  72. <el-table-column
  73. key="sortNum"
  74. label="排序号"
  75. align="center"
  76. prop="sortNum"
  77. />
  78. <el-table-column
  79. key="createTime"
  80. label="创建时间"
  81. align="center"
  82. prop="createTime"
  83. width="160"
  84. />
  85. <el-table-column
  86. key="updateTime"
  87. label="更新时间"
  88. align="center"
  89. prop="updateTime"
  90. width="160"
  91. >
  92. <template slot-scope="scope">
  93. {{ scope.row.updateTime === null ? scope.row.createTime : scope.row.updateTime }}
  94. </template>
  95. </el-table-column>
  96. <el-table-column
  97. label="操作"
  98. align="center"
  99. width="250"
  100. class-name="small-padding fixed-width"
  101. >
  102. <template slot-scope="scope">
  103. <el-button
  104. size="mini"
  105. type="text"
  106. icon="el-icon-edit"
  107. @click="handelEdit(scope.row.id)"
  108. >修改
  109. </el-button>
  110. <el-button
  111. size="mini"
  112. type="text"
  113. icon="el-icon-delete"
  114. @click="handelDel(scope.row.id)"
  115. >删除
  116. </el-button>
  117. <el-button
  118. size="mini"
  119. type="text"
  120. icon="el-icon-zoom-in"
  121. @click="handelAuth(scope.row.id)"
  122. >分配接口
  123. </el-button>
  124. </template>
  125. </el-table-column>
  126. </el-table>
  127. <!-- 分页信息 -->
  128. <pagination
  129. v-show="total > 0"
  130. :total="total"
  131. :page.sync="queryParams.page"
  132. :limit.sync="queryParams.limit"
  133. align="right"
  134. @pagination="getMenuList"
  135. />
  136. </el-col>
  137. </el-row>
  138. <!-- 弹出框 -->
  139. <el-dialog
  140. :title="title"
  141. :visible.sync="dialogVisible"
  142. width="800px"
  143. :close-on-click-modal="false"
  144. >
  145. <el-form
  146. ref="form"
  147. :model="form"
  148. :rules="rules"
  149. label-width="80px"
  150. >
  151. <el-row>
  152. <el-col :span="24">
  153. <el-form-item
  154. label="上级菜单"
  155. prop="parentId"
  156. >
  157. <selectTree
  158. v-model="form.parentId"
  159. :options="options"
  160. placeholder="请选择菜单"
  161. key-name="menuName"
  162. />
  163. </el-form-item>
  164. </el-col>
  165. </el-row>
  166. <el-row>
  167. <el-col :span="24">
  168. <el-form-item
  169. label="菜单图标"
  170. prop="menuIcon"
  171. >
  172. <el-input
  173. v-model="form.menuIcon"
  174. placeholder="请输入图标名称"
  175. />
  176. </el-form-item>
  177. </el-col>
  178. </el-row>
  179. <el-row>
  180. <el-col :span="12">
  181. <el-form-item
  182. label="菜单名称"
  183. prop="menuName"
  184. >
  185. <el-input
  186. v-model="form.menuName"
  187. placeholder="请输入菜单名称"
  188. />
  189. </el-form-item>
  190. </el-col>
  191. <el-col :span="12">
  192. <el-form-item
  193. label="显示排序"
  194. prop="sortNum"
  195. >
  196. <el-input-number
  197. v-model="form.sortNum"
  198. placeholder="0"
  199. controls-position="right"
  200. :min="1"
  201. :max="10"
  202. />
  203. </el-form-item>
  204. </el-col>
  205. </el-row>
  206. <el-row>
  207. <el-col :span="24">
  208. <el-form-item
  209. label="路由地址"
  210. prop="menuUrl"
  211. >
  212. <el-input
  213. v-model="form.menuUrl"
  214. placeholder="请输入路由地址"
  215. />
  216. </el-form-item>
  217. </el-col>
  218. </el-row>
  219. </el-form>
  220. <span
  221. slot="footer"
  222. class="dialog-footer"
  223. >
  224. <el-button
  225. type="primary"
  226. @click="handelSubmit('form')"
  227. >确 定</el-button>
  228. <el-button @click="handelCancel('form')">取 消</el-button>
  229. </span>
  230. </el-dialog>
  231. </div>
  232. </template>
  233. <script>
  234. import { getMenuList, addtMenuList, detailtMenuList, delMenuList, editMenuList } from '@/api/system/menu.js'
  235. import selectTree from '@/components/SelectTree'
  236. export default {
  237. components: {
  238. selectTree
  239. },
  240. data() {
  241. return {
  242. // 遮罩层
  243. loading: true,
  244. // 查询参数
  245. queryParams: {
  246. page: 1,
  247. limit: 10
  248. },
  249. // 总条数
  250. total: 0,
  251. // 表格数据
  252. menuList: [],
  253. // 弹出框
  254. dialogVisible: false,
  255. // 弹出框标题
  256. title: '',
  257. // 弹出框表单
  258. form: {},
  259. // 菜单类别
  260. options: [],
  261. // 表单验证
  262. rules: {
  263. menuName: [
  264. { required: true, message: '菜单名称不能为空', trigger: 'blur' }
  265. ],
  266. sortNum: [
  267. { required: true, message: '显示排序不能为空', trigger: ['change', 'blur'] }
  268. ],
  269. menuUrl: [
  270. { required: true, message: '路由地址不能为空', trigger: 'blur' }
  271. ]
  272. },
  273. // 修改菜单id
  274. id: null
  275. }
  276. },
  277. created() {
  278. this.getMenuList()
  279. },
  280. methods: {
  281. /** 获取表格数据 */
  282. getMenuList() {
  283. getMenuList(this.queryParams).then(response => {
  284. const data = response.data
  285. this.menuList = this.$utils.toArrayTree(data.menuList)
  286. this.total = data.count
  287. this.loading = false
  288. this.getOptionsList()
  289. })
  290. },
  291. /** 获取上级菜单 */
  292. getOptionsList() {
  293. getMenuList({
  294. page: 1,
  295. limit: 999
  296. }).then(res => {
  297. if (res.code === 200) {
  298. const data = res.data
  299. this.options = this.$utils.toArrayTree(data.menuList)
  300. }
  301. })
  302. },
  303. /** 搜索 */
  304. handelSearch() {
  305. this.queryParams.page = 1
  306. this.getMenuList()
  307. },
  308. /** 重置按钮操作 */
  309. handelReset() {
  310. this.$refs['queryForm'].resetFields()
  311. this.handelSearch()
  312. },
  313. /** 新增按钮 */
  314. handelAdd() {
  315. this.reset()
  316. this.dialogVisible = true
  317. this.title = '添加菜单'
  318. },
  319. /** 修改按钮 */
  320. handelEdit(id) {
  321. this.id = id
  322. detailtMenuList({ id }).then(res => {
  323. this.form = res.data
  324. })
  325. this.dialogVisible = true
  326. this.title = '修改菜单'
  327. },
  328. /** 删除按钮 */
  329. handelDel(id) {
  330. this.$confirm('是否删除该菜单?', '提示', {
  331. confirmButtonText: '确定',
  332. cancelButtonText: '取消',
  333. cancelButtonClass: 'btn_custom_cancel',
  334. type: 'warning'
  335. }).then(() => {
  336. delMenuList({ id }).then(res => {
  337. if (res.code === 200) {
  338. this.$message({
  339. type: 'success',
  340. message: res.data
  341. })
  342. this.getMenuList()
  343. }
  344. })
  345. }).catch(() => {
  346. this.$message({
  347. type: 'info',
  348. message: '已取消删除'
  349. })
  350. })
  351. },
  352. /** 表单提交 */
  353. handelSubmit(formName) {
  354. this.$refs[formName].validate((valid) => {
  355. if (valid) {
  356. if (this.title === '添加菜单') {
  357. this.form.parentId = this.form.parentId || 0
  358. addtMenuList(this.form).then(res => {
  359. if (res.code === 200) {
  360. this.$message({
  361. message: res.data,
  362. type: 'success'
  363. })
  364. this.getMenuList()
  365. this.dialogVisible = false
  366. }
  367. })
  368. } else {
  369. this.form.id = this.id
  370. editMenuList(this.form).then(res => {
  371. if (res.code === 200) {
  372. this.$message({
  373. message: res.data,
  374. type: 'success'
  375. })
  376. this.getMenuList()
  377. this.dialogVisible = false
  378. }
  379. })
  380. }
  381. }
  382. })
  383. },
  384. /** 表单取消 */
  385. handelCancel() {
  386. this.dialogVisible = false
  387. this.reset()
  388. },
  389. /** 表单重置 */
  390. reset() {
  391. if (this.$refs['form']) {
  392. this.$refs['form'].resetFields()
  393. }
  394. },
  395. /** 分配接口按钮 */
  396. handelAuth(id) {
  397. this.$router.push('/system/menu/menu-auth/auth/' + id)
  398. }
  399. }
  400. }
  401. </script>
  402. <style lang="scss" rel="stylesheet/scss" scoped>
  403. </style>