diff --git a/README.MD b/README.MD index 4e92a12..0ebbbf8 100644 --- a/README.MD +++ b/README.MD @@ -1,4 +1,4 @@ -# 歧义数据管理api +# 防汛抗旱通讯录api ## 目录 ``` diff --git a/pom.xml b/pom.xml index e53098f..affaabb 100644 --- a/pom.xml +++ b/pom.xml @@ -186,6 +186,18 @@ + + + cn.dev33 + sa-token-spring-boot-starter + 1.30.0 + + + cn.dev33 + sa-token-dao-redis-jackson + 1.30.0 + + diff --git a/sql/dm_start.sql b/sql/dm_start.sql index 89c89fe..9c33537 100644 --- a/sql/dm_start.sql +++ b/sql/dm_start.sql @@ -11,7 +11,6 @@ CREATE TABLE "FXKH_TXL"."ADDRESS_BOOK" "URL" VARCHAR(200), "SORT" INTEGER DEFAULT 0, "V" INTEGER DEFAULT 0, - "ROLE" CHAR(1) DEFAULT 0, NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ; COMMENT ON TABLE "FXKH_TXL"."ADDRESS_BOOK" IS '通讯录'; @@ -21,7 +20,6 @@ COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."NAME" IS '姓名'; COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."ORGANIZATION" IS '组织'; COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."PHONE" IS '手机号'; COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."POSITION" IS '职务'; -COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."ROLE" IS '0:普通管理员,1:政区管理员,99:系统管理员'; COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."SORT" IS '序号'; COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."TEL" IS '电话'; COMMENT ON COLUMN "FXKH_TXL"."ADDRESS_BOOK"."URL" IS '图片路径'; @@ -44,13 +42,13 @@ CREATE TABLE "FXKH_TXL"."UNIT_DICT" "ID" INTEGER IDENTITY(1, 1) NOT NULL, "NAME" VARCHAR(50) NOT NULL, "SORT" INTEGER DEFAULT 0 NOT NULL, - "TYPE" CHAR(1) NOT NULL, + "O_ID" INTEGER NOT NULL, NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ; COMMENT ON TABLE "FXKH_TXL"."UNIT_DICT" IS '单位字典表'; COMMENT ON COLUMN "FXKH_TXL"."UNIT_DICT"."NAME" IS '名称'; COMMENT ON COLUMN "FXKH_TXL"."UNIT_DICT"."SORT" IS '序号'; -COMMENT ON COLUMN "FXKH_TXL"."UNIT_DICT"."TYPE" IS '1:联络名单, 2: 湖泊及涉湖泵站,3:重要提防,4:大型水库大坝'; +COMMENT ON COLUMN "FXKH_TXL"."UNIT_DICT"."O_ID" IS '组织类型Id'; CREATE TABLE "FXKH_TXL"."FC" @@ -90,11 +88,9 @@ CREATE TABLE "FXKH_TXL"."ORGANIZATION" "OBJ_ID" VARCHAR(50) NOT NULL, "NAME" VARCHAR(50) NOT NULL, "SORT" INTEGER DEFAULT 0, - "ADCD" CHAR(15) NOT NULL, NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ; COMMENT ON TABLE "FXKH_TXL"."ORGANIZATION" IS '组织表'; -COMMENT ON COLUMN "FXKH_TXL"."ORGANIZATION"."ADCD" IS '政区编码'; COMMENT ON COLUMN "FXKH_TXL"."ORGANIZATION"."NAME" IS '名称'; COMMENT ON COLUMN "FXKH_TXL"."ORGANIZATION"."OBJ_ID" IS '编号'; COMMENT ON COLUMN "FXKH_TXL"."ORGANIZATION"."SORT" IS '序号'; @@ -103,14 +99,20 @@ COMMENT ON COLUMN "FXKH_TXL"."ORGANIZATION"."SORT" IS '序号'; CREATE TABLE "FXKH_TXL"."USER" ( "ID" INTEGER IDENTITY(1, 1) NOT NULL, + "USERNAME" VARCHAR(50) NOT NULL, "PASSWORD" VARCHAR(50) NOT NULL, "SALT" VARCHAR(50), + "ROLE" CHAR(1) DEFAULT 0, "AB_ID" INTEGER, + "LAST_DATE" DATETIME(0), NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ; COMMENT ON TABLE "FXKH_TXL"."USER" IS '用户表'; COMMENT ON COLUMN "FXKH_TXL"."USER"."AB_ID" IS '通讯录id'; +COMMENT ON COLUMN "FXKH_TXL"."USER"."USERNAME" IS '用户名'; +COMMENT ON COLUMN "FXKH_TXL"."USER"."ROLE" IS '0:普通管理员,1:政区管理员,99:系统管理员'; COMMENT ON COLUMN "FXKH_TXL"."USER"."PASSWORD" IS '密码'; +COMMENT ON COLUMN "FXKH_TXL"."USER"."LAST_DATE" IS '最后登录时间'; COMMENT ON COLUMN "FXKH_TXL"."USER"."SALT" IS '盐值'; diff --git a/src/main/java/com/whdc/controller/AddressBookController.java b/src/main/java/com/whdc/controller/AddressBookController.java index 91b4924..ff817c4 100644 --- a/src/main/java/com/whdc/controller/AddressBookController.java +++ b/src/main/java/com/whdc/controller/AddressBookController.java @@ -1,12 +1,16 @@ package com.whdc.controller; +import cn.dev33.satoken.stp.StpUtil; import com.whdc.model.dto.AddressBootDto; import com.whdc.model.entity.AddressBook; +import com.whdc.model.entity.User; +import com.whdc.model.enums.Role; import com.whdc.model.enums.VersionsType; import com.whdc.model.group.Insert; import com.whdc.model.group.Update; import com.whdc.service.IAddressBookService; +import com.whdc.service.IUserService; import com.whdc.service.IVersionsService; import com.whdc.utils.ResultJson; import io.swagger.annotations.Api; @@ -32,6 +36,9 @@ public class AddressBookController { @Autowired private IAddressBookService service; + @Autowired + private IUserService userService; + @Autowired private IVersionsService versionsService; @@ -57,6 +64,15 @@ public class AddressBookController { @ApiOperation(value = "添加") @PostMapping(value = "save") public ResultJson insert(@RequestBody @Validated(Insert.class) AddressBook model) { + Integer loginId = (Integer) StpUtil.getLoginId(); + String role = userService.getRole(loginId); + + switch (Objects.requireNonNull(Role.getByName(role))) { + case R000:return ResultJson.error("权限不足"); + case R001: + case R099:break; + default:return ResultJson.error("权限不足!!"); + } if (CollectionUtils.isNotEmpty( service.lambdaQuery() @@ -68,9 +84,14 @@ public class AddressBookController { // 添加日志 versionsService.saveInfo(model,VersionsType.ADD); -// versionsService.save(new Versions(null, JSON.toJSONString(model),model.getId(),null,model.getCreateId(),new Date(), VersionsType.ADD.getName())); - return ResultJson.ok(service.save(model)); + boolean save = service.save(model); + + if (save){ + userService.register( model.getPhone(), model.getId()); + } + + return ResultJson.ok(save); } @@ -78,6 +99,22 @@ public class AddressBookController { @PostMapping(value = "edit") public ResultJson update(@RequestBody @Validated(Update.class) AddressBook model) { + Integer loginId = (Integer) StpUtil.getLoginId(); + String role = userService.getRole(loginId); + + switch (Objects.requireNonNull(Role.getByName(role))) { + case R000:{ + // 不是修改自己 + if (!model.getId().equals(loginId)){ + return ResultJson.error("权限不足"); + } + }; + case R001: + case R099:break; + default:return ResultJson.error("权限不足!!"); + } + + AddressBook byId = service.getById(model.getId()); if (Objects.isNull(byId)){ return ResultJson.error("当前数据不存在"); @@ -108,16 +145,25 @@ public class AddressBookController { // versionsService.save(new Versions(null, JSON.toJSONString(model),model.getId(),++version,model.getCreateId(),new Date(), VersionsType.UPDATE.getName())); versionsService.saveInfo(model,VersionsType.UPDATE); - // 不修改角色 - model.setRole(byId.getRole()); return ResultJson.ok(service.updateById(model)); } @ApiOperation(value = "修改权限") @PostMapping(value = "edit") - public ResultJson updateRole(@RequestBody @Validated(Update.class) AddressBook model) { + public ResultJson updateRole(@RequestBody @Validated(Update.class) User model) { - AddressBook byId = service.getById(model.getId()); + + Integer loginId = (Integer) StpUtil.getLoginId(); + String role = userService.getRole(loginId); + + switch (Objects.requireNonNull(Role.getByName(role))) { + case R000: + case R001: return ResultJson.error("权限不足"); + case R099:break; + default:return ResultJson.error("权限不足!!"); + } + + AddressBook byId = service.getById(model.getAbId()); if (Objects.isNull(byId)){ return ResultJson.error("当前数据不存在"); } @@ -137,12 +183,13 @@ public class AddressBookController { // } // // 添加日志 // versionsService.save(new Versions(null, JSON.toJSONString(model),model.getId(),++version,model.getCreateId(),new Date(), VersionsType.UPDATE_ROLE.getName())); - versionsService.saveInfo(model,VersionsType.UPDATE_ROLE); + versionsService.saveInfo(byId,VersionsType.UPDATE_ROLE); // 只修改角色 - boolean update = service.lambdaUpdate().set(AddressBook::getRole, model.getRole()) - .eq(AddressBook::getId, model.getId()) + + boolean update = userService.lambdaUpdate().set(User::getRole, model.getRole()) + .eq(User::getAbId, model.getAbId()) .update(); return ResultJson.ok(update); } @@ -153,6 +200,16 @@ public class AddressBookController { public ResultJson delete(@PathVariable("id") Integer id) { + Integer loginId = (Integer) StpUtil.getLoginId(); + String role = userService.getRole(loginId); + + switch (Objects.requireNonNull(Role.getByName(role))) { + case R000: + case R001: return ResultJson.error("权限不足"); + case R099:break; + default:return ResultJson.error("权限不足!!"); + } + AddressBook model = service.getById(id); if (Objects.isNull(model)) { diff --git a/src/main/java/com/whdc/controller/FcController.java b/src/main/java/com/whdc/controller/FcController.java index 6381138..a0e26f9 100644 --- a/src/main/java/com/whdc/controller/FcController.java +++ b/src/main/java/com/whdc/controller/FcController.java @@ -1,9 +1,12 @@ package com.whdc.controller; +import com.whdc.model.dto.FcDto; import com.whdc.model.entity.Fc; +import com.whdc.model.group.Find; import com.whdc.model.group.Insert; import com.whdc.model.group.Update; +import com.whdc.model.vo.FcVo; import com.whdc.service.IFcService; import com.whdc.utils.ResultJson; import io.swagger.annotations.Api; @@ -31,8 +34,8 @@ public class FcController { - @ApiOperation(value = "查询所有") - @PostMapping(value = "find") +// @ApiOperation(value = "查询所有") +// @PostMapping(value = "find") public ResultJson find(@RequestBody Fc dto) { return ResultJson.ok(service.find(dto)); @@ -41,7 +44,7 @@ public class FcController { @ApiOperation(value = "分页查询") @PostMapping(value = "page") - public ResultJson page(@RequestBody Fc dto) { + public ResultJson page(@RequestBody @Validated(Find.class) FcDto dto) { return ResultJson.ok(service.page(dto)); @@ -54,7 +57,8 @@ public class FcController { if (CollectionUtils.isNotEmpty( service.lambdaQuery() - .eq(Fc::getName,String.valueOf(model.getName()).trim()) + .eq(Fc::getUserId,String.valueOf(model.getUserId()).trim()) + .eq(Fc::getAbId,String.valueOf(model.getAbId()).trim()) .list()) ){ return ResultJson.error("该名称重复"); @@ -70,7 +74,8 @@ public class FcController { if (CollectionUtils.isNotEmpty( service.lambdaQuery() - .eq(Fc::getName,String.valueOf(model.getName()).trim()) + .eq(Fc::getUserId,String.valueOf(model.getUserId()).trim()) + .eq(Fc::getAbId,String.valueOf(model.getAbId()).trim()) .ne(Fc::getId, model.getId()) .list()) ){ diff --git a/src/main/java/com/whdc/controller/LoginInfoController.java b/src/main/java/com/whdc/controller/LoginInfoController.java index 1fe203c..e0b27b1 100644 --- a/src/main/java/com/whdc/controller/LoginInfoController.java +++ b/src/main/java/com/whdc/controller/LoginInfoController.java @@ -1,6 +1,7 @@ package com.whdc.controller; +import com.whdc.model.dto.FindPageDto; import com.whdc.model.entity.LoginInfo; import com.whdc.model.group.Insert; import com.whdc.model.group.Update; @@ -14,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.Date; import java.util.Objects; /** @@ -41,7 +43,7 @@ public class LoginInfoController { @ApiOperation(value = "分页查询") @PostMapping(value = "page") - public ResultJson page(@RequestBody LoginInfo dto) { + public ResultJson page(@RequestBody FindPageDto dto) { return ResultJson.ok(service.page(dto)); @@ -51,38 +53,21 @@ public class LoginInfoController { @ApiOperation(value = "添加") @PostMapping(value = "save") public ResultJson insert(@RequestBody @Validated(Insert.class) LoginInfo model) { - - if (CollectionUtils.isNotEmpty( - service.lambdaQuery() - .eq(LoginInfo::getName,String.valueOf(model.getName()).trim()) - .list()) - ){ - return ResultJson.error("该名称重复"); - } - + model.setCreateTime(new Date()); return ResultJson.ok(service.save(model)); } - @ApiOperation(value = "修改") - @PostMapping(value = "edit") +// @ApiOperation(value = "修改") +// @PostMapping(value = "edit") public ResultJson update(@RequestBody @Validated(Update.class) LoginInfo model) { - if (CollectionUtils.isNotEmpty( - service.lambdaQuery() - .eq(LoginInfo::getName,String.valueOf(model.getName()).trim()) - .ne(LoginInfo::getId, model.getId()) - .list()) - ){ - return ResultJson.error("该名称重复"); - } - return ResultJson.ok(service.updateById(model)); } - @ApiOperation(value = "删除") - @GetMapping(value = "del/{id}") +// @ApiOperation(value = "删除") +// @GetMapping(value = "del/{id}") public ResultJson delete(@PathVariable("id") Integer id) { diff --git a/src/main/java/com/whdc/controller/OrganizationController.java b/src/main/java/com/whdc/controller/OrganizationController.java index da475d9..c742e84 100644 --- a/src/main/java/com/whdc/controller/OrganizationController.java +++ b/src/main/java/com/whdc/controller/OrganizationController.java @@ -1,6 +1,7 @@ package com.whdc.controller; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.whdc.model.entity.Organization; import com.whdc.model.group.Insert; import com.whdc.model.group.Update; @@ -10,6 +11,7 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -35,7 +37,18 @@ public class OrganizationController { @PostMapping(value = "find") public ResultJson find(@RequestBody Organization dto) { - return ResultJson.ok(service.find(dto)); + LambdaQueryChainWrapper query = service.lambdaQuery(); + String name = dto.getName(); + if (StringUtils.isNotBlank(name)){ + query.like(Organization::getName,name); + } + String objId = dto.getObjId(); + if (StringUtils.isNotBlank(objId)){ + query.eq(Organization::getObjId,objId); + } + + query.orderByAsc(Organization::getSort); + return ResultJson.ok(query.list()); } diff --git a/src/main/java/com/whdc/controller/UnitDictController.java b/src/main/java/com/whdc/controller/UnitDictController.java index 23dcbf5..6d1b0dd 100644 --- a/src/main/java/com/whdc/controller/UnitDictController.java +++ b/src/main/java/com/whdc/controller/UnitDictController.java @@ -1,15 +1,20 @@ package com.whdc.controller; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.whdc.model.entity.Organization; import com.whdc.model.entity.UnitDict; +import com.whdc.model.group.Find; import com.whdc.model.group.Insert; import com.whdc.model.group.Update; +import com.whdc.service.IOrganizationService; import com.whdc.service.IUnitDictService; import com.whdc.utils.ResultJson; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -28,19 +33,34 @@ public class UnitDictController { @Autowired private IUnitDictService service; - + @Autowired + private IOrganizationService organizationService; @ApiOperation(value = "查询所有") @PostMapping(value = "find") - public ResultJson find(@RequestBody UnitDict dto) { + public ResultJson find(@RequestBody @Validated(Find.class) UnitDict dto) { + + if (Objects.isNull(organizationService.getById( dto.getOId()))) { + return ResultJson.error("组织类型Id不存在"); + } + + + LambdaQueryChainWrapper query = service.lambdaQuery(); + String name = dto.getName(); + if (StringUtils.isNotBlank(name)) { + query.like(UnitDict::getName, name); + } + query.eq(UnitDict::getOId, dto.getOId()); + + query.orderByAsc(UnitDict::getSort); + return ResultJson.ok(query.list()); - return ResultJson.ok(service.find(dto)); } - @ApiOperation(value = "分页查询") - @PostMapping(value = "page") +// @ApiOperation(value = "分页查询") +// @PostMapping(value = "page") public ResultJson page(@RequestBody UnitDict dto) { return ResultJson.ok(service.page(dto)); @@ -52,11 +72,16 @@ public class UnitDictController { @PostMapping(value = "save") public ResultJson insert(@RequestBody @Validated(Insert.class) UnitDict model) { + if (Objects.isNull(organizationService.getById( model.getOId()))) { + return ResultJson.error("组织类型Id不存在"); + } + if (CollectionUtils.isNotEmpty( service.lambdaQuery() - .eq(UnitDict::getName,String.valueOf(model.getName()).trim()) - .list()) - ){ + .eq(UnitDict::getName, String.valueOf(model.getName()).trim()) + .eq(UnitDict::getOId, String.valueOf(model.getOId()).trim()) + .list()) + ) { return ResultJson.error("该名称重复"); } @@ -68,12 +93,18 @@ public class UnitDictController { @PostMapping(value = "edit") public ResultJson update(@RequestBody @Validated(Update.class) UnitDict model) { + + if (Objects.isNull(organizationService.getById( model.getOId()))) { + return ResultJson.error("组织类型Id不存在"); + } + if (CollectionUtils.isNotEmpty( service.lambdaQuery() - .eq(UnitDict::getName,String.valueOf(model.getName()).trim()) + .eq(UnitDict::getName, String.valueOf(model.getName()).trim()) + .eq(UnitDict::getOId, String.valueOf(model.getOId()).trim()) .ne(UnitDict::getId, model.getId()) .list()) - ){ + ) { return ResultJson.error("该名称重复"); } @@ -95,5 +126,5 @@ public class UnitDictController { return ResultJson.ok(service.removeById(id)); } - + } diff --git a/src/main/java/com/whdc/controller/UserController.java b/src/main/java/com/whdc/controller/UserController.java index d795c56..f56cc7d 100644 --- a/src/main/java/com/whdc/controller/UserController.java +++ b/src/main/java/com/whdc/controller/UserController.java @@ -1,9 +1,13 @@ package com.whdc.controller; +import cn.dev33.satoken.stp.StpUtil; +import com.whdc.model.dto.LoginDto; import com.whdc.model.entity.User; import com.whdc.model.group.Insert; import com.whdc.model.group.Update; +import com.whdc.model.vo.AuthToken; +import com.whdc.model.vo.LoginVo; import com.whdc.service.IUserService; import com.whdc.utils.ResultJson; import io.swagger.annotations.Api; @@ -14,6 +18,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.lang.reflect.InvocationTargetException; +import java.util.Date; import java.util.Objects; /** @@ -30,7 +36,37 @@ public class UserController { private IUserService service; + @ApiOperation(value = "登录", notes = "登录后,从 tokenInfo 中获取 token 相关信息。headers[tokenName] = tokenValue ") + @PostMapping("doLogin") + public ResultJson doLogin(@RequestBody @Validated LoginDto obj) throws InvocationTargetException, IllegalAccessException { + LoginVo loginVo = service.login(obj); + if (loginVo == null || loginVo.getId() == null) { + return ResultJson.error("登录失败"); + } else { + StpUtil.login(loginVo.getId()); // 使用 user id 登录 + // 获取 Token 相关参数 + loginVo.setTokenInfo(new AuthToken(StpUtil.getTokenInfo())); + + // 更新最后登录时间 + service.updateLastDate(loginVo.getId()); + + return ResultJson.ok(loginVo); + } + } + + @ApiOperation(value = "查询登录状态") + @PostMapping("isLogin") + public ResultJson isLogin() { + return ResultJson.ok(StpUtil.getTokenInfo()); + } + + @ApiOperation(value = "按id踢人下线") + @PostMapping("kickout/{id}") + public ResultJson kickout(@PathVariable String id) { + StpUtil.kickout(id); + return ResultJson.ok("将用户[" + id + "]踢下线"); + } @ApiOperation(value = "查询所有") @PostMapping(value = "find") public ResultJson find(@RequestBody User dto) { @@ -48,19 +84,21 @@ public class UserController { } - @ApiOperation(value = "添加") - @PostMapping(value = "save") +// @ApiOperation(value = "注册") +// @PostMapping(value = "register") public ResultJson insert(@RequestBody @Validated(Insert.class) User model) { if (CollectionUtils.isNotEmpty( service.lambdaQuery() - .eq(User::getName,String.valueOf(model.getName()).trim()) + .eq(User::getUsername,String.valueOf(model.getUsername()).trim()) .list()) ){ return ResultJson.error("该名称重复"); } - return ResultJson.ok(service.save(model)); + + + return ResultJson.ok(service.register(model)); } @@ -70,7 +108,7 @@ public class UserController { if (CollectionUtils.isNotEmpty( service.lambdaQuery() - .eq(User::getName,String.valueOf(model.getName()).trim()) + .eq(User::getUsername,String.valueOf(model.getUsername()).trim()) .ne(User::getId, model.getId()) .list()) ){ diff --git a/src/main/java/com/whdc/mapper/FcMapper.java b/src/main/java/com/whdc/mapper/FcMapper.java index 6e596b3..8705768 100644 --- a/src/main/java/com/whdc/mapper/FcMapper.java +++ b/src/main/java/com/whdc/mapper/FcMapper.java @@ -2,6 +2,8 @@ package com.whdc.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.model.dto.FcDto; +import com.whdc.model.vo.FcVo; import org.apache.ibatis.annotations.Param; import com.whdc.model.entity.Fc; @@ -13,7 +15,7 @@ import java.util.List; */ public interface FcMapper extends BaseMapper { - IPage page(@Param("page") IPage page, @Param("dto") Fc dto); + IPage page(@Param("page") IPage page, @Param("dto") FcDto dto); List find(@Param("dto") Fc dto); diff --git a/src/main/java/com/whdc/mapper/LoginInfoMapper.java b/src/main/java/com/whdc/mapper/LoginInfoMapper.java index ac749a5..6943dd5 100644 --- a/src/main/java/com/whdc/mapper/LoginInfoMapper.java +++ b/src/main/java/com/whdc/mapper/LoginInfoMapper.java @@ -2,6 +2,7 @@ package com.whdc.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.model.dto.FindPageDto; import org.apache.ibatis.annotations.Param; import com.whdc.model.entity.LoginInfo; @@ -13,7 +14,7 @@ import java.util.List; */ public interface LoginInfoMapper extends BaseMapper { - IPage page(@Param("page") IPage page, @Param("dto") LoginInfo dto); + IPage page(@Param("page") IPage page, @Param("dto") FindPageDto dto); List find(@Param("dto") LoginInfo dto); diff --git a/src/main/java/com/whdc/mapper/UserMapper.java b/src/main/java/com/whdc/mapper/UserMapper.java index b4fe3a5..bb34555 100644 --- a/src/main/java/com/whdc/mapper/UserMapper.java +++ b/src/main/java/com/whdc/mapper/UserMapper.java @@ -2,6 +2,7 @@ package com.whdc.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.whdc.model.vo.LoginVo; import org.apache.ibatis.annotations.Param; import com.whdc.model.entity.User; @@ -16,5 +17,7 @@ public interface UserMapper extends BaseMapper { IPage page(@Param("page") IPage page, @Param("dto") User dto); List find(@Param("dto") User dto); - + + LoginVo findByLoginName(@Param("username") String username); + } \ No newline at end of file diff --git a/src/main/java/com/whdc/model/dto/FcDto.java b/src/main/java/com/whdc/model/dto/FcDto.java new file mode 100644 index 0000000..fb4a912 --- /dev/null +++ b/src/main/java/com/whdc/model/dto/FcDto.java @@ -0,0 +1,31 @@ +package com.whdc.model.dto; + +import com.whdc.model.group.Find; +import com.whdc.model.group.Insert; +import com.whdc.model.group.Update; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author xusan + * @date 2023年3月20日08:57:22 + */ +@Data +public class FcDto extends FindPageDto { + + @ApiModelProperty(value = "用户id") + @NotNull(message = "用户id不能为空", groups = {Find.class}) + private String userId; + + @ApiModelProperty(value = "类型 0:常用联系人,1:置顶联系人") + @NotNull(message = "类型不能为空", groups = {Find.class}) + private String type; + + @ApiModelProperty(value = "联系人名称") + private String name; + + @ApiModelProperty(value = "联系人手机号") + private String phone; +} diff --git a/src/main/java/com/whdc/model/dto/LoginDto.java b/src/main/java/com/whdc/model/dto/LoginDto.java new file mode 100644 index 0000000..0f37ca3 --- /dev/null +++ b/src/main/java/com/whdc/model/dto/LoginDto.java @@ -0,0 +1,21 @@ +package com.whdc.model.dto; + +import io.swagger.annotations.ApiParam; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + +/** + * @author 李赛 + * @date 2022-07-01 1:21 + */ +@Data +public class LoginDto { + @ApiParam(value = "登录名") + @NotEmpty(message = "登录名不能为空") + private String loginName; + + @ApiParam(value = "密码") + @NotEmpty(message = "密码不能为空") + private String password; +} diff --git a/src/main/java/com/whdc/model/entity/AddressBook.java b/src/main/java/com/whdc/model/entity/AddressBook.java index 6f1b234..43fed80 100644 --- a/src/main/java/com/whdc/model/entity/AddressBook.java +++ b/src/main/java/com/whdc/model/entity/AddressBook.java @@ -77,10 +77,6 @@ public class AddressBook extends Model implements Serializable { @ApiModelProperty(value = "版本") private Integer v; - @TableField("ROLE") - @ApiModelProperty(value = "0:普通管理员,1:政区管理员,99:系统管理员") - private String role; - @TableField(exist = false) @ApiModelProperty(value = "创建人id") private String createId; diff --git a/src/main/java/com/whdc/model/entity/LoginInfo.java b/src/main/java/com/whdc/model/entity/LoginInfo.java index d2eff16..2e7d6d0 100644 --- a/src/main/java/com/whdc/model/entity/LoginInfo.java +++ b/src/main/java/com/whdc/model/entity/LoginInfo.java @@ -40,6 +40,7 @@ public class LoginInfo extends Model implements Serializable { @TableField("CREATE_ID") @ApiModelProperty(value = "新增人id") + @NotNull(message = "id不能为空" , groups = {Insert.class}) private String createId; @TableField("CREATE_TIME") diff --git a/src/main/java/com/whdc/model/entity/Organization.java b/src/main/java/com/whdc/model/entity/Organization.java index d8f35f8..3082c6f 100644 --- a/src/main/java/com/whdc/model/entity/Organization.java +++ b/src/main/java/com/whdc/model/entity/Organization.java @@ -50,8 +50,4 @@ public class Organization extends Model implements Serializable { @ApiModelProperty(value = "序号") private Integer sort; - @NotEmpty(message = "政区编码不能为空", groups = {Insert.class,Update.class}) - @TableField("ADCD") - @ApiModelProperty(value = "政区编码") - private String adcd; } \ No newline at end of file diff --git a/src/main/java/com/whdc/model/entity/UnitDict.java b/src/main/java/com/whdc/model/entity/UnitDict.java index 236fc6a..f6640ab 100644 --- a/src/main/java/com/whdc/model/entity/UnitDict.java +++ b/src/main/java/com/whdc/model/entity/UnitDict.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.whdc.model.group.Find; import com.whdc.model.group.Insert; import com.whdc.model.group.Update; import io.swagger.annotations.ApiModel; @@ -46,8 +47,9 @@ public class UnitDict extends Model implements Serializable { @ApiModelProperty(value = "序号") private Integer sort; - @NotEmpty(message = "类型不能为空", groups = {Insert.class,Update.class}) - @TableField("TYPE") - @ApiModelProperty(value = "1:省防指,2: 省防办,3: 省防指成员单位,4: 市、县防指、防办, 5: 主要湖泊及涉湖泵站,6:重要提防,7: 主要蓄滞洪区,8: 大型水库大坝") - private String type; + @NotEmpty(message = "组织类型Id不能为空", groups = {Insert.class,Update.class, Find.class}) + @TableField("O_ID") +// @ApiModelProperty(value = "1:省防指,2: 省防办,3: 省防指成员单位,4: 市、县防指、防办, 5: 主要湖泊及涉湖泵站,6:重要提防,7: 主要蓄滞洪区,8: 大型水库大坝") + @ApiModelProperty(value = "组织类型Id") + private Integer OId; } \ No newline at end of file diff --git a/src/main/java/com/whdc/model/entity/User.java b/src/main/java/com/whdc/model/entity/User.java index 1e03741..296cdd9 100644 --- a/src/main/java/com/whdc/model/entity/User.java +++ b/src/main/java/com/whdc/model/entity/User.java @@ -30,9 +30,14 @@ public class User extends Model implements Serializable { @TableId(value = "ID",type = IdType.AUTO) @ApiModelProperty(value = "id") - @NotNull(message = "id不能为空" , groups = {Update.class}) +// @NotNull(message = "id不能为空" , groups = {Update.class}) private Integer id; + @NotEmpty(message = "用户名不能为空", groups = {Insert.class,Update.class}) + @TableField("USERNAME") + @ApiModelProperty(value = "用户名") + private String username; + @NotEmpty(message = "密码不能为空", groups = {Insert.class,Update.class}) @TableField("PASSWORD") @@ -45,5 +50,15 @@ public class User extends Model implements Serializable { @TableField("AB_ID") @ApiModelProperty(value = "通讯录id") + @NotEmpty(message = "通讯录id不能为空", groups = {Insert.class,Update.class}) private Integer abId; + + @TableField("LAST_DATE") + @ApiModelProperty(value = "最后登录时间") + private Date lastLoginDate; + + @TableField("ROLE") + @ApiModelProperty(value = "0:普通管理员,1:政区管理员,99:系统管理员") + private String role; + } \ No newline at end of file diff --git a/src/main/java/com/whdc/model/enums/Role.java b/src/main/java/com/whdc/model/enums/Role.java new file mode 100644 index 0000000..8777bb3 --- /dev/null +++ b/src/main/java/com/whdc/model/enums/Role.java @@ -0,0 +1,72 @@ +package com.whdc.model.enums; + +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * @author xusan + * @date 2022/7/14 16:55 + * 通讯录操作类型枚举类 + */ +public enum Role { + + R000("0", "普通管理员"), + R001("1", "政区管理员"), + R099("99", "系统管理员"); + + + private String name; + private String value; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + private Role(String name, String value) { + this.name = name; + this.value = value; + } + + public static Map map() { + Map map = new HashMap<>(); + Role[] values = Role.values(); + for (Role e : values) { + map.put(e.getValue(), e); + } + return map; + } + + public static Map mapName() { + Map map = new HashMap<>(); + Role[] values = Role.values(); + for (Role e : values) { + map.put(e.getName(), e); + } + return map; + } + + public static Role getByValue(String value) { + if (Objects.isNull(value)) return null; + return map().get(value); + } + + public static Role getByName(String name) { + if (StringUtils.isEmpty(name)) return null; + return mapName().get(name); + } +} diff --git a/src/main/java/com/whdc/model/vo/AuthToken.java b/src/main/java/com/whdc/model/vo/AuthToken.java new file mode 100644 index 0000000..53929f1 --- /dev/null +++ b/src/main/java/com/whdc/model/vo/AuthToken.java @@ -0,0 +1,44 @@ +package com.whdc.model.vo; + +import cn.dev33.satoken.stp.SaTokenInfo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.apache.commons.beanutils.BeanUtils; + +import java.lang.reflect.InvocationTargetException; + +/** + * 原 SaTokenInfo 再 swagger 中没有对应的说明,这里复制一份,加上说明 + * + * @author 李赛 + * @date 2022-07-18 8:10 + * { + * "tokenName": "satoken", // token名称 + * "tokenValue": "e67b99f1-3d7a-4a8d-bb2f-e888a0805633", // token值 + * "isLogin": true, // 此token是否已经登录 + * "loginId": "10001", // 此token对应的LoginId,未登录时为null + * "loginType": "login", // 账号类型标识 + * "tokenTimeout": 2591977, // token剩余有效期 (单位: 秒) + * "sessionTimeout": 2591977, // User-Session剩余有效时间 (单位: 秒) + * "tokenSessionTimeout": -2, // Token-Session剩余有效时间 (单位: 秒) + * "tokenActivityTimeout": -1, // token剩余无操作有效时间 (单位: 秒) + * "loginDevice": "default-device" // 登录设备类型 + * } + */ +@Data +@ApiModel("授权 token 信息") +public class AuthToken extends SaTokenInfo { + @ApiModelProperty("token 名称") + public String tokenName; + + @ApiModelProperty("token 值") + public String tokenValue; + + @ApiModelProperty("token 剩余有效期 (单位: 秒)") + public long tokenTimeout; + + public AuthToken(SaTokenInfo info) throws InvocationTargetException, IllegalAccessException { + BeanUtils.copyProperties(this, info); + } +} diff --git a/src/main/java/com/whdc/model/vo/FcVo.java b/src/main/java/com/whdc/model/vo/FcVo.java new file mode 100644 index 0000000..b85da61 --- /dev/null +++ b/src/main/java/com/whdc/model/vo/FcVo.java @@ -0,0 +1,26 @@ +package com.whdc.model.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.whdc.model.entity.AddressBook; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Author xusan + * @Date 2024/5/13 10:17 + * @Notes + **/ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@ApiModel(description = "常用联系人置顶联系人通讯录") +public class FcVo extends AddressBook{ + + + @TableField("FSORT") + @ApiModelProperty(value = "常用联系人置顶联系人序号") + private Integer fsort; +} diff --git a/src/main/java/com/whdc/model/vo/LoginVo.java b/src/main/java/com/whdc/model/vo/LoginVo.java new file mode 100644 index 0000000..2d7850f --- /dev/null +++ b/src/main/java/com/whdc/model/vo/LoginVo.java @@ -0,0 +1,39 @@ +package com.whdc.model.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * @author 李赛 + * @date 2022-07-01 1:22 + */ +@Data +@Accessors(chain = true) // chain = true 实现链式调用 +@JsonInclude(JsonInclude.Include.NON_NULL) // 表示序列化非null属性 +public class LoginVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键ID") + private Integer id; + + @ApiModelProperty(value = "类型") + private Integer type; + + @ApiModelProperty(value = "登录名") + private String loginName; + + @ApiModelProperty(value = "姓名") + private String name; + + @ApiModelProperty(value = "token 信息") + private AuthToken tokenInfo; + + @ApiModelProperty(value = "角色") + private String role; +} diff --git a/src/main/java/com/whdc/service/IFcService.java b/src/main/java/com/whdc/service/IFcService.java index 206435a..e9d6f44 100644 --- a/src/main/java/com/whdc/service/IFcService.java +++ b/src/main/java/com/whdc/service/IFcService.java @@ -2,7 +2,9 @@ package com.whdc.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.model.dto.FcDto; import com.whdc.model.entity.Fc; +import com.whdc.model.vo.FcVo; import java.util.List; @@ -16,7 +18,7 @@ import java.util.List; public interface IFcService extends IService { // 获取所有规则分页 - IPage page(Fc dto); + IPage page(FcDto dto); // 获取所有规则 List find(Fc dto); diff --git a/src/main/java/com/whdc/service/ILoginInfoService.java b/src/main/java/com/whdc/service/ILoginInfoService.java index 5433ebe..55425e7 100644 --- a/src/main/java/com/whdc/service/ILoginInfoService.java +++ b/src/main/java/com/whdc/service/ILoginInfoService.java @@ -2,6 +2,7 @@ package com.whdc.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; +import com.whdc.model.dto.FindPageDto; import com.whdc.model.entity.LoginInfo; import java.util.List; @@ -16,7 +17,7 @@ import java.util.List; public interface ILoginInfoService extends IService { // 获取所有规则分页 - IPage page(LoginInfo dto); + IPage page(FindPageDto dto); // 获取所有规则 List find(LoginInfo dto); diff --git a/src/main/java/com/whdc/service/IUserService.java b/src/main/java/com/whdc/service/IUserService.java index f870b8a..5b73902 100644 --- a/src/main/java/com/whdc/service/IUserService.java +++ b/src/main/java/com/whdc/service/IUserService.java @@ -2,7 +2,11 @@ package com.whdc.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; +import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; +import com.whdc.model.dto.LoginDto; import com.whdc.model.entity.User; +import com.whdc.model.vo.LoginVo; +import org.apache.poi.ss.formula.functions.T; import java.util.List; @@ -21,4 +25,14 @@ public interface IUserService extends IService { // 获取所有规则 List find(User dto); + LoginVo login(LoginDto obj); + + boolean register(User entity); + + String getRole(Integer id); + + boolean register(String phone, Integer abId); + + boolean updateLastDate(Integer id); + } \ No newline at end of file diff --git a/src/main/java/com/whdc/service/impl/FcServiceImpl.java b/src/main/java/com/whdc/service/impl/FcServiceImpl.java index bc4fa75..a6480f6 100644 --- a/src/main/java/com/whdc/service/impl/FcServiceImpl.java +++ b/src/main/java/com/whdc/service/impl/FcServiceImpl.java @@ -1,8 +1,11 @@ package com.whdc.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.whdc.mapper.FcMapper; +import com.whdc.model.dto.FcDto; import com.whdc.model.entity.Fc; +import com.whdc.model.vo.FcVo; import com.whdc.service.IFcService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; @@ -21,8 +24,8 @@ public class FcServiceImpl extends ServiceImpl implements IFcServi @Override - public IPage page(Fc dto) { - return baseMapper.page(new Page<>(), dto); + public IPage page(FcDto dto) { + return baseMapper.page(dto.getPage(), dto); } diff --git a/src/main/java/com/whdc/service/impl/LoginInfoServiceImpl.java b/src/main/java/com/whdc/service/impl/LoginInfoServiceImpl.java index 3fcf8e3..68b958c 100644 --- a/src/main/java/com/whdc/service/impl/LoginInfoServiceImpl.java +++ b/src/main/java/com/whdc/service/impl/LoginInfoServiceImpl.java @@ -2,6 +2,7 @@ package com.whdc.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.whdc.mapper.LoginInfoMapper; +import com.whdc.model.dto.FindPageDto; import com.whdc.model.entity.LoginInfo; import com.whdc.service.ILoginInfoService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -21,8 +22,8 @@ public class LoginInfoServiceImpl extends ServiceImpl page(LoginInfo dto) { - return baseMapper.page(new Page<>(), dto); + public IPage page(FindPageDto dto) { + return baseMapper.page(dto.getPage(), dto); } diff --git a/src/main/java/com/whdc/service/impl/UserServiceImpl.java b/src/main/java/com/whdc/service/impl/UserServiceImpl.java index 8d93e59..efe5334 100644 --- a/src/main/java/com/whdc/service/impl/UserServiceImpl.java +++ b/src/main/java/com/whdc/service/impl/UserServiceImpl.java @@ -1,13 +1,22 @@ package com.whdc.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.whdc.exception.MyException; import com.whdc.mapper.UserMapper; +import com.whdc.model.dto.LoginDto; import com.whdc.model.entity.User; +import com.whdc.model.vo.LoginVo; import com.whdc.service.IUserService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import org.springframework.util.DigestUtils; +import java.util.Date; import java.util.List; +import java.util.UUID; + /** *

@@ -19,6 +28,7 @@ import java.util.List; @Service public class UserServiceImpl extends ServiceImpl implements IUserService { + public static final String DEFAULT_PASSWORD = "Fxhk@123456"; @Override public IPage page(User dto) { @@ -33,4 +43,72 @@ public class UserServiceImpl extends ServiceImpl implements IU + @Override + public LoginVo login(LoginDto obj) { + + User sysUser = findByLoginName(obj.getLoginName()); + + if (sysUser == null) { + throw new MyException("用户名或密码错误"); + } + + if (getPassword(sysUser.getSalt() ,obj.getPassword()).equals(sysUser.getPassword())) { + LoginVo out = new LoginVo(); + BeanUtils.copyProperties(sysUser, out); + return out; + + } + + throw new MyException("用户名或密码错误"); + } + + @Override + public boolean register(User entity) { + // 生成盐值 + String salt = UUID.randomUUID().toString().replaceAll("-", ""); + // 生成密码 + entity.setSalt(salt) + .setPassword(getPassword(salt, DEFAULT_PASSWORD)); + return this.save(entity); + } + + @Override + public String getRole(Integer id) { + + User byId = this.getById(id); + if (byId == null){ + throw new MyException("该用户不存在"); + } + + return byId.getRole(); + } + + @Override + public boolean register(String phone, Integer abId) { + User user = new User(); + user.setAbId(abId) + .setUsername(phone); + return register(user); + } + + @Override + public boolean updateLastDate(Integer id) { + return this.lambdaUpdate() + .set(User::getLastLoginDate,new Date()) + .eq(User::getId,id) + .update(); + } + + private User findByLoginName(String loginName) { + if (loginName == null) { + throw new MyException("登录名不能为空"); + } + + return this.lambdaQuery().eq(User::getUsername, loginName).one(); + + } + + private String getPassword(String salt,String password) { + return DigestUtils.md5DigestAsHex((salt + password).getBytes()); + } } diff --git a/src/main/resources/mapper/FcMapper.xml b/src/main/resources/mapper/FcMapper.xml index e87a28f..b6c9947 100644 --- a/src/main/resources/mapper/FcMapper.xml +++ b/src/main/resources/mapper/FcMapper.xml @@ -3,7 +3,26 @@ - + SELECT + AB.*,F.SORT FSORT + FROM + FC F + LEFT JOIN ADDRESS_BOOK AB ON F.AB_ID = AB.ID + WHERE 1=1 + + AND F.USER_ID = #{obj.userId} + + + AND F.TYPE = #{obj.type} + + + AND AB.NAME LIKE CONCAT('%', #{obj.name}, '%') + + + AND AB.PHONE = #{obj.phone} + + ORDER BY F.SORT diff --git a/src/main/resources/mapper/LoginInfoMapper.xml b/src/main/resources/mapper/LoginInfoMapper.xml index 9d8b7c4..47df717 100644 --- a/src/main/resources/mapper/LoginInfoMapper.xml +++ b/src/main/resources/mapper/LoginInfoMapper.xml @@ -4,6 +4,18 @@ diff --git a/src/main/resources/mapper/UserMapper.xml b/src/main/resources/mapper/UserMapper.xml index ff97114..b85bff0 100644 --- a/src/main/resources/mapper/UserMapper.xml +++ b/src/main/resources/mapper/UserMapper.xml @@ -10,4 +10,19 @@ + + \ No newline at end of file