index.vue 11 KB

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