index.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655
  1. <template>
  2. <div class="app-container">
  3. <el-row :gutter="20">
  4. <!--侧边部门数据-->
  5. <el-col :xs="9" :sm="6" :md="5" :lg="4" :xl="4">
  6. <div class="head-container">
  7. <el-input
  8. v-model="deptName"
  9. clearable
  10. size="small"
  11. placeholder="输入部门名称搜索"
  12. prefix-icon="el-icon-search"
  13. class="filter-item"
  14. @input="getDeptDatas"
  15. />
  16. </div>
  17. <el-tree
  18. :data="deptDatas"
  19. :load="getDeptDatas"
  20. :props="defaultProps"
  21. :expand-on-click-node="false"
  22. lazy
  23. @node-click="handleNodeClick"
  24. />
  25. </el-col>
  26. <!--用户数据-->
  27. <el-col :xs="15" :sm="18" :md="19" :lg="20" :xl="20">
  28. <!--工具栏-->
  29. <div class="head-container">
  30. <div v-if="crud.props.searchToggle">
  31. <!-- 搜索 -->
  32. <el-input
  33. v-model="query.blurry"
  34. clearable
  35. size="small"
  36. placeholder="输入名称或者邮箱搜索"
  37. style="width: 200px;"
  38. class="filter-item"
  39. @keyup.enter.native="crud.toQuery"
  40. />
  41. <date-range-picker v-model="query.createTime" class="date-item" />
  42. <el-select
  43. v-model="query.enabled"
  44. clearable
  45. size="small"
  46. placeholder="状态"
  47. class="filter-item"
  48. style="width: 90px"
  49. @change="crud.toQuery"
  50. >
  51. <el-option
  52. v-for="item in enabledTypeOptions"
  53. :key="item.key"
  54. :label="item.display_name"
  55. :value="item.key"
  56. />
  57. </el-select>
  58. <rrOperation />
  59. </div>
  60. <crudOperation show="" :permission="permission" />
  61. <!-- <el-button-->
  62. <!-- :disabled="crud.selections.length === 0"-->
  63. <!-- :loading="unbindLoading"-->
  64. <!-- @click="toUnBind(crud.selections)"-->
  65. <!-- >解绑-->
  66. <!-- </el-button>-->
  67. </div>
  68. <!--表单渲染-->
  69. <el-dialog append-to-body :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title" width="570px">
  70. <el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="66px">
  71. <el-form-item label="账号" prop="username">
  72. <el-input v-model="form.username" />
  73. </el-form-item>
  74. <el-form-item label="手机号" prop="phone">
  75. <el-input v-model.number="form.phone" />
  76. </el-form-item>
  77. <el-form-item label="用户名称" prop="nickName">
  78. <el-input v-model="form.nickName" />
  79. </el-form-item>
  80. <!-- <el-form-item label="用户名称" prop="dmUser.id">-->
  81. <!-- <el-select-->
  82. <!-- v-model="form.dmUser.id"-->
  83. <!-- style="width: 193px"-->
  84. <!-- filterable-->
  85. <!-- placeholder="请选择"-->
  86. <!-- >-->
  87. <!-- &lt;!&ndash; <el-option value="">请选择</el-option> &ndash;&gt;-->
  88. <!-- <el-option-->
  89. <!-- v-for="item in dmUsers"-->
  90. <!-- :key="item.name"-->
  91. <!-- :label="item.name"-->
  92. <!-- :value="item.id"-->
  93. <!-- />-->
  94. <!-- </el-select>-->
  95. <!-- </el-form-item>-->
  96. <!-- <el-form-item label="所属单位" prop="dmCompany.companyId">-->
  97. <!-- <el-select-->
  98. <!-- v-model="form.dmCompany.companyId"-->
  99. <!-- style="width: 193px"-->
  100. <!-- filterable-->
  101. <!-- placeholder="请选择"-->
  102. <!-- >-->
  103. <!-- &lt;!&ndash; <el-option value="">请选择</el-option> &ndash;&gt;-->
  104. <!-- <el-option-->
  105. <!-- v-for="item in dmCompanies"-->
  106. <!-- :key="item.fullName"-->
  107. <!-- :label="item.fullName"-->
  108. <!-- :value="item.companyId"-->
  109. <!-- />-->
  110. <!-- </el-select>-->
  111. <!-- </el-form-item>-->
  112. <el-form-item v-if="form.id == null" label="初始密码" prop="orgPassword">
  113. <el-input v-model="form.orgPassword" />
  114. </el-form-item>
  115. <el-form-item label="限制次数" prop="errLimit">
  116. <el-input v-model="form.errLimit" />
  117. </el-form-item>
  118. <el-form-item label="备注" prop="remark">
  119. <el-input v-model="form.remark" />
  120. </el-form-item>
  121. <el-form-item label="邮箱" prop="email">
  122. <el-input v-model="form.email" />
  123. </el-form-item>
  124. <el-form-item label="工号" prop="userCode">
  125. <el-input v-model="form.userCode" />
  126. </el-form-item>
  127. <el-form-item label="部门" prop="dept.id">
  128. <!-- <treeselect-->
  129. <!-- v-model="form.dept.id"-->
  130. <!-- :options="depts"-->
  131. <!-- :load-options="loadDepts"-->
  132. <!-- style="width: 178px"-->
  133. <!-- placeholder="选择部门"-->
  134. <!-- />-->
  135. <el-select
  136. v-model="form.dept.id"
  137. style="width: 300px"
  138. filterable
  139. :filter-method="filterDept"
  140. placeholder="搜索部门名称"
  141. >
  142. <el-option
  143. v-for="item in deptList"
  144. :key="item.id"
  145. :label="item.name"
  146. :value="item.id"
  147. />
  148. </el-select>
  149. </el-form-item>
  150. <el-form-item label="岗位" prop="jobs">
  151. <el-select
  152. v-model="jobDatas"
  153. style="width: 178px"
  154. multiple
  155. placeholder="请选择"
  156. @remove-tag="deleteTag"
  157. @change="changeJob"
  158. >
  159. <el-option
  160. v-for="item in jobs"
  161. :key="item.name"
  162. :label="item.name"
  163. :value="item.id"
  164. />
  165. </el-select>
  166. </el-form-item>
  167. <el-form-item label="性别">
  168. <el-radio-group v-model="form.gender" style="width: 178px">
  169. <el-radio label="男">男</el-radio>
  170. <el-radio label="女">女</el-radio>
  171. </el-radio-group>
  172. </el-form-item>
  173. <el-form-item label="状态">
  174. <el-radio-group v-model="form.enabled" :disabled="form.id === user.id" style="width: 193px">
  175. <el-radio
  176. v-for="item in dict.user_status"
  177. :key="item.id"
  178. :label="item.value"
  179. >{{ item.label }}</el-radio>
  180. </el-radio-group>
  181. </el-form-item>
  182. <el-form-item style="margin-bottom: 0;" label="角色" prop="roles">
  183. <el-select
  184. v-model="roleDatas"
  185. style="width: 437px"
  186. multiple
  187. placeholder="请选择"
  188. @remove-tag="deleteTag"
  189. @change="changeRole"
  190. >
  191. <el-option
  192. v-for="item in roles"
  193. :key="item.name"
  194. :disabled="level !== 1 && item.level <= level"
  195. :label="item.name"
  196. :value="item.id"
  197. />
  198. </el-select>
  199. </el-form-item>
  200. </el-form>
  201. <div slot="footer" class="dialog-footer">
  202. <el-button type="text" @click="crud.cancelCU">取消</el-button>
  203. <el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
  204. </div>
  205. </el-dialog>
  206. <!--表格渲染-->
  207. <el-table ref="table" v-loading="crud.loading" :data="crud.data" style="width: 100%;" @selection-change="crud.selectionChangeHandler">
  208. <el-table-column :selectable="checkboxT" type="selection" width="55" />
  209. <el-table-column :show-overflow-tooltip="true" prop="username" label="账号" />
  210. <el-table-column :show-overflow-tooltip="true" prop="dmUser.name" label="用户名称" />
  211. <el-table-column :show-overflow-tooltip="true" prop="dmCompany.fullName" label="所属单位" />
  212. <el-table-column prop="gender" label="性别" />
  213. <el-table-column :show-overflow-tooltip="true" prop="phone" width="100" label="手机号" />
  214. <el-table-column :show-overflow-tooltip="true" width="135" prop="email" label="邮箱" />
  215. <el-table-column :show-overflow-tooltip="true" prop="dept" label="部门">
  216. <template slot-scope="scope">
  217. <div>{{ scope.row.dept.name }}</div>
  218. </template>
  219. </el-table-column>
  220. <el-table-column label="状态" align="center" prop="enabled">
  221. <template slot-scope="scope">
  222. <el-switch
  223. v-model="scope.row.enabled"
  224. :disabled="user.id === scope.row.id"
  225. active-color="#409EFF"
  226. inactive-color="#F56C6C"
  227. @change="changeEnabled(scope.row, scope.row.enabled)"
  228. />
  229. </template>
  230. </el-table-column>
  231. <el-table-column :show-overflow-tooltip="true" prop="errLimit" width="100" label="限制次数" />
  232. <el-table-column :show-overflow-tooltip="true" prop="remark" width="100" label="备注" />
  233. <el-table-column :show-overflow-tooltip="true" prop="createTime" width="135" label="创建日期" />
  234. <el-table-column
  235. v-if="checkPer(['admin','user:edit','user:del'])"
  236. label="操作"
  237. width="115"
  238. align="center"
  239. fixed="right"
  240. >
  241. <template slot-scope="scope">
  242. <udOperation
  243. :data="scope.row"
  244. :permission="permission"
  245. :disabled-dle="scope.row.id === user.id"
  246. />
  247. </template>
  248. </el-table-column>
  249. </el-table>
  250. <!--分页组件-->
  251. <pagination />
  252. </el-col>
  253. </el-row>
  254. </div>
  255. </template>
  256. <script>
  257. import crudUser from '@/api/system/user'
  258. import { isvalidPhone } from '@/utils/validate'
  259. import { getDepts, getDeptSuperior, getAllDept } from '@/api/system/dept'
  260. import { getAll, getLevel } from '@/api/system/role'
  261. import { getAllJob } from '@/api/system/job'
  262. import { getAllDmUser } from '@/api/dm/user/dmUser'
  263. import { getAllCompany } from '@/api/dm/company/dmCompany'
  264. import CRUD, { presenter, header, form, crud } from '@crud/crud'
  265. import rrOperation from '@crud/RR.operation'
  266. import crudOperation from '@crud/CRUD.operation'
  267. import udOperation from '@crud/UD.operation'
  268. import pagination from '@crud/Pagination'
  269. import DateRangePicker from '@/components/DateRangePicker'
  270. import { mapGetters } from 'vuex'
  271. import '@riophae/vue-treeselect/dist/vue-treeselect.css'
  272. import { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect'
  273. let userRoles = []
  274. let userJobs = []
  275. const defaultForm = { id: null, username: null, nickName: null, gender: '男', email: null, enabled: 'false', roles: [], jobs: [], dept: { id: null }, phone: null, dmUser: { id: null }, dmCompany: { companyId: null }, orgPassword: null, errLimit: null, remark: null, userCode: null }
  276. const optShow = {
  277. add: false,
  278. edit: false,
  279. del: false,
  280. download: true,
  281. reset: false
  282. }
  283. export default {
  284. name: 'User',
  285. components: { /* Treeselect, */ crudOperation, rrOperation, udOperation, pagination, DateRangePicker },
  286. cruds() {
  287. return CRUD({ title: '用户', url: 'api/users', crudMethod: { ...crudUser }, optShow: optShow })
  288. },
  289. mixins: [presenter(), header(), form(defaultForm), crud()],
  290. // 数据字典
  291. dicts: ['user_status'],
  292. data() {
  293. // 自定义验证
  294. const validPhone = (rule, value, callback) => {
  295. if (!value) {
  296. callback(new Error('请输入手机号号码'))
  297. } else if (!isvalidPhone(value)) {
  298. callback(new Error('请输入正确的11位手机号码'))
  299. } else {
  300. callback()
  301. }
  302. }
  303. const validPassword = (rule, value, callback) => {
  304. if (!value) {
  305. callback(new Error('请输入初始密码'))
  306. }
  307. // 校验初始密码:大写英文+小写英文+数字,长度限制为不少于8位数
  308. /* if(value.length < 8){
  309. callback(new Error('请设置为长度不少于8位的字符串(大写英文+小写英文+数字)'))
  310. } */
  311. var reg = /^[0-9A-Za-z]{8,20}$/
  312. var p = new RegExp(reg)
  313. if (!p.test(value)) {
  314. callback(new Error('请设置为长度8-20位的字符串(大写英文+小写英文+数字)'))
  315. } else {
  316. callback()
  317. }
  318. }
  319. const validErrLimit = (rule, value, callback) => {
  320. if (!value) {
  321. callback(new Error('请输入限制次数'))
  322. }
  323. // 校验限定次数
  324. var reg = /^\d+$/
  325. var p = new RegExp(reg)
  326. if (!p.test(value)) {
  327. callback(new Error('请设置为正整数'))
  328. } else {
  329. callback()
  330. }
  331. }
  332. return {
  333. height: document.documentElement.clientHeight - 180 + 'px;',
  334. deptName: '',
  335. depts: [],
  336. deptDatas: [],
  337. deptList: [],
  338. jobs: [],
  339. level: 3,
  340. roles: [],
  341. dmUsers: [],
  342. dmCompanies: [],
  343. jobDatas: [],
  344. roleDatas: [], // 多选时使用
  345. defaultProps: { children: 'children', label: 'name', isLeaf: 'leaf' },
  346. permission: {
  347. add: ['admin', 'user:add'],
  348. edit: ['admin', 'user:edit'],
  349. del: ['admin', 'user:del']
  350. },
  351. enabledTypeOptions: [
  352. { key: 'true', display_name: '激活' },
  353. { key: 'false', display_name: '锁定' }
  354. ],
  355. unbindLoading: false, // 解绑中
  356. rules: {
  357. username: [
  358. { required: true, message: '请输入账号', trigger: 'blur' },
  359. { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }
  360. ],
  361. nickName: [
  362. { required: true, message: '请输入用户名称', trigger: 'blur' },
  363. { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }
  364. ],
  365. email: [
  366. { required: true, message: '请输入邮箱地址', trigger: 'blur' },
  367. { type: 'email', message: '请输入正确的邮箱地址', trigger: 'blur' }
  368. ],
  369. userCode: [
  370. { required: true, message: '请输入工号', trigger: 'blur' }
  371. ],
  372. /* 'dmUser.id': [{ required: true, message: '请选择绑定用户', trigger: 'blur' }], */
  373. phone: [
  374. { required: true, trigger: 'blur', validator: validPhone }
  375. ],
  376. orgPassword: [
  377. { required: true, trigger: 'blur', validator: validPassword }
  378. ],
  379. errLimit: [
  380. { required: true, trigger: 'blur', validator: validErrLimit }
  381. ]
  382. }
  383. }
  384. },
  385. computed: {
  386. ...mapGetters([
  387. 'user'
  388. ])
  389. },
  390. created() {
  391. this.crud.msg.add = '新增成功'
  392. },
  393. mounted: function() {
  394. const that = this
  395. window.onresize = function temp() {
  396. that.height = document.documentElement.clientHeight - 180 + 'px;'
  397. }
  398. },
  399. methods: {
  400. changeRole(value) {
  401. userRoles = []
  402. value.forEach(function(data, index) {
  403. const role = { id: data }
  404. userRoles.push(role)
  405. })
  406. },
  407. changeJob(value) {
  408. userJobs = []
  409. value.forEach(function(data, index) {
  410. const job = { id: data }
  411. userJobs.push(job)
  412. })
  413. },
  414. deleteTag(value) {
  415. userRoles.forEach(function(data, index) {
  416. if (data.id === value) {
  417. userRoles.splice(index, value)
  418. }
  419. })
  420. },
  421. toUnBind(datas) {
  422. var self = this
  423. this.$confirm(`确认解绑选中的${datas.length}个账号关联的用户?`, '提示', {
  424. confirmButtonText: '确定',
  425. cancelButtonText: '取消',
  426. type: 'warning'
  427. }).then(() => {
  428. self.unbindLoading = true
  429. const ids = []
  430. if (datas instanceof Array) {
  431. datas.forEach(val => {
  432. ids.push(self.crud.getDataId(val))
  433. })
  434. } else {
  435. ids.push(self.crud.getDataId(datas))
  436. }
  437. console.log('解绑id集合 ==>> ' + JSON.stringify(ids))
  438. crudUser.unbindDmUser(ids).then(res => {
  439. console.log('解绑成功')
  440. self.unbindLoading = false
  441. self.crud.refresh()
  442. }).catch((err) => {
  443. console.error(err)
  444. self.unbindLoading = false
  445. })
  446. }).catch((err) => {
  447. console.log(err)
  448. })
  449. },
  450. // 新增与编辑前做的操作
  451. [CRUD.HOOK.afterToCU](crud, form) {
  452. this.getRoles()
  453. this.getDeptList()
  454. this.getRoleLevel()
  455. this.getJobs()
  456. this.getAllDmUser(form.id)
  457. this.getAllCompany()
  458. form.enabled = form.enabled.toString()
  459. },
  460. // 新增前将多选的值设置为空
  461. [CRUD.HOOK.beforeToAdd]() {
  462. this.jobDatas = []
  463. this.roleDatas = []
  464. },
  465. // 初始化编辑时候的角色与岗位
  466. [CRUD.HOOK.beforeToEdit](crud, form) {
  467. this.getJobs(this.form.dept.id)
  468. this.jobDatas = []
  469. this.roleDatas = []
  470. userRoles = []
  471. userJobs = []
  472. const _this = this
  473. form.roles.forEach(function(role, index) {
  474. _this.roleDatas.push(role.id)
  475. const rol = { id: role.id }
  476. userRoles.push(rol)
  477. })
  478. form.jobs.forEach(function(job, index) {
  479. _this.jobDatas.push(job.id)
  480. const data = { id: job.id }
  481. userJobs.push(data)
  482. })
  483. },
  484. // 提交前做的操作
  485. [CRUD.HOOK.afterValidateCU](crud) {
  486. if (!crud.form.dept.id) {
  487. this.$message({
  488. message: '部门不能为空',
  489. type: 'warning'
  490. })
  491. return false
  492. } else if (this.jobDatas.length === 0) {
  493. this.$message({
  494. message: '岗位不能为空',
  495. type: 'warning'
  496. })
  497. return false
  498. } else if (this.roleDatas.length === 0) {
  499. this.$message({
  500. message: '角色不能为空',
  501. type: 'warning'
  502. })
  503. return false
  504. }
  505. crud.form.roles = userRoles
  506. crud.form.jobs = userJobs
  507. return true
  508. },
  509. // 获取左侧部门数据
  510. getDeptDatas(node, resolve) {
  511. const sort = 'id,desc'
  512. const params = { sort: sort }
  513. if (typeof node !== 'object') {
  514. if (node) {
  515. params['name'] = node
  516. }
  517. } else if (node.level !== 0) {
  518. params['pid'] = node.data.id
  519. }
  520. setTimeout(() => {
  521. getDepts(params).then(res => {
  522. if (resolve) {
  523. resolve(res.content)
  524. } else {
  525. this.deptDatas = res.content
  526. }
  527. })
  528. }, 100)
  529. },
  530. getDepts() {
  531. getDepts({ enabled: true }).then(res => {
  532. this.depts = res.content.map(function(obj) {
  533. if (obj.hasChildren) {
  534. obj.children = null
  535. }
  536. return obj
  537. })
  538. })
  539. },
  540. getSupDepts(deptId) {
  541. getDeptSuperior(deptId).then(res => {
  542. const date = res.content
  543. this.buildDepts(date)
  544. this.depts = date
  545. })
  546. },
  547. buildDepts(depts) {
  548. depts.forEach(data => {
  549. if (data.children) {
  550. this.buildDepts(data.children)
  551. }
  552. if (data.hasChildren && !data.children) {
  553. data.children = null
  554. }
  555. })
  556. },
  557. // 获取弹窗内部门数据
  558. loadDepts({ action, parentNode, callback }) {
  559. if (action === LOAD_CHILDREN_OPTIONS) {
  560. getDepts({ enabled: true, pid: parentNode.id }).then(res => {
  561. parentNode.children = res.content.map(function(obj) {
  562. if (obj.hasChildren) {
  563. obj.children = null
  564. }
  565. return obj
  566. })
  567. setTimeout(() => {
  568. callback()
  569. }, 200)
  570. })
  571. }
  572. },
  573. // 切换部门
  574. handleNodeClick(data) {
  575. if (data.pid === 0) {
  576. this.query.deptId = null
  577. } else {
  578. this.query.deptId = data.id
  579. }
  580. this.crud.toQuery()
  581. },
  582. // 改变状态
  583. changeEnabled(data, val) {
  584. this.$confirm('此操作将 "' + this.dict.label.user_status[val] + '" ' + data.username + ', 是否继续?', '提示', {
  585. confirmButtonText: '确定',
  586. cancelButtonText: '取消',
  587. type: 'warning'
  588. }).then(() => {
  589. crudUser.edit(data).then(res => {
  590. this.crud.notify(this.dict.label.user_status[val] + '成功', CRUD.NOTIFICATION_TYPE.SUCCESS)
  591. }).catch(() => {
  592. data.enabled = !data.enabled
  593. })
  594. }).catch(() => {
  595. data.enabled = !data.enabled
  596. })
  597. },
  598. // 获取弹窗内角色数据
  599. getRoles() {
  600. getAll().then(res => {
  601. this.roles = res
  602. }).catch(() => { })
  603. },
  604. // 获取弹窗内岗位数据
  605. getJobs() {
  606. getAllJob().then(res => {
  607. this.jobs = res.content
  608. }).catch(() => { })
  609. },
  610. // 获取弹窗内DM用户数据
  611. getAllDmUser(params) {
  612. getAllDmUser(params).then(res => {
  613. this.dmUsers = res
  614. }).catch(() => { })
  615. },
  616. // 获取弹窗内DM单位数据
  617. getAllCompany() {
  618. getAllCompany().then(res => {
  619. this.dmCompanies = res.content
  620. // console.log('dmCompanies ==>> ' + JSON.stringify(res))
  621. }).catch(() => { })
  622. },
  623. // 获取权限级别
  624. getRoleLevel() {
  625. getLevel().then(res => {
  626. this.level = res.level
  627. }).catch(() => { })
  628. },
  629. checkboxT(row, rowIndex) {
  630. return row.id !== this.user.id
  631. },
  632. getDeptList() {
  633. getAllDept().then(res => {
  634. this.deptList = res.content
  635. })
  636. },
  637. filterDept(val) {
  638. getDepts({ name: val }).then(res => {
  639. this.deptList = res.content
  640. })
  641. }
  642. }
  643. }
  644. </script>
  645. <style rel="stylesheet/scss" lang="scss" scoped>
  646. ::v-deep .vue-treeselect__control,::v-deep .vue-treeselect__placeholder,::v-deep .vue-treeselect__single-value {
  647. height: 30px;
  648. line-height: 30px;
  649. }
  650. .el-form-item .el-form-item__label{
  651. width: 90px !important;
  652. }
  653. </style>