authorityHome.vue 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981
  1. <!--
  2. * @Author: your name
  3. * @Date: 2021-11-29 09:27:43
  4. * @LastEditTime: 2022-03-02 17:01:27
  5. * @LastEditors: Please set LastEditors
  6. * @Description: 权限管理
  7. * @FilePath: \Foshan4A2.0\src\views\authorityManagement\components\home.vue
  8. -->
  9. <template>
  10. <div class="authority-home">
  11. <!--状态和搜索-->
  12. <div class="authority-head flex">
  13. <div class="status flex-wrap">
  14. <div class="manageTitle">权限项管理</div>
  15. <div class="status0"><span class="icon"></span>交互权限</div>
  16. <div class="status1"><span class="icon"></span>API接口</div>
  17. <div class="status2"><span class="icon"></span>数据读写</div>
  18. </div>
  19. <Search @getSearchData="getSearchData" :isTitle="false" @clearSearchData="clearSearchData" />
  20. </div>
  21. <!--权限树-->
  22. <!-- <div class="authority-content">
  23. <OrgTree :dataList="dataList" :renderContent="renderContent" />
  24. </div> -->
  25. <div class="authority-content">
  26. <!-- <OrgTree :dataList="dataList" :renderContent="renderContent" /> -->
  27. <el-row :gutter="24" class="bodyContent">
  28. <el-col :span="6" class="bodyPart">
  29. <div class="grid-content">
  30. <div class="manageTitle">权限树</div>
  31. <div class="contentTree">
  32. <el-tree ref="tree" :data="dataListTree" :props="defaultProps" node-key="AuthId" :filter-node-method="filterNode" highlight-current :default-expanded-keys="[currentKey]" @node-click="handleNodeClick">
  33. </el-tree>
  34. </div>
  35. </div>
  36. </el-col>
  37. <el-col :span="18" class="bodyPart">
  38. <!-- <div class="grid-contentTop">
  39. <div class="manageTitle">当前</div>
  40. <div class="content">
  41. <template v-if="currDataArr.length">
  42. <el-row>
  43. <el-col :span="6" v-for="(data, index) in currDataArr" :key="data.AuthId">
  44. <div class="account-left-content-teams">
  45. <div class="team">
  46. <div class="bg" :class="
  47. data.Type == 1 || data.Type == 0
  48. ? 'status1'
  49. : 'status2'
  50. "></div>
  51. <div class="list" :class="data.QueryTarget == 1 ? 'activeStatus' : ''">
  52. <div class="flex info">
  53. <div :title="data.AuthName" class="name">
  54. {{ data.AuthName }}
  55. </div>
  56. <div class="icon">
  57. <el-tooltip effect="dark" content="新增应用" placement="bottom">
  58. <span v-if="data.Type === 0" title="新增应用" @click="renderAdd()" class="cap cap-plus"></span>
  59. </el-tooltip>
  60. <el-tooltip effect="dark" content="修改应用" placement="bottom">
  61. <span v-if="data.Type === 1" title="修改应用" @click="renderEdit(data)" class="cap cap-edit"></span>
  62. </el-tooltip>
  63. <el-tooltip v-is="['authtree_btn_add_auth']" effect="dark" content="新增权限项" placement="bottom">
  64. <span v-if="data.Type === 2" title="新增权限项" @click="renderSub(data)" class="cap cap-sub"></span>
  65. </el-tooltip>
  66. <el-tooltip v-is="['authtree_btn_update_auth']" effect="dark" content="编辑权限项" placement="bottom">
  67. <span v-if="data.Type > 2" title="编辑权限项" @click="renderEdit(data)" class="cap cap-edit"></span>
  68. </el-tooltip>
  69. <el-tooltip v-is="['authtree_btn_add_auth']" effect="dark" content="新增权限项" placement="bottom">
  70. <span v-if="data.Type > 2" title="新增权限项" @click="renderSub(data)" class="cap cap-sub"></span>
  71. </el-tooltip>
  72. </div>
  73. </div>
  74. <div v-if="data.Type > 0" class="flex details">
  75. <div class="details-msg">
  76. 状态:<span :class="data.Status === 1 ? 'success' : 'error'">{{ data.Status === 1 ? "启用" : "禁用" }}</span>
  77. </div>
  78. <div v-is="['authtree_btn_state_swatch']" class="details-info">
  79. <el-switch v-model="data.flag" @change="renderChange(data, index)" active-color="#2D67E3">
  80. </el-switch>
  81. </div>
  82. </div>
  83. </div>
  84. </div>
  85. <div v-is="['authtree_btn_del_auth']">
  86. <div v-if="data.Type !== 0 && data.Type !== 2" @click.stop="onNodeClick(data)" class="info-close">
  87. <i class="icon el-icon-close" :class="
  88. data.Type === 1
  89. ? 'close1'
  90. : data.Type > 2
  91. ? 'close2'
  92. : ''
  93. "></i>
  94. </div>
  95. </div>
  96. </div>
  97. </el-col>
  98. </el-row>
  99. </template>
  100. <template v-else>
  101. <NoData :imageWidth="180" :imageHeight="130" />
  102. </template>
  103. </div>
  104. </div> -->
  105. <div class="grid-contentBottom">
  106. <div class="capTitle flex">
  107. <div class="manageTitle">下级权限</div>
  108. <div class="btn-create">
  109. <el-button size="small" type="primary" @click="addAuth" class="btn-white">新增</el-button>
  110. </div>
  111. </div>
  112. <div class="content">
  113. <template v-if="childrenData.length">
  114. <el-row :gutter="24">
  115. <el-col :span="6" v-for="(data, index) in childrenData" :key="data.AuthId">
  116. <div @click.stop="childrenClick(data)" class="account-left-content-teams">
  117. <div class="team">
  118. <div class="bg" :class="data.Type == 1 ? 'status0' : data.Type == 2 ? 'status1' : 'status2'"></div>
  119. <div class="list" :class="data.QueryTarget == 1 ? 'activeStatus' : ''">
  120. <div class="flex info">
  121. <div :title="data.AuthName" class="name">
  122. {{ data.AuthName }}
  123. </div>
  124. <div class="icon">
  125. <el-tooltip effect="dark" content="新增应用" placement="bottom">
  126. <span v-if="data.Type === 0" title="新增应用" @click="renderAdd()" class="cap cap-plus"></span>
  127. </el-tooltip>
  128. <el-tooltip effect="dark" content="修改应用" placement="bottom">
  129. <span v-if="data.Type === 1" title="修改应用" @click="renderEdit(data)" class="cap cap-edit"></span>
  130. </el-tooltip>
  131. <!-- <el-tooltip v-is="['authtree_btn_add_auth']" effect="dark" content="新增权限项" placement="bottom">
  132. <span v-if="data.Type === 2" title="新增权限项" @click="renderSub(data)" class="cap cap-sub"></span>
  133. </el-tooltip> -->
  134. <el-tooltip v-is="['authtree_btn_add_auth']" effect="dark" content="编辑权限项" placement="bottom">
  135. <span v-if="data.Type === 2" title="编辑权限项" @click="renderEdit(data)" class="cap cap-edit"></span>
  136. </el-tooltip>
  137. <el-tooltip v-is="['authtree_btn_update_auth']" effect="dark" content="编辑权限项" placement="bottom">
  138. <span v-if="data.Type > 2" title="编辑权限项" @click="renderEdit(data)" class="cap cap-edit"></span>
  139. </el-tooltip>
  140. <!-- <el-tooltip v-is="['authtree_btn_add_auth']" effect="dark" content="新增权限项" placement="bottom">
  141. <span v-if="data.Type > 2" title="新增权限项" @click="renderSub(data)" class="cap cap-sub"></span>
  142. </el-tooltip> -->
  143. </div>
  144. </div>
  145. <div v-if="data.Type > 0" class="flex details">
  146. <div class="details-msg">
  147. 状态:<span :class="data.Status === 1 ? 'success' : 'error'">{{ data.Status === 1 ? "启用" : "禁用" }}</span>
  148. </div>
  149. <div v-is="['authtree_btn_state_swatch']" class="details-info">
  150. <el-switch v-model="data.flag" @click.stop.native @change="renderChange(data, index)" active-color="#2D67E3">
  151. </el-switch>
  152. </div>
  153. </div>
  154. </div>
  155. </div>
  156. <!-- <div v-if="data.Type !== 0 && data.Type !== 2" @click.stop="onNodeClick(data)" class="info-close">
  157. <i class="icon el-icon-close" :class="data.Type === 1 ? 'close1' : data.Type > 2 ? 'close2' : ''"></i>
  158. </div> -->
  159. <div v-is="['authtree_btn_del_auth']">
  160. <div v-if="data.Type !== 0 && data.Type !== 2" @click.stop="onNodeClick(data)" class="info-close">
  161. <i class="icon el-icon-close" :class="
  162. data.Type === 1
  163. ? 'close1'
  164. : data.Type > 2
  165. ? 'close2'
  166. : ''
  167. "></i>
  168. </div>
  169. </div>
  170. </div>
  171. </el-col>
  172. </el-row>
  173. </template>
  174. <template v-else>
  175. <NoData :imageWidth="280" :imageHeight="230" />
  176. </template>
  177. </div>
  178. </div>
  179. </el-col>
  180. </el-row>
  181. </div>
  182. <!--删除弹框-->
  183. <Dialog :flag="flag">
  184. <div class="airportInfoDialog">
  185. <div class="title del-title">删除{{ title }}</div>
  186. <div class="content del-content">
  187. <span class="el-icon-error error r10"></span>是否确认删除<span class="error l10">{{ title }}</span>?
  188. </div>
  189. <div class="foot Delfoot right t30">
  190. <el-button size="medium" class="r24" @click="remove" type="danger">删除</el-button>
  191. <el-button size="medium" @click="flag = false">取消</el-button>
  192. </div>
  193. </div>
  194. </Dialog>
  195. <!--新增/编辑-->
  196. <Dialog :flag="editDialogVisible" width="628px" :show-flag="true">
  197. <div class="airportInfoDialog dialog-public-background">
  198. <div class="title">{{ editDialogTitle }}</div>
  199. <div class="content">
  200. <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="110px" class="demo-ruleForm">
  201. <el-form-item label="权限名称" prop="authName">
  202. <el-input v-model="ruleForm.authName" size="medium" placeholder="请输入权限名称" />
  203. </el-form-item>
  204. <div class="flex">
  205. <el-form-item label="权限类型" prop="authType">
  206. <el-select size="medium" v-model="ruleForm.authType" placeholder="请选择">
  207. <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
  208. </el-option>
  209. </el-select>
  210. </el-form-item>
  211. <el-form-item label="父级权限" prop="authParent">
  212. <el-select size="medium" v-model="ruleForm.authParent" placeholder="请选择">
  213. <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
  214. </el-option>
  215. </el-select>
  216. </el-form-item>
  217. </div>
  218. <div class="flex">
  219. <el-form-item label="数据来源类型" prop="authData">
  220. <el-select size="medium" v-model="ruleForm.authData" placeholder="请选择">
  221. <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
  222. </el-option>
  223. </el-select>
  224. </el-form-item>
  225. <el-form-item label="所属应用" prop="authApp">
  226. <el-select size="medium" v-model="ruleForm.authApp" placeholder="请选择">
  227. <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
  228. </el-option>
  229. </el-select>
  230. </el-form-item>
  231. </div>
  232. <el-form-item label="权限标识符" prop="authPoint">
  233. <el-input v-model="ruleForm.authPoint" size="medium" type="textarea" :rows="3" placeholder="请输入权限标识符" />
  234. </el-form-item>
  235. <el-form-item label="数据项描述" prop="authDesc">
  236. <el-input v-model="ruleForm.authDesc" size="medium" type="textarea" :rows="3" placeholder="请输入数据项描述" />
  237. </el-form-item>
  238. </el-form>
  239. </div>
  240. <div class="foot center t30">
  241. <el-button size="medium" type="primary" class="r25 r26" @click="submitClickHandler()">提交</el-button>
  242. <el-button size="medium" class="r26" @click="resetForm('ruleForm')">取消</el-button>
  243. </div>
  244. </div>
  245. </Dialog>
  246. </div>
  247. </template>
  248. <script>
  249. import OrgTree from "@/layout/components/OrgTree";
  250. import Search from "@/layout/components/Search";
  251. import Dialog from "@/layout/components/Dialog";
  252. import NoData from "@/components/nodata";
  253. import {
  254. UpdateAppStatus,
  255. UpdateAuthStatus,
  256. DeleteApp,
  257. DeleteAuth,
  258. } from "@/api/apiAuthority";
  259. import treeData from "../minixs/treeData";
  260. export default {
  261. name: "Authority",
  262. components: { OrgTree, Search, Dialog, NoData },
  263. mixins: [treeData],
  264. data () {
  265. return {
  266. dataIndex: 1,
  267. dataNum: 0,
  268. dataArr: [],
  269. type: null,
  270. title: "", //弹框title
  271. flag: false, //弹框开关
  272. dataId: null, //tree数据id
  273. currData:null,
  274. currDataArr: [],
  275. currDataArrId: 0,
  276. childrenData: [],
  277. dataListTree: [],
  278. currentKey: -1,
  279. defaultProps: {
  280. children: "children",
  281. label: "AuthName",
  282. },
  283. options: [],
  284. editDialogVisible: false,
  285. editDialogTitle: '新增下级权限',
  286. editType: 'add',
  287. ruleForm: {
  288. // 协议信息表单
  289. authName: "",
  290. authType: "",
  291. authDesc: "",
  292. authPoint: "",
  293. authApp: "",
  294. authParent: "",
  295. authData: ""
  296. },
  297. rules: {
  298. // 协议信息表单验证
  299. authName: [
  300. { required: true, message: "请输入权限名称", trigger: "blur" },
  301. ],
  302. },
  303. };
  304. },
  305. created: function () {
  306. let keyWords = "";
  307. if (this.$route.query.keyWords) {
  308. keyWords = this.$route.query.keyWords;
  309. }
  310. this.getAuthTree(keyWords);
  311. },
  312. watch: {
  313. dataList: {
  314. handler (val) {
  315. this.dataListTree = [];
  316. this.dataListTree.push(_.cloneDeep(val));
  317. },
  318. deep: true,
  319. },
  320. },
  321. methods: {
  322. // 新增
  323. addAuth () {
  324. // this.editDialogTitle = '新增下级权限'
  325. // this.editDialogVisible = true
  326. // this.editType = 'add'
  327. this.$router.push({
  328. path: "/authority/addPower",
  329. query: {
  330. AuthId: this.currData.AuthId,
  331. Status: this.currData.Status,
  332. UpAuthId: this.currData.UpAuthId,
  333. },
  334. });
  335. },
  336. // 重置
  337. resetForm (formName) {
  338. this.$refs[formName].resetFields()
  339. this.editDialogVisible = false
  340. },
  341. // 新增/编辑-确认
  342. submitClickHandler () {
  343. this.$refs["ruleForm"].validate((valid) => {
  344. if (valid) {
  345. if (this.editType == 'add') {
  346. // console.log('新增')
  347. } else {
  348. // console.log('编辑')
  349. }
  350. } else {
  351. return false
  352. }
  353. });
  354. },
  355. //树点击
  356. handleNodeClick (data) {
  357. const dataNew = _.cloneDeep(data);
  358. this.currData = dataNew;
  359. this.currDataArrId = dataNew.AuthId;
  360. this.currDataArr = [];
  361. this.childrenData = [];
  362. this.currDataArr = this.decompose(this.dataArr, "AuthId", dataNew.AuthId);
  363. this.childrenData = this.decompose(
  364. this.dataArr,
  365. "UpAuthId",
  366. dataNew.AuthId
  367. );
  368. },
  369. //下级卡片点击
  370. childrenClick (data) {
  371. const dataNew = _.cloneDeep(data);
  372. this.currData = dataNew;
  373. this.currDataArrId = dataNew.AuthId;
  374. this.currDataArr = [];
  375. this.childrenData = [];
  376. this.currDataArr = this.decompose(this.dataArr, "AuthId", dataNew.AuthId);
  377. this.childrenData = this.decompose(
  378. this.dataArr,
  379. "UpAuthId",
  380. dataNew.AuthId
  381. );
  382. this.$refs.tree.setCurrentKey(dataNew.AuthId);
  383. this.currentKey = dataNew.AuthId;
  384. },
  385. //下级关闭
  386. childrenRenderChange (data, index) {
  387. try {
  388. const { OrganId, flag } = data;
  389. const Status = flag ? 1 : 0;
  390. tissueTreeStart({
  391. OrganId: OrganId,
  392. Status: Status,
  393. }).then((res) => {
  394. if (res.code === 0) {
  395. this.$message.success(res.message);
  396. this.childrenData[index].Status = Status;
  397. // this.getOrganTree();
  398. } else {
  399. this.$message.error(res.message);
  400. this.childrenData[index].flag = !flag;
  401. }
  402. });
  403. } catch (error) {
  404. console.log("出错了", error);
  405. this.childrenData[index].flag = !flag;
  406. }
  407. },
  408. filterNode (value, data) {
  409. if (!value) return true;
  410. return data.AuthName.indexOf(value) !== -1;
  411. },
  412. // 添加应用
  413. renderAdd () {
  414. this.$router.push("/authority/appAdd");
  415. },
  416. // 修改权限
  417. renderEdit (data) {
  418. // this.editDialogVisible = true;
  419. // this.editDialogTitle = '编辑下级权限';
  420. // this.editType = 'edit';
  421. if (data.Type === 1) {
  422. this.$router.push({
  423. path: "/authority/appEdit",
  424. query: {
  425. AuthId: data.AuthId,
  426. Status: data.Status,
  427. UpAuthId: data.UpAuthId,
  428. },
  429. });
  430. } else if (data.Type > 2) {
  431. this.$router.push({
  432. path: "/authority/editPower",
  433. query: {
  434. AuthId: data.AuthId,
  435. Status: data.Status,
  436. UpAuthId: data.UpAuthId,
  437. },
  438. });
  439. }
  440. },
  441. // 权限树
  442. renderSub (data) {
  443. this.$router.push({
  444. path: "/authority/addPower",
  445. query: {
  446. AuthId: data.AuthId,
  447. Status: data.Status,
  448. UpAuthId: data.UpAuthId,
  449. },
  450. });
  451. },
  452. // 关闭开启
  453. renderChange (data, index) {
  454. const { AuthId, flag, Type } = data;
  455. const Status = flag ? 1 : 0;
  456. this.handleChange(AuthId, Status, Type, index);
  457. },
  458. //删除
  459. remove () {
  460. if (this.type === 1) {
  461. this.deleteApp(this.dataId);
  462. } else {
  463. this.deleteAuth(this.dataId);
  464. }
  465. },
  466. //查询
  467. getSearchData (val) {
  468. this.$refs.tree.filter(val);
  469. // this.getAuthTree(val)
  470. },
  471. //清除查询
  472. clearSearchData () {
  473. this.getAuthTree();
  474. },
  475. //节点关闭按钮点击
  476. onNodeClick (data) {
  477. this.flag = true;
  478. this.dataId = data.AuthId;
  479. this.title = data.AuthName;
  480. this.type = data.Type;
  481. },
  482. //获取指定数据
  483. decompose (value, key, id) {
  484. let data = _.cloneDeep(value);
  485. let arr = [];
  486. for (let i = 0; i < data.length; i++) {
  487. if (data[i][key] == id) {
  488. arr.push(data[i]);
  489. }
  490. }
  491. return arr;
  492. },
  493. //渲染节点
  494. renderContent (h, data) {
  495. return (
  496. <div class="account-left-content-teams">
  497. <div class="team">
  498. <div class={[data.Type <= 1 ? "status1" : "status2", "bg"]}></div>
  499. <div class={[data.QueryTarget == 1 ? "activeStatus" : "", "list"]}>
  500. <div class="flex info">
  501. <div class="name">{data.AuthName}</div>
  502. <div class="icon">
  503. <span
  504. v-show={data.Type === 0}
  505. onClick={() => this.renderAdd()}
  506. class="cap cap-plus"
  507. ></span>
  508. <span
  509. v-show={data.Type === 1}
  510. onClick={() => this.renderEdit(data)}
  511. class="cap cap-edit"
  512. ></span>
  513. <span
  514. v-show={data.Type === 2}
  515. onClick={() => this.renderSub(data)}
  516. class="cap cap-sub"
  517. ></span>
  518. <span
  519. v-show={data.Type > 2}
  520. onClick={() => this.renderEdit(data)}
  521. class="cap cap-edit"
  522. ></span>
  523. <span
  524. v-show={data.Type > 2}
  525. onClick={() => this.renderSub(data)}
  526. class="cap cap-sub"
  527. ></span>
  528. </div>
  529. </div>
  530. <div v-show={data.Type > 0} class="flex details">
  531. <div class="details-msg">
  532. 状态:
  533. <span class={[data.Status === 1 ? "success" : "error"]}>
  534. {data.Status === 1 ? "启用" : "禁用"}
  535. </span>
  536. </div>
  537. <div class="details-info">
  538. <el-switch
  539. v-model={data.flag}
  540. onChange={() => this.renderChange(data)}
  541. active-color="#6F81BC"
  542. ></el-switch>
  543. </div>
  544. </div>
  545. </div>
  546. </div>
  547. <div
  548. v-show={data.Type !== 0 && data.Type !== 2}
  549. onClick={() => this.onNodeClick(data)}
  550. class="info-close"
  551. >
  552. <i
  553. class={[
  554. data.Type === 1 ? "close1" : data.Type > 2 ? "close2" : "",
  555. "icon",
  556. "el-icon-close",
  557. ]}
  558. ></i>
  559. </div>
  560. </div>
  561. );
  562. },
  563. //-----------获取数据------------
  564. //应用状态变更
  565. async handleChange (id, val, type, index) {
  566. try {
  567. let res = null;
  568. if (type === 1) {
  569. res = await UpdateAppStatus({
  570. AppId: id,
  571. Status: val,
  572. });
  573. } else {
  574. res = await UpdateAuthStatus({
  575. AuthId: id,
  576. AuthStatus: val,
  577. });
  578. }
  579. if (res.code === 0) {
  580. this.$message.success(res.message);
  581. if (type === 1) {
  582. this.currDataArr[0].Status = val;
  583. } else {
  584. this.childrenData[index].Status = val;
  585. }
  586. //this.getAuthTree()
  587. } else {
  588. this.$message.error(res.message);
  589. if (type === 1) {
  590. this.currDataArr[0].flag = !flag;
  591. } else {
  592. this.childrenData[index].flag = !flag;
  593. }
  594. }
  595. } catch (error) {
  596. console.log("出错了", error);
  597. if (type === 1) {
  598. this.currDataArr[0].flag = !flag;
  599. } else {
  600. this.childrenData[index].flag = !flag;
  601. }
  602. }
  603. },
  604. //应用删除
  605. async deleteApp (id) {
  606. try {
  607. const res = await DeleteApp({
  608. AppId: id,
  609. });
  610. if (res.code === 0) {
  611. this.$message.success(res.message);
  612. this.flag = false;
  613. this.getAuthTree();
  614. } else {
  615. this.flag = false;
  616. this.$message.error(res.message);
  617. }
  618. } catch (error) {
  619. this.flag = false;
  620. }
  621. },
  622. //权限项删除
  623. async deleteAuth (id) {
  624. try {
  625. const res = await DeleteAuth({
  626. AuthId: id,
  627. });
  628. if (res.code === 0) {
  629. this.$message.success(res.message);
  630. this.flag = false;
  631. this.getAuthTree();
  632. } else {
  633. this.flag = false;
  634. this.$message.error(res.message);
  635. }
  636. } catch (error) {
  637. this.flag = false;
  638. }
  639. },
  640. },
  641. };
  642. </script>
  643. <style lang="scss" scoped>
  644. .authority-home {
  645. padding: 16px 32px 32px 32px;
  646. .authority-head {
  647. line-height: 32px;
  648. font-size: 14px;
  649. .status {
  650. .icon {
  651. width: 14px;
  652. height: 14px;
  653. background: #58c274;
  654. border-radius: 2px;
  655. display: inline-block;
  656. vertical-align: middle;
  657. margin-right: 10px;
  658. position: relative;
  659. top: -2px;
  660. }
  661. &:last-child {
  662. margin-right: 0;
  663. }
  664. .status2 {
  665. margin-left: 28px;
  666. .icon {
  667. background: #2d67e3;
  668. }
  669. }
  670. .status0 {
  671. margin-right: 28px;
  672. .icon {
  673. background: #d8b53b;
  674. }
  675. }
  676. }
  677. }
  678. .authority-content {
  679. // margin-top: 34px;
  680. ::v-deep .orgTreeContent {
  681. padding-top: 110px;
  682. .account-left-content-teams {
  683. .status0 {
  684. background: #d8b53b;
  685. }
  686. .status1 {
  687. background: #58c274;
  688. }
  689. .status2 {
  690. background: #2d67e3;
  691. }
  692. .activeStatus {
  693. background: #464960;
  694. .name,
  695. .details-msg,
  696. .success,
  697. .error {
  698. color: #fff;
  699. }
  700. }
  701. .list {
  702. .info {
  703. .name {
  704. max-width: 100px;
  705. white-space: nowrap;
  706. overflow: hidden;
  707. text-overflow: ellipsis;
  708. }
  709. }
  710. }
  711. }
  712. }
  713. }
  714. .authority-content {
  715. padding-top: 30px;
  716. height: calc(100vh - 166px);
  717. box-sizing: border-box;
  718. .bodyContent {
  719. height: 100%;
  720. .bodyPart {
  721. height: 100%;
  722. display: flex;
  723. flex-direction: column;
  724. justify-content: space-between;
  725. }
  726. }
  727. .capTitle {
  728. line-height: 32px;
  729. }
  730. .account-left-content-teams {
  731. position: relative;
  732. margin-top: 24px;
  733. .info-close {
  734. position: absolute;
  735. width: 24px;
  736. height: 24px;
  737. line-height: 24px;
  738. text-align: center;
  739. background: #000000;
  740. border-radius: 50%;
  741. top: -12px;
  742. right: -12px;
  743. z-index: 5;
  744. cursor: pointer;
  745. .icon {
  746. color: #fff;
  747. font-weight: 600;
  748. }
  749. }
  750. .list {
  751. background-color: #f5f7fa;
  752. .info {
  753. line-height: normal;
  754. margin-bottom: 37px;
  755. .name {
  756. font-size: 16px;
  757. font-weight: bold;
  758. max-width: 120px;
  759. white-space: nowrap;
  760. overflow: hidden;
  761. text-overflow: ellipsis;
  762. }
  763. .cap {
  764. width: 16px;
  765. height: 16px;
  766. display: inline-block;
  767. background-repeat: no-repeat;
  768. background-size: 100%;
  769. transition: all 0.3s;
  770. margin-left: 16px;
  771. &:first-child {
  772. margin-right: 0;
  773. }
  774. }
  775. .cap-plus {
  776. background-image: url("../../../assets/status/ic_plus.png");
  777. &:hover {
  778. background-image: url("../../../assets/status/ic_plus_hovar.png");
  779. }
  780. }
  781. .cap-edit {
  782. background-image: url("../../../assets/status/ic_edit_default.png");
  783. &:hover {
  784. background-image: url("../../../assets/status/ic_edit_hovar.png");
  785. }
  786. }
  787. .cap-sub {
  788. background-image: url("../../../assets/status/ic_permissions_add_default.png");
  789. &:hover {
  790. background-image: url("../../../assets/status/ic_permissions_add_hoavr.png");
  791. }
  792. }
  793. .cap-job {
  794. background-image: url("../../../assets/status/ic_jobs.png");
  795. &:hover {
  796. background-image: url("../../../assets/status/ic_jobs_hovar.png");
  797. }
  798. }
  799. .cap-member {
  800. background-image: url("../../../assets/status/ic_member.png");
  801. &:hover {
  802. background-image: url("../../../assets/status/ic_member_hovar.png");
  803. }
  804. }
  805. }
  806. }
  807. .team {
  808. background: #fff;
  809. border-radius: 4px;
  810. box-shadow: 0px 3px 3px 0px rgba(0, 0, 0, 0.1);
  811. overflow: hidden;
  812. .bg {
  813. height: 4px;
  814. background: #6f81bc;
  815. }
  816. .status0 {
  817. background: #d8b53b;
  818. }
  819. .status1 {
  820. background: #58c274;
  821. }
  822. .status2 {
  823. background: #2d67e3;
  824. }
  825. }
  826. .list {
  827. padding: 23px 24px;
  828. position: relative;
  829. min-width: 240px;
  830. min-height: 118px;
  831. .info {
  832. margin-bottom: 20px;
  833. .info-avoutr {
  834. display: flex;
  835. .avoutr {
  836. width: 40px;
  837. height: 40px;
  838. border-radius: 50%;
  839. background: #303133;
  840. img {
  841. max-width: 100%;
  842. }
  843. }
  844. .msg {
  845. margin-left: 20px;
  846. p {
  847. margin: 0;
  848. padding: 0;
  849. height: 20px;
  850. line-height: 20px;
  851. }
  852. .name {
  853. font-weight: bold;
  854. color: #303133;
  855. font-size: 18px;
  856. margin-bottom: 8px;
  857. }
  858. .group {
  859. font-size: 14px;
  860. font-family: Microsoft YaHei;
  861. font-weight: 400;
  862. color: #303133;
  863. }
  864. }
  865. }
  866. .icon {
  867. font-size: 16px;
  868. cursor: pointer;
  869. }
  870. }
  871. .time,
  872. .ip {
  873. height: 16px;
  874. line-height: 16px;
  875. font-size: 16px;
  876. .glr {
  877. color: #909399;
  878. }
  879. }
  880. .ip {
  881. margin-top: 23px;
  882. margin-bottom: 38px;
  883. }
  884. .details {
  885. height: 24px;
  886. line-height: 24px;
  887. font-size: 14px;
  888. .success {
  889. color: #2d67e3;
  890. }
  891. .error {
  892. color: #909399;
  893. }
  894. }
  895. }
  896. }
  897. .grid-content {
  898. width: 100%;
  899. height: 100%;
  900. background: #ffffff;
  901. padding: 27px 24px;
  902. border-radius: 4px;
  903. // .title {
  904. // font-size: 18px;
  905. // font-family: Microsoft YaHei;
  906. // font-weight: bold;
  907. // color: #303133;
  908. // height: 40px;
  909. // padding: 30px;
  910. // }
  911. ::v-deep .contentTree {
  912. margin-top: 30px;
  913. height: calc(100% - 60px);
  914. overflow: auto;
  915. .el-tree-node.is-expanded > .el-tree-node__children {
  916. display: block;
  917. }
  918. }
  919. }
  920. .grid-contentTop {
  921. width: 100%;
  922. height: 240px;
  923. background: #ffffff;
  924. border-radius: 4px;
  925. padding: 27px 24px;
  926. .title {
  927. font-size: 18px;
  928. font-family: Microsoft YaHei;
  929. font-weight: bold;
  930. color: #303133;
  931. height: 40px;
  932. padding: 30px;
  933. }
  934. .content {
  935. width: 100%;
  936. height: calc(100% - 60px);
  937. padding: 0 20px;
  938. margin-left: 0;
  939. }
  940. }
  941. .grid-contentBottom {
  942. width: 100%;
  943. height: 100%;
  944. background: #ffffff;
  945. border-radius: 4px;
  946. padding: 27px 24px;
  947. .title {
  948. font-size: 18px;
  949. font-family: Microsoft YaHei;
  950. font-weight: bold;
  951. color: #303133;
  952. height: 40px;
  953. padding: 30px;
  954. }
  955. .content {
  956. width: 100%;
  957. height: calc(100% - 20px);
  958. padding: 0 20px;
  959. overflow-y: auto;
  960. margin-left: 0;
  961. }
  962. }
  963. }
  964. }
  965. ::-webkit-scrollbar-track-piece {
  966. background: #d3dce6;
  967. }
  968. ::-webkit-scrollbar {
  969. width: 8px;
  970. }
  971. ::-webkit-scrollbar-thumb {
  972. background: #99a9bf;
  973. border-radius: 2px;
  974. }
  975. </style>