uniapp 完成两种方式登录 验证码登录 密码登录

之前完成了对应的注册部分,所以今天是要实现登录部分,要实现两种登录方法,一种是直接短信验证登录,一种是短信验证码登录。由于我们之前注册的时候存入数据库时使用了md5加密,所以在验证密码时也许将输入的密码进行md5转换。

应用界面代码:

复制代码
<template>
  <view class="login-container">
      
      
    <!-- 根据登录方式显示不同的表单 -->
    <view v-if="loginMethod === 'sms'" class="getcodecontainer">
      <view class="logo">
        <!-- 这里放置你的应用 logo -->
        <image src="/static/logo.png" class="logo-img" mode="aspectFit" />
      </view>
      <view class="form-group">
        <text class="label">手机号:</text>
        <input type="tel" v-model="phoneNumber" placeholder="请输入手机号" />
      </view>
      <view class="form-group">
        <text class="label">验证码:</text>
        <input type="text" v-model="verificationCode" placeholder="请输入验证码" />
        <button @click="getVerificationCode" 
                :disabled="countdown > 0 || phoneNumber.length !== 11 || !isPhoneNumberValid" 
                :class="{ 'code-btn-active': countdown <= 0 }">{{ countdown > 0 ? '重新获取('+ countdown + ' s)' : '获取验证码' }}</button>
      </view>
      <button class="login-btn" @click="verificat":disabled="phoneNumber.length !== 11 || verificationCode === ''|| !isPhoneNumberValid">登录</button>
    </view>
  
  
  
    <view v-else class="getcodecontainer">
      <view class="logo">
        <!-- 这里放置你的应用 logo -->
        <image src="/static/logo.png" class="logo-img" mode="aspectFit" />
      </view>
      <view class="form-group">
        <text class="label">手机号:</text>
        <input type="tel" v-model="phoneNumber" placeholder="请输入手机号" />
      </view>
      <view class="form-group">
        <text class="label">密码:</text>
        <input type="password" v-model="password" placeholder="请输入密码" />
      </view>
      <button class="login-btn" @click="login":disabled="phoneNumber.length !== 11 || password === ''|| !isPhoneNumberValid">登录</button>
    </view>
    <!-- 切换登录方式 -->
    <view class="switch-login-method" @click="toggleLoginMethod">
      {{ loginMethod === 'sms' ? '密码登录' : '短信验证码登录' }}
    </view>
    <!-- 注册链接 -->
    <view class="register-link" @click="goToRegisterPage">注册新账号</view>
</view>
</template>

<script>
export default {
  data() {
    return {
      phoneNumber: '',
      verificationCode: '',
      password: '',
      countdown: 0,
      loginMethod: 'sms' // 默认使用短信验证码登录
    };
  },
  computed: {
          isPhoneNumberValid() {
          return /^\d{11}$/.test(this.phoneNumber); // 使用正则表达式检验电话号码是否全是数字且长度为11位
          },
    },
  methods: {
    verificat() {//验证码验证
        uni.request({
            url:this.$BASE_URL.BASE_URL+"/verifySmsCodeLogin",
            data:{
                phone:this.phoneNumber,
                code:this.verificationCode
            },
            success: (res) => {
                console.log(res.data.data)
                if(res.data.code)
                {
                    uni.showToast({
                    title:"登录成功",
                    });
                    uni.setStorageSync('userInfo', res.data.data);
                    uni.switchTab({
                        url: "/pages/userinformation/userinformation"
                    });
                }
                else{
                    uni.showToast({
                    title:res.data.msg,
                    icon:"none"
                    });
                }
            }
        })
    },
    getVerificationCode() {//获取验证码
        var self=this
      // 模拟发送验证码
    
      // 模拟倒计时
      this.countdown = 60; // 倒计时时间(秒)
      const timer = setInterval(() => {
        if (this.countdown > 0) {
          this.countdown--;
        } else {
          clearInterval(timer);
          this.countdown = 0;
        }
      }, 1000);
      uni.hideKeyboard()  
      uni.request({
          url:this.$BASE_URL.BASE_URL+"/getcode",
        data:{
            phone:self.phoneNumber
        },
        success:(res)=>{
            if(res.data.code)
            {
                console.log(res.data)
                uni.showToast({
                title:"验证码已发送",
                });
            }
            else{
                uni.showToast({
                    title:"验证码获取失败",
                    icon: 'error',
                })
            }
        },
        fail: () => {
            uni.showToast({
                title:"验证码获取失败",
                icon: 'error',
            })
        }
      })
    },
    login() {
        const requestBody = {
          phone: this.phoneNumber,
          password: this.password
        };

      uni.request({
          url:this.$BASE_URL.BASE_URL+"/login",
        method: 'POST',
        data: requestBody,
        success: (res) => {
            if(res.data.code)
            {
                console.log(res.data.data)
                uni.showToast({
                title:"登录成功",
                });
                uni.setStorageSync('userInfo', res.data.data);
                uni.switchTab({
                    url: "/pages/userinformation/userinformation"
                });
            }
            else{
                uni.showToast({
                    title:res.data.msg,
                    icon: 'none',
                })
            }
        }
      })
    },
    toggleLoginMethod() {
      // 切换登录方式
      this.loginMethod = this.loginMethod === 'sms' ? 'password' : 'sms';
    },
    goToRegisterPage() {
      // 跳转到注册页面的逻辑
      uni.redirectTo({
          url:"/pages/userinformation/register/register"
      })
    }
  }
};
</script>

<style scoped>
/* 样式可以根据自己的需要进行调整 */
html, body {
  height: 100%; /* 设置页面高度为100% */
  margin: 0; /* 去除页面的默认边距 */
}
.login-container {
    background: linear-gradient(to bottom, #FFFFE0 0%, #87CEEB 250%); /* 使用线性渐变背景 */
    height: 700px; /* 让容器充满整个页面 */
    padding: 20px; /* 设置内边距 */
    border-radius: 10px; /* 设置圆角 */
    display: flex; /* 使用 Flex 布局 */
    flex-direction: column; /* 垂直布局 */
    justify-content: top; /* 内容垂直居中 */
    align-items: center; /* 内容水平居中 */
}
.switch-login-method {
  margin-top: 20px;
  color: #007bff;
  cursor: pointer;
}

.register-link {
  margin-top: 20px;
  color: #007bff;
  cursor: pointer;
}
.error-msg {
    margin-top: ;
    color: red;
    font-size: 12px;
}

.getcodecontainer {
    background: linear-gradient(to bottom, #FFFFE0 0%, #87CEEB 250%); /* 使用线性渐变背景 */
    height: 45%; /* 让容器充满整个页面 */
    padding: 20px; /* 设置内边距 */
    border-radius: 10px; /* 设置圆角 */
    display: flex; /* 使用 Flex 布局 */
    flex-direction: column; /* 垂直布局 */
    justify-content: top; /* 内容垂直居中 */
    align-items: center; /* 内容水平居中 */
}
.logo {
  margin-bottom: 30px;
}
.logo-img {
  width: 100px;
  height: 100px;
  border-radius: 50%;
}
.form-group {
  margin-bottom: 20px;
  display: flex;
  align-items: center;
  justify-content: center;
}
.label {
  font-weight: bold;
  margin-right: 10px;
}
input {
  flex: 1;
  padding: 10px;
  border-radius: 5px;
  font-size: 18px;
  background-color: rgba(255, 255, 255, 0.3); /* 设置背景为浅白色并透明 */
}
.code-btn-active {
    display: flex; /* 使用 flex 布局 */
    align-items: center; /* 垂直居中 */
    justify-content: center; /* 水平居中 */
    padding: 10px 15px;
    background-color: #00aaff;
    color: #ffffff;
    border: none;
    border-radius: 5px;
    cursor: pointer;
    font-size: 14px;
    transition: background-color 0.3s;
    height: 45px ;
}
button{
    display: flex; /* 使用 flex 布局 */
    align-items: center; /* 垂直居中 */
    justify-content: center; /* 水平居中 */
    padding: 10px 15px;
    background-color: #00aaff;
    color: #ffffff;
    border: none;
    border-radius: 5px;
    cursor: pointer;
    font-size: 14px;
    transition: background-color 0.3s;
    height: 45px ;
}
/* 禁用状态下的样式保持不变 */
.button:hover {
  background-color: #0056b3;
  height: 45px ;
}
button:disabled {
  background-color: #ccc;
  cursor: not-allowed;
  height: 45px ;
}
.login-btn {
  width: 100%;
}
/* .countdown {
  font-size: 12px;
  color: #888;
  margin-top: 10px;
} */
.code-btn:hover,
.login-btn:hover {
  background-color: rgba(255, 255, 255, 0.8); /* 鼠标悬停时的背景色,这里使用半透明白色 */
}
</style>
复制代码

后端:

controller层:

复制代码
package com.share.viedo_app.controller;

import com.share.viedo_app.pojo.Result;
import com.share.viedo_app.pojo.User;
import com.share.viedo_app.pojo.UserPrivacy;
import com.share.viedo_app.pojo.Video;
import com.share.viedo_app.service.UserService;
import com.share.viedo_app.util.AliMes;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.time.Duration;
import java.util.Random;

@Slf4j
@RestController
public class UserController {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Autowired
    private UserService userService;

    @GetMapping("/getcode")
    public Result getCode(@RequestParam String phone)//发送验证码
    {
        String code = String.valueOf(new Random().nextInt(899999) + 100000);
        AliMes aliMes=new AliMes();
        boolean result=aliMes.sendMes(phone,code);
        System.out.println(code);
        if(result)
        {
            stringRedisTemplate.opsForValue().set(phone, code, Duration.ofMinutes(5));
            System.out.println(result);
            return Result.success();
        }
        else {
            return Result.error("短信发送失败");
        }
    }
    @GetMapping("/verifySmsCode")//验证码验证
    public Result verifySmsCode(@RequestParam String phone,@RequestParam String code)
    {
        String savedCode = stringRedisTemplate.opsForValue().get(phone);
        if (savedCode != null && savedCode.equals(code)) {
            // 验证成功,清除验证码
            System.out.println("验证成功");
            stringRedisTemplate.delete(phone);
            return Result.success();
        }
        return Result.error("验证失败,验证码错误或已过期");
    }

    @GetMapping("/verifySmsCodeLogin")//验证码登录
    public Result verifySmsCodeLogin(@RequestParam String phone,@RequestParam String code)
    {
        String savedCode = stringRedisTemplate.opsForValue().get(phone);
        if (savedCode != null && savedCode.equals(code)) {
            // 验证成功,清除验证码
            User num=userService.codelogin(phone);
            stringRedisTemplate.delete(phone);
            System.out.println("验证成功");
            if(num==null)
            {
                return Result.error("验证失败,该手机号尚未注册");
            }

            return Result.success(num);
        }
        return Result.error("验证失败,验证码错误或已过期");
    }


    @PostMapping("/register")//验证
    public Result register(@RequestBody UserPrivacy userPrivacy)
    {
        try{
            userService.register(userPrivacy);
            return Result.success();
        }catch (Exception e)
        {
            return Result.error("该手机号已被注册");
        }
    }


    @PostMapping("/login")//登录
    public Result login(@RequestBody UserPrivacy userPrivacy)
    {
        UserPrivacy num=userService.login(userPrivacy);
        if(num!=null)
        {
            User resu=userService.selectByPhone(userPrivacy);
            return Result.success(resu);
        }
        else {
            return Result.error("手机号或密码错误");
        }
    }
}
复制代码

service层:

复制代码
package com.share.viedo_app.controller;

import com.share.viedo_app.pojo.Result;
import com.share.viedo_app.pojo.User;
import com.share.viedo_app.pojo.UserPrivacy;
import com.share.viedo_app.pojo.Video;
import com.share.viedo_app.service.UserService;
import com.share.viedo_app.util.AliMes;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.time.Duration;
import java.util.Random;

@Slf4j
@RestController
public class UserController {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Autowired
    private UserService userService;

    @GetMapping("/getcode")
    public Result getCode(@RequestParam String phone)//发送验证码
    {
        String code = String.valueOf(new Random().nextInt(899999) + 100000);
        AliMes aliMes=new AliMes();
        boolean result=aliMes.sendMes(phone,code);
        System.out.println(code);
        if(result)
        {
            stringRedisTemplate.opsForValue().set(phone, code, Duration.ofMinutes(5));
            System.out.println(result);
            return Result.success();
        }
        else {
            return Result.error("短信发送失败");
        }
    }
    @GetMapping("/verifySmsCode")//验证码验证
    public Result verifySmsCode(@RequestParam String phone,@RequestParam String code)
    {
        String savedCode = stringRedisTemplate.opsForValue().get(phone);
        if (savedCode != null && savedCode.equals(code)) {
            // 验证成功,清除验证码
            System.out.println("验证成功");
            stringRedisTemplate.delete(phone);
            return Result.success();
        }
        return Result.error("验证失败,验证码错误或已过期");
    }

    @GetMapping("/verifySmsCodeLogin")//验证码登录
    public Result verifySmsCodeLogin(@RequestParam String phone,@RequestParam String code)
    {
        String savedCode = stringRedisTemplate.opsForValue().get(phone);
        if (savedCode != null && savedCode.equals(code)) {
            // 验证成功,清除验证码
            User num=userService.codelogin(phone);
            stringRedisTemplate.delete(phone);
            System.out.println("验证成功");
            if(num==null)
            {
                return Result.error("验证失败,该手机号尚未注册");
            }

            return Result.success(num);
        }
        return Result.error("验证失败,验证码错误或已过期");
    }


    @PostMapping("/register")//验证
    public Result register(@RequestBody UserPrivacy userPrivacy)
    {
        try{
            userService.register(userPrivacy);
            return Result.success();
        }catch (Exception e)
        {
            return Result.error("该手机号已被注册");
        }
    }


    @PostMapping("/login")//登录
    public Result login(@RequestBody UserPrivacy userPrivacy)
    {
        UserPrivacy num=userService.login(userPrivacy);
        if(num!=null)
        {
            User resu=userService.selectByPhone(userPrivacy);
            return Result.success(resu);
        }
        else {
            return Result.error("手机号或密码错误");
        }
    }
    @PostMapping("/updata/user")
    public Result updataUser(@RequestBody User user)
    {
        try {
            userService.updata(user);
            return Result.success();
        }catch (Exception e)
        {
            return Result.error("未知错误");
        }


    }
}
复制代码

mapper层:

复制代码
package com.share.viedo_app.mapper;

import com.share.viedo_app.pojo.User;
import com.share.viedo_app.pojo.UserPrivacy;
import com.share.viedo_app.service.UserService;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

@Mapper
public interface UserMapper {
    @Insert("insert into userprivacy( phone, password) values (#{phone},MD5(#{password}))")
    void register(UserPrivacy userPrivacy);
    @Insert("insert into user(phone,account) values (#{phone},#{phone})")
    void register1(UserPrivacy userPrivacy);
    @Select("select id from userprivacy where phone=#{phone} and password=MD5(#{password})")
    UserPrivacy login(UserPrivacy userPrivacy);
    @Select("select * from user where phone=#{phone}")
    User codelogin(String phone);
}
复制代码
posted @ 2024-06-18 01:27  财神给你送元宝  阅读(121)  评论(0编辑  收藏  举报