index.vue 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. <template>
  2. <el-container>
  3. <el-main class="page-main">
  4. <el-card>
  5. <el-container>
  6. <el-aside :width="treeWidth">
  7. <tree :fetch="this.$api.sysMenu.tree" :query="nodeQuery" :call-back="getTreeDataCallBack" :click="nodeClick" />
  8. </el-aside>
  9. <el-container>
  10. <el-header height="120">
  11. <el-form ref="searchForm" :model="dataQuery" :size="size" label-position="left" label-width="80px">
  12. <el-row :gutter="20">
  13. <el-col :span="6">
  14. <el-form-item label="Name:" class="notice-input" label-width="60px" prop="name">
  15. <el-input v-model="dataQuery.name" placeholder="Please input name" clearable @keyup.enter.native="search" />
  16. </el-form-item>
  17. </el-col>
  18. <el-col :span="6">
  19. <el-form-item label="Code:" class="notice-input" label-width="60px" prop="code">
  20. <el-input v-model="dataQuery.code" placeholder="Please input code" clearable @keyup.enter.native="search" />
  21. </el-form-item>
  22. </el-col>
  23. <el-col :span="12" style="text-align: right">
  24. <el-form-item>
  25. <el-button type="primary" icon="el-icon-search" :size="size" @click="search">{{ $t('common.search') }}</el-button>
  26. <el-button icon="el-icon-refresh" :size="size" @click="resetFields">{{ $t('common.reset') }}</el-button>
  27. <export-button :api="this.$api.sysMenu.page" :columns="tableColumns" :data-query="dataQuery" name="menu.xlsx" />
  28. </el-form-item>
  29. </el-col>
  30. </el-row>
  31. <el-row>
  32. <el-button type="primary" icon="el-icon-plus" :size="size" @click="create">{{ $t('common.create') }}</el-button>
  33. <el-button :size="size" @click="deleteBatch">{{ $t('common.batchDelete') }}</el-button>
  34. </el-row>
  35. </el-form>
  36. </el-header>
  37. <el-main class="table-main">
  38. <sheet ref="qtable" :api="this.$api.sysMenu.page" :columns="tableColumns" :data-query="dataQuery" :operates="operates" :float-type="'right'" :select-type="'selection'" />
  39. </el-main>
  40. </el-container>
  41. </el-container>
  42. </el-card>
  43. </el-main>
  44. <el-dialog :title="dialogStatus==='create'? $t('common.create'):$t('common.update')" :visible.sync="dialogVisible" width="40%" @close="dialogClose">
  45. <el-form ref="dataForm" :size="size" :rules="rules" :model="temp" label-width="85px">
  46. <el-form-item label="Name:" prop="name">
  47. <el-input v-model="temp.name" placeholder="Please input name" />
  48. </el-form-item>
  49. <el-form-item label="Code:" prop="code">
  50. <el-input v-model="temp.code" placeholder="Please input code" />
  51. </el-form-item>
  52. <el-form-item label="Url:" prop="url">
  53. <el-input v-model="temp.url" placeholder="Please input url" />
  54. </el-form-item>
  55. <el-form-item label="Com:" prop="component">
  56. <el-input v-model="temp.component" placeholder="Please input component" />
  57. </el-form-item>
  58. <el-form-item label="Order:" prop="order">
  59. <el-input v-model.number="temp.order" placeholder="Please input order" />
  60. </el-form-item>
  61. <el-form-item label="Icon:" prop="icon">
  62. <el-input v-model="temp.icon" placeholder="Please input icon" />
  63. </el-form-item>
  64. <el-form-item label="Perms:" prop="perms">
  65. <el-input v-model="temp.perms" placeholder="Please input perms" />
  66. </el-form-item>
  67. <el-form-item label="Type:" prop="type">
  68. <option-set :value.sync="temp.type" placeholder="Please input type" code="sys_menu_type" />
  69. </el-form-item>
  70. <el-form-item label="Parent:" prop="parent">
  71. <cascader :api="this.$api.sysMenu.tree" :data-query="nodeQuery" :value.sync="temp.parent" />
  72. </el-form-item>
  73. <el-form-item label="Hidden:" prop="hidden">
  74. <el-radio v-model="temp.hidden" :label="1">是</el-radio>
  75. <el-radio v-model="temp.hidden" :label="0">否</el-radio>
  76. </el-form-item>
  77. </el-form>
  78. <footer slot="footer" class="dialog-footer">
  79. <el-button :size="size" @click="dialogVisible = false">Cancel</el-button>
  80. <el-button :size="size" type="primary" @click="dialogStatus==='create'?createData():updateData()">Confirm
  81. </el-button>
  82. </footer>
  83. </el-dialog>
  84. </el-container>
  85. </template>
  86. <script>
  87. import { mapGetters } from 'vuex'
  88. import Tree from '@/components/Tree'
  89. import Sheet from '@/components/Sheet'
  90. import Cascader from '@/components/Cascader'
  91. import OptionSet from '@/components/OptionSet'
  92. import ExportButton from '@/components/ExportButton'
  93. export default {
  94. name: 'Menu',
  95. components: {
  96. Tree,
  97. Sheet,
  98. Cascader,
  99. OptionSet,
  100. ExportButton
  101. },
  102. data() {
  103. return {
  104. tableColumns: [
  105. {
  106. prop: 'name',
  107. label: 'Name',
  108. align: 'center',
  109. minWidth: 150,
  110. maxWidth: 220
  111. },
  112. {
  113. prop: 'url',
  114. label: 'Url',
  115. align: 'center',
  116. minWidth: 150,
  117. maxWidth: 220
  118. },
  119. {
  120. prop: 'component',
  121. label: 'Component',
  122. align: 'center',
  123. minWidth: 180,
  124. maxWidth: 220
  125. },
  126. {
  127. prop: 'code',
  128. label: 'Code',
  129. align: 'center',
  130. minWidth: 150,
  131. maxWidth: 180
  132. },
  133. {
  134. prop: 'order',
  135. label: 'Order',
  136. align: 'center',
  137. minWidth: 150,
  138. maxWidth: 180
  139. }
  140. ],
  141. operates: {
  142. list: [
  143. {
  144. label: 'Edit',
  145. show: true,
  146. type: 'primary',
  147. method: row => {
  148. this.edit(row)
  149. }
  150. },
  151. {
  152. label: 'Delete',
  153. show: true,
  154. type: 'danger',
  155. method: row => {
  156. this.deleteData(row)
  157. }
  158. }
  159. ],
  160. width: 160,
  161. fixed: 'right'
  162. },
  163. dataQuery: {
  164. page: 1,
  165. rows: 10,
  166. name: '',
  167. code: ''
  168. },
  169. nodeQuery: {
  170. },
  171. temp: {
  172. id: undefined,
  173. name: '',
  174. code: '',
  175. url: '',
  176. component: '',
  177. parent: this.parent,
  178. inheritance: '',
  179. icon: '',
  180. order: 0,
  181. perms: '',
  182. type: 0,
  183. hidden: 0
  184. },
  185. rules: {
  186. code: [{ required: true, message: 'Please input code', trigger: 'blur' }],
  187. name: [{ required: true, message: 'Please input menu name', trigger: 'blur' }],
  188. url: [{ required: true, message: 'Please input url', trigger: 'blur' }]
  189. },
  190. cascaderData: [],
  191. defaultProps: {
  192. children: 'nodes',
  193. label: 'name',
  194. value: 'id',
  195. key: 'id'
  196. },
  197. dataLoading: false,
  198. dialogStatus: '',
  199. dialogVisible: false,
  200. menuTypes: [
  201. { id: 0, name: 'Dir' },
  202. { id: 1, name: 'Menu' },
  203. { id: 2, name: 'Button' }
  204. ]
  205. }
  206. },
  207. computed: {
  208. ...mapGetters([
  209. 'size',
  210. 'minMainHeight',
  211. 'treeWidth'
  212. ])
  213. },
  214. mounted() {
  215. var height = this.$refs.searchForm.$el.offsetHeight
  216. this.$store.dispatch('app/pageTableHeaderHeight', { height: height })
  217. },
  218. destroyed() {
  219. this.$store.dispatch('app/pageTableHeaderHeight', { height: 0 })
  220. },
  221. created() {},
  222. methods: {
  223. nodeClick(node) {
  224. this.dataQuery.parent = node.id
  225. this.$refs.qtable.getData()
  226. },
  227. getTreeDataCallBack(tree) {},
  228. handleChange(value) {},
  229. createData() {
  230. this.$refs['dataForm'].validate((valid) => {
  231. if (valid) {
  232. this.$api.sysMenu.add(this.temp).then(res => {
  233. this.dialogVisible = false
  234. this.$message({
  235. message: 'Created successfully',
  236. type: 'success'
  237. })
  238. this.$refs.qtable.getData()
  239. })
  240. }
  241. })
  242. },
  243. updateData() {
  244. this.$refs['dataForm'].validate(valid => {
  245. if (valid) {
  246. const postData = Object.assign({}, this.temp)
  247. this.$api.sysMenu.update(postData).then(res => {
  248. this.dialogVisible = false
  249. this.$message({
  250. message: 'modify successfully',
  251. type: 'success'
  252. })
  253. this.$refs.qtable.getData()
  254. })
  255. }
  256. })
  257. },
  258. search() {
  259. this.$refs.qtable.getData()
  260. },
  261. resetFields() {
  262. this.$refs['searchForm'].resetFields()
  263. },
  264. deleteData(row) {
  265. this.$confirm('Are you sure you want to delete this user ?', 'Prompt', {
  266. type: 'warning'
  267. }).then(() => {
  268. this.$api.sysMenu.del({ id: row.id }).then(res => {
  269. this.$message({
  270. message: 'successfully deleted',
  271. type: 'success'
  272. })
  273. this.$refs.qtable.getData()
  274. })
  275. })
  276. },
  277. deleteBatch() {
  278. const ids = []
  279. this.$refs.qtable.selectionData.forEach(row => {
  280. ids.push({ id: row.id })
  281. })
  282. this.$confirm('Are you sure to delete selected data in batch ?', 'Prompt', {
  283. type: 'warning'
  284. }).then(() => {
  285. this.$api.sysMenu.batchDel(ids).then(res => {
  286. this.$refs.qtable.getData()
  287. this.$message({
  288. message: 'successfully deleted',
  289. type: 'success'
  290. })
  291. })
  292. })
  293. },
  294. dialogClose() {},
  295. create() {
  296. this.dialogStatus = 'create'
  297. this.dialogVisible = true
  298. this.$nextTick(() => {
  299. this.$refs['dataForm'].clearValidate()
  300. })
  301. },
  302. edit(row) {
  303. this.dialogStatus = 'update'
  304. this.dialogVisible = true
  305. this.$nextTick(() => {
  306. this.$refs['dataForm'].clearValidate()
  307. this.temp = Object.assign({}, row)
  308. })
  309. }
  310. }
  311. }
  312. </script>
  313. <style scoped lang="scss">
  314. </style>