login.vue 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. <template>
  2. <div class="full-screen flex flex-center">
  3. <el-card class="login">
  4. <div class="flex flex-center" style="width: 100%">
  5. <div class="flex-child-average flex flex-center left">
  6. <div class="flex flex-justify-start flex-align-start full-height">
  7. <img
  8. src="@/assets/img/logo.png"
  9. class="padding-14 logo"
  10. alt="logo"
  11. />
  12. <img
  13. src="@/assets/img/logo.png"
  14. class="logo-main"
  15. alt="logo-main"
  16. />
  17. </div>
  18. </div>
  19. <div class="flex-child-average right">
  20. <div class="padding-20">
  21. <span class="font-24 black bold"
  22. >欢迎来到梧桐树云项目管理云平台👏</span
  23. >
  24. <el-form class="form" :model="form" :rules="rules" ref="loginForm">
  25. <el-form-item prop="name">
  26. <el-input
  27. v-model="form.name"
  28. size="large"
  29. placeholder="用户名"
  30. prefix-icon="Avatar"
  31. />
  32. </el-form-item>
  33. <el-form-item prop="pass">
  34. <el-input
  35. v-model="form.pass"
  36. size="large"
  37. placeholder="密码"
  38. :type="flag ? 'text' : 'password'"
  39. prefix-icon="WalletFilled"
  40. >
  41. <template v-slot:suffix>
  42. <div @click="flag = !flag" class="pointer">
  43. <el-icon v-if="!flag"><Hide /></el-icon>
  44. <el-icon v-else><View /></el-icon>
  45. </div>
  46. </template>
  47. </el-input>
  48. </el-form-item>
  49. <el-form-item prop="code">
  50. <el-input
  51. v-model="form.code"
  52. size="large"
  53. placeholder="验证码"
  54. prefix-icon="Refresh"
  55. class="append"
  56. >
  57. <template v-slot:append>
  58. <img
  59. :src="code"
  60. class="pic"
  61. alt="refresh"
  62. style="
  63. height: 40px;
  64. background-color: red;
  65. background-blend-mode: lighten;
  66. "
  67. />
  68. </template>
  69. </el-input>
  70. </el-form-item>
  71. <el-form-item>
  72. <div
  73. class="flex flex-align-center flex-justify-between full-width"
  74. >
  75. <div></div>
  76. <el-link type="primary" :underline="false" class="font-12"
  77. >忘记密码?</el-link
  78. >
  79. </div>
  80. </el-form-item>
  81. </el-form>
  82. <el-button
  83. type="primary"
  84. class="full-width"
  85. size="large"
  86. @click="submint"
  87. >登录</el-button
  88. >
  89. <div class="mt-10 flex flex-center">
  90. <span>还没账户?</span>
  91. <el-link type="primary" :underline="false">注册账户</el-link>
  92. </div>
  93. <el-divider />
  94. <div class="flex flex-col">
  95. <span class="grey-6"> 由梧桐经济学院提供技术支持 </span>
  96. <div>
  97. <el-button
  98. size="small"
  99. type="primary"
  100. plain
  101. class="mt-10"
  102. @click="loginAdmin"
  103. >admin</el-button
  104. >
  105. </div>
  106. </div>
  107. </div>
  108. </div>
  109. </div>
  110. </el-card>
  111. </div>
  112. </template>
  113. <route>
  114. {
  115. meta: {
  116. layout: 'empty',
  117. },
  118. }
  119. </route>
  120. <script lang="js">
  121. import md5 from 'js-md5';
  122. import { useStore } from '@/store/user.js';
  123. import { setToken } from '../utils/auth.js';
  124. export default {
  125. name: 'login',
  126. setup() {
  127. const user = useStore();
  128. return { user };
  129. },
  130. data() {
  131. return {
  132. flag: false,
  133. form: {
  134. name: '',
  135. pass: '',
  136. },
  137. rules: {
  138. name: [
  139. { required: true, message: '请输入用户名', trigger: 'blur' },
  140. {
  141. min: 3,
  142. max: 12,
  143. message: '长度在 3 到 12 个字符',
  144. trigger: 'blur',
  145. },
  146. ],
  147. pass: [
  148. { required: true, message: '请输入密码', trigger: 'blur' },
  149. {
  150. min: 3,
  151. max: 12,
  152. message: '长度在 3 到 12 个字符',
  153. trigger: 'blur',
  154. },
  155. ],
  156. code: [
  157. { required: true, message: '请输入验证码', trigger: 'blur' },
  158. { min: 5, max: 5, message: '验证码不正确', trigger: 'blur' },
  159. ],
  160. },
  161. code: '',
  162. header: '',
  163. };
  164. },
  165. created() {
  166. this.init();
  167. },
  168. methods: {
  169. init() {
  170. this.$api.login.captcha().then((res) => {
  171. this.code = res.image;
  172. this.header = res.key;
  173. });
  174. },
  175. submint() {
  176. this.$refs.loginForm.validate((res) => {
  177. if (res) {
  178. const params = {
  179. tenantId: '000000',
  180. username: this.form.name,
  181. password: md5(this.form.pass),
  182. grant_type: 'captcha',
  183. scope: 'all',
  184. type: 'account',
  185. };
  186. const header = {
  187. captchaKey: this.header,
  188. captchaCode: this.form.code,
  189. };
  190. this.$api.login.login(params, header).then((res) => {
  191. if (res.error_description) {
  192. this.$message.error(res.error_description);
  193. this.init();
  194. } else {
  195. // 保存信息
  196. this.user.setUserInfo(res);
  197. setToken(res.access_token);
  198. this.$router.replace('/');
  199. }
  200. });
  201. } else {
  202. return false;
  203. }
  204. });
  205. },
  206. loginAdmin() {
  207. this.form.name = 'admin';
  208. this.form.pass = 'admin';
  209. },
  210. },
  211. };
  212. </script>
  213. <style lang="scss" scoped>
  214. .login {
  215. :deep(.el-card__body) {
  216. padding: 0 !important;
  217. }
  218. padding: 0;
  219. display: flex;
  220. top: 50%;
  221. left: 50%;
  222. border-radius: 10px;
  223. background-color: white;
  224. width: 950px;
  225. height: 500px;
  226. .left {
  227. background-color: #f5f7fa;
  228. height: 500px;
  229. .logo {
  230. width: 45px;
  231. height: 45px;
  232. border-radius: 50%;
  233. }
  234. .logo-main {
  235. width: 100%;
  236. margin-top: 70px;
  237. margin-left: -80px;
  238. }
  239. }
  240. .right {
  241. background-color: white;
  242. height: 500px;
  243. .form {
  244. margin-top: 30px;
  245. }
  246. }
  247. }
  248. .append {
  249. :deep(.el-input-group__append) {
  250. background-color: white;
  251. }
  252. .pic {
  253. border-top: #dddfe5 1px solid;
  254. border-bottom: #dddfe5 1px solid;
  255. }
  256. }
  257. </style>