7c7e4caddb762194169acbc5f9b9a9aa8369a61c.svn-base 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. <template>
  2. <a-modal
  3. title="操作"
  4. :width="800"
  5. :visible="visible"
  6. :confirmLoading="confirmLoading"
  7. @ok="handleOk"
  8. @cancel="handleCancel"
  9. >
  10. <a-spin :spinning="confirmLoading">
  11. <a-form :form="form">
  12. <a-form-item
  13. :labelCol="labelCol"
  14. :wrapperCol="wrapperCol"
  15. label="唯一识别码"
  16. hasFeedback
  17. >
  18. <a-input placeholder="唯一识别码" disabled="disabled" v-decorator="[ 'id', {rules: []} ]" />
  19. </a-form-item>
  20. <a-form-item
  21. :labelCol="labelCol"
  22. :wrapperCol="wrapperCol"
  23. label="角色名称"
  24. hasFeedback >
  25. <a-input placeholder="起一个名字" v-decorator="[ 'name', {rules: [{ required: true, message: '不起一个名字吗?' }] }]" />
  26. </a-form-item>
  27. <a-form-item
  28. :labelCol="labelCol"
  29. :wrapperCol="wrapperCol"
  30. label="状态"
  31. hasFeedback >
  32. <a-select v-decorator="[ 'status', {rules: []} ]">
  33. <a-select-option :value="1">正常</a-select-option>
  34. <a-select-option :value="2">禁用</a-select-option>
  35. </a-select>
  36. </a-form-item>
  37. <a-form-item
  38. :labelCol="labelCol"
  39. :wrapperCol="wrapperCol"
  40. label="描述"
  41. hasFeedback
  42. >
  43. <a-textarea :rows="5" placeholder="..." v-decorator="[ 'describe', { rules: [] } ]" />
  44. </a-form-item>
  45. <a-divider/>
  46. <a-form-item
  47. :labelCol="labelCol"
  48. :wrapperCol="wrapperCol"
  49. label="拥有权限"
  50. hasFeedback
  51. >
  52. <a-row :gutter="16" v-for="(permission, index) in permissions" :key="index">
  53. <a-col :span="4">
  54. {{ permission.name }}:
  55. </a-col>
  56. <a-col :span="20">
  57. <a-checkbox
  58. v-if="permission.actionsOptions.length > 0"
  59. :indeterminate="permission.indeterminate"
  60. :checked="permission.checkedAll"
  61. @change="onChangeCheckAll($event, permission)">
  62. 全选
  63. </a-checkbox>
  64. <a-checkbox-group :options="permission.actionsOptions" v-model="permission.selected" @change="onChangeCheck(permission)" />
  65. </a-col>
  66. </a-row>
  67. </a-form-item>
  68. </a-form>
  69. </a-spin>
  70. </a-modal>
  71. </template>
  72. <script>
  73. import { getPermissions } from '@/api/manage'
  74. import { actionToObject } from '@/utils/permissions'
  75. import pick from 'lodash.pick'
  76. export default {
  77. name: "RoleModal",
  78. data () {
  79. return {
  80. labelCol: {
  81. xs: { span: 24 },
  82. sm: { span: 5 },
  83. },
  84. wrapperCol: {
  85. xs: { span: 24 },
  86. sm: { span: 16 },
  87. },
  88. visible: false,
  89. confirmLoading: false,
  90. mdl: {},
  91. form: this.$form.createForm(this),
  92. permissions: []
  93. }
  94. },
  95. created () {
  96. this.loadPermissions()
  97. },
  98. methods: {
  99. add () {
  100. this.edit({ id: 0 })
  101. },
  102. edit (record) {
  103. this.mdl = Object.assign({}, record)
  104. this.visible = true
  105. // 有权限表,处理勾选
  106. if (this.mdl.permissions && this.permissions) {
  107. // 先处理要勾选的权限结构
  108. const permissionsAction = {}
  109. this.mdl.permissions.forEach(permission => {
  110. permissionsAction[permission.permissionId] = permission.actionEntitySet.map(entity => entity.action)
  111. })
  112. // 把权限表遍历一遍,设定要勾选的权限 action
  113. this.permissions.forEach(permission => {
  114. permission.selected = permissionsAction[permission.id]
  115. })
  116. }
  117. this.$nextTick(() => {
  118. this.form.setFieldsValue(pick(this.mdl, 'id', 'name', 'status', 'describe'))
  119. })
  120. console.log('this.mdl', this.mdl)
  121. },
  122. close () {
  123. this.$emit('close')
  124. this.visible = false
  125. },
  126. handleOk () {
  127. const _this = this
  128. // 触发表单验证
  129. this.form.validateFields((err, values) => {
  130. // 验证表单没错误
  131. if (!err) {
  132. console.log('form values', values)
  133. _this.confirmLoading = true
  134. // 模拟后端请求 2000 毫秒延迟
  135. new Promise((resolve) => {
  136. setTimeout(() => resolve(), 2000)
  137. }).then(() => {
  138. // Do something
  139. _this.$message.success('保存成功')
  140. _this.$emit('ok')
  141. }).catch(() => {
  142. // Do something
  143. }).finally(() => {
  144. _this.confirmLoading = false
  145. _this.close()
  146. })
  147. }
  148. })
  149. },
  150. handleCancel () {
  151. this.close()
  152. },
  153. onChangeCheck (permission) {
  154. permission.indeterminate = !!permission.selected.length && (permission.selected.length < permission.actionsOptions.length)
  155. permission.checkedAll = permission.selected.length === permission.actionsOptions.length
  156. },
  157. onChangeCheckAll (e, permission) {
  158. Object.assign(permission, {
  159. selected: e.target.checked ? permission.actionsOptions.map(obj => obj.value) : [],
  160. indeterminate: false,
  161. checkedAll: e.target.checked
  162. })
  163. },
  164. loadPermissions () {
  165. getPermissions().then(res => {
  166. let result = res.result
  167. this.permissions = result.map(permission => {
  168. const options = actionToObject(permission.actionData)
  169. permission.checkedAll = false
  170. permission.selected = []
  171. permission.indeterminate = false
  172. permission.actionsOptions = options.map(option => {
  173. return {
  174. label: option.describe,
  175. value: option.action
  176. }
  177. })
  178. return permission
  179. })
  180. })
  181. }
  182. }
  183. }
  184. </script>
  185. <style scoped>
  186. </style>