学生注册和个人信息修改模块完成,简化了部分不必要的代码。

This commit is contained in:
musteven 2025-03-09 11:43:10 +08:00
parent dc02ed8eb4
commit 399b6b3bb5
10 changed files with 224 additions and 63 deletions

View File

@ -3,8 +3,13 @@ import { request, longRequest } from '@/utils'
export default { export default {
login: (data) => request.post('/login/student', data, { noNeedToken: true }), login: (data) => request.post('/login/student', data, { noNeedToken: true }),
getAccount: () => request.get('/account'), getAccount: () => request.get('/account'),
findStudentByStudentNo: (data) => findStudentByStudentNo: (data) =>
request.post('/user/findStudentByStudentNo', data, { noNeedToken: true }), request.post('/user/findStudentByStudentNo', data, { noNeedToken: true }),
findStudentByusername: (data) => //依据用户名获取学生信息
request.post('/user/findStudentByusername', data, { noNeedToken: true }),
confirmQuestionAnswer: (data) => confirmQuestionAnswer: (data) =>
request.post('/user/confirmQuestionAnswer', data, { noNeedToken: true }), request.post('/user/confirmQuestionAnswer', data, { noNeedToken: true }),
resetPassword: (data) => resetPassword: (data) =>

View File

@ -0,0 +1,194 @@
<template>
<CommonPage show-footer>
<div class="w-full f-c-c">
<div class="max-w-900 w-full flex justify-between gap-x-28">
<div class="flex-1 rounded-10 p-20" border="solid 1px #ccc">
<h3 class="m-b-20 text-center">修改信息</h3>
<n-form
ref="userInfoRef"
:model="userInfoValue"
:rules="userInofRules"
label-placement="left"
label-align="right"
label-width="58px"
:show-require-mark="false"
>
<n-form-item label="登录账号" path="username">
<n-input v-model:value="userInfoValue.username" disabled></n-input>
</n-form-item>
<n-form-item label="学号">
<n-input :value="disabledValue.studentNo" disabled></n-input>
</n-form-item>
<n-form-item label="中文名" path="chineseName">
<n-input v-model:value="userInfoValue.chineseName"></n-input>
</n-form-item>
<n-form-item label="班级">
<n-input :value="disabledValue.banji" disabled></n-input>
</n-form-item>
<n-form-item label="邮箱" path="email">
<n-input v-model:value="userInfoValue.email"></n-input>
</n-form-item>
<n-form-item label="问题" path="question">
<n-input v-model:value="userInfoValue.question"></n-input>
</n-form-item>
<n-form-item label="答案" path="answer">
<n-input v-model:value="userInfoValue.answer"></n-input>
</n-form-item>
<n-form-item class="f-c-c">
<n-button type="primary" @click="onSaveUserInfo">保存</n-button>
</n-form-item>
</n-form>
</div>
<div class="flex-1 rounded-10 p-20" border="solid 1px #ccc">
<h3 class="m-b-20 text-center">修改密码</h3>
<n-form
ref="pwdInfoRef"
:model="pwdInfoValue"
:rules="pwdInforRules"
label-placement="left"
label-align="right"
label-width="68px"
:show-require-mark="false"
>
<n-form-item label="当前密码" path="password">
<n-input
v-model:value="pwdInfoValue.password"
type="password"
placeholder="请输入密码"
></n-input>
</n-form-item>
<n-form-item label="新密码" path="newPassword">
<n-input
v-model:value="pwdInfoValue.newPassword"
type="password"
placeholder="请输入新密码"
></n-input>
</n-form-item>
<n-form-item label="确认密码" path="confirmPassword">
<n-input
v-model:value="pwdInfoValue.confirmPassword"
type="password"
placeholder="请重复输入新密码"
></n-input>
</n-form-item>
<n-form-item class="f-c-c">
<n-button type="primary" @click="onSavePwd">保存</n-button>
</n-form-item>
</n-form>
</div>
</div>
</div>
</CommonPage>
</template>
<script setup>
import { ref } from 'vue'
import api from '@/api/user'
import { confirmPasswordRule, emailRule, requiredRule, strictPasswordRule } from '@/utils/validator'
import { useUserStore } from '@/store'
import sha256 from 'crypto-js/sha256';
import { generateRandomString } from '@/utils';
const DEFAULT_PWD_VALUE = {
password: '',
newPassword: '',
confirmPassword: '',
}
const userStore = useUserStore()
const userInfoRef = ref(null)
const pwdInfoRef = ref(null)
const userInfoValue = ref({
username: '',
chineseName: '',
email: '',
question: '',
answer: '',
})
const disabledValue = ref({
banji: '',
studentNo: '',
})
const pwdInfoValue = ref({ ...DEFAULT_PWD_VALUE })
const userInofRules = ref({
username: requiredRule('用户名'),
chineseName: {
required: true,
trigger: 'blur',
min: 2,
message: '中文名不能少于2位',
},
email: emailRule(false),
question: requiredRule('问题'),
answer: requiredRule('答案'),
})
const pwdInforRules = ref({
password: requiredRule('密码'),
newPassword: strictPasswordRule(),
confirmPassword: confirmPasswordRule(pwdInfoValue, 'newPassword'),
})
//获取用户数据
const getUserInfo = async (myUsername) => {
try {
const res = await api.findStudentByusername({
username: myUsername || userStore.getUsername(),
})
const { banji, studentNo, username, chineseName, email, question } = res.data
disabledValue.value = {
banji,
studentNo,
}
userInfoValue.value = {
username,
chineseName,
email,
question,
answer: '',
}
} catch (err) {
;(err) => $message.error(err.message)
}
}
const onSaveUserInfo = () => {
userInfoRef.value?.validate(async (errors) => {
if (!errors) {
try {
const res = await api.updateUserInfo({
...userInfoValue.value,
})
$message.success('修改用户信息成功')
getUserInfo(userInfoValue.value.username)
} catch (err) {
$message.error(err.message)
}
}
})
}
const onSavePwd = () => {
pwdInfoRef.value?.validate(async (errors) => {
if (!errors) {
try {
const res = await api.updateUserPwd({
password: sha256(pwdInfoValue.value.password.trim()).toString(),
newPassword: sha256(pwdInfoValue.value.newPassword.trim()).toString(),
sessionId: generateRandomString(64)+pwdInfoValue.value.newPassword.trim(), //应付检查的无用字段
})
$message.success('修改密码成功')
pwdInfoValue.value = { ...DEFAULT_PWD_VALUE }
} catch (err) {
$message.error(err.message)
}
}
})
}
// 执行
getUserInfo()
</script>

View File

@ -23,21 +23,18 @@ export const useUserStore = defineStore('user', {
getId() { getId() {
return isAdminEnd() ? this.adminInfo.id : this.userInfo.id return isAdminEnd() ? this.adminInfo.id : this.userInfo.id
}, },
getSchoolId() {
return isAdminEnd() ? this.adminInfo.schoolId : this.userInfo.schoolId
},
getRole() { getRole() {
return (isAdminEnd() ? this.adminInfo.role : this.userInfo.role) || [] return (isAdminEnd() ? this.adminInfo.role : this.userInfo.role) || []
}, },
// 获取包括User端用户和Admin端用户账户信息 // 获取包括User端用户和Admin端用户账户信息
async getAccountInfo() { async getAccountInfo() {
const res = await api.getAccount() const res = await api.getAccount()
const { username, name, role, id, schoolId } = res.data const { username, name, role, id} = res.data
try { try {
if (isAdminEnd()) { if (isAdminEnd()) {
this.adminInfo = { username, name, role: [role], id, schoolId } this.adminInfo = { username, name, role: [role], id}
} else { } else {
this.userInfo = { username, name, role: [role], id, schoolId } this.userInfo = { username, name, role: [role], id}
} }
return Promise.resolve(res.data) return Promise.resolve(res.data)

View File

@ -100,5 +100,17 @@ export default {
keepAlive: true, keepAlive: true,
}, },
}, },
{
name: 'PersonSetting',
path: 'person-setting',
component: () => import('./person-setting/index.vue'),
meta: {
title: '个人设置',
icon: 'ic:baseline-table-view',
role: ['student'],
requireAuth: true,
keepAlive: true,
},
},
], ],
} }

View File

@ -10,15 +10,6 @@
label-width="300px" label-width="300px"
> >
<div class="grid md:gap-x-30"> <div class="grid md:gap-x-30">
<n-form-item label="选择学校(从下拉框选择)" path="schoolId">
<n-select
v-model:value="formValue.schoolId"
filterable
placeholder="搜索学校(输入学校名字)"
:options="schoolOptions"
@search="handleSearchSchool"
/>
</n-form-item>
<n-form-item label="学号" path="studentNo"> <n-form-item label="学号" path="studentNo">
<n-input <n-input
v-model:value="formValue.studentNo" v-model:value="formValue.studentNo"
@ -94,7 +85,6 @@ const router = useRouter()
const loading = ref(false) const loading = ref(false)
const formRef = ref(null) const formRef = ref(null)
const formValue = ref({ const formValue = ref({
schoolId: null,
studentNo: '', studentNo: '',
chineseName: '', chineseName: '',
banji: '', banji: '',
@ -108,7 +98,6 @@ const formValue = ref({
const schoolOptions = ref([]) const schoolOptions = ref([])
const formRules = { const formRules = {
schoolId: requiredRule('学校'),
studentNo: requiredRule('学号'), studentNo: requiredRule('学号'),
chineseName: requiredRule('姓名'), chineseName: requiredRule('姓名'),
banji: requiredRule('班级'), banji: requiredRule('班级'),
@ -120,16 +109,6 @@ const formRules = {
answer: requiredRule('答案'), answer: requiredRule('答案'),
} }
const handleSearchSchool = async (query) => {
const res = await api.getSchoolByschoolName({
name: query,
})
schoolOptions.value = res.data.map((item) => ({
label: item.name,
value: item.id + '',
}))
}
const findExistUser = async () => { const findExistUser = async () => {
const { studentNo } = formValue.value const { studentNo } = formValue.value
const studentNoVal = studentNo.trim() const studentNoVal = studentNo.trim()

View File

@ -21,7 +21,7 @@ public class HttpInterceptorConfig extends WebMvcConfigurationSupport {
.addPathPatterns("/api/**") //拦截所有请求,判断token是否合法决定是否需要登录 .addPathPatterns("/api/**") //拦截所有请求,判断token是否合法决定是否需要登录
.excludePathPatterns("/api/login/student","/api/login/admin","/api/login","/api/user/signUser", .excludePathPatterns("/api/login/student","/api/login/admin","/api/login","/api/user/signUser",
"/api/user" + "/api/user" +
"/findUserByStudentNoSchoolId","/api/school/getSchoolByName","/api/adminusers/findAdminuserByno","/api/adminusers/findAdminuserByAccountInRePwInfo", "/findStudentByusername","/api/user/findStudentByStudentNo","/api/adminusers/findAdminuserByno","/api/adminusers/findAdminuserByAccountInRePwInfo",
"/api/adminusers" + "/api/adminusers" +
"/signTeacher", "/signTeacher",
"/api/adminusers" + "/api/adminusers" +

View File

@ -169,32 +169,6 @@ public class UserController {
} }
} }
@PostMapping("/findUserByStudentNoSchoolId")
public RespBean findUserByStudentNoSchoolId(@RequestBody Users user, HttpServletRequest request) // 根据学号学校Id获取学生的信息
{
String studentNo = user.getStudentNo();
// int schoolId = user.getSchoolId();
DecodeToken decodeToken = null;
try {
decodeToken = new DecodeToken(request);
} catch (JWTDecodeException ignored) {
}
;
if (decodeToken != null) { // 需要修改
String role = decodeToken.getRole();
if (role.equals("student") && !decodeToken.getStudentNo().equals(studentNo)) {
return RespBean.error("请尝试安全操作");
}
user = userService.findUserByStudentNoSchoolId(studentNo); // 用户信息
if (user != null) {
return RespBean.ok("获取学生信息成功", user);
} else {
return RespBean.error("学生学号不存在!");
}
} else {
return RespBean.error("请先登录。");
}
}
// 通过学生学号查找学生信息 // 通过学生学号查找学生信息
@PostMapping("/findStudentByStudentNo") @PostMapping("/findStudentByStudentNo")
@ -219,12 +193,12 @@ public class UserController {
Users pmuser = userService.findStudentByusername(user.getUsername()); Users pmuser = userService.findStudentByusername(user.getUsername());
if (pmuser == null) { if (pmuser == null) {
Users u = userService.findUserByStudentNoSchoolId(user.getStudentNo()); // 用户信息 Users u = userService.findUserByStudentNo(user.getStudentNo()); // 用户信息
if (u != null) { if (u != null) {
if (StringUtils.isBlank(u.getUsername())) { if (StringUtils.isBlank(u.getUsername())) {
user.setSessionId(user.getSessionId().substring(64)); user.setSessionId(user.getSessionId().substring(64));
// user.setPassword(getBCryptPassword(user.getPassword())); // user.setPassword(getBCryptPassword(user.getPassword()));
boolean results = userService.updateSignStudent(user); boolean results = userService.updateSignStudent(user);// 更新注册数据
if (results) { if (results) {
return RespBean.ok("修改学生注册信息成功"); return RespBean.ok("修改学生注册信息成功");
} else { } else {

View File

@ -6,7 +6,9 @@ import com.example.aes.user.model.Json;
import com.example.aes.user.model.PMUser; import com.example.aes.user.model.PMUser;
import com.example.aes.user.model.Users; import com.example.aes.user.model.Users;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List; import java.util.List;
public interface UserServiceI { public interface UserServiceI {
@ -55,7 +57,7 @@ public interface UserServiceI {
public List<PMUser> findStudentsByCondition(String studentNo, public List<PMUser> findStudentsByCondition(String studentNo,
String chineseName, String stu_userName); String chineseName, String stu_userName);
public Users findUserByStudentNoSchoolId(String studentNo); public Users findUserByStudentNo(String studentNo);
public boolean updateSignStudent(PMUser user);// 修改学生注册信息 public boolean updateSignStudent(PMUser user);// 修改学生注册信息

View File

@ -374,11 +374,10 @@ public class UserServiceImpl implements UserServiceI {
} }
@Override @Override
public Users findUserByStudentNoSchoolId(String studentNo) { public Users findUserByStudentNo(String studentNo) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
// TODO Auto-generated method stub // TODO Auto-generated method stub
String hql = "from Users where studentNo='" + studentNo String hql = "from Users where studentNo='" + studentNo + "'";
+ "' and schoolId='" ;
Users user = userDao.get(hql); Users user = userDao.get(hql);
if (user != null) { if (user != null) {
return user; return user;
@ -415,8 +414,7 @@ public class UserServiceImpl implements UserServiceI {
String time = dateFormat.format(createDate); String time = dateFormat.format(createDate);
// TODO Auto-generated method stub // TODO Auto-generated method stub
String hql = "update Users set banji='" + user.getBanji() String hql = "update Users set banji='" + user.getBanji()
+ "'where studentNo='" + user.getStudentNo() + "'where studentNo='" + user.getStudentNo();
+ "' and schoolId='" ;
int result = userDao.executeHql(hql); int result = userDao.executeHql(hql);
if (result == 1) if (result == 1)
return true; return true;