Home.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700
  1. <template>
  2. <el-row class="container">
  3. <el-col :span="24" class="header">
  4. <el-col
  5. :span="10"
  6. class="logo"
  7. :class="collapsed?'logo-collapse-width':'logo-width'"
  8. :style="collapsed?'padding:0':''"
  9. >
  10. <img v-if="collapsed" class="headImg" src="../assets/image/head_logo.png" />
  11. <span v-else>{{sysName}}</span>
  12. </el-col>
  13. <el-col :span="10">
  14. <div class="tools" @click.prevent="collapse">
  15. <i class="fa fa-align-justify"></i>
  16. </div>
  17. </el-col>
  18. <el-col :span="6" class="userinfo">
  19. <el-badge class="itemNew" :value="unreadCount[3]" :hidden="unreadCount[3] == 0">
  20. <i class="el-icon-message-solid" style="font-size:24px" v-popover:popover1></i>
  21. <!-- 消息中心 -->
  22. <el-popover
  23. ref="popover1"
  24. placement="bottom"
  25. width="400"
  26. trigger="hover"
  27. popper-class="popover-self"
  28. >
  29. <!-- 消息盒子中间部分 -->
  30. <el-tabs v-model="activePage" @tab-click="handleClick" stretch>
  31. <!-- 审批的页面 -->
  32. <el-tab-pane name="0">
  33. <span slot="label">
  34. <span v-if="unreadCount[0] == 0">审批</span>
  35. <span v-else>审批({{unreadCount[0]}})</span>
  36. </span>
  37. <div class="popover-item" v-if="unreadCount[0] == 0">暂无审批消息</div>
  38. <div class="popover-item" v-for="item in popoverData[0]">
  39. <p class="popover-title">
  40. <span
  41. style="cursor: pointer;"
  42. @click="locationHerf(item.refId, item.noticeType)"
  43. >{{item.projectName}}</span>
  44. </p>
  45. <p>{{item.content}}</p>
  46. </div>
  47. </el-tab-pane>
  48. <!-- 警告的页面 -->
  49. <el-tab-pane name="1">
  50. <span slot="label">
  51. <span v-if="unreadCount[1] == 0">警告</span>
  52. <span v-else>警告({{unreadCount[1]}})</span>
  53. </span>
  54. <div class="popover-item" v-if="unreadCount[1] == 0">暂无警告消息</div>
  55. <div class="popover-item" v-for="item in popoverData[1]">
  56. <p class="popover-title">
  57. <span
  58. style="cursor: pointer;"
  59. @click="locationHerf(item.refId, item.noticeType)"
  60. >{{item.projectName}}</span>
  61. </p>
  62. <p>{{item.content}}</p>
  63. </div>
  64. </el-tab-pane>
  65. <!-- 保养的页面 -->
  66. <el-tab-pane name="2">
  67. <span slot="label">
  68. <span v-if="unreadCount[2] == 0">保养</span>
  69. <span v-else>保养({{unreadCount[2]}})</span>
  70. </span>
  71. <div class="popover-item" v-if="unreadCount[2] == 0">暂无保养消息</div>
  72. <div class="popover-item" v-for="item in popoverData[2]">
  73. <p class="popover-title">
  74. <span
  75. style="cursor: pointer;"
  76. @click="locationHerf(item.refId, item.noticeType)"
  77. >{{item.projectName}}</span>
  78. </p>
  79. <p>{{item.content}}</p>
  80. </div>
  81. </el-tab-pane>
  82. </el-tabs>
  83. <!-- 查看全部的按钮 -->
  84. <router-link :to="'/message'" tag="div" class="popover-button">查看全部</router-link>
  85. </el-popover>
  86. </el-badge>
  87. <el-dropdown trigger="hover">
  88. <span class="el-dropdown-link userinfo-inner">
  89. <img src="../assets/image/userHead.jpg" />
  90. {{sysUserName}}
  91. </span>
  92. <el-dropdown-menu slot="dropdown">
  93. <el-dropdown-item @click.native="reset">修改密码</el-dropdown-item>
  94. <el-dropdown-item @click.native="editInfoOpen">修改信息</el-dropdown-item>
  95. <el-dropdown-item divided @click.native="logout">退出登录</el-dropdown-item>
  96. </el-dropdown-menu>
  97. </el-dropdown>
  98. </el-col>
  99. </el-col>
  100. <el-col :span="24" class="main">
  101. <aside :class="collapsed?'menu-collapsed':'menu-expanded'">
  102. <!--导航菜单-->
  103. <el-menu
  104. :default-active="$route.path"
  105. class="el-menu-vertical-demo"
  106. @open="handleopen"
  107. @close="handleclose"
  108. @select="handleselect"
  109. unique-opened
  110. router
  111. v-if="!collapsed"
  112. >
  113. <template v-for="(item,index) in $router.options.routes" v-if="!item.hidden">
  114. <el-submenu :index="index+''" v-if="!item.leaf">
  115. <template slot="title">
  116. <i :class="item.iconCls"></i>
  117. <span class="itemName">{{item.name}}</span>
  118. </template>
  119. <el-menu-item
  120. v-for="child in item.children"
  121. :index="child.path"
  122. :key="child.path"
  123. v-if="!child.hidden"
  124. >{{child.name}}</el-menu-item>
  125. </el-submenu>
  126. <el-menu-item
  127. v-if="item.leaf && item.children.length > 0"
  128. :index="item.children[0].path"
  129. >
  130. <i :class="item.iconCls"></i>
  131. {{item.children[0].name}}
  132. </el-menu-item>
  133. </template>
  134. </el-menu>
  135. <!--导航菜单-折叠后-->
  136. <ul class="el-menu el-menu-vertical-demo collapsed" v-if="collapsed" ref="menuCollapsed">
  137. <li
  138. v-for="(item,index) in $router.options.routes"
  139. v-if="!item.hidden"
  140. class="el-submenu item"
  141. :style="{overflow:!item.leaf?'':'hidden'}"
  142. >
  143. <template v-if="!item.leaf">
  144. <div
  145. class="el-submenu__title"
  146. style="padding-left: 20px;"
  147. @mouseover="showMenu(index,true)"
  148. @mouseout="showMenu(index,false)"
  149. >
  150. <i :class="item.iconCls"></i>
  151. </div>
  152. <ul
  153. class="el-menu submenu"
  154. :class="'submenu-hook-'+index"
  155. @mouseover="showMenu(index,true)"
  156. @mouseout="showMenu(index,false)"
  157. >
  158. <li
  159. v-for="child in item.children"
  160. v-if="!child.hidden"
  161. :key="child.path"
  162. class="el-menu-item"
  163. style="padding-left: 40px;"
  164. :class="$route.path==child.path?'is-active':''"
  165. @click="$router.push(child.path)"
  166. >{{child.name}}</li>
  167. </ul>
  168. </template>
  169. <template v-else>
  170. <li class="el-submenu">
  171. <div
  172. class="el-submenu__title el-menu-item"
  173. style="padding-left: 20px;height: 56px;line-height: 56px;padding: 0 20px;"
  174. :class="$route.path==item.children[0].path?'is-active':''"
  175. @click="$router.push(item.children[0].path)"
  176. >
  177. <i :class="item.iconCls"></i>
  178. </div>
  179. </li>
  180. </template>
  181. </li>
  182. </ul>
  183. </aside>
  184. <section class="content-container">
  185. <div class="grid-content bg-purple-light">
  186. <el-col :span="24" class="content-wrapper">
  187. <transition name="fade" mode="out-in">
  188. <router-view></router-view>
  189. </transition>
  190. </el-col>
  191. </div>
  192. <!--修改密码-->
  193. <el-dialog
  194. title="修改密码"
  195. v-if="editPassWord"
  196. :visible.sync="editPassWord"
  197. :close-on-click-modal="false"
  198. customClass="customWidth"
  199. >
  200. <el-form :model="addForm" label-width="80px" :rules="passRule" ref="addForm">
  201. <el-form-item label="新密码" prop="password">
  202. <el-input
  203. v-model="addForm.password"
  204. autocomplete="off"
  205. placeholder="请输入新密码"
  206. show-password
  207. ></el-input>
  208. </el-form-item>
  209. </el-form>
  210. <div slot="footer" class="dialog-footer">
  211. <el-button @click.native="editPassWord = false">取消</el-button>
  212. <el-button type="primary" @click.native="resetPwd" :loading="editLoading">提交</el-button>
  213. </div>
  214. </el-dialog>
  215. <!--修改信息-->
  216. <el-dialog
  217. title="修改信息"
  218. v-if="editInformation"
  219. :visible.sync="editInformation"
  220. :close-on-click-modal="false"
  221. customClass="customWidth"
  222. >
  223. <el-form :model="editInfoForm" label-width="80px" :rules="passRule" ref="editInfoForm">
  224. <el-form-item label="姓名" prop="username">
  225. <el-input v-model="editInfoForm.username" autocomplete="off" placeholder="请输入姓名"></el-input>
  226. </el-form-item>
  227. </el-form>
  228. <el-form :model="editInfoForm" label-width="80px" :rules="passRule" ref="editInfoForm">
  229. <el-form-item label="手机号" prop="mobile">
  230. <el-input
  231. v-model="editInfoForm.mobile"
  232. autocomplete="off"
  233. placeholder="请输入手机号"
  234. :disabled="true"
  235. ></el-input>
  236. </el-form-item>
  237. </el-form>
  238. <el-form :model="editInfoForm" label-width="80px" :rules="passRule" ref="editInfoForm">
  239. <el-form-item label="所属公司" prop="companyName">
  240. <el-input
  241. v-model="editInfoForm.companyName"
  242. autocomplete="off"
  243. placeholder="请输入所属公司"
  244. :disabled="true"
  245. ></el-input>
  246. </el-form-item>
  247. </el-form>
  248. <div slot="footer" class="dialog-footer">
  249. <el-button @click.native="editInformation = false">取消</el-button>
  250. <el-button type="primary" @click.native="editInfo" :loading="editLoading2">提交</el-button>
  251. </div>
  252. </el-dialog>
  253. </section>
  254. </el-col>
  255. </el-row>
  256. </template>
  257. <script>
  258. export default {
  259. data() {
  260. return {
  261. user: sessionStorage.getItem("user"),
  262. sysName: "云塑网后台管理系统",
  263. collapsed: false,
  264. sysUserName: "",
  265. editInformation: false,
  266. editPassWord: false,
  267. editLoading: false,
  268. editLoading2: false,
  269. addForm: {
  270. id: "",
  271. password: ""
  272. },
  273. editInfoForm: {
  274. id: "",
  275. username: "",
  276. mobile: "",
  277. companyName: ""
  278. },
  279. passRule: {
  280. password: [
  281. { required: true, message: "请输入新密码", trigger: "blur" }
  282. ],
  283. username: [{ required: true, message: "请输入姓名", trigger: "blur" }]
  284. },
  285. //消息数据
  286. popoverData: [],
  287. unreadCount: [],
  288. activePage: 0
  289. };
  290. },
  291. methods: {
  292. onSubmit() {},
  293. handleopen() {},
  294. handleclose() {},
  295. handleselect: function(a, b) {},
  296. //退出登录
  297. logout: function() {
  298. var _this = this;
  299. this.$confirm("确认退出吗?", "提示", {
  300. //type: 'warning'
  301. }).then(() => {
  302. sessionStorage.removeItem("user");
  303. _this.$router.push("/login");
  304. });
  305. },
  306. //折叠导航栏
  307. collapse: function() {
  308. this.collapsed = !this.collapsed;
  309. },
  310. showMenu(i, status) {
  311. this.$refs.menuCollapsed.getElementsByClassName(
  312. "submenu-hook-" + i
  313. )[0].style.display = status ? "block" : "none";
  314. },
  315. //打开编辑信息界面
  316. editInfoOpen() {
  317. this.editInformation = true;
  318. this.editInfoForm.id = JSON.parse(sessionStorage.getItem("user")).id;
  319. this.editInfoForm.username = JSON.parse(
  320. sessionStorage.getItem("user")
  321. ).username;
  322. this.editInfoForm.mobile = JSON.parse(
  323. sessionStorage.getItem("user")
  324. ).account;
  325. this.editInfoForm.companyName = JSON.parse(
  326. sessionStorage.getItem("user")
  327. ).companyName;
  328. },
  329. //编辑信息
  330. editInfo() {
  331. this.$refs.editInfoForm.validate(valid => {
  332. if (valid) {
  333. this.editLoading2 = true;
  334. this.http.post(
  335. this.port.pwd.resetPwd,
  336. { id: this.editInfoForm.id, username: this.editInfoForm.username },
  337. res => {
  338. this.editLoading2 = false;
  339. this.editInformation = false;
  340. if (res.code == "ok") {
  341. this.$message({
  342. message: "修改成功",
  343. type: "success"
  344. });
  345. //读取并覆盖session storage
  346. var userObject = JSON.parse(sessionStorage.getItem("user"));
  347. userObject.username = this.editInfoForm.username;
  348. sessionStorage.setItem("user", JSON.stringify(userObject));
  349. this.sysUserName = this.editInfoForm.username;
  350. } else {
  351. this.$message({
  352. message: res.msg,
  353. type: "error"
  354. });
  355. }
  356. },
  357. error => {
  358. this.editLoading2 = false;
  359. this.editInformation = false;
  360. this.$message({
  361. message: error,
  362. type: "error"
  363. });
  364. }
  365. );
  366. }
  367. });
  368. },
  369. reset() {
  370. this.editPassWord = true;
  371. this.addForm.id = JSON.parse(sessionStorage.getItem("user")).id;
  372. this.addForm.account = JSON.parse(sessionStorage.getItem("user")).account;
  373. },
  374. resetPwd() {
  375. this.$refs.addForm.validate(valid => {
  376. if (valid) {
  377. this.editLoading = true;
  378. this.http.post(
  379. this.port.pwd.resetPwd,
  380. this.addForm,
  381. res => {
  382. this.editLoading = false;
  383. this.editPassWord = false;
  384. if (res.code == "ok") {
  385. this.$message({
  386. message: "修改成功,请重新登录",
  387. type: "success"
  388. });
  389. this.$router.push("/login");
  390. } else {
  391. this.$message({
  392. message: res.msg,
  393. type: "error"
  394. });
  395. }
  396. },
  397. error => {
  398. this.editLoading = false;
  399. this.editPassWord = false;
  400. this.$message({
  401. message: error,
  402. type: "error"
  403. });
  404. }
  405. );
  406. }
  407. });
  408. },
  409. //读取消息提示
  410. loadNotice() {
  411. this.http.post(
  412. this.port.notice.list,
  413. {
  414. pageNum: 1,
  415. pageSize: 5
  416. },
  417. res => {
  418. if (res.code == "ok") {
  419. this.popoverData = [];
  420. this.popoverData.push(res.data[0].approvelList.list);
  421. this.popoverData.push(res.data[1].matainList.list);
  422. this.popoverData.push(res.data[2].emergencyList.list);
  423. this.unreadCount = [];
  424. this.unreadCount.push(res.data[0].isNotReadCount);
  425. this.unreadCount.push(res.data[1].isNotReadCount);
  426. this.unreadCount.push(res.data[2].isNotReadCount);
  427. this.unreadCount.push(
  428. this.unreadCount[0] + this.unreadCount[1] + this.unreadCount[2]
  429. );
  430. } else {
  431. this.$message({
  432. message: res.msg,
  433. type: "error"
  434. });
  435. }
  436. },
  437. error => {
  438. this.$message({
  439. message: error,
  440. type: "error"
  441. });
  442. }
  443. );
  444. },
  445. //点击消息的跳转
  446. locationHerf(id, type) {
  447. this.http.post(
  448. this.port.notice.read,
  449. {
  450. id: id
  451. },
  452. res => {
  453. if (res.code == "ok") {
  454. } else {
  455. this.$message({
  456. message: res.msg,
  457. type: "error"
  458. });
  459. }
  460. },
  461. error => {
  462. this.$message({
  463. message: error,
  464. type: "error"
  465. });
  466. }
  467. );
  468. if (type == 0) {
  469. //审批 跳转到模具详情
  470. this.$router.push("/moldList/" + id);
  471. } else if (type == 1) {
  472. //警告 跳转到运行监测
  473. this.$router.push("/detection");
  474. } else if (type == 2) {
  475. //保养 跳转到运行监测详情
  476. this.$router.push("/detection/" + id);
  477. }
  478. },
  479. //标签页面切换时
  480. handleClick(tab, event) {
  481. this.activeTab = tab.name;
  482. }
  483. },
  484. mounted() {
  485. if (this.user) {
  486. var user = JSON.parse(this.user);
  487. this.user = user;
  488. this.sysUserName = user.username || "";
  489. this.loadNotice();
  490. } else {
  491. this.$router.push("/login");
  492. }
  493. }
  494. };
  495. </script>
  496. <style scoped lang="scss">
  497. @import "~scss_vars";
  498. .el-menu-vertical-demo i {
  499. margin-right: 10px;
  500. }
  501. .container .header .logo img.headImg {
  502. margin: 0;
  503. width: 40px;
  504. height: 40px;
  505. margin: 10px 0 0 10px;
  506. }
  507. .itemNew {
  508. height: 25px;
  509. margin-right: 25px;
  510. i {
  511. vertical-align: top;
  512. }
  513. }
  514. .container {
  515. position: absolute;
  516. top: 0px;
  517. bottom: 0px;
  518. width: 100%;
  519. .header {
  520. height: 60px;
  521. line-height: 60px;
  522. background: $color-primary;
  523. color: #fff;
  524. .userinfo {
  525. text-align: right;
  526. padding-right: 35px;
  527. float: right;
  528. .userinfo-inner {
  529. cursor: pointer;
  530. color: #fff;
  531. img {
  532. width: 40px;
  533. height: 40px;
  534. border-radius: 20px;
  535. margin: 10px 10px 10px 10px;
  536. // float: right;
  537. float: left;
  538. }
  539. }
  540. }
  541. .logo {
  542. //width:230px;
  543. height: 60px;
  544. font-size: 21px;
  545. padding-left: 20px;
  546. padding-right: 20px;
  547. border-color: rgba(238, 241, 146, 0.3);
  548. border-right-width: 1px;
  549. border-right-style: solid;
  550. img {
  551. width: 40px;
  552. float: left;
  553. margin: 10px 10px 10px 18px;
  554. }
  555. .txt {
  556. color: #fff;
  557. }
  558. }
  559. .logo-width {
  560. width: 230px;
  561. }
  562. .logo-collapse-width {
  563. width: 60px;
  564. }
  565. .tools {
  566. padding: 0px 23px;
  567. width: 14px;
  568. height: 60px;
  569. line-height: 60px;
  570. cursor: pointer;
  571. }
  572. }
  573. .main {
  574. display: flex;
  575. // background: #324057;
  576. position: absolute;
  577. top: 60px;
  578. bottom: 0px;
  579. overflow: hidden;
  580. aside {
  581. flex: 0 0 230px;
  582. width: 230px;
  583. // position: absolute;
  584. // top: 0px;
  585. // bottom: 0px;
  586. .el-menu {
  587. height: 100%;
  588. }
  589. .collapsed {
  590. width: 60px;
  591. .item {
  592. position: relative;
  593. }
  594. .submenu {
  595. position: absolute;
  596. top: 0px;
  597. left: 60px;
  598. z-index: 99999;
  599. height: auto;
  600. display: none;
  601. }
  602. }
  603. }
  604. .menu-collapsed {
  605. flex: 0 0 60px;
  606. width: 60px;
  607. }
  608. .menu-expanded {
  609. flex: 0 0 230px;
  610. width: 230px;
  611. }
  612. .content-container {
  613. // background: #f8f8f8;
  614. //f1f2f7
  615. flex: 1;
  616. width: 80%;
  617. // position: absolute;
  618. // right: 0px;
  619. // top: 0px;
  620. // bottom: 0px;
  621. // left: 230px;
  622. // overflow-y: scroll;
  623. padding: 20px;
  624. .breadcrumb-container {
  625. //margin-bottom: 15px;
  626. .title {
  627. width: 200px;
  628. float: left;
  629. color: #475669;
  630. }
  631. .breadcrumb-inner {
  632. float: right;
  633. }
  634. }
  635. .content-wrapper {
  636. background-color: #fff;
  637. box-sizing: border-box;
  638. }
  639. }
  640. }
  641. }
  642. .popover-item {
  643. padding: 10px;
  644. border-bottom: 1px #eee solid;
  645. }
  646. .popover-item > p {
  647. margin: 0;
  648. line-height: 18px;
  649. }
  650. .popover-title {
  651. color: #409eff;
  652. padding-bottom: 8px;
  653. }
  654. .popover-type {
  655. color: #aaa;
  656. font-size: 8px;
  657. float: right;
  658. }
  659. .popover-button {
  660. font-weight: 900;
  661. padding: 10px;
  662. text-align: center;
  663. cursor: pointer;
  664. }
  665. </style>