index.vue 11 KB

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