department.vue 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829
  1. <template>
  2. <div class="app-container">
  3. <div class="tree-container">
  4. <div style="padding: 10px; display: flex;">
  5. <el-button icon="el-icon-refresh-right" size="small" @click="refreshDepartment()" style="padding: 9px 10px; margin-right: 6px"></el-button>
  6. <el-input
  7. placeholder="输入关键字进行过滤"
  8. size="small"
  9. clearable
  10. v-model="filterText">
  11. </el-input>
  12. </div>
  13. <el-tree
  14. :data="departmentList"
  15. :props="defaultProps"
  16. default-expand-all
  17. highlight-current
  18. :expand-on-click-node="false"
  19. :filter-node-method="filterNode"
  20. @node-click="handleNodeClick"
  21. node-key="id"
  22. ref="listTree">
  23. <div class="custom-tree-node" slot-scope="{ node, data }">
  24. <i :class="data.children && data.children.length > 0 ? 'el-icon-folder-opened':'el-icon-document-remove'"></i><span>{{ node.label }}</span>
  25. </div>
  26. </el-tree>
  27. </div>
  28. <div class="mymain-container">
  29. <div class="screen-container">
  30. <!-- <div class="top clearfix">
  31. <div class="title fl">条件筛选</div>
  32. </div> -->
  33. <el-form ref="screenForm" :model="screenForm" label-width="70px" size="small" label-position="left">
  34. <el-row :gutter="20">
  35. <el-col :xs="24" :sm="12" :lg="12">
  36. <el-form-item label="账号名称" prop="name">
  37. <el-input v-model="screenForm.name" placeholder="请输入账号名称"></el-input>
  38. </el-form-item>
  39. </el-col>
  40. <el-col :xs="24" :sm="12" :lg="12" class="tr">
  41. <el-form-item label="">
  42. <el-button size="small" @click="resetScreenForm">清空</el-button>
  43. <el-button size="small" type="primary" @click="submitScreenForm">搜索</el-button>
  44. </el-form-item>
  45. </el-col>
  46. </el-row>
  47. </el-form>
  48. </div>
  49. <div class="btn-group clearfix" style="margin-top: 20px">
  50. <div class="fl">
  51. <el-button size="small" type="primary" @click="openDepartmentForm('add')">添加部门</el-button>
  52. <el-button size="small" type="primary" @click="openDepartmentForm('edit')">编辑部门</el-button>
  53. <el-divider direction="vertical"></el-divider>
  54. <el-button size="small" type="primary" @click="openMemberForm('add')">添加账号</el-button>
  55. </div>
  56. <div class="fr">
  57. <!-- <el-upload
  58. class="import-btn"
  59. style="height: 0; width: 0; overflow: hidden;"
  60. :action="baseURL + 'student/import'"
  61. :http-request="handleImport"
  62. :file-list="importFileList"
  63. v-if="checkBtnRole('import')"
  64. >
  65. <el-button size="small" type="primary" :loading="importLoading">{{ importLoading ? '导入中...' : '导入' }}</el-button>
  66. </el-upload>
  67. <el-button size="small" type="primary" @click="handleExport">导出</el-button>
  68. <el-button size="small" type="primary" :loading="importLoading" @click="clickImport">{{ importLoading ? '导入中...' : '导入' }}</el-button>
  69. <el-button size="small" @click="handleDownload" v-if="checkBtnRole('download')">下载导入模板</el-button> -->
  70. </div>
  71. </div>
  72. <div class="table">
  73. <el-table v-loading="listLoading" :data="dataList" element-loading-text="Loading" border fit highlight-current-row stripe>
  74. <!-- <el-table-column align="center" type="selection" width="55" fixed></el-table-column> -->
  75. <el-table-column align="center" label="账号" prop="userName" min-width="120"></el-table-column>
  76. <el-table-column align="center" label="用户名" prop="nickName" min-width="120"></el-table-column>
  77. <el-table-column align="center" label="角色" prop="roleName" min-width="100"></el-table-column>
  78. <el-table-column align="center" label="创建时间" prop="createTime" min-width="160"></el-table-column>
  79. <el-table-column align="center" label="最后登录时间" prop="lastLoginTime" min-width="160"></el-table-column>
  80. <el-table-column align="center" label="状态" class-name="status-col">
  81. <template slot-scope="scope">
  82. <el-tag :type="scope.row.status ? 'success':'danger'">{{ scope.row.status ? '正常':'冻结' }}</el-tag>
  83. </template>
  84. </el-table-column>
  85. <el-table-column align="center" label="操作" min-width="200">
  86. <template slot-scope="scope">
  87. <template v-if="checkBtnRole('status')">
  88. <el-popconfirm v-if="scope.row.status" style="margin-right: 10px;" title="确定冻结吗?" @onConfirm="changeStatus(scope.row.adminUserId, 0)" >
  89. <el-button slot="reference" type="text">冻结</el-button>
  90. </el-popconfirm>
  91. <el-popconfirm v-else style="margin-right: 10px;" title="确定恢复吗?" @onConfirm="changeStatus(scope.row.adminUserId, 1)" >
  92. <el-button slot="reference" type="text">恢复</el-button>
  93. </el-popconfirm>
  94. </template>
  95. <el-button type="text" @click="openMemberForm('edit', scope.row.adminUserId)" v-if="checkBtnRole('edit')">编辑</el-button>
  96. <el-button type="text" @click="handleReset(scope.row.adminUserId)" v-if="checkBtnRole('reset')">重置密码</el-button>
  97. <el-popconfirm style="margin-left: 10px;" title="确定删除吗?" @onConfirm="deleteMember(scope.row.id)" v-if="checkBtnRole('del')">
  98. <el-button slot="reference" type="text">删除</el-button>
  99. </el-popconfirm>
  100. </template>
  101. </el-table-column>
  102. </el-table>
  103. </div>
  104. <div class="pagination clearfix">
  105. <div class="fr">
  106. <el-pagination
  107. @size-change="handleSizeChange"
  108. @current-change="handleCurrentChange"
  109. :current-page="currentPage"
  110. :page-sizes="[10, 20, 30, 50]"
  111. :page-size="10"
  112. layout="total, sizes, prev, pager, next, jumper"
  113. :total="listTotal">
  114. </el-pagination>
  115. </div>
  116. </div>
  117. </div>
  118. <!-- 添加编辑部门 -->
  119. <el-dialog :title="departmentFormType == 'add' ? '添加部门':'编辑部门'" :visible.sync="departmentFormVisible" :show-close="false" width="40%" :close-on-click-modal="false">
  120. <el-form ref="departmentForm" :model="departmentForm" :rules="departmentFormRules" label-position="right" label-width="80px">
  121. <el-form-item label="部门名称" prop="name">
  122. <el-input placeholder="请输入部门名称" v-model="departmentForm.name"></el-input>
  123. </el-form-item>
  124. </el-form>
  125. <div slot="footer" class="dialog-footer">
  126. <el-button @click="cancelDepartmentForm">取 消</el-button>
  127. <el-button type="primary" @click="submitDepartmentForm">确 定</el-button>
  128. </div>
  129. </el-dialog>
  130. <!-- 添加编辑账号 -->
  131. <el-dialog :title="memberFormType == 'add' ? '添加账号':'编辑账号'" :visible.sync="memberFormVisible" :show-close="false" width="40%" :close-on-click-modal="false">
  132. <el-form ref="memberForm" :model="memberForm" :rules="memberFormRules" label-position="left" label-width="80px">
  133. <el-form-item label="账号" prop="account">
  134. <el-input v-model="memberForm.account" autocomplete="off" placeholder="请输入账号"></el-input>
  135. </el-form-item>
  136. <el-form-item label="用户名" prop="nickName">
  137. <el-input v-model="memberForm.nickName" autocomplete="off" placeholder="请输入用户名"></el-input>
  138. </el-form-item>
  139. <el-form-item label="角色组" prop="role">
  140. <el-select v-model="memberForm.role" placeholder="请选择角色组" style="width: 100%;">
  141. <el-option :label="item.name" :value="item.adminRoleId" v-for="(item, index) in roleList" :key="index"></el-option>
  142. </el-select>
  143. </el-form-item>
  144. <el-form-item label="部门" prop="department" v-show="accountType === 0">
  145. <el-tree
  146. :data="departmentList"
  147. show-checkbox
  148. node-key="adminWebsitId"
  149. ref="tree"
  150. highlight-current
  151. :props="props">
  152. </el-tree>
  153. </el-form-item>
  154. <el-form-item label="商户" prop="merchant" v-show="accountType === 1 || accountType === 2">
  155. <el-select v-model="memberForm.merchant" placeholder="请选择商户" style="width: 100%;">
  156. <el-option :label="item.adminCompanyName" :value="item.adminCompanyId" v-for="(item, index) in merchantList" :key="index"></el-option>
  157. </el-select>
  158. </el-form-item>
  159. <el-form-item label="密码" prop="newPassword">
  160. <el-input v-model="memberForm.newPassword" ref="password1" autocomplete="off" placeholder="请输入密码" :type="passwordType1"></el-input>
  161. <span class="show-pwd" @click="showPwd(1)">
  162. <svg-icon :icon-class="passwordType1 === 'password' ? 'eye' : 'eye-open'" />
  163. </span>
  164. </el-form-item>
  165. <el-form-item label="确认密码" prop="confirmPassword">
  166. <el-input v-model="memberForm.confirmPassword" ref="password2" autocomplete="off" placeholder="请再次输入密码" :type="passwordType2"></el-input>
  167. <span class="show-pwd" @click="showPwd(2)">
  168. <svg-icon :icon-class="passwordType2 === 'password' ? 'eye' : 'eye-open'" />
  169. </span>
  170. </el-form-item>
  171. </el-form>
  172. <div slot="footer" class="dialog-footer">
  173. <el-button @click="cancelMemberForm">取 消</el-button>
  174. <el-button type="primary" @click="submitMemberForm">确 定</el-button>
  175. </div>
  176. </el-dialog>
  177. <!-- 重置密码 -->
  178. <el-dialog title="重置密码" :visible.sync="resetFormVisible" :show-close="false" width="40%" :close-on-click-modal="false">
  179. <el-form ref="resetForm" :model="resetForm" :rules="resetFormRules" label-position="left" label-width="100px">
  180. <el-form-item label="输入新密码" prop="newPassword">
  181. <el-input v-model="resetForm.newPassword" ref="password1" autocomplete="off" placeholder="请输入新密码" :type="passwordType1"></el-input>
  182. <span class="show-pwd" @click="showPwd(1)">
  183. <svg-icon :icon-class="passwordType1 === 'password' ? 'eye' : 'eye-open'" />
  184. </span>
  185. </el-form-item>
  186. <el-form-item label="确认密码" prop="confirmPassword">
  187. <el-input v-model="resetForm.confirmPassword" ref="password2" autocomplete="off" placeholder="请再次输入新密码" :type="passwordType2"></el-input>
  188. <span class="show-pwd" @click="showPwd(2)">
  189. <svg-icon :icon-class="passwordType2 === 'password' ? 'eye' : 'eye-open'" />
  190. </span>
  191. </el-form-item>
  192. </el-form>
  193. <div slot="footer" class="dialog-footer">
  194. <el-button @click="cancelResetForm">取 消</el-button>
  195. <el-button type="primary" @click="submitResetForm">确 定</el-button>
  196. </div>
  197. </el-dialog>
  198. </div>
  199. </template>
  200. <script>
  201. import {
  202. getDepartmentList, addDepartment, editDepartment, deleteDepartment,
  203. getMemberList, addMember, editMember, deleteMember, getMemberDetail, getRoleList, getMerchantList, changeAccountStatus, resetPassword
  204. } from '@/api/merchant'
  205. import { findElem, downloadFiles, handleImport } from '@/utils/util'
  206. export default {
  207. data() {
  208. var validatePass = (rule, value, callback) => {
  209. if (value === '') {
  210. callback(new Error('请输入新密码'));
  211. } else if (value && value.length < 6) {
  212. callback(new Error('密码长度至少6位'));
  213. } else {
  214. if (this.resetForm.confirmPassword !== '') {
  215. this.$refs.resetForm.validateField('confirmPassword');
  216. }
  217. callback();
  218. }
  219. };
  220. var validatePass2 = (rule, value, callback) => {
  221. if (value === '') {
  222. callback(new Error('请再次输入密码'));
  223. } else if (value !== this.resetForm.newPassword) {
  224. callback(new Error('两次输入密码不一致'));
  225. } else {
  226. callback();
  227. }
  228. };
  229. var validatePass3 = (rule, value, callback) => {
  230. if (value === '') {
  231. callback(new Error('请输入新密码'));
  232. } else if (value && value.length < 6) {
  233. callback(new Error('密码长度至少6位'));
  234. } else {
  235. if (this.memberForm.confirmPassword !== '') {
  236. this.$refs.memberForm.validateField('confirmPassword');
  237. }
  238. callback();
  239. }
  240. };
  241. var validatePass4 = (rule, value, callback) => {
  242. if (value === '') {
  243. callback(new Error('请再次输入密码'));
  244. } else if (value !== this.memberForm.newPassword) {
  245. callback(new Error('两次输入密码不一致'));
  246. } else {
  247. callback();
  248. }
  249. };
  250. return {
  251. baseURL: process.env.VUE_APP_BASE_API,
  252. dataList: null, // 列表数据
  253. moduleList: null, // 模块列表
  254. listLoading: true, // 列表加载loading
  255. screenForm: { // 筛选表单数据
  256. name: '', // 名称
  257. },
  258. currentPage: 1, // 当前页码
  259. pageSize: 10, // 每页数量
  260. listTotal: 0, // 列表总数
  261. departmentFormType: 'add',
  262. departmentFormVisible: false,
  263. departmentForm: {
  264. name: '',
  265. },
  266. departmentFormRules: {
  267. name: [
  268. { required: true, message: '请填写部门名称', trigger: 'blur' },
  269. ],
  270. },
  271. selectDepartment: null, // 选中的部门
  272. memberFormType: 'add',
  273. memberFormVisible: false,
  274. memberForm: {
  275. account: '', // 账号
  276. nickName: '', // 用户名
  277. merchant: '', // 商户
  278. role: '', // 角色组
  279. newPassword: '', // 新密码
  280. confirmPassword: '', // 确认密码
  281. },
  282. memberFormRules: {
  283. account: [
  284. { required: true, message: '请输入账号', trigger: 'blur' }
  285. ],
  286. nickName: [
  287. { required: true, message: '请输入用户名', trigger: 'blur' }
  288. ],
  289. role: [
  290. { required: true, message: '请选择角色组', trigger: 'change' }
  291. ],
  292. newPassword: [
  293. { required: true, validator: validatePass3, trigger: 'blur' }
  294. ],
  295. confirmPassword: [
  296. { required: true, validator: validatePass4, trigger: 'blur' }
  297. ],
  298. },
  299. editMemberId: null,
  300. filterText: '',
  301. departmentList: [],
  302. defaultProps: {
  303. children: 'children',
  304. label: 'name'
  305. },
  306. props: {
  307. multiple: true,
  308. value: 'adminWebsitId',
  309. label: 'name',
  310. children: 'children',
  311. },
  312. tableSelection: [],
  313. importLoading: false, // 导入加载loading
  314. importFileList: [], // 导入列表
  315. resetId: null,
  316. resetFormVisible: false,
  317. resetForm: {
  318. newPassword: '', // 新密码
  319. confirmPassword: '', // 确认密码
  320. },
  321. resetFormRules: {
  322. newPassword: [
  323. { required: true, validator: validatePass, trigger: 'blur' }
  324. ],
  325. confirmPassword: [
  326. { required: true, validator: validatePass2, trigger: 'blur' }
  327. ],
  328. },
  329. accountType: '',
  330. roleList: [], // 角色列表
  331. merchantList: [],
  332. passwordType1: 'password',
  333. passwordType2: 'password',
  334. }
  335. },
  336. watch: {
  337. filterText(val) {
  338. this.$refs.listTree.filter(val);
  339. },
  340. 'memberForm.role'() {
  341. if(this.memberForm.role) {
  342. let index = findElem(this.roleList, 'adminRoleId', this.memberForm.role);
  343. this.accountType = this.roleList[index].type;
  344. }
  345. }
  346. },
  347. async created() {
  348. this.getTree();
  349. this.getList();
  350. },
  351. methods: {
  352. // 查询按钮权限
  353. checkBtnRole(value) {
  354. // let btnRole = this.$route.meta.roles;
  355. // if(!btnRole) {return true}
  356. // let index = btnRole.indexOf(value);
  357. // return index >= 0 ? true : false;
  358. return true;
  359. },
  360. // 获取角色列表
  361. async getRoleList() {
  362. const result = await new Promise((resolve, reject) => {
  363. getRoleList({pageNum: 1, pageSize: 1000}).then(res => {
  364. this.roleList = res.data.records;
  365. resolve(res.data);
  366. }).catch(res => {
  367. resolve([]);
  368. })
  369. })
  370. return result;
  371. },
  372. // 获取商户列表
  373. async getMerchantList() {
  374. const result = await new Promise((resolve, reject) => {
  375. getMerchantList({
  376. pageNum: 1,
  377. pageSize: 1000
  378. }).then(res => {
  379. this.merchantList = res.data.records;
  380. resolve(res.data.records);
  381. }).catch(res => {
  382. resolve([]);
  383. })
  384. })
  385. return result;
  386. },
  387. // 获取部门列表
  388. getTree() {
  389. getDepartmentList().then(res => {
  390. this.departmentList = res.data;
  391. })
  392. },
  393. // 获取账号列表
  394. getList() {
  395. this.listLoading = true;
  396. let params = {
  397. pageNum: this.currentPage,
  398. pageSize: this.pageSize,
  399. adminWebsitId: this.selectDepartment ? this.selectDepartment.adminWebsitId : '',
  400. keyword: this.screenForm.name
  401. };
  402. getMemberList(params).then(res => {
  403. this.dataList = res.data.records;
  404. this.listTotal = res.data.total;
  405. this.listLoading = false;
  406. })
  407. },
  408. // 更改每页数量
  409. handleSizeChange(val) {
  410. this.pageSize = val;
  411. this.currentPage = 1;
  412. this.getList();
  413. },
  414. // 更改当前页
  415. handleCurrentChange(val) {
  416. this.currentPage = val;
  417. this.getList();
  418. },
  419. // 提交筛选表单
  420. submitScreenForm() {
  421. this.currentPage = 1;
  422. this.getList();
  423. },
  424. // 重置筛选表单
  425. resetScreenForm() {
  426. this.$refs.screenForm.resetFields();
  427. this.currentPage = 1;
  428. this.getList();
  429. },
  430. // 筛选部门
  431. filterNode(value, data) {
  432. if (!value) return true;
  433. return data.name.indexOf(value) !== -1;
  434. },
  435. // 选择部门
  436. handleNodeClick(data) {
  437. console.log(data);
  438. if(this.selectDepartment && data.adminWebsitId === this.selectDepartment.adminWebsitId) {
  439. this.$refs.listTree.setCurrentKey(null);
  440. this.selectDepartment = null;
  441. }else {
  442. this.selectDepartment = data;
  443. }
  444. this.getList();
  445. },
  446. // 刷新部门
  447. refreshDepartment() {
  448. this.$refs.listTree.setCurrentKey(null);
  449. this.selectDepartment = null;
  450. this.getTree();
  451. this.getList();
  452. },
  453. // 打开 新增编辑 部门表单
  454. openDepartmentForm(type) {
  455. this.departmentFormType = type;
  456. if(!this.selectDepartment) {
  457. return this.$errorMsg('请选择部门');
  458. }
  459. if(type == 'edit') {
  460. this.departmentForm = {
  461. name: this.selectDepartment.name,
  462. }
  463. }
  464. this.departmentFormVisible = true;
  465. },
  466. // 取消 新增编辑 部门表单
  467. cancelDepartmentForm(){
  468. this.departmentFormVisible = false;
  469. this.$refs.departmentForm.resetFields();
  470. this.departmentForm.name = '';
  471. },
  472. // 提交 部门表单
  473. submitDepartmentForm() {
  474. this.$refs.departmentForm.validate((valid) => {
  475. if (valid) {
  476. let params = {
  477. name: this.departmentForm.name,
  478. }
  479. if(this.departmentFormType == 'edit') {
  480. params.id = this.selectDepartment.id;
  481. params.adminWebsitId = this.selectDepartment.adminWebsitId;
  482. params.parentId = this.selectDepartment.parentId;
  483. editDepartment(params).then(res => {
  484. this.cancelDepartmentForm();
  485. this.getTree();
  486. this.getList();
  487. this.$successMsg('编辑成功');
  488. })
  489. }else {
  490. params.parentId = this.selectDepartment ? this.selectDepartment.adminWebsitId : 0;
  491. addDepartment(params).then(res => {
  492. this.cancelDepartmentForm();
  493. this.getTree();
  494. this.getList();
  495. this.$successMsg('添加成功');
  496. })
  497. }
  498. }
  499. })
  500. },
  501. // 打开 新增编辑 账号表单
  502. async openMemberForm(type, id) {
  503. this.memberFormType = type;
  504. this.memberFormVisible = true;
  505. await this.getMerchantList();
  506. await this.getRoleList();
  507. if(type == 'add') {
  508. if(this.selectDepartment) {
  509. this.$refs.tree.setCheckedKeys([this.selectDepartment.adminWebsitId]);
  510. }
  511. }
  512. if(type == 'edit') {
  513. this.editMemberId = id;
  514. getMemberDetail({adminUserId: id}).then(res => {
  515. this.memberForm.account = res.data.userName;
  516. this.memberForm.role = res.data.roleId;
  517. this.memberForm.nickName = res.data.nickName;
  518. this.memberForm.merchant = res.data.companyWechatId;
  519. this.$refs.tree.setCheckedKeys(res.data.adminWebsitIds || []);
  520. })
  521. }
  522. },
  523. // 取消 新增编辑 账号表单
  524. cancelMemberForm(){
  525. this.memberFormVisible = false;
  526. this.$refs.memberForm.resetFields();
  527. this.passwordType1 = 'password';
  528. this.passwordType2 = 'password';
  529. },
  530. // 提交 账号表单
  531. submitMemberForm() {
  532. this.$refs.memberForm.validate((valid) => {
  533. if (valid) {
  534. let params = {
  535. userName: this.memberForm.account,
  536. nickName: this.memberForm.nickName,
  537. roleId: this.memberForm.role,
  538. password: this.memberForm.newPassword,
  539. }
  540. if(this.accountType === 0) {
  541. params.adminWebsitIds = this.$refs.tree.getCheckedKeys();
  542. }else {
  543. params.adminCompanyId = this.memberForm.merchant;
  544. }
  545. if(this.memberFormType == 'edit') {
  546. params.adminUserId = this.editMemberId;
  547. editMember(params).then(res => {
  548. this.cancelMemberForm();
  549. this.getList();
  550. this.$successMsg('编辑成功');
  551. })
  552. }else {
  553. addMember(params).then(res => {
  554. this.cancelMemberForm();
  555. this.getList();
  556. this.$successMsg('添加成功');
  557. })
  558. }
  559. }
  560. })
  561. },
  562. // 表格选择列
  563. handleTableSelection(val) {
  564. this.tableSelection = val;
  565. },
  566. // 批量删除账号
  567. batchDeleteMember() {
  568. if(this.tableSelection.length < 1) {
  569. return this.$errorMsg('至少选择一名账号');
  570. }
  571. this.$confirm(`确定删除选中的账号吗?`, '提示', {
  572. confirmButtonText: '确定',
  573. cancelButtonText: '取消',
  574. type: 'warning'
  575. }).then(() => {
  576. let memberIds = [];
  577. this.tableSelection.forEach(item => {
  578. memberIds.push(item.id);
  579. });
  580. deleteMember({id: memberIds.join(',')}).then(res => {
  581. this.$successMsg();
  582. this.getTree();
  583. this.getList();
  584. })
  585. }).catch(() => {});
  586. },
  587. // 删除账号
  588. deleteMember(id) {
  589. deleteMember({id: id}).then(res => {
  590. this.$successMsg();
  591. this.getTree();
  592. this.getList();
  593. })
  594. },
  595. // 操作 - 更改状态(type: 禁用0,启用1)
  596. changeStatus(id, type) {
  597. type = type ? true : false
  598. changeAccountStatus({adminUserId: id, status: type}).then(res => {
  599. this.getList();
  600. this.$successMsg();
  601. })
  602. },
  603. // 显示隐藏密码
  604. showPwd(num) {
  605. if(num == 1) {
  606. if (this.passwordType1 === 'password') {
  607. this.passwordType1 = ''
  608. } else {
  609. this.passwordType1 = 'password'
  610. }
  611. this.$nextTick(() => {
  612. this.$refs.password1.focus()
  613. })
  614. }
  615. if(num == 2) {
  616. if (this.passwordType2 === 'password') {
  617. this.passwordType2 = ''
  618. } else {
  619. this.passwordType2 = 'password'
  620. }
  621. this.$nextTick(() => {
  622. this.$refs.password2.focus()
  623. })
  624. }
  625. },
  626. // 重置密码
  627. handleReset(id) {
  628. this.resetId = id;
  629. this.resetFormVisible = true;
  630. },
  631. // 取消重置密码
  632. cancelResetForm(){
  633. this.resetFormVisible = false;
  634. this.passwordType1 = 'password';
  635. this.passwordType2 = 'password';
  636. this.$refs.resetForm.resetFields();
  637. },
  638. // 提交重置密码
  639. submitResetForm() {
  640. this.$refs.resetForm.validate((valid) => {
  641. if (valid) {
  642. let params = {
  643. password: this.resetForm.newPassword,
  644. adminUserId: this.resetId
  645. }
  646. resetPassword(params).then(res => {
  647. this.cancelResetForm();
  648. this.getList();
  649. this.$successMsg();
  650. })
  651. }
  652. })
  653. },
  654. // 导出
  655. handleExport() {
  656. let screenData = {
  657. adminWebsitId: this.selectDepartment ? this.selectDepartment.websitId : '',
  658. keyword: this.screenForm.name
  659. };
  660. downloadFiles('wechat/enterprise/export', screenData);
  661. },
  662. // 下载导入模版
  663. handleDownload() {
  664. downloadFiles('wechat/enterprise/download');
  665. },
  666. clickImport() {
  667. if(!this.selectDepartment) {
  668. return this.$errorMsg('请选择部门');
  669. }else {
  670. document.querySelector('.import-btn input').click();
  671. }
  672. },
  673. // 导入
  674. async handleImport(param) {
  675. this.importLoading = true;
  676. const file = param.file;
  677. const formData = new FormData();
  678. formData.append("file", file);
  679. formData.append("mainDepartmentId", this.selectDepartment.websitId);
  680. let result = await handleImport('wechat/enterprise/import', formData);
  681. this.importLoading = false;
  682. this.importFileList = [];
  683. if(result.code == 200) {
  684. this.$alert(result.message, '导入成功', {
  685. confirmButtonText: '确定'
  686. });
  687. this.getList();
  688. }else {
  689. this.$alert(result.message, '导入失败', {
  690. confirmButtonText: '确定'
  691. });
  692. }
  693. },
  694. }
  695. }
  696. </script>
  697. <style scoped lang="scss">
  698. .app-container {
  699. display: flex;
  700. .tree-container {
  701. width: 18%;
  702. height: calc(100vh - 110px);
  703. flex-shrink: 0;
  704. background: #f5f5f5;
  705. margin-right: 2%;
  706. display: flex;
  707. flex-direction: column;
  708. overflow-y: hidden;
  709. .el-tree {
  710. height: 100%;
  711. background: none;
  712. width: 100%;
  713. overflow: scroll;
  714. // ::v-deep .el-tree-node:focus > .el-tree-node__content {
  715. // color: #ffffff;
  716. // background-color: #409EFF;
  717. // }
  718. ::v-deep >.el-tree-node {
  719. display: inline-block;
  720. min-width: 100%;
  721. }
  722. ::v-deep .el-tree-node>.el-tree-node__content {
  723. padding-right: 10px;
  724. align-self: baseline;
  725. }
  726. ::v-deep .el-tree-node.is-current>.el-tree-node__content {
  727. background-color: #409EFF;
  728. .custom-tree-node {
  729. i {
  730. color: #fff;
  731. }
  732. span {
  733. color: #fff;
  734. }
  735. }
  736. }
  737. ::v-deep .el-tree-node>.el-tree-node__children {
  738. overflow: unset;
  739. }
  740. .custom-tree-node {
  741. i {
  742. font-size: 14px;
  743. color: #999;
  744. }
  745. span {
  746. font-size: 14px;
  747. margin-left: 6px;
  748. color: #666;
  749. }
  750. }
  751. }
  752. }
  753. .mymain-container {
  754. width: 80%;
  755. margin-top: 0;
  756. }
  757. }
  758. ::v-deep .el-divider--vertical {
  759. margin: 0 15px;
  760. }
  761. .show-pwd {
  762. position: absolute;
  763. right: 15px;
  764. top: 0;
  765. font-size: 16px;
  766. cursor: pointer;
  767. user-select: none;
  768. }
  769. </style>