index.vue 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893
  1. <script setup>
  2. import { computed, reactive, ref, toRefs,watch } from "vue";
  3. import { useRoute,useRouter } from 'vue-router'
  4. import { useQuitSystem } from '@/hooks/login/use-login'
  5. import { customInterence, roadshowInterence,departInterence } from "@/api/api";
  6. import { ElMessageBox } from 'element-plus'
  7. import { Expand,Fold } from '@element-plus/icons-vue'
  8. import BreadCrumb from '../breadcrumb/index.vue'
  9. import questionMsgDia from '@/components/questionMsgDia.vue'
  10. const props = defineProps({
  11. isCollapse: Boolean,
  12. });
  13. const emit = defineEmits({
  14. "changeCollapese" : Function
  15. })
  16. const $route = useRoute()
  17. const $router = useRouter()
  18. const sysUserName = localStorage.getItem('userName') || ''
  19. const done = computed(() => {
  20. //今日待办是否处理完
  21. if(!todayList.value.length){
  22. return false
  23. }
  24. // 之前是通过判断列表中是否都有说明,现需要判断列表中都要添加或编辑
  25. return todayList.value.every(item=>item.isEdited)
  26. })
  27. const Role = computed(() => {
  28. let role = localStorage.getItem('Role') || '';
  29. return role;
  30. })
  31. const isShowHelpDoc = computed(() => {
  32. let role = localStorage.getItem('RoleIdentity') || '';
  33. const roleArr = ['rai_group','ficc_group','rai_admin','ficc_admin','rai_seller','ficc_seller','admin']
  34. return roleArr.includes(role)
  35. })
  36. watch(
  37. () => $route.path,
  38. (newval) => {
  39. if(newval === '/sealApprovalList'){
  40. isShowApprovalNotice.value = true
  41. }
  42. }
  43. )
  44. const isCollapse = computed(()=> props.isCollapse)
  45. function collapseHandle() {
  46. // 派发折叠导航栏事件
  47. emit('changeCollapese')
  48. }
  49. //获取销售今日待办
  50. const show = ref(false); //显示销售今日待办列表
  51. const todayListOpen = ref("auto"); //auto 自动打开的今日待办 不可关闭 其余为点击导航打开的
  52. const todayList = ref([]);
  53. const todayHistoryList = ref([]); //销售今日待办某项的历史数据
  54. async function getSellerTodayList(type) {
  55. todayListOpen.value = type;
  56. let ReasonStatus = -1;
  57. if (type === "auto") {
  58. ReasonStatus = -1;
  59. } else {
  60. ReasonStatus = 0;
  61. }
  62. const res = await customInterence.sellerTodayList({
  63. ReasonStatus: ReasonStatus,
  64. PageSize: 10000,
  65. CurrentIndex: 1,
  66. });
  67. if (res.Ret === 200) {
  68. if (type === "auto" && res.Data.Paging.Totals > 0) {
  69. // 自动弹出清除上次说明
  70. res.Data.List &&
  71. res.Data.List.forEach((item) => (item.RenewalReason = ""));
  72. }
  73. if ((type === "auto" && res.Data.Paging.Totals > 0) || type !== "auto") {
  74. show.value = true;
  75. } else {
  76. getSellerFeedBackList();
  77. }
  78. todayList.value = res.Data.List;
  79. }
  80. }
  81. /* 获取销售路演待反馈 */
  82. const isFeedbackDialog = ref(false);
  83. const roadshowFeedbackList = ref([]);
  84. const isShowApprovalNotice = ref(false); // 是否显示用印审批的公告
  85. function getSellerFeedBackList() {
  86. roadshowInterence.toFeedbacklist().then((res) => {
  87. if (res.Ret !== 200) return;
  88. const { Data } = res;
  89. if (!Data || !Data.length) return;
  90. isFeedbackDialog.value = true;
  91. roadshowFeedbackList.value = Data;
  92. });
  93. }
  94. /* 消息代办 */
  95. const noticeState = reactive({
  96. noticeList:[],//消息提醒列表
  97. isShowNotice:false,//显示提示红点
  98. currentNoticeList:[],//当前显示的消息提醒列表
  99. noticeType:'客户',//消息类型 客户/合同/用印
  100. noticeCount:0,//总共多少消息
  101. flag1:false,//显示客户提示红点
  102. flag2:false,//显示合同提示红点
  103. flag3:false,//显示用印提示红点
  104. flag4:false,
  105. flag5:false,//显示ETA试用相关的红点
  106. flag6:false,//显示出差相关的红点
  107. })
  108. /* 待办事项列表 */
  109. function getNotice() {
  110. customInterence.noticeList().then(res => {
  111. if(res.Ret === 200) {
  112. res.Data.Company.List&&res.Data.Company.List.forEach(item => {
  113. item.CreateTime = item.CreateTime.replace(/-/g,'.')
  114. });
  115. res.Data.Contract.List&&res.Data.Contract.List.forEach(item => {
  116. item.CreateTime = item.CreateTime.replace(/-/g,'.')
  117. });
  118. res.Data.Seal.List&&res.Data.Seal.List.forEach(item => {
  119. item.CreateTime = item.CreateTime.replace(/-/g,'.')
  120. });
  121. res.Data.EdbReplace.List&&res.Data.EdbReplace.List.forEach(item => item.CreateTime = item.CreateTime.replace(/-/g,'.'));
  122. res.Data.BusinessTrip.List&&res.Data.BusinessTrip.List.forEach(item => item.CreateTime = item.CreateTime.replace(/-/g,'.'));
  123. noticeState.noticeList = res.Data;
  124. noticeState.noticeCount= Role.value === 'admin' ? res.Data.EdbReplace.Total+res.Data.BusinessTrip.Total :
  125. res.Data.Company.Total+res.Data.Contract.Total+res.Data.Seal.Total + res.Data.EdbReplace.Total+res.Data.BusinessTrip.Total;
  126. noticeState.noticeType = Role.value === 'admin' ? '更新' : '客户';
  127. // 默认显示客户
  128. noticeState.currentNoticeList = Role.value === 'admin' ? res.Data.EdbReplace.List : res.Data.Company.List
  129. // 检查是否有未读的
  130. if(Role.value !=='admin'){
  131. noticeState.flag1=res.Data.Company.List.some(item => {
  132. return item.MessageStatus === 0;
  133. })
  134. noticeState.flag2=res.Data.Contract.List.some(item => {
  135. return item.MessageStatus === 0;
  136. })
  137. noticeState.flag3=res.Data.Seal.List.some(item => {
  138. return item.MessageStatus === 0;
  139. })
  140. }
  141. noticeState.flag5=res.Data.ETATrial.List.some(item => {
  142. return item.MessageStatus === 0;
  143. })
  144. noticeState.flag6=res.Data.BusinessTrip.List.some(item => {
  145. return item.MessageStatus === 0;
  146. })
  147. }
  148. })
  149. }
  150. getNotice()
  151. // 切换通知消息类型
  152. function handleNoticeTypeChange(e){
  153. noticeState.noticeType=e
  154. if(e==='客户'){
  155. noticeState.currentNoticeList=noticeState.noticeList.Company.List
  156. }else if(e==='合同'){
  157. noticeState.currentNoticeList=noticeState.noticeList.Contract.List
  158. }else if (e === '用印'){
  159. noticeState.currentNoticeList=noticeState.noticeList.Seal.List
  160. }else if(e==='ETA试用'){
  161. noticeState.currentNoticeList=noticeState.noticeList.ETATrial.List
  162. }else if(e==='出差'){
  163. noticeState.currentNoticeList=noticeState.noticeList.BusinessTrip.List
  164. }else{
  165. noticeState.currentNoticeList=noticeState.noticeList.EdbReplace.List
  166. }
  167. }
  168. /* 点击消息列表 跳转审批列表 */
  169. function noticeClick(item) {
  170. customInterence.readNotice({
  171. Id:Number(item.Id)
  172. }).then(res => {
  173. if(res.Ret===200) {
  174. item.MessageStatus = 1;
  175. if(noticeState.noticeType==='客户'){
  176. if($route.path!='/approvalList') {
  177. $router.push({
  178. path:'/approvalList'
  179. })
  180. }else {
  181. window.location.reload();
  182. }
  183. }else if(noticeState.noticeType==='合同'){
  184. let Role=localStorage.getItem('Role')
  185. // 主管跳转合同审批列表
  186. if(Role==='ficc_admin'||Role==='rai_admin'){
  187. if($route.path!='/contractapprovallist') {
  188. $router.push({
  189. path:'/contractapprovallist'
  190. })
  191. }else {
  192. window.location.reload();
  193. }
  194. }else{
  195. if($route.path!='/contractmanagelist') {
  196. $router.push({
  197. path:'/contractmanagelist'
  198. })
  199. }else {
  200. window.location.reload();
  201. }
  202. }
  203. }else if(noticeState.noticeType==='用印'){
  204. // 用印
  205. if($route.path!='/sealApprovalList') {
  206. $router.push({
  207. path:'/sealApprovalList'
  208. })
  209. }else {
  210. window.location.reload();
  211. }
  212. }else if(noticeState.noticeType==='ETA试用'){
  213. const path = $route.path
  214. let pushPath = '/etaApprovalList'
  215. //非管理员:若通过跳转用户列表,若驳回跳转审批列表
  216. //const etaApprovalListType = item.Content.includes('通过')?'approved':'all'
  217. const etaApprovalListType = item.Redirect===1?'approved':'all'
  218. sessionStorage.setItem('etaApprovalListType',etaApprovalListType)
  219. if(path==pushPath){
  220. window.location.reload();
  221. }else{
  222. $router.push(pushPath)
  223. }
  224. }else if(noticeState.noticeType==='出差'){
  225. const path = $route.path
  226. let pushPath;
  227. if(item.ApprovalStatus!=1){
  228. // 跳到申请列表
  229. pushPath= '/businessTripApplication'
  230. }else{
  231. // 跳到审批列表
  232. pushPath = '/businessTripApproval'
  233. }
  234. if(path==pushPath){
  235. window.location.reload();
  236. }else{
  237. $router.push(pushPath)
  238. }
  239. }
  240. }
  241. })
  242. }
  243. // 跳转去其他的系统
  244. async function linkToOtherMS(key){
  245. /**
  246. * HR_MANAGEMENT_SYSTEM -- HR管理系统
  247. * FINANCIAL_MANAGEMENT_SYSTEM -- 财务管理系统
  248. */
  249. let href = import.meta.env[key]
  250. console.log(href);
  251. if(key==='VITE_ETA_SYSTEM'){//跳转ETA系统
  252. // 获取临时code
  253. const res=await departInterence.getToETASysCode()
  254. if(res.Ret===200){
  255. href=`${href}?code=${res.Data}`
  256. }
  257. }
  258. window.open(href,'_blank');
  259. }
  260. function toOperation (url) {
  261. let {href} = $router.resolve({path:`/${url}`});
  262. window.open(href,'_blank');
  263. }
  264. /* 退出 */
  265. function logout() {
  266. ElMessageBox.confirm(
  267. '确认退出吗?',
  268. '提示',
  269. { type: 'warning', }
  270. )
  271. .then(() => {
  272. useQuitSystem()
  273. })
  274. .catch()
  275. }
  276. //修改密码
  277. function resetpwd() {
  278. $router.push({ path: "/resetpsd" });
  279. }
  280. const { noticeList,isShowNotice,currentNoticeList,noticeType,noticeCount,flag1,flag2,flag3,flag4,flag5,flag6 } = toRefs(noticeState);
  281. </script>
  282. <template>
  283. <el-container>
  284. <div id="main_right">
  285. <div class="main_right_top">
  286. <div class="main_left_container">
  287. <div class="main_left_section">
  288. <!-- 折叠按钮 -->
  289. <div class="coll_btn" @click="collapseHandle">
  290. <el-icon class="coll_ico" v-if="isCollapse">
  291. <Expand />
  292. </el-icon>
  293. <el-icon class="coll_ico" v-else>
  294. <Fold />
  295. </el-icon>
  296. </div>
  297. <!-- 面包屑 -->
  298. <BreadCrumb/>
  299. </div>
  300. <div class="approval_notice" v-show="isShowApprovalNotice">
  301. <img src="~@/assets/img/approval_ notice.png" alt="用印审批公告" />
  302. <div>纸质合同的用印交付时间为上午10:30-11:30,下午16:00-17:30</div>
  303. </div>
  304. </div>
  305. <div class="right_section">
  306. <!-- 财务系统 -->
  307. <div
  308. class="jump-other-sys-item"
  309. @click="linkToOtherMS('VITE_FINANCIAL_MANAGEMENT_SYSTEM')"
  310. >
  311. <img class="icon" src="~@/assets/img/home/icon01.png" alt="" />
  312. <span>财务系统</span>
  313. </div>
  314. <div
  315. class="jump-other-sys-item"
  316. @click="linkToOtherMS('VITE_HR_MANAGEMENT_SYSTEM')"
  317. >
  318. <img class="icon" src="~@/assets/img/home/icon02.png" alt="" />
  319. <span>HR系统</span>
  320. </div>
  321. <div class="jump-other-sys-item" @click="linkToOtherMS('VITE_ETA_SYSTEM')">
  322. <img class="icon" src="~@/assets/img/home/icon03.png" alt="" />
  323. <span>ETA投研系统</span>
  324. </div>
  325. <!-- 留言板消息通知 -->
  326. <questionMsgDia></questionMsgDia>
  327. <el-popover
  328. placement="bottom"
  329. width="610"
  330. trigger="hover"
  331. popper-class="notice_poper"
  332. >
  333. <div>
  334. <h4 style="padding-bottom: 12px; border-bottom: 1px solid #dcdfe6">
  335. 待办事项({{ noticeCount }}项)
  336. </h4>
  337. <div class="notice-nav-box">
  338. <div
  339. class="notice-nav-item"
  340. @click="handleNoticeTypeChange('客户')"
  341. :class="noticeType === '客户' ? 'notice-nav-active' : ''"
  342. v-if="Role !== 'admin'"
  343. >
  344. <span>客户</span>
  345. <span
  346. style="
  347. width: 8px;
  348. height: 8px;
  349. border-radius: 50%;
  350. background: #f00;
  351. display: block;
  352. position: absolute;
  353. right: -8px;
  354. top: 0px;
  355. "
  356. v-if="flag1"
  357. ></span>
  358. </div>
  359. <div
  360. class="notice-nav-item"
  361. @click="handleNoticeTypeChange('合同')"
  362. :class="noticeType === '合同' ? 'notice-nav-active' : ''"
  363. v-if="Role !== 'admin'"
  364. >
  365. <span>合同</span>
  366. <span
  367. style="
  368. width: 8px;
  369. height: 8px;
  370. border-radius: 50%;
  371. background: #f00;
  372. display: block;
  373. position: absolute;
  374. right: -8px;
  375. top: 0px;
  376. "
  377. v-if="flag2"
  378. ></span>
  379. </div>
  380. <div
  381. class="notice-nav-item"
  382. @click="handleNoticeTypeChange('用印')"
  383. :class="noticeType === '用印' ? 'notice-nav-active' : ''"
  384. v-if="Role !== 'admin'"
  385. >
  386. <span>用印</span>
  387. <span
  388. style="
  389. width: 8px;
  390. height: 8px;
  391. border-radius: 50%;
  392. background: #f00;
  393. display: block;
  394. position: absolute;
  395. right: -8px;
  396. top: 0px;
  397. "
  398. v-if="flag3"
  399. ></span>
  400. </div>
  401. <div
  402. class="notice-nav-item"
  403. @click="handleNoticeTypeChange('ETA试用')"
  404. :class="noticeType === 'ETA试用' ? 'notice-nav-active' : ''"
  405. >
  406. <span>ETA试用</span>
  407. <span
  408. style="
  409. width: 8px;
  410. height: 8px;
  411. border-radius: 50%;
  412. background: #f00;
  413. display: block;
  414. position: absolute;
  415. right: -8px;
  416. top: 0px;
  417. "
  418. v-if="flag5"
  419. ></span>
  420. </div>
  421. <div
  422. class="notice-nav-item"
  423. @click="handleNoticeTypeChange('出差')"
  424. :class="noticeType === '出差' ? 'notice-nav-active' : ''"
  425. >
  426. <span>出差</span>
  427. <span
  428. style="
  429. width: 8px;
  430. height: 8px;
  431. border-radius: 50%;
  432. background: #f00;
  433. display: block;
  434. position: absolute;
  435. right: -8px;
  436. top: 0px;
  437. "
  438. v-if="flag6"
  439. ></span>
  440. </div>
  441. </div>
  442. <ul style="margintop: 20px" v-if="currentNoticeList.length">
  443. <li
  444. class="notice_item"
  445. v-for="item in currentNoticeList"
  446. :key="item"
  447. @click="noticeClick(item)"
  448. style="
  449. display: flex;
  450. justify-content: space-between;
  451. align-items: center;
  452. font-size: 12px;
  453. cursor: pointer;
  454. margin-bottom: 15px;
  455. "
  456. >
  457. <div style="display: flex; align-items: center">
  458. <div
  459. style="
  460. width: 36px;
  461. min-width: 36px;
  462. height: 36px;
  463. background: #409eff;
  464. border-radius: 50%;
  465. color: #fff;
  466. text-align: center;
  467. line-height: 36px;
  468. margin-right: 8px;
  469. font-size: 12px;
  470. "
  471. >
  472. {{ item.RealName.substr(item.RealName.length - 2) }}
  473. </div>
  474. <span :style="item.MessageStatus === 0 ? '' : 'color:#bbb'">
  475. {{
  476. (Role == "rai_admin" || Role == "ficc_admin") &&
  477. noticeType !== "出差"
  478. ? item.RealName
  479. : ""
  480. }}
  481. {{ item.Content }}
  482. </span>
  483. </div>
  484. <span
  485. style="color: #b2b5bb; margin-left: 15px; min-width: 110px"
  486. >{{ item.CreateTime }}</span
  487. >
  488. </li>
  489. </ul>
  490. <div
  491. style="text-align: center; margin: 40px 0; color: #999"
  492. v-else
  493. >
  494. 暂无通知
  495. </div>
  496. </div>
  497. <template #reference>
  498. <div class="icon-box-item" @click="getNotice">
  499. <svg
  500. width="20"
  501. height="20"
  502. viewBox="0 0 20 20"
  503. fill="none"
  504. xmlns="http://www.w3.org/2000/svg"
  505. >
  506. <path
  507. d="M16.7344 15.4904L15.2941 12.9564V7.84847C15.2941 5.89142 13.8231 3.77337 11.6786 2.99732C11.5741 1.96012 10.8811 1.20374 9.97287 1.20374C9.06595 1.20374 8.37036 1.96014 8.26717 2.99732C6.12392 3.77337 4.65292 5.8914 4.65292 7.84847V12.9564L3.14258 15.6146C3.04183 15.7903 3.04429 16.0054 3.14504 16.1799C3.24581 16.3544 3.43263 16.4601 3.63415 16.4601H7.22871C7.49293 17.7357 8.62233 18.6967 9.97289 18.6967C11.3247 18.6967 12.4541 17.7357 12.7171 16.4601H16.3116C16.3215 16.4601 16.3288 16.4601 16.3374 16.4601C16.6508 16.4601 16.904 16.2082 16.904 15.8948C16.904 15.7362 16.8401 15.5925 16.7344 15.4904ZM9.97287 2.33803C10.1769 2.33803 10.3415 2.49286 10.4472 2.7239C10.2899 2.70792 10.1375 2.67106 9.97287 2.67106C9.8082 2.67106 9.65583 2.70792 9.49851 2.7239C9.60422 2.49284 9.76889 2.33803 9.97287 2.33803ZM9.97287 17.5636C9.25396 17.5636 8.65303 17.1016 8.41951 16.4601H11.5262C11.2927 17.1015 10.693 17.5636 9.97287 17.5636ZM4.60745 15.3282L5.71102 13.3853C5.76015 13.3017 5.78719 13.2034 5.78719 13.1051V7.84847C5.78719 5.93934 7.57648 3.80413 9.97287 3.80413C12.3692 3.80413 14.161 5.93934 14.161 7.84847V13.1051C14.161 13.2034 14.1868 13.3017 14.2347 13.3853L15.3395 15.3282H4.60745Z"
  508. fill="currentColor"
  509. />
  510. </svg>
  511. <span
  512. style="
  513. width: 8px;
  514. height: 8px;
  515. border-radius: 50%;
  516. background: #f00;
  517. display: block;
  518. position: absolute;
  519. right: 5px;
  520. top: 3px;
  521. "
  522. v-if="flag1 || flag2 || flag3 || flag4 || flag5 || flag6"
  523. ></span>
  524. </div>
  525. </template>
  526. </el-popover>
  527. <!-- 销售待办 -->
  528. <el-tooltip effect="dark" content="待办事项" placement="bottom"
  529. v-if="['rai_seller','ficc_seller'].includes(Role)">
  530. <div
  531. class="icon-box-item"
  532. @click="handleShowSallerTodayList"
  533. >
  534. <svg
  535. width="20"
  536. height="20"
  537. viewBox="0 0 20 20"
  538. fill="none"
  539. xmlns="http://www.w3.org/2000/svg"
  540. >
  541. <path
  542. d="M2.35855 17.4322V2.4931C2.35855 2.41005 2.42588 2.34244 2.50893 2.34244H15.0778C15.1609 2.34244 15.2285 2.41005 15.2285 2.4931V8.52028H16.3187V2.4931C16.3187 1.80903 15.7622 1.2522 15.0778 1.2522H2.50893C1.82487 1.2522 1.26831 1.80903 1.26831 2.4931V17.4322C1.26831 18.1163 1.82487 18.6731 2.50893 18.6731H9.54544V17.5829H2.50893C2.42588 17.5829 2.35855 17.5153 2.35855 17.4322Z"
  543. fill="currentColor"
  544. />
  545. <path
  546. d="M5.61836 10.7966C5.31731 10.7966 5.07324 11.0404 5.07324 11.3417C5.07324 11.643 5.31731 11.8868 5.61836 11.8868H7.79512C8.09616 11.8868 8.34024 11.643 8.34024 11.3417C8.34024 11.0404 8.09616 10.7966 7.79512 10.7966H5.61836ZM12.4324 8.39255C12.4324 8.09124 12.1883 7.84743 11.8872 7.84743H5.61836C5.31731 7.84743 5.07324 8.09124 5.07324 8.39255C5.07324 8.69385 5.31731 8.93767 5.61836 8.93767H11.8872C12.1883 8.93767 12.4324 8.69385 12.4324 8.39255ZM11.8872 5.00577H5.61836C5.31731 5.00577 5.07324 5.24958 5.07324 5.55089C5.07324 5.85219 5.31731 6.09601 5.61836 6.09601H11.8872C12.1883 6.09601 12.4324 5.85219 12.4324 5.55089C12.4324 5.24958 12.1883 5.00577 11.8872 5.00577ZM16.0233 14.038H14.9365V12.2749C14.9365 11.9736 14.6924 11.7298 14.3914 11.7298C14.0903 11.7298 13.8463 11.9736 13.8463 12.2749V14.5832C13.8463 14.8845 14.0903 15.1283 14.3914 15.1283H16.0233C16.3243 15.1283 16.5684 14.8845 16.5684 14.5832C16.5684 14.2818 16.3243 14.038 16.0233 14.038Z"
  547. fill="currentColor"
  548. />
  549. <path
  550. d="M14.4272 10.0611C12.0589 10.0611 10.1389 11.981 10.1389 14.3493C10.1389 16.7177 12.0588 18.6376 14.4272 18.6376C16.7955 18.6376 18.7155 16.7177 18.7155 14.3493C18.7155 11.981 16.7955 10.0611 14.4272 10.0611ZM14.4272 17.5474C12.6638 17.5474 11.2292 16.1127 11.2292 14.3493C11.2292 12.5859 12.6638 11.1513 14.4272 11.1513C16.1906 11.1513 17.6252 12.5859 17.6252 14.3493C17.6253 16.1127 16.1906 17.5474 14.4272 17.5474Z"
  551. fill="currentColor"
  552. />
  553. </svg>
  554. </div>
  555. </el-tooltip>
  556. <!-- 系统帮助文档 -->
  557. <el-tooltip effect="dark" content="帮助文档" placement="bottom" v-if="isShowHelpDoc">
  558. <div
  559. class="icon-box-item"
  560. @click="toOperation('fingerpost')"
  561. >
  562. <svg
  563. width="20"
  564. height="20"
  565. viewBox="0 0 20 20"
  566. fill="none"
  567. xmlns="http://www.w3.org/2000/svg"
  568. >
  569. <path
  570. d="M9.24255 14.5C9.24255 14.0858 9.57834 13.75 9.99255 13.75C10.4068 13.75 10.7426 14.0858 10.7426 14.5C10.7426 14.9142 10.4068 15.25 9.99255 15.25C9.57834 15.25 9.24255 14.9142 9.24255 14.5Z"
  571. fill="currentColor"
  572. />
  573. <path
  574. d="M9.99261 5.00763C8.32056 5.00763 6.96136 6.36682 6.96136 8.03888H8.21136C8.21136 7.05718 9.01092 6.25763 9.99261 6.25763C10.9743 6.25763 11.7739 7.05718 11.7739 8.03888C11.7739 8.71106 11.2183 9.3851 10.4931 9.67971L10.4899 9.68101C9.82793 9.95419 9.36767 10.6052 9.36767 11.3656V12.5H10.6177V11.3656C10.6177 11.1228 10.7618 10.9216 10.9655 10.837C11.9996 10.4161 13.0239 9.37337 13.0239 8.03888C13.0239 6.36682 11.6647 5.00763 9.99261 5.00763Z"
  575. fill="currentColor"
  576. />
  577. <path
  578. d="M18.7427 10C18.7427 5.16751 14.8252 1.25 9.99268 1.25C5.16019 1.25 1.24268 5.16751 1.24268 10C1.24267 14.8325 5.16018 18.75 9.99267 18.75C14.8252 18.75 18.7427 14.8325 18.7427 10ZM17.4927 10C17.4927 14.1421 14.1348 17.5 9.99267 17.5C5.85054 17.5 2.49267 14.1421 2.49268 10C2.49268 5.85786 5.85054 2.5 9.99268 2.5C14.1348 2.5 17.4927 5.85787 17.4927 10Z"
  579. fill="currentColor"
  580. />
  581. </svg>
  582. </div>
  583. </el-tooltip>
  584. <div class="userinfo">
  585. <el-dropdown trigger="click">
  586. <span class="el-dropdown-link userinfo-inner">
  587. <img src="~@/assets/img/set_m/user_img.png" />
  588. {{ sysUserName + ",欢迎您!" }}
  589. </span>
  590. <template #dropdown>
  591. <el-dropdown-menu>
  592. <el-dropdown-item divided @click="resetpwd"
  593. >修改密码</el-dropdown-item
  594. >
  595. <el-dropdown-item divided @click="logout"
  596. >退出登录</el-dropdown-item
  597. >
  598. </el-dropdown-menu>
  599. </template>
  600. </el-dropdown>
  601. </div>
  602. </div>
  603. </div>
  604. <section
  605. class="content-container"
  606. id="displayMain"
  607. ref="displayMain"
  608. :style="isCollapse ? 'left:70px' : 'left:200px'"
  609. >
  610. <el-row
  611. class="grid-content bg-purple-light contentc"
  612. style="min-width: 900px"
  613. >
  614. <el-col :span="24" class="content-wrapper">
  615. <!-- 加入key 解决不同路由到同一个文件时的缓存问题 -->
  616. <router-view :key="$route.path" v-slot="{Component}">
  617. <!-- <transition name="fade" mode="out-in"> -->
  618. <component :is="Component"></component>
  619. <!-- </transition> -->
  620. </router-view>
  621. </el-col>
  622. </el-row>
  623. </section>
  624. </div>
  625. </el-container>
  626. </template>
  627. <style scoped lang="scss">
  628. #main_right {
  629. width: 100%;
  630. overflow: hidden;
  631. background: #f5f7f9;
  632. .main_right_top {
  633. // width: 100%;
  634. background: #fff;
  635. height: 60px;
  636. box-shadow: 0 3px 6px rgba(0, 0, 0, 0.1);
  637. box-sizing: border-box;
  638. display: flex;
  639. justify-content: space-between;
  640. align-items: center;
  641. padding: 0 30px;
  642. .main_left_container {
  643. display: flex;
  644. align-items: center;
  645. .main_left_section {
  646. display: flex;
  647. flex-shrink: 0;
  648. align-items: center;
  649. }
  650. .approval_notice {
  651. display: flex;
  652. align-items: center;
  653. margin-left: 45px;
  654. img {
  655. margin-right: 10px;
  656. }
  657. div {
  658. font-size: 16px;
  659. font-family: PingFang SC-Regular, PingFang SC;
  660. font-weight: 400;
  661. color: #ee9a34;
  662. line-height: 19px;
  663. }
  664. }
  665. }
  666. .coll_btn {
  667. margin-right: 20px;
  668. .coll_ico {
  669. font-size: 22px;
  670. display: block;
  671. cursor: pointer;
  672. color: #606266;
  673. &:hover {
  674. color: #4099ef;
  675. }
  676. }
  677. }
  678. .userinfo {
  679. min-width: 210px;
  680. width: 220px;
  681. height: 60px;
  682. text-align: right;
  683. overflow: hidden;
  684. position: relative;
  685. margin-left: 15px;
  686. margin-right: 4%;
  687. display: flex;
  688. justify-content: space-between;
  689. align-items: center;
  690. .theme-picker {
  691. position: absolute;
  692. top: 14px;
  693. left: 0px;
  694. }
  695. .userinfo-fingerpost {
  696. margin-left: 20px;
  697. }
  698. .item {
  699. padding: 4px;
  700. position: absolute;
  701. top: 14px;
  702. left: 110px;
  703. border: 1px solid #ccc;
  704. border-radius: 4px;
  705. }
  706. .item:hover {
  707. color: #5882ef;
  708. }
  709. .userinfo-inner {
  710. cursor: pointer;
  711. color: #666 !important;
  712. overflow: hidden;
  713. line-height: 60px;
  714. font-size: 16px;
  715. img {
  716. width: 40px;
  717. height: 40px;
  718. border-radius: 20px;
  719. margin: 10px;
  720. float: left;
  721. }
  722. }
  723. .userinfo-inner:hover {
  724. color: #5882ef;
  725. }
  726. }
  727. }
  728. .right_section {
  729. display: flex;
  730. align-items: center;
  731. .jump-other-sys-item {
  732. height: 32px;
  733. padding: 0 10px;
  734. border-radius: 4px;
  735. cursor: pointer;
  736. margin-right: 30px;
  737. flex-shrink: 0;
  738. display: flex;
  739. align-items: center;
  740. &:hover {
  741. background-color: #eaf3fe;
  742. }
  743. .icon {
  744. height: 20px;
  745. margin-right: 3px;
  746. }
  747. span {
  748. line-height: 19px;
  749. }
  750. }
  751. }
  752. .content-container {
  753. //height: calc(100vh - 90px);
  754. background: #f5f7f9;
  755. // position: relative;
  756. overflow-y: auto;
  757. position: absolute;
  758. //padding-top: 22px;
  759. left: 200px;
  760. top: 68px;
  761. bottom: 0;
  762. right: 0;
  763. z-index: 100;
  764. /*修改滚动条样式*/
  765. &::-webkit-scrollbar {
  766. width: 10px;
  767. height: 10px;
  768. }
  769. &::-webkit-scrollbar-track {
  770. background: rgb(239, 239, 239);
  771. border-radius: 2px;
  772. }
  773. &::-webkit-scrollbar-thumb {
  774. background: #ccc;
  775. border-radius: 10px;
  776. }
  777. &::-webkit-scrollbar-thumb:hover {
  778. background: #888;
  779. }
  780. &::-webkit-scrollbar-corner {
  781. background: #666;
  782. }
  783. /**/
  784. .contentc {
  785. width: 100%;
  786. overflow: auto;
  787. .content-wrapper {
  788. width: 100%;
  789. padding: 22px 30px;
  790. box-sizing: border-box;
  791. overflow: auto;
  792. background: #f5f7f9;
  793. }
  794. .note_entrance {
  795. display: inline-block;
  796. position: absolute;
  797. right: 20px;
  798. top: 50%;
  799. height: 100%;
  800. transform: translateY(-50%);
  801. > img {
  802. width: 20px;
  803. margin-right: 5px;
  804. vertical-align: middle;
  805. }
  806. }
  807. }
  808. }
  809. }
  810. .icon-box-item {
  811. height: 32px;
  812. padding: 0 10px;
  813. border-radius: 4px;
  814. cursor: pointer;
  815. margin-right: 30px;
  816. flex-shrink: 0;
  817. display: flex;
  818. align-items: center;
  819. color: #333;
  820. position: relative;
  821. &:hover {
  822. background-color: #eaf3fe;
  823. color: #409eff;
  824. }
  825. svg {
  826. width: 20px;
  827. height: 20px;
  828. }
  829. img {
  830. width: 20px;
  831. height: 20px;
  832. }
  833. }
  834. .notice_item:hover {
  835. color: #409EFF;
  836. }
  837. .notice_poper {
  838. max-height: 500px;
  839. overflow-y: auto;
  840. .notice-nav-box{
  841. display: flex;
  842. padding-top: 12px;
  843. padding-left: 5px;
  844. .notice-nav-item{
  845. cursor: pointer;
  846. line-height: 2;
  847. margin-right: 30px;
  848. position: relative;
  849. }
  850. }
  851. .notice-nav-active{
  852. color: #409EFF;
  853. border-bottom: 2px solid #409EFF;
  854. }
  855. }
  856. </style>