Home.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. <template>
  2. <div class="home">
  3. <HomeSide v-if="ifShowHomeSide" :key="sideKey" />
  4. <div class="home-header">
  5. <div v-if="ifShowHomeSide" class="header-breadcrumb">
  6. <LinkTitles :key="Math.random()" />
  7. </div>
  8. <ul class="header-menu">
  9. <li class="header-menu-item header-menu-org" title="机构名称">
  10. <i class="icon icon-users"></i>{{ user.rootOrgName }}
  11. </li>
  12. <li
  13. class="header-menu-item header-menu-user"
  14. title="个人信息管理"
  15. @click="openUserDialog"
  16. >
  17. <i class="icon icon-user"></i>{{ user.displayName }}
  18. </li>
  19. <li
  20. class="header-menu-item header-menu-logout"
  21. title="退出系统"
  22. @click="logout"
  23. >
  24. <i class="icon icon-logout"></i>
  25. </li>
  26. </ul>
  27. </div>
  28. <div class="home-body">
  29. <div class="home-main">
  30. <router-view class="main-content"></router-view>
  31. <div class="home-footer">
  32. Copyright &copy; 2021
  33. <a href="https://www.qmth.com.cn" target="_block">启明泰和</a>.<a
  34. href="https://beian.miit.gov.cn/"
  35. target="_blank"
  36. >鄂ICP备12000033号-13</a
  37. >
  38. </div>
  39. </div>
  40. </div>
  41. <!-- 添加用户信息弹出框 -->
  42. <el-dialog
  43. title="个人信息"
  44. width="620px"
  45. :visible.sync="userDialog"
  46. :modal="false"
  47. append-to-body
  48. custom-class="side-dialog"
  49. @close="() => $refs.passForm.clearValidate()"
  50. >
  51. <el-tabs v-model="userTabName">
  52. <el-tab-pane label="用户权限" name="first">
  53. <el-form :inline="true" label-position="right" label-width="90px">
  54. <el-tag
  55. v-for="role in user.roleList"
  56. :key="role.roleId"
  57. type="primary"
  58. style="margin-left: 10px; margin-top: 10px"
  59. >
  60. {{ role.roleName }}
  61. </el-tag>
  62. </el-form>
  63. </el-tab-pane>
  64. <el-tab-pane label="修改密码" name="second">
  65. <el-form
  66. ref="passForm"
  67. inline-message
  68. class="form-tight"
  69. :model="passForm"
  70. :rules="passRules"
  71. label-width="80px"
  72. >
  73. <el-form-item label="密码" prop="pass">
  74. <el-input
  75. v-model="passForm.pass"
  76. type="password"
  77. class="dialog-input-width"
  78. auto-complete="off"
  79. placeholder="请输入密码"
  80. />
  81. </el-form-item>
  82. <el-form-item label="确认密码" prop="checkPass">
  83. <el-input
  84. v-model="passForm.checkPass"
  85. type="password"
  86. class="dialog-input-width"
  87. auto-complete="off"
  88. placeholder="请输入确认密码"
  89. />
  90. </el-form-item>
  91. </el-form>
  92. </el-tab-pane>
  93. </el-tabs>
  94. <div v-if="userTabName === 'second'" slot="footer">
  95. <el-button type="primary" @click="submitForm">保存</el-button>
  96. <el-button type="danger" plain @click="userDialog = false"
  97. >取消</el-button
  98. >
  99. </div>
  100. </el-dialog>
  101. <!-- 修改密码 -->
  102. <el-dialog
  103. title="修改密码"
  104. width="650px"
  105. :lock-scroll="true"
  106. :close-on-click-modal="false"
  107. :close-on-press-escape="false"
  108. :show-close="false"
  109. :visible.sync="passWeakDialog"
  110. @close="() => $refs.passWeakForm.clearValidate()"
  111. >
  112. <el-form
  113. ref="passWeakForm"
  114. :inline="true"
  115. inline-message
  116. class="form-tight"
  117. :model="passWeakForm"
  118. :rules="passWeakRules"
  119. label-width="80px"
  120. >
  121. <el-row>
  122. <el-form-item label="密码" prop="pass">
  123. <el-input
  124. v-model="passWeakForm.pass"
  125. type="password"
  126. class="dialog-input-width"
  127. auto-complete="off"
  128. placeholder="输入新密码"
  129. />
  130. </el-form-item>
  131. </el-row>
  132. <el-row>
  133. <el-form-item label="确认密码" prop="checkPass">
  134. <el-input
  135. v-model="passWeakForm.checkPass"
  136. type="password"
  137. class="dialog-input-width"
  138. auto-complete="off"
  139. placeholder="再次输入新密码"
  140. />
  141. </el-form-item>
  142. </el-row>
  143. <el-row>
  144. <el-form-item
  145. ><span
  146. >*为保护您的账户安全,请重新录入新密码,以防泄露
  147. </span></el-form-item
  148. >
  149. </el-row>
  150. <el-row style="margin-left: 80px">
  151. <el-button type="primary" @click="submitPassWeakForm"
  152. >确 认</el-button
  153. >
  154. <el-button type="danger" plain @click="logout">取消</el-button>
  155. </el-row>
  156. </el-form>
  157. </el-dialog>
  158. </div>
  159. </template>
  160. <script>
  161. import { mapActions, mapState } from "vuex";
  162. import { USER_SIGNOUT, USER_SIGNIN } from "../../store/user";
  163. import { QUESTION_API } from "@/constants/constants";
  164. import HomeSide from "./HomeSide.vue";
  165. import LinkTitles from "./LinkTitles.vue";
  166. export default {
  167. name: "Home",
  168. components: { HomeSide, LinkTitles },
  169. data() {
  170. var validatePass = (rule, value, callback) => {
  171. if (this.passForm.checkPass !== "") {
  172. this.$refs.passForm.validateField("checkPass");
  173. }
  174. callback();
  175. };
  176. var validatePass2 = (rule, value, callback) => {
  177. if (value !== this.passForm.pass) {
  178. callback(new Error("两次输入密码不一致!"));
  179. } else {
  180. callback();
  181. }
  182. };
  183. var validatePassWeakPass = (rule, value, callback) => {
  184. if (this.passWeakForm.checkPass !== "") {
  185. this.$refs.passWeakForm.validateField("checkPass");
  186. }
  187. callback();
  188. };
  189. var validatePassWeakPass2 = (rule, value, callback) => {
  190. if (value !== this.passWeakForm.pass) {
  191. callback(new Error("两次输入密码不一致!"));
  192. } else {
  193. callback();
  194. }
  195. };
  196. const pwdRule = [
  197. {
  198. validator: (rule, value, callback) => {
  199. if (
  200. value &&
  201. (/^([0-9]+|[a-z]+|[A-Z]+)$/.test(value) ||
  202. !/^[a-zA-Z0-9_]+$/.test(value))
  203. ) {
  204. callback(new Error("密码只能大写字母、小写字母、数字至少两种组成"));
  205. } else {
  206. callback();
  207. }
  208. },
  209. trigger: "change",
  210. },
  211. {
  212. required: true,
  213. min: 8,
  214. max: 16,
  215. message: "密码只能8-16个字符",
  216. trigger: "change",
  217. },
  218. ];
  219. return {
  220. unreadMessageCount: 0,
  221. userDialog: false,
  222. userTabName: "first",
  223. passWeakDialog: false,
  224. passForm: { pass: "", checkPass: "" },
  225. passWeakForm: { pass: "", checkPass: "" },
  226. passRules: {
  227. pass: [{ validator: validatePass, trigger: "blur" }, ...pwdRule],
  228. checkPass: [{ validator: validatePass2, trigger: "blur" }, ...pwdRule],
  229. },
  230. passWeakRules: {
  231. pass: [
  232. { validator: validatePassWeakPass, trigger: "blur" },
  233. ...pwdRule,
  234. ],
  235. checkPass: [
  236. { validator: validatePassWeakPass2, trigger: "blur" },
  237. ...pwdRule,
  238. ],
  239. },
  240. };
  241. },
  242. computed: {
  243. ...mapState({ user: (state) => state.user }),
  244. ...mapState(["currentPaths"]),
  245. ifShowHomeSide() {
  246. return this.$route.fullPath.startsWith("/home") === false;
  247. },
  248. sideKey() {
  249. const module = this.$route.fullPath.split("/")[1];
  250. return module;
  251. },
  252. },
  253. created() {
  254. if (!this.user.passwordWeak) {
  255. this.passWeakDialog = true;
  256. }
  257. },
  258. methods: {
  259. ...mapActions([USER_SIGNOUT, USER_SIGNIN]),
  260. openMessageHome() {
  261. this.$router.push({ path: "/home/site-message" });
  262. },
  263. changeUnreadMessageCount(count) {
  264. this.unreadMessageCount = count;
  265. },
  266. openUserDialog() {
  267. this.passForm = { pass: "", checkPass: "" };
  268. this.userDialog = true;
  269. },
  270. //保存密码
  271. submitForm() {
  272. this.$refs.passForm.validate((valid) => {
  273. if (valid) {
  274. var password = encodeURIComponent(this.passForm.pass);
  275. var url = QUESTION_API + "/user/password?password=" + password;
  276. this.$httpWithMsg.put(url).then(() => {
  277. this.$notify({
  278. type: "success",
  279. message: "修改密码成功!",
  280. });
  281. this.resetForm();
  282. this.userDialog = false;
  283. });
  284. } else {
  285. console.log("error submit!");
  286. return false;
  287. }
  288. });
  289. },
  290. submitPassWeakForm() {
  291. this.$refs.passWeakForm.validate((valid) => {
  292. if (valid) {
  293. var password = encodeURIComponent(this.passWeakForm.pass);
  294. var url = QUESTION_API + "/user/password?password=" + password;
  295. this.$httpWithMsg.put(url).then(() => {
  296. this.$notify({
  297. type: "success",
  298. message: "修改密码成功!",
  299. });
  300. this.user.passwordWeak = false;
  301. this.USER_SIGNIN(this.user);
  302. this.$refs.passWeakForm.resetFields();
  303. this.passWeakDialog = false;
  304. });
  305. } else {
  306. console.log("error submit!");
  307. return false;
  308. }
  309. });
  310. },
  311. //重置
  312. resetForm() {
  313. this.$refs.passForm.resetFields();
  314. },
  315. logout() {
  316. const orgId = this.user.rootOrgId;
  317. const getRootOrgId = () => {
  318. if (location.hostname.includes("qmth.com.cn")) {
  319. return "";
  320. } else {
  321. return "?orgId=" + orgId;
  322. }
  323. };
  324. this.$http
  325. .post(QUESTION_API + "/auth/logout")
  326. .then(() => {
  327. this.USER_SIGNOUT();
  328. window.name = "";
  329. this.$router.replace({
  330. path: "/login" + getRootOrgId(),
  331. });
  332. })
  333. .catch((response) => {
  334. if (response.status == 500) {
  335. this.$notify({
  336. showClose: true,
  337. message: response.data.desc,
  338. type: "error",
  339. });
  340. }
  341. this.USER_SIGNOUT();
  342. window.name = "";
  343. this.$router.replace({
  344. path: "/login" + getRootOrgId(),
  345. });
  346. });
  347. },
  348. },
  349. };
  350. </script>