学生注册和个人信息修改模块完成,简化了部分不必要的代码。
This commit is contained in:
parent
dc02ed8eb4
commit
399b6b3bb5
|
|
@ -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) =>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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" +
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);// 修改学生注册信息
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue