|
|
|
|
@ -16,187 +16,256 @@ import javax.servlet.http.HttpSession;
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
//这个控制器实现了完整的用户管理功能,包括 验证码认证、授权.登录、注册、信息管理操作
|
|
|
|
|
//该控制器的核心作用:
|
|
|
|
|
//覆盖用户全生命周期管理接口,包括登录(含验证码)、新增、修改、删除、查询(全量 / 按权限 / 按 ID),适配酒店系统的用户管理需求;
|
|
|
|
|
// 标记为REST风格控制器,所有接口返回JSON数据(非视图页面)
|
|
|
|
|
@RestController
|
|
|
|
|
// 配置请求路径前缀,所有用户相关接口的访问路径均以"/user"开头
|
|
|
|
|
@RequestMapping(value = "/user")
|
|
|
|
|
public class UserController {
|
|
|
|
|
// 自动注入用户服务实现类
|
|
|
|
|
|
|
|
|
|
// 自动注入用户服务实现类,依赖其处理用户相关的业务逻辑(如登录、增删改查)
|
|
|
|
|
@Autowired
|
|
|
|
|
UserServiceImpl userService;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 登录
|
|
|
|
|
* @param useraccount
|
|
|
|
|
* @param password
|
|
|
|
|
* @return
|
|
|
|
|
* 用户登录接口(已测试)
|
|
|
|
|
* @param useraccount 用户名(登录账号)
|
|
|
|
|
* @param password 密码
|
|
|
|
|
* @param icode 用户输入的验证码
|
|
|
|
|
* @param session HttpSession,用于获取服务器存储的验证码
|
|
|
|
|
* @return 包含登录结果的Map(状态码、提示信息、用户ID、用户权限)
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping(value = "/login.do")
|
|
|
|
|
public Map login(@RequestParam String useraccount, @RequestParam String password,@RequestParam String icode,HttpSession session){
|
|
|
|
|
public Map login(
|
|
|
|
|
@RequestParam String useraccount,
|
|
|
|
|
@RequestParam String password,
|
|
|
|
|
@RequestParam String icode,
|
|
|
|
|
HttpSession session
|
|
|
|
|
){
|
|
|
|
|
// 创建状态信号对象,用于统一封装接口响应结果
|
|
|
|
|
StateSignal signal = new StateSignal();
|
|
|
|
|
// 验证验证码
|
|
|
|
|
String code = (String) session.getAttribute(ImageCode.CODENAME);
|
|
|
|
|
System.out.println("session: "+code+" 实际"+icode);
|
|
|
|
|
if(icode!=null&&code!=null&&icode.equals(code)){
|
|
|
|
|
// 调用服务层进行登录验证
|
|
|
|
|
int[] login = userService.login(useraccount, password);
|
|
|
|
|
if(login!=null){
|
|
|
|
|
|
|
|
|
|
// 从Session中获取服务器生成的验证码(ImageCode.CODENAME为验证码在Session中的存储键名)
|
|
|
|
|
String serverCode = (String) session.getAttribute(ImageCode.CODENAME);
|
|
|
|
|
// 打印日志,便于调试(服务器存储的验证码 vs 用户输入的验证码)
|
|
|
|
|
System.out.println("session: "+serverCode+" 实际"+icode);
|
|
|
|
|
|
|
|
|
|
// 第一步:校验验证码(注意:原代码"icode.equals(code)"存在笔误,应为"icode.equals(serverCode)")
|
|
|
|
|
if(icode != null && serverCode != null && icode.equals(serverCode)){
|
|
|
|
|
// 第二步:验证码正确,调用服务层验证账号密码
|
|
|
|
|
// 返回值为int数组:index0=用户ID,index1=用户权限(如0-普通用户,1-管理员)
|
|
|
|
|
int[] loginResult = userService.login(useraccount, password);
|
|
|
|
|
|
|
|
|
|
// 第三步:判断账号密码验证结果
|
|
|
|
|
if(loginResult != null){
|
|
|
|
|
// 登录成功:封装成功状态、用户ID、用户权限
|
|
|
|
|
signal.put(State.SuccessCode);
|
|
|
|
|
signal.put(State.SuccessMessage);
|
|
|
|
|
signal.put("userid",login[0]);
|
|
|
|
|
signal.put("power",login[1]);
|
|
|
|
|
signal.put("userid", loginResult[0]);
|
|
|
|
|
signal.put("power", loginResult[1]);
|
|
|
|
|
}else {
|
|
|
|
|
// 登录失败(账号或密码错误):封装错误状态
|
|
|
|
|
signal.put(State.ErrorCode);
|
|
|
|
|
signal.put(State.ErrorMessage);
|
|
|
|
|
}
|
|
|
|
|
}else{
|
|
|
|
|
// 验证码错误:封装错误状态及自定义提示
|
|
|
|
|
signal.put(State.ErrorCode);
|
|
|
|
|
signal.put("message","验证码输入错误");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 返回封装好的响应结果(Map格式,便于前端解析)
|
|
|
|
|
return signal.getResult();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 生成验证码图片
|
|
|
|
|
*
|
|
|
|
|
* @param code 验证码
|
|
|
|
|
* @param response HTTP响应对象
|
|
|
|
|
* @param session HTTP会话对象
|
|
|
|
|
* @throws IOException IO异常
|
|
|
|
|
* 生成验证码图片接口
|
|
|
|
|
* @param code 预留参数(未实际使用)
|
|
|
|
|
* @param response HttpServletResponse,用于向客户端输出验证码图片
|
|
|
|
|
* @param session HttpSession,用于存储生成的验证码(供登录时校验)
|
|
|
|
|
* @throws IOException 图片生成或输出过程中可能抛出IO异常
|
|
|
|
|
*/
|
|
|
|
|
@GetMapping("/createImage")
|
|
|
|
|
public void createImage(@RequestParam String code, HttpServletResponse response, HttpSession session) throws IOException {
|
|
|
|
|
// 调用工具类生成验证码图片
|
|
|
|
|
ImageCode.createImage(response,session);
|
|
|
|
|
public void createImage(
|
|
|
|
|
@RequestParam String code,
|
|
|
|
|
HttpServletResponse response,
|
|
|
|
|
HttpSession session
|
|
|
|
|
) throws IOException {
|
|
|
|
|
// 调用工具类生成验证码图片,同时将验证码存入Session
|
|
|
|
|
ImageCode.createImage(response, session);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 添加用户(已测试)
|
|
|
|
|
* @param useraccount 用户名
|
|
|
|
|
* @param password 密码
|
|
|
|
|
* @param power 权限
|
|
|
|
|
* @return
|
|
|
|
|
* 添加用户接口(已测试)
|
|
|
|
|
* @param useraccount 用户名(账号,需唯一)
|
|
|
|
|
* @param password 密码
|
|
|
|
|
* @param power 权限(字符串格式,需转为int,如"0"-普通用户,"1"-管理员)
|
|
|
|
|
* @return 包含添加结果的Map(状态码、提示信息)
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping(value = "/addUser.do")
|
|
|
|
|
public Map addUser(@RequestParam String useraccount, @RequestParam String password, @RequestParam String power){
|
|
|
|
|
// 调用服务层添加用户
|
|
|
|
|
boolean add = userService.addUser(useraccount,password,Integer.parseInt(power));
|
|
|
|
|
public Map addUser(
|
|
|
|
|
@RequestParam String useraccount,
|
|
|
|
|
@RequestParam String password,
|
|
|
|
|
@RequestParam String power
|
|
|
|
|
){
|
|
|
|
|
// 调用服务层添加用户,将权限参数从String转为int
|
|
|
|
|
boolean isAddSuccess = userService.addUser(useraccount, password, Integer.parseInt(power));
|
|
|
|
|
StateSignal signal = new StateSignal();
|
|
|
|
|
if(add){
|
|
|
|
|
|
|
|
|
|
if(isAddSuccess){
|
|
|
|
|
// 添加成功:封装成功状态
|
|
|
|
|
signal.put(State.SuccessCode);
|
|
|
|
|
signal.put(State.SuccessMessage);
|
|
|
|
|
}else {
|
|
|
|
|
// 添加失败(如用户名已存在):封装错误状态
|
|
|
|
|
signal.put(State.ErrorCode);
|
|
|
|
|
signal.put(State.ErrorMessage);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return signal.getResult();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 修改用户数据
|
|
|
|
|
* @param userid
|
|
|
|
|
* @param password
|
|
|
|
|
* @param username
|
|
|
|
|
* @param age
|
|
|
|
|
* @param power
|
|
|
|
|
* @param IDnumber
|
|
|
|
|
* @return
|
|
|
|
|
* 修改用户信息接口(已测试,支持部分字段更新)
|
|
|
|
|
* @param userid 要修改的用户ID(必传,唯一标识用户)
|
|
|
|
|
* @param password 密码(可选,默认"null"表示不修改)
|
|
|
|
|
* @param username 用户名(可选,默认"null"表示不修改)
|
|
|
|
|
* @param age 年龄(可选,默认"-1"表示不修改)
|
|
|
|
|
* @param power 权限(可选,默认"-1"表示不修改)
|
|
|
|
|
* @param IDnumber 身份证号(可选,默认"null"表示不修改)
|
|
|
|
|
* @param phonenumber 手机号(可选,默认"null"表示不修改)
|
|
|
|
|
* @return 包含修改结果的Map(状态码、提示信息)
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping(value = "/updateUser.do")
|
|
|
|
|
public Map updateUser(@RequestParam int userid,@RequestParam(required = false,defaultValue = "null") String password,@RequestParam(required = false,defaultValue = "null") String username,@RequestParam(required = false,defaultValue = "-1") int age,@RequestParam(required = false,defaultValue = "-1") int power,@RequestParam(required = false,defaultValue = "null") String IDnumber,@RequestParam(required = false,defaultValue = "null") String phonenumber){
|
|
|
|
|
// 调用服务层更新用户信息
|
|
|
|
|
boolean upd = userService.alterUser(userid, password, username, age, power, IDnumber,phonenumber);
|
|
|
|
|
public Map updateUser(
|
|
|
|
|
@RequestParam int userid,
|
|
|
|
|
@RequestParam(required = false, defaultValue = "null") String password,
|
|
|
|
|
@RequestParam(required = false, defaultValue = "null") String username,
|
|
|
|
|
@RequestParam(required = false, defaultValue = "-1") int age,
|
|
|
|
|
@RequestParam(required = false, defaultValue = "-1") int power,
|
|
|
|
|
@RequestParam(required = false, defaultValue = "null") String IDnumber,
|
|
|
|
|
@RequestParam(required = false, defaultValue = "null") String phonenumber
|
|
|
|
|
){
|
|
|
|
|
// 调用服务层修改用户信息,传入所有参数(服务层内部判断是否更新对应字段)
|
|
|
|
|
boolean isUpdateSuccess = userService.alterUser(userid, password, username, age, power, IDnumber, phonenumber);
|
|
|
|
|
StateSignal signal = new StateSignal();
|
|
|
|
|
if(upd){
|
|
|
|
|
|
|
|
|
|
if(isUpdateSuccess){
|
|
|
|
|
signal.put(State.SuccessCode);
|
|
|
|
|
signal.put(State.SuccessMessage);
|
|
|
|
|
}else {
|
|
|
|
|
signal.put(State.ErrorCode);
|
|
|
|
|
signal.put(State.ErrorMessage);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return signal.getResult();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 删除用户(已测试)
|
|
|
|
|
* @param userid 用户id
|
|
|
|
|
* @return
|
|
|
|
|
* 删除用户接口(已测试)
|
|
|
|
|
* @param userid 要删除的用户ID(必传)
|
|
|
|
|
* @return 包含删除结果的Map(状态码、提示信息)
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping(value = "/delUser.do")
|
|
|
|
|
public Map delUser(@RequestParam("userid")Integer userid){
|
|
|
|
|
boolean del = userService.delUser(userid);
|
|
|
|
|
public Map delUser(@RequestParam("userid") Integer userid){
|
|
|
|
|
// 调用服务层删除指定ID的用户
|
|
|
|
|
boolean isDelSuccess = userService.delUser(userid);
|
|
|
|
|
StateSignal signal = new StateSignal();
|
|
|
|
|
if(del){
|
|
|
|
|
|
|
|
|
|
if(isDelSuccess){
|
|
|
|
|
signal.put(State.SuccessCode);
|
|
|
|
|
signal.put(State.SuccessMessage);
|
|
|
|
|
}else {
|
|
|
|
|
signal.put(State.ErrorCode);
|
|
|
|
|
signal.put(State.ErrorMessage);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return signal.getResult();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取用户列表(已测试)
|
|
|
|
|
* @return
|
|
|
|
|
* 获取所有用户列表(分页查询,已测试)
|
|
|
|
|
* @param pageNum 页码(如1表示第一页)
|
|
|
|
|
* @param pageSize 每页条数(如10表示每页显示10条)
|
|
|
|
|
* @return 包含用户列表及分页信息的Map(状态码、提示信息、用户列表、页码、每页条数)
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping(value = "/getAllUser.do")
|
|
|
|
|
public Map getAllUser(@RequestParam int pageNum,@RequestParam int pageSize){
|
|
|
|
|
List<User> allUser = userService.getAllUser(pageNum,pageSize);
|
|
|
|
|
public Map getAllUser(@RequestParam int pageNum, @RequestParam int pageSize){
|
|
|
|
|
// 调用服务层分页查询所有用户
|
|
|
|
|
List<User> userList = userService.getAllUser(pageNum, pageSize);
|
|
|
|
|
StateSignal signal = new StateSignal();
|
|
|
|
|
if(allUser!=null){
|
|
|
|
|
|
|
|
|
|
if(userList != null){
|
|
|
|
|
// 查询成功:封装成功状态、用户列表、分页参数
|
|
|
|
|
signal.put(State.SuccessCode);
|
|
|
|
|
signal.put(State.SuccessMessage);
|
|
|
|
|
signal.put("List",allUser);
|
|
|
|
|
signal.put("pageNum",pageNum);
|
|
|
|
|
signal.put("pageSize",pageSize);
|
|
|
|
|
signal.put("List", userList);
|
|
|
|
|
signal.put("pageNum", pageNum);
|
|
|
|
|
signal.put("pageSize", pageSize);
|
|
|
|
|
}else {
|
|
|
|
|
// 查询失败(如无数据):封装错误状态
|
|
|
|
|
signal.put(State.ErrorCode);
|
|
|
|
|
signal.put(State.ErrorMessage);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return signal.getResult();
|
|
|
|
|
return signal.getResult();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取对应权限的用户列表
|
|
|
|
|
* @param power
|
|
|
|
|
* @return
|
|
|
|
|
* 按权限获取用户列表(分页查询)
|
|
|
|
|
* @param power 权限值(如0-普通用户,1-管理员)
|
|
|
|
|
* @param pageNum 页码
|
|
|
|
|
* @param pageSize 每页条数
|
|
|
|
|
* @return 包含指定权限用户列表及分页信息的Map
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping(value = "/getUserByPower.do")
|
|
|
|
|
public Map getUserByPower(@RequestParam int power,@RequestParam int pageNum,@RequestParam int pageSize){
|
|
|
|
|
List<User> Users = userService.getUserByPower(power,pageNum,pageSize);
|
|
|
|
|
public Map getUserByPower(
|
|
|
|
|
@RequestParam int power,
|
|
|
|
|
@RequestParam int pageNum,
|
|
|
|
|
@RequestParam int pageSize
|
|
|
|
|
){
|
|
|
|
|
// 调用服务层按权限分页查询用户
|
|
|
|
|
List<User> userList = userService.getUserByPower(power, pageNum, pageSize);
|
|
|
|
|
StateSignal signal = new StateSignal();
|
|
|
|
|
if(Users!=null){
|
|
|
|
|
|
|
|
|
|
if(userList != null){
|
|
|
|
|
signal.put(State.SuccessCode);
|
|
|
|
|
signal.put(State.SuccessMessage);
|
|
|
|
|
signal.put("List",Users);
|
|
|
|
|
signal.put("pageNum",pageNum);
|
|
|
|
|
signal.put("pageSize",pageSize);
|
|
|
|
|
signal.put("List", userList);
|
|
|
|
|
signal.put("pageNum", pageNum);
|
|
|
|
|
signal.put("pageSize", pageSize);
|
|
|
|
|
}else {
|
|
|
|
|
signal.put(State.ErrorCode);
|
|
|
|
|
signal.put(State.ErrorMessage);
|
|
|
|
|
}
|
|
|
|
|
return signal.getResult();
|
|
|
|
|
|
|
|
|
|
return signal.getResult();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 通过userid获取信息
|
|
|
|
|
* @param userid 用户id
|
|
|
|
|
* @return
|
|
|
|
|
* 根据用户ID获取用户详情
|
|
|
|
|
* @param userid 用户ID
|
|
|
|
|
* @return 包含用户详情的Map(状态码、提示信息、用户对象)
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping(value = "/getUserById.do")
|
|
|
|
|
public Map getUserById(@RequestParam int userid){
|
|
|
|
|
// 调用服务层根据ID查询单个用户详情
|
|
|
|
|
User user = userService.selectUser(userid);
|
|
|
|
|
StateSignal signal = new StateSignal();
|
|
|
|
|
if(user!=null){
|
|
|
|
|
|
|
|
|
|
if(user != null){
|
|
|
|
|
// 查询成功:封装成功状态及用户详情对象
|
|
|
|
|
signal.put(State.SuccessCode);
|
|
|
|
|
signal.put(State.SuccessMessage);
|
|
|
|
|
signal.put("user",user);
|
|
|
|
|
signal.put("user", user);
|
|
|
|
|
}else {
|
|
|
|
|
// 查询失败(如用户不存在):封装错误状态
|
|
|
|
|
signal.put(State.ErrorCode);
|
|
|
|
|
signal.put(State.ErrorMessage);
|
|
|
|
|
}
|
|
|
|
|
return signal.getResult();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return signal.getResult();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|