一、实现逻辑
Controller接收来自前端的请求,再通过调用Service层的add()方法,实现员工的新增。
二、具体实现之基础准备
1、编写员工新增请求 EmployeeAddReq.java
@Getter
@Setter
@ApiModel(value = "新增员工模型")
public class EmployeeAddReq {
/**
* 登录账户
*/
@Pattern(regexp = "^1[3|4|5|7|8][0-9]{9}$",message = "账号格式为手机,只支持13\14\15\17\18")
@NotBlank(message = "登录账户不能为空")
@ApiModelProperty(value = "登录账户")
private String loginName;
/**
* 登录密码
*/
@NotBlank(message = "登录密码不能为空")
@ApiModelProperty(value = "登录密码")
@Length(min = 4,max = 30,message = "密码要在4-30个字符之间")
private String loginPwd;
/**
* 确认密码
*/
@ApiModelProperty(value = "确认密码")
private String loginPwdConfirm;
/**
* 性别(0 女 1 男)
*/
@NotBlank(message = "性别不能为空")
@ApiModelProperty(value = "性别(0 女 1 男)")
private String gender;
/**
* 状态(1停用,0正常)
*/
@NotBlank(message = "状态不能为空")
@ApiModelProperty(value = "状态(1停用,0正常)")
private String status;
/**
* 头像
*/
@NotBlank(message = "头像不能为空")
@ApiModelProperty(value = "头像")
private String avatar;
}
备注:手机号的正则表达式可以在网上搜,任意更改。同时,新增需要使用NotBlank注解进行非空校验。
2、统一响应模型 R.java
@Getter
@Setter
public class R<T>{
private Integer code;
private String msg;
private T data;
public synchronized static <T> R<T> build(AckCode statusEnum) {
return build(statusEnum, null);
}
public synchronized static <T> R<T> build(AckCode ackCode, T data) {
R<T> res = new R<>();
res.setCode(ackCode.getCode());
res.setMsg(ackCode.getMsg());
res.setData(data);
return res;
}
public synchronized static <T> R<T> build(AckCode ackCode, T data, String msg) {
R<T> res = new R<>();
res.setCode(ackCode.getCode());
res.setMsg(msg);
res.setData(data);
return res;
}
public synchronized static <T> R<T> ok() {
return build(AckCode.SUCCESS, null);
}
public synchronized static <T> R<T> okHasData(T data) {
return build(AckCode.SUCCESS, data);
}
}
3、返回消息内容枚举 AckCode.java
@NoArgsConstructor
@AllArgsConstructor
public enum AckCode {
/**
* 通用提示
**/
COMMON_FRE_OPERATION(203, "服务器频繁,请重试"),
RATE_LIMATE(201,"访问过于频繁,请稍候再试"),
DATABASE_ERROR(204,"数据库操作失败"),
JSON_CONVERT_ERROR(205,"JSON序列化失败"),
VALIDATE_UNIQUE_ERROR(206,"数据唯一性的验证错误"),
/*-----Basic-----*/
SUCCESS(200, "ok"),
EXISTS_VALUE(506,"该值已被使用"),
EXISTS_VALUE_ACCOUNT(507,"账户已被使用"),
EXISTS_VALUE_EMAIL(508,"邮箱已被使用"),
EXISTS_VALUE_PHONE(509,"手机号已被使用"),
FAIL(500, "fail"),
SYSTEM_PARAM_FAIL(400, "参数错误"),
SYSTEM_TOKEN_FAIL(401, "会话无效,请重新登录"),
SYSTEM_SIGNATURE_FAIL(402, "签名错误"),
SYSTEM_DATA_FAIL(500, "系统数据异常"),
SYSTEM_SERVER_BUSY(501, "服务器繁忙"),
SYSTEM_SERVER_MAINTAINING(503, "系统维护中"),
NOT_FOUND_DATA(504, "查询不到数据"),
NO_PERMISSION_TO_ACCESS(505, "只有管理员才有访问该请求的权限"),
PERMISSION_NOT_NULL(506,"RequiredPermission权限标识不允许为空"),
PERMISSION_NOT_ACCESS(507,"没有权限访问该接口"),
PERMISSION_NOT_STATE_EDIT(508,"没有权限修改用户状态"),
PERMISSION_NOT_PASSWORD_EDIT(508,"没有权限修改密码"),
PERMISSION_NOT_ACCESS_CATEGORY(509,"没有权限访问其它商家的数据"),
/*-------------------登录-------------------*/
LOGIN_URL_ERROR(600, "登录回调路径错误"),
JPUSH_LOGIN_ERROR(601, "极光登录失败,请重新登录"),
ALIYUN_LOGIN_ERROR(602, "阿里云登录失败,请重新登录"),
GENDER_TYPE_ERROR(603, "性别类型错误"),
DEVICE_NOT_EXIST(604, "设备不存在"),
DEVICE_REGISTER_TOO_MUCH(605, "一个设备只能注册10个账号"),
// LOGIN_BANNED(606, "账号ID:*已被锁定,请联系客服。\n客服QQ:80056867"),
LOGIN_BANNED(606, "您的账号因违规操作现已被%s,如有疑问,请联系客服!客服QQ:80056867"),
WITHDRAW_BANNED(607, "提现受限,请联系客服"),
LOG_OFF(608, "您账号已经注销"),
DEVICE_BANNED(609, "帐号异常:*已被锁定,请联系客服。\n客服QQ:80056867"),
APPLE_EXPIRED(610, "token过期"),
APPLE_ILLEGAL(611, "token非法"),
APPLE_FAIL(612, "token验证失败"),
INVITATION_CODE_ERROR(613, "邀请码不正确"),
TOKEN_FAIL(614,"令牌过期"),
USERNAME_NOT_BLANK(615,"用户名不能为空"),
PASSWORD_NOT_BLANK(616,"密码不能为空"),
CODE_NOT_BLANK(617,"验证码不能为空"),
CODEUUID_NOT_BLANK(618,"验证码标识不能为空"),
CODE_NOT_FOUND(620,"验证码过期,请重新获取"),
CODE_ERROR(621,"验证码错误"),
TOKEN_NOT_BLANK(619,"令牌不能为空"),
ACCOUNT_LOGIN_OTHER_DEVICES(622,"该账号在其它地方登录"),
/*-----User (StartCode: 1000)--------------*/
USER_PASSWORD_ERROR(1000, "密码错误"),
USER_NOT_FOUND(1001, "用户不存在"),
USER_HAS_ACCOUNT(1016, "该账户已存在"),
USER_PAY_ACCOUNT_IS_BIND(1017, "支付账户已绑定"),
USER_LOGIN_ACCOUNT_IS_BIND(1018, "该登录账户已绑定"),
USER_ACCOUNT_AUTH_EXCEPTION(1019, "认证查询异常,接口调用失败"),
USER_PAY_IS_FAIL(1020, "支付失败"),
USER_PAY_IS_EXCEPTION(1021, "支付异常"),
USER_WITHDRAW_LIMIT(1022, "提现受限"),
USER_ACCOUNT_IS_NOT_BIND(1023, "支付账户未绑定"),
USER_ACCOUNT_IS_NOT_FOUND(1024, "未找到支付账户"),
USER_PARAM_IS_NOT_NULL(1025, "参数不能为空"),
USER_ACCOUNT_UPDATE_COUNT_LIMIT(1026, "账户修改次数当月达到上限"),
USER_FIRST_CHARGE_COUNT_LIMIT(1027, "首充已达上限"),
USER_WITHDRAW_STATUS_ERROR(1028, "只有未审核的才能进行操作哟"),
USER_VIOLATION(1034, "用户涉嫌违规"),
USER_IS_NOT_MAN(1035, "抱歉您不是男用户"),
USER_LOG_OFF(1036, "用户已注销"),
USER_FACE_VERIFY(1037, "您已真人认证"),
USER_BANNED(1038, "该用户已被封禁"),
FAMILY_SHARE_LINK_IS_EXPIRE(1114, "家族分享链接已过期"),
LOGIN_ACCOUNT_PASSWORD_ERROR(1115, "账号或密码错误"),
LOGIN_PASSWORD_ERROR(1116, "密码错误"),
LOGIN_PASSWORD_INVALID(1117, "密码不正确"),
SET_PASSWORD_INVALID(1118, "两次输入密码不一致"),
OLD_PASSWORD_NOTNULL(1119, "原密码不能为空"),
OLD_PASSWORD_INVALID(1120, "原密码不正确"),
OLD_PASSWORD_ERROR(1121, "原密码错误"),
PHONE_NUMBER_SET_ACCOUNT_INVALID(1122, "该手机号码已经被其他用户绑定"),
PLEASE_BIND_PHONE_NUMBER(1123, "请先绑定手机号码"),
PHONE_NUMBER_NOTNULL(1124, "手机号码不能为空"),
PASSWORD_VERIFY_FAILED(1125, "密码必须是6~16位的数字、字母组合"),
BUY_LIMIT(1126, "购买受限"),
TOKEN_SAVE_ERROR(1127,"保留令牌失败"),
USERNAME_PASSWORD_ERROR(1128,"用户名或密码错误"),
NOT_MODIFY_OTHER_USER(1129,"你不允许修改别人的数据"),
PHONE_NUMBER_ERROR(1130, "手机号码格式不正确,只支持(13|14|15|17|18|19)开头的"),
USERNAME_EXISTS_MOBILE(1131,"用户名存在,要使用手机号再次协助认证"),
MOBILE_ERROR(1132,"登录的手机号错误"),
USER_UPDATE_TOKEN_ERROR(1133,"更新数据库的令牌失败")
private Integer code;
private String msg;
/**
* 获取所有回复码
*
* @return
*/
public static LinkedHashMap<Integer, String> getArrayMessage() {
LinkedHashMap<Integer, String> responseMessages = new LinkedHashMap<>();
for (AckCode statusEnum : AckCode.values()) {
responseMessages.put(statusEnum.code, statusEnum.msg);
}
return responseMessages;
}
public Integer getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
三、具体逻辑实现
1、Controller层
接收前端的请求,判断两次密码是否输的一致,如果不是一致的,直接返回消息,提示两次输入密码不一致,如果一致就调用add方法实现新增,如果新增成功则用200表示,否则提示数据库操作失败,即新增失败!
@RestController
@RequestMapping(value = "/api/employee")
@Api(tags = "后台-员工Api")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@ApiOperation(value = "新增")
@PostMapping
public R add(@RequestBody @Valid EmployeeAddReq req){
if (!req.getLoginPwd().equals(req.getLoginPwdConfirm())){
return R.build(AckCode.SET_PASSWORD_INVALID);
}
boolean result=this.employeeService.add(req);
return result?R.ok():R.build(AckCode.DATABASE_ERROR);
}
}
2、Service层
1)EmployeeService.java
/**
* 员工新增
* @param req
* @return
*/
boolean add(EmployeeAddReq req);
2)EmployeeServiceImpl.java
逻辑:通过LambdaQueryWrapper构建查询条件来验证账号(手机号)的唯一性(即账号是否已经存在),在账号不存在的情况下,实现新增操作。
/**
* 新增
* @param req
* @return
*/
@Override
public boolean add(EmployeeAddReq req) {
//验证手机唯一性 select count(0) from employee where login_name=?
//构建一个查询语句 相当于select * from employee
LambdaQueryWrapper<Employee> queryWrapper=new LambdaQueryWrapper<>();
//构建一个查询条件 where login_name=req.loginName?
queryWrapper.eq(Employee::getLoginName,req.getLoginName());
//计算个数
Long count = super.baseMapper.selectCount(queryWrapper);
if (count.intValue()>0){
throw new ServiceException(AckCode.EXISTS_VALUE_ACCOUNT);
}
Employee employee = new Employee();
//对象值copy
BeanUtils.copyProperties(req,employee);
employee.setRoot("0");
employee.setCreateTime(new Date());
employee.setCreateBy("管理员");
//密码要加密
String md5Pwd= BCrypt.hashpw(req.getLoginPwd());
employee.setLoginPwd(md5Pwd);
return super.save(employee);
}