main.vue 78 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083
  1. <template>
  2. <div class="main mainVueIndex">
  3. <header class="sl-header">
  4. <div
  5. v-if="showIframe"
  6. class="sl-header-ul"
  7. >
  8. <img
  9. class="sl-header-li-logo"
  10. src="../assets/img/login/xintai_log.png"
  11. alt="能源管控系统"
  12. >
  13. <div class="sl-header-li-name">能源管控系统</div>
  14. <!-- <div class="hnstLogo">
  15. <img
  16. src="../assets/img/hnst_logo.png"
  17. alt=""
  18. >
  19. </div> -->
  20. <timeLED style="position: absolute; right: 250px; top: 15px;"></timeLED>
  21. <div class="oa-header-user">
  22. <div class="oa-header-upt">
  23. <a>
  24. <template>
  25. <img
  26. v-if="userInfo.photoType"
  27. class="oa-sign-tul-ui"
  28. :src="'data:image/'+ userInfo.photoType +';base64,' + userInfo.photo"
  29. alt="头像"
  30. >
  31. <img
  32. v-else
  33. class="oa-sign-tul-ui"
  34. src="../../static/img/photo-default.png"
  35. alt="头像"
  36. >
  37. </template>
  38. </a>
  39. </div>
  40. <div class="oa-header-ucon">
  41. <div class="oa-header-ulist">
  42. <div class="oa-header-uin">
  43. <template>
  44. <img
  45. v-if="userInfo.photoType"
  46. class="oa-sign-tul-ui"
  47. :src="'data:image/'+ userInfo.photoType +';base64,' + userInfo.photo"
  48. alt="头像"
  49. @click="photoModal=true"
  50. >
  51. <img
  52. v-else
  53. class="oa-sign-tul-ui"
  54. src="../../static/img/photo-default.png"
  55. alt="头像"
  56. @click="photoModal=true"
  57. >
  58. </template>
  59. <h3>{{ store.state.userInfo ? store.state.userInfo.userName : '' }}</h3>
  60. </div>
  61. <ul class="oa-header-uul">
  62. <li @click="showPersonInfo()">
  63. <span class="st-icons st-icons-user"></span>个人信息
  64. </li>
  65. <li @click="pwdModal.show = true">
  66. <span class="st-icons st-icons-pwd"></span>修改密码
  67. </li>
  68. <li @click="signOut">
  69. <span class="st-icons st-icons-out"></span>退出登录
  70. </li>
  71. </ul>
  72. </div>
  73. </div>
  74. </div>
  75. <div class="sl-header-li-lgbc">
  76. <span class="xs-icons xs-icons-right-arrow am-xz"></span>
  77. <span class="sl-breadcrumb-text">当前位置:</span>
  78. <el-breadcrumb
  79. separator-class="el-icon-arrow-right"
  80. class="sl-breadcrumb-list"
  81. >
  82. <el-breadcrumb-item
  83. v-for="item in pageBreadcrumb"
  84. :key="'bdb' + item.menuId"
  85. >{{item.menuLabel}}</el-breadcrumb-item>
  86. </el-breadcrumb>
  87. </div>
  88. </div>
  89. <!--<div class="sl-breadcrumb">
  90. <span class="sl-breadcrumb-text">当前位置:</span>
  91. </div>-->
  92. </header>
  93. <div
  94. class="menu-filter"
  95. v-if="showIframe"
  96. >
  97. <div style="padding: 4px;">
  98. <el-input clearable
  99. size="mini"
  100. style="width: 100%;"
  101. placeholder="输入关键字进行过滤"
  102. v-model="menuDataFilter.val"
  103. :disabled="menuType === '1'"
  104. ></el-input>
  105. </div>
  106. </div>
  107. <div
  108. v-show="showIframe"
  109. class="sl-menu-main overFlowSet"
  110. :class="{'sl-menu-main2': menuType === '2'}"
  111. @scroll="getMenuScrollTop"
  112. >
  113. <div
  114. style="text-align: center; padding-top: 10px; padding-bottom: 5px;position: absolute;z-index: 999;right: 0px;"
  115. :style="{ top: 'calc(39% + ' + menuScrollTop + 'px )' }"
  116. >
  117. <span
  118. class="el-icon-d-arrow-right sl-menu-ops"
  119. style="cursor: pointer;"
  120. @click="changeMenuType"
  121. ></span>
  122. </div>
  123. <div
  124. id="menuDrag"
  125. v-if="menuType === '2'"
  126. class="menuDrag"
  127. :style="{ top: menuScrollTop + 'px' }"
  128. >
  129. </div>
  130. <el-menu
  131. ref="menuDom"
  132. default-active="0"
  133. :collapse="menuType === '1'"
  134. class="el-menu-vertical-demo sl-menu ytg-menu-level1"
  135. v-if="menuDataFilter.show"
  136. >
  137. <template
  138. v-for="(item, index) in menuData"
  139. >
  140. <el-submenu
  141. :index="index + ''"
  142. :key="item.id"
  143. v-if="item.menuType && Number(item.status)"
  144. v-show="!item.menu_filter_noShow"
  145. >
  146. <template slot="title">
  147. <i
  148. class="sl-menu-lic xs-menu-icons"
  149. :class="item.menuIcon ? item.menuIcon : 'xs-icons-menu' + (index + 1)"
  150. ></i>
  151. <div class="sl-menu-lit marignL38">{{item.name}}</div>
  152. </template>
  153. <template v-for="(sitem, sindex) in item.children">
  154. <el-submenu
  155. :index="index + '-' + sindex"
  156. class="ytg-menu-level2"
  157. v-if="sitem.children && sitem.children.length > 0 && allNoMenu(sitem.children) && Number(sitem.status)"
  158. v-show="!sitem.menu_filter_noShow"
  159. :key="sitem.id"
  160. @click.native="selectMenu(sitem,
  161. [{menuId: 1, menuLabel: item.name},
  162. {menuId: 2, menuLabel: sitem.name}])"
  163. >
  164. <template slot="title">
  165. <span>{{sitem.name}}</span>
  166. </template>
  167. <template v-for="(ssitem, ssindex) in sitem.children">
  168. <el-submenu
  169. :index="index + '-' + sindex + '-' + ssindex"
  170. class="ytg-menu-level3"
  171. v-if="ssitem.children && ssitem.children.length > 0 && allNoMenu(ssitem.children) && Number(ssitem.status)"
  172. v-show="!ssitem.menu_filter_noShow"
  173. :key="ssitem.id"
  174. @click.native="selectMenu(sitem,
  175. [{menuId: 1, menuLabel: item.name},
  176. {menuId: 2, menuLabel: sitem.name},
  177. {menuId: 3, menuLabel: ssitem.name}])"
  178. >
  179. <template slot="title">
  180. <span>{{ssitem.name}}</span>
  181. </template>
  182. <template v-for="(sssitem, sssindex) in ssitem.children">
  183. <!-- 新增加五级菜单 2021/7/17 from shadow bengin -->
  184. <el-submenu
  185. :index="index + '-' + sindex + '-' + ssindex + '-' + sssindex"
  186. class="ytg-menu-level4"
  187. v-if="sssitem.children && sssitem.children.length > 0 && allNoMenu(sssitem.children) && Number(sssitem.status)"
  188. v-show="!sssitem.menu_filter_noShow"
  189. :key="sssitem.id"
  190. >
  191. <template slot="title">
  192. <span>{{sssitem.name}}</span>
  193. </template>
  194. <template v-for="(ssssitem, ssssindex) in sssitem.children">
  195. <el-menu-item
  196. @click.native="selectMenu(ssssitem,
  197. [{menuId: 1, menuLabel: item.name},
  198. {menuId: 2, menuLabel: sitem.name},
  199. {menuId: 3, menuLabel: ssitem.name},
  200. {menuId: 4, menuLabel: sssitem.name},
  201. {menuId: 5, menuLabel: ssssitem.name}])"
  202. v-if="(ssssitem.menuType ==='1' || ssssitem.menuType ==='4') && Number(ssssitem.status)"
  203. v-show="!ssssitem.menu_filter_noShow"
  204. :index="index + '-' + sindex + '-' + ssindex + '-' + sssindex + '-' + ssssindex"
  205. :key="ssssitem.id"
  206. >{{ssssitem.name}}</el-menu-item>
  207. <!-- 分割线 -->
  208. <el-menu-item
  209. class="nav_menu"
  210. v-if="ssssitem.menuType ==='3' && Number(ssssitem.status)"
  211. v-show="!ssssitem.menu_filter_noShow"
  212. :index="index + '-' + sindex + '-' + ssindex + '-' + sssindex + '-' + ssssindex"
  213. :key="ssssitem.id"
  214. >
  215. <template>
  216. <div></div>
  217. </template>
  218. </el-menu-item>
  219. </template>
  220. </el-submenu>
  221. <!-- 新增加五级菜单 2021/7/17 from shadow end -->
  222. <!-- 分割线2021/7/17 from shadow begin 重写四级菜单 -->
  223. <el-menu-item
  224. class="nav_menu"
  225. :index="index + '-' + sindex + '-' + ssindex + '-' + sssindex"
  226. v-if="(!sssitem.children || sssitem.children.length === 0 || !allNoMenu(sssitem.children)) && sssitem.menuType ==='3' && Number(sssitem.status)"
  227. v-show="!sssitem.menu_filter_noShow"
  228. :key="sssitem.id"
  229. >
  230. <template>
  231. <div></div>
  232. </template>
  233. </el-menu-item>
  234. <!-- 分割线 END -->
  235. <el-menu-item
  236. @click.native="selectMenu(sssitem,
  237. [{menuId: 1, menuLabel: item.name},
  238. {menuId: 2, menuLabel: sitem.name},
  239. {menuId: 3, menuLabel: ssitem.name},
  240. {menuId: 4, menuLabel: sssitem.name}])"
  241. :index="index + '-' + sindex + '-' + ssindex + '-' + sssindex"
  242. v-if="(!sssitem.children || sssitem.children.length === 0 || !allNoMenu(sssitem.children)) && (sssitem.menuType ==='1' || sssitem.menuType ==='4') && Number(sssitem.status)"
  243. v-show="!sssitem.menu_filter_noShow"
  244. :key="sssitem.id"
  245. >{{sssitem.name}}</el-menu-item>
  246. <!-- <el-menu-item
  247. @click.native="selectMenu(sssitem,
  248. [{menuId: 1, menuLabel: item.name},
  249. {menuId: 2, menuLabel: sitem.name},
  250. {menuId: 3, menuLabel: ssitem.name},
  251. {menuId: 4, menuLabel: sssitem.name}])"
  252. v-if="(sssitem.menuType ==='1' || sssitem.menuType ==='4') && Number(sssitem.status)"
  253. v-show="!sssitem.menu_filter_noShow"
  254. :index="index + '-' + sindex + '-' + ssindex + '-' + sssindex"
  255. :key="sssitem.id"
  256. >{{sssitem.name}}</el-menu-item>-->
  257. <!-- 分割线 -->
  258. <!--<el-menu-item
  259. class="nav_menu"
  260. v-if="sssitem.menuType ==='3' && Number(sssitem.status)"
  261. v-show="!sssitem.menu_filter_noShow"
  262. :index="index + '-' + sindex + '-' + ssindex + '-' + sssindex"
  263. :key="sssitem.id"
  264. >
  265. <template>
  266. <div></div>
  267. </template>
  268. </el-menu-item> -->
  269. <!-- 分割线2021/7/17 from shadow end-->
  270. <!-- 停用菜单 -->
  271. <!-- <el-menu-item
  272. v-if="Number(sssitem.status) === 0"
  273. v-show="sssitem.menu_filter_noShow"
  274. :index="index + '-' + sindex + '-' + ssindex + '-' + sssindex"
  275. :key="sssitem.id"
  276. >{{sssitem.name}}</el-menu-item> -->
  277. </template>
  278. </el-submenu>
  279. <!-- 停用菜单 -->
  280. <!-- <el-menu-item
  281. :index="index + '-' + sindex + '-' + ssindex"
  282. class="ytg-menu-level3 closeMenu"
  283. v-if="Number(ssitem.status) === 0"
  284. v-show="!ssitem.menu_filter_noShow"
  285. :key="ssitem.id"
  286. >
  287. {{ssitem.name}}
  288. </el-menu-item> -->
  289. <!-- 分割线 -->
  290. <!-- 2021/7/17 from shadow 注释三级菜单 bengin -->
  291. <!--<el-menu-item
  292. class="nav_menu"
  293. :index="index + '-' + sindex + '-' + ssindex"
  294. v-if="(!ssitem.children || ssitem.children.length === 0 || !allNoMenu(ssitem.children)) && ssitem.menuType ==='3' && Number(ssitem.status)"
  295. v-show="!ssitem.menu_filter_noShow"
  296. :key="ssitem.id"
  297. >
  298. <template>
  299. <div></div>
  300. </template>
  301. </el-menu-item>-->
  302. <!-- 2021/7/17 from shadow 注释三级菜单 end -->
  303. <!-- 分割线 END -->
  304. <el-menu-item
  305. @click.native="selectMenu(ssitem,
  306. [{menuId: 1, menuLabel: item.name},
  307. {menuId: 2, menuLabel: sitem.name},
  308. {menuId: 3, menuLabel: ssitem.name}])"
  309. :index="index + '-' + sindex + '-' + ssindex"
  310. v-if="(!ssitem.children || ssitem.children.length === 0 || !allNoMenu(ssitem.children)) && (ssitem.menuType ==='1' || ssitem.menuType ==='4') && Number(ssitem.status)"
  311. v-show="!ssitem.menu_filter_noShow"
  312. :key="ssitem.id"
  313. >{{ssitem.name}}</el-menu-item>
  314. </template>
  315. </el-submenu>
  316. <!-- 停用菜单 -->
  317. <!-- <el-menu-item
  318. :index="index + '-' + sindex"
  319. class="ytg-menu-level2 closeMenu"
  320. v-if="Number(sitem.status) === 0"
  321. v-show="!sitem.menu_filter_noShow"
  322. :key="sitem.id"
  323. >
  324. {{sitem.name}}
  325. </el-menu-item> -->
  326. <el-menu-item
  327. @click.native="selectMenu(sitem,
  328. [{menuId: 1, menuLabel: item.name},
  329. {menuId: 2, menuLabel: sitem.name}])"
  330. :index="index + '-' + sindex"
  331. v-if="(!sitem.children || sitem.children.length === 0 || !allNoMenu(sitem.children)) && (sitem.menuType ==='1' || sitem.menuType ==='4') && Number(sitem.status)"
  332. v-show="!sitem.menu_filter_noShow"
  333. :key="sitem.id"
  334. >{{sitem.name}}</el-menu-item>
  335. </template>
  336. </el-submenu>
  337. </template>
  338. </el-menu>
  339. </div>
  340. <section
  341. :class="{'sl-container': showIframe, 'sl-container2': showIframe && menuType === '2' }"
  342. id="mainContainer"
  343. style="height:100%;width:100%"
  344. >
  345. <div class="sl-content-main">
  346. <template v-if="showIframe">
  347. <default-vue
  348. :menuData="menuData"
  349. @gotoSetPage="gotoSetPage"
  350. v-if="tabsData.length === 0"
  351. ></default-vue>
  352. <el-tabs
  353. id="menuTabId"
  354. v-show="tabsData.length > 0"
  355. v-model="selectedMenu"
  356. type="card"
  357. closable
  358. @tab-remove="removeTab"
  359. @tab-click="handleClick"
  360. style="padding: 10px 0px 0px;height:100%"
  361. >
  362. <el-tab-pane
  363. :label="item.name"
  364. :name="item.menuId"
  365. :key="item.menuId"
  366. v-for="(item, index) in tabsData"
  367. >
  368. <span
  369. @contextmenu="rightShow($event, index, item)"
  370. slot="label"
  371. style="display: inline-block;height: 100%;"
  372. >
  373. {{item.name}}
  374. </span>
  375. <div class="pageBreadcrumb">{{JSON.stringify(item.pageBreadcrumb)}}</div>
  376. <iframe
  377. :src="item.menuUrl"
  378. :style="minHeight"
  379. ></iframe>
  380. </el-tab-pane>
  381. </el-tabs>
  382. <div class="contextmenu">
  383. <el-dropdown
  384. trigger="click"
  385. @visible-change="visibleChange"
  386. @command="handleCommand"
  387. >
  388. <span
  389. class="el-dropdown-link"
  390. v-show=false
  391. >
  392. 下拉菜单<i
  393. id="setClick"
  394. class="el-icon-arrow-down el-icon--right"
  395. ></i>
  396. </span>
  397. <el-dropdown-menu slot="dropdown">
  398. <el-dropdown-item command="a">关闭标签页</el-dropdown-item>
  399. <el-dropdown-item
  400. :disabled="tabsData.length === 1"
  401. command="b"
  402. >关闭其他标签页</el-dropdown-item>
  403. <el-dropdown-item
  404. :disabled="tabsData.length - menuTabIndex === 1"
  405. command="c"
  406. >关闭右侧标签页</el-dropdown-item>
  407. <el-dropdown-item command="d">刷新当前标签页</el-dropdown-item>
  408. <el-dropdown-item
  409. command="e"
  410. divided
  411. v-show="PEButShow"
  412. >下载表格数据</el-dropdown-item>
  413. </el-dropdown-menu>
  414. </el-dropdown>
  415. </div>
  416. </template>
  417. <!-- <iframe v-if="showIframe" id="frameArea" name="showPP" style="display:none;width: 100%; height: calc(100% - 70px);border: 0px;"></iframe> -->
  418. <transition
  419. v-if="!showIframe"
  420. enter-active-class="fade-in"
  421. leave-active-class="leave-immediately"
  422. :duration="{ enter: 400, leave: 100 }"
  423. >
  424. <router-view></router-view>
  425. </transition>
  426. </div>
  427. </section>
  428. <!-- -->
  429. <div
  430. is='usersAddAndEdit'
  431. v-if="userModal.show"
  432. :operate="'edit'"
  433. :operate1="'index'"
  434. :item="userInfo"
  435. @on-then="userModalThen"
  436. @on-close="userModalClose"
  437. @editFinish="updataUserInfo"
  438. ></div>
  439. <!-- -->
  440. <!-- 修改密码 -->
  441. <el-dialog
  442. ref="pwdModal"
  443. :visible.sync="pwdModal.show"
  444. class="oa-pwd-modal"
  445. title="修改密码"
  446. width="500px"
  447. @open="openPwd"
  448. >
  449. <el-form
  450. ref="pwdModal"
  451. :model="pwdModal.form"
  452. :rules="pwdModal.ruleValidate"
  453. label-width="120px"
  454. style="padding-right: 40px;"
  455. >
  456. <el-form-item
  457. label="原密码"
  458. prop="userid"
  459. v-show="false"
  460. >
  461. <el-input
  462. size="small"
  463. type="text"
  464. v-model="pwdModal.form.userid"
  465. :maxlength="64"
  466. ></el-input>
  467. </el-form-item>
  468. <el-form-item
  469. label="原密码"
  470. prop="prepassword"
  471. >
  472. <el-input
  473. size="small"
  474. type="password"
  475. v-model="pwdModal.form.prepassword"
  476. :maxlength="64"
  477. ></el-input>
  478. </el-form-item>
  479. <el-form-item
  480. label="新密码"
  481. prop="newpassword"
  482. >
  483. <el-input
  484. size="small"
  485. type="password"
  486. v-model="pwdModal.form.newpassword"
  487. :maxlength="64"
  488. ></el-input>
  489. </el-form-item>
  490. <el-form-item
  491. label="确认密码"
  492. prop="againNewpassword"
  493. >
  494. <el-input
  495. size="small"
  496. type="password"
  497. v-model="pwdModal.form.againNewpassword"
  498. :maxlength="64"
  499. ></el-input>
  500. </el-form-item>
  501. </el-form>
  502. <div
  503. slot="footer"
  504. class="dialog-footer"
  505. >
  506. <el-button
  507. size="small"
  508. @click="pwdModal.show = false"
  509. >取 消</el-button>
  510. <el-button
  511. size="small"
  512. :loading="pwdModal.loading"
  513. type="primary"
  514. @click="pwdSubmit('pwdModal')"
  515. >确 定</el-button>
  516. </div>
  517. </el-dialog>
  518. <!-- /修改密码 -->
  519. <el-dialog
  520. title="请选择需要导出的表格"
  521. :visible.sync="downloadExcelDialog.show"
  522. width="390px"
  523. >
  524. <div>
  525. <el-row :gutter="20">
  526. <el-col
  527. :span="12"
  528. v-for="item of downloadExcelDialog.data"
  529. :key="item.id"
  530. >
  531. <el-button
  532. size="mini"
  533. type="primary"
  534. style="width: 100%;margin-bottom: 10px;"
  535. @click="downloadExcelDialogFoo({id: item.id, name: item.name})"
  536. >{{ item.name }}</el-button>
  537. </el-col>
  538. </el-row>
  539. </div>
  540. <span slot="footer" class="dialog-footer">
  541. <el-button
  542. size="small"
  543. @click="downloadExcelDialog.show = false"
  544. >取 消</el-button>
  545. </span>
  546. </el-dialog>
  547. </div>
  548. </template>
  549. <script>
  550. import usersAddAndEdit from '@/views/systemConfig/components/usersAddAndEdit.vue';
  551. import { setCookie, getCookie, formatDate } from '@/utils/util.js'
  552. import { checkCharLength } from '@/utils/validator.js';
  553. import store from '@/store/index.js';
  554. import timeLED from '@/components/zg/timeLED.vue'
  555. // 字典数据
  556. import dataDictionary from '@/store/dataDictionary.js';
  557. import defaultVue from './default.vue'
  558. import { proPath } from '@/config/config.js';
  559. import { PEhandleDownloadExcelForElTable } from '@/utils/personalExtension.js';
  560. export default {
  561. components: {
  562. usersAddAndEdit, defaultVue, timeLED
  563. },
  564. data () {
  565. const validatePass = (rule, value, callback) => {
  566. if (value === '') {
  567. callback(new Error('请输入新密码'));
  568. } else {
  569. let reg = /^[A-Za-z0-9]+$/
  570. if (!reg.test(value)) {
  571. return callback(new Error('请输入英文和数字'));
  572. }
  573. if (this.pwdModal.form.againNewpassword !== '') {
  574. // 对第二个密码框单独验证
  575. this.$refs.pwdModal.validateField('againNewpassword');
  576. }
  577. callback();
  578. }
  579. };
  580. const validatePassCheck = (rule, value, callback) => {
  581. if (value === '') {
  582. callback(new Error('请再次输入新密码'));
  583. } else if (value !== this.pwdModal.form.newpassword) {
  584. callback(new Error('两次输入密码不一致'));
  585. } else {
  586. callback();
  587. }
  588. };
  589. return {
  590. websocket: '',
  591. interval: '',
  592. userInfo: {}, // 用户信息
  593. qrRole: [], //角色信息
  594. roleList: {
  595. obj: {},
  596. arr: []
  597. }, // 角色信息
  598. userRoles: [],
  599. leaveFlag: true,
  600. PEButShow: false,
  601. PEhandleDownloadExcelForElTable,
  602. minHeight: 'width: 100%;height: calc(100% - 10px);border: 0px;min-height: 777px',
  603. menuTabIndex: 0,
  604. pageBreadcrumb: [{ menuId: 1, menuLabel: '首页' }],
  605. widthLog: '',
  606. leftLog: '',
  607. dragFlag: false,
  608. store,
  609. dataDictionary,
  610. showIframe: false,
  611. selectedMenu: '',
  612. menuType: '2',
  613. menuData: store.state.routes,
  614. menuDataFilter: {
  615. show: true,
  616. val: '',
  617. timId: null
  618. },
  619. tabsData: [],
  620. // pwdForm: {
  621. // oldPwd: '',
  622. // newPwd: '',
  623. // newPwdCheck: ''
  624. // },
  625. // modal
  626. userInfo: {},
  627. userModal: {
  628. show: false
  629. },
  630. // 修改密码
  631. pwdModal: {
  632. loading: false,
  633. show: false,
  634. form: {
  635. userid: '',
  636. prepassword: '',
  637. newpassword: '',
  638. // 重复密码
  639. againNewpassword: ''
  640. },
  641. ruleValidate: {
  642. prepassword: [
  643. { required: true, message: '原密码不能为空', trigger: 'blur' }
  644. ],
  645. newpassword: [
  646. { required: true, message: '新密码不能为空', trigger: 'blur' },
  647. { type: 'string', max: 64, message: '密码不能多于64个字符', trigger: 'blur' },
  648. { validator: validatePass, trigger: 'blur' }
  649. ],
  650. againNewpassword: [
  651. { required: true, message: '确认密码不能为空', trigger: 'blur' },
  652. { type: 'string', max: 64, message: '密码不能多于64个字符', trigger: 'blur' },
  653. { validator: validatePassCheck, trigger: 'blur' }
  654. ]
  655. }
  656. },
  657. menuScrollTop: 0,
  658. downloadExcelDialog: {
  659. show: false,
  660. data: [
  661. // {
  662. // id: '',
  663. // name: ''
  664. // }
  665. ],
  666. iframeWindow: null
  667. }
  668. }
  669. },
  670. computed: {
  671. },
  672. created(){
  673. //绑定事件
  674. window.addEventListener('beforeunload', e => this.websocket.close())
  675. },
  676. beforeDestroy() {
  677. //卸载事件
  678. window.removeEventListener('beforeunload', e => this.websocket.close())
  679. },
  680. beforeCreate () {
  681. // 前期无后台测试用
  682. // /*
  683. let companyId = window.top.localStorage.getItem('companyId');
  684. store.dispatch('getOwnMenuUrl', { companyId: companyId }).then(res => {
  685. if (res.code === '0') {
  686. localStorage.setItem('ownPrivilege', JSON.stringify(res.data))
  687. }
  688. });
  689. // */
  690. },
  691. watch: {
  692. menuType: function (newV, oldV) {
  693. let that = this;
  694. if (newV === '2') {
  695. that.$nextTick(function () {
  696. $('.sl-menu-main2').css({
  697. 'width': that.widthLog
  698. });
  699. $('.sl-container2').css({
  700. 'padding-left': that.leftLog
  701. });
  702. $('.menu-filter').css({
  703. 'width': that.widthLog
  704. });
  705. that.setDrag();
  706. })
  707. } else {
  708. that.widthLog = $('.sl-menu-main2').css('width');
  709. that.leftLog = $('.sl-container2').css('padding-left');
  710. $('.sl-menu-main2').css({
  711. 'width': ''
  712. });
  713. $('.sl-container2').css({
  714. 'padding-left': ''
  715. });
  716. $('.menu-filter').css({
  717. 'width': '80px'
  718. });
  719. that.menuDataFilter.val = '';
  720. }
  721. },
  722. 'menuDataFilter.val': function (newV, oldV) {
  723. let reg = new RegExp(newV);
  724. let index = [];
  725. clearTimeout(this.menuDataFilter.timId);
  726. this.menuDataFilter.timId = setTimeout(() => {
  727. for (let i = 0; i< this.menuData.length; i++) {
  728. filterFoo (this.menuData[i], newV, i);
  729. }
  730. this.menuDataFilter.show = false;
  731. setTimeout(() => {
  732. this.menuDataFilter.show = true;
  733. this.$nextTick(() => {
  734. if (newV !== '') {
  735. for (let item of index) {
  736. this.$refs.menuDom.open(item);
  737. }
  738. }
  739. });
  740. }, 50);
  741. }, 400);
  742. function filterFoo (fItem, val, iIndex) {
  743. let show = false;
  744. if (fItem.children && fItem.children.length > 0) {
  745. for (let i = 0; i< fItem.children.length; i++) {
  746. let zShow = filterFoo(fItem.children[i], val, iIndex + '-' + i);
  747. if (zShow && !show) {
  748. index.push(iIndex)
  749. }
  750. show = zShow || show;
  751. }
  752. }
  753. if (val === '') {
  754. show = true;
  755. } else {
  756. show = reg.test(fItem.name) || show;
  757. }
  758. fItem.menu_filter_noShow = !show;
  759. return show;
  760. }
  761. }
  762. },
  763. destroyed() {
  764. if (this.showIframe) {
  765. window.top.removeEventListener('beforeunload', e => this.beforeunloadHandler(e))
  766. window.top.removeEventListener('unload', e => this.unloadHandler(e))
  767. window.top.removeEventListener('onunload', e => this.onunloadHandler(e))
  768. }
  769. this.websocket.close();
  770. },
  771. mounted () {
  772. // 取字典
  773. this.dataDictionary.dispatch('list').then(() => {
  774. // console.log(this.dataDictionary.state.dict)
  775. });
  776. this.showIframeEvent();
  777. this.$nextTick(() => {
  778. this.minHeight = 'width: 100%;height: calc(100% - 10px);border: 0px;min-height: ' + ($('#menuTabId').height() - 113) + 'px'
  779. this.leaveFlag = false;
  780. });
  781. this.getRoles();
  782. },
  783. methods: {
  784. logoutAwait: async function(){
  785. var that = this;
  786. await that.axios.get(proPath + 'logout').then((res) => {
  787. setCookie('accessToken', '', -1, '/');
  788. setCookie('refreshToken', '', -1, '/');
  789. setCookie('workDate', '', -1);
  790. })
  791. },
  792. beforeunloadHandler (){
  793. this.leaveFlag = true;
  794. },
  795. unloadHandler(e){
  796. if (this.leaveFlag) {
  797. this.logoutAwait()
  798. }
  799. },
  800. onunloadHandler(e) {
  801. // TODO
  802. },
  803. visibleChange (f) {
  804. let that = this;
  805. if (!f) {
  806. $('.contextmenu').css({
  807. 'display': 'none'
  808. });
  809. }
  810. },
  811. handleCommand (command) {
  812. let that = this;
  813. switch (command) {
  814. case 'a'://关闭当前标签
  815. $('#menuTabId .el-icon-close').eq(that.menuTabIndex).click();
  816. break;
  817. case 'b'://关闭其他标签
  818. var removeTarget = [];
  819. var len = that.tabsData.length - that.menuTabIndex - 1;
  820. for (let i = 0; i < len; i++) {
  821. removeTarget.push($('#menuTabId .el-icon-close').eq(that.menuTabIndex + i + 1));
  822. }
  823. for (let i = 0; i < that.menuTabIndex; i++) {
  824. removeTarget.push($('#menuTabId .el-icon-close').eq(i));
  825. }
  826. for (let i = 0; i < removeTarget.length; i++) {
  827. $(removeTarget[i]).click();
  828. }
  829. break;
  830. case 'c'://关闭右侧标签
  831. var removeTarget = [];
  832. var len = that.tabsData.length - that.menuTabIndex - 1;
  833. for (let i = 0; i < len; i++) {
  834. removeTarget.push($('#menuTabId .el-icon-close').eq(that.menuTabIndex + i + 1));
  835. }
  836. for (let i = 0; i < removeTarget.length; i++) {
  837. $(removeTarget[i]).click();
  838. }
  839. break;
  840. case 'd'://刷新标签
  841. $('#menuTabId .el-tabs__item').eq(that.menuTabIndex).click();
  842. $('#menuTabId iframe').eq(that.menuTabIndex)[0].contentWindow.location.reload(true);
  843. break;
  844. case 'e'://下载表格数据
  845. let iframeWindow = $('#menuTabId iframe').eq(that.menuTabIndex)[0].contentWindow;
  846. let PEDataObj = iframeWindow.PEDataObj || {};
  847. if (PEDataObj.tableArr && PEDataObj.tableArr.length > 0) {
  848. if (PEDataObj.tableArr.length === 1) {
  849. $('#menuTabId .el-tabs__item').eq(that.menuTabIndex).click();
  850. PEhandleDownloadExcelForElTable(
  851. PEDataObj.tableArr[0].id,
  852. (that.pageBreadcrumb[that.pageBreadcrumb.length - 1].menuLabel) + (PEDataObj.tableArr[0].name ? ( '(' + PEDataObj.tableArr[0].name + ')' ) : '') + '_' + formatDate(new Date(), 'yyyy-MM-dd'),
  853. {
  854. tableDocument: iframeWindow.document
  855. }
  856. );
  857. } else {
  858. let dataArr = [];
  859. for (let i = 0; i < PEDataObj.tableArr.length; i++) {
  860. dataArr.push(
  861. {
  862. id: PEDataObj.tableArr[i].id,
  863. name: PEDataObj.tableArr[i].name || ('表格' + (i + 1))
  864. }
  865. )
  866. }
  867. that.downloadExcelDialog.data = dataArr;
  868. that.downloadExcelDialog.iframeWindow = iframeWindow;
  869. that.downloadExcelDialog.show = true;
  870. }
  871. } else {
  872. that.$message({
  873. message: '当前窗口没有允许导出数据的表格!',
  874. type: 'warning'
  875. });
  876. }
  877. break;
  878. }
  879. },
  880. downloadExcelDialogFoo ({id, name}) {
  881. let that = this;
  882. PEhandleDownloadExcelForElTable(
  883. id,
  884. (that.pageBreadcrumb[that.pageBreadcrumb.length - 1].menuLabel) + (name ? ( '(' + name + ')' ) : '') + '_' + formatDate(new Date(), 'yyyy-MM-dd'),
  885. {
  886. tableDocument: that.downloadExcelDialog.iframeWindow.document
  887. }
  888. );
  889. },
  890. // 右键菜单
  891. rightShow ($event, index, item) {
  892. let that = this;
  893. that.menuTabIndex = index;
  894. $('.contextmenu').css({
  895. 'left': ($event.pageX + 120) + 'px',
  896. 'top': $event.pageY + 'px',
  897. 'display': 'block'
  898. })
  899. $('#setClick').click();
  900. $event.preventDefault();
  901. // 控制下载表格数据按钮是否显示
  902. let iframeWindow = $('#menuTabId iframe').eq(that.menuTabIndex)[0].contentWindow;
  903. let PEDataObj = iframeWindow.PEDataObj || {};
  904. if (PEDataObj.tableArr && PEDataObj.tableArr.length > 0) {
  905. that.PEButShow = true;
  906. } else {
  907. that.PEButShow = false;
  908. }
  909. },
  910. gotoSetPage (item) {
  911. let that = this;
  912. let menuData = item.preTarget;
  913. that.tabsData.push(menuData);
  914. that.selectedMenu = menuData.menuId;
  915. that.pageBreadcrumb = item.pageBreadcrumb;
  916. that.axios.post(proPath + 'v1/sysmenus/accessOwnAdd',
  917. {
  918. userId: that.$store.state.userInfo.userId,
  919. menuId: menuData.menuId
  920. }
  921. ).then(function (response) {
  922. }).catch(function () {
  923. });
  924. },
  925. // 判断是否在iframe下
  926. showIframeEvent () {
  927. var that = this;
  928. var thisDocument = document;
  929. if (thisDocument.domain.indexOf('hnshituo.com') > -1) {
  930. thisDocument.domain = 'hnshituo.com';
  931. }
  932. try {
  933. var topDocument = window.top.document;
  934. }
  935. catch (err) {
  936. thisDocument.getElementsByClassName('sl-menu-main')[0].style.display = 'none';
  937. thisDocument.getElementsByClassName('sl-header')[0].style.display = 'none';
  938. thisDocument.getElementById('mainContainer').style.padding = '0px';
  939. return;
  940. }
  941. var routerCover = this.$router.history.current.query;
  942. var routerParams = this.$router.history.current.params;
  943. var routerFlag = 0;
  944. var routerFlagP = 0;
  945. for (var i in routerCover) {
  946. routerFlag = routerFlag + 1
  947. }
  948. for (var j in routerParams) {
  949. routerFlagP = routerFlagP + 1
  950. }
  951. that.showIframe = thisDocument === topDocument && routerFlag === 0 && routerFlagP === 0;
  952. if (that.showIframe) {
  953. that.getUserInfo();
  954. thisDocument.getElementById('mainContainer').style['padding-left'] = '179px';
  955. window.top.addEventListener('beforeunload', e => that.beforeunloadHandler(e))
  956. window.top.addEventListener('unload', e => that.unloadHandler(e))
  957. window.top.addEventListener('onunload', e => that.onunloadHandler(e))
  958. // websocket初始化
  959. let token = getCookie('accessToken');
  960. if (token) {
  961. this.initWebSocket();
  962. }
  963. }
  964. if (routerFlag > 0 || routerFlagP > 0) {
  965. that.menuType = '1';
  966. }
  967. var setShowIframe = setInterval(function () {
  968. for (let i = 0; i < window.top.document.getElementsByTagName('iframe').length; i++) {
  969. if (window.top.document.getElementsByTagName('iframe')[i].contentDocument !== null && window.top.document.getElementsByTagName('iframe')[i].contentDocument.getElementsByClassName('sl-menu-main').length > 0) {
  970. $(window.top.document.getElementsByTagName('iframe')[i].parentNode.parentNode).css({ 'height': 'calc(100% - 35px)' });
  971. $(window.top.document.getElementsByTagName('iframe')[i].parentNode).css({ 'height': '100%' });
  972. window.top.document.getElementsByTagName('iframe')[i].contentDocument.getElementsByClassName('sl-menu-main')[0].style.display = 'none';
  973. window.top.document.getElementsByTagName('iframe')[i].contentDocument.getElementsByClassName('sl-header')[0].style.display = 'none';
  974. window.top.document.getElementsByTagName('iframe')[i].contentDocument.getElementsByClassName('sl-content-main')[0].style.height = '100%';
  975. window.top.document.getElementsByTagName('iframe')[i].contentDocument.getElementById('mainContainer').style.padding = '0px';
  976. if (i === window.top.document.getElementsByTagName('iframe').length - 1) {
  977. clearInterval(setShowIframe);
  978. }
  979. }
  980. }
  981. }, 20);
  982. that.setDrag();
  983. },
  984. setDrag () {
  985. let that = this;
  986. $('#menuDrag').unbind();
  987. $('#menuDrag').mousedown(function (event) {
  988. that.dragFlag = true;
  989. $(event.target).data('dragStart', event.pageX)
  990. $(event.target).data('dragWidth', $('.sl-menu-main2').outerWidth());
  991. $('body').css({
  992. 'cursor': 'col-resize'
  993. });
  994. let _html = '<div id="dragsc" style="height: 100%;width: 100%;position: absolute;top: 0;z-index: 888;"></div>';
  995. $('body').append(_html);
  996. $('body').mousemove(function (e) {
  997. if (!that.dragFlag) {
  998. $(this).css({
  999. 'cursor': ''
  1000. });
  1001. $('#dragsc').remove();
  1002. $(this).unbind(e);
  1003. } else {
  1004. var startX = $('#menuDrag').data('dragStart');
  1005. var endX = e.pageX;
  1006. var change = endX - startX;
  1007. var containerWidth = $('#menuDrag').data('dragWidth');
  1008. // console.log('containerWidth + change = ' + (containerWidth + change))
  1009. if (containerWidth + change < 180) {
  1010. $('.sl-menu-main2').css({
  1011. 'width': '180px'
  1012. });
  1013. $('.menu-filter').css({
  1014. 'width': ''
  1015. });
  1016. $('.sl-container2').css({
  1017. 'padding-left': '179px'
  1018. });
  1019. } else if (containerWidth + change <= 1200) {
  1020. $('.sl-menu-main2').css({
  1021. 'width': containerWidth + change + 'px'
  1022. });
  1023. $('.sl-container2').css({
  1024. 'padding-left': containerWidth + change - 1 + 'px'
  1025. });
  1026. $('.menu-filter').css({
  1027. 'width': containerWidth + change + 'px'
  1028. });
  1029. }
  1030. }
  1031. });
  1032. $('body').mouseup(function (ev) {
  1033. that.dragFlag = false;
  1034. $(this).unbind(ev);
  1035. });
  1036. });
  1037. },
  1038. getMenuScrollTop (event) {
  1039. this.menuScrollTop = $(event.target).scrollTop();
  1040. },
  1041. // tabs选项选择
  1042. handleClick (tab, event) {
  1043. let that = this;
  1044. let pageBreadcrumb = $($('.pageBreadcrumb')[parseInt(tab.index)]).html();
  1045. that.pageBreadcrumb = JSON.parse(pageBreadcrumb);
  1046. window.localStorage.setItem('activeMenu', tab.name)
  1047. },
  1048. removeTab (targetName) {
  1049. var that = this;
  1050. var spliceIndex = null;
  1051. var temp = [];
  1052. for (var i = 0; i < that.tabsData.length; i++) {
  1053. temp.push(that.tabsData[i]);
  1054. if (targetName === that.tabsData[i].menuId) {
  1055. spliceIndex = i;
  1056. }
  1057. }
  1058. if (spliceIndex !== null) {
  1059. temp.splice(spliceIndex, 1);
  1060. }
  1061. if (that.selectedMenu === that.tabsData[spliceIndex].menuId) {
  1062. if (temp.length !== 0) {
  1063. var showIndex = spliceIndex;
  1064. if (showIndex > (temp.length - 1)) {
  1065. showIndex = temp.length - 1;
  1066. }
  1067. that.selectedMenu = temp[showIndex].menuId;
  1068. window.localStorage.setItem('activeMenu', that.selectedMenu);
  1069. that.pageBreadcrumb = temp[showIndex].pageBreadcrumb;
  1070. } else {
  1071. that.pageBreadcrumb = [{ menuId: 1, menuLabel: '首页' }];
  1072. }
  1073. }
  1074. that.tabsData = temp;
  1075. },
  1076. // 菜单选择
  1077. selectMenu (menuData, pageBreadcrumb) {
  1078. var that = this;
  1079. if (menuData.menuUrl !== null && menuData.menuUrl !== '' && typeof (menuData.menuUrl) !== 'undefined') {
  1080. window.localStorage.setItem('activeMenu', menuData.menuId)
  1081. var temp = [];
  1082. menuData.pageBreadcrumb = pageBreadcrumb;
  1083. var setTabsFlag = true;
  1084. for (var i = 0; i < that.tabsData.length; i++) {
  1085. if (menuData.menuId === that.tabsData[i].menuId) {
  1086. setTabsFlag = false;
  1087. break;
  1088. }
  1089. }
  1090. if (setTabsFlag) {
  1091. for (var j = 0; j < that.tabsData.length; j++) {
  1092. temp.push(that.tabsData[j]);
  1093. }
  1094. temp.push(menuData);
  1095. that.tabsData.push(menuData);
  1096. }
  1097. that.selectedMenu = menuData.menuId;
  1098. that.pageBreadcrumb = pageBreadcrumb;
  1099. // 前期无后台测试用
  1100. // /*
  1101. that.axios.post(proPath + 'v1/sysmenus/accessOwnAdd',
  1102. {
  1103. userId: that.$store.state.userInfo.userId,
  1104. menuId: menuData.menuId
  1105. }
  1106. ).then(function (response) {
  1107. }).catch(function () {
  1108. });
  1109. // */
  1110. }
  1111. // console.log('目录', that.selectedMenu, that.tabsData)
  1112. },
  1113. // 是否合部都不是菜单就不用显示
  1114. allNoMenu (items) {
  1115. let bol = false;
  1116. for (let item of items) {
  1117. if (item.menuType === '1' || item.menuType === '4') {
  1118. // 有菜单
  1119. bol = true;
  1120. break;
  1121. }
  1122. }
  1123. return bol;
  1124. },
  1125. //
  1126. signOut () {
  1127. let _this = this;
  1128. _this.$msgbox({
  1129. title: '退出提示',
  1130. message: '确定退出登录吗?',
  1131. showCancelButton: true,
  1132. confirmButtonText: '确定',
  1133. cancelButtonText: '取消',
  1134. beforeClose: (action, instance, done) => {
  1135. if (action === 'confirm') {
  1136. // 前期无后台测试用
  1137. // setCookie('accessToken', '', -1, '/');
  1138. // setCookie('refreshToken', '', -1, '/');
  1139. // setCookie('workDate', '', -1);
  1140. // done();
  1141. // window.location.href = './index.html';
  1142. // /*
  1143. // ajax
  1144. if (getCookie('ticket')) {
  1145. let res = this.axios.get('pass/logout', {
  1146. params: {
  1147. authorization: getCookie('accessToken')
  1148. }
  1149. });
  1150. res.then(function (res) {
  1151. console.log(111)
  1152. instance.confirmButtonText = "确定";
  1153. instance.confirmButtonLoading = false;
  1154. done();
  1155. window.location.href = "./index.html";
  1156. })
  1157. }
  1158. else {
  1159. this.store.dispatch('loginOut').then(function (res) {
  1160. instance.confirmButtonText = '确定';
  1161. instance.confirmButtonLoading = false;
  1162. done();
  1163. window.location.href = './index.html';
  1164. }).catch(function () {
  1165. instance.confirmButtonText = '确定';
  1166. instance.confirmButtonLoading = false;
  1167. done();
  1168. });
  1169. }
  1170. // */
  1171. } else {
  1172. done();
  1173. }
  1174. }
  1175. }).then(action => {
  1176. });
  1177. },
  1178. // 查看个人信息
  1179. showPersonInfo () {
  1180. // 打开查看
  1181. this.userModal.show = true;
  1182. let userId = this.$store.state.userInfo.userId;
  1183. },
  1184. getUserInfo () {
  1185. let that = this;
  1186. if (that.$store.state.userInfo) {
  1187. that.axios.get(proPath + 'v1/sysusers/' + that.$store.state.userInfo.userId).then(function (response) {
  1188. if (response) {
  1189. that.userInfo = response.data;
  1190. }
  1191. });
  1192. }
  1193. },
  1194. // 隐藏侧边栏
  1195. changeMenuType () {
  1196. if (this.menuType === '2') {
  1197. this.menuType = '1';
  1198. } else {
  1199. this.menuType = '2';
  1200. }
  1201. },
  1202. // 菜单选中
  1203. thisMenu (item) {
  1204. for (let b of this.pageBreadcrumb) {
  1205. if (b.menuId === item.menuId) {
  1206. return true;
  1207. }
  1208. }
  1209. return false;
  1210. },
  1211. // 弹窗完成
  1212. userModalThen (str, item) {
  1213. // console.log('代码执行了')
  1214. switch (str) {
  1215. case 'close':
  1216. this.userModal.show = false;
  1217. break;
  1218. case 'success':
  1219. this.userModal.show = false;
  1220. // 刷新
  1221. this.store.dispatch('getUserInfo');
  1222. break;
  1223. }
  1224. },
  1225. // 修改密码
  1226. pwdSubmit () {
  1227. this.$refs['pwdModal'].validate((valid) => {
  1228. if (valid) {
  1229. this.pwdModal.loading = true;
  1230. this.pwdModal.form.userid = this.store.state.userInfo.id;
  1231. this.store.dispatch('system/usersManage/updpsw', this.pwdModal.form).then((res) => {
  1232. this.pwdModal.loading = false;
  1233. if (res.code === '0') {
  1234. this.$message.success('设置成功');
  1235. this.pwdModal.show = false;
  1236. } else {
  1237. this.$message.error(res.message);
  1238. }
  1239. });
  1240. }
  1241. });
  1242. },
  1243. // 打开修改密码弹窗
  1244. openPwd () {
  1245. this.$refs['pwdModal'].resetFields && this.$refs['pwdModal'].resetFields();
  1246. },
  1247. // 弹窗完成
  1248. userModalThen (str, item) {
  1249. let that = this;
  1250. switch (str) {
  1251. case 'close':
  1252. that.userModal.show = false;
  1253. break;
  1254. case 'success':
  1255. that.userModal.show = false;
  1256. // 刷新
  1257. that.getUser(that.tableParams.form);
  1258. break;
  1259. }
  1260. },
  1261. // 关闭弹窗
  1262. userModalClose () {
  1263. },
  1264. // 修改完毕重新请求数据
  1265. updataUserInfo (data) {
  1266. this.getUserInfo();
  1267. this.$store.commit('userInfo', data)
  1268. },
  1269. initWebSocket () {
  1270. let that = this;
  1271. // websocket初始化
  1272. let token = getCookie('accessToken');
  1273. // WebSocket
  1274. if ('WebSocket' in window) {
  1275. // this.websocket = new WebSocket('ws://localhost:8086/websocket/123?token=' + token,[token])
  1276. // this.websocket = new WebSocket('ws:'+window.location.host+'/websocket/' + token);
  1277. that.websocket = new WebSocket('ws:'+window.location.host+'/zhongsteel.pass.web/pass/ems/websocket/' + token);
  1278. // 连接错误
  1279. that.websocket.onerror = that.setErrorMessage
  1280. // 连接成功
  1281. that.websocket.onopen = that.setOnopenMessage
  1282. // 收到消息的回调
  1283. that.websocket.onmessage = that.setOnmessageMessage
  1284. // 连接关闭的回调
  1285. that.websocket.onclose = that.setOncloseMessage
  1286. // 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
  1287. window.onbeforeunload = that.onbeforeunload
  1288. //每隔30秒钟发送一次心跳,避免websocket连接因超时而自动断开
  1289. that.interval = window.setTimeout(function(){ // bug:每次都会触发init,用setInterval导致定时器不断叠加
  1290. console.log('websoket 轮询');
  1291. if(that.websocket !== null){
  1292. if (that.websocket.readyState !== that.websocket.OPEN) {
  1293. if (token) {
  1294. console.log('websocket again')
  1295. that.initWebSocket()
  1296. }
  1297. }
  1298. }
  1299. },30000);
  1300. } else {
  1301. alert('当前浏览器 Not support websocket');
  1302. }
  1303. },
  1304. setErrorMessage () {
  1305. console.log('WebSocket连接发生错误 状态码:' + this.websocket.readyState)
  1306. },
  1307. setOnopenMessage () {
  1308. console.log('WebSocket连接成功 状态码:' + this.websocket.readyState)
  1309. },
  1310. setOnmessageMessage (event) {
  1311. // 根据服务器推送的消息做自己的业务处理
  1312. let data = JSON.parse(event.data);
  1313. let show = false;
  1314. if(this.qrRole.length > 0){
  1315. for(let item of data.role) {
  1316. let roleId = this.roleList.obj[item].id;
  1317. if(this.qrRole.includes(roleId)) {
  1318. show = true;
  1319. break;
  1320. }
  1321. }
  1322. } else{
  1323. show = true;
  1324. }
  1325. if(show) {
  1326. this.$notify({
  1327. title: data.title,
  1328. message: data.message,
  1329. position: 'bottom-right',
  1330. duration: 0,
  1331. onClose() {
  1332. console.log('关闭啦', event);
  1333. }
  1334. });
  1335. // let audio = new Audio()
  1336. // audio.src = '/static/img/14430.wav';
  1337. // // 开启自动播放
  1338. // // this.audio.autoplay = true;
  1339. // audio.play();
  1340. this.handleSpeak(data.tips);
  1341. console.log('服务端返回:' + event.data);
  1342. console.log( document.visibilityState );
  1343. console.log( document.hidden);
  1344. if (document.visibilityState != 'visible' || document.hidden) {
  1345. let myWindow = window.open('','','width=200,height=100,left=800,top=500');
  1346. // let myWindow = window.open(location.href,'_parent','');
  1347. myWindow.document.write('<p>'+data.message+'</p>');
  1348. myWindow.focus();
  1349. }
  1350. }
  1351. },
  1352. setOncloseMessage () {
  1353. console.log('WebSocket连接关闭 状态码:' + this.websocket.readyState);
  1354. if(this.interval){
  1355. window.clearInterval(this.interval);
  1356. // console.log("清除定时器");
  1357. }
  1358. },
  1359. onbeforeunload () {
  1360. this.closeWebSocket()
  1361. },
  1362. closeWebSocket () {
  1363. this.websocket.close()
  1364. },
  1365. // 语音播报的函数
  1366. handleSpeak(text='你好啊!'){
  1367. if(window.speechSynthesis){
  1368. const synth = window.speechSynthesis;
  1369. const msg = new SpeechSynthesisUtterance();
  1370. msg.text = text; // 文字内容
  1371. msg.lang = "zh-CN"; // 使用的语言:中文
  1372. msg.volume = 20; // 声音音量:1
  1373. msg.rate = 1; // 语速:1
  1374. msg.pitch = 1; // 音高:1
  1375. msg.voice = this.getWindowVoice() // 使用本地服务合成语音(若是获取不到 请异步获取, 加一个setTimeout)
  1376. synth.speak(msg); // 播放
  1377. }
  1378. },
  1379. getWindowVoice(){ // 获取浏览器中语音 (中文 + 本地服务)
  1380. return window.speechSynthesis.getVoices().find(item => item.localService && item.lang === 'zh-CN')
  1381. },
  1382. getRoles () {
  1383. let that = this;
  1384. // 获取用户信息
  1385. this.store.dispatch('getUserInfo').then((res) => {
  1386. that.axios.get('pass/v1/sysuserroles/?userId=' + res.data.userId + '&pageNum=1&pageSize=100').then(rest => {
  1387. if (rest) {
  1388. for (let i = 0; i < rest.data.list.length; i++) {
  1389. that.qrRole.push(rest.data.list[i].roleId)
  1390. }
  1391. that.userRoles = rest.data.list; // 获取用户角色关联信息
  1392. }
  1393. })
  1394. });
  1395. // 获取角色信息
  1396. this.store.dispatch('system/rolesManage/list').then(res => {
  1397. if (res.code === '0') {
  1398. this.roleList.arr = res.data;
  1399. for (let obj of res.data) {
  1400. this.roleList.obj[obj.roleName] = {
  1401. name: obj.roleName,
  1402. id: obj.id
  1403. };
  1404. }
  1405. } else {
  1406. this.$message.error(res.message);
  1407. }
  1408. });
  1409. }
  1410. }
  1411. }
  1412. </script>
  1413. <!-- Add "scoped" attribute to limit CSS to this component only -->
  1414. <style scoped>
  1415. .el-menu--collapse {
  1416. width: 100% !important;
  1417. }
  1418. .contextmenu {
  1419. width: 150px;
  1420. height: 150px;
  1421. top: 0px;
  1422. position: absolute;
  1423. display: none;
  1424. }
  1425. .main {
  1426. height: 100%;
  1427. }
  1428. .sl-header {
  1429. position: fixed;
  1430. top: 0;
  1431. left: 0;
  1432. z-index: 1002;
  1433. width: 100%;
  1434. /* min-width: 1150px; */
  1435. background-color: #fff;
  1436. background-color: rgba(255, 255, 255, 0.9);
  1437. }
  1438. .sl-container {
  1439. height: 100%;
  1440. position: relative;
  1441. padding-top: 60px;
  1442. padding-left: 79px;
  1443. /* transition: padding-left .3s ease-out; */
  1444. }
  1445. .sl-container2 {
  1446. padding-left: 179px;
  1447. }
  1448. .sl-content-main {
  1449. width: 100%;
  1450. height: 100%;
  1451. overflow: auto;
  1452. }
  1453. .sl-menu-main {
  1454. position: fixed;
  1455. top: 0;
  1456. left: 0;
  1457. z-index: 1001;
  1458. width: 80px;
  1459. height: calc(100% - 97px);
  1460. margin-top: 97px;
  1461. border-right: 1px solid #ccc;
  1462. background-color: #fff;
  1463. /* transition: width .25s ease-out;*/
  1464. }
  1465. .sl-menu-main2 {
  1466. width: 180px;
  1467. -webkit-touch-callout: none;
  1468. -webkit-user-select: none;
  1469. -khtml-user-select: none;
  1470. -moz-user-select: none;
  1471. -ms-user-select: none;
  1472. user-select: none;
  1473. }
  1474. .sl-content {
  1475. transition: margin-left 0.2s linear;
  1476. }
  1477. .sl-header-ul {
  1478. height: 60px;
  1479. border-bottom: 1px solid #ccc;
  1480. /* background-image: url(../assets/img/ytg_tab.png);
  1481. */
  1482. background-color: #409eff;
  1483. }
  1484. .sl-header-li-logo {
  1485. float: left;
  1486. margin-top: 13px;
  1487. margin-left: 20px;
  1488. width: 20%;
  1489. height: 80%;
  1490. }
  1491. .sl-header-li-name {
  1492. float: left;
  1493. height: 60px;
  1494. line-height: 60px;
  1495. margin-left: 20px;
  1496. color: #fff;
  1497. font-size: 20px;
  1498. }
  1499. .sl-header-li-line {
  1500. float: left;
  1501. margin-top: 5px;
  1502. height: 26px;
  1503. }
  1504. .sl-header-li-lgo {
  1505. float: right;
  1506. margin-top: 21px;
  1507. width: 120px;
  1508. }
  1509. .sl-header-li-lgob {
  1510. display: inline-block;
  1511. padding-left: 25px;
  1512. position: relative;
  1513. color: white;
  1514. height: 20px;
  1515. line-height: 20px;
  1516. vertical-align: middle;
  1517. }
  1518. .sl-header-li-lgob > .xs-icons {
  1519. position: absolute;
  1520. top: -8px;
  1521. left: -18px;
  1522. }
  1523. .sl-menu-ops {
  1524. font-size: 16px;
  1525. color: #666;
  1526. transition: transform 0.3s ease-out;
  1527. }
  1528. .sl-menu-main2 .sl-menu-ops {
  1529. transform: rotate(180deg);
  1530. }
  1531. /* header menu style --> begin */
  1532. .sl-menu {
  1533. border-right: solid 0px #e6e6e6;
  1534. }
  1535. .sl-menu-a {
  1536. position: relative;
  1537. display: inline-block;
  1538. width: 100%;
  1539. padding-left: 54px;
  1540. -webkit-transition: color 0.3s;
  1541. transition: color 0.3s;
  1542. cursor: pointer;
  1543. border-right: 2px solid #fff;
  1544. }
  1545. .sl-menu-tip-cover {
  1546. position: absolute;
  1547. top: 0;
  1548. left: 0;
  1549. width: 100%;
  1550. height: 100%;
  1551. }
  1552. .sl-menu-a-noc {
  1553. padding-right: 2px;
  1554. }
  1555. .sl-menu-lit {
  1556. opacity: 0;
  1557. display: inline-block;
  1558. margin-top: 4px;
  1559. height: 36px;
  1560. line-height: 36px;
  1561. vertical-align: middle;
  1562. overflow: hidden;
  1563. transition: opacity 0.3s ease-out;
  1564. }
  1565. .sl-menu-main2 .sl-menu-lit {
  1566. opacity: 1;
  1567. }
  1568. .sl-menu-main2 .sl-menu-tip-cover {
  1569. display: none;
  1570. }
  1571. .sl-menu-lic {
  1572. position: absolute;
  1573. top: 50%;
  1574. left: 30px;
  1575. margin-top: -10px;
  1576. }
  1577. .sl-menu-ric {
  1578. position: absolute;
  1579. top: 50%;
  1580. right: 4px;
  1581. margin-top: -3px;
  1582. font-family: element-icons !important;
  1583. speak: none;
  1584. font-style: normal;
  1585. font-weight: 400;
  1586. font-variant: normal;
  1587. color: #999;
  1588. text-transform: none;
  1589. line-height: 1;
  1590. vertical-align: baseline;
  1591. display: inline-block;
  1592. -webkit-font-smoothing: antialiased;
  1593. font-smoothing: antialiased;
  1594. -webkit-transition: transform 0.3s;
  1595. transition: transform 0.3s;
  1596. }
  1597. /* .sl-menu-ric:before{
  1598. content: "\E603";
  1599. }*/
  1600. .sl-menu-ricr {
  1601. color: #999;
  1602. }
  1603. .sl-menu-s {
  1604. position: absolute;
  1605. top: -7px;
  1606. left: 100%;
  1607. z-index: 1004;
  1608. border: 1px solid #ccc;
  1609. box-shadow: 0 2px 8px #999;
  1610. border-radius: 2px;
  1611. background-color: #fff;
  1612. min-width: 130px;
  1613. padding: 10px 0;
  1614. }
  1615. .sl-menu-sham {
  1616. -webkit-transform: scaleY(0);
  1617. transform: scaleY(0);
  1618. -webkit-transition: transform, display 0.4s;
  1619. transition: transform 0.4s;
  1620. -webkit-transform-origin: center top;
  1621. transform-origin: center top;
  1622. }
  1623. .sl-menu-a:hover > .sl-menu-sham,
  1624. .sl-menu-sa:hover > .sl-menu-sham {
  1625. opacity: 1;
  1626. -webkit-transform: scaleY(1);
  1627. transform: scaleY(1);
  1628. }
  1629. .sl-menu-s.sl-menu-s-right {
  1630. left: auto;
  1631. right: 15px;
  1632. }
  1633. .main-upload_text_logo {
  1634. display: block;
  1635. text-align: center;
  1636. position: relative;
  1637. margin: 0px -20px;
  1638. top: -35px;
  1639. border-bottom: 1px solid #cccccc;
  1640. }
  1641. .main-file_upload {
  1642. width: 100%;
  1643. text-align: center;
  1644. position: relative;
  1645. display: inline-block;
  1646. vertical-align: top;
  1647. }
  1648. .main-file_con .hide {
  1649. width: 120px;
  1650. position: absolute;
  1651. height: 30px;
  1652. left: 58px;
  1653. margin-top: -8px;
  1654. opacity: 0;
  1655. filter: alpha(opacity=0);
  1656. z-index: 22;
  1657. }
  1658. .main-file_con .main-file_uploader,
  1659. .upload_bt {
  1660. left: 0;
  1661. top: -5px;
  1662. position: relative;
  1663. color: #fff;
  1664. display: inline-block;
  1665. padding: 0px 20px;
  1666. background: #2ecc71;
  1667. text-align: center;
  1668. z-index: 11;
  1669. border-radius: 15px;
  1670. cursor: pointer;
  1671. }
  1672. .upload_bt {
  1673. left: 130px;
  1674. }
  1675. .main-file_con .hide:hover {
  1676. box-shadow: 1px 2px #44795b;
  1677. }
  1678. .main-img_holder,
  1679. .m_main-img_holder {
  1680. height: 100px;
  1681. line-height: 70px;
  1682. }
  1683. .main-img_holder img,
  1684. .m_main-img_holder img {
  1685. max-width: 200px;
  1686. }
  1687. .main-file_btn_upload {
  1688. margin-top: -20px;
  1689. margin-bottom: 20px;
  1690. }
  1691. .sl-menu-sa {
  1692. display: block;
  1693. min-width: 120px;
  1694. white-space: nowrap;
  1695. padding: 0 20px;
  1696. line-height: 32px;
  1697. position: relative;
  1698. }
  1699. .sl-menu-a:hover {
  1700. color: #2391e5;
  1701. background-color: #e2f1fc;
  1702. border-right-color: #e2f1fc;
  1703. }
  1704. .sl-menu-a:hover > .sl-menu-ric {
  1705. color: #2391e5;
  1706. -webkit-transform: rotate(180deg);
  1707. transform: rotate(180deg);
  1708. }
  1709. .sl-menu-sa:hover {
  1710. background-color: #e2f1fc;
  1711. color: #2391e5;
  1712. }
  1713. .sl-menu-sa:hover > .sl-menu-ricr {
  1714. color: #2391e5;
  1715. }
  1716. .sl-menu-ss {
  1717. opacity: 0;
  1718. position: absolute;
  1719. left: 100%;
  1720. top: -11px;
  1721. z-index: 1005;
  1722. padding: 10px 0;
  1723. border: 1px solid #ccc;
  1724. box-shadow: 0 2px 8px #999;
  1725. border-radius: 2px;
  1726. background-color: #fff;
  1727. }
  1728. .sl-menu-sed {
  1729. border-right-color: #2391e5;
  1730. }
  1731. .sl-menu-sed,
  1732. .sl-menu-ssed,
  1733. .sl-menu-sssed {
  1734. color: #2391e5;
  1735. }
  1736. .sl-menu-sed > .sl-menu-ricr,
  1737. .sl-menu-ssed > .sl-menu-ricr,
  1738. .sl-menu-sed > .sl-menu-ric {
  1739. color: #2391e5;
  1740. }
  1741. .sl-menu-sdis {
  1742. cursor: default !important;
  1743. cursor: not-allowed !important;
  1744. color: #999 !important;
  1745. background-color: #fff !important;
  1746. }
  1747. .sl-menu-reverse > .sl-menu-s,
  1748. .sl-menu-reverse > .sl-menu-ss {
  1749. top: auto;
  1750. bottom: -11px;
  1751. -webkit-transform-origin: center bottom;
  1752. transform-origin: center bottom;
  1753. }
  1754. /* header menu style --> end */
  1755. .sl-breadcrumb {
  1756. overflow: hidden;
  1757. background-color: #fff;
  1758. height: 30px;
  1759. padding: 7px 0 0 20px;
  1760. }
  1761. .sl-header-li-lgbc {
  1762. position: absolute;
  1763. right: 395px;
  1764. top: 20px;
  1765. }
  1766. .sl-breadcrumb-text {
  1767. float: left;
  1768. color: white;
  1769. }
  1770. .sl-breadcrumb-list {
  1771. float: left;
  1772. padding-left: 10px;
  1773. font-size: 12px;
  1774. position: relative;
  1775. top: 6px;
  1776. }
  1777. .sl-footer {
  1778. padding: 20px 0 0px;
  1779. }
  1780. .sl-footer > p {
  1781. text-align: center;
  1782. height: 20px;
  1783. line-height: 20px;
  1784. vertical-align: middle;
  1785. }
  1786. .am-xz {
  1787. float: left;
  1788. margin-right: 7px;
  1789. margin-top: 2px;
  1790. animation: amXuanzhuan 4s linear infinite;
  1791. }
  1792. @keyframes amXuanzhuan {
  1793. 0% {
  1794. transform: rotate3d(1, 0, 0, 360deg);
  1795. }
  1796. 100% {
  1797. transform: rotate3d(1, 0, 0, 0);
  1798. }
  1799. }
  1800. .oa-header-photo-uld {
  1801. width: 200px;
  1802. height: 200px;
  1803. line-height: 200px;
  1804. vertical-align: middle;
  1805. margin: 0 auto;
  1806. overflow: hidden;
  1807. cursor: pointer;
  1808. }
  1809. .oa-header-photo-uld > img {
  1810. max-width: 100%;
  1811. max-height: 100%;
  1812. vertical-align: middle;
  1813. }
  1814. /*.oa-header-content {*/
  1815. /*background: url("../../static/img/top_bgimg.png") left center no-repeat rgb(60,207,255);*/
  1816. /*height: 60px;*/
  1817. /*}*/
  1818. .oa-header-logo {
  1819. float: left;
  1820. padding: 15px 0 0 30px;
  1821. height: 50px;
  1822. overflow: hidden;
  1823. }
  1824. .oa-header-logo > img {
  1825. animation: fadeInLeft 0.5s ease-out 0s both;
  1826. }
  1827. .menu-filter {
  1828. height: 37px;
  1829. width: 180px;
  1830. left: 0px;
  1831. position: absolute;
  1832. top: 60px;
  1833. z-index: 1024;
  1834. /* background-color: rgba(26,21,51); */
  1835. background-color: #ccf1ff;
  1836. border-right: 1px solid #ccc;
  1837. border-bottom: 1px solid #ccc;
  1838. }
  1839. .oa-header-upt {
  1840. width: 60px;
  1841. height: 60px;
  1842. overflow: hidden;
  1843. text-align: center;
  1844. }
  1845. .oa-header-upt > a {
  1846. display: inline-block;
  1847. width: 40px;
  1848. height: 40px;
  1849. margin-top: 10px;
  1850. animation: fadeInRight 0.5s ease-out 0s both;
  1851. }
  1852. .oa-header-upt > a > img {
  1853. width: 40px;
  1854. height: 40px;
  1855. line-height: 40px;
  1856. vertical-align: middle;
  1857. color: #333;
  1858. border-radius: 20px;
  1859. box-shadow: 0 0 10px #6a6464;
  1860. }
  1861. .oa-header-user {
  1862. position: absolute;
  1863. right: 180px;
  1864. top: 0;
  1865. width: 60px;
  1866. height: 60px;
  1867. }
  1868. .oa-header-user:hover .oa-header-upt > a > img {
  1869. animation: circle 4s linear 0s infinite;
  1870. }
  1871. .oa-header-ucon {
  1872. display: none;
  1873. overflow: hidden;
  1874. position: absolute;
  1875. top: 50px;
  1876. left: -27px;
  1877. z-index: 18000;
  1878. padding: 10px 0 10px 10px;
  1879. font-size: 15px;
  1880. }
  1881. .oa-header-ulist {
  1882. position: relative;
  1883. width: 215px;
  1884. border: 1px solid #ddd;
  1885. box-shadow: 0 0 8px #999;
  1886. background-color: #fff;
  1887. background-color: rgba(255, 255, 255, 0.95);
  1888. }
  1889. .oa-header-user:hover .oa-header-ucon {
  1890. display: block;
  1891. }
  1892. .oa-header-user:hover .oa-header-ulist {
  1893. animation: fadeInRight 0.4s ease-out 0s both;
  1894. }
  1895. .oa-header-uin {
  1896. text-align: center;
  1897. overflow: hidden;
  1898. padding: 20px 0 15px 0;
  1899. }
  1900. .oa-header-uin > img {
  1901. width: 60px;
  1902. height: 60px;
  1903. border-radius: 30px;
  1904. cursor: pointer;
  1905. }
  1906. .oa-header-uin > img:hover {
  1907. animation: largen2 0.6s ease-out 0s both;
  1908. }
  1909. .oa-header-uin > h3 {
  1910. padding-top: 10px;
  1911. color: #666;
  1912. }
  1913. .oa-header-uul {
  1914. padding-bottom: 10px;
  1915. }
  1916. .oa-header-uul > li {
  1917. height: 40px;
  1918. line-height: 40px;
  1919. text-align: center;
  1920. vertical-align: middle;
  1921. cursor: pointer;
  1922. transition: background-color 0.3s linear 0s;
  1923. }
  1924. .oa-header-uul .st-icons {
  1925. position: relative;
  1926. top: 6px;
  1927. margin-right: 8px;
  1928. transition: all 0.3s linear;
  1929. }
  1930. .st-icons-out {
  1931. margin-right: 4px;
  1932. }
  1933. .oa-header-uul > li:hover {
  1934. background-color: #ebebeb;
  1935. }
  1936. .oa-header-uul::before,
  1937. .oa-header-uul::after {
  1938. border-bottom-color: rgba(0, 0, 0, 0.2);
  1939. content: "";
  1940. display: inline-block;
  1941. position: absolute;
  1942. }
  1943. .oa-header-uul::after {
  1944. left: 41px;
  1945. top: -6px;
  1946. border-bottom: 6px solid #fff;
  1947. border-left: 6px solid transparent;
  1948. border-right: 6px solid transparent;
  1949. }
  1950. .oa-header-uul::before {
  1951. left: 40px;
  1952. top: -7px;
  1953. border-bottom: 7px solid #ccc;
  1954. border-left: 7px solid transparent;
  1955. border-right: 7px solid transparent;
  1956. }
  1957. .hnstLogo {
  1958. position: absolute;
  1959. right: 20px;
  1960. top: 14px;
  1961. }
  1962. .hnstLogo > img {
  1963. height: 32px;
  1964. }
  1965. .marignL38 {
  1966. margin-left: 38px;
  1967. }
  1968. .menuDrag {
  1969. height: calc(100% - 120px);
  1970. width: 18px;
  1971. position: absolute;
  1972. right: -6px;
  1973. cursor: col-resize;
  1974. z-index: 22;
  1975. }
  1976. .overFlowSet {
  1977. overflow-x: hidden;
  1978. overflow-y: auto;
  1979. background: #0080ff;
  1980. }
  1981. .pageBreadcrumb {
  1982. display: none;
  1983. }
  1984. </style>