indexCommon.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916
  1. <template>
  2. <div class="common-layout">
  3. <el-container>
  4. <el-header
  5. class="nav"
  6. style="position: sticky; top: 0; left: 0; width: 100%; z-index: 999"
  7. >
  8. <div class="nav-top">
  9. <div>
  10. <img class="logoImg" src="@/assets/images/logos.png" /><span
  11. >聚合智慧文档管理系统</span
  12. >
  13. </div>
  14. <div class="search">
  15. <el-input
  16. v-model="searchText"
  17. maxlength="32"
  18. class="w-50 m-2"
  19. size="small"
  20. placeholder="搜索文件"
  21. suffix-icon="Search"
  22. clearable
  23. @change="toSearch"
  24. @@keyup.enter="toSearch"
  25. />
  26. </div>
  27. <div>
  28. <el-dropdown
  29. @command="handleCommand"
  30. class="right-menu-item hover-effect"
  31. trigger="click"
  32. >
  33. <div class="avatar-wrapper">
  34. <img
  35. :src="
  36. userStore.avatar
  37. ? userStore.avatar
  38. : '@/assets/images/profile.png'
  39. " class="head-img" /><span style="cursor: pointer;margin-right: 6px;">{{ userStore.name }}</span>
  40. <el-icon><ArrowDown /></el-icon>
  41. </div>
  42. <template #dropdown>
  43. <el-dropdown-menu>
  44. <router-link to="/user/profile">
  45. <el-dropdown-item>个人中心</el-dropdown-item>
  46. </router-link>
  47. <el-dropdown-item divided command="logout">
  48. <span>退出登录</span>
  49. </el-dropdown-item>
  50. </el-dropdown-menu>
  51. </template>
  52. </el-dropdown>
  53. </div>
  54. </div>
  55. </el-header>
  56. <el-container>
  57. <el-aside width="92px" class="asides">
  58. <div class="aside-con">
  59. <router-link :to="item.path" v-for="(item, index) in menuList.data" :key="index"
  60. @click="clickPath(index, item)">
  61. <div style="position: relative" :class="
  62. $route.path == item.path
  63. ? 'acitve-img-style img-style'
  64. : 'img-style'
  65. ">
  66. <img :src="$route.path == item.path ? item.beimgs : item.imgs" />
  67. <div class="text-style" v-if="$route.path != item.path">
  68. {{ item.label }}
  69. </div>
  70. <span class="yuandian" v-if="
  71. hasNewMessage &&
  72. item.path == '/index' &&
  73. $route.path != item.path
  74. "></span>
  75. </div>
  76. </router-link><br />
  77. </div>
  78. </el-aside>
  79. <el-main class="main">
  80. <div class="tab_box">
  81. <!-- <el-tabs
  82. v-model="editableTabsValue"
  83. @tab-change="clickTab"
  84. @tab-add="addTab"
  85. type="card"
  86. class="common-tabs"
  87. > -->
  88. <el-tabs
  89. v-model="editableTabsValue"
  90. @tab-add="addTab"
  91. type="card"
  92. class="common-tabs"
  93. >
  94. <!-- <el-tab-pane label="首页" @click="clickTab('/index')"> </el-tab-pane> -->
  95. <el-tab-pane
  96. v-for="(item, index) in toRaw(editableTabs)"
  97. :key="item.path"
  98. :label="item.label"
  99. :name="item.path"
  100. :data-item="JSON.stringify(item)"
  101. >
  102. <template #label>
  103. <div class="tab_pane" @click="paneClick(item)">
  104. <div class="tab_text">{{ item.label }}</div>
  105. <img
  106. v-if="item.label != '首页'"
  107. src="@/assets/images/close.png"
  108. @click="closeTab(item, index, $event)"
  109. alt=""
  110. />
  111. </div>
  112. <!-- <router-link
  113. :key="item"
  114. :data-path="item.path"
  115. :to="{
  116. path: item.path,
  117. query: { row: item.clickRowId },
  118. }"
  119. @click="paneClick(item)"
  120. class="tags-view-item"
  121. >
  122. {{ item.label }}
  123. </router-link> -->
  124. </template>
  125. </el-tab-pane>
  126. <!-- 文件的iframe -->
  127. <div v-for="item in iFrameData" :key="item.id">
  128. <el-tab-pane :label="item.name" :name="item.id" v-if="item.src">
  129. <template #label>
  130. <div class="tab_pane" @click="filePaneClick(item)">
  131. <div class="tab_text">{{ item.name }}</div>
  132. <img
  133. src="@/assets/images/close.png"
  134. @click="closeFileTab(item, index, $event)"
  135. alt=""
  136. />
  137. </div>
  138. </template>
  139. </el-tab-pane>
  140. </div>
  141. </el-tabs>
  142. </div>
  143. <div v-show="isAlive">
  144. <router-view v-slot="{ Component }">
  145. <KeepAlive :exclude="['identifyFont', 'allback', 'search']">
  146. <component :is="Component" />
  147. </KeepAlive>
  148. </router-view>
  149. </div>
  150. <div v-show="!isAlive" style="width: 100%">
  151. <div v-for="item in iFrameData" :key="item.id">
  152. <div style="width: 100%" v-show="item.show">
  153. <iframe
  154. :src="item.src"
  155. frameborder="0"
  156. :id="`iframe${item.id}`"
  157. width="100%"
  158. height="800px"
  159. class="iframeBox"
  160. v-show="item.show"
  161. ></iframe>
  162. </div>
  163. </div>
  164. </div>
  165. </el-main>
  166. </el-container>
  167. </el-container>
  168. </div>
  169. </template>
  170. <script setup>
  171. import { nextTick, onMounted, provide, ref,watchEffect } from "vue";
  172. import { ElMessageBox, ElMessage } from "element-plus";
  173. import useAppStore from "@/store/modules/app";
  174. import useUserStore from "@/store/modules/user";
  175. import useSettingsStore from "@/store/modules/settings";
  176. import Cookies from "js-cookie";
  177. import chat from "@/assets/images/chat.png";
  178. import bechat from "@/assets/images/bechat.png";
  179. import zuijin from "@/assets/images/zuijin.png";
  180. import bezuijin from "@/assets/images/bezuijin.png";
  181. import colloect from "@/assets/images/colloect.png";
  182. import becolloect from "@/assets/images/becolloect.png";
  183. import system from "@/assets/images/system.png";
  184. import issystem from "@/assets/images/issystem.png";
  185. import my from "@/assets/images/my.png";
  186. import bemy from "@/assets/images/bemy.png";
  187. import bumen from "@/assets/images/bumen.png";
  188. import bebumen from "@/assets/images/bebumen.png";
  189. import common from "@/assets/images/common.png";
  190. import becommon from "@/assets/images/becommon.png";
  191. import chuanshu from "@/assets/images/chuanshu.png";
  192. import bechuanshu from "@/assets/images/bechuanshu.png";
  193. import highsearch from "@/assets/images/highsearch.png";
  194. import behighsearch from "@/assets/images/behighsearch.png";
  195. import manyBody from "@/assets/images/manyBody.png";
  196. import manyBodyFalse from "@/assets/images/manyBodyFalse.png";
  197. import { AppMain, Navbar, Settings, TagsView } from "./components";
  198. import { flieSearch } from "@/api/search/search.js";
  199. import { useRouter, useRoute } from "vue-router";
  200. import useWebsoctStore from "@/store/modules/websocket";
  201. import { toRaw } from "@vue/reactivity";
  202. import iFrame from "@/components/iFrame/index.vue";
  203. const websoctStore = useWebsoctStore();
  204. const router = useRouter(); //注册路由
  205. const route = useRoute();
  206. const appStore = useAppStore();
  207. const userStore = useUserStore();
  208. const settingsStore = useSettingsStore();
  209. const searchText = ref(""); //搜索ipt的值
  210. const selectValue = ref(1); //文档空间类型
  211. const wangzhi = import.meta.env.VITE_APP_BASE_API;
  212. const isAlive = ref(true);
  213. const toFileData = ref();
  214. const uid = useUserStore().uid;
  215. const iFrameData = ref([
  216. {
  217. id: 1,
  218. // src: `${window.location.origin}/fileEdit?clickRowId=113`,
  219. show: false,
  220. name: "file1",
  221. docId:''
  222. },
  223. {
  224. id: 2,
  225. src: ``,
  226. // src: `http://192.168.1.9:81/fileEdit?clickRowId=1198`,
  227. show: false,
  228. name: "file2",
  229. docId:''
  230. },
  231. {
  232. id: 3,
  233. src: ``,
  234. show: false,
  235. name: "",
  236. docId:''
  237. },
  238. {
  239. id: 4,
  240. src: ``,
  241. show: false,
  242. name: "",
  243. docId:''
  244. },
  245. {
  246. id: 5,
  247. src: ``,
  248. show: false,
  249. name: "",
  250. docId:''
  251. },
  252. {
  253. id: 6,
  254. src: ``,
  255. show: false,
  256. name: "",
  257. docId:''
  258. },
  259. {
  260. id: 7,
  261. src: ``,
  262. show: false,
  263. name: "",
  264. docId:''
  265. },
  266. {
  267. id: 8,
  268. src: ``,
  269. show: false,
  270. name: "",
  271. docId:''
  272. },
  273. {
  274. id: 9,
  275. src: ``,
  276. show: false,
  277. name: "",
  278. docId:''
  279. },
  280. {
  281. id: 10,
  282. src: ``,
  283. show: false,
  284. name: "",
  285. docId:''
  286. },
  287. ]);
  288. //--------tabs-----------------
  289. let tabIndex = 2;
  290. const editableTabsValue = ref("/index");
  291. const editableTabs = ref([{label:'首页',path:'/reindex'}]);
  292. // const removeTab = (targetName) => {
  293. // const tabs = editableTabs.value;
  294. // let activeName = editableTabsValue.value;
  295. // if (activeName === targetName) {
  296. // tabs.forEach((tab, index) => {
  297. // if (tab.name === targetName) {
  298. // const nextTab = tabs[index + 1] || tabs[index - 1];
  299. // if (nextTab) {
  300. // activeName = nextTab.name;
  301. // }
  302. // }
  303. // });
  304. // }
  305. // editableTabsValue.value = activeName;
  306. // editableTabs.value = tabs.filter((tab) => tab.name !== targetName);
  307. // };
  308. //-------------------------
  309. function reload() {
  310. isAlive.value = false;
  311. console.log(11);
  312. nextTick(() => {
  313. isAlive.value = true;
  314. });
  315. }
  316. provide("reload", reload);
  317. function toggleSideBar() {
  318. appStore.toggleSideBar();
  319. }
  320. const logingName = ref("");
  321. onMounted(() => {
  322. logingName.value = Cookies.get("username");
  323. // console.log('router',router)
  324. });
  325. watchEffect(async() => {
  326. console.log("===============有新消息了:",websoctStore.messOne)
  327. if(websoctStore.noReadList!=null)hasNewMessage.value = true
  328. else hasNewMessage.value = false
  329. console.log("===============websoctStore.noReadList:",websoctStore.noReadList,'===========',hasNewMessage.value)
  330. });
  331. function handleCommand(command) {
  332. switch (command) {
  333. case "setLayout":
  334. setLayout();
  335. break;
  336. case "logout":
  337. logout();
  338. break;
  339. default:
  340. break;
  341. }
  342. }
  343. function logout() {
  344. ElMessageBox.confirm("确定注销并退出系统吗?", "提示", {
  345. confirmButtonText: "确定",
  346. cancelButtonText: "取消",
  347. type: "warning",
  348. })
  349. .then(() => {
  350. userStore.logOut().then(() => {
  351. location.href = "/index";
  352. });
  353. })
  354. .catch(() => {});
  355. }
  356. // 跳转到全文搜索
  357. const toSearch = async () => {
  358. if (!searchText.value) return;
  359. // console.log('searchText = ',searchText.value);
  360. const query = {
  361. keyword: searchText.value,
  362. isAsc: "asc",
  363. orderByColumn: "createTime",
  364. pageSize: 3,
  365. pageNum: 1,
  366. };
  367. const res = await flieSearch(query);
  368. // console.log("res", res);
  369. if (res) {
  370. // console.log("res", res);
  371. // console.log("router", route.path);
  372. if (route.path != "/search") {
  373. router.push({
  374. path: "/search",
  375. query: {
  376. searchData: JSON.stringify(res),
  377. searchText: searchText.value,
  378. },
  379. });
  380. } else {
  381. router.replace({
  382. path: "/allback",
  383. query: {
  384. searchData: JSON.stringify(res),
  385. searchText: searchText.value,
  386. },
  387. });
  388. }
  389. }
  390. };
  391. const emits = defineEmits(["setLayout"]);
  392. function setLayout() {
  393. emits("setLayout");
  394. }
  395. const clickId = ref("");
  396. const menuList = reactive({
  397. data: [
  398. {
  399. label: "会话消息",
  400. path: "/index",
  401. imgs: chat,
  402. beimgs: bechat,
  403. },
  404. // {
  405. // label: "接口",
  406. // path: "/swagger",
  407. // imgs: chat,
  408. // beimgs: bechat,
  409. // disabled:true
  410. // },
  411. {
  412. label: "最近文件",
  413. path: "/recent",
  414. imgs: zuijin,
  415. beimgs: bezuijin,
  416. },
  417. {
  418. label: "收藏文件",
  419. path: "/collect",
  420. imgs: colloect,
  421. beimgs: becolloect,
  422. },
  423. {
  424. label: "我的文件",
  425. path: "/myfile",
  426. imgs: my,
  427. beimgs: bemy,
  428. },
  429. {
  430. label: "部门文件",
  431. path: "/department",
  432. imgs: bumen,
  433. beimgs: bebumen,
  434. },
  435. {
  436. label: "公共文件",
  437. path: "/publicment",
  438. imgs: common,
  439. beimgs: becommon,
  440. },
  441. {
  442. label: "高级搜索",
  443. path: "/highsearch",
  444. imgs: highsearch,
  445. beimgs: behighsearch,
  446. },
  447. // {
  448. // label: "传输列表",
  449. // path: "/transFile",
  450. // imgs: chuanshu,
  451. // beimgs: bechuanshu,
  452. // },
  453. // {
  454. // label: "系统管理",
  455. // path: "/admin",
  456. // imgs: system,
  457. // beimgs: issystem,
  458. // },
  459. {
  460. label: "我的协作",
  461. path: "/myjoin",
  462. imgs: manyBody,
  463. beimgs: manyBodyFalse,
  464. },
  465. ],
  466. });
  467. const clickPath = (index, items) => {
  468. items = toRaw(items);
  469. // toFileData.value = null
  470. console.log("clickPathitems", items);
  471. // editableTabs.value = arr;
  472. const arr = toRaw(editableTabs.value);
  473. if (!arr.some((item) => item.label == items.label)) {
  474. editableTabs.value.push({
  475. label: items.label,
  476. path: items.path,
  477. });
  478. //需要jSON去转 否则页面无变化 离谱得很
  479. editableTabs.value = JSON.parse(JSON.stringify(editableTabs.value));
  480. } else {
  481. toFileData.value = null;
  482. clickTab(items.path);
  483. }
  484. editableTabsValue.value = items.path;
  485. isAlive.value = true;
  486. // console.log("editableTabs", editableTabs.value);
  487. };
  488. const clickTab = (item) => {
  489. console.log("item", toRaw(item));
  490. setTimeout(() => {
  491. console.log("toFileData.value", toFileData.value);
  492. if (toFileData.value) {
  493. console.log(
  494. "tofolder",
  495. JSON.stringify(toRaw(toFileData.value.clickRowId))
  496. );
  497. router.push({
  498. path: toFileData.value.path,
  499. query: {
  500. // row: JSON.stringify(toRaw(toFileData.value.clickRowId)),
  501. },
  502. });
  503. // router.push({
  504. // path: toFileData.value.path,
  505. // query: {
  506. // row: toFileData.value.row,
  507. // },
  508. // });
  509. return;
  510. }
  511. let regExp = new RegExp(/^\//);
  512. if (!regExp.test(toRaw(item))) {
  513. const data = JSON.parse(toRaw(item));
  514. console.log("data", data);
  515. router.push({
  516. // path: "/fileEdit" + data.docId,
  517. path: "/fileEdit",
  518. query: {
  519. clickRowId: data.docId,
  520. // row:JSON.stringify(toFileData.value)
  521. // copyRow: JSON.stringify(data),
  522. },
  523. });
  524. } else {
  525. router.push({
  526. path: item,
  527. });
  528. }
  529. }, 0);
  530. };
  531. const paneClick = (item) => {
  532. // 可以拿到当前的标签对象
  533. isAlive.value = true;
  534. console.log("paneItem", item);
  535. if (item.clickRowId) {
  536. // 判断是菜单还是目录
  537. toFileData.value = item;
  538. } else {
  539. toFileData.value = null;
  540. }
  541. clickTab(item.path);
  542. // console.log("isAlive", isAlive.value);
  543. };
  544. // 点击文件标签
  545. const filePaneClick = (item) => {
  546. console.log("filePaneClickitem", item);
  547. const row = toRaw(item);
  548. const arr = iFrameData.value.map((par) => {
  549. if (par.id === row.id) {
  550. // editableTabsValue.value = row.id
  551. par.show = true;
  552. // document.getElementById('iframe'+par.id).window.document.iframe[0]
  553. const outIframe = document.getElementById("iframe" + par.id);
  554. const inIframe =
  555. outIframe.contentDocument.getElementsByTagName("iframe")[0];
  556. setTimeout(() => {
  557. console.error(outIframe.parentElement);
  558. inIframe.style.height = outIframe.style.height =
  559. outIframe.parentElement.offsetHeight + "px";
  560. inIframe.style.width = outIframe.style.width =
  561. outIframe.parentElement.offsetWidth + "px";
  562. // console.log('dom',outIframe.parentElement.offsetWidth);
  563. // console.log('inIframe',inIframe);
  564. }, 500);
  565. } else {
  566. par.show = false;
  567. }
  568. return toRaw(par);
  569. });
  570. iFrameData.value = arr;
  571. // console.log("Clicknewfilearr", iFrameData.value);
  572. isAlive.value = false;
  573. // console.log("editableTabsValue", editableTabsValue.value);
  574. };
  575. // 创建文件的标签
  576. const addFileTab = (data) => {
  577. console.log("fileTabdata", data);
  578. console.log();
  579. const thisData = JSON.parse(JSON.stringify(toRaw(data)));
  580. const oldIFrameData = iFrameData.value;
  581. const canAdd = oldIFrameData.some((par) => par.src == ""); //是否达到上限
  582. if (!canAdd) return ElMessage.error("已到最大数量,请先关闭其他文件!");
  583. const hasThis = oldIFrameData.find((par) => par.docId == data.docId);//是否已存在
  584. if (hasThis){
  585. const thisPane = toRaw(hasThis)
  586. console.log('hasThis',thisPane);
  587. const arr = oldIFrameData.map((par) => {
  588. if (par.id == thisPane.id) {
  589. par.show = true
  590. editableTabsValue.value = par.id// 标签跳转
  591. }else{
  592. par.show = false
  593. }
  594. return toRaw(par);
  595. });
  596. iFrameData.value = arr;
  597. isAlive.value = false;
  598. return
  599. }
  600. const arr = oldIFrameData.map((par) => {
  601. if (!par.src) {
  602. if (thisData.docId) {
  603. // par.src = `${window.location.origin}/fileEdit?clickRowId=${thisData.docId}`;
  604. par.src = `${window.location.origin}/fileEdit?clickRowId=${thisData.docId}`;
  605. par.name = data.fileName;
  606. par.docId = data.docId
  607. par.show = true
  608. thisData.docId = "";
  609. editableTabsValue.value = par.id// 新建时标签跳转
  610. }
  611. }else{
  612. par.show = false
  613. }
  614. return toRaw(par);
  615. });
  616. iFrameData.value = arr;
  617. isAlive.value = false;
  618. console.log("addFileTab", arr);
  619. };
  620. //创建tab标签事件
  621. const addTab = (data) => {
  622. console.log("addTab", data);
  623. const arr = toRaw(editableTabs.value);
  624. if (!arr.some((item) => item.label == data.fileName)) {
  625. // editableTabs.value.push({
  626. // label: data.fileName,
  627. // path: JSON.stringify(data),
  628. // });
  629. editableTabs.value.push({
  630. label: data.fileName,
  631. path: JSON.stringify(data),
  632. });
  633. //需要jSON去转 否则页面无变化 离谱得很
  634. editableTabs.value = JSON.parse(JSON.stringify(editableTabs.value));
  635. // editableTabsValue.value = data.path;
  636. }
  637. };
  638. const addFolderAdd = (data) => {
  639. console.log("data", data);
  640. const arr = toRaw(editableTabs.value);
  641. if (!arr.some((item) => item.label == data.row.dirName)) {
  642. editableTabs.value.push({
  643. label: data.name,
  644. path: data.path,
  645. clickRowId: data.row,
  646. });
  647. //需要jSON去转 否则页面无变化 离谱得很
  648. editableTabs.value = JSON.parse(JSON.stringify(editableTabs.value));
  649. }
  650. console.log("editableTabs", toRaw(editableTabs.value));
  651. };
  652. provide("addTab", addTab);
  653. provide("addFolderAdd", addFolderAdd);
  654. provide("addFileTab", addFileTab);
  655. // TODO 删除tab事件
  656. const closeTab = (item, index, e) => {
  657. e.preventDefault();
  658. e.stopPropagation();
  659. editableTabs.value.splice(index, 1);
  660. editableTabs.value = JSON.parse(JSON.stringify(editableTabs.value));
  661. const nextTab =
  662. editableTabs.value[index + 1] || editableTabs.value[index - 1];
  663. clickTab(nextTab.path);
  664. // console.log("item", item);
  665. // console.log("index", index);
  666. // console.log("e", e);
  667. };
  668. // TODO 删除tab事件
  669. const closeFileTab = (item, index, e) => {
  670. e.preventDefault();
  671. e.stopPropagation();
  672. const data = toRaw(item);
  673. console.log("closeFileTab", data);
  674. const arr = iFrameData.value.map((par) => {
  675. if (par.id === data.id) {
  676. par.src = "";
  677. par.show = false;
  678. par.name = "";
  679. par.docId = ''
  680. }
  681. return toRaw(par);
  682. });
  683. iFrameData.value = arr;
  684. isAlive.value = true;
  685. // console.log("index", index);
  686. console.log("iFrameData", iFrameData.value);
  687. };
  688. </script>
  689. <style lang="scss" scoped>
  690. @import "@/assets/styles/mixin.scss";
  691. @import "@/assets/styles/variables.module.scss";
  692. //整体布局css
  693. .common-layout,
  694. .el-container {
  695. height: 94vh;
  696. }
  697. :deep .el-main {
  698. --el-main-padding: 8px !important;
  699. }
  700. .nav {
  701. background: #06286c;
  702. height: 48px;
  703. .nav-top {
  704. width: 98%;
  705. display: flex;
  706. justify-content: space-between;
  707. & > div:first-child {
  708. font-family: "Inter-SemiBold";
  709. }
  710. & > div:first-child,
  711. & > div:last-child {
  712. display: flex;
  713. align-items: center;
  714. color: #fff;
  715. & > img {
  716. width: 48px;
  717. height: 48px;
  718. }
  719. }
  720. .logoImg {
  721. width: 150px !important;
  722. height: 100%;
  723. margin-right: 10px;
  724. }
  725. }
  726. .head-img {
  727. border-radius: 12px;
  728. width: 24px;
  729. height: 24px;
  730. margin-right: 10px;
  731. }
  732. .avatar-wrapper {
  733. color: #fff;
  734. display: flex;
  735. align-items: center;
  736. }
  737. .search {
  738. .w-50,
  739. :deep .el-input {
  740. width: 400px;
  741. height: 32px;
  742. border-radius: 4px;
  743. margin-top: 8px;
  744. background: #6f85b5 !important;
  745. --el-input-border-color: #6f85b5;
  746. }
  747. ::v-deep .el-input__inner {
  748. color: #fff !important;
  749. }
  750. }
  751. :deep .el-input__wrapper {
  752. background: #1f3f7e !important;
  753. }
  754. }
  755. .asides {
  756. padding: 8px 10px !important;
  757. font-size: 14px;
  758. color: #000;
  759. background: #fff;
  760. }
  761. .main {
  762. background: #c7cbd8;
  763. }
  764. // tabs标签
  765. .tab_box {
  766. width: 100%;
  767. height: 32px;
  768. border-radius: 4px 4px 4px 4px;
  769. background-color: #fff;
  770. margin-bottom: 8px;
  771. .common-tabs {
  772. height: 32px;
  773. // display: flex;
  774. // align-items: center;
  775. }
  776. .tab_pane {
  777. display: flex;
  778. align-items: center;
  779. justify-content: space-between;
  780. img {
  781. margin-left: 8px;
  782. width: 10px;
  783. height: 10px;
  784. }
  785. }
  786. }
  787. :deep(.common-tabs .el-tabs__item) {
  788. height: 24px !important;
  789. padding: 0px 8px !important;
  790. margin-top: 4px !important;
  791. margin-left: 4px !important;
  792. border: 1px solid #c1cce3 !important;
  793. color: #505870 !important;
  794. font-size: 12px !important;
  795. line-height: 24px;
  796. font-weight: 400 !important;
  797. }
  798. // tag选中颜色
  799. :deep(.common-tabs .el-tabs__item.is-active) {
  800. color: #fff !important;
  801. font-weight: normal;
  802. background-color: #6f85b5;
  803. }
  804. //侧边栏css
  805. .acitve-img-style {
  806. background-color: #f5f7f9;
  807. border-radius: 4px;
  808. }
  809. .img-style {
  810. width: 72px;
  811. height: 72px;
  812. display: flex;
  813. margin-bottom: 8px;
  814. flex-direction: column;
  815. align-items: center;
  816. justify-content: center;
  817. & > img {
  818. width: 40px;
  819. height: 40px;
  820. }
  821. }
  822. .text-style {
  823. text-align: center;
  824. color: #000;
  825. }
  826. </style>
  827. <style lang="scss" scoped>
  828. .el-popper.is-light.type_popper {
  829. background-color: #1f3f7e !important;
  830. border-radius: 4px 4px 4px 4px !important;
  831. border: none !important;
  832. // padding: 0 16px !important;
  833. // box-sizing: border-box !important;
  834. }
  835. .el-popper__arrow::before {
  836. content: none;
  837. }
  838. //鼠标移动上去的选中色
  839. .type_popper {
  840. .el-select-dropdown__item.hover,
  841. .el-select-dropdown__item:hover {
  842. background: #6f85b5 !important;
  843. }
  844. //下拉框的文本颜色
  845. .el-select-dropdown__item {
  846. color: #a4b0d8 !important;
  847. }
  848. //选中之后的颜色
  849. .el-select-dropdown__item.selected {
  850. background: #6f85b5 !important;
  851. color: #fff !important;
  852. }
  853. }
  854. .yuandian {
  855. width: 8px;
  856. height: 8px;
  857. position: absolute;
  858. right: 8px;
  859. top: 6px;
  860. background: #fa5151;
  861. border-radius: 4px;
  862. }
  863. ::v-deep .qualityManual-container-office {
  864. width: 1000px !important;
  865. height: 1000px !important;
  866. iframe {
  867. width: 1000px !important;
  868. height: 1000px !important;
  869. }
  870. }
  871. </style>