login.vue 5.9 KB

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