web大作业开发记录01

用户登录注册:
login.vue:
<template>
<div class="login-container">
<el-form :model="loginForm" :rules="loginRules" ref="loginFormRef" class="login-form">
<h2 class="login-title">用户登录</h2>
<el-form-item prop="studentId">
<el-input v-model="loginForm.studentId" placeholder="学号" prefix-icon="el-icon-user"></el-input>
</el-form-item>
<el-form-item prop="password">
<el-input v-model="loginForm.password" type="password" placeholder="密码" prefix-icon="el-icon-lock"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" style="width: 100%" @click="handleLogin">登录</el-button>
</el-form-item>
<div class="register-link">
<span @click="goToRegister">没有账号?立即注册</span>
</div>
</el-form>
</div>
</template>
<script setup>
import { ref, reactive } from 'vue'
import { useRouter } from 'vue-router'
import { ElMessage } from 'element-plus'
import { login } from '@/api/user'
const router = useRouter()
const loginFormRef = ref(null)
const loginForm = reactive({
studentId: '',
password: ''
})
const loginRules = {
studentId: [{ required: true, message: '请输入学号', trigger: 'blur' }],
password: [{ required: true, message: '请输入密码', trigger: 'blur' }]
}
const handleLogin = () => {
loginFormRef.value.validate(async (valid) => {
if (valid) {
try {
const res = await login(loginForm)
if (res.code === 200) {
localStorage.setItem('userInfo', JSON.stringify(res.data))
ElMessage.success('登录成功')
// 根据用户角色跳转
if (res.data.studentId === 'root') {
router.push('/admin')
} else {
router.push('/lender/home')
}
}
} catch (error) {
console.error(error)
}
}
})
}
const goToRegister = () => {
router.push('/register')
}
</script>
<style scoped>
.login-container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: #f5f5f5;
}
.login-form {
width: 400px;
padding: 30px;
background-color: white;
border-radius: 5px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
.login-title {
text-align: center;
margin-bottom: 30px;
color: #409EFF;
}
.register-link {
text-align: right;
margin-top: 10px;
font-size: 14px;
color: #409EFF;
cursor: pointer;
}
</style>
register.vue:
<template>
<div class="register-container">
<el-form :model="registerForm" :rules="registerRules" ref="registerFormRef" class="register-form">
<h2 class="register-title">用户注册</h2>
<el-form-item prop="studentId">
<el-input v-model="registerForm.studentId" placeholder="学号" prefix-icon="el-icon-user"></el-input>
</el-form-item>
<el-form-item prop="name">
<el-input v-model="registerForm.name" placeholder="姓名" prefix-icon="el-icon-user"></el-input>
</el-form-item>
<el-form-item prop="className">
<el-input v-model="registerForm.className" placeholder="班级" prefix-icon="el-icon-office-building"></el-input>
</el-form-item>
<el-form-item prop="phoneNumber">
<el-input v-model="registerForm.phoneNumber" placeholder="手机号" prefix-icon="el-icon-phone"></el-input>
</el-form-item>
<el-form-item prop="gender">
<el-radio-group v-model="registerForm.gender">
<el-radio label="男">男</el-radio>
<el-radio label="女">女</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item prop="password">
<el-input v-model="registerForm.password" type="password" placeholder="密码" prefix-icon="el-icon-lock"></el-input>
</el-form-item>
<el-form-item prop="confirmPassword">
<el-input v-model="registerForm.confirmPassword" type="password" placeholder="确认密码" prefix-icon="el-icon-lock"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" style="width: 100%" @click="handleRegister">注册</el-button>
</el-form-item>
<div class="login-link">
<span @click="goToLogin">已有账号?立即登录</span>
</div>
</el-form>
</div>
</template>
<script setup>
import { ref, reactive } from 'vue'
import { useRouter } from 'vue-router'
import { ElMessage } from 'element-plus'
import { register } from '@/api/user'
const router = useRouter()
const registerFormRef = ref(null)
const registerForm = reactive({
studentId: '',
name: '',
className: '',
phoneNumber: '',
gender: '男',
password: '',
confirmPassword: '',
points: 0
})
// 自定义密码确认验证
const validateConfirmPassword = (rule, value, callback) => {
if (value !== registerForm.password) {
callback(new Error('两次输入的密码不一致'))
} else {
callback()
}
}
// 手机号验证
const validatePhone = (rule, value, callback) => {
const phoneRegex = /^1[3-9]\d{9}$/
if (!phoneRegex.test(value)) {
callback(new Error('请输入有效的手机号码'))
} else {
callback()
}
}
const registerRules = {
studentId: [{ required: true, message: '请输入学号', trigger: 'blur' }],
name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
className: [{ required: true, message: '请输入班级', trigger: 'blur' }],
phoneNumber: [
{ required: true, message: '请输入手机号', trigger: 'blur' },
{ validator: validatePhone, trigger: 'blur' }
],
gender: [{ required: true, message: '请选择性别', trigger: 'change' }],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' },
{ min: 6, message: '密码长度不能少于6个字符', trigger: 'blur' }
],
confirmPassword: [
{ required: true, message: '请确认密码', trigger: 'blur' },
{ validator: validateConfirmPassword, trigger: 'blur' }
]
}
const handleRegister = () => {
registerFormRef.value.validate(async (valid) => {
if (valid) {
// 移除确认密码字段,后端不需要
const { confirmPassword, ...userData } = registerForm
try {
const res = await register(userData)
if (res.code === 200) {
ElMessage.success('注册成功')
router.push('/login')
} else {
ElMessage.error(res.msg || '注册失败')
}
} catch (error) {
ElMessage.error('注册请求失败')
console.error(error)
}
}
})
}
const goToLogin = () => {
router.push('/login')
}
</script>
<style scoped>
.register-container {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
background-color: #f5f5f5;
padding: 20px 0;
}
.register-form {
width: 400px;
padding: 30px;
background-color: white;
border-radius: 5px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
.register-title {
text-align: center;
margin-bottom: 30px;
color: #409EFF;
}
.login-link {
text-align: right;
margin-top: 10px;
font-size: 14px;
color: #409EFF;
cursor: pointer;
}
</style>
api:
user.js:
import request from '@/utils/request'
// 用户登录
export function login(data) {
return request({
url: '/users/login',
method: 'post',
data
})
}
// 用户注册
export function register(data) {
return request({
url: '/users/register',
method: 'post',
data
})
}
Users:
package com.example.demo.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import io.swagger.annotations.ApiModel;
import java.io.Serializable;
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="Users对象", description="")
public class Users implements Serializable {
private static final long serialVersionUID = 1L;
@TableId
private String studentId;
private String name;
private String className; // 新增字段
private String phoneNumber; // 新增字段
private String password;
private String gender;
private Integer points;
// getter 和 setter 方法
public String getStudentId() {
return studentId;
}
public void setStudentId(String studentId) {
this.studentId = studentId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Integer getPoints() {
return points;
}
public void setPoints(Integer points) {
this.points = points;
}
}
UsersController:
package com.example.demo.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.common.Result;
import com.example.demo.entity.Users;
import com.example.demo.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
@RequestMapping("/users")
public class UsersController {
@Autowired
private UsersService usersService;
@PostMapping("/login")
public Result login(@RequestBody Users users) {
return usersService.login(users);
}
@PostMapping("/register")
public Result register(@RequestBody Users users) {
return usersService.register(users);
}
@GetMapping("/{studentId}")
public Result getById(@PathVariable String studentId) {
Users user = usersService.getById(studentId);
if (user != null) {
// 不返回密码
user.setPassword(null);
return Result.success(user);
}
return Result.fail("用户不存在");
}
@PostMapping("/update")
public Result update(@RequestBody Users users) {
// 不允许更新密码,如需更新密码应该有专门的接口
Users existingUser = usersService.getById(users.getStudentId());
if (existingUser != null) {
users.setPassword(existingUser.getPassword());
users.setPoints(existingUser.getPoints()); // 不允许直接修改积分
if (usersService.updateById(users)) {
return Result.success();
}
}
return Result.fail("更新失败");
}
@PostMapping("/updatePassword")
public Result updatePassword(@RequestBody Map<String, String> params) {
String studentId = params.get("studentId");
String oldPassword = params.get("oldPassword");
String newPassword = params.get("newPassword");
if (studentId == null || oldPassword == null || newPassword == null) {
return Result.fail("参数不完整");
}
return usersService.updatePassword(studentId, oldPassword, newPassword);
}
@PostMapping("/addPoints")
public Result addPoints(@RequestBody Map<String, Object> params) {
String studentId = (String) params.get("studentId");
Integer points = (Integer) params.get("points");
if (studentId == null || points == null) {
return Result.fail("参数不完整");
}
return usersService.addPoints(studentId, points);
}
// 获取所有用户(除管理员外)
@GetMapping("/list")
public Result list() {
QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
queryWrapper.ne("student_id", "root"); // 排除管理员
return Result.success(usersService.list(queryWrapper));
}
// 添加用户
@PostMapping("/add")
public Result add(@RequestBody Users users) {
// 检查用户是否已存在
if (usersService.getById(users.getStudentId()) != null) {
return Result.fail("该学号已存在");
}
// 设置默认积分
if (users.getPoints() == null) {
users.setPoints(0);
}
if (usersService.save(users)) {
return Result.success();
}
return Result.fail("添加失败");
}
// 删除用户
@DeleteMapping("/{studentId}")
public Result delete(@PathVariable String studentId) {
if (usersService.removeById(studentId)) {
return Result.success();
}
return Result.fail("删除失败");
}
}
UsersServiceImpl:
package com.example.demo.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.common.Result;
import com.example.demo.entity.Users;
import com.example.demo.mapper.UsersMapper;
import com.example.demo.service.UsersService;
import org.springframework.stereotype.Service;
@Service
public class UsersServiceImpl extends ServiceImpl<UsersMapper, Users> implements UsersService {
@Override
public Result login(Users users) {
if (users.getStudentId() == null || users.getPassword() == null) {
return Result.fail("学号和密码不能为空");
}
QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("student_id", users.getStudentId());
Users user = getOne(queryWrapper);
if (user == null) {
return Result.fail("用户不存在");
}
if (!user.getPassword().equals(users.getPassword())) {
return Result.fail("密码错误");
}
// 登录成功,不返回密码
user.setPassword(null);
return Result.success(user);
}
@Override
public Result register(Users users) {
if (users.getStudentId() == null || users.getPassword() == null) {
return Result.fail("学号和密码不能为空");
}
// 检查用户是否已存在
QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("student_id", users.getStudentId());
if (count(queryWrapper) > 0) {
return Result.fail("该学号已被注册");
}
// 设置默认积分
if (users.getPoints() == null) {
users.setPoints(0);
}
if (save(users)) {
return Result.success();
}
return Result.fail("注册失败");
}
@Override
public Result updatePassword(String studentId, String oldPassword, String newPassword) {
Users user = getById(studentId);
if (user == null) {
return Result.fail("用户不存在");
}
if (!user.getPassword().equals(oldPassword)) {
return Result.fail("原密码错误");
}
user.setPassword(newPassword);
if (updateById(user)) {
return Result.success();
}
return Result.fail("密码更新失败");
}
@Override
public Result addPoints(String studentId, Integer points) {
Users user = getById(studentId);
if (user == null) {
return Result.fail("用户不存在");
}
user.setPoints(user.getPoints() + points);
if (updateById(user)) {
return Result.success();
}
return Result.fail("积分更新失败");
}
}

浙公网安备 33010602011771号