diff --git a/doc/20251205.sql b/doc/20251205.sql new file mode 100644 index 00000000..a0ad48ef --- /dev/null +++ b/doc/20251205.sql @@ -0,0 +1,33 @@ +CREATE TABLE `cai_ip_record` +( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '子账户ID', + `ip_addr` varchar(100) NOT NULL COMMENT 'IP地址', + `path_addr` varchar(255) NULL COMMENT '请求地址', + `business_id` varchar(255) NULL, + `remark` varchar(255) NULL COMMENT '备注', + `number` bigint(20) default 0 not null COMMENT '手机号', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `ip_addr` (`ip_addr`) USING BTREE +) ENGINE = InnoDB + AUTO_INCREMENT = 1 + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_general_ci + ROW_FORMAT = DYNAMIC COMMENT ='ip访问记录'; + + +CREATE TABLE `cai_ip_black` +( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '子账户ID', + `ip_addr` varchar(100) NOT NULL COMMENT 'IP地址', + `enable_status` tinyint default 0 not NULL COMMENT '是否开启', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `ip_addr` (`ip_addr`) USING BTREE +) ENGINE = InnoDB + AUTO_INCREMENT = 1 + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_general_ci + ROW_FORMAT = DYNAMIC COMMENT ='ip黑名单'; + diff --git a/doc/ipBlackMenu.sql b/doc/ipBlackMenu.sql new file mode 100644 index 00000000..027c3d3e --- /dev/null +++ b/doc/ipBlackMenu.sql @@ -0,0 +1,19 @@ +-- 菜单 SQL +insert into sys_menu (menu_id, 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(1996853670150475777, 'ip黑名单', '1738084052270563330', '1', 'ipBlack', 'cai/ipBlack/index', 1, 0, 'C', '0', '0', 'cai:ipBlack:list', '#', 'admin', sysdate(), '', null, 'ip黑名单菜单'); + +-- 按钮 SQL +insert into sys_menu (menu_id, 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(1996853670150475778, 'ip黑名单查询', 1996853670150475777, '1', '#', '', 1, 0, 'F', '0', '0', 'cai:ipBlack:query', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_id, 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(1996853670150475779, 'ip黑名单新增', 1996853670150475777, '2', '#', '', 1, 0, 'F', '0', '0', 'cai:ipBlack:add', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_id, 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(1996853670150475780, 'ip黑名单修改', 1996853670150475777, '3', '#', '', 1, 0, 'F', '0', '0', 'cai:ipBlack:edit', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_id, 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(1996853670150475781, 'ip黑名单删除', 1996853670150475777, '4', '#', '', 1, 0, 'F', '0', '0', 'cai:ipBlack:remove', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_id, 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(1996853670150475782, 'ip黑名单导出', 1996853670150475777, '5', '#', '', 1, 0, 'F', '0', '0', 'cai:ipBlack:export', '#', 'admin', sysdate(), '', null, ''); diff --git a/doc/ipRecordMenu.sql b/doc/ipRecordMenu.sql new file mode 100644 index 00000000..4ac48857 --- /dev/null +++ b/doc/ipRecordMenu.sql @@ -0,0 +1,19 @@ +-- 菜单 SQL +insert into sys_menu (menu_id, 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(1996853672289570817, 'ip访问记录', '1738084052270563330', '1', 'ipRecord', 'cai/ipRecord/index', 1, 0, 'C', '0', '0', 'cai:ipRecord:list', '#', 'admin', sysdate(), '', null, 'ip访问记录菜单'); + +-- 按钮 SQL +insert into sys_menu (menu_id, 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(1996853672289570818, 'ip访问记录查询', 1996853672289570817, '1', '#', '', 1, 0, 'F', '0', '0', 'cai:ipRecord:query', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_id, 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(1996853672289570819, 'ip访问记录新增', 1996853672289570817, '2', '#', '', 1, 0, 'F', '0', '0', 'cai:ipRecord:add', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_id, 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(1996853672289570820, 'ip访问记录修改', 1996853672289570817, '3', '#', '', 1, 0, 'F', '0', '0', 'cai:ipRecord:edit', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_id, 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(1996853672289570821, 'ip访问记录删除', 1996853672289570817, '4', '#', '', 1, 0, 'F', '0', '0', 'cai:ipRecord:remove', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_id, 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(1996853672289570822, 'ip访问记录导出', 1996853672289570817, '5', '#', '', 1, 0, 'F', '0', '0', 'cai:ipRecord:export', '#', 'admin', sysdate(), '', null, ''); diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/auth/CaiLoginManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/auth/CaiLoginManager.java index a72399d5..7c5b8818 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/auth/CaiLoginManager.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/auth/CaiLoginManager.java @@ -97,6 +97,7 @@ public class CaiLoginManager { public String login(String username,String password){ User user = userService.getByUsername(username); if(user == null){ + throw new ServiceException("用户不存在或密码错误"); } String imei = ServletUtils.getImei(); diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/IpBlackController.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/IpBlackController.java new file mode 100644 index 00000000..156e3e48 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/IpBlackController.java @@ -0,0 +1,93 @@ +package com.ruoyi.cai.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.cai.domain.IpBlack; +import com.ruoyi.cai.service.IpBlackService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import com.ruoyi.common.enums.BusinessType; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotEmpty; +import java.util.Arrays; + +/** + * ip黑名单 + * + * @author ruoyi + * @date 2025-12-05 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/cai/ipBlack") +public class IpBlackController extends BaseController { + + private final IpBlackService ipBlackService; + + /** + * 查询ip黑名单列表 + */ + @SaCheckPermission("cai:ipBlack:list") + @GetMapping("/list") + public TableDataInfo list(IpBlack bo, PageQuery pageQuery) { + Page page = ipBlackService.page(pageQuery.build(), Wrappers.lambdaQuery(bo)); + return TableDataInfo.build(page); + } + + /** + * 导出ip黑名单列表 + */ + /* @SaCheckPermission("cai:ipBlack:export") + @Log(title = "ip黑名单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(IpBlackBo bo, HttpServletResponse response) { + List list = ipBlackService.queryList(bo); + ExcelUtil.exportExcel(list, "ip黑名单", IpBlackVo.class, response); + }*/ + + /** + * 新增ip黑名单 + */ + @SaCheckPermission("cai:ipBlack:add") + @Log(title = "ip黑名单", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody IpBlack bo) { + return toAjax(ipBlackService.save(bo)); + } + + /** + * 修改ip黑名单 + */ + @SaCheckPermission("cai:ipBlack:edit") + @Log(title = "ip黑名单", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody IpBlack bo) { + return toAjax(ipBlackService.updateById(bo)); + } + + /** + * 删除ip黑名单 + * + * @param ids 主键串 + */ + @SaCheckPermission("cai:ipBlack:remove") + @Log(title = "ip黑名单", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable String[] ids) { + return toAjax(ipBlackService.removeBatchByIds(Arrays.asList(ids), true)); + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/IpRecordController.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/IpRecordController.java new file mode 100644 index 00000000..122cd7bf --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/IpRecordController.java @@ -0,0 +1,106 @@ +package com.ruoyi.cai.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.cai.domain.IpRecord; +import com.ruoyi.cai.service.IpRecordService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import com.ruoyi.common.enums.BusinessType; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Arrays; + +/** + * ip访问记录 + * + * @author ruoyi + * @date 2025-12-05 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/cai/ipRecord") +public class IpRecordController extends BaseController { + + private final IpRecordService ipRecordService; + + /** + * 查询ip访问记录列表 + */ + @SaCheckPermission("cai:ipRecord:list") + @GetMapping("/list") + public TableDataInfo list(IpRecord bo, PageQuery pageQuery) { + Page page = ipRecordService.page(pageQuery.build(), Wrappers.lambdaQuery(bo)); + return TableDataInfo.build(page); + } + + /** + * 导出ip访问记录列表 + */ + /*@SaCheckPermission("cai:ipRecord:export") + @Log(title = "ip访问记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(IpRecordBo bo, HttpServletResponse response) { + List list = iIpRecordService.queryList(bo); + ExcelUtil.exportExcel(list, "ip访问记录", IpRecordVo.class, response); + }*/ + + /** + * 获取ip访问记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("cai:ipRecord:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable String id) { + return R.ok(ipRecordService.getById(id)); + } + + /** + * 新增ip访问记录 + */ + @SaCheckPermission("cai:ipRecord:add") + @Log(title = "ip访问记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody IpRecord bo) { + return toAjax(ipRecordService.save(bo)); + } + + /** + * 修改ip访问记录 + */ + @SaCheckPermission("cai:ipRecord:edit") + @Log(title = "ip访问记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody IpRecord bo) { + return toAjax(ipRecordService.updateById(bo)); + } + + /** + * 删除ip访问记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("cai:ipRecord:remove") + @Log(title = "ip访问记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable String[] ids) { + return toAjax(ipRecordService.removeBatchByIds(Arrays.asList(ids), true)); + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/IpBlack.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/IpBlack.java new file mode 100644 index 00000000..ef31fa4f --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/IpBlack.java @@ -0,0 +1,39 @@ +package com.ruoyi.cai.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * ip黑名单对象 cai_ip_black + * + * @author ruoyi + * @date 2025-12-05 + */ +@Data +@TableName("cai_ip_black") +public class IpBlack implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 子账户ID + */ + @TableId(value = "id", type = IdType.AUTO) + private String id; + /** + * IP地址 + */ + private String ipAddr; + /** + * 是否开启 + */ + private Long enableStatus; + + private LocalDateTime createTime; + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/IpRecord.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/IpRecord.java new file mode 100644 index 00000000..d0603272 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/IpRecord.java @@ -0,0 +1,52 @@ +package com.ruoyi.cai.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * ip访问记录对象 cai_ip_record + * + * @author ruoyi + * @date 2025-12-05 + */ +@Data +@TableName("cai_ip_record") +public class IpRecord implements Serializable{ + + private static final long serialVersionUID=1L; + + /** + * 子账户ID + */ + @TableId(value = "id",type = IdType.AUTO) + private String id; + /** + * IP地址 + */ + private String ipAddr; + /** + * 请求地址 + */ + private String pathAddr; + /** + * + */ + private String businessId; + /** + * 备注 + */ + private String remark; + /** + * 手机号 + */ + private Long number; + + private LocalDateTime createTime; + private LocalDateTime updateTime; + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/IpBlackMapper.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/IpBlackMapper.java new file mode 100644 index 00000000..c08a0178 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/IpBlackMapper.java @@ -0,0 +1,14 @@ +package com.ruoyi.cai.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.cai.domain.IpBlack; + +/** + * ip黑名单Mapper接口 + * + * @author ruoyi + * @date 2025-12-05 + */ +public interface IpBlackMapper extends BaseMapper { + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/IpRecordMapper.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/IpRecordMapper.java new file mode 100644 index 00000000..6c62e0d0 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/IpRecordMapper.java @@ -0,0 +1,14 @@ +package com.ruoyi.cai.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.cai.domain.IpRecord; + +/** + * ip访问记录Mapper接口 + * + * @author ruoyi + * @date 2025-12-05 + */ +public interface IpRecordMapper extends BaseMapper { + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/IpBlackService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/IpBlackService.java new file mode 100644 index 00000000..471bbdc8 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/IpBlackService.java @@ -0,0 +1,14 @@ +package com.ruoyi.cai.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.cai.domain.IpBlack; + +/** + * ip黑名单Service接口 + * + * @author ruoyi + * @date 2025-12-05 + */ +public interface IpBlackService extends IService { + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/IpRecordService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/IpRecordService.java new file mode 100644 index 00000000..90192cb9 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/IpRecordService.java @@ -0,0 +1,13 @@ +package com.ruoyi.cai.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.cai.domain.IpRecord; + +/** + * ip访问记录Service接口 + * + * @author ruoyi + * @date 2025-12-05 + */ +public interface IpRecordService extends IService { +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/IpBlackServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/IpBlackServiceImpl.java new file mode 100644 index 00000000..2f94df8b --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/IpBlackServiceImpl.java @@ -0,0 +1,20 @@ +package com.ruoyi.cai.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.cai.domain.IpBlack; +import com.ruoyi.cai.mapper.IpBlackMapper; +import com.ruoyi.cai.service.IpBlackService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + * ip黑名单Service业务层处理 + * + * @author ruoyi + * @date 2025-12-05 + */ +@RequiredArgsConstructor +@Service +public class IpBlackServiceImpl extends ServiceImpl implements IpBlackService { + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/IpRecordServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/IpRecordServiceImpl.java new file mode 100644 index 00000000..c9f2b580 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/IpRecordServiceImpl.java @@ -0,0 +1,20 @@ +package com.ruoyi.cai.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.cai.domain.IpRecord; +import com.ruoyi.cai.mapper.IpRecordMapper; +import com.ruoyi.cai.service.IpRecordService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + * ip访问记录Service业务层处理 + * + * @author ruoyi + * @date 2025-12-05 + */ +@RequiredArgsConstructor +@Service +public class IpRecordServiceImpl extends ServiceImpl implements IpRecordService { + +} diff --git a/ruoyi-cai/src/main/resources/mapper/cai/IpBlackMapper.xml b/ruoyi-cai/src/main/resources/mapper/cai/IpBlackMapper.xml new file mode 100644 index 00000000..462f4471 --- /dev/null +++ b/ruoyi-cai/src/main/resources/mapper/cai/IpBlackMapper.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/ruoyi-cai/src/main/resources/mapper/cai/IpRecordMapper.xml b/ruoyi-cai/src/main/resources/mapper/cai/IpRecordMapper.xml new file mode 100644 index 00000000..71e40d6d --- /dev/null +++ b/ruoyi-cai/src/main/resources/mapper/cai/IpRecordMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + +