基础mybatis plus框架,调通用户登录接口, 编写新的基础框架 100%

This commit is contained in:
hupeng 2024-01-07 01:50:08 +08:00
parent 4bf73e585c
commit ea589042c2
17 changed files with 411 additions and 81 deletions

View File

@ -14,6 +14,37 @@
<version>1.0</version>
<dependencies>
<!-- spring web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.ui.version}</version>
</dependency>
<!-- jdbc 依赖 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>${c3p0.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.plus.version}</version>
</dependency>
<!-- common 依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>

View File

@ -0,0 +1,29 @@
package com.common.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
public class Base {
@TableId
@ApiModelProperty(value = "用户主键")
private Integer id;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+08:00")
@TableField("create_at")
@ApiModelProperty(value = "创建时间")
private Date createAt;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+08:00")
@TableField("update_at")
@ApiModelProperty(value = "创建时间")
private Date updateAt;
}

View File

@ -0,0 +1,30 @@
package com.common.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@TableName(value = "p_role")
public class Role extends Base{
@TableField("role_type")
@ApiModelProperty(value = "角色类型")
private String roleType;
@TableField("role_name")
@ApiModelProperty(value = "角色名称")
private String roleName;
@TableField("role_desc")
@ApiModelProperty(value = "角色描述")
private String roleDesc;
@TableField("create_by")
@ApiModelProperty(value = "角色创建人")
private String createBy;
@TableField("data_scope")
@ApiModelProperty(value="数据权限定义1-全部权限 2-本部门及以下部门 3-本部门 4-本人 5-自定义 ")
private Integer dataScope;
@ApiModelProperty(value="数据权限定义部门id集合 ")
private List<Integer> dataDeptIds;
}

View File

@ -0,0 +1,62 @@
package com.common.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@TableName(value = "p_scene")
public class Scene extends Base{
@TableField("scene_name")
@ApiModelProperty(value = "技能名称")
private String sceneName;
@TableField("scene_remark")
@ApiModelProperty(value = "备注")
private String sceneRemark;
@ApiModelProperty(value = "角色串")
private String roles;
@TableField("model_notes")
@ApiModelProperty(value = "模型说明")
private String modelNotes;
@TableField("file_url")
@ApiModelProperty(value = "文件地址")
private String fileUrl;
@ApiModelProperty(value = "版本")
private String version;
@TableField("contribution_name")
@ApiModelProperty(value = "贡献者姓名")
private String contributionName;
@TableField("scene_type")
@ApiModelProperty(value = "技能类别 1定制 2永洪 ")
private Short sceneType;
@TableField("scene_url")
@ApiModelProperty(value = "技能URL")
private String sceneUrl;
@TableField("scene_skin")
@ApiModelProperty(value = "场景皮肤")
private String sceneSkin;
@TableField("icon_url")
@ApiModelProperty(value = "icon地址")
private String iconUrl;
@TableField("create_by")
@ApiModelProperty(value = "创建人")
private String createBy;
@TableField("update_by")
@ApiModelProperty(value = "更新人")
private String updateBy;
@ApiModelProperty(value = "删除标记0-未删除 1-已删除")
private Short deleted;
@TableField("scene_operation")
@ApiModelProperty(value = "技能类型 智能脑,聪明口,灵活手,千里眼")
private String sceneOperation;
@TableField("scene_order")
@ApiModelProperty(value = "排序")
private Integer sceneOrder;
@TableField("scene_code")
@ApiModelProperty(value = "场景编码")
private String sceneCode;
@TableField("scene_tag")
@ApiModelProperty(value = "场景标签")
private String sceneTag;
}

View File

@ -0,0 +1,60 @@
package com.common.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.OffsetDateTime;
import java.util.Set;
@Data
@TableName(value = "p_user")
public class User {
@TableId
@ApiModelProperty(value = "用户主键")
private Integer id;
@TableField("user_id")
@ApiModelProperty(value = "用户编号")
private String userId;
@TableField("login_name")
@ApiModelProperty(value = "用户名(登录账号)")
private String loginName;
@TableField("login_password")
@ApiModelProperty(value = "用户密码(登录密码)")
private String loginPassword;
@TableField("user_name")
@ApiModelProperty(value = "用户姓名")
private String userName;
@TableField("mobile_number")
@ApiModelProperty(value = "手机号")
private String mobileNumber;
@TableField("police_number")
@ApiModelProperty(value = "警员编号(警号)")
private String policeNumber;
@TableField("id_number")
@ApiModelProperty(value = "身份证号")
private String idNumber;
@ApiModelProperty(value = "是否启用 0-未启用 1-启用")
private String effective;
@TableField("department_id")
@ApiModelProperty(value = "所属单位编号")
private String departmentId;
@TableField("job_title")
@ApiModelProperty(value="职称")
private String jobTitle;
@TableField("role_level")
@ApiModelProperty(value="等级0 系统用户 1 派出所 2 分局")
private String roleLevel;
@ApiModelProperty(value = "用户角色role id以逗号拼接")
private Set<String> roles;
//与实体不一致
@TableField("create_time")
@ApiModelProperty(value="角色列表")
private OffsetDateTime createTime;
@TableField("update_time")
@ApiModelProperty(value="角色列表")
private OffsetDateTime updateTime;
}

View File

@ -0,0 +1,104 @@
drop table if exists public.p_user;
create table public.p_user (
user_id varchar(32) null,
login_name varchar(500) null,
login_password varchar(500) null,
user_name varchar(500) null,
mobile_number varchar(500) null,
police_number varchar(500) not null,
id_number varchar(500) null,
effective varchar(1) null default 1,
department_id varchar(500) null,
create_time timestamp(6) null default now(),
update_time timestamp(6) null,
job_title varchar(200) null,
role_level varchar(10) not null default 1,
id int8 not null generated always as identity( minvalue 0 no maxvalue start 0 no cycle),
roles varchar(255) null,
constraint p_user_pkey primary key (id)
);
create index idx_dep on public.p_user using btree (department_id);
create index idx_dep_branch on public.p_user using btree (substr((department_id)::text, 1, 6));
create index idx_dep_station on public.p_user using btree (substr((department_id)::text, 1, 8));
create index idx_uid on public.p_user using btree (user_id);
comment on column public.p_user.user_id is '用户编号';
comment on column public.p_user.login_name is '用户名(登录账号)';
comment on column public.p_user.login_password is '用户密码(登录密码)';
comment on column public.p_user.user_name is '用户姓名';
comment on column public.p_user.mobile_number is '手机号';
comment on column public.p_user.police_number is '警员编号(警号)';
comment on column public.p_user.id_number is '身份证号';
comment on column public.p_user.effective is '是否启用:0 无效 1有效 默认 1';
comment on column public.p_user.department_id is '所属单位编号';
comment on column public.p_user.create_time is '创建时间';
comment on column public.p_user.update_time is '更新时间';
comment on column public.p_user.job_title is '职称';
comment on column public.p_user.role_level is '等级0运营 1派出所 2分局';
comment on column public.p_user.roles is 'roleid以逗号拼接';
drop table if exists public.p_role;
create table public.p_role (
id int4 not null generated always as identity( minvalue 0 no maxvalue start 0 no cycle),
role_type varchar(10) null,
role_name varchar(255) null,
role_desc varchar(255) null,
create_at date null,
create_by varchar(255) null,
update_at date null,
update_by varchar(255) null,
deleted int2 null,
data_scope int4 null
);
comment on column public.p_role.role_type is '角色类型-字典表jslx';
comment on column public.p_role.role_name is '角色名';
comment on column public.p_role.role_desc is '角色描述';
comment on column public.p_role.create_at is '创建时间';
comment on column public.p_role.create_by is '创建人';
comment on column public.p_role.update_at is '修改时间';
comment on column public.p_role.update_by is '修改人';
comment on column public.p_role.deleted is '删除标记 0-未删除 1-已删除';
comment on column public.p_role.data_scope is '数据权限定义1-全部权限 2-本部门及以下部门 3-本部门 4-本人 5-自定义';
drop table if exists public.p_scene;
create table public.p_scene (
id int4 not null generated always as identity( minvalue 0 no maxvalue start 0 no cycle),
scene_name varchar(255) null,
scene_remark varchar(500) null,
roles varchar(100) null,
model_notes varchar(1000) null,
file_url varchar(255) null,
"version" varchar(20) null,
contribution_name varchar(255) null,
scene_type int2 null,
scene_url varchar(255) null,
scene_skin varchar(16) null,
icon_url varchar(255) null,
create_at date null,
create_by varchar(255) null,
update_at date null,
update_by varchar(255) null,
deleted int2 null,
scene_operation varchar(255) null,
scene_order int4 null,
scene_code varchar(255) null,
scene_tag varchar(200) null
);
comment on column public.p_scene.scene_name is '场景名称';
comment on column public.p_scene.scene_remark is '场景说明';
comment on column public.p_scene.roles is '适用角色 逗号拼接串';
comment on column public.p_scene.model_notes is '模型逻辑说明';
comment on column public.p_scene.file_url is '文件上传路径';
comment on column public.p_scene."version" is '版本';
comment on column public.p_scene.contribution_name is '贡献者姓名';
comment on column public.p_scene.scene_type is '1定制 2永洪编排';
comment on column public.p_scene.scene_url is '场景url';
comment on column public.p_scene.icon_url is 'icon图片地址';
comment on column public.p_scene.create_at is '创建时间';
comment on column public.p_scene.create_by is '创建人';
comment on column public.p_scene.update_at is '修改时间';
comment on column public.p_scene.update_by is '更新人';
comment on column public.p_scene.deleted is '删除标记0-未删除 1-已删除';
comment on column public.p_scene.scene_operation is '智能脑,聪明口,灵活手,千里眼';
comment on column public.p_scene.scene_order is '排序';
comment on column public.p_scene.scene_code is '场景编码';
comment on column public.p_scene.scene_tag is '技能标签';

View File

@ -19,37 +19,7 @@
<groupId>com.szr</groupId>
<artifactId>common</artifactId>
</dependency>
<!-- spring web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.ui.version}</version>
</dependency>
<!-- jdbc 依赖 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>${c3p0.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.plus.version}</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>

View File

@ -0,0 +1,47 @@
package com.zbsz.aop;
import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
@Aspect
@Component
@Slf4j
public class LogAop {
@Pointcut("execution( * com.zbsz.controller..*.*(..))")
public void log() {}
@Around("log()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime=System.currentTimeMillis();
Object result=joinPoint.proceed();
log.info("Response"+ JSON.toJSON(result));
log.info("耗时:"+(System.currentTimeMillis()-startTime));
return result;
}
@Before("log()")
public void doBefore(JoinPoint joinPoint) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
log.info("==================Start=================");
log.info("URL" + request.getRequestURL().toString());
log.info("Method" + request.getMethod().toString());
log.info("Class Method" + joinPoint.getSignature().getDeclaringTypeName() + "," + joinPoint.getSignature().getName());
log.info("客户端IP" + request.getRemoteAddr());
log.info("请求参数:" + JSON.toJSON(joinPoint.getArgs()));
}
@After("log()")
public void doAfter() {
log.info("==================End=================");
}
}

View File

@ -41,9 +41,17 @@ public class Swagger2Config implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加拦截器
registry.addInterceptor(new JwtInterceptor()).addPathPatterns("/api/*")
.excludePathPatterns(
"/api/login");//放掉某些特定不需要校验token的路由
registry.addInterceptor(new JwtInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/doc.html")
.excludePathPatterns("/swagger-resources/**")
.excludePathPatterns("/webjars/**")
.excludePathPatterns("/v2/**")
.excludePathPatterns("/favicon.ico")
.excludePathPatterns("/swagger-ui.html/**")
.excludePathPatterns("/keyPerson/callBackResult")
.excludePathPatterns("/upload/**")
.excludePathPatterns("/openapi/*");//白名单
}
@Bean

View File

@ -1,7 +1,7 @@
package com.zbsz.controller;
import com.common.info.CodeMsg;
import com.zbsz.entity.User;
import com.common.entity.User;
import com.zbsz.info.LoginInfo;
import com.zbsz.info.Result;
import com.zbsz.service.UserService;
@ -10,17 +10,17 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.validation.Valid;
@Slf4j
@RestController
@RequestMapping("/auth")
@RequestMapping("/openapi")
@Api(tags = "服务接口")
public class AuthController {
public class OpenApiController {
@Resource
private UserService userService;
@ -31,20 +31,22 @@ public class AuthController {
*/
@ApiOperation(value = "登录",notes = "登录服务")
@PostMapping("login")
public Result login(@Valid LoginInfo info) {
public Result login(@RequestBody LoginInfo info) {
Result result = new Result();
try {
User user = userService.lambdaQuery().eq(User::getName,info.getUserName()).eq(User::getPassWord,info.getPassWord()).one();
User user = userService.lambdaQuery().eq(User::getLoginName,info.getUserName()).eq(User::getLoginPassword,info.getPassWord()).one();
if(user!=null){
result.setCode(CodeMsg.SUCCESS.getCode());
result.setMsg(CodeMsg.SUCCESS.getMessage());
result.setData(JwtTool.getToken(info.getUserName()));
log.error("-------- 登录成功 ");
}else {
result.setCode(CodeMsg.AUTH_FAILURE.getCode());
result.setMsg(CodeMsg.AUTH_FAILURE.getMessage());
result.setData(JwtTool.getToken(info.getUserName()));
log.error("-------- 登录失败,用户名或者密码错误");
}
}catch (Exception e){
log.error("-------- AuthController login 异常 : "+e.getMessage(),e);
log.error("-------- 登录异常 : "+e.getMessage(),e);
result.setCode(CodeMsg.FAILURE.getCode());
result.setMsg(e.getMessage());
}

View File

@ -1,18 +0,0 @@
package com.zbsz.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName(value = "user")
public class User {
@TableId
private Long id;
private String name;
@TableField("pass_word")
private String passWord;
private Integer age;
private String email;
}

View File

@ -1,6 +1,7 @@
package com.zbsz.filter;
import com.alibaba.fastjson2.JSONObject;
import com.common.info.CodeMsg;
import com.zbsz.info.Result;
import com.zbsz.tool.JwtTool;
import lombok.extern.slf4j.Slf4j;
@ -27,24 +28,18 @@ public class JwtInterceptor implements HandlerInterceptor {
//验证token
if(JwtTool.verify(token)){
String userName = JwtTool.getUsername(token);
request.setAttribute("token.user",userName);
return true;
}else{
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
Result result = new Result();
// if (token == null) {
// result.setCode(CodeMsg.TOKEN_NULL.getCode());
// result.setMsg(CodeMsg.TOKEN_NULL.getMessage());
// LogTool.Error.error("token == null ------------------- : 用户未登录");
// }else{
// result.setCode(CodeMsg.TOKEN_FAILED.getCode());
// result.setMsg(CodeMsg.TOKEN_FAILED.getMessage());
// LogTool.Error.error("JwtTool.verify(token) ------------------- : 认证token已过期");
// }
result.setCode(CodeMsg.AUTH_FAILURE.getCode());
result.setMsg(CodeMsg.AUTH_FAILURE.getMessage());
if (token == null) {
log.error("-------- 票据丢失,请重新登录");
}else{
log.error("-------- 票据认证失败,请重新登录");
}
PrintWriter out = null;
try {
out = response.getWriter();

View File

@ -6,8 +6,8 @@ import javax.validation.constraints.NotBlank;
@Data
public class LoginInfo {
@NotBlank(message = "用户名称不能为空")
@NotBlank(message = "用户不能为空")
private String userName; //操作人名称
@NotBlank(message = "用户密码不能为空")
@NotBlank(message = "密码不能为空")
private String passWord; //操作人密码
}

View File

@ -5,11 +5,11 @@ import lombok.Data;
@Data
public class Result {
@ApiModelProperty(value = "返回码")
@ApiModelProperty(value = "返回码200表示成功其它表示失败")
private Integer code;
@ApiModelProperty(value = "返回成功、失败信息")
private String msg;
@ApiModelProperty(value = "返回json对象信息")
@ApiModelProperty(value = "返回接口对接数据信息")
private Object data;
@ApiModelProperty(value = "返回总条数")
private Long total;

View File

@ -1,7 +1,7 @@
package com.zbsz.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zbsz.entity.User;
import com.common.entity.User;
public interface UserMapper extends BaseMapper<User> {
}

View File

@ -1,8 +1,7 @@
package com.zbsz.service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zbsz.entity.User;
import com.zbsz.mapper.UserMapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.common.entity.User;
public class UserService extends ServiceImpl<UserMapper, User> {
public interface UserService extends IService<User> {
}

View File

@ -0,0 +1,11 @@
package com.zbsz.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.common.entity.User;
import com.zbsz.mapper.UserMapper;
import com.zbsz.service.UserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}