前端部分
新增Person(个人页面),Password(修改密码页面),还需要对Manager,login页面进行修改
router文件夹下的index.js:
import Vue from 'vue'
import VueRouter from 'vue-router'
import Manager from '../views/Manager.vue'
// 解决导航栏或者底部导航tabBar中的vue-router在3.0版本以上频繁点击菜单报错的问题。
const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push (location) {
return originalPush.call(this, location).catch(err => err)
}
Vue.use(VueRouter)
const routes = [
{
path: '/',
name: 'manager',
component: Manager,
children:[
{path:'home',name:'Home',meta:{ name:'系统首页' },component:()=>import('../views/manager/Home.vue')},
{
path:'user',name:'User',meta:{ name:'用户信息' },component:()=>import('../views/manager/User.vue')
},
{
path:'403',name:'Auth',meta:{ name:'无权限' },component:()=>import('../views/Auth.vue')
},
{
path:'Person',name:'person',meta:{ name:'个人信息' },component:()=>import('../views/manager/Person.vue')
},
{
path:'Password',name:'password',meta:{ name:'修改密码' },component:()=>import('../views/manager/Password.vue')
}
],
redirect:'/home'
},
{
path: '/about',
name: 'about',
// route level code-splitting
// this generates a separate chunk (about.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
},
{
path:'/login',
name:'login',
meta:{ name:'登录' },
component: ()=>import('../views/login.vue')
},
{
path:'/register',
name:'register',
meta:{ name:'注册' },
component: ()=>import('../views/register.vue')
},
{
path:'*',
name:'404',
meta:{ name:'无法访问' },
component: ()=>import('../views/404.vue')
}
]
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes
})
router.beforeEach((to,from,next)=>{
let adminPaths=['/user']
let user=JSON.parse(localStorage.getItem('honey-user')||'{}')
if(user.role !== '管理员' && adminPaths.includes(to.path)){
next('/403')
}else{
next()
}
})
export default router
Person.vue
class="avatar-uploader" action="http://localhost:9090/file/upload" :headers="{ token: user.token }" :show-file-list="false" :on-success="handleAvatarSuccess">
export default {
data(){
return{
user:JSON.parse(localStorage.getItem('honey-user'||'{}'))
}
},
methods:{
update(){
this.$request.put('/user/update',this.user).then(res=>{
if(res.code==='200'){
this.$message.success('保存成功')
localStorage.setItem('honey-user',JSON.stringify(this.user))
this.$emit('update:user',this.user)
}else{
this.$message.error(res.msg)
}
})
},
handleAvatarSuccess(response,file,fileList){
console.log(response)
this.user.avatar=response.data
}
}
}
/deep/.el-form-item__label{
font-weight: bold;
}
/deep/.el-upload{
border-radius: 50%;
}
/deep/.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
cursor: pointer;
position: relative;
overflow: hidden;
border-radius: 50%;
}
/deep/.avatar-uploader .el-upload:hover {
border-color: #409EFF;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
line-height: 178px;
text-align: center;
border-radius: 50%;
}
.avatar {
width: 178px;
height: 178px;
display: block;
border-radius: 50%;
}
Password.vue:
export default {
data(){
const validatePassword = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入确认密码'));
} else if(value !== this.user.newPassword){
callback(new Error('两次密码不一致'));
} else {
callback();
}
};
return{
user:JSON.parse(localStorage.getItem('honey-user'||'{}')),
rules:{
password:[{
required:true,
message:'请输入原始密码',
trigger:'blur'
}],
newPassword:[{
required:true,
message:'请输入新密码',
trigger:'blur'
}],
confirmPassword:[{
validator:validatePassword,
required:true,
trigger:'blur',
}]
}
}
},
methods:{
update(){
this.$refs.fromRef.validate((valid)=>{
if(valid){
this.user.password=this.user.newPassword
this.$request.put('/user/update',this.user).then(res=>{
if(res.code==='200'){
this.$message.success('保存成功')
this.$router.push('/login')
}else{
this.$message.error(res.msg)
}
})
}
})
},
}
}
/deep/.el-form-item__label{
font-weight: bold;
}
Manager.vue:
honey2024
系统首页
信息管理
{{user.name}}
import axios from "axios";
import request from '@/utils/request'
export default {
name: 'HomeView',
data() {
return {
isCollapse: false, // 不收缩
asideWidth: '200px',
collapseIcon: 'el-icon-s-fold',
user:JSON.parse(localStorage.getItem('honey-user')||'{}'),
}
},
mounted() {
// axios.get('http://localhost:9090/user/selectall').then(res=>{
// console.log(res.data);
// this.users=res.data.data
// })
// request.get('/user/selectall').then(res => {
// this.users = res.data
// })
},
methods: {
updateUser(user){
this.user=JSON.parse(JSON.stringify(user))
},
handleFileUpload(response,file,fileList){
this.fileList=fileList
console.log(response,file,fileList)
},
logout() {
localStorage.removeItem("honey-user")
this.$router.push('/login')
},
handleFull() {
document.documentElement.requestFullscreen()
},
handleCollapse() {
this.isCollapse = !this.isCollapse
this.asideWidth = this.isCollapse ? '64px' : '200px'
this.collapseIcon = this.isCollapse ? 'el-icon-s-unfold' : 'el-icon-s-fold'
}
}
}
.el-menu--inline {
background-color: #000c17 !important;
}
.el-menu--inline .el-menu-item {
background-color: #000c17 !important;
padding-left: 49px !important;
}
.el-menu-item:hover, .el-submenu__title:hover {
color: #fff !important;
}
.el-submenu__title:hover i {
color: #fff !important;
}
.el-menu-item:hover i {
color: #fff !important;
}
.el-menu-item.is-active {
background-color: #1890ff !important;
border-radius: 5px !important;
width: calc(100% - 8px);
margin-left: 4px;
}
.el-menu-item.is-active i, .el-menu-item.is-active .el-tooltip {
margin-left: -4px;
}
.el-menu-item {
height: 40px !important;
line-height: 40px !important;
}
.el-submenu__title {
height: 40px !important;
line-height: 40px !important;
}
.el-submenu .el-menu-item {
min-width: 0 !important;
}
.el-menu--inline .el-menu-item.is-active {
padding-left: 45px !important;
}
/*.el-submenu__icon-arrow {*/
/* margin-top: -5px;*/
/*}*/
.el-aside {
transition: width .3s;
box-shadow: 2px 0 6px rgba(0, 21, 41, .35);
}
.logo-title {
margin-left: 5px;
font-size: 20px;
transition: all .3s; /* 0.3s */
}
.el-header {
box-shadow: 2px 0 6px rgba(0, 21, 41, .35);
display: flex;
align-items: center;
}
login.vue:
import ValidCode from "@/components/ValidCode.vue";
export default {
name:'login',
components:{
ValidCode
},
data() {
const validateCode = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入验证码'));
} else if(value.toLowerCase() !== this.code){
callback(new Error('验证码错误'));
} else {
callback();
}
};
return {
forgetUserForm:{
},
forgetPassDialogVis:false,
code:'',
user: {
code:'',
username: '',
password: ''
},
rules:{
username:[{
required:'true',message:'请输入账号',trigger:'blur'
}],
password:[{
required:'true',message:'请输入密码',trigger:'blur'
}],
code:[{
validator:validateCode,trigger:'blur'
}]
},
}
},
methods:{
handleForgetPass(){
this.forgetUserForm={}
this.forgetPassDialogVis=true
},
getCode(code){
this.code=code.toLowerCase()
},
resetPassword(){
this.$request.put('/password',this.forgetUserForm).then(res=>{
if(res.code==='200'){
this.$message.success('密码重置成功')
this.forgetPassDialogVis=false
}else{
this.$message.error(res.msg)
}
})
},
login(){
this.$refs['loginRef'].validate((valid=>{
if(valid){
this.$request.post("/login",this.user).then(res=>{
if(res.code === '200'){
this.$router.push('/')
this.$message.success('登录成功')
localStorage.setItem('honey-user',JSON.stringify(res.data))
}else{
this.$message.error(res.msg)
}
console.log(res);
})
}
}))
}
}
}
后端部分
只需要为忘记密码编写一个新接口即可:
WebController:
package com.example.springboot.controller;
import cn.hutool.core.util.StrUtil;
import com.example.springboot.common.AuthAccess;
import com.example.springboot.common.Result;
import com.example.springboot.entity.User;
import com.example.springboot.exception.ServiceException;
import com.example.springboot.service.UserService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@RestController
public class WebController {
@Resource
UserService userService;
@AuthAccess
@GetMapping("/")
public Result hello(){
return Result.success("success");
}
@PostMapping("/login")
public Result login(@RequestBody User user){
if(StrUtil.isBlank(user.getUsername())||StrUtil.isBlank(user.getPassword())){
return Result.error("数据输入错误");
}
user=userService.login(user);
return Result.success(user);
}
@AuthAccess
@PostMapping("/register")
public Result register(@RequestBody User user){
if(StrUtil.isBlank(user.getUsername())||StrUtil.isBlank(user.getPassword())){
throw new ServiceException("输入不合法");
}
if(user.getUsername().length()>10||user.getPassword().length()>20){
throw new ServiceException("长度过长");
}
user=userService.register(user);
return Result.success(user);
}
@AuthAccess
@PutMapping("/password")
public Result password(@RequestBody User user){
if(StrUtil.isBlank(user.getUsername())||StrUtil.isBlank(user.getPhone())){
throw new ServiceException("输入不合法");
}
userService.resetPassword(user);
return Result.success();
}
}
UserService:
package com.example.springboot.service;
import com.example.springboot.entity.User;
import com.example.springboot.exception.ServiceException;
import com.example.springboot.mapper.UserMapper;
import com.example.springboot.utils.TokenUtils;
import jdk.nashorn.internal.parser.Token;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
@Service
public class UserService {
@Autowired
UserMapper userMapper;
public void insertUser(User user){
userMapper.insert(user);
}
public void updateUser(User user) {
userMapper.updateUser(user);
}
public void deleteUser(Integer id) {
userMapper.deleteUser(id);
}
public void batchdeleteUser(List
for(Integer id : ids){
userMapper.deleteUser(id);
}
}
public List
return userMapper.selectall();
}
public User selectbyid(Integer id) {
return userMapper.selectbyid(id);
}
public List
return userMapper.selectbyname(name);
}
public List
return userMapper.selectbymore(username,name);
}
public List
return userMapper.selectbymo(username,name);
}
public User login(User user) {
User dbuser=userMapper.selectbyUsername(user.getUsername());
if(dbuser == null){
throw new ServiceException("账号不存在");
}
if(!user.getPassword().equals(dbuser.getPassword())){
throw new ServiceException("账号或者密码错误");
}
String token=TokenUtils.createToken(dbuser.getId().toString(),dbuser.getPassword());
dbuser.setToken(token);
return dbuser;
}
public User register(User user) {
User dbuser=userMapper.selectbyUsername(user.getUsername());
if(dbuser != null){
throw new ServiceException("用户名已存在");
}
userMapper.insert(user);
return user;
}
public void resetPassword(User user) {
User dbuser=userMapper.selectbyUsername(user.getUsername());
if(dbuser==null){
throw new ServiceException("用户不存在");
}
if(!user.getPhone().equals(dbuser.getPhone())){
throw new ServiceException("验证错误");
}
dbuser.setPassword("123");
userMapper.updateUser(dbuser);
}
}
参考链接
发表评论