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

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 {
login: (data) => request.post('/login/student', data, { noNeedToken: true }),
getAccount: () => request.get('/account'),
findStudentByStudentNo: (data) =>
request.post('/user/findStudentByStudentNo', data, { noNeedToken: true }),
findStudentByusername: (data) => //依据用户名获取学生信息
request.post('/user/findStudentByusername', data, { noNeedToken: true }),
confirmQuestionAnswer: (data) =>
request.post('/user/confirmQuestionAnswer', data, { noNeedToken: true }),
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() {
return isAdminEnd() ? this.adminInfo.id : this.userInfo.id
},
getSchoolId() {
return isAdminEnd() ? this.adminInfo.schoolId : this.userInfo.schoolId
},
getRole() {
return (isAdminEnd() ? this.adminInfo.role : this.userInfo.role) || []
},
// 获取包括User端用户和Admin端用户账户信息
async getAccountInfo() {
const res = await api.getAccount()
const { username, name, role, id, schoolId } = res.data
const { username, name, role, id} = res.data
try {
if (isAdminEnd()) {
this.adminInfo = { username, name, role: [role], id, schoolId }
this.adminInfo = { username, name, role: [role], id}
} else {
this.userInfo = { username, name, role: [role], id, schoolId }
this.userInfo = { username, name, role: [role], id}
}
return Promise.resolve(res.data)

View File

@ -100,5 +100,17 @@ export default {
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"
>
<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-input
v-model:value="formValue.studentNo"
@ -94,7 +85,6 @@ const router = useRouter()
const loading = ref(false)
const formRef = ref(null)
const formValue = ref({
schoolId: null,
studentNo: '',
chineseName: '',
banji: '',
@ -108,7 +98,6 @@ const formValue = ref({
const schoolOptions = ref([])
const formRules = {
schoolId: requiredRule('学校'),
studentNo: requiredRule('学号'),
chineseName: requiredRule('姓名'),
banji: requiredRule('班级'),
@ -120,16 +109,6 @@ const formRules = {
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 { studentNo } = formValue.value
const studentNoVal = studentNo.trim()

View File

@ -21,7 +21,7 @@ public class HttpInterceptorConfig extends WebMvcConfigurationSupport {
.addPathPatterns("/api/**") //拦截所有请求,判断token是否合法决定是否需要登录
.excludePathPatterns("/api/login/student","/api/login/admin","/api/login","/api/user/signUser",
"/api/user" +
"/findUserByStudentNoSchoolId","/api/school/getSchoolByName","/api/adminusers/findAdminuserByno","/api/adminusers/findAdminuserByAccountInRePwInfo",
"/findStudentByusername","/api/user/findStudentByStudentNo","/api/adminusers/findAdminuserByno","/api/adminusers/findAdminuserByAccountInRePwInfo",
"/api/adminusers" +
"/signTeacher",
"/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")
@ -219,12 +193,12 @@ public class UserController {
Users pmuser = userService.findStudentByusername(user.getUsername());
if (pmuser == null) {
Users u = userService.findUserByStudentNoSchoolId(user.getStudentNo()); // 用户信息
Users u = userService.findUserByStudentNo(user.getStudentNo()); // 用户信息
if (u != null) {
if (StringUtils.isBlank(u.getUsername())) {
user.setSessionId(user.getSessionId().substring(64));
// user.setPassword(getBCryptPassword(user.getPassword()));
boolean results = userService.updateSignStudent(user);
boolean results = userService.updateSignStudent(user);// 更新注册数据
if (results) {
return RespBean.ok("修改学生注册信息成功");
} else {

View File

@ -116,7 +116,7 @@ public class UserDaoImpl extends BaseDaoImpl<Users> implements UserDaoI {
@Override
public Users getUserByUsername(String username) {
String hql = "from Users where username= '" + username + "'";
String hql = "from Users where username= '" + username + "'";
return this.get(hql);
}

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

View File

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