index.vue 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. <script setup lang="ts">
  2. import Motion from "./utils/motion";
  3. import { useRouter } from "vue-router";
  4. import type { FormInstance } from "element-plus";
  5. import { ElMessage } from "element-plus";
  6. import { storageSession } from "@pureadmin/utils";
  7. import { ref, reactive, watch, computed } from "vue";
  8. import { useUserStoreHook } from "/@/store/modules/user";
  9. import { resType } from "/@/store/modules/types";
  10. import { bg, currentWeek } from "./utils/static";
  11. import { ReImageVerify } from "/@/components/ReImageVerify";
  12. import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
  13. import { initRouter } from "/@/router/utils";
  14. import { loadEnv } from "@build/index";
  15. import logo from "/@/assets/logo.png";
  16. import { REGEXP_PWD } from "./utils/rule"
  17. import { isMobile } from "/@/utils/validate";
  18. defineOptions({ name: "Login" });
  19. const imgCode = ref("");
  20. const router = useRouter();
  21. const loading = ref(false);
  22. const checked = ref(false);
  23. const ruleFormRef = ref<FormInstance>();
  24. const codePassword = ref("")
  25. const currentPage = computed(() => {
  26. return useUserStoreHook().currentPage;
  27. });
  28. const { loginByUsername } = useUserStoreHook();
  29. // 15501067031
  30. // wugg1234
  31. const { VITE_IS_PROD, WECHAT_URL, BACK_URL } = loadEnv();
  32. const ruleForm = reactive({
  33. username: "",
  34. password: "",
  35. verifyCode: ""
  36. });
  37. const onLogin = async (formEl: FormInstance | undefined) => {
  38. loading.value = true;
  39. if (!formEl) return;
  40. await formEl.validate(async (valid, fields) => {
  41. if (valid) {
  42. loginByUsername(ruleForm).then(async (res: resType) => {
  43. const { code, message, data } = res;
  44. if (code === 0) {
  45. const { userinfo, token, role_level } = data ?? {};
  46. const { nickname } = userinfo ?? {};
  47. storageSession.setItem("info", { username: nickname ?? "", accessToken: token ?? "" });
  48. if(role_level == 3){
  49. loading.value = false
  50. ElMessage.warning('供应商端账号不能登录该系统')
  51. return
  52. }
  53. initRouter()
  54. .then((list: any) => {
  55. ElMessage.success("登录成功");
  56. router.push("/");
  57. })
  58. .catch(err => {
  59. if (err === 10000) {
  60. router.push("/welcome?error=roleExcption");
  61. }
  62. });
  63. } else if (code > 100 && code < 200) {
  64. loading.value = false;
  65. } else {
  66. loading.value = false;
  67. ElMessage.error(message ?? "");
  68. }
  69. });
  70. } else {
  71. loading.value = false;
  72. return fields;
  73. }
  74. });
  75. };
  76. const loginRules = reactive(<FormRules>{
  77. username: [
  78. {
  79. validator(_, value, callback) {
  80. if (!value) {
  81. callback(new Error("请输入手机号"));
  82. } else if (!isMobile(value)) {
  83. callback(new Error("手机号格式不正确"));
  84. } else {
  85. callback();
  86. }
  87. },
  88. trigger: "blur"
  89. }
  90. ],
  91. password: [
  92. {
  93. validator: (rule, value, callback) => {
  94. if (value === "") {
  95. callback(new Error("请输入密码"));
  96. } else if (!REGEXP_PWD.test(value)) {
  97. callback(new Error("密码格式应为6-18位数字、字母的组合"));
  98. } else {
  99. callback();
  100. }
  101. },
  102. trigger: "blur"
  103. }
  104. ],
  105. verifyCode: [
  106. {
  107. validator: (rule, value, callback) => {
  108. if (value === "") {
  109. callback(new Error("请输入验证码"));
  110. } else if (String(codePassword.value) !== String(value)) {
  111. callback(new Error("请输入正确的验证码"));
  112. } else {
  113. callback();
  114. }
  115. },
  116. trigger: "blur"
  117. }
  118. ]
  119. });
  120. function toWindowPath() {
  121. window.open("https://beian.miit.gov.cn/");
  122. }
  123. const ua = window.navigator.userAgent.toLowerCase();
  124. const isWechatEnv = ua.match(/micromessenger/i) == 'micromessenger' && window.location.search !== "?from=authorization";
  125. if (isWechatEnv) {
  126. window.location.href = `http://rep.test241.wanyuhengtong.com?back=http://webcx.test241.wanyuhengtong.com&name=采销结算平台`
  127. }
  128. watch(imgCode, value => {
  129. useUserStoreHook().SET_VERIFYCODE(value);
  130. });
  131. watch(ruleForm, () => {
  132. if (ruleForm.username.length > 11) {
  133. ruleForm.username = ruleForm.username.slice(0, 11);
  134. }
  135. });
  136. </script>
  137. <template>
  138. <img :src="bg" class="wave" />
  139. <div class="login-container">
  140. <div class="img">
  141. <component :is="currentWeek" />
  142. </div>
  143. <div class="login-box">
  144. <div class="login-form">
  145. <!-- <avatar class="avatar" /> -->
  146. <div class="flex w-full items-center justify-center">
  147. <img :src="logo" style="height: 100px" />
  148. </div>
  149. <Motion>
  150. <!-- <h2>{{ title }}</h2> -->
  151. <h2>票务系统</h2>
  152. </Motion>
  153. <el-form v-if="currentPage === 0" ref="ruleFormRef" :model="ruleForm" :rules="loginRules" size="large"
  154. @keyup.enter="onLogin(ruleFormRef)">
  155. <Motion :delay="100">
  156. <el-form-item prop="username">
  157. <el-input clearable v-model="ruleForm.username" placeholder="账号" :prefix-icon="useRenderIcon('user')" />
  158. </el-form-item>
  159. </Motion>
  160. <Motion :delay="150">
  161. <el-form-item prop="password">
  162. <el-input clearable show-password v-model="ruleForm.password" placeholder="密码"
  163. :prefix-icon="useRenderIcon('lock')" />
  164. </el-form-item>
  165. </Motion>
  166. <Motion :delay="200">
  167. <el-form-item prop="verifyCode">
  168. <el-input clearable v-model="ruleForm.verifyCode" placeholder="验证码" :prefix-icon="useRenderIcon('ri:shield-keyhole-line', { online: true })
  169. ">
  170. <template v-slot:append>
  171. <ReImageVerify v-model:code="imgCode" v-model:password="codePassword" />
  172. </template>
  173. </el-input>
  174. </el-form-item>
  175. </Motion>
  176. <Motion :delay="250">
  177. <el-form-item>
  178. <div class="w-full h-20px flex justify-between items-center">
  179. <el-checkbox v-model="checked">记住密码</el-checkbox>
  180. </div>
  181. <el-button class="w-full mt-4" size="default" type="primary" :loading="loading"
  182. @click="onLogin(ruleFormRef)">
  183. 登录
  184. </el-button>
  185. </el-form-item>
  186. <el-form-item v-if="VITE_IS_PROD">
  187. <div class="w-full flex justify-center">
  188. <ElButton link @click="toWindowPath">京ICP备2022033072号-1</ElButton>
  189. </div>
  190. </el-form-item>
  191. </Motion>
  192. <!-- <Motion :delay="300">
  193. <el-form-item>
  194. <div class="w-full h-20px flex justify-between items-center">
  195. <el-button
  196. v-for="(item, index) in operates"
  197. :key="index"
  198. class="w-full mt-4"
  199. size="default"
  200. @click="onHandle(index + 1)"
  201. >
  202. {{ item.title }}
  203. </el-button>
  204. </div>
  205. </el-form-item>
  206. </Motion> -->
  207. </el-form>
  208. </div>
  209. </div>
  210. </div>
  211. </template>
  212. <style scoped>
  213. @import url("/@/style/login.css");
  214. </style>
  215. <style lang="scss" scoped>
  216. :deep(.el-input-group__append, .el-input-group__prepend) {
  217. padding: 0;
  218. }
  219. .link-btn {
  220. position: fixed;
  221. bottom: 100px;
  222. left: 50%;
  223. border: none;
  224. }
  225. </style>