index.vue 10 KB

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