diff --git a/Pinnacle/src/main/java/com/cfive/pinnacle/controller/StaffController.java b/Pinnacle/src/main/java/com/cfive/pinnacle/controller/StaffController.java index a158515..f7f9b43 100644 --- a/Pinnacle/src/main/java/com/cfive/pinnacle/controller/StaffController.java +++ b/Pinnacle/src/main/java/com/cfive/pinnacle/controller/StaffController.java @@ -1,7 +1,16 @@ package com.cfive.pinnacle.controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import com.cfive.pinnacle.entity.common.ResponseCode; +import com.cfive.pinnacle.entity.common.ResponseResult; +import com.cfive.pinnacle.entity.permission.User; +import com.cfive.pinnacle.service.IStaffService; +import com.cfive.pinnacle.utils.WebUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; /** *

@@ -11,8 +20,31 @@ import org.springframework.web.bind.annotation.RestController; * @author FatttSnake * @since 2023-04-30 */ +@Slf4j @RestController @RequestMapping("/staff") public class StaffController { + private IStaffService staffService; + @Autowired + public void setStaffService(IStaffService staffService) { + this.staffService = staffService; + } + + @GetMapping + @PreAuthorize("hasAnyAuthority('staff:manege:get', 'staff:admin:get')") + public ResponseResult> getAllStaff() { + return ResponseResult.databaseSelectSuccess(staffService.getAllStaff(WebUtil.hasAuthority("staff:admin:get") ? null : WebUtil.getLoginUser().getUser().getDepartmentId())); + } + + @PutMapping + @PreAuthorize("hasAnyAuthority('staff:manege:modify', 'staff:admin:modify')") + public ResponseResult modifyStaff(@RequestBody User user) { + log.info(user.toString()); + if (staffService.modifyStaff(user)) { + return ResponseResult.databaseUpdateSuccess(null); + } else { + return ResponseResult.build(ResponseCode.DATABASE_SAVE_ERROR, "error", null); + } + } } diff --git a/Pinnacle/src/main/java/com/cfive/pinnacle/entity/Staff.java b/Pinnacle/src/main/java/com/cfive/pinnacle/entity/Staff.java index 54a449b..87b55aa 100644 --- a/Pinnacle/src/main/java/com/cfive/pinnacle/entity/Staff.java +++ b/Pinnacle/src/main/java/com/cfive/pinnacle/entity/Staff.java @@ -1,10 +1,6 @@ package com.cfive.pinnacle.entity; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.*; import java.io.Serial; import java.io.Serializable; @@ -63,7 +59,7 @@ public class Staff implements Serializable { /** * 生日 */ - @TableField("birth") + @TableField(value = "birth",updateStrategy = FieldStrategy.IGNORED) private LocalDate birth; /** diff --git a/Pinnacle/src/main/java/com/cfive/pinnacle/entity/common/ResponseCode.java b/Pinnacle/src/main/java/com/cfive/pinnacle/entity/common/ResponseCode.java index 1df3559..e9dd3ba 100644 --- a/Pinnacle/src/main/java/com/cfive/pinnacle/entity/common/ResponseCode.java +++ b/Pinnacle/src/main/java/com/cfive/pinnacle/entity/common/ResponseCode.java @@ -23,6 +23,7 @@ public class ResponseCode { public static final int DATABASE_TIMEOUT_ERROR = 20035; public static final int DATABASE_CONNECT_ERROR = 20036; public static final int DATABASE_DATA_TO_LONG = 20037; + public static final int DATABASE_DATA_VALIDATION_FAILED = 20038; public static final int UNAUTHORIZED = 30010; public static final int ACCESS_DENIED = 30030; diff --git a/Pinnacle/src/main/java/com/cfive/pinnacle/entity/permission/User.java b/Pinnacle/src/main/java/com/cfive/pinnacle/entity/permission/User.java index 586a702..9e093d3 100644 --- a/Pinnacle/src/main/java/com/cfive/pinnacle/entity/permission/User.java +++ b/Pinnacle/src/main/java/com/cfive/pinnacle/entity/permission/User.java @@ -9,6 +9,7 @@ import java.io.Serial; import java.io.Serializable; import java.util.List; +import com.cfive.pinnacle.entity.Department; import com.cfive.pinnacle.entity.Staff; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; @@ -54,6 +55,9 @@ public class User implements Serializable { @JsonSerialize(using = ToStringSerializer.class) private Long departmentId; + @TableField(exist = false) + private Department department; + /** * 启用 */ diff --git a/Pinnacle/src/main/java/com/cfive/pinnacle/exception/DataValidationFailedException.java b/Pinnacle/src/main/java/com/cfive/pinnacle/exception/DataValidationFailedException.java new file mode 100644 index 0000000..0b9c1f3 --- /dev/null +++ b/Pinnacle/src/main/java/com/cfive/pinnacle/exception/DataValidationFailedException.java @@ -0,0 +1,23 @@ +package com.cfive.pinnacle.exception; + +public class DataValidationFailedException extends RuntimeException{ + public DataValidationFailedException() { + super("Data validation failed"); + } + + public DataValidationFailedException(String message) { + super(message); + } + + public DataValidationFailedException(String message, Throwable cause) { + super(message, cause); + } + + public DataValidationFailedException(Throwable cause) { + super(cause); + } + + public DataValidationFailedException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/Pinnacle/src/main/java/com/cfive/pinnacle/handler/CustomExceptionHandler.java b/Pinnacle/src/main/java/com/cfive/pinnacle/handler/CustomExceptionHandler.java index f135950..b088569 100644 --- a/Pinnacle/src/main/java/com/cfive/pinnacle/handler/CustomExceptionHandler.java +++ b/Pinnacle/src/main/java/com/cfive/pinnacle/handler/CustomExceptionHandler.java @@ -2,6 +2,7 @@ package com.cfive.pinnacle.handler; import com.cfive.pinnacle.entity.common.ResponseCode; import com.cfive.pinnacle.entity.common.ResponseResult; +import com.cfive.pinnacle.exception.DataValidationFailedException; import lombok.extern.slf4j.Slf4j; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.DuplicateKeyException; @@ -32,6 +33,9 @@ public class CustomExceptionHandler { if (e instanceof DataIntegrityViolationException) { return ResponseResult.build(ResponseCode.DATABASE_DATA_TO_LONG, e.getMessage(), null); } + if (e instanceof DataValidationFailedException) { + return ResponseResult.build(ResponseCode.DATABASE_DATA_VALIDATION_FAILED, e.getMessage(), null); + } log.debug(e.getMessage(), e); diff --git a/Pinnacle/src/main/java/com/cfive/pinnacle/mapper/StaffMapper.java b/Pinnacle/src/main/java/com/cfive/pinnacle/mapper/StaffMapper.java index c2c51b3..8de6374 100644 --- a/Pinnacle/src/main/java/com/cfive/pinnacle/mapper/StaffMapper.java +++ b/Pinnacle/src/main/java/com/cfive/pinnacle/mapper/StaffMapper.java @@ -2,7 +2,11 @@ package com.cfive.pinnacle.mapper; import com.cfive.pinnacle.entity.Staff; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cfive.pinnacle.entity.permission.User; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** *

@@ -14,5 +18,5 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface StaffMapper extends BaseMapper { - + List getAllStaff(@Param("departmentId")Long departmentId); } diff --git a/Pinnacle/src/main/java/com/cfive/pinnacle/service/IStaffService.java b/Pinnacle/src/main/java/com/cfive/pinnacle/service/IStaffService.java index 7a4ea3c..fee3c57 100644 --- a/Pinnacle/src/main/java/com/cfive/pinnacle/service/IStaffService.java +++ b/Pinnacle/src/main/java/com/cfive/pinnacle/service/IStaffService.java @@ -2,6 +2,9 @@ package com.cfive.pinnacle.service; import com.cfive.pinnacle.entity.Staff; import com.baomidou.mybatisplus.extension.service.IService; +import com.cfive.pinnacle.entity.permission.User; + +import java.util.List; /** *

@@ -12,5 +15,7 @@ import com.baomidou.mybatisplus.extension.service.IService; * @since 2023-04-30 */ public interface IStaffService extends IService { + List getAllStaff(Long departmentId); + boolean modifyStaff(User user); } diff --git a/Pinnacle/src/main/java/com/cfive/pinnacle/service/impl/StaffServiceImpl.java b/Pinnacle/src/main/java/com/cfive/pinnacle/service/impl/StaffServiceImpl.java index bd1b0a4..9970c65 100644 --- a/Pinnacle/src/main/java/com/cfive/pinnacle/service/impl/StaffServiceImpl.java +++ b/Pinnacle/src/main/java/com/cfive/pinnacle/service/impl/StaffServiceImpl.java @@ -1,11 +1,19 @@ package com.cfive.pinnacle.service.impl; import com.cfive.pinnacle.entity.Staff; +import com.cfive.pinnacle.entity.permission.User; +import com.cfive.pinnacle.exception.DataValidationFailedException; import com.cfive.pinnacle.mapper.StaffMapper; +import com.cfive.pinnacle.mapper.permission.UserMapper; import com.cfive.pinnacle.service.IStaffService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.cfive.pinnacle.utils.WebUtil; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; +import java.util.Objects; + /** *

* 员工 服务实现类 @@ -16,5 +24,41 @@ import org.springframework.stereotype.Service; */ @Service public class StaffServiceImpl extends ServiceImpl implements IStaffService { + private StaffMapper staffMapper; + private UserMapper userMapper; + @Autowired + public void setStaffMapper(StaffMapper staffMapper) { + this.staffMapper = staffMapper; + } + + @Autowired + public void setUserMapper(UserMapper userMapper) { + this.userMapper = userMapper; + } + + @Override + public List getAllStaff(Long departmentId) { + return staffMapper.getAllStaff(departmentId); + } + + @Override + public boolean modifyStaff(User user) { + Staff newStaff = user.getStaff(); + user = userMapper.getOneById(user.getId()); + Staff oldStaff = user.getStaff(); + if (!WebUtil.hasAuthority("staff:admin:modify")) { + if (!Objects.equals(user.getDepartmentId(), WebUtil.getLoginUser().getUser().getDepartmentId())) { + throw new DataValidationFailedException(); + } + } + if (oldStaff == null) { + newStaff.setUserId(user.getId()); + staffMapper.insert(newStaff); + } else { + newStaff.setId(oldStaff.getId()); + staffMapper.updateById(newStaff); + } + return true; + } } diff --git a/Pinnacle/src/main/resources/mapper/StaffMapper.xml b/Pinnacle/src/main/resources/mapper/StaffMapper.xml index 0ce5082..e564449 100644 --- a/Pinnacle/src/main/resources/mapper/StaffMapper.xml +++ b/Pinnacle/src/main/resources/mapper/StaffMapper.xml @@ -2,4 +2,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sql/init.sql b/sql/init.sql index c12291d..6c9265f 100644 --- a/sql/init.sql +++ b/sql/init.sql @@ -188,7 +188,7 @@ create table `t_staff` `birth` date null comment '生日', `email` varchar(50) null comment '邮箱', `tel` varchar(20) null comment '电话', - `address` varchar(50) null comment '地址', + `address` varchar(100) null comment '地址', `deleted` bigint not null default 0, `version` int not null default 0, constraint t_staff_user_id_fk foreign key (user_id) references t_user (id) diff --git a/ui/src/assets/svg/info.svg b/ui/src/assets/svg/info.svg new file mode 100644 index 0000000..7907bd2 --- /dev/null +++ b/ui/src/assets/svg/info.svg @@ -0,0 +1,3 @@ + + \ No newline at end of file diff --git a/ui/src/constants/Common.constants.ts b/ui/src/constants/Common.constants.ts index e48ed3f..743531f 100644 --- a/ui/src/constants/Common.constants.ts +++ b/ui/src/constants/Common.constants.ts @@ -30,6 +30,7 @@ const DATABASE_DELETE_ERROR = 20034 const DATABASE_TIMEOUT_ERROR = 20035 const DATABASE_CONNECT_ERROR = 20036 const DATABASE_DATA_TO_LONG = 20037 +const DATABASE_DATA_VALIDATION_FAILED = 20038 const UNAUTHORIZED = 30010 const ACCESS_DENIED = 30030 @@ -69,6 +70,7 @@ export { DATABASE_TIMEOUT_ERROR, DATABASE_CONNECT_ERROR, DATABASE_DATA_TO_LONG, + DATABASE_DATA_VALIDATION_FAILED, UNAUTHORIZED, ACCESS_DENIED, USER_DISABLE, diff --git a/ui/src/pages/info/StaffManagement.vue b/ui/src/pages/info/StaffManagement.vue new file mode 100644 index 0000000..1b6d016 --- /dev/null +++ b/ui/src/pages/info/StaffManagement.vue @@ -0,0 +1,222 @@ + + + + + diff --git a/ui/src/router/index.ts b/ui/src/router/index.ts index 5d2fcb2..470ed8d 100644 --- a/ui/src/router/index.ts +++ b/ui/src/router/index.ts @@ -7,6 +7,7 @@ import affairRouter from '@/router/affair' import noticeRouter from '@/router/notice' import powerRouter from '@/router/power' import _ from 'lodash' +import infoRouter from '@/router/info' const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -36,6 +37,7 @@ const router = createRouter({ noticeRouter, attendanceRouter, affairRouter, + infoRouter, powerRouter ] }, diff --git a/ui/src/router/info.ts b/ui/src/router/info.ts new file mode 100644 index 0000000..43a9aa5 --- /dev/null +++ b/ui/src/router/info.ts @@ -0,0 +1,28 @@ +const infoRouter = { + path: '/info', + name: 'infoManagement', + redirect: '/info/staff', + children: [ + { + path: 'staff', + name: 'staffManagement', + component: async () => await import('@/pages/info/StaffManagement.vue'), + meta: { + title: '员工信息管理', + requiresMenu: true, + requiresScrollbar: false, + requiresPadding: true + } + } + ], + meta: { + title: '信息管理', + icon: shallowRef(IconPinnacleInfo), + requiresMenu: true, + requiresScrollbar: false, + requiresPadding: true, + requiresAuth: true + } +} + +export default infoRouter diff --git a/ui/src/services/index.ts b/ui/src/services/index.ts index 348dfc9..522678b 100644 --- a/ui/src/services/index.ts +++ b/ui/src/services/index.ts @@ -4,6 +4,7 @@ import router from '@/router' import { ACCESS_DENIED, DATABASE_DATA_TO_LONG, + DATABASE_DATA_VALIDATION_FAILED, TOKEN_HAS_EXPIRED, TOKEN_IS_ILLEGAL, UNAUTHORIZED @@ -56,6 +57,12 @@ service.interceptors.response.use( message: '数据过长' }) return await Promise.reject(response?.data) + case DATABASE_DATA_VALIDATION_FAILED: + ElMessage.error({ + dangerouslyUseHTMLString: true, + message: '数据验证失败' + }) + return await Promise.reject(response?.data) } return response },