Commit 0d2ef3ea authored by jiatao's avatar jiatao

提交初始化配置

parent cb79e7eb
version: '3.1'
services:
mysql:
container_name: mysql
image: mysql:8.0.33
ports:
- "3306:3306"
volumes:
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/logs:/logs
- ./mysql/data:/var/lib/mysql
- ./db:/db
command: [
'mysqld',
'--innodb-buffer-pool-size=80M',
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_general_ci',
'--default-time-zone=+8:00',
'--lower-case-table-names=1'
]
environment:
MYSQL_DATABASE: 'rs_dev'
MYSQL_ROOT_PASSWORD: xjtu@gwyy.
MYSQL_CHARSET: 'utf8mb4'
MYSQL_COLLATION: 'utf8mb4_general_ci'
healthcheck: # MySQL健康检查
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p$$MYSQL_ROOT_PASSWORD"] # 使用环境变量进行连接检查
interval: 10s
timeout: 5s
retries: 3
start_period: 30s # 给MySQL足够的初始化时间
restart: always # 容器退出时总是重启容器
nginx:
image: nginx:1.24.0 # 镜像`nginx:1.21.1`
container_name: nginx # 容器名为'nginx'
restart: unless-stopped # 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器
volumes: # 数据卷挂载路径设置,将本机目录映射到容器目录
- "./nginx/conf/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
- "./nginx/log:/var/log/nginx"
- "./nginx/conf.d:/etc/nginx/conf.d"
environment: # 设置环境变量,相当于docker run命令中的-e
TZ: Asia/Shanghai
LANG: en_US.UTF-8
ports: # 映射端口
- "80:80"
networks:
- my-network
redis:
image: redis:7.0.5 # 镜像'redis:7.0.5'
container_name: redis # 容器名为'redis'
restart: unless-stopped # 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器
command: redis-server /etc/redis/redis.conf --appendonly no # 启动redis服务并添加密码为:123456,默认不开启redis-aof方式持久化配置
# command: redis-server --requirepass 123456 --appendonly yes # 启动redis服务并添加密码为:123456,并开启redis持久化配置
environment: # 设置环境变量,相当于docker run命令中的-e
TZ: Asia/Shanghai
LANG: en_US.UTF-8
volumes: # 数据卷挂载路径设置,将本机目录映射到容器目录
- "./redis/data:/data"
- "./redis/conf/redis.conf:/etc/redis/redis.conf" # `redis.conf`文件内容`http://download.redis.io/redis-stable/redis.conf`
ports: # 映射端口
- "6379:6379"
healthcheck: # Redis健康检查
test: ["CMD", "redis-cli", "ping"] # 发送PING命令,期待返回PONG
interval: 5s
timeout: 3s
retries: 5
start_period: 10s
networks:
- my-network
rs-service:
container_name: rs-service
build:
context: ./service
dockerfile: dockerfile
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://10.47.2.11:3306/rs_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
SPRING_DATASOURCE_USERNAME: rs_service
SPRING_DATASOURCE_PASSWORD: ezGkNdezsZJE
REDIS_HOST: 10.47.2.10
REDIS_PORT: 6379
REDIS_PASSWORD:
UPLOAD_PATH: /home/rs/uploadPath
# 将时区设置为Asia/Shanghai
TZ: Asia/Shanghai
depends_on: # 依赖关系定义
redis:
condition: service_healthy # 明确等待Redis健康
mysql:
condition: service_healthy # 明确等待MySQL健康
volumes:
- ./service/logs:/home/rs/logs
- ./service/uploadPath:/home/rs/uploadPath
networks:
- my-network
networks:
my-network:
name: my-network
driver: bridge
# 基础镜像
FROM openjdk:8
# author
MAINTAINER ruoyi
# 挂载目录
VOLUME /home/rs
# 创建目录
RUN mkdir -p /home/rs
# 指定路径
WORKDIR /home/rs
# 复制jar文件到路径
COPY ./jar/ruoyi-admin.jar /home/rs/ruoyi-admin.jar
# 启动应用
ENTRYPOINT ["java","-jar","ruoyi-admin.jar"]
package com.ruoyi.cas;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.enums.IdentityTypeCode;
import com.ruoyi.common.enums.UserStatus;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.uuid.UUID;
import com.ruoyi.framework.web.service.SysLoginService;
import com.ruoyi.framework.web.service.SysPermissionService;
import com.ruoyi.system.cas.CasUserInfo;
import com.ruoyi.system.cas.CasValidationResult;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.ISysUserService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import com.ruoyi.framework.web.service.TokenService;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
@Service
@Slf4j
public class CasAuthService {
private static final Logger logger = LoggerFactory.getLogger(CasAuthService.class);
@Value("${cas.server-url}")
private String casServerUrl;
@Value("${cas.client-host-url}")
private String clientHostUrl;
@Autowired
private ISysUserService userService;
@Autowired
private TokenService tokenService;
@Autowired
private ISysRoleService sysRoleService;
@Autowired
private ISysDeptService deptService;
@Autowired
private SysLoginService loginService;
@Autowired
private SysPermissionService permissionService;
private static final String DEFAULT_PASSWORD = "";
/**
* 读取XML文件内容
*/
private String readXmlFile(String filename) {
try {
Resource resource = new ClassPathResource("cas/" + filename);
return new String(Files.readAllBytes(Paths.get(resource.getURI())));
} catch (Exception e) {
throw new RuntimeException("读取XML文件失败: " + filename, e);
}
}
/**
* 手动验证CAS票据
*/
public AjaxResult validateTicket(String ticket, String service) {
try {
// 构建验证URL
String validateUrl = StringUtils.format("{}/serviceValidate?service={}&ticket={}&format=XML",
casServerUrl,
URLEncoder.encode(service, StandardCharsets.UTF_8.toString()),
ticket);
logger.info("CAS验证URL: {}", validateUrl);
// 发送验证请求
// RestTemplate restTemplate = new RestTemplate();
// String xmlResponse = restTemplate.getForObject(validateUrl, String.class);
String xmlResponse = readXmlFile("cas_success_response.xml");
logger.info("CAS验证响应: {}", xmlResponse);
// 解析响应
CasValidationResult result = parseCasResponse(xmlResponse);
if (result.isSuccess()) {
return handleSuccessfulLogin(result.getUserInfo());
} else {
return AjaxResult.error("CAS认证失败: " + result.getErrorCode());
}
} catch (Exception e) {
logger.error("CAS票据验证异常", e);
return AjaxResult.error("CAS认证服务异常: " + e.getMessage());
}
}
/**
* 解析CAS响应
*/
private CasValidationResult parseCasResponse(String xmlResponse) throws Exception {
CasValidationResult result = new CasValidationResult();
if (StringUtils.isBlank(xmlResponse)) {
result.setSuccess(false);
result.setErrorCode("EMPTY_RESPONSE");
return result;
}
// 检查是否包含认证成功标签
if (xmlResponse.contains("<cas:authenticationSuccess>")) {
// 使用DOM解析XML
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new InputSource(new StringReader(xmlResponse)));
// 获取用户名
NodeList userNodes = doc.getElementsByTagName("cas:user");
if (userNodes.getLength() > 0) {
String username = userNodes.item(0).getTextContent();
CasUserInfo userInfo = new CasUserInfo();
userInfo.setUsername(username);
// 解析属性
parseUserAttributes(doc, userInfo);
result.setSuccess(true);
result.setUserInfo(userInfo);
} else {
result.setSuccess(false);
result.setErrorCode("NO_USER_FOUND");
}
} else {
// 认证失败
result.setSuccess(false);
// 尝试提取错误信息
if (xmlResponse.contains("INVALID_TICKET")) {
result.setErrorCode("INVALID_TICKET");
} else if (xmlResponse.contains("INVALID_SERVICE")) {
result.setErrorCode("INVALID_SERVICE");
} else {
result.setErrorCode("AUTH_FAILED");
}
}
return result;
}
/**
* 解析用户属性
*/
private void parseUserAttributes(Document doc, CasUserInfo userInfo) {
try {
NodeList attributeNodes = doc.getElementsByTagName("cas:attribute");
for (int i = 0; i < attributeNodes.getLength(); i++) {
Node node = attributeNodes.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
String name = element.getAttribute("name");
String value = element.getTextContent();
switch (name) {
case "name":
userInfo.setName(value);
break;
case "userId":
userInfo.setUserId(value);
break;
case "userName":
userInfo.setUsername(value);
break;
case "identityTypeCode":
userInfo.setIdentityTypeCode(value);
break;
case "organizationCode":
userInfo.setOrganizationCode(value);
break;
case "organizationName":
userInfo.setOrganizationName(value);
break;
}
}
}
} catch (Exception e) {
logger.warn("解析用户属性失败", e);
}
}
/**
* 处理登录成功
*/
private AjaxResult handleSuccessfulLogin(CasUserInfo userInfo) {
try {
// 根据CAS用户名查找本地用户
SysUser user = userService.selectUserByUserName(userInfo.getUsername());
if (user == null) {
// 用户不存在,自动创建用户(根据业务需求)
user = createUserFromCasInfo(userInfo);
}
// 检查用户状态
if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
return AjaxResult.error("对不起,您的账号已被禁用");
}
// 记录登录信息
loginService.recordLoginInfo(user.getUserId());
// 生成Token
LoginUser loginUser = new LoginUser();
loginUser.setUser(user);
// 权限集合
Set<String> permissions = permissionService.getMenuPermission(user);
loginUser.setPermissions(permissions);
String token = tokenService.createToken(loginUser);
// 返回登录结果
Map<String, Object> authResult = new HashMap<>();
authResult.put("token", token);
return AjaxResult.success("CAS认证成功", authResult);
} catch (Exception e) {
logger.error("处理CAS登录失败", e);
return AjaxResult.error("登录处理异常: " + e.getMessage());
}
}
/**
* 根据CAS信息创建用户
*/
private SysUser createUserFromCasInfo(CasUserInfo userInfo) {
// 根据业务需求实现用户自动创建逻辑
// 这里可以根据CAS返回的身份代码决定用户角色等
logger.info("自动创建用户: {}", userInfo.getUsername());
SysUser user = new SysUser();
user.setUserName(userInfo.getUsername());
user.setNickName(userInfo.getName());
user.setPassword((SecurityUtils.encryptPassword("gwyy@xjtu.")));
user.setStatus("0");
user.setCreateBy(userInfo.getUsername());
user.setCreateTime(new Date());
IdentityTypeCode identityTypeCode = IdentityTypeCode.getEnumByCode(userInfo.getIdentityTypeCode());
assert identityTypeCode != null;
if (StringUtils.isEmpty(identityTypeCode.getRoleKey())){
throw new ServiceException("用户暂无角色分配");
}
SysRole role = sysRoleService.selectRoleByRoleKey(identityTypeCode.getRoleKey());
if (StringUtils.isNull(role)){
throw new ServiceException("分配角色信息为空,请联系管理员");
}
user.setRoleIds(new Long[]{role.getRoleId()});
if (StringUtils.isNotEmpty(userInfo.getOrganizationCode())){
SysDept dept = deptService.selectDeptByCode(userInfo.getOrganizationCode());
user.setDeptId(dept.getDeptId());
}
userService.insertUser(user);
return userService.selectUserByUserName(userInfo.getUsername());
}
/**
* 构建CAS登录URL
*/
public String buildLoginUrl(String redirectUrl) {
try {
String service = URLEncoder.encode(clientHostUrl + redirectUrl, "UTF-8");
return casServerUrl + "/login?service=" + service;
} catch (UnsupportedEncodingException e) {
logger.error("构建CAS登录URL失败", e);
throw new ServiceException("构建CAS登录URL失败,请刷新重试");
}
}
/**
* 构建登出URL
*/
public String buildLogoutUrl(String redirectUrl) {
if (StringUtils.isNotEmpty(redirectUrl)) {
try {
return casServerUrl + "/logout?service=" +
URLEncoder.encode(redirectUrl, String.valueOf(StandardCharsets.UTF_8));
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
return casServerUrl + "/logout";
}
}
package com.ruoyi.cas;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.service.TokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
@RestController
@RequestMapping("/api/cas")
public class CasController extends BaseController {
@Autowired
private CasAuthService casAuthService;
@Autowired
private TokenService tokenService;
/**
* 跳转到CAS登录
*/
@GetMapping("/login")
public AjaxResult login(HttpServletRequest request,
@RequestParam String redirect) throws IOException {
String loginUrl = casAuthService.buildLoginUrl(redirect);
return AjaxResult.success().put("loginUrl",loginUrl);
}
/**
* CAS回调接口
*/
@GetMapping("/callback")
public AjaxResult callback(
@RequestParam String ticket,
@RequestParam(required = false) String redirect) throws IOException {
try {
String service = buildServiceUrl(redirect);
return casAuthService.validateTicket(ticket, service);
} catch (Exception e) {
logger.error("CAS回调处理异常", e);
return AjaxResult.error(e.getMessage());
}
}
/**
* 退出登录
*/
@PostMapping("/logout")
public AjaxResult logout(HttpServletRequest request, @RequestParam(required = false) String redirect) {
// 获取当前登录用户
LoginUser loginUser = tokenService.getLoginUser(request);
if (loginUser != null) {
// 删除本地用户缓存
tokenService.delLoginUser(loginUser.getToken());
}
// 构建CAS登出URL
String logoutUrl = casAuthService.buildLogoutUrl(redirect);
return AjaxResult.success().put("logoutUrl",logoutUrl);
}
/**
* 构建服务URL
*/
private String buildServiceUrl(String redirect) {
String baseUrl = getBaseUrl();
String service = baseUrl + "/api/cas/callback";
if (StringUtils.isNotEmpty(redirect)) {
try {
service += "?redirect=" + URLEncoder.encode(redirect, String.valueOf(StandardCharsets.UTF_8));
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
return service;
}
/**
* 构建带Token的重定向URL
*/
private String buildRedirectUrlWithToken(String redirectUrl, String token) {
String separator = redirectUrl.contains("?") ? "&" : "?";
return redirectUrl + separator + "token=" + token;
}
/**
* 获取默认重定向URL
*/
private String getDefaultRedirectUrl() {
return getBaseUrl() + "/index";
}
/**
* 获取基础URL
*/
private String getBaseUrl() {
// 根据实际情况实现获取当前系统URL的逻辑
return "http://gwyy.xjtu.edu.cn";
}
}
\ No newline at end of file
package com.ruoyi.web.controller.system;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.ApprovalStatus;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.ReservationApproval;
import com.ruoyi.system.domain.SpaceSeat;
import com.ruoyi.system.service.IReservationApprovalService;
import com.ruoyi.system.service.ISpaceSeatService;
import com.ruoyi.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@RequestMapping("/system/approval")
@RestController
public class ReservationApprovalController extends BaseController {
@Autowired
public IReservationApprovalService reservationApprovalService;
@Autowired
private ISpaceSeatService spaceSeatService;
@Autowired
private ISysUserService userService;
@PreAuthorize("@ss.hasPermi('system:approval:list')")
@GetMapping("/list")
public TableDataInfo list(ReservationApproval reservationApproval){
startPage();
List<ReservationApproval> list = reservationApprovalService.list(new LambdaQueryWrapper<ReservationApproval>()
.eq(StringUtils.isNotEmpty(reservationApproval.getSeatCode()),ReservationApproval::getSeatCode,reservationApproval.getSeatCode())
.eq(StringUtils.isNotEmpty(reservationApproval.getSubmitBy()),ReservationApproval::getSubmitBy,reservationApproval.getSubmitBy())
.eq(StringUtils.isNotEmpty(reservationApproval.getStatus()),ReservationApproval::getStatus,reservationApproval.getStatus())
.orderByDesc(ReservationApproval::getSubmitAt));
List<String> seatCodes = list.stream().map(ReservationApproval::getSeatCode).collect(Collectors.toList());
Map<String, SpaceSeat> spaceSeatMap = spaceSeatService.selectSpaceSeatByCodes(seatCodes)
.stream().collect(Collectors.toMap(SpaceSeat::getSeatCode, Function.identity()));
List<String> submitPersonNos = list.stream().map(ReservationApproval::getSubmitBy).collect(Collectors.toList());
List<String> approvedPersonNos = list.stream().map(ReservationApproval::getApprovedBy).collect(Collectors.toList());
submitPersonNos.addAll(approvedPersonNos);
submitPersonNos.add("default");
Map<String,String> personNameMap = userService.selectUsersByUserName(submitPersonNos)
.stream().collect(Collectors.toMap(SysUser::getUserName,SysUser::getNickName));
for (ReservationApproval approval : list) {
approval.setSpaceSeat(spaceSeatMap.getOrDefault(approval.getSeatCode(),new SpaceSeat()));
approval.setSubmitByName(personNameMap.getOrDefault(approval.getSubmitBy(),""));
approval.setApprovedByName(personNameMap.getOrDefault(approval.getApprovedBy(),""));
}
return getDataTable(list);
}
/**
* 最近预约
* @return
*/
@PreAuthorize("@ss.hasPermi('system:approval:RecentReservation')")
@GetMapping("/recentReservation")
public AjaxResult RecentReservation(){
List<ReservationApproval> list = reservationApprovalService.list(new LambdaQueryWrapper<ReservationApproval>()
.eq(ReservationApproval::getSubmitBy,SecurityUtils.getUsername())
.in(ReservationApproval::getStatus, ApprovalStatus.PASS.getCode(),ApprovalStatus.WAITING.getCode())
.ge(ReservationApproval::getStartAt,new Date()));
List<String> seatCodes = list.stream().map(ReservationApproval::getSeatCode).collect(Collectors.toList());
Map<String, SpaceSeat> spaceSeatMap = spaceSeatService.selectSpaceSeatByCodes(seatCodes)
.stream().collect(Collectors.toMap(SpaceSeat::getSeatCode, Function.identity()));
for (ReservationApproval approval : list) {
approval.setSpaceSeat(spaceSeatMap.getOrDefault(approval.getSeatCode(),new SpaceSeat()));
}
return AjaxResult.success(list);
}
/**
* 提交审核
* @param reservationApproval
* @return
*/
@PostMapping("/submit")
public AjaxResult submit(@RequestBody ReservationApproval reservationApproval){
return AjaxResult.success(reservationApprovalService.submitApproval(reservationApproval));
}
/**
* 审核 工位申请
* @param reservationApproval
* @return
*/
@PostMapping("/approval")
public AjaxResult approval(@RequestBody ReservationApproval reservationApproval){
if (!reservationApproval.getStatus().equals(ApprovalStatus.PASS.getCode())
&& !reservationApproval.getStatus().equals(ApprovalStatus.FAILED.getCode())){
throw new ServiceException("审核参数错误!");
}
ReservationApproval entity = reservationApprovalService.getById(reservationApproval.getApprovalId());
if (StringUtils.isNull(entity)){
throw new ServiceException("参数错误,无法查询指定申请");
}
if (!entity.getStatus().equals(ApprovalStatus.WAITING.getCode())){
throw new ServiceException("请刷新重试,该申请无法审核");
}
ReservationApproval updateEntity = new ReservationApproval();
updateEntity.setApprovedBy(SecurityUtils.getUsername());
updateEntity.setApprovedAt(new Date());
updateEntity.setApprovalId(reservationApproval.getApprovalId());
updateEntity.setStatus(reservationApproval.getStatus());
return AjaxResult.success(reservationApprovalService.updateById(updateEntity));
}
/**
* 签到
* @param approvalId
* @return
*/
@PostMapping("/sign/{approvalId}")
public AjaxResult sign(@PathVariable("approvalId") Long approvalId){
ReservationApproval reservationApproval = reservationApprovalService.getById(approvalId);
if (StringUtils.isNull(reservationApproval)){
throw new ServiceException("参数错误,查询不到指定的申请");
}
// Date currDate = new Date();
// if (currDate.getTime() < DateUtil.offsetMinute(reservationApproval.getStartAt(),-10).getTime()){
// throw new ServiceException("还未到签到时间");
// }
//
// if (currDate.getTime() > reservationApproval.getEndAt().getTime()){
// throw new ServiceException("已过签到时间");
// }
reservationApproval.setStatus(ApprovalStatus.ALREADY_SIGN.getCode());
return AjaxResult.success(reservationApprovalService.updateById(reservationApproval));
}
/**
* 撤销申请
* @param approvalId
* @return
*/
@PostMapping("/cancel/{approvalId}")
public AjaxResult cancelApproval(@PathVariable("approvalId") Long approvalId){
ReservationApproval reservationApproval = reservationApprovalService.getById(approvalId);
if (StringUtils.isNull(reservationApproval)){
throw new ServiceException("参数错误,查询不到指定的申请");
}
return AjaxResult.success(reservationApprovalService.removeById(approvalId));
}
}
package com.ruoyi.web.controller.system;
import java.util.List;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.enums.BlacklistStatus;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.ReservationBlacklist;
import com.ruoyi.system.service.IReservationBlacklistService;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 黑名单
Controller
*
* @author ruoyi
* @date 2025-11-04
*/
@RestController
@RequestMapping("/system/blacklist")
public class ReservationBlacklistController extends BaseController
{
@Autowired
private IReservationBlacklistService reservationBlacklistService;
/**
* 查询黑名单
列表
*/
@PreAuthorize("@ss.hasPermi('system:blacklist:list')")
@GetMapping("/list")
public TableDataInfo list(ReservationBlacklist reservationBlacklist)
{
startPage();
List<ReservationBlacklist> list = reservationBlacklistService.selectReservationBlacklistList(reservationBlacklist);
return getDataTable(list);
}
/**
* 获取黑名单
详细信息
*/
@PreAuthorize("@ss.hasPermi('system:blacklist:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return success(reservationBlacklistService.selectReservationBlacklistById(id));
}
/**
* 新增黑名单
*/
@PreAuthorize("@ss.hasPermi('system:blacklist:add')")
@Log(title = "黑名单 ", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody ReservationBlacklist reservationBlacklist)
{
long count = reservationBlacklistService.count(new LambdaQueryWrapper<ReservationBlacklist>()
.eq(ReservationBlacklist::getPersonNo,reservationBlacklist.getPersonNo()));
if (count>0){
throw new ServiceException("黑名单已有成员,请勿重复添加");
}
if (StringUtils.isEmpty(reservationBlacklist.getStatus())){
reservationBlacklist.setStatus(BlacklistStatus.OPEN.getCode());
}
return toAjax(reservationBlacklistService.insertReservationBlacklist(reservationBlacklist));
}
/**
* 修改黑名单
*/
@PreAuthorize("@ss.hasPermi('system:blacklist:edit')")
@Log(title = "黑名单", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody ReservationBlacklist reservationBlacklist)
{
return toAjax(reservationBlacklistService.updateReservationBlacklist(reservationBlacklist));
}
/**
* 删除黑名单
*/
@PreAuthorize("@ss.hasPermi('system:blacklist:remove')")
@Log(title = "黑名单", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
{
return toAjax(reservationBlacklistService.deleteReservationBlacklistByIds(ids));
}
}
package com.ruoyi.web.controller.system;
import java.util.List;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.SchoolBuildService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.SchoolBuild;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 楼宇Controller
*
* @author ruoyi
* @date 2025-11-03
*/
@RestController
@RequestMapping("/system/build")
public class SchoolBuildController extends BaseController
{
@Autowired
private SchoolBuildService schoolBuildService;
/**
* 查询楼宇列表
*/
@PreAuthorize("@ss.hasPermi('system:build:list')")
@GetMapping("/list")
public TableDataInfo list(SchoolBuild schoolBuild)
{
startPage();
List<SchoolBuild> list = schoolBuildService.list(new LambdaQueryWrapper<SchoolBuild>()
.eq(StringUtils.isNotEmpty(schoolBuild.getCampusCode()),SchoolBuild::getCampusCode,schoolBuild.getCampusCode())
.like(StringUtils.isNotEmpty(schoolBuild.getBuildName()),SchoolBuild::getBuildName,schoolBuild.getBuildName()));
return getDataTable(list);
}
/**
* 获取楼宇详细信息
*/
@PreAuthorize("@ss.hasPermi('system:build:query')")
@GetMapping(value = "/{buildId}")
public AjaxResult getInfo(@PathVariable("buildId") Long buildId)
{
return success(schoolBuildService.getBuildById(buildId));
}
/**
* 新增楼宇
*/
@PreAuthorize("@ss.hasPermi('system:build:add')")
@Log(title = "楼宇", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody SchoolBuild schoolBuild)
{
return toAjax(schoolBuildService.insertBuild(schoolBuild));
}
/**
* 修改楼宇
*/
@PreAuthorize("@ss.hasPermi('system:build:edit')")
@Log(title = "楼宇", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody SchoolBuild schoolBuild)
{
return toAjax(schoolBuildService.updateBuild(schoolBuild));
}
/**
* 删除楼宇
*/
@PreAuthorize("@ss.hasPermi('system:build:remove')")
@Log(title = "楼宇", businessType = BusinessType.DELETE)
@DeleteMapping("/{buildId}")
public AjaxResult remove(@PathVariable Long buildId)
{
return toAjax(schoolBuildService.deleteBuild(buildId));
}
}
package com.ruoyi.web.controller.system;
import java.util.List;
import java.util.stream.Collectors;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.core.tree.TreeDto;
import com.ruoyi.common.core.tree.TreeUtil;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.SchoolBuildService;
import com.ruoyi.system.service.SchoolCampusService;
import com.ruoyi.system.service.SchoolFloorService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.SchoolCampus;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 校区Controller
*
* @author ruoyi
* @date 2025-11-03
*/
@RestController
@RequestMapping("/system/campus")
public class SchoolCampusController extends BaseController
{
@Autowired
private SchoolCampusService schoolCampusService;
@Autowired
private SchoolBuildService schoolBuildService;
@Autowired
private SchoolFloorService schoolFloorService;
/**
* 查询校区列表
*/
@PreAuthorize("@ss.hasPermi('system:campus:list')")
@GetMapping("/list")
public TableDataInfo list(SchoolCampus schoolCampus)
{
startPage();
List<SchoolCampus> list = schoolCampusService.list(new LambdaQueryWrapper<SchoolCampus>()
.like(StringUtils.isNotEmpty(schoolCampus.getName()),SchoolCampus::getName,schoolCampus.getName()));
return getDataTable(list);
}
/**
* 获取校区详细信息
*/
@PreAuthorize("@ss.hasPermi('system:campus:query')")
@GetMapping(value = "/{campusId}")
public AjaxResult getInfo(@PathVariable("campusId") Long campusId)
{
return success(schoolCampusService.getById(campusId));
}
/**
* 新增校区
*/
@PreAuthorize("@ss.hasPermi('system:campus:add')")
@Log(title = "校区", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody SchoolCampus schoolCampus)
{
return toAjax(schoolCampusService.insertCampus(schoolCampus));
}
/**
* 修改校区
*/
@PreAuthorize("@ss.hasPermi('system:campus:edit')")
@Log(title = "校区", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody SchoolCampus schoolCampus)
{
return toAjax(schoolCampusService.updateCampus(schoolCampus));
}
/**
* 删除校区
*/
@PreAuthorize("@ss.hasPermi('system:campus:remove')")
@Log(title = "校区", businessType = BusinessType.DELETE)
@DeleteMapping("/{campusId}")
public AjaxResult remove(@PathVariable Long campusId)
{
return toAjax(schoolCampusService.deleteCampus(campusId));
}
/**
* 获取校区 - 楼栋 - 楼层 树
* @return
*/
@GetMapping("/get-campus-tree")
public AjaxResult getCampusTree(){
// 1:获取校区
List<TreeDto> schoolCampuses = schoolCampusService.selectTreeDto(null,null);
List<String> campusCodes = schoolCampuses.stream().map(TreeDto::getCode)
.collect(Collectors.toList());
campusCodes.add("default");
List<TreeDto> builds = schoolBuildService.selectTreeDtos(campusCodes);
List<String> buildCodes = builds.stream().map(TreeDto::getCode).collect(Collectors.toList());
buildCodes.add("default");
List<TreeDto> floors = schoolFloorService.selectTreeDtos(buildCodes);
schoolCampuses.addAll(builds);
schoolCampuses.addAll(floors);
return AjaxResult.success(TreeUtil.buildTree(schoolCampuses));
}
}
package com.ruoyi.web.controller.system;
import java.util.List;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.SchoolFloorService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.SchoolFloor;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 楼层Controller
*
* @author ruoyi
* @date 2025-11-03
*/
@RestController
@RequestMapping("/system/floor")
public class SchoolFloorController extends BaseController
{
@Autowired
private SchoolFloorService schoolFloorService;
/**
* 查询楼层列表
*/
@PreAuthorize("@ss.hasPermi('system:floor:list')")
@GetMapping("/list")
public TableDataInfo list(SchoolFloor schoolFloor)
{
startPage();
List<SchoolFloor> list = schoolFloorService.list(new LambdaQueryWrapper<SchoolFloor>()
.eq(StringUtils.isNotEmpty(schoolFloor.getBuildCode()),SchoolFloor::getBuildCode,schoolFloor.getBuildCode())
.like(StringUtils.isNotEmpty(schoolFloor.getFloorName()),SchoolFloor::getFloorName,schoolFloor.getFloorName()));
return getDataTable(list);
}
/**
* 获取楼层详细信息
*/
@PreAuthorize("@ss.hasPermi('system:floor:query')")
@GetMapping(value = "/{floorId}")
public AjaxResult getInfo(@PathVariable("floorId") Long floorId)
{
return success(schoolFloorService.getById(floorId));
}
/**
* 新增楼层
*/
@PreAuthorize("@ss.hasPermi('system:floor:add')")
@Log(title = "楼层", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody SchoolFloor schoolFloor)
{
return toAjax(schoolFloorService.insertFloor(schoolFloor));
}
/**
* 修改楼层
*/
@PreAuthorize("@ss.hasPermi('system:floor:edit')")
@Log(title = "楼层", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody SchoolFloor schoolFloor)
{
return toAjax(schoolFloorService.updateFloor(schoolFloor));
}
/**
* 删除楼层
*/
@PreAuthorize("@ss.hasPermi('system:floor:remove')")
@Log(title = "楼层", businessType = BusinessType.DELETE)
@DeleteMapping("/{floorId}")
public AjaxResult remove(@PathVariable Long floorId)
{
return toAjax(schoolFloorService.deleteFloor(floorId));
}
}
package com.ruoyi.web.controller.system;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.system.service.ISpaceSeatService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.Space;
import com.ruoyi.system.service.ISpaceService;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 房间Controller
*
* @author ruoyi
* @date 2025-11-03
*/
@RestController
@RequestMapping("/system/space")
public class SpaceController extends BaseController
{
@Autowired
private ISpaceService spaceService;
@Autowired
private ISpaceSeatService spaceSeatService;
/**
* 查询房间列表
*/
@PreAuthorize("@ss.hasPermi('system:space:list')")
@GetMapping("/list")
public TableDataInfo list(Space space)
{
startPage();
List<Space> list = spaceService.list(new LambdaQueryWrapper<Space>()
.eq(StringUtils.isNotEmpty(space.getBuildCode()),Space::getBuildCode,space.getBuildCode())
.eq(StringUtils.isNotEmpty(space.getCampusCode()),Space::getCampusCode,space.getCampusCode())
.eq(StringUtils.isNotEmpty(space.getFloorCode()),Space::getFloorCode,space.getFloorCode())
.like(StringUtils.isNotEmpty(space.getName()),Space::getName,space.getName()));
if (StringUtils.isNotEmpty(list)) {
List<String> spaceCodes = list.stream().map(Space::getSpaceCode).collect(Collectors.toList());
Map<String, Long> spaceSeatNumberMap = spaceSeatService.selectSpaceSeatCount(spaceCodes)
.stream().collect(Collectors.toMap(Space::getSpaceCode,Space::getActualNumberOfSeats));
for (Space s : list) {
s.setActualNumberOfSeats(spaceSeatNumberMap.getOrDefault(s.getSpaceCode(), 0L));
}
}
return getDataTable(list);
}
/**
* 获取房间详细信息
*/
@PreAuthorize("@ss.hasPermi('system:space:query')")
@GetMapping(value = "/{spaceId}")
public AjaxResult getInfo(@PathVariable("spaceId") Long spaceId)
{
return success(spaceService.getById(spaceId));
}
/**
* 新增房间
*/
@PreAuthorize("@ss.hasPermi('system:space:add')")
@Log(title = "房间", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody Space space)
{
space.setSpaceCode(IdUtils.randomUUID());
return toAjax(spaceService.save(space));
}
/**
* 修改房间
*/
@PreAuthorize("@ss.hasPermi('system:space:edit')")
@Log(title = "房间", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody Space space)
{
space.setUpdateTime(new Date());
space.setUpdateBy(SecurityUtils.getUsername());
return toAjax(spaceService.updateById(space));
}
/**
* 删除房间
*/
@PreAuthorize("@ss.hasPermi('system:space:remove')")
@Log(title = "房间", businessType = BusinessType.DELETE)
@DeleteMapping("/{spaceIds}")
public AjaxResult remove(@PathVariable Long[] spaceIds)
{
return toAjax(spaceService.deleteSpaceBySpaceIds(spaceIds));
}
/**
* 检查房间座位空闲
* @param spaceId
* @param startAt
* @param endAt
* @return
*/
@GetMapping("/check-space-seat/{spaceId}")
public AjaxResult checkSpaceSeat(@PathVariable("spaceId") Long spaceId,
@RequestParam("startAt") Date startAt,
@RequestParam("endAt") Date endAt){
return AjaxResult.success(spaceService.checkSpaceSeat(spaceId, startAt, endAt));
}
}
package com.ruoyi.web.controller.system;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.SpaceSeat;
import com.ruoyi.system.service.ISpaceSeatService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 座位Controller
*
* @author ruoyi
* @date 2025-11-03
*/
@RestController
@RequestMapping("/system/seat")
public class SpaceSeatController extends BaseController
{
@Autowired
private ISpaceSeatService spaceSeatService;
/**
* 查询座位列表
*/
@PreAuthorize("@ss.hasPermi('system:seat:list')")
@GetMapping("/list")
public TableDataInfo list(SpaceSeat spaceSeat)
{
startPage();
List<SpaceSeat> list = spaceSeatService.selectSpaceSeatList(spaceSeat);
return getDataTable(list);
}
/**
* 导出座位列表
*/
@PreAuthorize("@ss.hasPermi('system:seat:export')")
@Log(title = "座位", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, SpaceSeat spaceSeat)
{
List<SpaceSeat> list = spaceSeatService.selectSpaceSeatList(spaceSeat);
ExcelUtil<SpaceSeat> util = new ExcelUtil<SpaceSeat>(SpaceSeat.class);
util.exportExcel(response, list, "座位数据");
}
/**
* 获取座位详细信息
*/
@PreAuthorize("@ss.hasPermi('system:seat:query')")
@GetMapping(value = "/{seatId}")
public AjaxResult getInfo(@PathVariable("seatId") Long seatId)
{
return success(spaceSeatService.selectSpaceSeatBySeatId(seatId));
}
/**
* 新增座位
*/
@PreAuthorize("@ss.hasPermi('system:seat:add')")
@Log(title = "座位", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody SpaceSeat spaceSeat)
{
return toAjax(spaceSeatService.insertSpaceSeat(spaceSeat));
}
/**
* 修改座位
*/
@PreAuthorize("@ss.hasPermi('system:seat:edit')")
@Log(title = "座位", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody SpaceSeat spaceSeat)
{
return toAjax(spaceSeatService.updateSpaceSeat(spaceSeat));
}
/**
* 删除座位
*/
@PreAuthorize("@ss.hasPermi('system:seat:remove')")
@Log(title = "座位", businessType = BusinessType.DELETE)
@DeleteMapping("/{seatIds}")
public AjaxResult remove(@PathVariable Long[] seatIds)
{
return toAjax(spaceSeatService.deleteSpaceSeatBySeatIds(seatIds));
}
}
......@@ -3,17 +3,16 @@ package com.ruoyi.web.controller.system;
import java.util.Date;
import java.util.List;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginBody;
import com.ruoyi.common.core.domain.model.LoginUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
......@@ -30,6 +29,7 @@ import com.ruoyi.system.service.ISysMenuService;
* @author ruoyi
*/
@RestController
@Slf4j
public class SysLoginController
{
@Autowired
......@@ -47,6 +47,8 @@ public class SysLoginController
@Autowired
private ISysConfigService configService;
/**
* 登录方法
*
......@@ -128,4 +130,12 @@ public class SysLoginController
}
return false;
}
}
......@@ -98,4 +98,11 @@ swagger:
# 是否开启swagger
enabled: true
# 请求前缀
pathMapping: /prod-api
\ No newline at end of file
pathMapping: /prod-api
# CAS配置
cas:
server-url: https://login.xjtu.edu.cn/cas
client-host-url: http://gwyy.xjtu.edu.cn # 你的业务系统地址
validation-type: CAS3
\ No newline at end of file
......@@ -99,4 +99,11 @@ swagger:
# 是否开启swagger
enabled: true
# 请求前缀
pathMapping: /prod-api
\ No newline at end of file
pathMapping: /prod-api
# CAS配置
cas:
server-url: https://login.xjtu.edu.cn/cas
client-host-url: http://gwyy.xjtu.edu.cn # 你的业务系统地址
validation-type: CAS3
\ No newline at end of file
......@@ -16,7 +16,7 @@ ruoyi:
# 开发环境配置
server:
# 服务器的HTTP端口,默认为8080
port: 8080
port: 8100
servlet:
# 应用的访问路径
context-path: /
......@@ -95,7 +95,7 @@ token:
# 令牌密钥
secret: abcdefghijklmnopqrstuvwxyz
# 令牌有效期(默认30分钟)
expireTime: 30
expireTime: 120
# MyBatis Plus配置
mybatis-plus:
......@@ -109,8 +109,8 @@ mybatis-plus:
global-config:
db-config:
logic-delete-field: delFlag # 全局逻辑删除字段名(deleted为实体类属性名称)
logic-delete-value: 1 # 逻辑已删除值。可选,默认值为 1
logic-not-delete-value: 2 # 逻辑未删除值。可选,默认值为 0
logic-delete-value: 2 # 逻辑已删除值。可选,默认值为 1
logic-not-delete-value: 0 # 逻辑未删除值。可选,默认值为 0
# 关闭Banner
banner: false
......
<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
<cas:authenticationSuccess>
<cas:user>test001</cas:user>
<cas:attributes>
<cas:attribute name="name">测试用户</cas:attribute>
<cas:attribute name="accountId">1001</cas:attribute>
<cas:attribute name="userId">1001</cas:attribute>
<cas:attribute name="userName">student003</cas:attribute>
<cas:attribute name="identityTypeId">1</cas:attribute>
<cas:attribute name="identityTypeCode">S01</cas:attribute>
<cas:attribute name="identityTypeName">本科生</cas:attribute>
<cas:attribute name="organizationId">1</cas:attribute>
<cas:attribute name="organizationCode">13002000</cas:attribute>
<cas:attribute name="organizationName">计算机学院</cas:attribute>
</cas:attributes>
</cas:authenticationSuccess>
</cas:serviceResponse>
\ No newline at end of file
......@@ -126,6 +126,31 @@
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- Redisson 锁功能 -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.16.2</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.38</version>
</dependency>
<!-- CAS Client -->
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>3.6.4</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.ruoyi.common.config;
import org.jasig.cas.client.authentication.AuthenticationFilter;
import org.jasig.cas.client.validation.Cas20ServiceTicketValidator;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class CasConfig {
@Value("${cas.server-url}")
private String casServerUrl;
@Value("${cas.client-host-url}")
private String clientHostUrl;
// /**
// * CAS认证过滤器 - 简化配置
// */
// @Bean
// public FilterRegistrationBean<AuthenticationFilter> casAuthenticationFilter() {
// FilterRegistrationBean<AuthenticationFilter> registration = new FilterRegistrationBean<>();
// AuthenticationFilter filter = new AuthenticationFilter();
//
// Map<String, String> initParameters = new HashMap<>();
// initParameters.put("casServerLoginUrl", casServerUrl + "/login");
// initParameters.put("serverName", clientHostUrl);
// initParameters.put("ignorePattern", "/api/cas/callback|/logout|/error");
//
// registration.setFilter(filter);
// registration.setInitParameters(initParameters);
// registration.addUrlPatterns("/*");
// registration.setOrder(1);
// return registration;
// }
/**
* CAS票据验证器
*/
@Bean
public Cas20ServiceTicketValidator cas20ServiceTicketValidator() {
Cas20ServiceTicketValidator validator = new Cas20ServiceTicketValidator(casServerUrl);
// 设置自定义属性解析器
validator.setCustomParameters(Collections.singletonMap("format", "XML"));
return validator;
}
}
......@@ -170,4 +170,12 @@ public class Constants
*/
public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
"org.springframework", "org.apache", "com.ruoyi.common.utils.file", "com.ruoyi.common.config", "com.ruoyi.generator" };
// 老师类型
public static final String TEACHER = "teacher";
// 学生类型
public static final String STUDENT = "student";
}
......@@ -4,6 +4,9 @@ import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
......@@ -19,20 +22,25 @@ public class BaseEntity implements Serializable
/** 搜索值 */
@JsonIgnore
@TableField(exist = false)
private String searchValue;
/** 创建者 */
@TableField(fill = FieldFill.INSERT)
private String createBy;
/** 创建时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/** 更新者 */
@TableField(fill = FieldFill.UPDATE)
private String updateBy;
/** 更新时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
/** 备注 */
......@@ -40,6 +48,7 @@ public class BaseEntity implements Serializable
/** 请求参数 */
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@TableField(exist = false)
private Map<String, Object> params;
public String getSearchValue()
......
......@@ -6,6 +6,9 @@ import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.core.domain.BaseEntity;
......@@ -15,6 +18,7 @@ import com.ruoyi.common.core.domain.BaseEntity;
*
* @author ruoyi
*/
@Data
public class SysDept extends BaseEntity
{
private static final long serialVersionUID = 1L;
......@@ -22,6 +26,9 @@ public class SysDept extends BaseEntity
/** 部门ID */
private Long deptId;
/** 部门编码 */
public String deptCode;
/** 父部门ID */
private Long parentId;
......@@ -50,9 +57,11 @@ public class SysDept extends BaseEntity
private String delFlag;
/** 父部门名称 */
@TableField(exist = false)
private String parentName;
/** 子部门 */
@TableField(exist = false)
private List<SysDept> children = new ArrayList<SysDept>();
public Long getDeptId()
......
......@@ -3,6 +3,8 @@ package com.ruoyi.common.core.domain.entity;
import java.util.Date;
import java.util.List;
import javax.validation.constraints.*;
import com.baomidou.mybatisplus.annotation.TableField;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
......@@ -78,18 +80,23 @@ public class SysUser extends BaseEntity
@Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT),
@Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT)
})
@TableField(exist = false)
private SysDept dept;
/** 角色对象 */
@TableField(exist = false)
private List<SysRole> roles;
/** 角色组 */
@TableField(exist = false)
private Long[] roleIds;
/** 岗位组 */
@TableField(exist = false)
private Long[] postIds;
/** 角色ID */
@TableField(exist = false)
private Long roleId;
public SysUser()
......
package com.ruoyi.common.core.domain.model;
/**
* 用户登录对象
*
* @author ruoyi
*/
public class LoginBody
{
/**
* 用户名
*/
private String username;
/**
* 用户密码
*/
private String password;
/**
* 验证码
*/
private String code;
/**
* 唯一标识
*/
private String uuid;
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public String getCode()
{
return code;
}
public void setCode(String code)
{
this.code = code;
}
public String getUuid()
{
return uuid;
}
public void setUuid(String uuid)
{
this.uuid = uuid;
}
}
package com.ruoyi.common.core.domain.model;
/**
* 用户登录对象
*
* @author ruoyi
*/
public class LoginBody
{
/**
* 用户名
*/
private String username;
/**
* 用户密码
*/
private String password;
/**
* 验证码
*/
private String code;
/**
* 唯一标识
*/
private String uuid;
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public String getCode()
{
return code;
}
public void setCode(String code)
{
this.code = code;
}
public String getUuid()
{
return uuid;
}
public void setUuid(String uuid)
{
this.uuid = uuid;
}
}
......@@ -2,6 +2,7 @@ package com.ruoyi.common.core.domain.model;
import com.alibaba.fastjson2.annotation.JSONField;
import com.ruoyi.common.core.domain.entity.SysUser;
import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
......@@ -12,6 +13,7 @@ import java.util.Set;
*
* @author ruoyi
*/
@Data
public class LoginUser implements UserDetails
{
private static final long serialVersionUID = 1L;
......@@ -71,6 +73,9 @@ public class LoginUser implements UserDetails
*/
private SysUser user;
private String gsessionId;
public LoginUser()
{
}
......
package com.ruoyi.common.core.redis;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
/**
* redis锁工具类
*
* @author ruoyi
*/
@Component
public class RedisLock {
@Autowired
private RedissonClient redissonClient;
/**
* 获取锁
*
* @param lockKey 锁实例key
* @return 锁信息
*/
public RLock getRLock(String lockKey) {
return redissonClient.getLock(lockKey);
}
/**
* 加锁
*
* @param lockKey 锁实例key
* @return 锁信息
*/
public RLock lock(String lockKey) {
RLock lock = getRLock(lockKey);
lock.lock();
return lock;
}
/**
* 加锁
*
* @param lockKey 锁实例key
* @param leaseTime 上锁后自动释放锁时间
* @return true=成功;false=失败
*/
public Boolean tryLock(String lockKey, long leaseTime) {
return tryLock(lockKey, 0, leaseTime, TimeUnit.SECONDS);
}
/**
* 加锁
*
* @param lockKey 锁实例key
* @param leaseTime 上锁后自动释放锁时间
* @param unit 时间颗粒度
* @return true=加锁成功;false=加锁失败
*/
public Boolean tryLock(String lockKey, long leaseTime, TimeUnit unit) {
return tryLock(lockKey, 0, leaseTime, unit);
}
/**
* 加锁
*
* @param lockKey 锁实例key
* @param waitTime 最多等待时间
* @param leaseTime 上锁后自动释放锁时间
* @param unit 时间颗粒度
* @return true=加锁成功;false=加锁失败
*/
public Boolean tryLock(String lockKey, long waitTime, long leaseTime, TimeUnit unit) {
RLock rLock = getRLock(lockKey);
boolean tryLock = false;
try {
tryLock = rLock.tryLock(waitTime, leaseTime, unit);
} catch (InterruptedException e) {
return false;
}
return tryLock;
}
/**
* 释放锁
*
* @param lockKey 锁实例key
*/
public void unlock(String lockKey) {
RLock lock = getRLock(lockKey);
lock.unlock();
}
/**
* 释放锁
*
* @param lock 锁信息
*/
public void unlock(RLock lock) {
lock.unlock();
}
}
\ No newline at end of file
package com.ruoyi.common.core.redis;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* redisson配置
*
* @author ruoyi
*/
@Configuration
public class RedissonConfig
{
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private String port;
@Value("${spring.redis.password}")
private String password;
@Bean(destroyMethod = "shutdown")
@ConditionalOnMissingBean(RedissonClient.class)
public RedissonClient redissonClient()
{
Config config = new Config();
config.useSingleServer().setAddress("redis://" + host + ":" + port); // 更多.set
return Redisson.create(config);
}
}
\ No newline at end of file
package com.ruoyi.common.core.tree;
import java.util.ArrayList;
import java.util.List;
public interface BaseTree<T> {
// code
String getCode();
// pCode
String getParentCode();
// 节点集合
List<T> getChildren();
// 添加集合
void setChildren(List<T> t);
default void addChild(T t){
if (this.getChildren() == null) {
this.setChildren(new ArrayList<T>());
}
this.getChildren().add(t);
}
}
package com.ruoyi.common.core.tree;
import lombok.Data;
import java.util.List;
@Data
public class TreeDto implements BaseTree<TreeDto> {
private Long id;
private String code;
private String parentCode;
private String treeName;
private String type;
// 附加信息
private String attachment;
private List<TreeDto> children;
}
package com.ruoyi.common.core.tree;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
public class TreeUtil {
public static final String FIRST_PARENT_CODE = "0";
/**
* 封装整个树状图数据
* @param listNodes 要处理列表集合节点数据
*/
public static <T extends BaseTree> List<T> assembleTree(List<T> listNodes) {
List<T> newTreeNodes = new ArrayList<>();
// 循环赋值最上面的节点数据
// 赋值最上面节点的值
//这一步操作时找到root节点
newTreeNodes.addAll(listNodes.stream()
.filter(t -> t.getParentCode().equals("0"))
.collect(Collectors.toList()));
// 循环处理子节点数据
for (T t : newTreeNodes) {
//递归
assembleTree(t, listNodes);
}
return newTreeNodes;
}
/**
* 根据节点封装树状图集合数据
*
* @param node 处理的节点(当前节点)
* @param listNodes 要处理的列表数据
*/
private static <T extends BaseTree> void assembleTree(T node, List<T> listNodes) {
if (node != null && !CollectionUtils.isEmpty(listNodes)) {
// 循环节点数据,如果是子节点则添加起来
listNodes.stream()
.filter(t -> t.getParentCode().equals(node.getCode()))
.forEachOrdered(node::addChild);
// 循环处理子节点数据,递归
if (!CollectionUtils.isEmpty(node.getChildren())) {
for (Object t : node.getChildren()) {
//递归
assembleTree((T) t, listNodes);
}
}
}
}
// =====================================组装树========================================
public static <T extends BaseTree> List<T> buildTree(List<T> listNodes) {
List<T> returnList = new ArrayList<>();
if(listNodes == null){
return returnList;
}
List<String> tempList = listNodes.stream().map(BaseTree::getCode).collect(Collectors.toList());
for (T tree : listNodes) {
// 如果是顶级节点, 遍历该父节点的所有子节点
if (!tempList.contains(tree.getParentCode())) {
recursionFn(listNodes, tree);
returnList.add(tree);
}
}
if (returnList.isEmpty()) {
returnList = listNodes;
}
return returnList;
}
/**
* 递归列表
*/
private static <T extends BaseTree> void recursionFn(List<T> list, T t) {
// 得到子节点列表
List<T> childList = getChildList(list, t);
t.setChildren(childList);
for (T tChild : childList) {
if (hasChild(list, tChild)) {
recursionFn(list, tChild);
}
}
}
/**
* 得到子节点列表
*/
private static <T extends BaseTree> List<T> getChildList(List<T> list, T t) {
List<T> tlist = new ArrayList<T>();
Iterator<T> it = list.iterator();
while (it.hasNext()) {
T n = it.next();
if (StringUtils.isNotNull(n.getParentCode()) && n.getParentCode().equals(t.getCode())) {
tlist.add(n);
}
}
return tlist;
}
/**
* 判断是否有子节点
*/
private static <T extends BaseTree> boolean hasChild(List<T> list, T t) {
return getChildList(list, t).size() > 0 ? true : false;
}
}
\ No newline at end of file
package com.ruoyi.common.enums;
public enum ApprovalStatus {
NOT_SIGN("-2","未签到"),
FAILED("-1","审核未通过"),
WAITING("0","待审核"),
PASS("1","审核通过"),
ALREADY_SIGN("2","已签到");
private final String code;
private final String info;
ApprovalStatus(String code, String info)
{
this.code = code;
this.info = info;
}
public String getCode()
{
return code;
}
public String getInfo()
{
return info;
}
}
package com.ruoyi.common.enums;
public enum BlacklistStatus {
CLOSE("0","关闭"),
OPEN("1","启用"),
;
private final String code;
private final String info;
BlacklistStatus(String code, String info)
{
this.code = code;
this.info = info;
}
public String getCode()
{
return code;
}
public String getInfo()
{
return info;
}
}
package com.ruoyi.common.enums;
public enum IdentityTypeCode {
Undergraduate("S01","student","本科生"),
GraduateStudent("S02","student","研究生"),
InternationalStudent("SO3","student","留学生"),
Alumnus("XY","","校友"),
teacher("T01","teacher","老师"),
;
private final String code;
private final String roleKey;
private final String message;
IdentityTypeCode(String code, String roleKey,String message)
{
this.code = code;
this.roleKey = roleKey;
this.message = message;
}
public String getCode()
{
return code;
}
public String getRoleKey()
{
return roleKey;
}
public String getMessage() {
return message;
}
public static IdentityTypeCode getEnumByCode(String code){
for (IdentityTypeCode value : IdentityTypeCode.values()) {
if (value.getCode().equals(code)){
return value;
}
}
return null;
}
}
package com.ruoyi.common.enums;
public enum SsoUserType {
STUDENT("1","student"),
TEACHER("2","teacher");
;
private final String code;
private final String roleKey;
SsoUserType(String code, String roleKey)
{
this.code = code;
this.roleKey = roleKey;
}
public String getCode()
{
return code;
}
public String getRoleKey()
{
return roleKey;
}
public static SsoUserType getEnumByCode(String code){
for (SsoUserType value : SsoUserType.values()) {
if (value.getCode().equals(code)){
return value;
}
}
return null;
}
}
package com.ruoyi.common.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.ruoyi.common.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
private static final String NO_DEL_VALUE = "0";
@Override
public void insertFill(MetaObject metaObject) {
// log.info("开始插入填充...");
this.strictInsertFill(metaObject, "createBy", String.class, SecurityUtils.getUsername());
this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
this.strictInsertFill(metaObject,"delFlag",String.class,NO_DEL_VALUE);
}
@Override
public void updateFill(MetaObject metaObject) {
// log.info("开始插入填充...");
this.strictInsertFill(metaObject, "updateBy", String.class, SecurityUtils.getUsername());
this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
}
}
package com.ruoyi.common.utils;
import cn.hutool.core.date.DateUtil;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
public class SimpleTimeRangeChecker {
private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss");
/**
* 检查时间段是否在开放时间范围内
* @param openStart 开放开始时间 (格式: HH:mm:ss)
* @param openEnd 开放结束时间 (格式: HH:mm:ss)
* @param checkStart 检查开始时间 (格式: yyyy-MM-dd HH:mm:ss)
* @param checkEnd 检查结束时间 (格式: yyyy-MM-dd HH:mm:ss)
* @return 如果在开放时间范围内返回true,否则返回false
*/
public static boolean isTimeInRange(String openStart, String openEnd, Date checkStart ,Date checkEnd) {
try {
LocalTime openStartTime = LocalTime.parse(openStart, TIME_FORMATTER);
LocalTime openEndTime = LocalTime.parse(openEnd, TIME_FORMATTER);
LocalTime checkStartTime = checkStart.toInstant().atZone(ZoneId.systemDefault()).toLocalTime();
LocalTime checkEndTime = checkEnd.toInstant().atZone(ZoneId.systemDefault()).toLocalTime();
return !checkStartTime.isBefore(openStartTime) && !checkEndTime.isAfter(openEndTime);
} catch (Exception e) {
throw new IllegalArgumentException("时间格式解析错误", e);
}
}
// 测试
public static void main(String[] args) {
String openStart = "08:00:00";
String openEnd = "10:00:00";
String checkStart = "2025-11-03 08:30:00";
String checkEnd = "2025-11-03 11:30:00";
boolean result = isTimeInRange(openStart, openEnd, DateUtil.parse(checkStart,"yyyy-MM-dd HH:mm:ss"), DateUtil.parse(checkEnd,"yyyy-MM-dd HH:mm:ss"));
System.out.println("时间段是否在开放范围内: " + result); // true
}
}
......@@ -112,6 +112,7 @@ public class SecurityConfig
permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll());
// 对于登录login 注册register 验证码captchaImage 允许匿名访问
requests.antMatchers("/login", "/register", "/captchaImage").permitAll()
.antMatchers("/api/cas/login","/api/cas/callback").permitAll()
// 静态资源,可匿名访问
.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
.antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
......
package com.ruoyi.framework.web.service;
import javax.annotation.Resource;
import com.ruoyi.common.core.domain.entity.SysUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
......@@ -27,6 +29,7 @@ import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.framework.security.context.AuthenticationContextHolder;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysUserService;
import org.springframework.transaction.annotation.Transactional;
/**
* 登录校验方法
......@@ -63,7 +66,7 @@ public class SysLoginService
public String login(String username, String password, String code, String uuid)
{
// 验证码校验
validateCaptcha(username, code, uuid);
// validateCaptcha(username, code, uuid);
// 登录前置校验
loginPreCheck(username, password);
// 用户验证
......@@ -173,4 +176,6 @@ public class SysLoginService
{
userService.updateLoginInfo(userId, IpUtils.getIpAddr(), DateUtils.getNowDate());
}
}
......@@ -23,6 +23,7 @@
<artifactId>ruoyi-common</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.ruoyi.system.cas;
import lombok.Data;
@Data
public class CasUserInfo {
/**
* 用户名(登录账号)
*/
private String username;
/**
* 姓名
*/
private String name;
/**
* 用户ID
*/
private String userId;
/**
* 身份代码
*/
private String identityTypeCode;
/**
* 组织机构编码
*/
private String organizationCode;
/**
* 组织机构名称
*/
private String organizationName;
}
\ No newline at end of file
package com.ruoyi.system.cas;
import lombok.Data;
@Data
public class CasValidationResult {
private boolean success;
private CasUserInfo userInfo;
private String errorCode;
private String errorMessage;
}
\ No newline at end of file
package com.ruoyi.system.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.BaseEntity;
import lombok.Data;
import java.util.Date;
@Data
@TableName("reservation_approval")
public class ReservationApproval extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 申请id
*/
@TableId(type = IdType.AUTO)
private Long approvalId;
/** 座位编码 */
private String seatCode;
/** 提交时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date submitAt;
/** 提交人 */
private String submitBy;
@TableField(exist = false)
private String submitByName;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date startAt;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date endAt;
/** 审核时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date approvedAt;
/** 审核人 */
private String approvedBy;
@TableField(exist = false)
private String approvedByName;
/** 审核状态 -1=未通过 0=待审核 1= 通过*/
private String status;
@TableLogic
private String delFlag;
@TableField(exist = false)
private SpaceSeat spaceSeat;
}
package com.ruoyi.system.domain;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 黑名单
对象 reservation_blacklist
*
* @author ruoyi
* @date 2025-11-04
*/
@Data
public class ReservationBlacklist extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 主键id */
@TableId(type = IdType.AUTO)
private Long id;
/** 人员工号 */
@Excel(name = "人员工号")
private String personNo;
@TableField(exist = false)
private String personName;
/** 状态 0=未启用 1=已启用 */
private String status;
/** 缘由 */
@Excel(name = "缘由")
private String reason;
/** 记录时间 */
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "记录时间", width = 30, dateFormat = "yyyy-MM-dd ")
private Date arrestedAt;
/** 创建人 */
@Excel(name = "创建人")
private String createdBy;
/** 删除标记 */
private String delFlag;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setReason(String reason)
{
this.reason = reason;
}
public String getReason()
{
return reason;
}
public void setArrestedAt(Date arrestedAt)
{
this.arrestedAt = arrestedAt;
}
public Date getArrestedAt()
{
return arrestedAt;
}
public void setCreatedBy(String createdBy)
{
this.createdBy = createdBy;
}
public String getCreatedBy()
{
return createdBy;
}
public void setDelFlag(String delFlag)
{
this.delFlag = delFlag;
}
public String getDelFlag()
{
return delFlag;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("personNo", getPersonNo())
.append("reason", getReason())
.append("arrestedAt", getArrestedAt())
.append("createdBy", getCreatedBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.append("remark", getRemark())
.append("delFlag", getDelFlag())
.toString();
}
}
package com.ruoyi.system.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.utils.DictUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.xss.Xss;
import com.ruoyi.system.service.impl.SchoolCampusServiceImpl;
import lombok.Data;
import org.apache.commons.lang3.ArrayUtils;
import java.util.List;
/**
* 楼宇
*/
@Data
public class SchoolBuild extends BaseEntity {
/**
* id
*/
@TableId(value = "build_id", type = IdType.AUTO)
private Long buildId;
/**
* 楼宇编码
*/
@TableField("build_code")
private String buildCode;
/**
* 楼宇父编码
*/
@TableField("campus_code")
private String campusCode;
/**
* 楼宇名称
*/
@Xss(message = "楼宇名称不能包含脚本字符")
@TableField("build_name")
private String buildName;
/**
* 排序
*/
@TableField("sort")
private Long sort;
/**
* 属性
*/
@Xss(message = "属性不能包含脚本字符")
@TableField("attribute")
private String attribute;
/**
* 删除标志(0代表存在 2代表删除)
*/
@TableField(value = "del_flag",fill = FieldFill.INSERT)
@TableLogic
private String delFlag;
/**
* 楼层
*/
@TableField(exist = false)
private List<SchoolFloor> schoolFloors;
public String getAttribute() {
if(ArrayUtils.isEmpty(this.attributes)){
return "";
}
return String.join(",", this.attributes);
}
//===============扩展字段=================
@TableField(exist = false)
private String[] attributes;
public String[] getAttributes() {
if(StringUtils.isNotEmpty(this.attribute)){
return this.attribute.split(",");
}
return null;
}
public String getCampusName(){
if (StringUtils.isNotEmpty(this.campusCode)){
return DictUtils.getDictLabel(SchoolCampusServiceImpl.DICT_TYPE,this.campusCode);
}
return "";
}
}
package com.ruoyi.system.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.xss.Xss;
import lombok.Data;
import java.util.List;
/**
* 校区
*/
@Data
public class SchoolCampus extends BaseEntity {
/**
* id
*/
@TableId(value = "campus_id", type = IdType.AUTO)
private Long campusId;
/**
* 校区编码
*/
@TableField("campus_code")
private String campusCode;
/**
* 校区名称
*/
@Xss(message = "校区名称不能包含脚本字符")
@TableField("name")
private String name;
/**
* 排序
*/
@TableField("sort")
private Long sort;
/**
* 删除标志(0代表存在 2代表删除)
*/
@TableField(value = "del_flag",fill = FieldFill.INSERT)
@TableLogic
private String delFlag;
/**
* 楼宇
*/
@TableField(exist = false)
private List<SchoolBuild> schoolBuilds;
}
package com.ruoyi.system.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.utils.DictUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.xss.Xss;
import com.ruoyi.system.service.impl.SchoolBuildServiceImpl;
import lombok.Data;
import org.apache.commons.lang3.ArrayUtils;
/**
* 楼层
*/
@Data
public class SchoolFloor extends BaseEntity {
/**
* id
*/
@TableId(value = "floor_id", type = IdType.AUTO)
private Long floorId;
/**
* 楼层编码
*/
@TableField("floor_code")
private String floorCode;
/**
* 楼层父编码
*/
@TableField("build_code")
private String buildCode;
/**
* 房间号
*/
@Xss(message = "房间号不能包含脚本字符")
@TableField("floor_name")
private String floorName;
/**
* 排序
*/
@TableField("sort")
private Long sort;
/**
* 属性
*/
@Xss(message = "属性不能包含脚本字符")
@TableField("attribute")
private String attribute;
/**
* 删除标志(0代表存在 2代表删除)
*/
@TableField(value = "del_flag",fill = FieldFill.INSERT)
@TableLogic
private String delFlag;
public String getAttribute() {
if(ArrayUtils.isEmpty(this.attributes)){
return "";
}
return String.join(",", this.attributes);
}
//===============扩展字段=================
@TableField(exist = false)
private String[] attributes;
public String[] getAttributes() {
if(StringUtils.isNotEmpty(this.attribute)){
return this.attribute.split(",");
}
return null;
}
public String getBuildName(){
if (StringUtils.isNotEmpty(this.buildCode)){
return DictUtils.getDictLabel(SchoolBuildServiceImpl.DICT_TYPE,this.buildCode);
}
return "";
}
}
package com.ruoyi.system.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.ruoyi.common.utils.DictUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.vo.OpenTime;
import com.ruoyi.system.service.impl.SchoolBuildServiceImpl;
import com.ruoyi.system.service.impl.SchoolCampusServiceImpl;
import com.ruoyi.system.service.impl.SchoolFloorServiceImpl;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import java.util.List;
/**
* 房间对象 space
*
* @author ruoyi
* @date 2025-11-03
*/
@Data
@TableName(value = "space",autoResultMap = true)
public class Space extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 主键id */
@TableId(type = IdType.AUTO)
private Long spaceId;
private String spaceCode;
/** 校区编码 */
@Excel(name = "校区编码")
private String campusCode;
/** 建筑编码 */
@Excel(name = "建筑编码")
private String buildCode;
/** 楼层编码 */
@Excel(name = "楼层编码")
private String floorCode;
/** 名称 */
@Excel(name = "名称")
private String name;
/** 容量 */
@Excel(name = "容量")
private Long seatCount;
/** 实际座位数 */
@TableField(exist = false)
private Long actualNumberOfSeats;
/** 预约区间 */
@Excel(name = "预约区间")
@TableField(value = "open_time",typeHandler = JacksonTypeHandler.class)
private OpenTime openTime;
/** 最小预约时长/分钟 */
@Excel(name = "最小预约时长/分钟")
private Long miniMumDuration;
/** 最小预约天数 */
@Excel(name = "最小预约天数")
private Long inAdvanceDuration;
/** 删除标记 */
@TableField(value = "del_flag",fill = FieldFill.INSERT)
@TableLogic
private String delFlag;
@TableField(exist = false)
private List<SpaceSeat> spaceSeats;
public void setCampusCode(String campusCode)
{
this.campusCode = campusCode;
}
public String getCampusCode()
{
return campusCode;
}
public void setBuildCode(String buildCode)
{
this.buildCode = buildCode;
}
public String getBuildCode()
{
return buildCode;
}
public void setFloorCode(String floorCode)
{
this.floorCode = floorCode;
}
public String getFloorCode()
{
return floorCode;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void setSeatCount(Long seatCount)
{
this.seatCount = seatCount;
}
public Long getSeatCount()
{
return seatCount;
}
public void setMiniMumDuration(Long miniMumDuration)
{
this.miniMumDuration = miniMumDuration;
}
public Long getMiniMumDuration()
{
return miniMumDuration;
}
public void setInAdvanceDuration(Long inAdvanceDuration)
{
this.inAdvanceDuration = inAdvanceDuration;
}
public Long getInAdvanceDuration()
{
return inAdvanceDuration;
}
public void setDelFlag(String delFlag)
{
this.delFlag = delFlag;
}
public String getDelFlag()
{
return delFlag;
}
public String getCampusName(){
if (StringUtils.isNotEmpty(this.campusCode)){
return DictUtils.getDictLabel(SchoolCampusServiceImpl.DICT_TYPE,this.campusCode);
}
return "";
}
public String getBuildName(){
if (StringUtils.isNotEmpty(this.buildCode)){
return DictUtils.getDictLabel(SchoolBuildServiceImpl.DICT_TYPE,this.buildCode);
}
return "";
}
public String getFloorName(){
if (StringUtils.isNotEmpty(this.floorCode)){
return DictUtils.getDictLabel(SchoolFloorServiceImpl.DICT_TYPE,this.floorCode);
}
return "";
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("spaceId", getSpaceId())
.append("campusCode", getCampusCode())
.append("buildCode", getBuildCode())
.append("floorCode", getFloorCode())
.append("name", getName())
.append("seatCount", getSeatCount())
.append("openTime", getOpenTime())
.append("miniMumDuration", getMiniMumDuration())
.append("inAdvanceDuration", getInAdvanceDuration())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.append("remark", getRemark())
.append("delFlag", getDelFlag())
.toString();
}
}
package com.ruoyi.system.domain;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 座位对象 space_seat
*
* @author ruoyi
* @date 2025-11-03
*/
@Data
public class SpaceSeat extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 主键id */
@TableId(type = IdType.AUTO)
private Long seatId;
private String seatCode;
/** 房间编码 */
@Excel(name = "房间编码")
private String spaceCode;
/** 座位名称 */
@Excel(name = "座位名称")
private String seatName;
/** 删除标记 */
@TableField(value = "del_flag",fill = FieldFill.INSERT)
private String delFlag;
@TableField
private Space space;
/**
* 是否可预约的
*/
@TableField(exist = false)
private Boolean reservable = false;
public void setSeatId(Long seatId)
{
this.seatId = seatId;
}
public Long getSeatId()
{
return seatId;
}
public void setSeatName(String seatName)
{
this.seatName = seatName;
}
public String getSeatName()
{
return seatName;
}
public void setDelFlag(String delFlag)
{
this.delFlag = delFlag;
}
public String getDelFlag()
{
return delFlag;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("seatId", getSeatId())
.append("spaceCode", getSpaceCode())
.append("seatName", getSeatName())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.append("remark", getRemark())
.append("delFlag", getDelFlag())
.toString();
}
}
package com.ruoyi.system.domain.vo;
import lombok.Data;
import java.io.Serializable;
@Data
public class OpenTime implements Serializable {
private String startAt;
private String endAt;
}
package com.ruoyi.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.system.domain.ReservationApproval;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
@Mapper
public interface ReservationApprovalMapper extends BaseMapper<ReservationApproval> {
/**
* 查询已预约的的座位编码
* @param seatCodes 座位编码组
* @param startAt 开始时间
* @param endAt 结束时间
* @return
*/
List<String> selectReservedSeatCodes(@Param("seatCodes") List<String> seatCodes,
@Param("startAt")Date startAt,
@Param("endAt") Date endAt);
}
package com.ruoyi.system.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.system.domain.ReservationBlacklist;
import org.apache.ibatis.annotations.Mapper;
/**
* 黑名单
Mapper接口
*
* @author ruoyi
* @date 2025-11-04
*/
@Mapper
public interface ReservationBlacklistMapper extends BaseMapper<ReservationBlacklist>
{
/**
* 查询黑名单
*
* @param id 黑名单
主键
* @return 黑名单
*/
public ReservationBlacklist selectReservationBlacklistById(Long id);
/**
* 查询黑名单
列表
*
* @param reservationBlacklist 黑名单
* @return 黑名单
集合
*/
public List<ReservationBlacklist> selectReservationBlacklistList(ReservationBlacklist reservationBlacklist);
/**
* 新增黑名单
*
* @param reservationBlacklist 黑名单
* @return 结果
*/
public int insertReservationBlacklist(ReservationBlacklist reservationBlacklist);
/**
* 修改黑名单
*
* @param reservationBlacklist 黑名单
* @return 结果
*/
public int updateReservationBlacklist(ReservationBlacklist reservationBlacklist);
/**
* 删除黑名单
*
* @param id 黑名单
主键
* @return 结果
*/
public int deleteReservationBlacklistById(Long id);
/**
* 批量删除黑名单
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteReservationBlacklistByIds(Long[] ids);
}
package com.ruoyi.system.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.common.core.tree.TreeDto;
import com.ruoyi.system.domain.SchoolBuild;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 楼宇Mapper接口
*
* @author ruoyi
* @date 2025-11-03
*/
@Mapper
public interface SchoolBuildMapper extends BaseMapper<SchoolBuild>
{
/**
* 查询楼宇
*
* @param buildId 楼宇主键
* @return 楼宇
*/
public SchoolBuild selectSchoolBuildByBuildId(Long buildId);
/**
* 查询楼宇列表
*
* @param schoolBuild 楼宇
* @return 楼宇集合
*/
public List<SchoolBuild> selectSchoolBuildList(SchoolBuild schoolBuild);
/**
* 查询楼宇树结构
* @param campusCodes 校区编码
* @return
*/
public List<TreeDto> selectTreeDtos(@Param("campusCodes") List<String> campusCodes);
/**
* 新增楼宇
*
* @param schoolBuild 楼宇
* @return 结果
*/
public int insertSchoolBuild(SchoolBuild schoolBuild);
/**
* 修改楼宇
*
* @param schoolBuild 楼宇
* @return 结果
*/
public int updateSchoolBuild(SchoolBuild schoolBuild);
/**
* 删除楼宇
*
* @param buildId 楼宇主键
* @return 结果
*/
public int deleteSchoolBuildByBuildId(Long buildId);
/**
* 批量删除楼宇
*
* @param buildIds 需要删除的数据主键集合
* @return 结果
*/
public int deleteSchoolBuildByBuildIds(Long[] buildIds);
}
package com.ruoyi.system.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.common.core.tree.TreeDto;
import com.ruoyi.system.domain.SchoolCampus;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 校区Mapper接口
*
* @author ruoyi
* @date 2025-11-03
*/
@Mapper
public interface SchoolCampusMapper extends BaseMapper<SchoolCampus>
{
/**
* 查询校区
*
* @param campusId 校区主键
* @return 校区
*/
public SchoolCampus selectSchoolCampusByCampusId(Long campusId);
/**
* 查询树结构信息
* @param campusCode 校区编码
* @param name 名称
* @return
*/
public List<TreeDto> selectTreeDto(@Param("campusCode") String campusCode,
@Param("name") String name);
/**
* 查询校区列表
*
* @param schoolCampus 校区
* @return 校区集合
*/
public List<SchoolCampus> selectSchoolCampusList(SchoolCampus schoolCampus);
/**
* 新增校区
*
* @param schoolCampus 校区
* @return 结果
*/
public int insertSchoolCampus(SchoolCampus schoolCampus);
/**
* 修改校区
*
* @param schoolCampus 校区
* @return 结果
*/
public int updateSchoolCampus(SchoolCampus schoolCampus);
/**
* 删除校区
*
* @param campusId 校区主键
* @return 结果
*/
public int deleteSchoolCampusByCampusId(Long campusId);
/**
* 批量删除校区
*
* @param campusIds 需要删除的数据主键集合
* @return 结果
*/
public int deleteSchoolCampusByCampusIds(Long[] campusIds);
}
package com.ruoyi.system.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.common.core.tree.TreeDto;
import com.ruoyi.system.domain.SchoolFloor;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 楼层Mapper接口
*
* @author ruoyi
* @date 2025-11-03
*/
@Mapper
public interface SchoolFloorMapper extends BaseMapper<SchoolFloor>
{
/**
* 查询楼层
*
* @param floorId 楼层主键
* @return 楼层
*/
public SchoolFloor selectSchoolFloorByFloorId(Long floorId);
/**
* 查询楼层树结构
* @param buildCodes
* @return
*/
public List<TreeDto> selectTreeDtos(@Param("buildCodes") List<String> buildCodes);
/**
* 查询楼层列表
*
* @param schoolFloor 楼层
* @return 楼层集合
*/
public List<SchoolFloor> selectSchoolFloorList(SchoolFloor schoolFloor);
/**
* 新增楼层
*
* @param schoolFloor 楼层
* @return 结果
*/
public int insertSchoolFloor(SchoolFloor schoolFloor);
/**
* 修改楼层
*
* @param schoolFloor 楼层
* @return 结果
*/
public int updateSchoolFloor(SchoolFloor schoolFloor);
/**
* 删除楼层
*
* @param floorId 楼层主键
* @return 结果
*/
public int deleteSchoolFloorByFloorId(Long floorId);
/**
* 批量删除楼层
*
* @param floorIds 需要删除的数据主键集合
* @return 结果
*/
public int deleteSchoolFloorByFloorIds(Long[] floorIds);
}
package com.ruoyi.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.system.domain.Space;
import java.util.List;
import java.util.Map;
/**
* 房间Mapper接口
*
* @author ruoyi
* @date 2025-11-03
*/
public interface SpaceMapper extends BaseMapper<Space>
{
/**
* 批量删除房间
*
* @param spaceIds 需要删除的数据主键集合
* @return 结果
*/
public int deleteSpaceBySpaceIds(Long[] spaceIds);
}
package com.ruoyi.system.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.system.domain.Space;
import com.ruoyi.system.domain.SpaceSeat;
import org.apache.ibatis.annotations.Param;
/**
* 座位Mapper接口
*
* @author ruoyi
* @date 2025-11-03
*/
public interface SpaceSeatMapper extends BaseMapper<SpaceSeat>
{
/**
* 查询座位
*
* @param seatId 座位主键
* @return 座位
*/
public SpaceSeat selectSpaceSeatBySeatId(Long seatId);
/**
* 查询座位列表
*
* @param spaceSeat 座位
* @return 座位集合
*/
public List<SpaceSeat> selectSpaceSeatList(SpaceSeat spaceSeat);
/**
* 查询房间座位信息
* @return
*/
public List<Space> selectSpaceSeatCount(@Param("spaceCodes") List<String> spaceCodes);
/**
* 批量删除座位
*
* @param seatIds 需要删除的数据主键集合
* @return 结果
*/
public int deleteSpaceSeatBySeatIds(Long[] seatIds);
}
......@@ -36,6 +36,15 @@ public interface SysDeptMapper
*/
public SysDept selectDeptById(Long deptId);
/**
* 根据部门ID查询信息
*
* @param deptCode 部门编码
* @return 部门信息
*/
public SysDept selectDeptByCode(String deptCode);
/**
* 根据ID查询所有子部门
*
......
......@@ -41,6 +41,24 @@ public interface SysRoleMapper
*/
public List<Long> selectRoleListByUserId(Long userId);
/**
* 通过角色KEY查询角色
*
* @param roleKey 角色KEY
* @return 角色对象信息
*/
public SysRole selectRoleByKey(String roleKey);
/**
* 通过角色KEY查询角色
*
* @param roleKey 角色KEY
* @return 角色对象信息
*/
public Long[] selectRoleIdsByKeys(List<String> roleKey);
/**
* 通过角色ID查询角色
*
......
......@@ -2,6 +2,8 @@ package com.ruoyi.system.mapper;
import java.util.Date;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import com.ruoyi.common.core.domain.entity.SysUser;
......@@ -52,6 +54,14 @@ public interface SysUserMapper
*/
public SysUser selectUserById(Long userId);
/**
* 通过用户昵称查询用户
* @param userNames
* @return
*/
public List<SysUser> selectUsersByUserName(@Param("userNames") List<String> userNames);
/**
* 新增用户信息
*
......
package com.ruoyi.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.system.domain.ReservationApproval;
import java.util.Date;
import java.util.List;
public interface IReservationApprovalService extends IService<ReservationApproval> {
/**
* 提交工位预约申请
* @param reservationApproval 申请
* @return
*/
public Boolean submitApproval(ReservationApproval reservationApproval);
/**
* 查询已预约的的座位编码
* @param seatCodes 座位编码组
* @param startAt 开始时间
* @param endAt 结束时间
* @return
*/
public List<String> selectReservedSeatCodes(List<String> seatCodes, Date startAt, Date endAt);
}
package com.ruoyi.system.service;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.system.domain.ReservationBlacklist;
/**
* 黑名单
Service接口
*
* @author ruoyi
* @date 2025-11-04
*/
public interface IReservationBlacklistService extends IService<ReservationBlacklist>
{
/**
* 查询黑名单
*
* @param id 黑名单
主键
* @return 黑名单
*/
public ReservationBlacklist selectReservationBlacklistById(Long id);
/**
* 查询黑名单
列表
*
* @param reservationBlacklist 黑名单
* @return 黑名单
集合
*/
public List<ReservationBlacklist> selectReservationBlacklistList(ReservationBlacklist reservationBlacklist);
/**
* 新增黑名单
*
* @param reservationBlacklist 黑名单
* @return 结果
*/
public int insertReservationBlacklist(ReservationBlacklist reservationBlacklist);
/**
* 修改黑名单
*
* @param reservationBlacklist 黑名单
* @return 结果
*/
public int updateReservationBlacklist(ReservationBlacklist reservationBlacklist);
/**
* 批量删除黑名单
*
* @param ids 需要删除的黑名单
主键集合
* @return 结果
*/
public int deleteReservationBlacklistByIds(Long[] ids);
/**
* 删除黑名单
信息
*
* @param id 黑名单
主键
* @return 结果
*/
public int deleteReservationBlacklistById(Long id);
}
package com.ruoyi.system.service;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.system.domain.Space;
import com.ruoyi.system.domain.SpaceSeat;
import org.apache.ibatis.annotations.Param;
/**
* 座位Service接口
*
* @author ruoyi
* @date 2025-11-03
*/
public interface ISpaceSeatService extends IService<SpaceSeat>
{
/**
* 查询座位
*
* @param seatId 座位主键
* @return 座位
*/
public SpaceSeat selectSpaceSeatBySeatId(Long seatId);
/**
* 查询座位列表
*
* @param spaceSeat 座位
* @return 座位集合
*/
public List<SpaceSeat> selectSpaceSeatList(SpaceSeat spaceSeat);
/**
* 查询座位信息
* @param seatCodes
* @return
*/
public List<SpaceSeat> selectSpaceSeatByCodes(List<String> seatCodes);
/**
* 查询房间座位信息
* @return
*/
public List<Space> selectSpaceSeatCount(List<String> spaceCodes);
/**
* 新增座位
*
* @param spaceSeat 座位
* @return 结果
*/
public Boolean insertSpaceSeat(SpaceSeat spaceSeat);
/**
* 修改座位
*
* @param spaceSeat 座位
* @return 结果
*/
public Boolean updateSpaceSeat(SpaceSeat spaceSeat);
/**
* 批量删除座位
*
* @param seatIds 需要删除的座位主键集合
* @return 结果
*/
public int deleteSpaceSeatBySeatIds(Long[] seatIds);
/**
* 删除座位信息
*
* @param seatId 座位主键
* @return 结果
*/
public Boolean deleteSpaceSeatBySeatId(Long seatId);
}
package com.ruoyi.system.service;
import java.util.Date;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.system.domain.Space;
/**
* 房间Service接口
*
* @author ruoyi
* @date 2025-11-03
*/
public interface ISpaceService extends IService<Space>
{
/**
* 批量删除房间
*
* @param spaceIds 需要删除的房间主键集合
* @return 结果
*/
public int deleteSpaceBySpaceIds(Long[] spaceIds);
/**
* 检查房间空闲
* @param spaceId 房间id
* @param startAt 开始时间
* @param endAt 结束时间
* @return
*/
public Space checkSpaceSeat(Long spaceId, Date startAt,Date endAt);
}
......@@ -59,6 +59,15 @@ public interface ISysDeptService
*/
public SysDept selectDeptById(Long deptId);
/**
* 根据部门ID查询信息
*
* @param deptCode 部门编码
* @return 部门信息
*/
public SysDept selectDeptByCode(String deptCode);
/**
* 根据ID查询所有子部门(正常状态)
*
......
......@@ -59,6 +59,15 @@ public interface ISysRoleService
*/
public SysRole selectRoleById(Long roleId);
/**
* 通过角色ID查询角色
*
* @param roleKey 角色ID
* @return 角色对象信息
*/
public SysRole selectRoleByRoleKey(String roleKey);
/**
* 校验角色名称是否唯一
*
......
......@@ -2,7 +2,10 @@ package com.ruoyi.system.service;
import java.util.Date;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.entity.SysUser;
import org.apache.ibatis.annotations.Param;
/**
* 用户 业务层
......@@ -51,6 +54,14 @@ public interface ISysUserService
*/
public SysUser selectUserById(Long userId);
/**
* 通过用户昵称查询用户
* @param userNames
* @return
*/
public List<SysUser> selectUsersByUserName(List<String> userNames);
/**
* 根据用户ID查询用户所属角色组
*
......@@ -113,6 +124,7 @@ public interface ISysUserService
*/
public int insertUser(SysUser user);
/**
* 注册用户信息
*
......@@ -214,4 +226,8 @@ public interface ISysUserService
* @return 结果
*/
public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName);
}
package com.ruoyi.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.tree.TreeDto;
import com.ruoyi.system.domain.SchoolBuild;
import java.util.List;
public interface SchoolBuildService extends IService<SchoolBuild> {
/**
* 查询建筑信息
* @param build
* @return
*/
List<SchoolBuild> selectSchoolBuildList(SchoolBuild build);
/**
* 根据id 查询 楼宇信息
* @param buildingId
* @return
*/
SchoolBuild getBuildById(Long buildingId);
/**
* 查询楼宇树结构
* @param campusCodes 校区编码
* @return
*/
public List<TreeDto> selectTreeDtos( List<String> campusCodes);
/**
* 添加 楼宇信息
* @param building
* @return
*/
Boolean insertBuild(SchoolBuild building);
/**
* 修改 楼宇信息
* @param building
* @return
*/
Boolean updateBuild(SchoolBuild building);
/**
* 删除 楼宇信息
* @param buildingId
* @return
*/
Boolean deleteBuild(Long buildingId);
}
package com.ruoyi.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.tree.TreeDto;
import com.ruoyi.system.domain.SchoolCampus;
import java.util.List;
public interface SchoolCampusService extends IService<SchoolCampus> {
/**
* 查询树结构信息
* @param campusCode 校区编码
* @param name 名称
* @return
*/
public List<TreeDto> selectTreeDto(String campusCode, String name);
/**
* 添加 校区信息
* @param campus
* @return
*/
Boolean insertCampus(SchoolCampus campus);
/**
* 修改 校区信息
* @param campus
* @return
*/
Boolean updateCampus(SchoolCampus campus);
/**
* 删除 校区信息
* @param campusId
* @return
*/
Boolean deleteCampus(Long campusId);
}
package com.ruoyi.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.tree.TreeDto;
import com.ruoyi.system.domain.SchoolFloor;
import java.util.List;
public interface SchoolFloorService extends IService<SchoolFloor> {
/**
* 查询楼层树结构
* @param buildCodes
* @return
*/
public List<TreeDto> selectTreeDtos( List<String> buildCodes);
/**
* 添加 楼层信息
* @param floor
* @return
*/
Boolean insertFloor(SchoolFloor floor);
/**
* 修改 楼层信息
* @param floor
* @return
*/
Boolean updateFloor(SchoolFloor floor);
/**
* 删除 楼层信息
* @param floorId
* @return
*/
Boolean deleteFloor(Long floorId);
}
package com.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.enums.ApprovalStatus;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.domain.ReservationApproval;
import com.ruoyi.system.mapper.ReservationApprovalMapper;
import com.ruoyi.system.service.IReservationApprovalService;
import com.ruoyi.system.task.verifyReservationApproval.VerifyReservationApprovalProcessor;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
@Service
public class ReservationApprovalImpl extends ServiceImpl<ReservationApprovalMapper,ReservationApproval>
implements IReservationApprovalService {
@Autowired
List<VerifyReservationApprovalProcessor> processors;
@Autowired
private RedissonClient redissonClient;
private static final String LOCK = "APPROVAL-";
/**
* 提交工位预约申请
* @param reservationApproval 申请
* @return
*/
@Override
public Boolean submitApproval(ReservationApproval reservationApproval) {
RLock lock = redissonClient.getLock(LOCK+reservationApproval.getSeatCode());
try {
lock.lock();
for (VerifyReservationApprovalProcessor processor : processors) {
processor.VerifyReservationApproval(reservationApproval);
}
reservationApproval.setSubmitAt(new Date());
reservationApproval.setSubmitBy(SecurityUtils.getUsername());
reservationApproval.setStatus(ApprovalStatus.WAITING.getCode());
return save(reservationApproval);
} finally {
lock.unlock();
}
}
/**
* 查询已预约的的座位编码
* @param seatCodes 座位编码组
* @param startAt 开始时间
* @param endAt 结束时间
* @return
*/
@Override
public List<String> selectReservedSeatCodes(List<String> seatCodes, Date startAt, Date endAt) {
return baseMapper.selectReservedSeatCodes(seatCodes, startAt, endAt);
}
}
package com.ruoyi.system.service.impl;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.ReservationBlacklistMapper;
import com.ruoyi.system.domain.ReservationBlacklist;
import com.ruoyi.system.service.IReservationBlacklistService;
/**
* 黑名单
Service业务层处理
*
* @author ruoyi
* @date 2025-11-04
*/
@Service
public class ReservationBlacklistServiceImpl extends ServiceImpl<ReservationBlacklistMapper,ReservationBlacklist> implements IReservationBlacklistService
{
@Autowired
private ReservationBlacklistMapper reservationBlacklistMapper;
/**
* 查询黑名单
*
* @param id 黑名单
主键
* @return 黑名单
*/
@Override
public ReservationBlacklist selectReservationBlacklistById(Long id)
{
return reservationBlacklistMapper.selectReservationBlacklistById(id);
}
/**
* 查询黑名单
列表
*
* @param reservationBlacklist 黑名单
* @return 黑名单
*/
@Override
public List<ReservationBlacklist> selectReservationBlacklistList(ReservationBlacklist reservationBlacklist)
{
return reservationBlacklistMapper.selectReservationBlacklistList(reservationBlacklist);
}
/**
* 新增黑名单
*
* @param reservationBlacklist 黑名单
* @return 结果
*/
@Override
public int insertReservationBlacklist(ReservationBlacklist reservationBlacklist)
{
reservationBlacklist.setCreatedBy(SecurityUtils.getUsername());
reservationBlacklist.setCreateTime(DateUtils.getNowDate());
return reservationBlacklistMapper.insertReservationBlacklist(reservationBlacklist);
}
/**
* 修改黑名单
*
* @param reservationBlacklist 黑名单
* @return 结果
*/
@Override
public int updateReservationBlacklist(ReservationBlacklist reservationBlacklist)
{
reservationBlacklist.setUpdateBy(SecurityUtils.getUsername());
reservationBlacklist.setUpdateTime(DateUtils.getNowDate());
return reservationBlacklistMapper.updateReservationBlacklist(reservationBlacklist);
}
/**
* 批量删除黑名单
*
* @param ids 需要删除的黑名单
主键
* @return 结果
*/
@Override
public int deleteReservationBlacklistByIds(Long[] ids)
{
return reservationBlacklistMapper.deleteReservationBlacklistByIds(ids);
}
/**
* 删除黑名单
信息
*
* @param id 黑名单
主键
* @return 结果
*/
@Override
public int deleteReservationBlacklistById(Long id)
{
return reservationBlacklistMapper.deleteReservationBlacklistById(id);
}
}
package com.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.core.tree.TreeDto;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DictUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.system.domain.SchoolBuild;
import com.ruoyi.system.domain.SchoolFloor;
import com.ruoyi.system.mapper.SchoolBuildMapper;
import com.ruoyi.system.mapper.SchoolFloorMapper;
import com.ruoyi.system.service.SchoolBuildService;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* 楼宇 服务层
*/
@Service
public class SchoolBuildServiceImpl
extends ServiceImpl<SchoolBuildMapper, SchoolBuild> implements SchoolBuildService {
@Autowired
private SchoolFloorMapper schoolFloorMapper;
@Autowired
private RedissonClient redissonClient;
private static final String LOCK = "BUILDING";
public static final String DICT_TYPE = "sys_school_build";
@PostConstruct
public void info(){
List<SchoolBuild> schoolBuilds = list();
List<SysDictData> dictDatas =
schoolBuilds.stream().map(build->{
SysDictData dictData = new SysDictData();
dictData.setDictValue(build.getBuildCode());
dictData.setDictLabel(build.getBuildName());
dictData.setDictType(DICT_TYPE);
dictData.setDictSort(build.getSort());
return dictData;
}).collect(Collectors.toList());
if(StringUtils.isNotEmpty(dictDatas)){
DictUtils.setDictCache(DICT_TYPE,dictDatas);
}
}
/**
* 查询建筑信息
* @param build
* @return
*/
@Override
public List<SchoolBuild> selectSchoolBuildList(SchoolBuild build) {
return baseMapper.selectSchoolBuildList(build);
}
/**
* 根据id 查询 楼宇信息
* @param buildingId
* @return
*/
@Override
public SchoolBuild getBuildById(Long buildingId) {
if(buildingId == null || buildingId <= 0){
throw new ServiceException("查询参数错误,无法查询到楼宇信息");
}
return baseMapper.selectById(buildingId);
}
/**
* 查询楼宇树结构
* @param campusCodes 校区编码
* @return
*/
@Override
public List<TreeDto> selectTreeDtos(List<String> campusCodes) {
return baseMapper.selectTreeDtos(campusCodes)
.stream().filter(t->StringUtils.isNotEmpty(t.getParentCode()))
.collect(Collectors.toList());
}
/**
* 添加 楼宇信息
* @param build;
* @return
*/
@Override
public Boolean insertBuild(SchoolBuild build) {
RLock lock = redissonClient.getLock(LOCK);
try {
lock.lock();
long count =count(new LambdaQueryWrapper<SchoolBuild>()
.eq(SchoolBuild::getBuildName,build.getBuildName())
.eq(SchoolBuild::getCampusCode,build.getCampusCode()));
if(count > 0){
throw new ServiceException("楼宇名重复,不能重复添加");
}
build.setBuildCode(IdUtils.randomUUID());
build.setCreateBy(SecurityUtils.getUsername());
build.setCreateTime(new Date());
Boolean flag = save(build);
info();
return flag;
} finally {
lock.unlock();
}
}
/**
* 修改 楼宇信息
* @param updateBuild
* @return
*/
@Override
public Boolean updateBuild(SchoolBuild updateBuild) {
if(updateBuild.getBuildId() == null || updateBuild.getBuildId() <= 0){
throw new ServiceException("参数错误,无法修改楼宇信息");
}
RLock lock = redissonClient.getLock(LOCK);
try {
lock.lock();
SchoolBuild entity = baseMapper.selectById(updateBuild.getBuildId());
if (StringUtils.isNull(entity)){
throw new ServiceException("参数错误,查询不到需要修改的数据");
}
long count = count(new LambdaQueryWrapper<SchoolBuild>()
.eq(SchoolBuild::getBuildName,updateBuild.getBuildName())
.eq(SchoolBuild::getCampusCode,updateBuild.getCampusCode())
.ne(SchoolBuild::getBuildId,entity.getBuildId()));
if(count > 0){
throw new ServiceException("楼宇名重复,请重写修改");
}
updateBuild.setUpdateBy(SecurityUtils.getUsername());
updateBuild.setUpdateTime(new Date());
Boolean flag = updateById(updateBuild);
info();
return flag;
} finally {
lock.unlock();
}
}
/**
* 删除 楼宇信息
* @param buildingId
* @return
*/
@Override
public Boolean deleteBuild(Long buildingId) {
if(buildingId == null || buildingId <= 0){
throw new ServiceException("参数错误,无法删除楼宇信息");
}
SchoolBuild build = baseMapper.selectById(buildingId);
if (StringUtils.isNull(build)){
throw new ServiceException("参数错误,查询不到指定的建筑");
}
long count = schoolFloorMapper.selectCount(new LambdaQueryWrapper<SchoolFloor>()
.eq(SchoolFloor::getBuildCode,build.getBuildCode()));
if(count > 0){
throw new ServiceException("楼宇还包含楼层,无法删除楼宇信息");
}
Boolean flag= removeById(buildingId);
info();
return flag;
}
}
package com.ruoyi.system.service.impl;
import cn.hutool.core.lang.Snowflake;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.core.tree.TreeDto;
import com.ruoyi.common.core.tree.TreeUtil;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DictUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.system.domain.SchoolBuild;
import com.ruoyi.system.domain.SchoolCampus;
import com.ruoyi.system.mapper.SchoolBuildMapper;
import com.ruoyi.system.mapper.SchoolCampusMapper;
import com.ruoyi.system.service.SchoolCampusService;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* 校区 服务层
*/
@Service
public class SchoolCampusServiceImpl
extends ServiceImpl<SchoolCampusMapper, SchoolCampus> implements SchoolCampusService {
@Autowired
private SchoolBuildMapper schoolBuildingMapper;
@Autowired
private RedissonClient redissonClient;
private static final String LOCK = "CAMPUS";
public static final String DICT_TYPE = "sys_school_campus";
@PostConstruct
public void info(){
List<SchoolCampus> schoolCampuses = list();
List<SysDictData> dictDatas =
schoolCampuses.stream().map(campus->{
SysDictData dictData = new SysDictData();
dictData.setDictValue(campus.getCampusCode());
dictData.setDictLabel(campus.getName());
dictData.setDictType(DICT_TYPE);
dictData.setDictSort(campus.getSort());
return dictData;
}).collect(Collectors.toList());
if(StringUtils.isNotEmpty(dictDatas)){
DictUtils.setDictCache(DICT_TYPE,dictDatas);
}
}
@Override
public List<TreeDto> selectTreeDto(String campusCode, String name) {
return baseMapper.selectTreeDto(campusCode, name)
.stream().peek(t-> t.setParentCode(TreeUtil.FIRST_PARENT_CODE)
).collect(Collectors.toList());
}
/**
* 添加 校区信息
* @param campus
* @return
*/
@Override
public Boolean insertCampus(SchoolCampus campus) {
RLock lock = redissonClient.getLock(LOCK);
try {
lock.lock();
Long count = count(new LambdaQueryWrapper<SchoolCampus>()
.eq(SchoolCampus::getName,campus.getName()));
if(count > 0){
throw new ServiceException("校区名重复,不能重复添加");
}
campus.setCampusId(null);
campus.setCampusCode(IdUtils.randomUUID());
campus.setCreateBy(SecurityUtils.getUsername());
campus.setCreateTime(new Date());
Boolean flag = save(campus);
info();
return flag;
} finally {
lock.unlock();
}
}
/**
* 修改 校区信息
* @param campus
* @return
*/
@Override
public Boolean updateCampus(SchoolCampus campus) {
RLock lock = redissonClient.getLock(LOCK);
try {
lock.lock();
Long count = count(new LambdaQueryWrapper<SchoolCampus>()
.eq(SchoolCampus::getName,campus.getName())
.ne(SchoolCampus::getCampusId,campus.getCampusId()));
if(count > 0){
throw new ServiceException("校区名重复,请重写修改");
}
campus.setUpdateBy(SecurityUtils.getUsername());
campus.setUpdateTime(new Date());
Boolean flag = updateById(campus);
info();
return flag;
} finally {
lock.unlock();
}
}
/**
* 删除 校区信息
* @param campusId
* @return
*/
@Override
public Boolean deleteCampus(Long campusId) {
if(campusId == null || campusId <= 0){
throw new ServiceException("参数错误,无法删除校区信息");
}
SchoolCampus campus = baseMapper.selectById(campusId);
if (StringUtils.isNull(campus)){
throw new ServiceException("信息错误,无法查询指定校区");
}
long count = schoolBuildingMapper.selectCount(new LambdaQueryWrapper<SchoolBuild>()
.eq(SchoolBuild::getCampusCode,campus.getCampusCode()));
if(count > 0){
throw new ServiceException("校区还包含楼宇,无法删除校区信息");
}
return removeById(campusId);
}
}
package com.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.core.tree.TreeDto;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DictUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.system.domain.SchoolFloor;
import com.ruoyi.system.service.SchoolFloorService;
import com.ruoyi.system.mapper.SchoolFloorMapper;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 楼层 服务层
*/
@Service
public class SchoolFloorServiceImpl
extends ServiceImpl<SchoolFloorMapper, SchoolFloor> implements SchoolFloorService {
@Autowired
private RedissonClient redissonClient;
private static final String LOCK = "FLOOR";
public static final String DICT_TYPE = "sys_school_floor";
@PostConstruct
public void info(){
List<SchoolFloor> schoolCampuses = list();
List<SysDictData> dictDatas =
schoolCampuses.stream().map(f->{
SysDictData dictData = new SysDictData();
dictData.setDictValue(f.getFloorCode());
dictData.setDictLabel(f.getFloorName());
dictData.setDictType(DICT_TYPE);
dictData.setDictSort(f.getSort());
return dictData;
}).collect(Collectors.toList());
if(StringUtils.isNotEmpty(dictDatas)){
DictUtils.setDictCache(DICT_TYPE,dictDatas);
}
}
/**
* 查询楼层树结构
* @param buildCodes 楼宇编码
* @return
*/
@Override
public List<TreeDto> selectTreeDtos(List<String> buildCodes) {
return baseMapper.selectTreeDtos(buildCodes)
.stream().filter(t->StringUtils.isNotEmpty(t.getParentCode()))
.collect(Collectors.toList());
}
/**
* 添加 楼层信息
* @param floor
* @return
*/
@Override
public Boolean insertFloor(SchoolFloor floor) {
RLock lock = redissonClient.getLock(LOCK);
try {
lock.lock();
Long count = count(new LambdaQueryWrapper<SchoolFloor>()
.eq(SchoolFloor::getBuildCode,floor.getBuildCode())
.eq(SchoolFloor::getFloorName,floor.getFloorName()));
if(count > 0){
throw new ServiceException("楼层名重复,不能重复添加");
}
floor.setFloorCode(IdUtils.randomUUID());
floor.setCreateBy(SecurityUtils.getUsername());
floor.setCreateTime(new Date());
Boolean flag = save(floor);
info();
return flag;
} finally {
lock.unlock();
}
}
/**
* 修改 楼层信息
* @param floor
* @return
*/
@Override
public Boolean updateFloor(SchoolFloor floor) {
if (StringUtils.isNull(floor.getFloorId())){
throw new ServiceException("参数缺失,无法查询指定的楼层");
}
RLock lock = redissonClient.getLock(LOCK);
try {
lock.lock();
SchoolFloor entity = baseMapper.selectById(floor.getFloorId());
if (StringUtils.isNull(entity)){
throw new ServiceException("参数错误,无法查询指定的楼层");
}
long count = count(new LambdaQueryWrapper<SchoolFloor>()
.eq(SchoolFloor::getBuildCode,floor.getBuildCode())
.eq(SchoolFloor::getFloorName,floor.getFloorName())
.ne(SchoolFloor::getFloorId,floor.getFloorId()));
if(count > 0){
throw new ServiceException("楼层名重复,请重写修改");
}
floor.setUpdateBy(SecurityUtils.getUsername());
floor.setUpdateTime(new Date());
Boolean flag = updateById(floor);
info();
return flag;
} finally {
lock.unlock();
}
}
/**
* 删除 楼层信息
* @param floorId
* @return
*/
@Override
public Boolean deleteFloor(Long floorId) {
if(floorId == null || floorId <= 0){
throw new ServiceException("参数错误,无法删除楼层信息");
}
Boolean flag= removeById(floorId);
info();
return flag;
}
}
package com.ruoyi.system.service.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.system.domain.Space;
import com.ruoyi.system.mapper.SpaceMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.SpaceSeatMapper;
import com.ruoyi.system.domain.SpaceSeat;
import com.ruoyi.system.service.ISpaceSeatService;
/**
* 座位Service业务层处理
*
* @author ruoyi
* @date 2025-11-03
*/
@Service
public class SpaceSeatServiceImpl extends ServiceImpl<SpaceSeatMapper,SpaceSeat> implements ISpaceSeatService
{
@Autowired
private SpaceSeatMapper spaceSeatMapper;
@Autowired
private SpaceMapper spaceMapper;
/**
* 查询座位
*
* @param seatId 座位主键
* @return 座位
*/
@Override
public SpaceSeat selectSpaceSeatBySeatId(Long seatId)
{
return spaceSeatMapper.selectSpaceSeatBySeatId(seatId);
}
/**
* 查询座位列表
*
* @param spaceSeat 座位
* @return 座位
*/
@Override
public List<SpaceSeat> selectSpaceSeatList(SpaceSeat spaceSeat)
{
return spaceSeatMapper.selectSpaceSeatList(spaceSeat);
}
/**
* 查询座位信息
* @param seatCodes
* @return
*/
@Override
public List<SpaceSeat> selectSpaceSeatByCodes(List<String> seatCodes) {
if (StringUtils.isEmpty(seatCodes)){
return new ArrayList<>();
}
List<SpaceSeat> spaceSeats = list(new LambdaQueryWrapper<SpaceSeat>()
.select(SpaceSeat::getSeatCode,SpaceSeat::getSeatId,SpaceSeat::getSpaceCode,SpaceSeat::getSeatName)
.in(SpaceSeat::getSeatCode,seatCodes));
if (StringUtils.isEmpty(spaceSeats)){
return new ArrayList<>();
}
List<String> spaceCodes = spaceSeats.stream().map(SpaceSeat::getSpaceCode).collect(Collectors.toList());
Map<String, Space> spaceMap = spaceMapper.selectList(new LambdaQueryWrapper<Space>()
.select(Space::getSpaceId,Space::getCampusCode,Space::getBuildCode,Space::getFloorCode,
Space::getSpaceCode,Space::getName,Space::getOpenTime,Space::getMiniMumDuration,
Space::getInAdvanceDuration)
.in(Space::getSpaceCode,spaceCodes))
.stream().collect(Collectors.toMap(Space::getSpaceCode, Function.identity()));
for (SpaceSeat seat : spaceSeats) {
seat.setSpace(spaceMap.getOrDefault(seat.getSpaceCode(),new Space()));
}
return spaceSeats;
}
@Override
public List<Space> selectSpaceSeatCount(List<String> spaceCodes) {
return baseMapper.selectSpaceSeatCount(spaceCodes);
}
/**
* 新增座位
*
* @param spaceSeat 座位
* @return 结果
*/
@Override
public Boolean insertSpaceSeat(SpaceSeat spaceSeat)
{
spaceSeat.setSeatCode(IdUtils.randomUUID());
spaceSeat.setCreateBy(SecurityUtils.getUsername());
spaceSeat.setCreateTime(DateUtils.getNowDate());
return save(spaceSeat);
}
/**
* 修改座位
*
* @param spaceSeat 座位
* @return 结果
*/
@Override
public Boolean updateSpaceSeat(SpaceSeat spaceSeat)
{
spaceSeat.setUpdateBy(SecurityUtils.getUsername());
spaceSeat.setUpdateTime(DateUtils.getNowDate());
return updateById(spaceSeat);
}
/**
* 批量删除座位
*
* @param seatIds 需要删除的座位主键
* @return 结果
*/
@Override
public int deleteSpaceSeatBySeatIds(Long[] seatIds)
{
return spaceSeatMapper.deleteSpaceSeatBySeatIds(seatIds);
}
/**
* 删除座位信息
*
* @param seatId 座位主键
* @return 结果
*/
@Override
public Boolean deleteSpaceSeatBySeatId(Long seatId)
{
return removeById(seatId);
}
}
package com.ruoyi.system.service.impl;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SpaceSeat;
import com.ruoyi.system.service.IReservationApprovalService;
import com.ruoyi.system.service.ISpaceSeatService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.SpaceMapper;
import com.ruoyi.system.domain.Space;
import com.ruoyi.system.service.ISpaceService;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* 房间Service业务层处理
*
* @author ruoyi
* @date 2025-11-03
*/
@Service
public class SpaceServiceImpl extends ServiceImpl<SpaceMapper,Space> implements ISpaceService
{
@Autowired
private SpaceMapper spaceMapper;
@Autowired
private ISpaceSeatService spaceSeatService;
@Autowired
private IReservationApprovalService reservationApprovalService;
/**
* 批量删除房间
*
* @param spaceIds 需要删除的房间主键
* @return 结果
*/
@Override
public int deleteSpaceBySpaceIds(Long[] spaceIds)
{
return spaceMapper.deleteSpaceBySpaceIds(spaceIds);
}
/**
* 检查房间空闲
* @param spaceId 房间id
* @param startAt 开始时间
* @param endAt 结束时间
* @return
*/
@Override
public Space checkSpaceSeat(Long spaceId, Date startAt, Date endAt) {
Space space = getById(spaceId);
if (StringUtils.isNull(space)){
throw new ServiceException("房间信息错误");
}
List<SpaceSeat> spaceSeats = spaceSeatService.list(new LambdaQueryWrapper<SpaceSeat>()
.select(SpaceSeat::getSeatId,SpaceSeat::getSeatCode,SpaceSeat::getSpaceCode,SpaceSeat::getSeatName)
.eq(SpaceSeat::getSpaceCode,space.getSpaceCode()));
if (StringUtils.isEmpty(spaceSeats)){
return space;
}
List<String> spaceSeatCodes = spaceSeats.stream().map(SpaceSeat::getSeatCode).collect(Collectors.toList());
/** 获取时段内已预约的座位编码 */
List<String> reservedSeatCodes = reservationApprovalService.selectReservedSeatCodes(spaceSeatCodes,startAt,endAt);
for (SpaceSeat spaceSeat : spaceSeats) {
spaceSeat.setReservable(
!reservedSeatCodes.contains(spaceSeat.getSeatCode()) //是否占用
//是否达到最小预约时长
&& DateUtil.between(startAt,endAt, DateUnit.MINUTE) >= space.getMiniMumDuration()
// 是否达到最小预约间隔
&& DateUtil.between(new Date(),startAt,DateUnit.DAY) >= space.getInAdvanceDuration()
);
}
space.setSpaceSeats(spaceSeats);
return space;
}
public static void main(String[] args) {
Date oldDate = DateUtil.parse("2025-11-03","yyyy-MM-dd");
System.out.println(DateUtil.between(new Date(),oldDate,DateUnit.DAY));
}
}
......@@ -126,6 +126,17 @@ public class SysDeptServiceImpl implements ISysDeptService
return deptMapper.selectDeptById(deptId);
}
/**
* 根据部门ID查询信息
*
* @param deptCode 部门编码
* @return 部门信息
*/
@Override
public SysDept selectDeptByCode(String deptCode){
return deptMapper.selectDeptByCode(deptCode);
}
/**
* 根据ID查询所有子部门(正常状态)
*
......
......@@ -139,6 +139,11 @@ public class SysRoleServiceImpl implements ISysRoleService
return roleMapper.selectRoleById(roleId);
}
@Override
public SysRole selectRoleByRoleKey(String roleKey) {
return roleMapper.selectRoleByKey(roleKey);
}
/**
* 校验角色名称是否唯一
*
......
package com.ruoyi.system.service.impl;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
import javax.validation.Validator;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -38,7 +39,7 @@ import com.ruoyi.system.service.ISysUserService;
* @author ruoyi
*/
@Service
public class SysUserServiceImpl implements ISysUserService
public class SysUserServiceImpl implements ISysUserService
{
private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class);
......@@ -129,6 +130,17 @@ public class SysUserServiceImpl implements ISysUserService
return userMapper.selectUserById(userId);
}
@Override
public List<SysUser> selectUsersByUserName(List<String> userNames) {
if (StringUtils.isEmpty(userNames)){
throw new ServiceException("用户信息不能为空");
}
return userMapper.selectUsersByUserName(userNames);
}
/**
* 查询用户所属角色组
*
......@@ -562,4 +574,57 @@ public class SysUserServiceImpl implements ISysUserService
}
return successMsg.toString();
}
// @Override
// public SysUser loginUser(SSOUserResponse ssoUser) {
// SysUser sysUser = userMapper.selectUserByUserName(ssoUser.getLoginPersonNo());
// log.info("用户信息==={}",sysUser);
//
// if (StringUtils.isNotNull(sysUser)) {
// // 角色去重
// sysUser.setRoles(
// sysUser.getRoles().stream()
// .collect(Collectors
// .collectingAndThen(
// Collectors.toCollection(
// () -> new TreeSet<>(Comparator.comparing(SysRole::getRoleKey))),
// ArrayList::new)));
// }else {
//
// /** 添加用户信息 */
//
// SysUser user = new SysUser();
//
// user.setUserName(ssoUser.getLoginPersonNo());
// user.setNickName(ssoUser.getMemberName());
// user.setSex(ssoUser.getSex());
// user.setStatus("0");
//
// user.setPassword("gwyy@zxc.");
//
// Optional<SSODeptInfo> ssoDeptInfoOptional = ssoUser.getDeptInfos().stream().findFirst();
//
// if (ssoDeptInfoOptional.isPresent()){
// SysDept dept = deptService.selectDeptByCode(ssoDeptInfoOptional.get().getDeptCode());
// user.setDeptId(dept.getDeptId());
// }
//
//
// List<String> roleTypes = ssoUser.getUserTypes().stream().map(SSOUserInfo::getUserType).collect(Collectors.toList());
//
// List<String> roleKeys = Arrays.stream(SsoUserType.values()).filter(x->roleTypes.contains(x.getCode()))
// .map(SsoUserType::getRoleKey).collect(Collectors.toList());
//
// user.setRoleIds(roleMapper.selectRoleIdsByKeys(roleKeys));
//
//
// insertUser(user);
//
// sysUser = selectUserByUserName(user.getUserName());
// }
//
// return sysUser;
// }
}
package com.ruoyi.system.task.verifyReservationApproval;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.enums.ApprovalStatus;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.domain.ReservationApproval;
import com.ruoyi.system.service.IReservationApprovalService;
import com.ruoyi.system.service.ISysConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class AlreadyApprovalProcessor implements VerifyReservationApprovalProcessor {
@Autowired
private IReservationApprovalService reservationApprovalService;
@Autowired
private ISysConfigService configService;
private static final String CONFIG_KEY = "approval.max.wait";
@Override
public void VerifyReservationApproval(ReservationApproval reservationApproval) {
int maxWait = Integer.parseInt(configService.selectConfigByKey(CONFIG_KEY));
long count = reservationApprovalService.count(new LambdaQueryWrapper<ReservationApproval>()
.eq(ReservationApproval::getSubmitBy, SecurityUtils.getUsername())
.in(ReservationApproval::getStatus, ApprovalStatus.PASS.getCode(),ApprovalStatus.WAITING.getCode())
.ge(ReservationApproval::getStartAt,new Date()));
if (count >= maxWait){
throw new ServiceException("已超过最大预约数,暂无法预约");
}
}
}
package com.ruoyi.system.task.verifyReservationApproval;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.ReservationApproval;
import com.ruoyi.system.service.IReservationApprovalService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* 校验申请的时间节点
*/
@Component
@Order(3)
public class ApprovalTimeProcessor implements VerifyReservationApprovalProcessor {
@Autowired
private IReservationApprovalService reservationApprovalService;
@Override
public void VerifyReservationApproval(ReservationApproval reservationApproval) {
List<String> seatCodes = new ArrayList<>();
seatCodes.add(reservationApproval.getSeatCode());
List<String> reservedSeatCodes = reservationApprovalService.selectReservedSeatCodes(seatCodes,reservationApproval.getStartAt(),reservationApproval.getEndAt());
if (StringUtils.isNotEmpty(reservedSeatCodes) && reservedSeatCodes.contains(reservationApproval.getSeatCode())){
throw new ServiceException("该座位已被预约,请刷新重试");
}
}
}
package com.ruoyi.system.task.verifyReservationApproval;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.enums.BlacklistStatus;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.system.domain.ReservationApproval;
import com.ruoyi.system.domain.ReservationBlacklist;
import com.ruoyi.system.service.IReservationBlacklistService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* 校验用户是否属于黑名单内容
*/
@Component
@Order(2)
public class BlackListProcessor implements VerifyReservationApprovalProcessor{
@Autowired
private IReservationBlacklistService blacklistService;
@Override
public void VerifyReservationApproval(ReservationApproval reservationApproval) {
long count = blacklistService.count(new LambdaQueryWrapper<ReservationBlacklist>()
.eq(ReservationBlacklist::getPersonNo,reservationApproval.getApprovedBy())
.ge(ReservationBlacklist::getArrestedAt,new Date())
.eq(ReservationBlacklist::getStatus, BlacklistStatus.OPEN.getCode()));
if (count > 0){
throw new ServiceException("你已被添加黑名单,暂无法提交申请");
}
}
}
package com.ruoyi.system.task.verifyReservationApproval;
import cn.hutool.core.date.LocalDateTimeUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.enums.ApprovalStatus;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.system.domain.ReservationApproval;
import com.ruoyi.system.service.IReservationApprovalService;
import com.ruoyi.system.service.ISysConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
/**
* 违约次数校验
*/
@Component
@Order(1)
public class DefaultApprovalProcessor implements VerifyReservationApprovalProcessor{
@Autowired
private IReservationApprovalService approvalService;
@Autowired
private ISysConfigService configService;
private static final String CONFIG_KEY = "number.of.defaults";
@Override
public void VerifyReservationApproval(ReservationApproval reservationApproval) {
/** 获取 违约限制 总数 */
int size = Integer.parseInt(configService.selectConfigByKey(CONFIG_KEY));
long defaultOfNumbers = approvalService.count(new LambdaQueryWrapper<ReservationApproval>()
.eq(ReservationApproval::getApprovedBy,reservationApproval.getApprovedBy())
.eq(ReservationApproval::getStatus, ApprovalStatus.PASS.getCode())
.le(ReservationApproval::getEndAt, LocalDateTimeUtil.now()));
if (defaultOfNumbers >= size){
throw new ServiceException("您的违约次数已达上限,暂无法提交新的申请");
}
}
}
package com.ruoyi.system.task.verifyReservationApproval;
import com.ruoyi.system.domain.ReservationApproval;
public interface VerifyReservationApprovalProcessor {
/**
* 检验 工位预约申请
* @param reservationApproval
* @return
*/
public void VerifyReservationApproval(ReservationApproval reservationApproval);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.ReservationApprovalMapper">
<resultMap type="ReservationApproval" id="ReservationApprovalResult">
<result property="approvalId" column="approval_id" />
<result property="seatCode" column="seat_code" />
<result property="submitAt" column="submit_at" />
<result property="submitBy" column="submit_by" />
<result property="startAt" column="start_at"/>
<result property="endAt" column="end_at"/>
<result property="approvedAt" column="approved_at" />
<result property="approvedBy" column="approved_by" />
<result property="status" column="status" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
<result property="delFlag" column="del_flag" />
</resultMap>
<sql id="selectReservationApprovalVo">
select approval_id, seat_code, submit_at, submit_by,start_at,end_at, approved_at, approved_by, status, create_by, create_time, update_by, update_time, remark, del_flag from reservation_approval
</sql>
<select id="selectReservationApprovalList" parameterType="ReservationApproval" resultMap="ReservationApprovalResult">
<include refid="selectReservationApprovalVo"/>
<where>
and del_flag ='2';
<if test="seatCode != null and seatCode != ''"> and seat_code = #{seatCode}</if>
<if test="submitAt != null "> and submit_at = #{submitAt}</if>
<if test="submitBy != null and submitBy != ''"> and submit_by = #{submitBy}</if>
<if test="approvedAt != null "> and approved_at = #{approvedAt}</if>
<if test="approvedBy != null and approvedBy != ''"> and approved_by = #{approvedBy}</if>
<if test="status != null and status != ''"> and status = #{status}</if>
</where>
</select>
<select id="selectReservationApprovalByApprovalId" parameterType="Long" resultMap="ReservationApprovalResult">
<include refid="selectReservationApprovalVo"/>
where approval_id = #{approvalId} and del_flag = '2'
</select>
<select id="selectReservedSeatCodes">
SELECT
seat_code
FROM reservation_approval
WHERE seat_code IN
<foreach collection="seatCodes" item="seatCode" open="(" close=")" separator=",">
#{seatCode}
</foreach>
AND start_at &lt; #{endAt} -- 传入的结束时间
AND end_at > #{startAt} -- 传入的开始时间
AND status IN ('0', '1') -- 待审核和已通过的申请
AND del_flag = '0' -- 未删除的记录
</select>
<insert id="insertReservationApproval" parameterType="ReservationApproval">
insert into reservation_approval
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="approvalId != null">approval_id,</if>
<if test="seatCode != null">seat_code,</if>
<if test="submitAt != null">submit_at,</if>
<if test="submitBy != null">submit_by,</if>
<if test="approvedAt != null">approved_at,</if>
<if test="approvedBy != null">approved_by,</if>
<if test="status != null">status,</if>
<if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="remark != null">remark,</if>
<if test="delFlag != null">del_flag,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="approvalId != null">#{approvalId},</if>
<if test="seatCode != null">#{seatCode},</if>
<if test="submitAt != null">#{submitAt},</if>
<if test="submitBy != null">#{submitBy},</if>
<if test="approvedAt != null">#{approvedAt},</if>
<if test="approvedBy != null">#{approvedBy},</if>
<if test="status != null">#{status},</if>
<if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="remark != null">#{remark},</if>
<if test="delFlag != null">'0',</if>
</trim>
</insert>
<update id="updateReservationApproval" parameterType="ReservationApproval">
update reservation_approval
<trim prefix="SET" suffixOverrides=",">
<if test="seatCode != null">seat_code = #{seatCode},</if>
<if test="submitAt != null">submit_at = #{submitAt},</if>
<if test="submitBy != null">submit_by = #{submitBy},</if>
<if test="approvedAt != null">approved_at = #{approvedAt},</if>
<if test="approvedBy != null">approved_by = #{approvedBy},</if>
<if test="status != null">status = #{status},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="remark != null">remark = #{remark},</if>
</trim>
where approval_id = #{approvalId} and del_flag = '0'
</update>
<delete id="deleteReservationApprovalByApprovalId" parameterType="Long">
update reservation_approval set del_flag = '2' where approval_id = #{approvalId}
</delete>
<delete id="deleteReservationApprovalByApprovalIds" parameterType="String">
pdate reservation_approval set del_flag = '2' where approval_id in
<foreach item="approvalId" collection="array" open="(" separator="," close=")">
#{approvalId}
</foreach>
</delete>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.ReservationBlacklistMapper">
<resultMap type="ReservationBlacklist" id="ReservationBlacklistResult">
<result property="id" column="id" />
<result property="personNo" column="person_no" />
<result property="personName" column="person_name"/>
<result property="reason" column="reason" />
<result property="arrestedAt" column="arrested_at" />
<result property="status" column="status"/>
<result property="createdBy" column="created_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
<result property="delFlag" column="del_flag" />
</resultMap>
<sql id="selectReservationBlacklistVo">
select id, person_no, reason, arrested_at,status created_by, create_time, update_by, update_time, remark, del_flag from reservation_blacklist
</sql>
<select id="selectReservationBlacklistList" parameterType="ReservationBlacklist" resultMap="ReservationBlacklistResult">
select rb.id, rb.person_no, rb.reason, rb.arrested_at,rb.status, rb.created_by, rb.create_time,su.user_name as 'person_name'
from reservation_blacklist rb left join sys_user su on rb.person_no = su.user_name
where rb.del_flag ='0' and su.del_flag ='0'
<if test="personNo != null and personNo != ''"> and rb.person_no like CONCAT('%',#{personNo},'%') </if>
<if test="personName != null and personName != ''">and su.user_name like CONCAT('%',#{personName},'%')</if>
</select>
<select id="selectReservationBlacklistById" parameterType="Long" resultMap="ReservationBlacklistResult">
<include refid="selectReservationBlacklistVo"/>
where id = #{id} and del_flag = '0'
</select>
<insert id="insertReservationBlacklist" parameterType="ReservationBlacklist">
insert into reservation_blacklist
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">id,</if>
<if test="personNo != null">person_no,</if>
<if test="reason != null">reason,</if>
<if test="arrestedAt != null">arrested_at,</if>
<if test="status != null">status,</if>
<if test="createdBy != null">created_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="remark != null">remark,</if>
<if test="delFlag != null">del_flag,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">#{id},</if>
<if test="personNo != null">#{personNo},</if>
<if test="reason != null">#{reason},</if>
<if test="arrestedAt != null">#{arrestedAt},</if>
<if test="status != null">#{status},</if>
<if test="createdBy != null">#{createdBy},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="remark != null">#{remark},</if>
<if test="delFlag != null">'0',</if>
</trim>
</insert>
<update id="updateReservationBlacklist" parameterType="ReservationBlacklist">
update reservation_blacklist
<trim prefix="SET" suffixOverrides=",">
<if test="personNo != null">person_no = #{personNo},</if>
<if test="reason != null">reason = #{reason},</if>
<if test="arrestedAt != null">arrested_at = #{arrestedAt},</if>
<if test="status != null">status = #{status},</if>
<if test="createdBy != null">created_by = #{createdBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="remark != null">remark = #{remark},</if>
</trim>
where id = #{id} and del_flag ='0'
</update>
<delete id="deleteReservationBlacklistById" parameterType="Long">
update reservation_blacklist set del_flag ='2' where id = #{id}
</delete>
<delete id="deleteReservationBlacklistByIds" parameterType="String">
update reservation_blacklist set del_flag ='2' where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SchoolBuildMapper">
<resultMap type="SchoolBuild" id="SchoolBuildResult">
<result property="buildId" column="build_id" />
<result property="buildCode" column="build_code" />
<result property="campusCode" column="campus_code" />
<result property="buildName" column="build_name" />
<result property="sort" column="sort" />
<result property="attribute" column="attribute" />
<result property="delFlag" column="del_flag" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
</resultMap>
<sql id="selectSchoolBuildVo">
select build_id, build_code, campus_code, build_name, sort, `attribute`, del_flag, create_by, create_time, update_by, update_time, remark from school_build
</sql>
<select id="selectSchoolBuildList" parameterType="SchoolBuild" resultMap="SchoolBuildResult">
<include refid="selectSchoolBuildVo"/>
<where>
del_flag = '0'
<if test="buildCode != null and buildCode != ''"> and build_code = #{buildCode}</if>
<if test="campusCode != null and campusCode != ''"> and campus_code = #{campusCode}</if>
<if test="buildName != null and buildName != ''"> and build_name like concat('%', #{buildName}, '%')</if>
<if test="sort != null "> and sort = #{sort}</if>
<if test="attribute != null and attribute != ''"> and `attribute` = #{attribute}</if>
</where>
</select>
<select id="selectSchoolBuildByBuildId" parameterType="Long" resultMap="SchoolBuildResult">
<include refid="selectSchoolBuildVo"/>
where build_id = #{buildId} and del_flag = '0'
</select>
<select id="selectTreeDtos" resultType="com.ruoyi.common.core.tree.TreeDto">
SELECT build_id as id ,build_code as 'code',build_name as 'treeName',campus_code as 'parent_code','build' as 'type'
FROM school_build WHERE del_flag = '0'
and campus_code in
<foreach collection="campusCodes" item="campusCode" open="(" close=")" separator=",">
#{campusCode}
</foreach>
order by sort
</select>
<insert id="insertSchoolBuild" parameterType="SchoolBuild" useGeneratedKeys="true" keyProperty="buildId">
insert into school_build
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="buildCode != null">build_code,</if>
<if test="campusCode != null">campus_code,</if>
<if test="buildName != null">build_name,</if>
<if test="sort != null">sort,</if>
<if test="attribute != null">`attribute`,</if>
<if test="delFlag != null">del_flag,</if>
<if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="remark != null">remark,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="buildCode != null">#{buildCode},</if>
<if test="campusCode != null">#{campusCode},</if>
<if test="buildName != null">#{buildName},</if>
<if test="sort != null">#{sort},</if>
<if test="attribute != null">#{attribute},</if>
<if test="delFlag != null">#{delFlag},</if>
<if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="remark != null">#{remark},</if>
</trim>
</insert>
<update id="updateSchoolBuild" parameterType="SchoolBuild">
update school_build
<trim prefix="SET" suffixOverrides=",">
<if test="buildCode != null">build_code = #{buildCode},</if>
<if test="campusCode != null">campus_code = #{campusCode},</if>
<if test="buildName != null">build_name = #{buildName},</if>
<if test="sort != null">sort = #{sort},</if>
<if test="attribute != null">`attribute` = #{attribute},</if>
<if test="delFlag != null">del_flag = #{delFlag},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="remark != null">remark = #{remark},</if>
</trim>
where build_id = #{buildId}
</update>
<delete id="deleteSchoolBuildByBuildId" parameterType="Long">
update school_build set del_flag ='2' where build_id = #{buildId}
</delete>
<delete id="deleteSchoolBuildByBuildIds" parameterType="String">
update school_build set del_flag ='2' where build_id in
<foreach item="buildId" collection="array" open="(" separator="," close=")">
#{buildId}
</foreach>
</delete>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SchoolCampusMapper">
<resultMap type="SchoolCampus" id="SchoolCampusResult">
<result property="campusId" column="campus_id" />
<result property="campusCode" column="campus_code" />
<result property="name" column="name" />
<result property="sort" column="sort" />
<result property="delFlag" column="del_flag" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
</resultMap>
<sql id="selectSchoolCampusVo">
select campus_id, campus_code, `name`, sort, del_flag, create_by, create_time, update_by, update_time, remark from school_campus
</sql>
<select id="selectSchoolCampusList" parameterType="SchoolCampus" resultMap="SchoolCampusResult">
<include refid="selectSchoolCampusVo"/>
<where>
<if test="campusCode != null and campusCode != ''"> and campus_code = #{campusCode}</if>
<if test="name != null and name != ''"> and `name` like concat('%', #{name}, '%')</if>
<if test="sort != null "> and sort = #{sort}</if>
</where>
</select>
<select id="selectSchoolCampusByCampusId" parameterType="Long" resultMap="SchoolCampusResult">
<include refid="selectSchoolCampusVo"/>
where campus_id = #{campusId}
</select>
<select id="selectTreeDto" resultType="com.ruoyi.common.core.tree.TreeDto">
SELECT
`campus_id` AS id, `campus_code` AS `code`,`name` AS treeName, 'campus' AS type
FROM school_campus WHERE del_flag = '0'
<if test="campusCode != null and campusCode != ''">
AND `campus_code` = #{campusCode}
</if>
<if test="name != null and name != ''">
AND `name` like concat(#{name},'%')
</if>
order by sort
</select>
<insert id="insertSchoolCampus" parameterType="SchoolCampus" useGeneratedKeys="true" keyProperty="campusId">
insert into school_campus
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="campusCode != null">campus_code,</if>
<if test="name != null">`name`,</if>
<if test="sort != null">sort,</if>
<if test="delFlag != null">del_flag,</if>
<if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="remark != null">remark,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="campusCode != null">#{campusCode},</if>
<if test="name != null">#{name},</if>
<if test="sort != null">#{sort},</if>
<if test="delFlag != null">#{delFlag},</if>
<if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="remark != null">#{remark},</if>
</trim>
</insert>
<update id="updateSchoolCampus" parameterType="SchoolCampus">
update school_campus
<trim prefix="SET" suffixOverrides=",">
<if test="campusCode != null">campus_code = #{campusCode},</if>
<if test="name != null">`name` = #{name},</if>
<if test="sort != null">sort = #{sort},</if>
<if test="delFlag != null">del_flag = #{delFlag},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="remark != null">remark = #{remark},</if>
</trim>
where campus_id = #{campusId}
</update>
<delete id="deleteSchoolCampusByCampusId" parameterType="Long">
update school_campus set del_flag ='2' where campus_id = #{campusId}
</delete>
<delete id="deleteSchoolCampusByCampusIds" parameterType="String">
update school_campus set del_flag ='2' where campus_id in
<foreach item="campusId" collection="array" open="(" separator="," close=")">
#{campusId}
</foreach>
</delete>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SchoolFloorMapper">
<resultMap type="SchoolFloor" id="SchoolFloorResult">
<result property="floorId" column="floor_id" />
<result property="floorCode" column="floor_code" />
<result property="buildCode" column="build_code" />
<result property="floorName" column="floor_name" />
<result property="sort" column="sort" />
<result property="attribute" column="attribute" />
<result property="delFlag" column="del_flag" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
</resultMap>
<sql id="selectSchoolFloorVo">
select floor_id, floor_code, build_code, floor_name, sort, `attribute`, del_flag, create_by, create_time, update_by, update_time, remark from school_floor
</sql>
<select id="selectSchoolFloorList" parameterType="SchoolFloor" resultMap="SchoolFloorResult">
<include refid="selectSchoolFloorVo"/>
<where>
<if test="floor_code != null and floor_code != ''"> and floor_code = #{floorCode}</if>
<if test="buildCode != null and buildCode != ''"> and build_code = #{buildCode}</if>
<if test="floorName != null and floorName != ''"> and floor_name like concat('%', #{floorName}, '%')</if>
<if test="sort != null "> and sort = #{sort}</if>
<if test="attribute != null and attribute != ''"> and `attribute` = #{attribute}</if>
</where>
</select>
<select id="selectSchoolFloorByFloorId" parameterType="Long" resultMap="SchoolFloorResult">
<include refid="selectSchoolFloorVo"/>
where floor_id = #{floorId}
</select>
<select id="selectTreeDtos" resultType="com.ruoyi.common.core.tree.TreeDto">
SELECT floor_id as 'id',floor_code as 'code',build_code as 'parentCode',floor_name as 'treeName','floor' as 'type'
from school_floor WHERE del_flag = '0'
and build_code in
<foreach collection="buildCodes" index="index" item="buildCode" open="(" close=")" separator="," >
#{buildCode}
</foreach>
order by sort
</select>
<insert id="insertSchoolFloor" parameterType="SchoolFloor" useGeneratedKeys="true" keyProperty="floorId">
insert into school_floor
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="floor_code != null">floor_code,</if>
<if test="buildCode != null">build_code,</if>
<if test="floorName != null">floor_name,</if>
<if test="sort != null">sort,</if>
<if test="attribute != null">`attribute`,</if>
<if test="delFlag != null">del_flag,</if>
<if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="remark != null">remark,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="floor_code != null">#{floorCode},</if>
<if test="buildCode != null">#{buildCode},</if>
<if test="floorName != null">#{floorName},</if>
<if test="sort != null">#{sort},</if>
<if test="attribute != null">#{attribute},</if>
<if test="delFlag != null">#{delFlag},</if>
<if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="remark != null">#{remark},</if>
</trim>
</insert>
<update id="updateSchoolFloor" parameterType="SchoolFloor">
update school_floor
<trim prefix="SET" suffixOverrides=",">
<if test="floor_code != null">floor_code = #{floorCode},</if>
<if test="buildCode != null">build_code = #{buildCode},</if>
<if test="floorName != null">floor_name = #{floorName},</if>
<if test="sort != null">sort = #{sort},</if>
<if test="attribute != null">`attribute` = #{attribute},</if>
<if test="delFlag != null">del_flag = #{delFlag},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="remark != null">remark = #{remark},</if>
</trim>
where floor_id = #{floorId}
</update>
<delete id="deleteSchoolFloorByFloorId" parameterType="Long">
update school_floor set del_flag ='2' where floor_id = #{floorId}
</delete>
<delete id="deleteSchoolFloorByFloorIds" parameterType="String">
update school_floor set del_flag = '2' where floor_id in
<foreach item="floorId" collection="array" open="(" separator="," close=")">
#{floorId}
</foreach>
</delete>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SpaceMapper">
<resultMap type="Space" id="SpaceResult">
<result property="spaceId" column="space_id" />
<result property="campusCode" column="campus_code" />
<result property="buildCode" column="build_code" />
<result property="floorCode" column="floor_code" />
<result property="name" column="name" />
<result property="seatCount" column="seat_count" />
<result property="openTime" column="open_time" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />
<result property="miniMumDuration" column="mini_mum_duration" />
<result property="inAdvanceDuration" column="in_advance_duration" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
<result property="delFlag" column="del_flag" />
</resultMap>
<sql id="selectSpaceVo">
select space_id, campus_code, build_code, floor_code, `name`, seat_count, open_time, mini_mum_duration, in_advance_duration, create_by, create_time, update_by, update_time, remark, del_flag from space
</sql>
<select id="selectSpaceList" parameterType="Space" resultMap="SpaceResult">
<include refid="selectSpaceVo"/>
<where>
del_flag ='0'
<if test="campusCode != null and campusCode != ''"> and campus_code = #{campusCode}</if>
<if test="buildCode != null and buildCode != ''"> and build_code = #{buildCode}</if>
<if test="floorCode != null and floorCode != ''"> and floor_code = #{floorCode}</if>
<if test="name != null and name != ''"> and name like concat('%', #{name}, '%')</if>
</where>
</select>
<select id="selectSpaceBySpaceId" parameterType="Long" resultMap="SpaceResult">
<include refid="selectSpaceVo"/>
where space_id = #{spaceId} and del_flag = '0'
</select>
<delete id="deleteSpaceBySpaceIds" parameterType="String">
update space set del_flag = '2' where space_id in
<foreach item="spaceId" collection="array" open="(" separator="," close=")">
#{spaceId}
</foreach>
</delete>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SpaceSeatMapper">
<resultMap type="SpaceSeat" id="SpaceSeatResult">
<result property="seatId" column="seat_id" />
<result property="seatCode" column="seat_code"/>
<result property="spaceCode" column="space_code" />
<result property="seatName" column="seat_name" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
<result property="delFlag" column="del_flag" />
</resultMap>
<sql id="selectSpaceSeatVo">
select seat_id, seat_code,space_code, seat_name, create_by, create_time, update_by, update_time, remark, del_flag from space_seat
</sql>
<select id="selectSpaceSeatList" parameterType="SpaceSeat" resultMap="SpaceSeatResult">
<include refid="selectSpaceSeatVo"/>
<where>
del_flag = '0'
<if test="spaceCode != null and spaceCode != ''"> and space_code = #{spaceCode}</if>
<if test="seatName != null and seatName != ''"> and seat_name like concat('%', #{seatName}, '%')</if>
</where>
</select>
<select id="selectSpaceSeatBySeatId" parameterType="Long" resultMap="SpaceSeatResult">
<include refid="selectSpaceSeatVo"/>
where seat_id = #{seatId} and del_flag ='0'
</select>
<select id="selectSpaceSeatCount" resultType="com.ruoyi.system.domain.Space">
SELECT space_code as 'spaceCode' ,COUNT(*) as 'actualNumberOfSeats'
FROM space_seat WHERE del_flag = '0'
and space_code in
<foreach collection="spaceCodes" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
GROUP BY space_code
</select>
<delete id="deleteSpaceSeatBySeatIds" parameterType="String">
update space_seat set del_flag ='2' where seat_id in
<foreach item="seatId" collection="array" open="(" separator="," close=")">
#{seatId}
</foreach>
</delete>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysDeptMapper">
<resultMap type="SysDept" id="SysDeptResult">
<id property="deptId" column="dept_id" />
<result property="parentId" column="parent_id" />
<result property="ancestors" column="ancestors" />
<result property="deptName" column="dept_name" />
<result property="orderNum" column="order_num" />
<result property="leader" column="leader" />
<result property="phone" column="phone" />
<result property="email" column="email" />
<result property="status" column="status" />
<result property="delFlag" column="del_flag" />
<result property="parentName" column="parent_name" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
</resultMap>
<sql id="selectDeptVo">
select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status, d.del_flag, d.create_by, d.create_time
from sys_dept d
</sql>
<select id="selectDeptList" parameterType="SysDept" resultMap="SysDeptResult">
<include refid="selectDeptVo"/>
where d.del_flag = '0'
<if test="deptId != null and deptId != 0">
AND dept_id = #{deptId}
</if>
<if test="parentId != null and parentId != 0">
AND parent_id = #{parentId}
</if>
<if test="deptName != null and deptName != ''">
AND dept_name like concat('%', #{deptName}, '%')
</if>
<if test="status != null and status != ''">
AND status = #{status}
</if>
<!-- 数据范围过滤 -->
${params.dataScope}
order by d.parent_id, d.order_num
</select>
<select id="selectDeptListByRoleId" resultType="Long">
select d.dept_id
from sys_dept d
left join sys_role_dept rd on d.dept_id = rd.dept_id
where rd.role_id = #{roleId}
<if test="deptCheckStrictly">
and d.dept_id not in (select d.parent_id from sys_dept d inner join sys_role_dept rd on d.dept_id = rd.dept_id and rd.role_id = #{roleId})
</if>
order by d.parent_id, d.order_num
</select>
<select id="selectDeptById" parameterType="Long" resultMap="SysDeptResult">
select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status,
(select dept_name from sys_dept where dept_id = d.parent_id) parent_name
from sys_dept d
where d.dept_id = #{deptId}
</select>
<select id="checkDeptExistUser" parameterType="Long" resultType="int">
select count(1) from sys_user where dept_id = #{deptId} and del_flag = '0'
</select>
<select id="hasChildByDeptId" parameterType="Long" resultType="int">
select count(1) from sys_dept
where del_flag = '0' and parent_id = #{deptId} limit 1
</select>
<select id="selectChildrenDeptById" parameterType="Long" resultMap="SysDeptResult">
select * from sys_dept where find_in_set(#{deptId}, ancestors)
</select>
<select id="selectNormalChildrenDeptById" parameterType="Long" resultType="int">
select count(*) from sys_dept where status = 0 and del_flag = '0' and find_in_set(#{deptId}, ancestors)
</select>
<select id="checkDeptNameUnique" resultMap="SysDeptResult">
<include refid="selectDeptVo"/>
where dept_name=#{deptName} and parent_id = #{parentId} and del_flag = '0' limit 1
</select>
<insert id="insertDept" parameterType="SysDept">
insert into sys_dept(
<if test="deptId != null and deptId != 0">dept_id,</if>
<if test="parentId != null and parentId != 0">parent_id,</if>
<if test="deptName != null and deptName != ''">dept_name,</if>
<if test="ancestors != null and ancestors != ''">ancestors,</if>
<if test="orderNum != null">order_num,</if>
<if test="leader != null and leader != ''">leader,</if>
<if test="phone != null and phone != ''">phone,</if>
<if test="email != null and email != ''">email,</if>
<if test="status != null">status,</if>
<if test="createBy != null and createBy != ''">create_by,</if>
create_time
)values(
<if test="deptId != null and deptId != 0">#{deptId},</if>
<if test="parentId != null and parentId != 0">#{parentId},</if>
<if test="deptName != null and deptName != ''">#{deptName},</if>
<if test="ancestors != null and ancestors != ''">#{ancestors},</if>
<if test="orderNum != null">#{orderNum},</if>
<if test="leader != null and leader != ''">#{leader},</if>
<if test="phone != null and phone != ''">#{phone},</if>
<if test="email != null and email != ''">#{email},</if>
<if test="status != null">#{status},</if>
<if test="createBy != null and createBy != ''">#{createBy},</if>
sysdate()
)
</insert>
<update id="updateDept" parameterType="SysDept">
update sys_dept
<set>
<if test="parentId != null and parentId != 0">parent_id = #{parentId},</if>
<if test="deptName != null and deptName != ''">dept_name = #{deptName},</if>
<if test="ancestors != null and ancestors != ''">ancestors = #{ancestors},</if>
<if test="orderNum != null">order_num = #{orderNum},</if>
<if test="leader != null">leader = #{leader},</if>
<if test="phone != null">phone = #{phone},</if>
<if test="email != null">email = #{email},</if>
<if test="status != null and status != ''">status = #{status},</if>
<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
update_time = sysdate()
</set>
where dept_id = #{deptId}
</update>
<update id="updateDeptChildren" parameterType="java.util.List">
update sys_dept set ancestors =
<foreach collection="depts" item="item" index="index"
separator=" " open="case dept_id" close="end">
when #{item.deptId} then #{item.ancestors}
</foreach>
where dept_id in
<foreach collection="depts" item="item" index="index"
separator="," open="(" close=")">
#{item.deptId}
</foreach>
</update>
<update id="updateDeptStatusNormal" parameterType="Long">
update sys_dept set status = '0' where dept_id in
<foreach collection="array" item="deptId" open="(" separator="," close=")">
#{deptId}
</foreach>
</update>
<delete id="deleteDeptById" parameterType="Long">
update sys_dept set del_flag = '2' where dept_id = #{deptId}
</delete>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysDeptMapper">
<resultMap type="SysDept" id="SysDeptResult">
<id property="deptId" column="dept_id" />
<result property="deptCode" column="dept_code" />
<result property="parentId" column="parent_id" />
<result property="ancestors" column="ancestors" />
<result property="deptName" column="dept_name" />
<result property="orderNum" column="order_num" />
<result property="leader" column="leader" />
<result property="phone" column="phone" />
<result property="email" column="email" />
<result property="status" column="status" />
<result property="delFlag" column="del_flag" />
<result property="parentName" column="parent_name" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
</resultMap>
<sql id="selectDeptVo">
select d.dept_id,d.dept_code, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status, d.del_flag, d.create_by, d.create_time
from sys_dept d
</sql>
<select id="selectDeptList" parameterType="SysDept" resultMap="SysDeptResult">
<include refid="selectDeptVo"/>
where d.del_flag = '0'
<if test="deptId != null and deptId != 0">
AND dept_id = #{deptId}
</if>
<if test="parentId != null and parentId != 0">
AND parent_id = #{parentId}
</if>
<if test="deptName != null and deptName != ''">
AND dept_name like concat('%', #{deptName}, '%')
</if>
<if test="status != null and status != ''">
AND status = #{status}
</if>
<!-- 数据范围过滤 -->
${params.dataScope}
order by d.parent_id, d.order_num
</select>
<select id="selectDeptListByRoleId" resultType="Long">
select d.dept_id
from sys_dept d
left join sys_role_dept rd on d.dept_id = rd.dept_id
where rd.role_id = #{roleId}
<if test="deptCheckStrictly">
and d.dept_id not in (select d.parent_id from sys_dept d inner join sys_role_dept rd on d.dept_id = rd.dept_id and rd.role_id = #{roleId})
</if>
order by d.parent_id, d.order_num
</select>
<select id="selectDeptById" parameterType="Long" resultMap="SysDeptResult">
select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status,
(select dept_name from sys_dept where dept_id = d.parent_id) parent_name
from sys_dept d
where d.dept_id = #{deptId}
</select>
<select id="selectDeptByCode" parameterType="String" resultMap="SysDeptResult">
select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status,
(select dept_name from sys_dept where dept_id = d.parent_id) parent_name
from sys_dept d
where d.dept_code = #{deptCode}
</select>
<select id="checkDeptExistUser" parameterType="Long" resultType="int">
select count(1) from sys_user where dept_id = #{deptId} and del_flag = '0'
</select>
<select id="hasChildByDeptId" parameterType="Long" resultType="int">
select count(1) from sys_dept
where del_flag = '0' and parent_id = #{deptId} limit 1
</select>
<select id="selectChildrenDeptById" parameterType="Long" resultMap="SysDeptResult">
select * from sys_dept where find_in_set(#{deptId}, ancestors)
</select>
<select id="selectNormalChildrenDeptById" parameterType="Long" resultType="int">
select count(*) from sys_dept where status = 0 and del_flag = '0' and find_in_set(#{deptId}, ancestors)
</select>
<select id="checkDeptNameUnique" resultMap="SysDeptResult">
<include refid="selectDeptVo"/>
where dept_name=#{deptName} and parent_id = #{parentId} and del_flag = '0' limit 1
</select>
<insert id="insertDept" parameterType="SysDept">
insert into sys_dept(
<if test="deptId != null and deptId != 0">dept_id,</if>
<if test="deptCode != null and deptCode != ''">dept_code,</if>
<if test="parentId != null and parentId != 0">parent_id,</if>
<if test="deptName != null and deptName != ''">dept_name,</if>
<if test="ancestors != null and ancestors != ''">ancestors,</if>
<if test="orderNum != null">order_num,</if>
<if test="leader != null and leader != ''">leader,</if>
<if test="phone != null and phone != ''">phone,</if>
<if test="email != null and email != ''">email,</if>
<if test="status != null">status,</if>
<if test="createBy != null and createBy != ''">create_by,</if>
create_time
)values(
<if test="deptId != null and deptId != 0">#{deptId},</if>
<if test="deptCode != null and deptCode != ''">#{deptCode},</if>
<if test="parentId != null and parentId != 0">#{parentId},</if>
<if test="deptName != null and deptName != ''">#{deptName},</if>
<if test="ancestors != null and ancestors != ''">#{ancestors},</if>
<if test="orderNum != null">#{orderNum},</if>
<if test="leader != null and leader != ''">#{leader},</if>
<if test="phone != null and phone != ''">#{phone},</if>
<if test="email != null and email != ''">#{email},</if>
<if test="status != null">#{status},</if>
<if test="createBy != null and createBy != ''">#{createBy},</if>
sysdate()
)
</insert>
<update id="updateDept" parameterType="SysDept">
update sys_dept
<set>
<if test="parentId != null and parentId != 0">parent_id = #{parentId},</if>
<if test="deptCode != null and deptCode != ''">dept_code = #{deptCode},</if>
<if test="deptName != null and deptName != ''">dept_name = #{deptName},</if>
<if test="ancestors != null and ancestors != ''">ancestors = #{ancestors},</if>
<if test="orderNum != null">order_num = #{orderNum},</if>
<if test="leader != null">leader = #{leader},</if>
<if test="phone != null">phone = #{phone},</if>
<if test="email != null">email = #{email},</if>
<if test="status != null and status != ''">status = #{status},</if>
<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
update_time = sysdate()
</set>
where dept_id = #{deptId}
</update>
<update id="updateDeptChildren" parameterType="java.util.List">
update sys_dept set ancestors =
<foreach collection="depts" item="item" index="index"
separator=" " open="case dept_id" close="end">
when #{item.deptId} then #{item.ancestors}
</foreach>
where dept_id in
<foreach collection="depts" item="item" index="index"
separator="," open="(" close=")">
#{item.deptId}
</foreach>
</update>
<update id="updateDeptStatusNormal" parameterType="Long">
update sys_dept set status = '0' where dept_id in
<foreach collection="array" item="deptId" open="(" separator="," close=")">
#{deptId}
</foreach>
</update>
<delete id="deleteDeptById" parameterType="Long">
update sys_dept set del_flag = '2' where dept_id = #{deptId}
</delete>
</mapper>
\ No newline at end of file
......@@ -72,6 +72,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
left join sys_user u on u.user_id = ur.user_id
where u.user_id = #{userId}
</select>
<select id="selectRoleByKey" parameterType="string" resultMap="SysRoleResult">
<include refid="selectRoleVo"/>
where r.role_key = #{roleKey}
</select>
<select id="selectRoleIdsByKeys">
select r.role_id
from sys_role r
WHERE r.del_flag = '0'
and r.role_key in
<foreach collection="roleKeys" item="roleKey" open="(" close=")" separator=",">
#{roleKey}
</foreach>
</select>
<select id="selectRoleById" parameterType="Long" resultMap="SysRoleResult">
<include refid="selectRoleVo"/>
......
......@@ -142,7 +142,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
select user_id, email from sys_user where email = #{email} and del_flag = '0' limit 1
</select>
<select id="selectUsersByUserName" resultType="com.ruoyi.common.core.domain.entity.SysUser">
select user_id, email from sys_user where del_falg = '0'
and user_name
<foreach collection="userNames" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</select>
<insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
insert into sys_user(
<if test="userId != null and userId != 0">user_id,</if>
......
'use strict'
const path = require('path')
function resolve(dir) {
return path.join(__dirname, dir)
}
const CompressionPlugin = require('compression-webpack-plugin')
const name = process.env.VUE_APP_TITLE || '若依管理系统' // 网页标题
const baseUrl = 'http://localhost:8080' // 后端接口
const port = process.env.port || process.env.npm_config_port || 80 // 端口
// vue.config.js 配置说明
//官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions
// 这里只列一部分,具体配置参考文档
module.exports = {
// 部署生产环境和开发环境下的URL。
// 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上
// 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
publicPath: process.env.NODE_ENV === "production" ? "/" : "/",
// 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist)
outputDir: 'dist',
// 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)
assetsDir: 'static',
// 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
productionSourceMap: false,
transpileDependencies: ['quill'],
// webpack-dev-server 相关配置
devServer: {
host: '0.0.0.0',
port: port,
open: true,
proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
target: baseUrl,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''
}
},
// springdoc proxy
'^/v3/api-docs/(.*)': {
target: baseUrl,
changeOrigin: true
}
},
disableHostCheck: true
},
css: {
loaderOptions: {
sass: {
sassOptions: { outputStyle: "expanded" }
}
}
},
configureWebpack: {
name: name,
resolve: {
alias: {
'@': resolve('src')
}
},
plugins: [
// http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件
new CompressionPlugin({
cache: false, // 不启用文件缓存
test: /\.(js|css|html|jpe?g|png|gif|svg)?$/i, // 压缩文件格式
filename: '[path][base].gz[query]', // 压缩后的文件名
algorithm: 'gzip', // 使用gzip压缩
minRatio: 0.8, // 压缩比例,小于 80% 的文件不会被压缩
deleteOriginalAssets: false // 压缩后删除原文件
})
],
},
chainWebpack(config) {
config.plugins.delete('preload') // TODO: need test
config.plugins.delete('prefetch') // TODO: need test
// set svg-sprite-loader
config.module
.rule('svg')
.exclude.add(resolve('src/assets/icons'))
.end()
config.module
.rule('icons')
.test(/\.svg$/)
.include.add(resolve('src/assets/icons'))
.end()
.use('svg-sprite-loader')
.loader('svg-sprite-loader')
.options({
symbolId: 'icon-[name]'
})
.end()
config.when(process.env.NODE_ENV !== 'development', config => {
config
.plugin('ScriptExtHtmlWebpackPlugin')
.after('html')
.use('script-ext-html-webpack-plugin', [{
// `runtime` must same as runtimeChunk name. default is `runtime`
inline: /runtime\..*\.js$/
}])
.end()
config.optimization.splitChunks({
chunks: 'all',
cacheGroups: {
libs: {
name: 'chunk-libs',
test: /[\\/]node_modules[\\/]/,
priority: 10,
chunks: 'initial' // only package third parties that are initially dependent
},
elementUI: {
name: 'chunk-elementUI', // split elementUI into a single package
test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm
priority: 20 // the weight needs to be larger than libs and app or it will be packaged into libs or app
},
commons: {
name: 'chunk-commons',
test: resolve('src/components'), // can customize your rules
minChunks: 3, // minimum common number
priority: 5,
reuseExistingChunk: true
}
}
})
config.optimization.runtimeChunk('single')
})
}
}
'use strict'
const path = require('path')
function resolve(dir) {
return path.join(__dirname, dir)
}
const CompressionPlugin = require('compression-webpack-plugin')
const name = process.env.VUE_APP_TITLE || '若依管理系统' // 网页标题
const baseUrl = 'http://localhost:8100' // 后端接口
const port = process.env.port || process.env.npm_config_port || 80 // 端口
// vue.config.js 配置说明
//官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions
// 这里只列一部分,具体配置参考文档
module.exports = {
// 部署生产环境和开发环境下的URL。
// 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上
// 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
publicPath: process.env.NODE_ENV === "production" ? "/" : "/",
// 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist)
outputDir: 'dist',
// 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)
assetsDir: 'static',
// 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
productionSourceMap: false,
transpileDependencies: ['quill'],
// webpack-dev-server 相关配置
devServer: {
host: '0.0.0.0',
port: port,
open: true,
proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
target: baseUrl,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''
}
},
// springdoc proxy
'^/v3/api-docs/(.*)': {
target: baseUrl,
changeOrigin: true
}
},
disableHostCheck: true
},
css: {
loaderOptions: {
sass: {
sassOptions: { outputStyle: "expanded" }
}
}
},
configureWebpack: {
name: name,
resolve: {
alias: {
'@': resolve('src')
}
},
plugins: [
// http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件
new CompressionPlugin({
cache: false, // 不启用文件缓存
test: /\.(js|css|html|jpe?g|png|gif|svg)?$/i, // 压缩文件格式
filename: '[path][base].gz[query]', // 压缩后的文件名
algorithm: 'gzip', // 使用gzip压缩
minRatio: 0.8, // 压缩比例,小于 80% 的文件不会被压缩
deleteOriginalAssets: false // 压缩后删除原文件
})
],
},
chainWebpack(config) {
config.plugins.delete('preload') // TODO: need test
config.plugins.delete('prefetch') // TODO: need test
// set svg-sprite-loader
config.module
.rule('svg')
.exclude.add(resolve('src/assets/icons'))
.end()
config.module
.rule('icons')
.test(/\.svg$/)
.include.add(resolve('src/assets/icons'))
.end()
.use('svg-sprite-loader')
.loader('svg-sprite-loader')
.options({
symbolId: 'icon-[name]'
})
.end()
config.when(process.env.NODE_ENV !== 'development', config => {
config
.plugin('ScriptExtHtmlWebpackPlugin')
.after('html')
.use('script-ext-html-webpack-plugin', [{
// `runtime` must same as runtimeChunk name. default is `runtime`
inline: /runtime\..*\.js$/
}])
.end()
config.optimization.splitChunks({
chunks: 'all',
cacheGroups: {
libs: {
name: 'chunk-libs',
test: /[\\/]node_modules[\\/]/,
priority: 10,
chunks: 'initial' // only package third parties that are initially dependent
},
elementUI: {
name: 'chunk-elementUI', // split elementUI into a single package
test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm
priority: 20 // the weight needs to be larger than libs and app or it will be packaged into libs or app
},
commons: {
name: 'chunk-commons',
test: resolve('src/components'), // can customize your rules
minChunks: 3, // minimum common number
priority: 5,
reuseExistingChunk: true
}
}
})
config.optimization.runtimeChunk('single')
})
}
}
-- 菜单 SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('工位预约申请', '3', '1', 'approval', 'system/approval/index', 1, 0, 'C', '0', '0', 'system:approval:list', '#', 'admin', sysdate(), '', null, '工位预约申请菜单');
-- 按钮父菜单ID
SELECT @parentId := LAST_INSERT_ID();
-- 按钮 SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('工位预约申请查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', 'system:approval:query', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('工位预约申请新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', 'system:approval:add', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('工位预约申请修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', 'system:approval:edit', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('工位预约申请删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', 'system:approval:remove', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('工位预约申请导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', 'system:approval:export', '#', 'admin', sysdate(), '', null, '');
\ No newline at end of file
-- 菜单 SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('黑名单
', '3', '1', 'blacklist', 'system/blacklist/index', 1, 0, 'C', '0', '0', 'system:blacklist:list', '#', 'admin', sysdate(), '', null, '黑名单
菜单');
-- 按钮父菜单ID
SELECT @parentId := LAST_INSERT_ID();
-- 按钮 SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('黑名单
查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', 'system:blacklist:query', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('黑名单
新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', 'system:blacklist:add', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('黑名单
修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', 'system:blacklist:edit', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('黑名单
删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', 'system:blacklist:remove', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('黑名单
导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', 'system:blacklist:export', '#', 'admin', sysdate(), '', null, '');
\ No newline at end of file
-- 菜单 SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('楼宇', '3', '1', 'build', 'system/build/index', 1, 0, 'C', '0', '0', 'system:build:list', '#', 'admin', sysdate(), '', null, '楼宇菜单');
-- 按钮父菜单ID
SELECT @parentId := LAST_INSERT_ID();
-- 按钮 SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('楼宇查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', 'system:build:query', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('楼宇新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', 'system:build:add', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('楼宇修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', 'system:build:edit', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('楼宇删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', 'system:build:remove', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('楼宇导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', 'system:build:export', '#', 'admin', sysdate(), '', null, '');
\ No newline at end of file
-- 菜单 SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('校区', '3', '1', 'campus', 'system/campus/index', 1, 0, 'C', '0', '0', 'system:campus:list', '#', 'admin', sysdate(), '', null, '校区菜单');
-- 按钮父菜单ID
SELECT @parentId := LAST_INSERT_ID();
-- 按钮 SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('校区查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', 'system:campus:query', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('校区新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', 'system:campus:add', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('校区修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', 'system:campus:edit', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('校区删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', 'system:campus:remove', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('校区导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', 'system:campus:export', '#', 'admin', sysdate(), '', null, '');
\ No newline at end of file
-- 菜单 SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('楼层', '3', '1', 'floor', 'system/floor/index', 1, 0, 'C', '0', '0', 'system:floor:list', '#', 'admin', sysdate(), '', null, '楼层菜单');
-- 按钮父菜单ID
SELECT @parentId := LAST_INSERT_ID();
-- 按钮 SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('楼层查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', 'system:floor:query', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('楼层新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', 'system:floor:add', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('楼层修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', 'system:floor:edit', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('楼层删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', 'system:floor:remove', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('楼层导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', 'system:floor:export', '#', 'admin', sysdate(), '', null, '');
\ No newline at end of file
DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
DROP TABLE IF EXISTS QRTZ_LOCKS;
DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
DROP TABLE IF EXISTS QRTZ_CALENDARS;
-- ----------------------------
-- 1、存储每一个已配置的 jobDetail 的详细信息
-- ----------------------------
create table QRTZ_JOB_DETAILS (
sched_name varchar(120) not null comment '调度名称',
job_name varchar(200) not null comment '任务名称',
job_group varchar(200) not null comment '任务组名',
description varchar(250) null comment '相关介绍',
job_class_name varchar(250) not null comment '执行任务类名称',
is_durable varchar(1) not null comment '是否持久化',
is_nonconcurrent varchar(1) not null comment '是否并发',
is_update_data varchar(1) not null comment '是否更新数据',
requests_recovery varchar(1) not null comment '是否接受恢复执行',
job_data blob null comment '存放持久化job对象',
primary key (sched_name, job_name, job_group)
) engine=innodb comment = '任务详细信息表';
-- ----------------------------
-- 2、 存储已配置的 Trigger 的信息
-- ----------------------------
create table QRTZ_TRIGGERS (
sched_name varchar(120) not null comment '调度名称',
trigger_name varchar(200) not null comment '触发器的名字',
trigger_group varchar(200) not null comment '触发器所属组的名字',
job_name varchar(200) not null comment 'qrtz_job_details表job_name的外键',
job_group varchar(200) not null comment 'qrtz_job_details表job_group的外键',
description varchar(250) null comment '相关介绍',
next_fire_time bigint(13) null comment '上一次触发时间(毫秒)',
prev_fire_time bigint(13) null comment '下一次触发时间(默认为-1表示不触发)',
priority integer null comment '优先级',
trigger_state varchar(16) not null comment '触发器状态',
trigger_type varchar(8) not null comment '触发器的类型',
start_time bigint(13) not null comment '开始时间',
end_time bigint(13) null comment '结束时间',
calendar_name varchar(200) null comment '日程表名称',
misfire_instr smallint(2) null comment '补偿执行的策略',
job_data blob null comment '存放持久化job对象',
primary key (sched_name, trigger_name, trigger_group),
foreign key (sched_name, job_name, job_group) references QRTZ_JOB_DETAILS(sched_name, job_name, job_group)
) engine=innodb comment = '触发器详细信息表';
-- ----------------------------
-- 3、 存储简单的 Trigger,包括重复次数,间隔,以及已触发的次数
-- ----------------------------
create table QRTZ_SIMPLE_TRIGGERS (
sched_name varchar(120) not null comment '调度名称',
trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键',
trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键',
repeat_count bigint(7) not null comment '重复的次数统计',
repeat_interval bigint(12) not null comment '重复的间隔时间',
times_triggered bigint(10) not null comment '已经触发的次数',
primary key (sched_name, trigger_name, trigger_group),
foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group)
) engine=innodb comment = '简单触发器的信息表';
-- ----------------------------
-- 4、 存储 Cron Trigger,包括 Cron 表达式和时区信息
-- ----------------------------
create table QRTZ_CRON_TRIGGERS (
sched_name varchar(120) not null comment '调度名称',
trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键',
trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键',
cron_expression varchar(200) not null comment 'cron表达式',
time_zone_id varchar(80) comment '时区',
primary key (sched_name, trigger_name, trigger_group),
foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group)
) engine=innodb comment = 'Cron类型的触发器表';
-- ----------------------------
-- 5、 Trigger 作为 Blob 类型存储(用于 Quartz 用户用 JDBC 创建他们自己定制的 Trigger 类型,JobStore 并不知道如何存储实例的时候)
-- ----------------------------
create table QRTZ_BLOB_TRIGGERS (
sched_name varchar(120) not null comment '调度名称',
trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键',
trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键',
blob_data blob null comment '存放持久化Trigger对象',
primary key (sched_name, trigger_name, trigger_group),
foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group)
) engine=innodb comment = 'Blob类型的触发器表';
-- ----------------------------
-- 6、 以 Blob 类型存储存放日历信息, quartz可配置一个日历来指定一个时间范围
-- ----------------------------
create table QRTZ_CALENDARS (
sched_name varchar(120) not null comment '调度名称',
calendar_name varchar(200) not null comment '日历名称',
calendar blob not null comment '存放持久化calendar对象',
primary key (sched_name, calendar_name)
) engine=innodb comment = '日历信息表';
-- ----------------------------
-- 7、 存储已暂停的 Trigger 组的信息
-- ----------------------------
create table QRTZ_PAUSED_TRIGGER_GRPS (
sched_name varchar(120) not null comment '调度名称',
trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键',
primary key (sched_name, trigger_group)
) engine=innodb comment = '暂停的触发器表';
-- ----------------------------
-- 8、 存储与已触发的 Trigger 相关的状态信息,以及相联 Job 的执行信息
-- ----------------------------
create table QRTZ_FIRED_TRIGGERS (
sched_name varchar(120) not null comment '调度名称',
entry_id varchar(95) not null comment '调度器实例id',
trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键',
trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键',
instance_name varchar(200) not null comment '调度器实例名',
fired_time bigint(13) not null comment '触发的时间',
sched_time bigint(13) not null comment '定时器制定的时间',
priority integer not null comment '优先级',
state varchar(16) not null comment '状态',
job_name varchar(200) null comment '任务名称',
job_group varchar(200) null comment '任务组名',
is_nonconcurrent varchar(1) null comment '是否并发',
requests_recovery varchar(1) null comment '是否接受恢复执行',
primary key (sched_name, entry_id)
) engine=innodb comment = '已触发的触发器表';
-- ----------------------------
-- 9、 存储少量的有关 Scheduler 的状态信息,假如是用于集群中,可以看到其他的 Scheduler 实例
-- ----------------------------
create table QRTZ_SCHEDULER_STATE (
sched_name varchar(120) not null comment '调度名称',
instance_name varchar(200) not null comment '实例名称',
last_checkin_time bigint(13) not null comment '上次检查时间',
checkin_interval bigint(13) not null comment '检查间隔时间',
primary key (sched_name, instance_name)
) engine=innodb comment = '调度器状态表';
-- ----------------------------
-- 10、 存储程序的悲观锁的信息(假如使用了悲观锁)
-- ----------------------------
create table QRTZ_LOCKS (
sched_name varchar(120) not null comment '调度名称',
lock_name varchar(40) not null comment '悲观锁名称',
primary key (sched_name, lock_name)
) engine=innodb comment = '存储的悲观锁信息表';
-- ----------------------------
-- 11、 Quartz集群实现同步机制的行锁表
-- ----------------------------
create table QRTZ_SIMPROP_TRIGGERS (
sched_name varchar(120) not null comment '调度名称',
trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键',
trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键',
str_prop_1 varchar(512) null comment 'String类型的trigger的第一个参数',
str_prop_2 varchar(512) null comment 'String类型的trigger的第二个参数',
str_prop_3 varchar(512) null comment 'String类型的trigger的第三个参数',
int_prop_1 int null comment 'int类型的trigger的第一个参数',
int_prop_2 int null comment 'int类型的trigger的第二个参数',
long_prop_1 bigint null comment 'long类型的trigger的第一个参数',
long_prop_2 bigint null comment 'long类型的trigger的第二个参数',
dec_prop_1 numeric(13,4) null comment 'decimal类型的trigger的第一个参数',
dec_prop_2 numeric(13,4) null comment 'decimal类型的trigger的第二个参数',
bool_prop_1 varchar(1) null comment 'Boolean类型的trigger的第一个参数',
bool_prop_2 varchar(1) null comment 'Boolean类型的trigger的第二个参数',
primary key (sched_name, trigger_name, trigger_group),
foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group)
) engine=innodb comment = '同步机制的行锁表';
commit;
\ No newline at end of file
-- 菜单 SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('座位', '3', '1', 'seat', 'system/seat/index', 1, 0, 'C', '0', '0', 'system:seat:list', '#', 'admin', sysdate(), '', null, '座位菜单');
-- 按钮父菜单ID
SELECT @parentId := LAST_INSERT_ID();
-- 按钮 SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('座位查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', 'system:seat:query', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('座位新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', 'system:seat:add', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('座位修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', 'system:seat:edit', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('座位删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', 'system:seat:remove', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('座位导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', 'system:seat:export', '#', 'admin', sysdate(), '', null, '');
\ No newline at end of file
-- 菜单 SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('房间', '3', '1', 'space', 'system/space/index', 1, 0, 'C', '0', '0', 'system:space:list', '#', 'admin', sysdate(), '', null, '房间菜单');
-- 按钮父菜单ID
SELECT @parentId := LAST_INSERT_ID();
-- 按钮 SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('房间查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', 'system:space:query', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('房间新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', 'system:space:add', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('房间修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', 'system:space:edit', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('房间删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', 'system:space:remove', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('房间导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', 'system:space:export', '#', 'admin', sysdate(), '', null, '');
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment