index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759
  1. <template>
  2. <div class="box">
  3. <div class="top">
  4. <div class="box_img"></div>
  5. <div class="box_school">万载三中</div>
  6. </div>
  7. <div class="content">
  8. <div class="box_wel">
  9. <span>欢迎使用智慧校园管理平台</span>
  10. </div>
  11. <div class="box_login" v-if="bindShow">
  12. <div id="weixin"></div>
  13. </div>
  14. <div class="box_login" v-else>
  15. <div class="login_title">绑定手机号</div>
  16. <div class="bind_code">
  17. <el-form
  18. ref="ruleFormRef"
  19. :model="ruleForm"
  20. status-icon
  21. :rules="rules"
  22. class="login-container"
  23. >
  24. <!-- <div class="title">绑定后可以使用账号登录,账号更加安全</div> -->
  25. <div class="title">用户绑定手机号获取登录权限</div>
  26. <el-form-item label="手机号" prop="user">
  27. <el-input v-model="ruleForm.user" placeholder="请输入手机号">
  28. </el-input>
  29. </el-form-item>
  30. <el-form-item label="验证码" prop="pass">
  31. <el-input v-model="ruleForm.pass" placeholder="请输入验证码">
  32. <template #append
  33. ><span @click="sendPhone">{{ sendTitle }}</span></template
  34. >
  35. </el-input>
  36. </el-form-item>
  37. <!-- <el-checkbox v-model="checked" class="remeberPwd el-form-item"
  38. >记住密码</el-checkbox
  39. > -->
  40. <el-form-item>
  41. <!-- <el-button
  42. :loading="loading"
  43. type="primary"
  44. @click="submitForm(ruleFormRef)"
  45. color="rgba(0, 97, 255, 1)"
  46. >确认绑定</el-button
  47. > -->
  48. <div class="btn" @click="bindClick(ruleFormRef)">
  49. <a :href="bindWX">绑定</a>
  50. </div>
  51. </el-form-item>
  52. </el-form>
  53. </div>
  54. </div>
  55. </div>
  56. <div class="footer">
  57. <img src="@/assets/jinghui.png" alt="">
  58. &nbsp;
  59. <a
  60. target="_blank"
  61. href="https://beian.mps.gov.cn/#/query/webSearch?recordcode=36010602000314"
  62. >赣公网安备36010602000314号</a
  63. >&nbsp;&nbsp;&nbsp;
  64. <a
  65. target="_blank"
  66. href="https://beian.miit.gov.cn/"
  67. >赣ICP备17015482号-4</a
  68. >
  69. </div>
  70. </div>
  71. </template>
  72. <script setup>
  73. import {
  74. ref,
  75. reactive,
  76. watch,
  77. nextTick,
  78. onBeforeMount,
  79. onMounted,
  80. onUnmounted,
  81. } from "vue";
  82. import { useRouter } from "vue-router";
  83. import { ElMessage, ElMessageBox } from "element-plus";
  84. import { dayjs } from "element-plus";
  85. import lodash from "lodash";
  86. import axios from "axios";
  87. import wxlogin from "vue-wxlogin";
  88. import { useStore } from "vuex";
  89. import eds from "@/utils/eds.js";
  90. const store = useStore();
  91. const router = useRouter();
  92. const api = ref();
  93. const bindWX = ref(); // 绑定手机号的跳转链接
  94. const bindShow = ref(true); // 判断用户是否绑定
  95. const ruleFormRef = ref();
  96. const ruleForm = reactive({
  97. user: "",
  98. pass: "",
  99. });
  100. const sendTime = ref(60); // 验证码时间
  101. const sendTitle = ref("发送短信");
  102. var checkPhone = (rule, value, callback) => {
  103. if (!value) {
  104. return callback(new Error("手机号不能为空"));
  105. } else {
  106. const reg = /^1[3-9][0-9]\d{8}$/;
  107. // 这里定义的reg变量没有加引号,所以是一种特殊的数据类型,即正则,可以直接用test()方法
  108. if (reg.test(value)) {
  109. callback();
  110. } else {
  111. // 具体错误信息没有提示
  112. return callback(new Error("请输入正确的手机号"));
  113. }
  114. }
  115. };
  116. const rules = reactive({
  117. user: [
  118. { required: true, min: 11, message: "手机号不足11位", trigger: "blur" },
  119. { validator: checkPhone, trigger: "blur" },
  120. ],
  121. pass: [{ required: true, message: "请填写验证码", trigger: "blur" }],
  122. });
  123. const submitForm = (formEl) => {
  124. if (!formEl) return;
  125. formEl.validate(async (valid) => {
  126. if (valid) {
  127. // loading.value = true;
  128. // let data = {
  129. // account: ruleForm.user,
  130. // password: ruleForm.pass,
  131. // };
  132. // let res = await axios({
  133. // method: "post",
  134. // url: api.value + "/login/Login",
  135. // headers: {
  136. // token: sessionStorage.getItem("token"),
  137. // user_head: sessionStorage.getItem("userhead"),
  138. // },
  139. // data: data,
  140. // });
  141. // console.log(res);
  142. // if (res.data.code == 200) {
  143. // if (checked.value) {
  144. // localStorage.setItem("user", ruleForm.user);
  145. // localStorage.setItem("pass", ruleForm.pass);
  146. // } else {
  147. // localStorage.removeItem("user", ruleForm.user);
  148. // localStorage.removeItem("pass", ruleForm.user);
  149. // }
  150. // sessionStorage.setItem("token", res.data.data.token);
  151. // sessionStorage.setItem("userhead", res.data.data.userhead);
  152. // sessionStorage.setItem("schoolId", res.data.data.schoolId);
  153. // sessionStorage.setItem("username", res.data.data.userName);
  154. // sessionStorage.setItem("sidevarItem", 1);
  155. // store.commit("indexUp", 1);
  156. // store.commit("userName", ruleForm.user);
  157. // store.commit("passWord", ruleForm.user);
  158. // router.push({
  159. // path: `/repairs/home`,
  160. // });
  161. // ElMessage({
  162. // type: "success",
  163. // showClose: true,
  164. // message: "登录成功",
  165. // center: true,
  166. // });
  167. // } else {
  168. // ElMessage({
  169. // type: "error",
  170. // showClose: true,
  171. // message: "登录失败",
  172. // center: true,
  173. // });
  174. // loading.value = false;
  175. // }
  176. } else {
  177. return false;
  178. }
  179. });
  180. };
  181. const loginClick = () => {
  182. // router.push({ path: `/wanzai/home` });
  183. // sessionStorage.setItem("sidevarItem", "/wanzai/home");
  184. };
  185. // 实例微信js对象
  186. const setWxerwma = async () => {
  187. let res = await axios({
  188. method: "get",
  189. url: api.value + "/wanzai/api/login/getAesStr",
  190. headers: {
  191. token: sessionStorage.getItem("token"),
  192. user_head: sessionStorage.getItem("userhead"),
  193. },
  194. params: data,
  195. });
  196. console.log(res, JSON.parse(eds.decryptDes(res.data.data)), "state");
  197. if (res.data.code == 200) {
  198. let state = JSON.parse(eds.decryptDes(res.data.data));
  199. //生成微信扫码登录二维码页面
  200. var obj = new WxLogin({
  201. self_redirect: true,
  202. id: "weixin",
  203. appid: "wxa94836d74473fe5c",
  204. scope: "snsapi_login",
  205. redirect_uri:
  206. "https%3A%2F%2Fwww.campussmartlife.com%2FsmartApi%2Fwanzai%2Fapi%2Fwechat%2Fcallback",
  207. // redirect_uri: 'https%3A%2F%2Fwww.campussmartlife.com%2FsmartManage%2F%23%2Fwanzai%2Fhome',
  208. state: state,
  209. style: "black",
  210. // href: `data:text/css;base64,${bast64css.value}`,
  211. href: "",
  212. });
  213. } else {
  214. ElMessage({
  215. type: "error",
  216. showClose: true,
  217. message: "获取二维码失败,请刷新重试",
  218. center: true,
  219. });
  220. }
  221. };
  222. // 绑定点击微信
  223. const bindClick = (formEl) => {
  224. // if (ruleForm.user) {
  225. // bindWX.value =
  226. // "https://www.campussmartlife.com/smartApi//wanzai/api/wechat/bind?cardNo=" +
  227. // ruleForm.user;
  228. // }
  229. if (!formEl) return;
  230. formEl.validate(async (valid) => {
  231. if (valid) {
  232. bindWX.value =
  233. "https://www.campussmartlife.com/smartApi/wanzai/api/wechat/bind?" +
  234. `phone=${ruleForm.user}&messageCode=${ruleForm.pass}`;
  235. // let data = {
  236. // phone: ruleForm.user,
  237. // messageCode: ruleForm.pass,
  238. // // managerId: sessionStorage.getItem("token"),
  239. // };
  240. // let res = await axios({
  241. // method: "post",
  242. // url: api.value + "/wanzai/api/wechat/bind",
  243. // headers: {
  244. // token: sessionStorage.getItem("token"),
  245. // user_head: sessionStorage.getItem("userhead"),
  246. // },
  247. // params: data,
  248. // });
  249. // if (res.data.code == 200) {
  250. // setWxerwma();
  251. // ElMessage({
  252. // type: "success",
  253. // showClose: true,
  254. // message: res.data.message,
  255. // center: true,
  256. // });
  257. // } else {
  258. // ElMessage({
  259. // type: "error",
  260. // showClose: true,
  261. // message: res.data.message,
  262. // center: true,
  263. // });
  264. // }
  265. } else {
  266. return false;
  267. }
  268. });
  269. };
  270. // 发送短信
  271. const sendPhone = async () => {
  272. if (ruleForm.user) {
  273. var formData = new FormData();
  274. // var psw = formData.get("psw"); // 获取密码
  275. formData.append("phone", ruleForm.user);
  276. let res = await axios({
  277. method: "post",
  278. url: api.value + "/wanzai/api/wechat/sendMessage",
  279. headers: {
  280. token: sessionStorage.getItem("token"),
  281. user_head: sessionStorage.getItem("userhead"),
  282. },
  283. data: formData,
  284. });
  285. console.log(res, "发送短信");
  286. if (res.data.code == 200) {
  287. sendTitle.value = 60;
  288. let timer = setInterval(() => {
  289. sendTitle.value--;
  290. if (sendTitle.value == 0) {
  291. sendTitle.value = "重新发送";
  292. clearInterval(timer);
  293. }
  294. }, 1000);
  295. ElMessage({
  296. type: "success",
  297. showClose: true,
  298. message: res.data.message,
  299. center: true,
  300. });
  301. } else {
  302. ElMessage({
  303. type: "error",
  304. showClose: true,
  305. message: res.data.message,
  306. center: true,
  307. });
  308. }
  309. } else {
  310. ElMessage({
  311. type: "error",
  312. showClose: true,
  313. message: "请输入手机号",
  314. center: true,
  315. });
  316. }
  317. };
  318. // const token = ref(sessionStorage.getItem("token") || '')
  319. const handleStorageChange = async (event) => {
  320. if (sessionStorage.getItem("token") && sessionStorage.getItem("userhead")) {
  321. console.log("登录也判断token是否存在");
  322. // store.commit("indexUp", sessionStorage.getItem("sidevarItem"));
  323. // sessionStorage.removeItem("message");
  324. // router.replace({
  325. // path: `${sessionStorage.getItem("sidevarItem")}`,
  326. // });
  327. const formDatas = new FormData();
  328. formDatas.append("userId", "");
  329. let resData = await axios({
  330. method: "post",
  331. url: api.value + "/wanzai/api/smartAuthorGroup/queryUserAuthor",
  332. headers: {
  333. token: sessionStorage.getItem("token"),
  334. user_head: sessionStorage.getItem("userhead"),
  335. },
  336. data: formDatas,
  337. });
  338. console.log(resData, "查看当前用户权限");
  339. if (resData.data.code == 200) {
  340. let roleList = resData.data.data[0].treAuthor;
  341. sessionStorage.setItem("roleList", JSON.stringify(roleList));
  342. // store.commit("ROLELIST", "");
  343. let flag = roleList.some((item) => {
  344. return item.route == "/wanzai/systemHome";
  345. });
  346. console.log("触发跳转页面");
  347. let address = roleList[0].route;
  348. console.log(flag, address);
  349. setTimeout(() => {
  350. store.commit("indexUp", address);
  351. router.push({
  352. path: `${address}`,
  353. });
  354. }, 100);
  355. // if (!flag) {
  356. // store.commit("indexUp", address);
  357. // router.push({
  358. // path: `${address}`,
  359. // });
  360. // } else {
  361. // store.commit("indexUp", "/wanzai/systemHome");
  362. // router.push({
  363. // path: `/wanzai/systemHome`,
  364. // });
  365. // }
  366. } else {
  367. }
  368. }
  369. if (sessionStorage.getItem("message") == "请绑定信息") {
  370. bindShow.value = false;
  371. ElMessage({
  372. type: "warning",
  373. showClose: true,
  374. message: "当前用户未绑定手机号,请先绑定",
  375. center: true,
  376. });
  377. } else if (sessionStorage.getItem("message") == "无登录权限") {
  378. bindShow.value = true;
  379. setWxerwma();
  380. ElMessage({
  381. type: "error",
  382. showClose: true,
  383. message: "暂无登录权限,请联系管理添加权限",
  384. center: true,
  385. });
  386. } else if (sessionStorage.getItem("message") == "请勿非法进入") {
  387. bindShow.value = true;
  388. setWxerwma();
  389. ElMessage({
  390. type: "error",
  391. showClose: true,
  392. message: "请勿非法进入",
  393. center: true,
  394. });
  395. }
  396. };
  397. onMounted(() => {
  398. setWxerwma();
  399. // console.log(router.currentRoute.value.query);
  400. // console.log(window.location.href);
  401. sessionStorage.removeItem("message");
  402. window.addEventListener("storage", handleStorageChange);
  403. if (router.currentRoute.value.query.message == "请绑定信息") {
  404. sessionStorage.setItem("message", router.currentRoute.value.query.message);
  405. // ElMessage({
  406. // type: "warning",
  407. // showClose: true,
  408. // message: "当前用户未绑定手机号,请先绑定",
  409. // center: true,
  410. // });
  411. bindShow.value = false;
  412. } else if (router.currentRoute.value.query.message == "无登录权限") {
  413. sessionStorage.setItem("message", router.currentRoute.value.query.message);
  414. bindShow.value = true;
  415. // ElMessage({
  416. // type: "error",
  417. // showClose: true,
  418. // message: "暂无登录权限,请联系管理添加权限",
  419. // center: true,
  420. // });
  421. }
  422. });
  423. onBeforeMount(() => {
  424. api.value = store.state.user.api;
  425. });
  426. onUnmounted(() => {
  427. window.removeEventListener("storage", handleStorageChange);
  428. });
  429. </script>
  430. <style lang="scss" scoped>
  431. .box {
  432. // position: relative;
  433. min-width: 1300px;
  434. min-height: 750px;
  435. width: 100vw;
  436. height: 100vh;
  437. color: #000;
  438. background-image: url(@/assets/school/login_bg.png);
  439. background-size: 100% 100%;
  440. .top {
  441. display: flex;
  442. align-items: center;
  443. padding: 54px 0 0 62px;
  444. .box_img {
  445. // position: absolute;
  446. // top: 54px;
  447. // left: 62px;
  448. width: 56px;
  449. height: 56px;
  450. border-radius: 50%;
  451. background-color: skyblue;
  452. margin-right: 20px;
  453. }
  454. .box_school {
  455. // position: absolute;
  456. // top: 61px;
  457. // left: 141px;
  458. font-size: 29px;
  459. font-weight: bold;
  460. }
  461. }
  462. .content {
  463. width: 100%;
  464. height: calc(100% - 140px);
  465. // margin-top: 40px;
  466. display: flex;
  467. // justify-content: space-between;
  468. .box_wel {
  469. font-size: 52.5px;
  470. font-weight: bold;
  471. margin-top: 20px;
  472. width: 66%;
  473. height: 40%;
  474. span {
  475. display: block;
  476. text-align: center;
  477. }
  478. }
  479. .box_login {
  480. // position: absolute;
  481. // top: 223px;
  482. // left: 1286px;
  483. width: 24%;
  484. height: 70%;
  485. box-shadow: 0px 3px 10px rgba(0, 97, 255, 0.2);
  486. background-color: #fff;
  487. // border: 1px solid red;
  488. // margin-top: 100px;
  489. padding: 80px 0 0 0;
  490. box-sizing: border-box;
  491. display: flex;
  492. flex-direction: column;
  493. // justify-content: space-between;
  494. align-items: center;
  495. // width: 426px;
  496. // height: 536px;
  497. .login_title {
  498. font-size: 24px;
  499. font-weight: bold;
  500. }
  501. .login_tips {
  502. color: #a6a6a6;
  503. font-size: 16px;
  504. }
  505. .login_code {
  506. width: 200px;
  507. height: 250px;
  508. // background-color: skyblue;
  509. .el-form {
  510. width: 280px;
  511. display: flex;
  512. flex-direction: column;
  513. justify-content: center;
  514. align-items: center;
  515. padding: 35px 0;
  516. border-radius: 16px;
  517. // background: rgba(255, 255, 255, 1);
  518. .title {
  519. color: rgba(0, 185, 170, 1);
  520. font-size: 14px;
  521. margin: 0 0 10px 0;
  522. }
  523. .el-divider {
  524. width: 85%;
  525. margin: 20px 0 30px;
  526. }
  527. .el-form-item {
  528. width: 280px;
  529. height: 40px;
  530. // margin-bottom: 0;
  531. :deep(.el-form-item__content) {
  532. margin-left: 0 !important;
  533. .el-input {
  534. height: 40px;
  535. .el-input__wrapper {
  536. border-radius: 12px;
  537. .el-input__prefix {
  538. margin: 0 10px 0 12px;
  539. }
  540. }
  541. // .el-icon {
  542. // width: 24px;
  543. // height: 24px;
  544. // svg {
  545. // width: 24px;
  546. // height: 24px;
  547. // }
  548. // }
  549. .el-input__inner {
  550. height: 100%;
  551. font-size: 14px;
  552. }
  553. }
  554. // .el-form-item__error {
  555. // font-size: 16px;
  556. // }
  557. .el-button {
  558. width: 100%;
  559. height: 40px;
  560. font-size: 16px;
  561. border-radius: 12px;
  562. }
  563. }
  564. .el-button--primary {
  565. width: 280px;
  566. }
  567. }
  568. .remeberPwd {
  569. height: 30px;
  570. margin-bottom: 30px;
  571. // :deep(.el-checkbox__input) {
  572. // .el-checkbox__inner {
  573. // width: 15px;
  574. // height: 15px;
  575. // }
  576. // .el-checkbox__inner::after {
  577. // width: 6px;
  578. // height: 12px;
  579. // top: 0px;
  580. // }
  581. // }
  582. :deep(.el-checkbox__label) {
  583. font-size: 14px;
  584. }
  585. }
  586. }
  587. }
  588. .bind_code {
  589. .el-form {
  590. width: 300px;
  591. display: flex;
  592. flex-direction: column;
  593. justify-content: center;
  594. align-items: center;
  595. padding: 80px 0 0 0;
  596. border-radius: 16px;
  597. // background: rgba(255, 255, 255, 1);
  598. .title {
  599. color: rgba(0, 185, 170, 1);
  600. font-size: 14px;
  601. margin: 0 0 10px 0;
  602. }
  603. .el-divider {
  604. width: 85%;
  605. margin: 20px 0 30px;
  606. }
  607. .el-form-item {
  608. width: 300px;
  609. height: 40px;
  610. margin-bottom: 25px;
  611. display: flex;
  612. align-items: center;
  613. :deep(.el-form-item__content) {
  614. margin-left: 0 !important;
  615. border-bottom: 1px solid #ccc;
  616. .btn {
  617. display: flex;
  618. justify-content: center;
  619. align-items: center;
  620. width: 300px;
  621. height: 40px;
  622. color: #fff;
  623. font-size: 16px;
  624. border-radius: 8px;
  625. background-color: #0061ff;
  626. cursor: pointer;
  627. a {
  628. color: #fff;
  629. width: 300px;
  630. height: 40px;
  631. text-align: center;
  632. line-height: 40px;
  633. }
  634. }
  635. .el-input {
  636. height: 40px;
  637. .el-input__wrapper {
  638. // border-radius: 12px;
  639. box-shadow: none;
  640. .el-input__prefix {
  641. margin: 0 10px 0 12px;
  642. }
  643. }
  644. .el-input-group__append {
  645. cursor: pointer;
  646. box-shadow: none;
  647. background-color: transparent;
  648. padding: 0 10px;
  649. }
  650. // .el-icon {
  651. // width: 24px;
  652. // height: 24px;
  653. // svg {
  654. // width: 24px;
  655. // height: 24px;
  656. // }
  657. // }
  658. .el-input__inner {
  659. height: 100%;
  660. font-size: 14px;
  661. }
  662. }
  663. }
  664. &:nth-child(4) {
  665. :deep(.el-form-item__content) {
  666. border: none;
  667. }
  668. }
  669. }
  670. }
  671. }
  672. .login_btn {
  673. display: flex;
  674. align-items: center;
  675. justify-content: space-between;
  676. width: 210px;
  677. height: 40px;
  678. // display: none;
  679. .btn {
  680. display: flex;
  681. justify-content: center;
  682. align-items: center;
  683. width: 210px;
  684. height: 40px;
  685. color: #fff;
  686. font-size: 16px;
  687. border-radius: 8px;
  688. background-color: #0061ff;
  689. cursor: pointer;
  690. a {
  691. width: 210px;
  692. height: 40px;
  693. color: #fff;
  694. text-align: center;
  695. line-height: 40px;
  696. }
  697. }
  698. }
  699. }
  700. }
  701. .footer {
  702. width: 100%;
  703. height: 20px;
  704. display: flex;
  705. justify-content: center;
  706. font-size: 12px;
  707. a {
  708. color: #000;
  709. font-size: 14px;
  710. text-decoration: none;
  711. }
  712. }
  713. }
  714. </style>