diff --git a/README.md b/README.md index 3a7f0e7..e69de29 100644 --- a/README.md +++ b/README.md @@ -1,126 +0,0 @@ -### 项目说明 -- renren-security是一个轻量级的,前后端分离的Java快速开发平台,能快速开发项目并交付【接私活利器】 -- 采用SpringBoot3.x、Shiro、MyBatis-Plus、Vue3、TypeScript、Element Plus、Vue Router、Pinia、Axios、Vite框架,开发的一套权限系统,极低门槛,拿来即用。设计之初,就非常注重安全性,为企业系统保驾护航,让一切都变得如此简单。 -- 提供了代码生成器,只需编写30%左右代码,其余的代码交给系统自动生成,可快速完成开发任务 -- 支持MySQL、达梦、Oracle、SQL Server、PostgreSQL等主流数据库 -- 演示地址:http://demo.open.renren.io/renren-security (账号密码:admin/admin) - -
- -### 微信交流群 -我们提供了微信交流群,扫码下面的二维码,关注【系统】公众号,回复【加群】,即可根据提示加入微信群! -

-![输入图片说明](renren-admin/src/main/resources/public/wechat.jpg) - -
- -### 具有如下特点 -- 友好的代码结构及注释,便于阅读及二次开发 -- 实现前后端分离,通过token进行数据交互,前端再也不用关注后端技术 -- 灵活的权限控制,可控制到页面或按钮,满足绝大部分的权限需求 -- 提供CrudService接口,对增删改查进行封装,代码更简洁 -- 页面交互使用Vue3.x,极大的提高了开发效率 -- 完善的部门管理及数据权限,通过注解实现数据权限的控制 -- 完善的XSS防范及脚本过滤,彻底杜绝XSS攻击 -- 完善的代码生成机制,可在线生成entity、xml、dao、service、vue、sql代码,减少70%以上的开发任务 -- 引入quartz定时任务,可动态完成任务的添加、修改、删除、暂停、恢复及日志查看等功能 -- 引入Hibernate Validator校验框架,轻松实现后端校验 -- 引入云存储服务,已支持:七牛云、阿里云、腾讯云等 -- 引入swagger文档支持,方便编写API接口文档 - -
- -### 数据权限设计思想 -- 用户管理、角色管理、部门管理,可操作本部门及子部门数据 -- 菜单管理、定时任务、参数管理、字典管理、系统日志,没有数据权限 -- 业务功能,按照用户数据权限,查询、操作数据【没有本部门数据权限,也能查询本人数据】 - -
- - -**项目结构** -``` -renren-security -├─renren-common 公共模块 -│ -├─renren-admin 管理后台 -│ ├─db 数据库SQL脚本 -│ │ -│ ├─modules 模块 -│ │ ├─job 定时任务 -│ │ ├─log 日志管理 -│ │ ├─oss 文件存储 -│ │ ├─security 安全模块 -│ │ └─sys 系统管理(核心) -│ │ -│ └─resources -│ ├─mapper MyBatis文件 -│ ├─public 静态资源 -│ └─application.yml 全局配置文件 -│ -│ -├─renren-api API服务 -│ -├─renren-generator 代码生成器 -│ └─resources -│ ├─mapper MyBatis文件 -│ ├─template 代码生成器模板(可增加或修改相应模板) -│ ├─application.yml 全局配置文件 -│ └─generator.properties 代码生成器,配置文件 -│ -├─renren-ui Vue3前端工程 -``` - -
- -**技术选型:** -- 核心框架:Spring Boot 3.x -- 安全框架:Apache Shiro 1.12 -- 持久层框架:MyBatis 3.5 -- 定时器:Quartz 2.3 -- 数据库连接池:Druid 1.2 -- 日志管理:Logback -- 页面交互:Vue3.x - -
- -**软件需求** -- JDK17+ -- Maven3.6+ -- MySQL8.0+ -- Oracle 11g+ -- SQLServer 2012+ -- PostgreSQL 9.4+ -- 达梦8 -
- - -**本地部署** -- 通过git下载源码 -- idea、eclipse需安装lombok插件,不然会提示找不到entity的get set方法 -- 创建数据库renren_security,数据库编码为UTF-8 -- 执行db/mysql.sql文件,初始化数据 -- 修改application-dev.yml文件,更新MySQL账号和密码 -- 在renren-security目录下,执行mvn clean install -- Eclipse、IDEA运行AdminApplication.java,则可启动项目【renren-admin】 -- renren-admin访问路径:http://localhost:8080/renren-admin -- swagger文档路径:http://localhost:8080/renren-admin/doc.html -- 再启动前端项目,前端地址:https://gitee.com/renrenio/renren-ui -- 账号密码:admin/admin -
- -![输入图片说明](renren-admin/src/main/resources/public/1.png) - -
- -![输入图片说明](renren-admin/src/main/resources/public/2.png) - -
- -### 如何交流、反馈、参与贡献? -- 开发文档:https://www.renren.io/guide/security -- Gitee仓库:https://gitee.com/renrenio/renren-security -- [系统](https://www.renren.io):https://www.renren.io -- 如需关注项目最新动态,请Watch、Star项目,同时也是对项目最好的支持 -
- diff --git a/admin/src/main/java/io/modules/sys/controller/SysMenuController.java b/admin/src/main/java/io/modules/sys/controller/SysMenuController.java index 0c542bb..9717bb8 100644 --- a/admin/src/main/java/io/modules/sys/controller/SysMenuController.java +++ b/admin/src/main/java/io/modules/sys/controller/SysMenuController.java @@ -114,7 +114,6 @@ public class SysMenuController { if (list.size() > 0) { return new Result().error("先删除子菜单或按钮!"); } - sysMenuService.delete(id); return new Result(); @@ -126,7 +125,6 @@ public class SysMenuController { public Result> select() { UserDetail user = SecurityUser.getUser(); List list = sysMenuService.getUserMenuList(user, null); - return new Result>().ok(list); } } diff --git a/admin/src/main/java/io/modules/sys/controller/SysUserController.java b/admin/src/main/java/io/modules/sys/controller/SysUserController.java index 31cd02a..bd1fe86 100644 --- a/admin/src/main/java/io/modules/sys/controller/SysUserController.java +++ b/admin/src/main/java/io/modules/sys/controller/SysUserController.java @@ -63,7 +63,6 @@ public class SysUserController { @RequiresPermissions("sys:user:page") public Result> page(@Parameter(hidden = true) @RequestParam Map params) { PageData page = sysUserService.page(params); - return new Result>().ok(page); } diff --git a/admin/src/main/java/io/modules/sys/controller/UserController.java b/admin/src/main/java/io/modules/sys/controller/UserController.java new file mode 100644 index 0000000..e84b737 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/UserController.java @@ -0,0 +1,101 @@ +package io.modules.sys.controller; + + +import io.common.annotation.LogOperation; +import io.common.constant.Constant; +import io.common.page.PageData; +import io.common.utils.ExcelUtils; +import io.common.utils.Result; +import io.common.validator.AssertUtils; +import io.common.validator.ValidatorUtils; +import io.common.validator.group.AddGroup; +import io.common.validator.group.DefaultGroup; +import io.common.validator.group.UpdateGroup; +import io.modules.item.dto.UserDTO; +import io.modules.item.service.UserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import jakarta.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + + +/** + * 用户 + */ +@RestController +@RequestMapping("/sys/user-front") +@Tag(name="用户") +public class UserController { + @Autowired + private UserService userService; + + @GetMapping("page") + @Operation(summary = "分页") + @Parameters({ + @Parameter(name = Constant.PAGE, description = "当前页码,从1开始", in = ParameterIn.QUERY, required = true, ref="int") , + @Parameter(name = Constant.LIMIT, description = "每页显示记录数", in = ParameterIn.QUERY,required = true, ref="int") , + @Parameter(name = Constant.ORDER_FIELD, description = "排序字段", in = ParameterIn.QUERY, ref="String") , + @Parameter(name = Constant.ORDER, description = "排序方式,可选值(asc、desc)", in = ParameterIn.QUERY, ref="String") + }) + @RequiresPermissions("item:user:page") + public Result> page(@Parameter(hidden = true) @RequestParam Map params){ + PageData page = userService.page(params); + + return new Result>().ok(page); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + @RequiresPermissions("item:user:info") + public Result get(@PathVariable("id") Long id){ + UserDTO data = userService.get(id); + + return new Result().ok(data); + } + + @PostMapping + @Operation(summary = "保存") + @LogOperation("保存") + @RequiresPermissions("item:user:save") + public Result save(@RequestBody UserDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + + userService.save(dto); + + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + @LogOperation("修改") + @RequiresPermissions("item:user:update") + public Result update(@RequestBody UserDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + + userService.update(dto); + + return new Result(); + } + + @DeleteMapping + @Operation(summary = "删除") + @LogOperation("删除") + @RequiresPermissions("item:user:delete") + public Result delete(@RequestBody Long[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + userService.delete(ids); + return new Result(); + } + + +} diff --git a/admin/src/main/resources/application-dev.yml b/admin/src/main/resources/application-dev.yml index b4f3af9..3b18e70 100644 --- a/admin/src/main/resources/application-dev.yml +++ b/admin/src/main/resources/application-dev.yml @@ -3,7 +3,7 @@ spring: druid: #MySQL driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/admin-template?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true + url: jdbc:mysql://localhost:3306/movies?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true username: root password: 123456 initial-size: 10 @@ -20,18 +20,18 @@ spring: stat-view-servlet: enabled: true url-pattern: /druid/* -#mybatis + mybatis-plus: mapper-locations: classpath*:/mapper/**/*.xml - #实体扫描,多个package用逗号或者分号分隔 + typeAliasesPackage: io.modules.*.entity,io.modules.*.entity global-config: - #数据库相关配置 + db-config: - #主键类型 + id-type: AUTO banner: false - #原生配置 + configuration: map-underscore-to-camel-case: true cache-enabled: false diff --git a/admin/src/main/resources/application.yml b/admin/src/main/resources/application.yml index 6ab298b..d8e5d87 100644 --- a/admin/src/main/resources/application.yml +++ b/admin/src/main/resources/application.yml @@ -20,7 +20,7 @@ knife4j: setting: enableFooter: false spring: - # 环境 dev|test|prod + profiles: active: dev messages: @@ -37,15 +37,15 @@ spring: #mybatis mybatis-plus: mapper-locations: classpath*:/mapper/**/*.xml - #实体扫描,多个package用逗号或者分号分隔 + typeAliasesPackage: io.modules.*.entity global-config: - #数据库相关配置 + db-config: - #主键类型 + id-type: AUTO banner: false - #原生配置 + configuration: map-underscore-to-camel-case: true cache-enabled: false diff --git a/admin/src/main/resources/mapper/oss/SysOssDao.xml b/admin/src/main/resources/mapper/oss/SysOssDao.xml deleted file mode 100644 index e0dd770..0000000 --- a/admin/src/main/resources/mapper/oss/SysOssDao.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/common/src/main/java/io/modules/item/dao/UserDao.java b/common/src/main/java/io/modules/item/dao/UserDao.java new file mode 100644 index 0000000..f55bedc --- /dev/null +++ b/common/src/main/java/io/modules/item/dao/UserDao.java @@ -0,0 +1,16 @@ +package io.modules.item.dao; + +import io.common.dao.BaseDao; +import io.modules.item.entity.UserEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 用户 + * + * @author Mark # + * @since 1.0.0 2025-01-14 + */ +@Mapper +public interface UserDao extends BaseDao { + +} diff --git a/common/src/main/java/io/modules/item/dto/UserDTO.java b/common/src/main/java/io/modules/item/dto/UserDTO.java new file mode 100644 index 0000000..fa8c701 --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/UserDTO.java @@ -0,0 +1,40 @@ +package io.modules.item.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.SchemaProperty; +import lombok.Data; +import java.io.Serializable; +import java.util.Date; + + +/** + * 用户 + * + * @author Mark # + * @since 1.0.0 2025-01-14 + */ +@Data +@Schema(name = "用户") +public class UserDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @SchemaProperty(name = "id") + private Long id; + + @SchemaProperty(name = "手机号") + private String username; + + @SchemaProperty(name = "密码") + private String password; + + @SchemaProperty(name = "创建时间") + private Date createDate; + + @SchemaProperty(name = "昵称") + private String nickName; + + @SchemaProperty(name = "介绍") + private String introduce; + + +} diff --git a/common/src/main/java/io/modules/item/entity/UserEntity.java b/common/src/main/java/io/modules/item/entity/UserEntity.java new file mode 100644 index 0000000..f9ec6de --- /dev/null +++ b/common/src/main/java/io/modules/item/entity/UserEntity.java @@ -0,0 +1,37 @@ +package io.modules.item.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import java.util.Date; + +/** + * 用户 + */ +@Data +@TableName("tb_user") +public class UserEntity { + /** + * id + */ + private Long id; + /** + * 手机号 + */ + private String username; + /** + * 密码 + */ + private String password; + /** + * 创建时间 + */ + private Date createDate; + /** + * 昵称 + */ + private String nickName; + /** + * 介绍 + */ + private String introduce; +} diff --git a/common/src/main/java/io/modules/item/entity/WallEntity.java b/common/src/main/java/io/modules/item/entity/WallEntity.java index 77ced09..10e0df4 100644 --- a/common/src/main/java/io/modules/item/entity/WallEntity.java +++ b/common/src/main/java/io/modules/item/entity/WallEntity.java @@ -2,14 +2,11 @@ package io.modules.item.entity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; - import java.util.Date; /** * 吐槽墙 - * - * @author Mark # - * @since 1.0.0 2024-12-12 + */ @Data @TableName("tb_wall") diff --git a/common/src/main/java/io/modules/item/service/UserService.java b/common/src/main/java/io/modules/item/service/UserService.java new file mode 100644 index 0000000..4676b91 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/UserService.java @@ -0,0 +1,16 @@ +package io.modules.item.service; + + +import io.common.service.CrudService; +import io.modules.item.dto.UserDTO; +import io.modules.item.entity.UserEntity; + +/** + * 用户 + * + * @author Mark # + * @since 1.0.0 2025-01-14 + */ +public interface UserService extends CrudService { + +} diff --git a/common/src/main/java/io/modules/item/service/impl/UserServiceImpl.java b/common/src/main/java/io/modules/item/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..acc55b4 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/impl/UserServiceImpl.java @@ -0,0 +1,34 @@ +package io.modules.item.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import cn.hutool.core.util.StrUtil; +import io.common.service.impl.CrudServiceImpl; +import io.modules.item.dao.UserDao; +import io.modules.item.dto.UserDTO; +import io.modules.item.entity.UserEntity; +import io.modules.item.service.UserService; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * 用户 + * + * @author Mark # + * @since 1.0.0 2025-01-14 + */ +@Service +public class UserServiceImpl extends CrudServiceImpl implements UserService { + + @Override + public QueryWrapper getWrapper(Map params){ + String id = (String)params.get("id"); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StrUtil.isNotBlank(id), "id", id); + + return wrapper; + } + + +} diff --git a/front/src/main/resources/application-dev.yml b/front/src/main/resources/application-dev.yml index 01d599a..bee6d91 100644 --- a/front/src/main/resources/application-dev.yml +++ b/front/src/main/resources/application-dev.yml @@ -6,7 +6,7 @@ spring: datasource: druid: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/admin-template?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true + url: jdbc:mysql://localhost:3306/movies?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true username: root password: 123456 initial-size: 10 diff --git a/generator/src/main/resources/application.yml b/generator/src/main/resources/application.yml index fce3fdc..f48c782 100644 --- a/generator/src/main/resources/application.yml +++ b/generator/src/main/resources/application.yml @@ -9,7 +9,7 @@ spring: type: com.alibaba.druid.pool.DruidDataSource #MySQL配置 driverClassName: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/wenhua?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true + url: jdbc:mysql://localhost:3306/movies?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true username: root password: 123456 #达梦8