library.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730
  1. <template>
  2. <div class="l_box">
  3. <div class="l_type_box" v-loading="isLoading">
  4. <div class="header">
  5. <span class="title">我的资源库</span>
  6. <span class="add" @click="addClick" ref="divToHide3">添加分类</span>
  7. </div>
  8. <div class="nav">
  9. <div class="nav_b">
  10. <div class="nav_box" :class="{ active1: pid == 'wu' }" @click="checkType('wu')"><span
  11. class="icon no"></span><span class="name">未分类</span>
  12. </div>
  13. </div>
  14. <div class="nav_b" v-for="(item, index) in typeArray" :key="index">
  15. <div class="nav_box" :class="{ open: item.open, active2: pid.split('-')[0] == index }"
  16. @click="checkType(index + '')"><span class="icon" :class="{ haveL: item.child.length }"
  17. @click.stop="typeOpen(index)"></span>
  18. <input class="renameInput" v-model="renameInput" v-if="renameType == (index + '')" ref="renameInput"
  19. @change="rename" @keyup.enter="rename">
  20. <el-tooltip :content="item.name" placement="top" effect="dark" v-else>
  21. <span class="name">{{ item.name }}</span>
  22. </el-tooltip>
  23. <span ref="divToHide5" class="icon more" @click.stop="showActions($event, index + '')"></span>
  24. </div>
  25. <div class="nav_child_box" v-if="item.open && item.child.length">
  26. <div class="nav_box" :class="{ active: pid == index + '-' + index2 }" v-for="(item2, index2) in item.child"
  27. :key="index + '-' + index2" @click="checkType(index + '-' + index2)">
  28. <span class="icon"></span>
  29. <input class="renameInput" v-model="renameInput" v-if="renameType == (index + '-' + index2)"
  30. ref="renameInput" @change="rename" @keyup.enter="rename">
  31. <el-tooltip :content="item2.name" placement="top" effect="dark" v-else>
  32. <span class="name">{{ item2.name }}</span>
  33. </el-tooltip>
  34. <span ref="divToHide5" class="icon more" @click.stop="showActions($event, index + '-' + index2)"></span>
  35. </div>
  36. </div>
  37. <div class="add_box" v-if="addVisbile2 === index" ref="divToHide2">
  38. <input type="text" v-model="addInput" @change="addType" @keyup.enter="addType">
  39. </div>
  40. </div>
  41. <div class="add_box" v-if="addVisbile" ref="divToHide">
  42. <input type="text" v-model="addInput" @change="addType" @keyup.enter="addType">
  43. </div>
  44. </div>
  45. <div v-if="showActionDiv" ref="actionDiv" :style="actionDivStyle" class="action-div">
  46. <div @click="actionDelete">删除</div>
  47. <div @click="actionRename">重命名</div>
  48. <div class="move" v-if="pidArray.length">
  49. <span>移动</span>
  50. <div class="pid_box">
  51. <div v-for="(item, index) in pidArray" :key="index" @click="actionMove(item)">
  52. <!-- <el-tooltip :content="item.name" placement="right" effect="dark"> -->
  53. <span>{{ item.name }}</span>
  54. <!-- </el-tooltip> -->
  55. </div>
  56. </div>
  57. </div>
  58. </div>
  59. </div>
  60. <div class="l_file_box">
  61. <div class="l_none" v-if="pid != 'wu' && pid.split('-').length == 1">请添加二级分类</div>
  62. <fileBox :userid="userid" :typeArray="typeArray" :pid="pid" :type='type' @addFile="addFile" ref="fileBox" v-else></fileBox>
  63. </div>
  64. </div>
  65. </template>
  66. <script>
  67. import fileBox from './library/fileBox.vue';
  68. export default {
  69. components: {
  70. fileBox,
  71. },
  72. props: {
  73. type: {
  74. type: String,
  75. default: '1'
  76. },
  77. },
  78. data() {
  79. return {
  80. userid: this.$route.query.userid,
  81. pid: 'wu',
  82. addInput: '',
  83. addVisbile: false,
  84. addVisbile2: '',
  85. isLoading: false,
  86. typeArray: [],
  87. showActionDiv: false,
  88. actionDivStyle: {
  89. top: '0px',
  90. left: '0px'
  91. },
  92. actionType: '',
  93. renameType: '',
  94. renameInput: '',
  95. pidArray: [],
  96. }
  97. },
  98. methods: {
  99. getData() {
  100. this.isLoading = true;
  101. let params = {
  102. uid: this.userid,
  103. };
  104. this.ajax
  105. .get(this.$store.state.api + "getSourceFileType", params)
  106. .then((res) => {
  107. this.isLoading = false;
  108. let pid = res.data[0];
  109. let child = res.data[1];
  110. for (var i = 0; i < pid.length; i++) {
  111. let pidChild = []
  112. pid[i].open = (this.typeArray.length && this.typeArray[i]) ? this.typeArray[i].open : false
  113. for (var j = 0; j < child.length; j++) {
  114. if (pid[i].id == child[j].pid) {
  115. pidChild.push(child[j])
  116. }
  117. }
  118. pid[i].child = pidChild
  119. }
  120. this.typeArray = pid
  121. this.$forceUpdate()
  122. let _pid = this.pid.split('-')
  123. if (_pid.length === 1 && this.pid != 'wu') {
  124. if(pid[_pid[0]]){
  125. pid[_pid[0]].open = true
  126. this.pid = this.pid + '-0'
  127. }else {
  128. this.pid = 'wu'
  129. };
  130. this.checkType(this.pid);
  131. }else if(_pid.length > 1){
  132. if (this.typeArray[_pid[0]].child.length > 0 && (parseInt(_pid[1])+1) > this.typeArray[_pid[0]].child.length) {
  133. this.pid = _pid[0] + '-0';
  134. this.checkType(this.pid);
  135. }else if((parseInt(_pid[1])+1) > this.typeArray[_pid[0]].child.length){
  136. this.checkType(_pid[0]);
  137. }
  138. }
  139. this.$refs['fileBox'].getData()
  140. console.log(this.$refs['fileBox']);
  141. })
  142. .catch((err) => {
  143. this.isLoading = false;
  144. console.error(err);
  145. });
  146. },
  147. addClick() {
  148. if (this.pid == 'wu') {
  149. this.addVisbile = true;
  150. this.addInput = '一级分类标签'
  151. setTimeout(() => {
  152. this.$refs.divToHide.children[0].select()
  153. }, 500);
  154. } else {
  155. let check = this.pid.split('-')
  156. this.addVisbile2 = parseInt(check[0]);
  157. this.addInput = '二级分类标签'
  158. setTimeout(() => {
  159. this.$refs.divToHide2[0].children[0].select()
  160. }, 500);
  161. }
  162. },
  163. addType() {
  164. let pid = ''
  165. if (!this.addInput) {
  166. this.$message.error('请输入分类名字');
  167. return
  168. }
  169. if (this.addVisbile) {
  170. pid = '0'
  171. } else if (this.addVisbile2 === 0 || this.addVisbile2) {
  172. let check = this.pid.split('-')
  173. pid = this.typeArray[check[0]].id
  174. }
  175. let params = [{
  176. pid: pid,
  177. name: encodeURIComponent(this.addInput),
  178. uid: this.userid
  179. }];
  180. this.ajax
  181. .post(this.$store.state.api + "addSourceFileType", params)
  182. .then((res) => {
  183. this.$message.success('添加成功');
  184. this.addVisbile = false
  185. this.addVisbile2 = ''
  186. this.getData()
  187. })
  188. .catch((err) => {
  189. console.error(err);
  190. });
  191. },
  192. typeOpen(index) {
  193. if (this.typeArray[index].child.length > 0) {
  194. this.typeArray[index].open = !this.typeArray[index].open
  195. }
  196. },
  197. checkType(pid) {
  198. if (this.pid == pid) {
  199. return
  200. }
  201. let _pid = pid.split('-')
  202. if (_pid.length === 1 && pid != 'wu') {
  203. if (this.typeArray[_pid[0]].child.length > 0) {
  204. this.pid = pid + '-0';
  205. this.typeArray[_pid[0]].open = true;
  206. } else {
  207. this.pid = pid;
  208. }
  209. } else {
  210. this.pid = pid;
  211. }
  212. },
  213. handleClickOutside(event) {
  214. const target = event.target;
  215. const divToHide = this.$refs.divToHide; // 获取需要隐藏的 div 的引用
  216. const divToHide2 = this.$refs.divToHide2; // 获取需要隐藏的 div 的引用
  217. const divToHide3 = this.$refs.divToHide3; // 获取需要隐藏的 div 的引用
  218. const divToHide4 = this.$refs.actionDiv; // 获取需要隐藏的 div 的引用
  219. const divToHide5 = this.$refs.divToHide5; // 获取需要隐藏的 div 的引用
  220. const renameInput = this.$refs.renameInput; // 获取需要隐藏的 div 的引用
  221. console.log('1')
  222. if (divToHide && !divToHide.contains(target) && divToHide3 && !divToHide3.contains(target)) {
  223. // 点击的不是需要隐藏的 div,则隐藏它
  224. this.addVisbile = false
  225. }
  226. if (divToHide2 && divToHide2[0] && !divToHide2[0].contains(target) && divToHide3 && !divToHide3.contains(target)) {
  227. // 点击的不是需要隐藏的 div,则隐藏它
  228. this.addVisbile2 = ''
  229. }
  230. if (divToHide4 && !divToHide4.contains(target) && divToHide5 && !divToHide5[0].contains(target)) {
  231. // 点击的不是需要隐藏的 div,则隐藏它
  232. this.showActionDiv = false;
  233. }
  234. if (renameInput && renameInput[0] && !renameInput[0].contains(target) && (!divToHide4 || (divToHide4 && !divToHide4.contains(target)))) {
  235. // 点击的不是需要隐藏的 div,则隐藏它
  236. this.renameType = ''
  237. }
  238. },
  239. showActions(event, type) {
  240. this.showActionDiv = true;
  241. const buttonRect = event.target.getBoundingClientRect();
  242. this.actionDivStyle.top = `${buttonRect.bottom - 30}px`;
  243. this.actionDivStyle.left = `${buttonRect.left + 25}px`;
  244. this.pidArray = []
  245. let _type = type.split('-')
  246. if (_type.length > 1) {
  247. let pid = this.typeArray[_type[0]].child[_type[1]].pid
  248. this.typeArray.forEach(item => {
  249. item.id != pid && this.pidArray.push(item)
  250. })
  251. }
  252. this.actionType = type;
  253. this.$forceUpdate();
  254. },
  255. actionMove(pid) {
  256. let type = this.actionType.split('-')
  257. let id = this.typeArray[type[0]].child[type[1]].id
  258. this
  259. .$confirm('确定移动到'+pid.name+'吗?并且此分类的底下的文件也会跟随!', "提示", {
  260. confirmButtonText: "确定",
  261. cancelButtonText: "取消",
  262. type: "warning",
  263. })
  264. .then(() => {
  265. let params = [{
  266. id: id,
  267. pid: pid.id
  268. }];
  269. this.ajax
  270. .post(this.$store.state.api + "updateSourceFileTypePid", params)
  271. .then((res) => {
  272. this.$message.success('移动成功');
  273. this.showActionDiv = false
  274. this.getData()
  275. })
  276. .catch((err) => {
  277. console.error(err);
  278. });
  279. })
  280. .catch(() => {
  281. });
  282. },
  283. actionRename() {
  284. let type = this.actionType.split('-')
  285. if (type.length == 1) {
  286. this.renameInput = this.typeArray[type[0]].name
  287. } else {
  288. this.renameInput = this.typeArray[type[0]].child[type[1]].name
  289. }
  290. this.renameType = this.actionType
  291. if (this.pid != this.renameType) {
  292. this.checkType(this.renameType)
  293. }
  294. console.log(this.renameType);
  295. setTimeout(() => {
  296. this.$refs.renameInput[0].select();
  297. this.showActionDiv = false
  298. }, 500);
  299. },
  300. rename() {
  301. if (!this.renameInput) {
  302. this.$message.error('请输入分类名字');
  303. return
  304. }
  305. let type = this.renameType.split('-')
  306. let id = ''
  307. if (type.length == 1) {
  308. id = this.typeArray[type[0]].id
  309. } else {
  310. id = this.typeArray[type[0]].child[type[1]].id
  311. }
  312. let params = [{
  313. id: id,
  314. name: encodeURIComponent(this.renameInput)
  315. }];
  316. this.ajax
  317. .post(this.$store.state.api + "updateSourceFileName", params)
  318. .then((res) => {
  319. this.$message.success('修改成功');
  320. this.renameType = ''
  321. this.getData()
  322. })
  323. .catch((err) => {
  324. console.error(err);
  325. });
  326. },
  327. actionDelete() {
  328. let type = this.actionType.split('-')
  329. let id = ''
  330. let msg = ''
  331. if (type.length == 1) {
  332. if (this.typeArray[type[0]].child.length) {
  333. msg = '删除此分类后,该分类下的所有子分类将全部删除,确定删除此分类吗?'
  334. } else {
  335. msg = '确定删除此分类吗?'
  336. }
  337. id = this.typeArray[type[0]].id
  338. } else {
  339. msg = '确定删除此分类吗?'
  340. id = this.typeArray[type[0]].child[type[1]].id
  341. }
  342. this
  343. .$confirm(msg, "提示", {
  344. confirmButtonText: "确定",
  345. cancelButtonText: "取消",
  346. type: "warning",
  347. })
  348. .then(() => {
  349. let params = [{
  350. id: id,
  351. }];
  352. this.ajax
  353. .post(this.$store.state.api + "deleteSoureFileType", params)
  354. .then((res) => {
  355. this.$message.success('删除成功');
  356. this.showActionDiv = false
  357. this.getData()
  358. })
  359. .catch((err) => {
  360. console.error(err);
  361. });
  362. })
  363. .catch(() => {
  364. });
  365. },
  366. addFile(file){
  367. this.$emit('addFile', file)
  368. }
  369. },
  370. beforeDestroy() {
  371. document.removeEventListener('click', this.handleClickOutside);
  372. },
  373. mounted() {
  374. document.addEventListener('click', this.handleClickOutside);
  375. this.getData();
  376. },
  377. }
  378. </script>
  379. <style scoped>
  380. .l_box {
  381. width: 100%;
  382. height: 100%;
  383. background: #f0f2f5;
  384. box-sizing: border-box;
  385. display: flex;
  386. padding: 20px;
  387. }
  388. .l_type_box {
  389. width: 300px;
  390. height: 100%;
  391. background: #fff;
  392. border-radius: 5px;
  393. }
  394. .l_type_box>.header {
  395. width: 100%;
  396. padding: 15px 15px;
  397. box-sizing: border-box;
  398. border-bottom: 1px solid #E7E7E7;
  399. display: flex;
  400. justify-content: space-between;
  401. align-items: center;
  402. }
  403. .l_type_box>.header>.title {
  404. font-size: 24px;
  405. font-weight: bold;
  406. }
  407. .l_type_box>.header>.add {
  408. display: flex;
  409. cursor: pointer;
  410. align-items: center;
  411. height: 30px;
  412. padding: 0 8px;
  413. background: rgb(0, 97, 255);
  414. color: #fff;
  415. box-sizing: border-box;
  416. border-radius: 4px;
  417. font-size: 14px;
  418. align-items: center;
  419. }
  420. .l_type_box>.header>.add::before {
  421. content: '';
  422. display: block;
  423. width: 14px;
  424. height: 14px;
  425. margin-right: 7px;
  426. background-image: url('../../assets/icon/sourceFile/icon_add.png');
  427. background-size: 100% 100%;
  428. }
  429. .l_type_box>.nav {
  430. width: 100%;
  431. height: calc(100% - 62px);
  432. box-sizing: border-box;
  433. padding: 15px;
  434. overflow: auto;
  435. }
  436. .l_type_box>.nav>.nav_b {
  437. margin-top: 10px;
  438. }
  439. .l_type_box>.nav>.nav_b>.nav_box {
  440. height: 44px;
  441. width: 100%;
  442. display: flex;
  443. align-items: center;
  444. border-radius: 5px;
  445. padding: 0 10px;
  446. box-sizing: border-box;
  447. cursor: pointer;
  448. }
  449. .l_type_box>.nav>.nav_b>.nav_box>.name {
  450. font-size: 16px;
  451. color: #000000e6;
  452. white-space: nowrap;
  453. overflow: hidden;
  454. text-overflow: ellipsis;
  455. }
  456. .l_type_box .active2 {
  457. background: #fff;
  458. }
  459. .l_type_box .active2 .name {
  460. color: #3681FC !important;
  461. }
  462. .l_type_box .active {
  463. background: #3681fc;
  464. }
  465. .l_type_box .active1 {
  466. background: #3681fc !important;
  467. }
  468. .l_type_box .active .name,
  469. .l_type_box .active1 .name {
  470. color: #fff !important;
  471. }
  472. .l_type_box>.nav>.nav_b>.nav_box:hover {
  473. background: #e0eafb;
  474. }
  475. .l_type_box>.nav>.nav_b>.nav_box:hover .more {
  476. display: block;
  477. }
  478. .l_type_box>.nav>.nav_b>.nav_box>.icon {
  479. min-width: 16px;
  480. height: 16px;
  481. background-size: 100% 100%;
  482. margin-right: 10px;
  483. /* background: #000; */
  484. transition: all 0.3s;
  485. }
  486. .l_type_box>.nav>.nav_b>.nav_box>.no {
  487. background-image: url('../../assets/icon/sourceFile/icon_no.png');
  488. }
  489. .l_type_box>.nav>.nav_b>.nav_box.active1>.no {
  490. background-image: url('../../assets/icon/sourceFile/icon_no_active.png');
  491. }
  492. .l_type_box>.nav>.nav_b>.nav_box>.more {
  493. cursor: pointer;
  494. margin: 0 0 0 auto;
  495. display: none;
  496. background-image: url('../../assets/icon/sourceFile/icon_select.png');
  497. }
  498. .l_type_box>.nav>.nav_b>.nav_box>.haveL {
  499. transform: rotate(-90deg);
  500. background-image: url('../../assets/icon/sourceFile/icon_arrow.png');
  501. }
  502. .l_type_box>.nav>.nav_b>.nav_box.active2>.haveL {
  503. transform: rotate(-90deg);
  504. background-image: url('../../assets/icon/sourceFile/icon_arrow_active.png');
  505. }
  506. .l_type_box>.nav>.nav_b>.nav_box.open>.haveL {
  507. transform: rotate(0deg);
  508. }
  509. .l_type_box>.nav>.nav_b>.nav_child_box {
  510. margin-top: 10px;
  511. }
  512. .l_type_box>.nav>.nav_b>.nav_child_box>.nav_box+.nav_box {
  513. margin-top: 10px;
  514. }
  515. .l_type_box>.nav>.nav_b>.nav_child_box>.nav_box {
  516. height: 44px;
  517. width: 100%;
  518. display: flex;
  519. align-items: center;
  520. border-radius: 5px;
  521. padding: 0 10px;
  522. box-sizing: border-box;
  523. cursor: pointer;
  524. }
  525. .l_type_box>.nav>.nav_b>.nav_child_box>.nav_box>.name {
  526. font-size: 16px;
  527. color: #000000e6;
  528. white-space: nowrap;
  529. overflow: hidden;
  530. text-overflow: ellipsis;
  531. }
  532. .l_type_box>.nav>.nav_b>.nav_child_box>.nav_box:hover {
  533. background: #e0eafb;
  534. }
  535. .l_type_box>.nav>.nav_b>.nav_child_box>.nav_box.active:hover {
  536. background: #5E9AFC;
  537. }
  538. .l_type_box>.nav>.nav_b>.nav_child_box>.nav_box:hover .more {
  539. display: block;
  540. }
  541. .l_type_box>.nav>.nav_b>.nav_child_box>.nav_box>.icon {
  542. min-width: 16px;
  543. height: 16px;
  544. background-size: 100% 100%;
  545. margin-right: 10px;
  546. transition: all 0.3s;
  547. }
  548. .l_type_box>.nav>.nav_b>.nav_child_box>.nav_box>.more {
  549. margin: 0 0 0 auto;
  550. display: none;
  551. background-image: url('../../assets/icon/sourceFile/icon_select.png');
  552. }
  553. .l_type_box>.nav>.nav_b>.nav_child_box>.nav_box.active>.more {
  554. background-image: url('../../assets/icon/sourceFile/icon_select_active.png');
  555. }
  556. .add_box {
  557. height: 44px;
  558. width: 100%;
  559. display: flex;
  560. align-items: center;
  561. border-radius: 5px;
  562. padding: 0 3px 0 10px;
  563. box-sizing: border-box;
  564. cursor: pointer;
  565. background: #E1EDFD;
  566. margin-top: 10px;
  567. }
  568. .add_box>input {
  569. width: calc(100% - 16px);
  570. height: calc(100% - 6px);
  571. box-sizing: border-box;
  572. border: none;
  573. margin-left: 16px;
  574. border-radius: 5px;
  575. padding: 0 12px;
  576. font-size: 16px;
  577. outline: none;
  578. }
  579. .renameInput {
  580. width: calc(100% - 16px);
  581. height: calc(100% - 6px);
  582. box-sizing: border-box;
  583. border: none;
  584. border-radius: 5px;
  585. padding: 0 12px;
  586. font-size: 16px;
  587. outline: none;
  588. }
  589. .action-div {
  590. position: absolute;
  591. background: #ffffff;
  592. display: flex;
  593. flex-direction: column;
  594. border-radius: 5px;
  595. /* overflow: hidden; */
  596. padding: 5px 0;
  597. box-shadow: 0 0 2px 0px #00000021;
  598. }
  599. .action-div>div {
  600. width: 115px;
  601. height: 40px;
  602. line-height: 40px;
  603. cursor: pointer;
  604. padding: 0 10px;
  605. box-sizing: border-box;
  606. font-size: 14px;
  607. position: relative;
  608. z-index: 999;
  609. }
  610. .action-div>div:hover {
  611. background: #e0eafb;
  612. }
  613. .action-div>.move::after {
  614. content: '';
  615. position: absolute;
  616. display: block;
  617. width: 14px;
  618. height: 14px;
  619. right: 10px;
  620. top: 50%;
  621. transform: translateY(-50%) rotate(-90deg);
  622. background-image: url('../../assets/icon/sourceFile/icon_arrow.png');
  623. }
  624. .action-div>.move:hover .pid_box {
  625. display: flex;
  626. }
  627. .pid_box {
  628. position: absolute;
  629. right: 0;
  630. transform: translateX(100%);
  631. background: #ffffff;
  632. flex-direction: column;
  633. border-radius: 5px;
  634. /* overflow: hidden; */
  635. padding: 5px 0;
  636. box-shadow: 0 0 2px 0px #00000021;
  637. top: 0;
  638. display: none;
  639. }
  640. .pid_box>div {
  641. height: 40px;
  642. line-height: 40px;
  643. cursor: pointer;
  644. padding: 0 10px;
  645. box-sizing: border-box;
  646. font-size: 14px;
  647. overflow: hidden;
  648. text-overflow: ellipsis;
  649. white-space: nowrap;
  650. }
  651. .pid_box>div:hover {
  652. background: #e0eafb;
  653. }
  654. .l_file_box {
  655. width: calc(100% - 320px);
  656. margin-left: 20px;
  657. background: #fff;
  658. height: 100%;
  659. border-radius: 5px;
  660. overflow: hidden;
  661. }
  662. .l_none{
  663. color: #00000069;
  664. width: 100%;
  665. height: 100%;
  666. display: flex;
  667. align-items: center;
  668. justify-content: center;
  669. }
  670. </style>