Login.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. <template>
  2. <div class="page">
  3. <div class="page-login">
  4. <div class="text item">
  5. <el-row class="login-card">
  6. <el-col :span="12" style="margin-left:50%;width:40%">
  7. <h2 class="title">
  8. 用户登录
  9. </h2>
  10. <el-form :model="formData" :rules="formRules" ref="loginForm" label-width="0px" style="padding:0 30px 0 30px;margin:10px;">
  11. <el-form-item prop="username" required>
  12. <el-input v-model="formData.username" name="userName" placeholder="请输入用户名">
  13. <i slot="prefix" class="el-icon-user"></i>
  14. </el-input>
  15. </el-form-item>
  16. <el-form-item prop="email" v-if="type === 'register'" required>
  17. <el-input v-model="formData.email" autocomplete="off" placeholder="请输入邮箱">
  18. <span slot="prefix" class="el-icon-message"></span>
  19. </el-input>
  20. </el-form-item>
  21. <el-form-item prop="password" required>
  22. <el-input placeholder="请输入密码" show-password v-model="formData.password" name="password">
  23. <span slot="prefix" class="el-icon-lock"></span>
  24. </el-input>
  25. </el-form-item>
  26. <el-form-item @keyup.enter.native="doSubmit">
  27. <el-button type="primary" @click="doSubmit" round size="medium" style="width:100%;background:#2f54eb;padding:15px;">{{type === 'login' ? '登录' : '注册'}}</el-button>
  28. <p class="changeBtn" @click="switchType" style="float: right;color: #adadad;">
  29. <span>{{type === 'login' ? '立即注册' : '马上登录'}}</span>
  30. </p>
  31. </el-form-item>
  32. </el-form>
  33. </el-col>
  34. </el-row>
  35. </div>
  36. <el-dialog
  37. title="登录验证"
  38. :visible.sync="dialogVisible"
  39. :show-close="false "
  40. width="20%"
  41. :close-on-click-modal="false"
  42. :close-on-press-escape="false"
  43. >
  44. <drag-verify-img-chip
  45. ref="dragVerify"
  46. :isPassing.sync = "isPassing"
  47. :imgsrc="verifyImg"
  48. :showRefresh="true"
  49. text="请按住滑块拖动"
  50. successText="验证通过"
  51. :width="260"
  52. handlerIcon="el-icon-d-arrow-right"
  53. successIcon="el-icon-circle-check"
  54. @refresh="reimg"
  55. @passcallback="doSubmit"
  56. @passfail="passfail"
  57. >
  58. </drag-verify-img-chip>
  59. </el-dialog>
  60. </div>
  61. </div>
  62. </template>
  63. <script>
  64. import userModel from '@/libs/userModel'
  65. import dragVerifyImgChip from "vue-drag-verify-img-chip";
  66. import {
  67. Form,
  68. FormItem,
  69. Input
  70. } from 'element-ui'
  71. export default {
  72. components: {
  73. [Form.name]: Form,
  74. [FormItem.name]: FormItem,
  75. [Input.name]: Input,
  76. dragVerifyImgChip,
  77. },
  78. data() {
  79. return {
  80. dialogVisible:false,
  81. isPassing:false,
  82. imgUrl:require("@/common/images/login_bg.png"),
  83. loading: false,
  84. loadingVerify: false,
  85. inputType: 'password',
  86. type: 'login',
  87. verifyImg:"https://img0.baidu.com/it/u=3026939796,485761977&fm=26&fmt=auto&gp=0.jpg",
  88. formData: {
  89. email: '',
  90. username: '',
  91. password: ''
  92. },
  93. formRules: {
  94. username: [
  95. {required: true, message: '用户名不能为空', trigger: 'blur'}
  96. ],
  97. password: [
  98. {required: true, message: '密码不能为空', trigger: 'blur'}
  99. ],
  100. email:[
  101. {required: true, message: '邮箱不能为空', trigger: 'change'},
  102. // {validator: validateEmail, trigger: 'change'}
  103. ]
  104. }
  105. }
  106. },
  107. watch: {
  108. dialogVisible(){
  109. // 当弹窗状态改变时,刷新图片地址
  110. this.reimg()
  111. }
  112. },
  113. created() {
  114. // 进入登录页面先清空个人信息
  115. this.fromUrl = this.$route.query.from ? window.decodeURIComponent(this.$route.query.from) : ''
  116. this.keyupSubmit()
  117. },
  118. methods: {
  119. // 绑定回车事件
  120. keyupSubmit(){
  121. document.onkeydown=()=>{
  122. let _key=window.event.keyCode;
  123. if(_key===13){
  124. let formData = {...this.formData}
  125. console.log(formData)
  126. if(formData.password && formData.username){
  127. this.doSubmit()
  128. }
  129. }
  130. }
  131. },
  132. /**
  133. 登陆
  134. */
  135. doSubmit() {
  136. // this.isPassing = !this.isPassing
  137. // this.$refs.dragVerify.reset()
  138. // this.dialogVisible = false
  139. // 验证成功
  140. this.$refs.loginForm.validate((valid) => {
  141. let fnName = this.type === 'login' ? 'doLogin' : 'doRegister'
  142. if (valid) {
  143. this[fnName]();
  144. } else {
  145. this.$store.dispatch('showMassage', {type: 'error', message: '请正确填写表单!'})
  146. return false;
  147. }
  148. });
  149. },
  150. doLogin() {
  151. let formData = {...this.formData}
  152. // 登录操作
  153. userModel.doLogin(formData).then(() => {
  154. if(this.fromUrl){
  155. console.log(this.fromUrl)
  156. this.$router.push(this.fromUrl)
  157. }else{
  158. userModel.goBeforeLoginUrl()
  159. }
  160. })
  161. },
  162. doRegister() {
  163. let formData = {...this.formData}
  164. // 注册操作
  165. userModel.doRegister(formData).then(() => {
  166. if(this.fromUrl){
  167. this.$router.push(this.fromUrl)
  168. }else{
  169. userModel.goBeforeLoginUrl()
  170. }
  171. })
  172. },
  173. validateEmail(val){
  174. return /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(val)
  175. },
  176. switchType(){
  177. if(this.type === 'login'){
  178. this.type = 'register'
  179. }else{
  180. this.type = 'login'
  181. }
  182. },
  183. reimg(){ //刷新验证图片
  184. // 当启用刷新图片时调用改函数
  185. let list = [
  186. "https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1017748215,3835401839&fm=26&gp=0.jpg",
  187. "https://img2.baidu.com/it/u=3251757891,2905627848&fm=26&fmt=auto&gp=0.jpg",
  188. "https://img2.baidu.com/it/u=1376319214,2872501189&fm=26&fmt=auto&gp=0.jpg",
  189. "https://img1.baidu.com/it/u=1648934633,1654247132&fm=26&fmt=auto&gp=0.jpg"
  190. ]
  191. this.verifyImg = list[Math.floor(Math.random()*(list.length-1+1)+0)]
  192. },
  193. passfail(){
  194. this.reimg()
  195. },
  196. }
  197. }
  198. </script>
  199. <style lang="scss" scoped>
  200. .page{
  201. position: relative;
  202. margin-top: 7%;
  203. width: 100%;
  204. height: 100%;
  205. background:url('../common/images/login_bg2.png') no-repeat 0 0;
  206. background-size: 494px 602px;
  207. }
  208. .login-card{
  209. height: 100%;
  210. padding-right: 130px;
  211. padding-top: 80px;
  212. width:100%;
  213. }
  214. .title{
  215. font-size: 2.3rem;
  216. font-weight: bold;
  217. margin: 20px 0 50px 40px;
  218. }
  219. .changeBtn{
  220. cursor: pointer;
  221. }
  222. ::v-deep .el-input__inner{
  223. border-radius: 30px;
  224. line-height: 80px;
  225. background-color: #f5f5f5;
  226. border: none;
  227. text-indent: 20px;
  228. height: 50px;
  229. /* margin-bot tom: 20px; */
  230. }
  231. ::v-deep .el-input__prefix{
  232. font-size: 1.4rem;
  233. padding:8px;
  234. }
  235. ::v-deep .el-form-item__error{
  236. padding-left: 50px;
  237. }
  238. ::v-deep .el-form-item{
  239. margin-bottom: 40px;
  240. }
  241. ::v-deep .el-dialog__header{
  242. text-align: center;
  243. }
  244. ::v-deep .el-dialog__body{
  245. padding: 3px 25px 25px 25px;
  246. .drag_verify{
  247. margin-top:20px
  248. }
  249. }
  250. </style>