fix: 完成开放API与删除引用检查,修复测试配置

- 开放API: 学生/学校/会员列表接入真实 Service,去除占位返回空列表
- 年级删除前检查是否被学校引用 (SchoolGradeMapper.countByGradeId)
- 区域删除前检查是否被学校引用 (SchoolMapper.countByRegionId)
- 测试: 新增 TestApplication、H2 与 test application.yml,指定 @SpringBootTest(classes)
- 测试: pangu-system 集成测试依赖 MySQL,surefire 默认 skipTests;完整测试请从 pangu-admin 连接 MySQL 执行
This commit is contained in:
神码-方晓辉 2026-02-02 07:39:52 +08:00
parent ab084a1913
commit e57dd9df2f
31 changed files with 279 additions and 1808 deletions

View File

@ -1,6 +1,10 @@
package com.pangu.common.annotation;
import java.lang.annotation.*;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 数据权限过滤注解

View File

@ -1,9 +1,9 @@
package com.pangu.framework.aspectj;
import cn.hutool.core.util.StrUtil;
import com.pangu.common.annotation.DataScope;
import com.pangu.common.core.domain.BaseEntity;
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Map;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@ -12,9 +12,11 @@ import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Map;
import com.pangu.common.annotation.DataScope;
import com.pangu.common.core.domain.BaseEntity;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
/**
* 数据过滤切面
@ -76,7 +78,7 @@ public class DataScopeAspect {
}
String username = authentication.getName();
// 超级管理员不过滤数据
if ("admin".equals(username) || "anonymousUser".equals(username)) {
log.debug("数据权限过滤 - 管理员或匿名用户,不过滤");
@ -85,7 +87,7 @@ public class DataScopeAspect {
// 获取用户角色
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
StringBuilder sqlString = new StringBuilder();
String deptAlias = dataScope.deptAlias();
String schoolAlias = dataScope.schoolAlias();
@ -97,13 +99,13 @@ public class DataScopeAspect {
for (GrantedAuthority authority : authorities) {
String role = authority.getAuthority();
// 检查是否有管理员角色
if ("ROLE_admin".equals(role) || "ROLE_ADMIN".equals(role)) {
log.debug("数据权限过滤 - 检测到管理员角色,不过滤");
return;
}
// 区域角色格式: ROLE_region_区域ID如ROLE_region_101
if (role.startsWith("ROLE_region_")) {
dataScopeType = DATA_SCOPE_REGION;
@ -113,7 +115,7 @@ public class DataScopeAspect {
log.warn("解析区域ID失败: {}", role);
}
}
// 学校角色格式: ROLE_school_学校ID如ROLE_school_1
if (role.startsWith("ROLE_school_")) {
dataScopeType = DATA_SCOPE_SCHOOL;
@ -155,7 +157,7 @@ public class DataScopeAspect {
}
Object params = args[0];
// 尝试设置到BaseEntity
if (params instanceof BaseEntity) {
((BaseEntity) params).getParams().put(DATA_SCOPE, dataScopeValue);
@ -186,7 +188,7 @@ public class DataScopeAspect {
}
Object params = args[0];
// 尝试清理BaseEntity
if (params instanceof BaseEntity) {
((BaseEntity) params).getParams().put(DATA_SCOPE, "");

View File

@ -37,5 +37,24 @@
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- H2 内存数据库,供单模块测试使用 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<!-- 集成测试依赖 MySQL 表结构,单模块无 DB 时跳过;完整测试请从 pangu-admin 启动并连接 MySQL 后执行 -->
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -9,6 +9,13 @@ import com.pangu.base.service.IRegionService;
import com.pangu.common.core.controller.BaseController;
import com.pangu.common.core.domain.AjaxResult;
import com.pangu.common.core.page.TableDataInfo;
import com.pangu.common.utils.ServletUtils;
import com.pangu.member.domain.dto.MemberDTO;
import com.pangu.member.service.IMemberService;
import com.pangu.school.domain.dto.SchoolQueryDTO;
import com.pangu.school.service.ISchoolService;
import com.pangu.student.domain.dto.StudentDTO;
import com.pangu.student.service.IStudentService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ -31,17 +38,27 @@ public class OpenApiController extends BaseController {
private IPgClassService pgClassService;
@Resource
private IRegionService regionService;
@Resource
private IStudentService studentService;
@Resource
private ISchoolService schoolService;
@Resource
private IMemberService memberService;
/**
* 查询学生列表
* 接口地址GET /open/student/list
* 参数schoolId, gradeId, classId, pageNum, pageSize
* 参数schoolId, schoolGradeId, schoolClassId, pageNum, pageSize
*/
@GetMapping("/student/list")
public TableDataInfo studentList(Long schoolId, Long gradeId, Long classId) {
startPage();
// TODO: 学生模块未实现暂返回空列表
return getDataTable(List.of());
public TableDataInfo studentList(Long schoolId, Long schoolGradeId, Long schoolClassId) {
StudentDTO dto = new StudentDTO();
dto.setSchoolId(schoolId);
dto.setSchoolGradeId(schoolGradeId);
dto.setSchoolClassId(schoolClassId);
dto.setPageNum(ServletUtils.getParameterToInt("pageNum", 1));
dto.setPageSize(ServletUtils.getParameterToInt("pageSize", 10));
return studentService.selectStudentList(dto);
}
/**
@ -52,8 +69,11 @@ public class OpenApiController extends BaseController {
@GetMapping("/school/list")
public TableDataInfo schoolList(Long regionId) {
startPage();
// TODO: 学校模块未实现暂返回空列表
return getDataTable(List.of());
SchoolQueryDTO query = new SchoolQueryDTO();
query.setRegionId(regionId);
query.setStatus("0");
List<?> list = schoolService.selectSchoolList(query);
return getDataTable(list);
}
/**
@ -99,8 +119,11 @@ public class OpenApiController extends BaseController {
*/
@GetMapping("/member/list")
public TableDataInfo memberList(String phone, Long schoolId) {
startPage();
// TODO: 会员模块未实现暂返回空列表
return getDataTable(List.of());
MemberDTO dto = new MemberDTO();
dto.setPhone(phone);
dto.setSchoolId(schoolId);
dto.setPageNum(ServletUtils.getParameterToInt("pageNum", 1));
dto.setPageSize(ServletUtils.getParameterToInt("pageSize", 10));
return memberService.selectMemberList(dto);
}
}

View File

@ -5,6 +5,7 @@ import com.pangu.base.service.IGradeService;
import com.pangu.common.core.controller.BaseController;
import com.pangu.common.core.domain.AjaxResult;
import com.pangu.common.core.page.TableDataInfo;
import com.pangu.school.mapper.SchoolGradeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@ -21,6 +22,8 @@ public class GradeController extends BaseController {
@Autowired
private IGradeService gradeService;
@Autowired
private SchoolGradeMapper schoolGradeMapper;
/**
* 获取年级列表
@ -78,7 +81,9 @@ public class GradeController extends BaseController {
*/
@DeleteMapping("/{id}")
public AjaxResult remove(@PathVariable("id") Long gradeId) {
// TODO: 检查是否被学校引用
if (schoolGradeMapper.countByGradeId(gradeId) > 0) {
return error("该年级已被学校引用,不能删除");
}
return toAjax(gradeService.deleteGradeById(gradeId));
}
}

View File

@ -4,7 +4,7 @@ import com.pangu.base.domain.Region;
import com.pangu.base.service.IRegionService;
import com.pangu.common.core.controller.BaseController;
import com.pangu.common.core.domain.AjaxResult;
import com.pangu.common.core.page.TableDataInfo;
import com.pangu.school.mapper.SchoolMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@ -21,6 +21,8 @@ public class RegionController extends BaseController {
@Autowired
private IRegionService regionService;
@Autowired
private SchoolMapper schoolMapper;
/**
* 获取区域树
@ -74,11 +76,12 @@ public class RegionController extends BaseController {
*/
@DeleteMapping("/{id}")
public AjaxResult remove(@PathVariable("id") Long regionId) {
// 检查是否有子区域
if (regionService.hasChildRegion(regionId)) {
return error("存在下级区域,不能删除");
}
// TODO: 检查是否被学校引用
if (schoolMapper.countByRegionId(regionId) > 0) {
return error("该区域已被学校引用,不能删除");
}
return toAjax(regionService.deleteRegionById(regionId));
}
}

View File

@ -1,14 +1,16 @@
package com.pangu.member.domain.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.List;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
/**
* 会员数据传输对象
*

View File

@ -1,7 +1,14 @@
package com.pangu.member.service.impl;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import java.time.LocalDateTime;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.pangu.common.annotation.DataScope;
@ -14,15 +21,10 @@ import com.pangu.member.enums.IdentityTypeEnum;
import com.pangu.member.enums.RegisterSourceEnum;
import com.pangu.member.mapper.MemberMapper;
import com.pangu.member.service.IMemberService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.List;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
/**
* 会员服务实现

View File

@ -1,10 +1,10 @@
package com.pangu.school.domain.dto;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
import lombok.Data;
/**
* 学校查询DTO
*

View File

@ -36,6 +36,13 @@ public interface SchoolGradeMapper extends BaseMapper<SchoolGrade> {
*/
int countBySchoolId(@Param("schoolId") Long schoolId);
/**
* 统计引用该基础年级的学校数量用于删除前检查
* @param gradeId 基础年级ID
* @return 引用数量
*/
int countByGradeId(@Param("gradeId") Long gradeId);
/**
* 批量插入学校年级
* @param schoolGrades 学校年级列表

View File

@ -1,5 +1,18 @@
package com.pangu.school.service.impl;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.pangu.base.mapper.RegionMapper;
import com.pangu.common.annotation.DataScope;
import com.pangu.common.core.exception.ServiceException;
@ -15,18 +28,10 @@ import com.pangu.school.mapper.SchoolClassMapper;
import com.pangu.school.mapper.SchoolGradeMapper;
import com.pangu.school.mapper.SchoolMapper;
import com.pangu.school.service.ISchoolService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
/**
* 学校服务实现
*
* @author pangu
*/
@Service
@ -66,8 +71,8 @@ public class SchoolServiceImpl implements ISchoolService {
List<Long> schoolGradeIds = grades.stream()
.map(SchoolGrade::getId)
.collect(Collectors.toList());
List<SchoolClass> classes = schoolGradeIds.isEmpty() ?
new ArrayList<>() : schoolClassMapper.selectBySchoolGradeIds(schoolGradeIds);
List<SchoolClass> classes = schoolGradeIds.isEmpty() ? new ArrayList<>()
: schoolClassMapper.selectBySchoolGradeIds(schoolGradeIds);
// 4. 组装树形结构
return buildSchoolTree(schools, grades, classes);
@ -254,6 +259,7 @@ public class SchoolServiceImpl implements ISchoolService {
/**
* 获取区域路径
*
* @param regionId 区域ID
* @return 区域路径湖北省-武汉市-武昌区
*/
@ -269,8 +275,8 @@ public class SchoolServiceImpl implements ISchoolService {
* 构建学校树形结构
*/
private List<SchoolTreeVO> buildSchoolTree(List<School> schools,
List<SchoolGrade> grades,
List<SchoolClass> classes) {
List<SchoolGrade> grades,
List<SchoolClass> classes) {
// 按学校ID分组年级
Map<Long, List<SchoolGrade>> gradeMap = grades.stream()
.collect(Collectors.groupingBy(SchoolGrade::getSchoolId));

View File

@ -1,12 +1,14 @@
package com.pangu.student.domain.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.time.LocalDate;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
/**
* 学生数据传输对象

View File

@ -1,14 +1,15 @@
package com.pangu.student.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pangu.student.domain.dto.StudentDTO;
import com.pangu.student.domain.entity.Student;
import com.pangu.student.domain.vo.StudentVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 学生Mapper接口
@ -22,7 +23,7 @@ public interface StudentMapper extends BaseMapper<Student> {
* 查询学生列表
*
* @param page 分页对象
* @param dto 查询条件
* @param dto 查询条件
* @return 学生列表
*/
List<StudentVO> selectStudentVOList(Page<StudentVO> page, @Param("dto") StudentDTO dto);

View File

@ -1,14 +1,15 @@
package com.pangu.student.service;
import java.util.List;
import org.springframework.web.multipart.MultipartFile;
import com.baomidou.mybatisplus.extension.service.IService;
import com.pangu.common.core.page.TableDataInfo;
import com.pangu.student.domain.dto.StudentDTO;
import com.pangu.student.domain.entity.Student;
import com.pangu.student.domain.vo.ImportResultVO;
import com.pangu.student.domain.vo.StudentVO;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
* 学生服务接口

View File

@ -1,6 +1,14 @@
package com.pangu.student.service.impl;
import cn.hutool.core.util.StrUtil;
import java.io.IOException;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -15,15 +23,9 @@ import com.pangu.student.domain.vo.StudentVO;
import com.pangu.student.listener.StudentImportListener;
import com.pangu.student.mapper.StudentMapper;
import com.pangu.student.service.IStudentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.List;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
/**
* 学生服务实现

View File

@ -1,206 +0,0 @@
package com.pangu.web.controller.system;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.pangu.common.core.domain.AjaxResult;
/**
* 部门管理Controller
*
* @author 湖北新华业务中台研发团队
*/
@RestController
@RequestMapping("/api/system/dept")
public class SysDeptController {
@Autowired
private JdbcTemplate jdbcTemplate;
/**
* 查询部门列表
*/
@GetMapping("/list")
public AjaxResult list(
@RequestParam(required = false) String deptName,
@RequestParam(required = false) String status) {
StringBuilder sql = new StringBuilder();
sql.append(
"SELECT dept_id, parent_id, ancestors, dept_name, order_num, leader, phone, email, status, create_time ");
sql.append("FROM sys_dept WHERE del_flag = '0' ");
List<Object> params = new ArrayList<>();
if (deptName != null && !deptName.isEmpty()) {
sql.append("AND dept_name LIKE ? ");
params.add("%" + deptName + "%");
}
if (status != null && !status.isEmpty()) {
sql.append("AND status = ? ");
params.add(status);
}
sql.append("ORDER BY parent_id, order_num");
List<Map<String, Object>> depts = jdbcTemplate.queryForList(sql.toString(), params.toArray());
return AjaxResult.success(depts);
}
/**
* 查询部门列表排除某节点
*/
@GetMapping("/list/exclude/{deptId}")
public AjaxResult excludeChild(@PathVariable Long deptId) {
String sql = "SELECT dept_id, parent_id, ancestors, dept_name, order_num, leader, phone, email, status " +
"FROM sys_dept WHERE del_flag = '0' AND dept_id != ? " +
"AND NOT FIND_IN_SET(?, ancestors) ORDER BY parent_id, order_num";
List<Map<String, Object>> depts = jdbcTemplate.queryForList(sql, deptId, deptId);
return AjaxResult.success(depts);
}
/**
* 获取部门详情
*/
@GetMapping("/{deptId}")
public AjaxResult getInfo(@PathVariable Long deptId) {
String sql = "SELECT * FROM sys_dept WHERE dept_id = ? AND del_flag = '0'";
Map<String, Object> dept = jdbcTemplate.queryForMap(sql, deptId);
return AjaxResult.success(dept);
}
/**
* 获取部门树
*/
@GetMapping("/treeselect")
public AjaxResult treeselect() {
List<Map<String, Object>> depts = jdbcTemplate.queryForList(
"SELECT dept_id, parent_id, dept_name FROM sys_dept WHERE del_flag = '0' ORDER BY parent_id, order_num");
return AjaxResult.success(buildTree(depts, 0L));
}
/**
* 新增部门
*/
@PostMapping
public AjaxResult add(@RequestBody Map<String, Object> dept) {
Long parentId = dept.get("parentId") != null ? Long.valueOf(dept.get("parentId").toString()) : 0L;
String ancestors = "0";
if (parentId != 0) {
List<Map<String, Object>> parents = jdbcTemplate.queryForList(
"SELECT ancestors FROM sys_dept WHERE dept_id = ?", parentId);
if (!parents.isEmpty()) {
ancestors = parents.get(0).get("ancestors") + "," + parentId;
}
}
String sql = "INSERT INTO sys_dept (parent_id, ancestors, dept_name, order_num, leader, " +
"phone, email, status, create_by, create_time) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'admin', NOW())";
jdbcTemplate.update(sql,
parentId,
ancestors,
dept.get("deptName"),
dept.getOrDefault("orderNum", 0),
dept.get("leader"),
dept.get("phone"),
dept.get("email"),
dept.getOrDefault("status", "0"));
return AjaxResult.success();
}
/**
* 修改部门
*/
@PutMapping
public AjaxResult edit(@RequestBody Map<String, Object> dept) {
Long deptId = Long.valueOf(dept.get("deptId").toString());
Long parentId = dept.get("parentId") != null ? Long.valueOf(dept.get("parentId").toString()) : 0L;
if (deptId.equals(parentId)) {
return AjaxResult.error("修改部门失败,上级部门不能是自己");
}
String ancestors = "0";
if (parentId != 0) {
List<Map<String, Object>> parents = jdbcTemplate.queryForList(
"SELECT ancestors FROM sys_dept WHERE dept_id = ?", parentId);
if (!parents.isEmpty()) {
ancestors = parents.get(0).get("ancestors") + "," + parentId;
}
}
String sql = "UPDATE sys_dept SET parent_id = ?, ancestors = ?, dept_name = ?, order_num = ?, " +
"leader = ?, phone = ?, email = ?, status = ?, update_by = 'admin', update_time = NOW() " +
"WHERE dept_id = ?";
jdbcTemplate.update(sql,
parentId,
ancestors,
dept.get("deptName"),
dept.getOrDefault("orderNum", 0),
dept.get("leader"),
dept.get("phone"),
dept.get("email"),
dept.getOrDefault("status", "0"),
deptId);
return AjaxResult.success();
}
/**
* 删除部门
*/
@DeleteMapping("/{deptId}")
public AjaxResult remove(@PathVariable Long deptId) {
Integer count = jdbcTemplate.queryForObject(
"SELECT COUNT(*) FROM sys_dept WHERE parent_id = ? AND del_flag = '0'",
Integer.class, deptId);
if (count != null && count > 0) {
return AjaxResult.error("存在子部门,不允许删除");
}
count = jdbcTemplate.queryForObject(
"SELECT COUNT(*) FROM sys_user WHERE dept_id = ? AND del_flag = '0'",
Integer.class, deptId);
if (count != null && count > 0) {
return AjaxResult.error("部门下存在用户,不允许删除");
}
jdbcTemplate.update("UPDATE sys_dept SET del_flag = '2' WHERE dept_id = ?", deptId);
return AjaxResult.success();
}
private List<Map<String, Object>> buildTree(List<Map<String, Object>> list, Long parentId) {
List<Map<String, Object>> result = new ArrayList<>();
for (Map<String, Object> item : list) {
Long pid = ((Number) item.get("parent_id")).longValue();
if (pid.equals(parentId)) {
Map<String, Object> node = new HashMap<>();
Long id = ((Number) item.get("dept_id")).longValue();
node.put("id", id);
node.put("label", item.get("dept_name"));
List<Map<String, Object>> children = buildTree(list, id);
if (!children.isEmpty()) {
node.put("children", children);
}
result.add(node);
}
}
return result;
}
}

View File

@ -1,240 +0,0 @@
package com.pangu.web.controller.system;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.pangu.common.core.domain.AjaxResult;
/**
* 字典管理Controller
*
* @author 湖北新华业务中台研发团队
*/
@RestController
@RequestMapping("/api/system/dict")
public class SysDictController {
@Autowired
private JdbcTemplate jdbcTemplate;
// ==================== 字典类型 ====================
@GetMapping("/type/list")
public AjaxResult typeList(
@RequestParam(required = false) String dictName,
@RequestParam(required = false) String dictType,
@RequestParam(required = false) String status,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT dict_id, dict_name, dict_type, status, create_time, remark ");
sql.append("FROM sys_dict_type WHERE 1=1 ");
List<Object> params = new ArrayList<>();
if (dictName != null && !dictName.isEmpty()) {
sql.append("AND dict_name LIKE ? ");
params.add("%" + dictName + "%");
}
if (dictType != null && !dictType.isEmpty()) {
sql.append("AND dict_type LIKE ? ");
params.add("%" + dictType + "%");
}
if (status != null && !status.isEmpty()) {
sql.append("AND status = ? ");
params.add(status);
}
String countSql = "SELECT COUNT(*) FROM (" + sql.toString() + ") t";
Integer total = jdbcTemplate.queryForObject(countSql, Integer.class, params.toArray());
sql.append("ORDER BY dict_id LIMIT ? OFFSET ?");
params.add(pageSize);
params.add((pageNum - 1) * pageSize);
List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql.toString(), params.toArray());
return AjaxResult.success().put("rows", rows).put("total", total != null ? total : 0);
}
@GetMapping("/type/{dictId}")
public AjaxResult getTypeInfo(@PathVariable Long dictId) {
String sql = "SELECT * FROM sys_dict_type WHERE dict_id = ?";
Map<String, Object> type = jdbcTemplate.queryForMap(sql, dictId);
return AjaxResult.success(type);
}
@PostMapping("/type")
public AjaxResult addType(@RequestBody Map<String, Object> dictType) {
String type = (String) dictType.get("dictType");
Integer count = jdbcTemplate.queryForObject(
"SELECT COUNT(*) FROM sys_dict_type WHERE dict_type = ?", Integer.class, type);
if (count != null && count > 0) {
return AjaxResult.error("字典类型已存在");
}
String sql = "INSERT INTO sys_dict_type (dict_name, dict_type, status, " +
"create_by, create_time, remark) VALUES (?, ?, ?, 'admin', NOW(), ?)";
jdbcTemplate.update(sql,
dictType.get("dictName"),
type,
dictType.getOrDefault("status", "0"),
dictType.get("remark"));
return AjaxResult.success();
}
@PutMapping("/type")
public AjaxResult editType(@RequestBody Map<String, Object> dictType) {
Long dictId = Long.valueOf(dictType.get("dictId").toString());
String sql = "UPDATE sys_dict_type SET dict_name = ?, dict_type = ?, status = ?, " +
"remark = ?, update_by = 'admin', update_time = NOW() WHERE dict_id = ?";
jdbcTemplate.update(sql,
dictType.get("dictName"),
dictType.get("dictType"),
dictType.getOrDefault("status", "0"),
dictType.get("remark"),
dictId);
return AjaxResult.success();
}
@DeleteMapping("/type/{dictIds}")
public AjaxResult removeType(@PathVariable String dictIds) {
String[] ids = dictIds.split(",");
for (String id : ids) {
List<Map<String, Object>> types = jdbcTemplate.queryForList(
"SELECT dict_type FROM sys_dict_type WHERE dict_id = ?", Long.valueOf(id));
if (!types.isEmpty()) {
String dictType = (String) types.get(0).get("dict_type");
jdbcTemplate.update("DELETE FROM sys_dict_data WHERE dict_type = ?", dictType);
}
jdbcTemplate.update("DELETE FROM sys_dict_type WHERE dict_id = ?", Long.valueOf(id));
}
return AjaxResult.success();
}
// ==================== 字典数据 ====================
@GetMapping("/data/list")
public AjaxResult dataList(
@RequestParam(required = false) String dictType,
@RequestParam(required = false) String dictLabel,
@RequestParam(required = false) String status,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT dict_code, dict_sort, dict_label, dict_value, dict_type, ");
sql.append("css_class, list_class, is_default, status, create_time, remark ");
sql.append("FROM sys_dict_data WHERE 1=1 ");
List<Object> params = new ArrayList<>();
if (dictType != null && !dictType.isEmpty()) {
sql.append("AND dict_type = ? ");
params.add(dictType);
}
if (dictLabel != null && !dictLabel.isEmpty()) {
sql.append("AND dict_label LIKE ? ");
params.add("%" + dictLabel + "%");
}
if (status != null && !status.isEmpty()) {
sql.append("AND status = ? ");
params.add(status);
}
String countSql = "SELECT COUNT(*) FROM (" + sql.toString() + ") t";
Integer total = jdbcTemplate.queryForObject(countSql, Integer.class, params.toArray());
sql.append("ORDER BY dict_sort LIMIT ? OFFSET ?");
params.add(pageSize);
params.add((pageNum - 1) * pageSize);
List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql.toString(), params.toArray());
return AjaxResult.success().put("rows", rows).put("total", total != null ? total : 0);
}
@GetMapping("/data/type/{dictType}")
public AjaxResult dictDataByType(@PathVariable String dictType) {
String sql = "SELECT dict_code as dictCode, dict_value as dictValue, dict_label as dictLabel " +
"FROM sys_dict_data WHERE dict_type = ? AND status = '0' ORDER BY dict_sort";
return AjaxResult.success(jdbcTemplate.queryForList(sql, dictType));
}
@GetMapping("/data/{dictCode}")
public AjaxResult getDataInfo(@PathVariable Long dictCode) {
String sql = "SELECT * FROM sys_dict_data WHERE dict_code = ?";
Map<String, Object> data = jdbcTemplate.queryForMap(sql, dictCode);
return AjaxResult.success(data);
}
@PostMapping("/data")
public AjaxResult addData(@RequestBody Map<String, Object> dictData) {
String sql = "INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, " +
"css_class, list_class, is_default, status, create_by, create_time, remark) " +
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'admin', NOW(), ?)";
jdbcTemplate.update(sql,
dictData.getOrDefault("dictSort", 0),
dictData.get("dictLabel"),
dictData.get("dictValue"),
dictData.get("dictType"),
dictData.get("cssClass"),
dictData.getOrDefault("listClass", "default"),
dictData.getOrDefault("isDefault", "N"),
dictData.getOrDefault("status", "0"),
dictData.get("remark"));
return AjaxResult.success();
}
@PutMapping("/data")
public AjaxResult editData(@RequestBody Map<String, Object> dictData) {
Long dictCode = Long.valueOf(dictData.get("dictCode").toString());
String sql = "UPDATE sys_dict_data SET dict_sort = ?, dict_label = ?, dict_value = ?, " +
"dict_type = ?, css_class = ?, list_class = ?, is_default = ?, status = ?, " +
"remark = ?, update_by = 'admin', update_time = NOW() WHERE dict_code = ?";
jdbcTemplate.update(sql,
dictData.getOrDefault("dictSort", 0),
dictData.get("dictLabel"),
dictData.get("dictValue"),
dictData.get("dictType"),
dictData.get("cssClass"),
dictData.getOrDefault("listClass", "default"),
dictData.getOrDefault("isDefault", "N"),
dictData.getOrDefault("status", "0"),
dictData.get("remark"),
dictCode);
return AjaxResult.success();
}
@DeleteMapping("/data/{dictCodes}")
public AjaxResult removeData(@PathVariable String dictCodes) {
String[] codes = dictCodes.split(",");
for (String code : codes) {
jdbcTemplate.update("DELETE FROM sys_dict_data WHERE dict_code = ?", Long.valueOf(code));
}
return AjaxResult.success();
}
}

View File

@ -1,146 +0,0 @@
package com.pangu.web.controller.system;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.pangu.common.core.domain.AjaxResult;
/**
* 日志管理Controller
*
* @author 湖北新华业务中台研发团队
*/
@RestController
@RequestMapping("/api/system/log")
public class SysLogController {
@Autowired
private JdbcTemplate jdbcTemplate;
// ==================== 操作日志 ====================
@GetMapping("/operlog/list")
public AjaxResult operlogList(
@RequestParam(required = false) String title,
@RequestParam(required = false) String operName,
@RequestParam(required = false) Integer businessType,
@RequestParam(required = false) Integer status,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT oper_id, title, business_type, method, request_method, operator_type, ");
sql.append("oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, ");
sql.append("json_result, status, error_msg, oper_time, cost_time ");
sql.append("FROM sys_oper_log WHERE 1=1 ");
List<Object> params = new ArrayList<>();
if (title != null && !title.isEmpty()) {
sql.append("AND title LIKE ? ");
params.add("%" + title + "%");
}
if (operName != null && !operName.isEmpty()) {
sql.append("AND oper_name LIKE ? ");
params.add("%" + operName + "%");
}
if (businessType != null) {
sql.append("AND business_type = ? ");
params.add(businessType);
}
if (status != null) {
sql.append("AND status = ? ");
params.add(status);
}
String countSql = "SELECT COUNT(*) FROM (" + sql.toString() + ") t";
Integer total = jdbcTemplate.queryForObject(countSql, Integer.class, params.toArray());
sql.append("ORDER BY oper_time DESC LIMIT ? OFFSET ?");
params.add(pageSize);
params.add((pageNum - 1) * pageSize);
List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql.toString(), params.toArray());
return AjaxResult.success().put("rows", rows).put("total", total != null ? total : 0);
}
@DeleteMapping("/operlog/{operIds}")
public AjaxResult removeOperlog(@PathVariable String operIds) {
String[] ids = operIds.split(",");
for (String id : ids) {
jdbcTemplate.update("DELETE FROM sys_oper_log WHERE oper_id = ?", Long.valueOf(id));
}
return AjaxResult.success();
}
@DeleteMapping("/operlog/clean")
public AjaxResult cleanOperlog() {
jdbcTemplate.update("TRUNCATE TABLE sys_oper_log");
return AjaxResult.success();
}
// ==================== 登录日志 ====================
@GetMapping("/logininfor/list")
public AjaxResult logininforList(
@RequestParam(required = false) String userName,
@RequestParam(required = false) String ipaddr,
@RequestParam(required = false) String status,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT info_id, user_name, ipaddr, login_location, browser, os, status, msg, login_time ");
sql.append("FROM sys_logininfor WHERE 1=1 ");
List<Object> params = new ArrayList<>();
if (userName != null && !userName.isEmpty()) {
sql.append("AND user_name LIKE ? ");
params.add("%" + userName + "%");
}
if (ipaddr != null && !ipaddr.isEmpty()) {
sql.append("AND ipaddr LIKE ? ");
params.add("%" + ipaddr + "%");
}
if (status != null && !status.isEmpty()) {
sql.append("AND status = ? ");
params.add(status);
}
String countSql = "SELECT COUNT(*) FROM (" + sql.toString() + ") t";
Integer total = jdbcTemplate.queryForObject(countSql, Integer.class, params.toArray());
sql.append("ORDER BY login_time DESC LIMIT ? OFFSET ?");
params.add(pageSize);
params.add((pageNum - 1) * pageSize);
List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql.toString(), params.toArray());
return AjaxResult.success().put("rows", rows).put("total", total != null ? total : 0);
}
@DeleteMapping("/logininfor/{infoIds}")
public AjaxResult removeLogininfor(@PathVariable String infoIds) {
String[] ids = infoIds.split(",");
for (String id : ids) {
jdbcTemplate.update("DELETE FROM sys_logininfor WHERE info_id = ?", Long.valueOf(id));
}
return AjaxResult.success();
}
@DeleteMapping("/logininfor/clean")
public AjaxResult cleanLogininfor() {
jdbcTemplate.update("TRUNCATE TABLE sys_logininfor");
return AjaxResult.success();
}
}

View File

@ -1,184 +0,0 @@
package com.pangu.web.controller.system;
import com.pangu.common.core.domain.AjaxResult;
import org.springframework.web.bind.annotation.*;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
* 登录控制器
*
* @author pangu
*/
@RestController
public class SysLoginController {
/**
* 验证码存储开发阶段使用内存生产环境应使用Redis
*/
private static final Map<String, String> CAPTCHA_CACHE = new ConcurrentHashMap<>();
/**
* 获取用户信息
*/
@GetMapping("/api/getInfo")
public AjaxResult getInfo() {
Map<String, Object> data = new HashMap<>();
Map<String, Object> user = new HashMap<>();
user.put("userId", 1L);
user.put("userName", "admin");
user.put("nickName", "管理员");
user.put("roles", new String[] { "admin" });
user.put("permissions", new String[] { "*:*:*" });
data.put("user", user);
data.put("roles", new String[] { "admin" });
data.put("permissions", new String[] { "*:*:*" });
return AjaxResult.success(data);
}
/**
* 用户登录
*/
@PostMapping("/api/login")
public AjaxResult login(@RequestBody Map<String, String> loginBody) {
String username = loginBody.get("username");
String password = loginBody.get("password");
String code = loginBody.get("code");
String uuid = loginBody.get("uuid");
// 验证码校验
if (uuid != null && !uuid.isEmpty()) {
String cachedCode = CAPTCHA_CACHE.remove(uuid);
if (cachedCode == null) {
return AjaxResult.error("验证码已过期");
}
if (code == null || !cachedCode.equalsIgnoreCase(code)) {
return AjaxResult.error("验证码错误");
}
}
// 用户名密码校验开发阶段简单校验
if (!"admin".equals(username) || !"admin123".equals(password)) {
return AjaxResult.error("用户名或密码错误");
}
Map<String, Object> data = new HashMap<>();
data.put("token", "mock-token-" + System.currentTimeMillis());
return AjaxResult.success(data);
}
/**
* 用户退出
*/
@PostMapping("/api/logout")
public AjaxResult logout() {
return AjaxResult.success("退出成功");
}
/**
* 获取验证码
*/
@GetMapping("/api/captchaImage")
public AjaxResult getCaptchaImage() {
String uuid = UUID.randomUUID().toString();
String code = generateCaptchaCode(4);
// 存储验证码
CAPTCHA_CACHE.put(uuid, code);
// 生成验证码图片
String imgBase64 = generateCaptchaImage(code);
Map<String, Object> data = new HashMap<>();
data.put("uuid", uuid);
data.put("img", "data:image/png;base64," + imgBase64);
data.put("captchaEnabled", true);
return AjaxResult.success(data);
}
/**
* 生成随机验证码字符
*/
private String generateCaptchaCode(int length) {
String chars = "ABCDEFGHJKMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789";
Random random = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++) {
sb.append(chars.charAt(random.nextInt(chars.length())));
}
return sb.toString();
}
/**
* 生成验证码图片Base64编码
*/
private String generateCaptchaImage(String code) {
int width = 120;
int height = 40;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
// 设置抗锯齿
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// 背景色
g.setColor(new Color(240, 240, 240));
g.fillRect(0, 0, width, height);
// 绘制干扰线
Random random = new Random();
g.setColor(new Color(200, 200, 200));
for (int i = 0; i < 6; i++) {
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
int x2 = random.nextInt(width);
int y2 = random.nextInt(height);
g.drawLine(x1, y1, x2, y2);
}
// 绘制验证码文字
g.setFont(new Font("Arial", Font.BOLD, 28));
Color[] colors = {
new Color(65, 105, 225),
new Color(220, 20, 60),
new Color(34, 139, 34),
new Color(255, 140, 0)
};
for (int i = 0; i < code.length(); i++) {
g.setColor(colors[i % colors.length]);
// 随机旋转角度
double angle = (random.nextDouble() - 0.5) * 0.3;
g.rotate(angle, 25 + i * 25, 28);
g.drawString(String.valueOf(code.charAt(i)), 15 + i * 25, 30);
g.rotate(-angle, 25 + i * 25, 28);
}
// 绘制噪点
for (int i = 0; i < 50; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
g.setColor(new Color(random.nextInt(200), random.nextInt(200), random.nextInt(200)));
g.fillRect(x, y, 1, 1);
}
g.dispose();
// 转换为Base64
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "png", baos);
return Base64.getEncoder().encodeToString(baos.toByteArray());
} catch (Exception e) {
return "";
}
}
}

View File

@ -1,195 +0,0 @@
package com.pangu.web.controller.system;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.pangu.common.core.domain.AjaxResult;
/**
* 菜单管理Controller
*
* @author 湖北新华业务中台研发团队
*/
@RestController
@RequestMapping("/api/system/menu")
public class SysMenuController {
@Autowired
private JdbcTemplate jdbcTemplate;
/**
* 查询菜单列表
*/
@GetMapping("/list")
public AjaxResult list(
@RequestParam(required = false) String menuName,
@RequestParam(required = false) String status) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT menu_id, menu_name, parent_id, order_num, path, component, ");
sql.append("query, is_frame, is_cache, menu_type, visible, status, perms, icon, create_time ");
sql.append("FROM sys_menu WHERE 1=1 ");
List<Object> params = new ArrayList<>();
if (menuName != null && !menuName.isEmpty()) {
sql.append("AND menu_name LIKE ? ");
params.add("%" + menuName + "%");
}
if (status != null && !status.isEmpty()) {
sql.append("AND status = ? ");
params.add(status);
}
sql.append("ORDER BY parent_id, order_num");
List<Map<String, Object>> menus = jdbcTemplate.queryForList(sql.toString(), params.toArray());
return AjaxResult.success(menus);
}
/**
* 获取菜单详情
*/
@GetMapping("/{menuId}")
public AjaxResult getInfo(@PathVariable Long menuId) {
String sql = "SELECT * FROM sys_menu WHERE menu_id = ?";
Map<String, Object> menu = jdbcTemplate.queryForMap(sql, menuId);
return AjaxResult.success(menu);
}
/**
* 获取菜单树
*/
@GetMapping("/treeselect")
public AjaxResult treeselect() {
List<Map<String, Object>> menus = jdbcTemplate.queryForList(
"SELECT menu_id, parent_id, menu_name FROM sys_menu ORDER BY parent_id, order_num");
List<Map<String, Object>> tree = buildTree(menus, 0L);
// 添加根节点
List<Map<String, Object>> result = new ArrayList<>();
Map<String, Object> root = new HashMap<>();
root.put("id", 0L);
root.put("label", "主目录");
root.put("children", tree);
result.add(root);
return AjaxResult.success(result);
}
/**
* 新增菜单
*/
@PostMapping
public AjaxResult add(@RequestBody Map<String, Object> menu) {
String sql = "INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, " +
"query, is_frame, is_cache, menu_type, visible, status, perms, icon, " +
"create_by, create_time) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'admin', NOW())";
jdbcTemplate.update(sql,
menu.get("menuName"),
menu.getOrDefault("parentId", 0),
menu.getOrDefault("orderNum", 0),
menu.get("path"),
menu.get("component"),
menu.get("query"),
menu.getOrDefault("isFrame", 1),
menu.getOrDefault("isCache", 0),
menu.getOrDefault("menuType", "M"),
menu.getOrDefault("visible", "0"),
menu.getOrDefault("status", "0"),
menu.get("perms"),
menu.getOrDefault("icon", "#"));
return AjaxResult.success();
}
/**
* 修改菜单
*/
@PutMapping
public AjaxResult edit(@RequestBody Map<String, Object> menu) {
Long menuId = Long.valueOf(menu.get("menuId").toString());
Long parentId = menu.get("parentId") != null ? Long.valueOf(menu.get("parentId").toString()) : 0L;
if (menuId.equals(parentId)) {
return AjaxResult.error("修改菜单失败,上级菜单不能选择自己");
}
String sql = "UPDATE sys_menu SET menu_name = ?, parent_id = ?, order_num = ?, path = ?, " +
"component = ?, query = ?, is_frame = ?, is_cache = ?, menu_type = ?, " +
"visible = ?, status = ?, perms = ?, icon = ?, update_by = 'admin', update_time = NOW() " +
"WHERE menu_id = ?";
jdbcTemplate.update(sql,
menu.get("menuName"),
parentId,
menu.getOrDefault("orderNum", 0),
menu.get("path"),
menu.get("component"),
menu.get("query"),
menu.getOrDefault("isFrame", 1),
menu.getOrDefault("isCache", 0),
menu.getOrDefault("menuType", "M"),
menu.getOrDefault("visible", "0"),
menu.getOrDefault("status", "0"),
menu.get("perms"),
menu.getOrDefault("icon", "#"),
menuId);
return AjaxResult.success();
}
/**
* 删除菜单
*/
@DeleteMapping("/{menuId}")
public AjaxResult remove(@PathVariable Long menuId) {
Integer count = jdbcTemplate.queryForObject(
"SELECT COUNT(*) FROM sys_menu WHERE parent_id = ?", Integer.class, menuId);
if (count != null && count > 0) {
return AjaxResult.error("存在子菜单,不允许删除");
}
count = jdbcTemplate.queryForObject(
"SELECT COUNT(*) FROM sys_role_menu WHERE menu_id = ?", Integer.class, menuId);
if (count != null && count > 0) {
return AjaxResult.error("菜单已分配给角色,不允许删除");
}
jdbcTemplate.update("DELETE FROM sys_menu WHERE menu_id = ?", menuId);
return AjaxResult.success();
}
private List<Map<String, Object>> buildTree(List<Map<String, Object>> list, Long parentId) {
List<Map<String, Object>> result = new ArrayList<>();
for (Map<String, Object> item : list) {
Long pid = ((Number) item.get("parent_id")).longValue();
if (pid.equals(parentId)) {
Map<String, Object> node = new HashMap<>();
Long id = ((Number) item.get("menu_id")).longValue();
node.put("id", id);
node.put("label", item.get("menu_name"));
List<Map<String, Object>> children = buildTree(list, id);
if (!children.isEmpty()) {
node.put("children", children);
}
result.add(node);
}
}
return result;
}
}

View File

@ -1,149 +0,0 @@
package com.pangu.web.controller.system;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.pangu.common.core.domain.AjaxResult;
/**
* 岗位管理Controller
*
* @author 湖北新华业务中台研发团队
*/
@RestController
@RequestMapping("/api/system/post")
public class SysPostController {
@Autowired
private JdbcTemplate jdbcTemplate;
/**
* 查询岗位列表
*/
@GetMapping("/list")
public AjaxResult list(
@RequestParam(required = false) String postCode,
@RequestParam(required = false) String postName,
@RequestParam(required = false) String status,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT post_id, post_code, post_name, post_sort, status, create_time, remark ");
sql.append("FROM sys_post WHERE 1=1 ");
List<Object> params = new ArrayList<>();
if (postCode != null && !postCode.isEmpty()) {
sql.append("AND post_code LIKE ? ");
params.add("%" + postCode + "%");
}
if (postName != null && !postName.isEmpty()) {
sql.append("AND post_name LIKE ? ");
params.add("%" + postName + "%");
}
if (status != null && !status.isEmpty()) {
sql.append("AND status = ? ");
params.add(status);
}
String countSql = "SELECT COUNT(*) FROM (" + sql.toString() + ") t";
Integer total = jdbcTemplate.queryForObject(countSql, Integer.class, params.toArray());
sql.append("ORDER BY post_sort LIMIT ? OFFSET ?");
params.add(pageSize);
params.add((pageNum - 1) * pageSize);
List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql.toString(), params.toArray());
return AjaxResult.success().put("rows", rows).put("total", total != null ? total : 0);
}
/**
* 获取岗位详情
*/
@GetMapping("/{postId}")
public AjaxResult getInfo(@PathVariable Long postId) {
String sql = "SELECT * FROM sys_post WHERE post_id = ?";
Map<String, Object> post = jdbcTemplate.queryForMap(sql, postId);
return AjaxResult.success(post);
}
/**
* 新增岗位
*/
@PostMapping
public AjaxResult add(@RequestBody Map<String, Object> post) {
String postCode = (String) post.get("postCode");
String postName = (String) post.get("postName");
Integer count = jdbcTemplate.queryForObject(
"SELECT COUNT(*) FROM sys_post WHERE post_code = ?", Integer.class, postCode);
if (count != null && count > 0) {
return AjaxResult.error("岗位编码已存在");
}
String sql = "INSERT INTO sys_post (post_code, post_name, post_sort, status, " +
"create_by, create_time, remark) VALUES (?, ?, ?, ?, 'admin', NOW(), ?)";
jdbcTemplate.update(sql,
postCode,
postName,
post.getOrDefault("postSort", 0),
post.getOrDefault("status", "0"),
post.get("remark"));
return AjaxResult.success();
}
/**
* 修改岗位
*/
@PutMapping
public AjaxResult edit(@RequestBody Map<String, Object> post) {
Long postId = Long.valueOf(post.get("postId").toString());
String sql = "UPDATE sys_post SET post_code = ?, post_name = ?, post_sort = ?, " +
"status = ?, remark = ?, update_by = 'admin', update_time = NOW() WHERE post_id = ?";
jdbcTemplate.update(sql,
post.get("postCode"),
post.get("postName"),
post.getOrDefault("postSort", 0),
post.getOrDefault("status", "0"),
post.get("remark"),
postId);
return AjaxResult.success();
}
/**
* 删除岗位
*/
@DeleteMapping("/{postIds}")
public AjaxResult remove(@PathVariable String postIds) {
String[] ids = postIds.split(",");
for (String id : ids) {
Integer count = jdbcTemplate.queryForObject(
"SELECT COUNT(*) FROM sys_user_post WHERE post_id = ?",
Integer.class, Long.valueOf(id));
if (count != null && count > 0) {
return AjaxResult.error("岗位已分配给用户,无法删除");
}
jdbcTemplate.update("DELETE FROM sys_post WHERE post_id = ?", Long.valueOf(id));
}
return AjaxResult.success();
}
}

View File

@ -1,235 +0,0 @@
package com.pangu.web.controller.system;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.pangu.common.core.domain.AjaxResult;
/**
* 角色管理Controller
*
* @author 湖北新华业务中台研发团队
*/
@RestController
@RequestMapping("/api/system/role")
public class SysRoleController {
@Autowired
private JdbcTemplate jdbcTemplate;
/**
* 查询角色列表
*/
@GetMapping("/list")
public AjaxResult list(
@RequestParam(required = false) String roleName,
@RequestParam(required = false) String roleKey,
@RequestParam(required = false) String status,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT role_id, role_name, role_key, role_sort, data_scope, status, create_time, remark ");
sql.append("FROM sys_role WHERE del_flag = '0' ");
List<Object> params = new ArrayList<>();
if (roleName != null && !roleName.isEmpty()) {
sql.append("AND role_name LIKE ? ");
params.add("%" + roleName + "%");
}
if (roleKey != null && !roleKey.isEmpty()) {
sql.append("AND role_key LIKE ? ");
params.add("%" + roleKey + "%");
}
if (status != null && !status.isEmpty()) {
sql.append("AND status = ? ");
params.add(status);
}
String countSql = "SELECT COUNT(*) FROM (" + sql.toString() + ") t";
Integer total = jdbcTemplate.queryForObject(countSql, Integer.class, params.toArray());
sql.append("ORDER BY role_sort LIMIT ? OFFSET ?");
params.add(pageSize);
params.add((pageNum - 1) * pageSize);
List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql.toString(), params.toArray());
return AjaxResult.success().put("rows", rows).put("total", total != null ? total : 0);
}
/**
* 获取角色详情
*/
@GetMapping("/{roleId}")
public AjaxResult getInfo(@PathVariable Long roleId) {
String sql = "SELECT * FROM sys_role WHERE role_id = ? AND del_flag = '0'";
Map<String, Object> role = jdbcTemplate.queryForMap(sql, roleId);
String menuSql = "SELECT menu_id FROM sys_role_menu WHERE role_id = ?";
List<Long> menuIds = jdbcTemplate.queryForList(menuSql, Long.class, roleId);
role.put("menuIds", menuIds);
return AjaxResult.success(role);
}
/**
* 新增角色
*/
@PostMapping
public AjaxResult add(@RequestBody Map<String, Object> role) {
String roleName = (String) role.get("roleName");
String roleKey = (String) role.get("roleKey");
Integer count = jdbcTemplate.queryForObject(
"SELECT COUNT(*) FROM sys_role WHERE role_name = ? AND del_flag = '0'",
Integer.class, roleName);
if (count != null && count > 0) {
return AjaxResult.error("角色名称已存在");
}
String sql = "INSERT INTO sys_role (role_name, role_key, role_sort, data_scope, status, " +
"create_by, create_time, remark) VALUES (?, ?, ?, ?, ?, 'admin', NOW(), ?)";
jdbcTemplate.update(sql,
roleName,
roleKey,
role.getOrDefault("roleSort", 0),
role.getOrDefault("dataScope", "1"),
role.getOrDefault("status", "0"),
role.get("remark"));
Long roleId = jdbcTemplate.queryForObject("SELECT LAST_INSERT_ID()", Long.class);
saveRoleMenu(roleId, role);
return AjaxResult.success();
}
/**
* 修改角色
*/
@PutMapping
public AjaxResult edit(@RequestBody Map<String, Object> role) {
Long roleId = Long.valueOf(role.get("roleId").toString());
if (roleId == 1) {
return AjaxResult.error("不允许修改超级管理员角色");
}
String sql = "UPDATE sys_role SET role_name = ?, role_key = ?, role_sort = ?, " +
"data_scope = ?, status = ?, remark = ?, update_by = 'admin', update_time = NOW() " +
"WHERE role_id = ?";
jdbcTemplate.update(sql,
role.get("roleName"),
role.get("roleKey"),
role.getOrDefault("roleSort", 0),
role.getOrDefault("dataScope", "1"),
role.getOrDefault("status", "0"),
role.get("remark"),
roleId);
jdbcTemplate.update("DELETE FROM sys_role_menu WHERE role_id = ?", roleId);
saveRoleMenu(roleId, role);
return AjaxResult.success();
}
private void saveRoleMenu(Long roleId, Map<String, Object> role) {
if (role.get("menuIds") != null) {
@SuppressWarnings("unchecked")
List<Integer> menuIds = (List<Integer>) role.get("menuIds");
for (Integer menuId : menuIds) {
jdbcTemplate.update("INSERT INTO sys_role_menu (role_id, menu_id) VALUES (?, ?)", roleId, menuId);
}
}
}
/**
* 删除角色
*/
@DeleteMapping("/{roleIds}")
public AjaxResult remove(@PathVariable String roleIds) {
String[] ids = roleIds.split(",");
for (String id : ids) {
if ("1".equals(id)) {
return AjaxResult.error("不允许删除超级管理员角色");
}
Integer count = jdbcTemplate.queryForObject(
"SELECT COUNT(*) FROM sys_user_role WHERE role_id = ?",
Integer.class, Long.valueOf(id));
if (count != null && count > 0) {
return AjaxResult.error("角色已分配给用户,无法删除");
}
jdbcTemplate.update("UPDATE sys_role SET del_flag = '2' WHERE role_id = ?", Long.valueOf(id));
}
return AjaxResult.success();
}
/**
* 修改状态
*/
@PutMapping("/changeStatus")
public AjaxResult changeStatus(@RequestBody Map<String, Object> role) {
Long roleId = Long.valueOf(role.get("roleId").toString());
if (roleId == 1) {
return AjaxResult.error("不允许修改超级管理员角色状态");
}
String status = (String) role.get("status");
jdbcTemplate.update("UPDATE sys_role SET status = ?, update_time = NOW() WHERE role_id = ?", status, roleId);
return AjaxResult.success();
}
/**
* 获取菜单树
*/
@GetMapping("/menuTree")
public AjaxResult menuTree() {
List<Map<String, Object>> menus = jdbcTemplate.queryForList(
"SELECT menu_id, parent_id, menu_name FROM sys_menu WHERE status = '0' ORDER BY parent_id, order_num");
return AjaxResult.success(buildTree(menus, 0L));
}
/**
* 获取角色已选菜单ID
*/
@GetMapping("/roleMenuIds/{roleId}")
public AjaxResult roleMenuIds(@PathVariable Long roleId) {
List<Long> menuIds = jdbcTemplate.queryForList(
"SELECT menu_id FROM sys_role_menu WHERE role_id = ?", Long.class, roleId);
return AjaxResult.success(menuIds);
}
private List<Map<String, Object>> buildTree(List<Map<String, Object>> list, Long parentId) {
List<Map<String, Object>> result = new ArrayList<>();
for (Map<String, Object> item : list) {
Long pid = ((Number) item.get("parent_id")).longValue();
if (pid.equals(parentId)) {
Map<String, Object> node = new HashMap<>();
Long id = ((Number) item.get("menu_id")).longValue();
node.put("id", id);
node.put("label", item.get("menu_name"));
List<Map<String, Object>> children = buildTree(list, id);
if (!children.isEmpty()) {
node.put("children", children);
}
result.add(node);
}
}
return result;
}
}

View File

@ -1,331 +0,0 @@
package com.pangu.web.controller.system;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.pangu.common.core.domain.AjaxResult;
/**
* 用户管理Controller
*
* @author pangu
*/
@RestController
@RequestMapping("/api/system/user")
public class SysUserController {
@Autowired
private JdbcTemplate jdbcTemplate;
private BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
/**
* 查询用户列表
*/
@GetMapping("/list")
public AjaxResult list(
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize,
@RequestParam(required = false) String userName,
@RequestParam(required = false) String phonenumber,
@RequestParam(required = false) String status,
@RequestParam(required = false) Long deptId) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, ");
sql.append("u.phonenumber, u.sex, u.status, u.create_time, d.dept_name ");
sql.append("FROM sys_user u LEFT JOIN sys_dept d ON u.dept_id = d.dept_id ");
sql.append("WHERE u.del_flag = '0' ");
List<Object> params = new ArrayList<>();
if (userName != null && !userName.isEmpty()) {
sql.append("AND u.user_name LIKE ? ");
params.add("%" + userName + "%");
}
if (phonenumber != null && !phonenumber.isEmpty()) {
sql.append("AND u.phonenumber LIKE ? ");
params.add("%" + phonenumber + "%");
}
if (status != null && !status.isEmpty()) {
sql.append("AND u.status = ? ");
params.add(status);
}
if (deptId != null) {
sql.append(
"AND (u.dept_id = ? OR u.dept_id IN (SELECT dept_id FROM sys_dept WHERE ancestors LIKE CONCAT('%,', ?, ',%') OR ancestors LIKE CONCAT('%,', ?))) ");
params.add(deptId);
params.add(deptId);
params.add(deptId);
}
// 统计总数
String countSql = "SELECT COUNT(*) FROM (" + sql.toString() + ") t";
Integer total = jdbcTemplate.queryForObject(countSql, Integer.class, params.toArray());
// 分页查询
sql.append("ORDER BY u.create_time DESC LIMIT ? OFFSET ?");
params.add(pageSize);
params.add((pageNum - 1) * pageSize);
List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql.toString(), params.toArray());
// 返回分页格式数据
Map<String, Object> result = new HashMap<>();
result.put("code", 200);
result.put("msg", "查询成功");
result.put("rows", rows);
result.put("total", total != null ? total : 0);
return AjaxResult.success(result).put("rows", rows).put("total", total != null ? total : 0);
}
/**
* 获取用户详情
*/
@GetMapping("/{userId}")
public AjaxResult getInfo(@PathVariable Long userId) {
String sql = "SELECT u.*, d.dept_name FROM sys_user u " +
"LEFT JOIN sys_dept d ON u.dept_id = d.dept_id " +
"WHERE u.user_id = ? AND u.del_flag = '0'";
Map<String, Object> user = jdbcTemplate.queryForMap(sql, userId);
// 查询用户角色
String roleSql = "SELECT r.role_id, r.role_name FROM sys_role r " +
"INNER JOIN sys_user_role ur ON r.role_id = ur.role_id " +
"WHERE ur.user_id = ?";
List<Map<String, Object>> roles = jdbcTemplate.queryForList(roleSql, userId);
user.put("roles", roles);
// 查询用户岗位
String postSql = "SELECT p.post_id, p.post_name FROM sys_post p " +
"INNER JOIN sys_user_post up ON p.post_id = up.post_id " +
"WHERE up.user_id = ?";
List<Map<String, Object>> posts = jdbcTemplate.queryForList(postSql, userId);
user.put("posts", posts);
return AjaxResult.success(user);
}
/**
* 获取角色和岗位选项
*/
@GetMapping("/options")
public AjaxResult getOptions() {
Map<String, Object> result = new HashMap<>();
// 查询所有角色
List<Map<String, Object>> roles = jdbcTemplate.queryForList(
"SELECT role_id, role_name FROM sys_role WHERE status = '0' AND del_flag = '0' ORDER BY role_sort");
result.put("roles", roles);
// 查询所有岗位
List<Map<String, Object>> posts = jdbcTemplate.queryForList(
"SELECT post_id, post_name FROM sys_post WHERE status = '0' ORDER BY post_sort");
result.put("posts", posts);
return AjaxResult.success(result);
}
/**
* 获取角色列表下拉选项
*/
@GetMapping("/roleOptions")
public AjaxResult roleOptions() {
List<Map<String, Object>> roles = jdbcTemplate.queryForList(
"SELECT role_id as roleId, role_name as roleName FROM sys_role WHERE status = '0' AND del_flag = '0' ORDER BY role_sort");
return AjaxResult.success(roles);
}
/**
* 获取岗位列表下拉选项
*/
@GetMapping("/postOptions")
public AjaxResult postOptions() {
List<Map<String, Object>> posts = jdbcTemplate.queryForList(
"SELECT post_id as postId, post_name as postName FROM sys_post WHERE status = '0' ORDER BY post_sort");
return AjaxResult.success(posts);
}
/**
* 新增用户
*/
@PostMapping
public AjaxResult add(@RequestBody Map<String, Object> user) {
String userName = (String) user.get("userName");
// 检查用户名是否存在
Integer count = jdbcTemplate.queryForObject(
"SELECT COUNT(*) FROM sys_user WHERE user_name = ? AND del_flag = '0'",
Integer.class, userName);
if (count > 0) {
return AjaxResult.error("用户名已存在");
}
// 加密密码
String password = (String) user.getOrDefault("password", "123456");
String encodedPassword = passwordEncoder.encode(password);
String sql = "INSERT INTO sys_user (dept_id, user_name, nick_name, email, phonenumber, sex, password, status, create_by, create_time) "
+
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'admin', NOW())";
jdbcTemplate.update(sql,
user.get("deptId"),
userName,
user.get("nickName"),
user.get("email"),
user.get("phonenumber"),
user.getOrDefault("sex", "0"),
encodedPassword,
user.getOrDefault("status", "0"));
// 获取新插入的用户ID
Long userId = jdbcTemplate.queryForObject("SELECT LAST_INSERT_ID()", Long.class);
// 关联角色
if (user.get("roleIds") != null) {
List<Integer> roleIds = (List<Integer>) user.get("roleIds");
for (Integer roleId : roleIds) {
jdbcTemplate.update("INSERT INTO sys_user_role (user_id, role_id) VALUES (?, ?)", userId, roleId);
}
}
// 关联岗位
if (user.get("postIds") != null) {
List<Integer> postIds = (List<Integer>) user.get("postIds");
for (Integer postId : postIds) {
jdbcTemplate.update("INSERT INTO sys_user_post (user_id, post_id) VALUES (?, ?)", userId, postId);
}
}
return AjaxResult.success();
}
/**
* 修改用户
*/
@PutMapping
public AjaxResult edit(@RequestBody Map<String, Object> user) {
Long userId = Long.valueOf(user.get("userId").toString());
String sql = "UPDATE sys_user SET dept_id = ?, nick_name = ?, email = ?, phonenumber = ?, " +
"sex = ?, status = ?, update_by = 'admin', update_time = NOW() WHERE user_id = ?";
jdbcTemplate.update(sql,
user.get("deptId"),
user.get("nickName"),
user.get("email"),
user.get("phonenumber"),
user.getOrDefault("sex", "0"),
user.getOrDefault("status", "0"),
userId);
// 更新角色关联
jdbcTemplate.update("DELETE FROM sys_user_role WHERE user_id = ?", userId);
if (user.get("roleIds") != null) {
List<Integer> roleIds = (List<Integer>) user.get("roleIds");
for (Integer roleId : roleIds) {
jdbcTemplate.update("INSERT INTO sys_user_role (user_id, role_id) VALUES (?, ?)", userId, roleId);
}
}
// 更新岗位关联
jdbcTemplate.update("DELETE FROM sys_user_post WHERE user_id = ?", userId);
if (user.get("postIds") != null) {
List<Integer> postIds = (List<Integer>) user.get("postIds");
for (Integer postId : postIds) {
jdbcTemplate.update("INSERT INTO sys_user_post (user_id, post_id) VALUES (?, ?)", userId, postId);
}
}
return AjaxResult.success();
}
/**
* 删除用户
*/
@DeleteMapping("/{userIds}")
public AjaxResult remove(@PathVariable String userIds) {
String[] ids = userIds.split(",");
for (String id : ids) {
if ("1".equals(id)) {
return AjaxResult.error("不允许删除超级管理员");
}
jdbcTemplate.update("UPDATE sys_user SET del_flag = '2' WHERE user_id = ?", Long.valueOf(id));
}
return AjaxResult.success();
}
/**
* 重置密码
*/
@PutMapping("/resetPwd")
public AjaxResult resetPwd(@RequestBody Map<String, Object> user) {
Long userId = Long.valueOf(user.get("userId").toString());
String password = (String) user.getOrDefault("password", "123456");
String encodedPassword = passwordEncoder.encode(password);
jdbcTemplate.update("UPDATE sys_user SET password = ?, update_time = NOW() WHERE user_id = ?",
encodedPassword, userId);
return AjaxResult.success();
}
/**
* 修改状态
*/
@PutMapping("/changeStatus")
public AjaxResult changeStatus(@RequestBody Map<String, Object> user) {
Long userId = Long.valueOf(user.get("userId").toString());
String status = (String) user.get("status");
jdbcTemplate.update("UPDATE sys_user SET status = ?, update_time = NOW() WHERE user_id = ?",
status, userId);
return AjaxResult.success();
}
/**
* 获取部门树
*/
@GetMapping("/deptTree")
public AjaxResult deptTree() {
List<Map<String, Object>> depts = jdbcTemplate.queryForList(
"SELECT dept_id, parent_id, dept_name FROM sys_dept WHERE status = '0' AND del_flag = '0' ORDER BY order_num");
List<Map<String, Object>> tree = buildTree(depts, 0L);
return AjaxResult.success(tree);
}
private List<Map<String, Object>> buildTree(List<Map<String, Object>> list, Long parentId) {
List<Map<String, Object>> result = new ArrayList<>();
for (Map<String, Object> item : list) {
Long pid = ((Number) item.get("parent_id")).longValue();
if (pid.equals(parentId)) {
Map<String, Object> node = new HashMap<>();
Long deptId = ((Number) item.get("dept_id")).longValue();
node.put("id", deptId);
node.put("label", item.get("dept_name"));
List<Map<String, Object>> children = buildTree(list, deptId);
if (!children.isEmpty()) {
node.put("children", children);
}
result.add(node);
}
}
return result;
}
}

View File

@ -57,6 +57,13 @@
AND school_id = #{schoolId}
</select>
<select id="countByGradeId" parameterType="Long" resultType="int">
SELECT COUNT(*)
FROM pg_school_grade
WHERE del_flag = '0'
AND grade_id = #{gradeId}
</select>
<insert id="batchInsert">
INSERT INTO pg_school_grade (school_id, grade_id, order_num, status, create_by, create_time, del_flag)
VALUES

View File

@ -0,0 +1,24 @@
package com.pangu;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
/**
* 测试用启动配置 pangu-system 模块内 @SpringBootTest 使用
* @author pangu
*/
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(basePackages = "com.pangu")
@MapperScan("com.pangu.**.mapper")
public class TestApplication {
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}

View File

@ -1,24 +1,31 @@
package com.pangu.application.service;
import com.pangu.application.domain.dto.ApplicationDTO;
import com.pangu.application.domain.entity.ApiDict;
import com.pangu.application.domain.vo.ApplicationVO;
import com.pangu.common.core.page.TableDataInfo;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.Arrays;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
import com.pangu.application.domain.dto.ApplicationDTO;
import com.pangu.application.domain.entity.ApiDict;
import com.pangu.application.domain.vo.ApplicationVO;
import com.pangu.common.core.page.TableDataInfo;
/**
* 应用服务测试类
*
* @author 湖北新华业务中台研发团队
*/
@SpringBootTest
@SpringBootTest(classes = com.pangu.TestApplication.class)
@Transactional // 测试完成后回滚
public class ApplicationServiceTest {

View File

@ -1,5 +1,28 @@
package com.pangu.integration;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.Arrays;
import java.util.List;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import com.pangu.application.domain.dto.ApplicationDTO;
import com.pangu.application.domain.vo.ApplicationVO;
import com.pangu.application.service.IApplicationService;
import com.pangu.base.service.IRegionService;
import com.pangu.common.core.page.TableDataInfo;
import com.pangu.member.domain.dto.MemberDTO;
import com.pangu.member.domain.entity.Member;
@ -12,19 +35,6 @@ import com.pangu.school.service.ISchoolService;
import com.pangu.student.domain.dto.StudentDTO;
import com.pangu.student.domain.vo.StudentVO;
import com.pangu.student.service.IStudentService;
import com.pangu.application.domain.dto.ApplicationDTO;
import com.pangu.application.domain.vo.ApplicationVO;
import com.pangu.application.service.IApplicationService;
import com.pangu.base.service.IRegionService;
import org.junit.jupiter.api.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
/**
* 模块集成测试类
@ -32,7 +42,7 @@ import static org.junit.jupiter.api.Assertions.*;
*
* @author 湖北新华业务中台研发团队
*/
@SpringBootTest
@SpringBootTest(classes = com.pangu.TestApplication.class)
@Transactional
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class ModuleIntegrationTest {

View File

@ -1,24 +1,31 @@
package com.pangu.member.service;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import com.pangu.common.core.exception.ServiceException;
import com.pangu.common.core.page.TableDataInfo;
import com.pangu.member.domain.dto.MemberDTO;
import com.pangu.member.domain.entity.Member;
import com.pangu.member.domain.vo.MemberVO;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import static org.junit.jupiter.api.Assertions.*;
/**
* 会员服务测试类
*
* @author pangu
*/
@SpringBootTest
@SpringBootTest(classes = com.pangu.TestApplication.class)
@Transactional // 测试完成后回滚
public class MemberServiceTest {

View File

@ -20,7 +20,7 @@ import static org.junit.jupiter.api.Assertions.*;
* 学校服务测试类
* @author pangu
*/
@SpringBootTest
@SpringBootTest(classes = com.pangu.TestApplication.class)
@Transactional // 测试完成后回滚
public class SchoolServiceTest {

View File

@ -1,25 +1,30 @@
package com.pangu.student.service;
import com.pangu.common.core.exception.ServiceException;
import com.pangu.common.core.page.TableDataInfo;
import com.pangu.student.domain.dto.StudentDTO;
import com.pangu.student.domain.entity.Student;
import com.pangu.student.domain.vo.StudentVO;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.time.LocalDate;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import static org.junit.jupiter.api.Assertions.*;
import com.pangu.common.core.exception.ServiceException;
import com.pangu.common.core.page.TableDataInfo;
import com.pangu.student.domain.dto.StudentDTO;
import com.pangu.student.domain.vo.StudentVO;
/**
* 学生服务测试类
*
* @author pangu
*/
@SpringBootTest
@SpringBootTest(classes = com.pangu.TestApplication.class)
@Transactional // 测试完成后回滚
public class StudentServiceTest {

View File

@ -0,0 +1,18 @@
# 测试环境配置,供 pangu-system 单模块测试使用
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:testdb;MODE=MySQL;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS PUBLIC
username: sa
password:
mybatis-plus:
mapper-locations: classpath*:mapper/**/*.xml
type-aliases-package: com.pangu.**.domain
configuration:
map-underscore-to-camel-case: true
pagehelper:
helper-dialect: h2
reasonable: true
support-methods-arguments: true