一、关于后台管理系统产品
最近看了一下若依管理系统,说它是一套后台管理系统,其实并不是很准确。它应该是一个后台管理系统的基础架子,包括了后台管理系统必备的功能如菜单管理、用户管理、角色管理、字典管理、日志管理、系统监控等,可以免去很多后台管理系统的最初的基本功能开发工作。
若依从2018年3月发布第一个简单版本V1.0.0以来,一直持续维护至今天的V4.X,功能越来越多,越来越完善。说真的,我很佩服这种在工作之外还能自己写出一个完整产品,并且在完成之后还能持续地进行迭代、优化、维护。这定是一个了不起的人!
好几年前,也是因为考虑每次做后台都要重新搭建一次系统,我也同样使用Php 基于 ThinkPHP 写了一个CMS后台管理系统的基础架子,之后也放到了Github 上,看了一下放上去的日期是2020年9月,不过开发的时间应该远在这个日期之前。
GitHub - KermitCode/normal-cms-admin-background-site: 通用管理后台是一个管理后台的基础程序,包括管理员的登录;管理员的增加修改删除、权限分配、操作记录基础功能。包括后台功能菜单的新增修改编辑功能;包括后台配置项的动态增加修改删除;可对配置项进行文本、单选、多选设置等核心基础功能。用户可在此基础上进行后台其它业务开发。通用管理后台是一个管理后台的基础程序,包括管理员的登录;管理员的增加修改删除、权限分配、操作记录基础功能。包括后台功能菜单的新增修改编辑功能;包括后台配置项的动态增加修改删除;可对配置项进行文本、单选、多选设置等核心基础功能。用户可在此基础上进行后台其它业务开发。 - KermitCode/normal-cms-admin-background-sitehttps://github.com/KermitCode/normal-cms-admin-background-site 当时还费了些心思开发了后台配置项的动态增加修改删除,可以自定义增加配置项,并且配置项可以设置文本、radio单选、select下拉选、多选框等功能。满足APP开发时服务端可以自由增加各种配置给到前端。从Github上复制过来的图如下:
但我只是把这个自己成形的程序放到了网上,然后就没有下文。
- 一是我得承认自己编程能力还是不够,无法写出高层次的代码;
- 二是维护它真的是一个很艰难的事,因为程序版本在不断的升级,而自己的工作之后也与它再无关系。
- 三是没有继续完善它的动力,只是为了以后自己开发业务管理系统时复用。
所以在这里,我向所有在工作之余认真完成并持续维护一个产品的同行表示敬佩!
二、若依管理系统的搭建运行
先备注一下,本文不适合完全的新手来搭建运行,因为并没有极其详细每一步的截图和操作步骤,只适合有一定程序基础、CMS基础的朋友。
到若依后台管理系统的官网 https://www.ruoyi.vip/ 下载源码,我这里使用的是带有 thymeleaf 模板引擎的前后端在一起的版本。
代码下载下来解压后能看到其基础的程序目录,我这里使用的是IDEA2024,其中ruoyi-admin是其核心系统模块,包括所有业务程序中的控制器、视图、静态文件以及 mybatis部分程序类都在这里。
之后我们需要新建一个Mysql数据库,我这里使用的是Mysql8.0版本,导入下载包里的两个SQL文件,修改程序源码中的 druid.yaml 配置文件中的数据库名和密码为正确的数据。
若依后台管理系统的一些重要程序配置存储位置如我整理的下面这张表,当然不是很全面,比如mapper.xml类文件存储位置 classpath*:mapper/**/*Mapper.xml ,在所有模块中resources下mapper文件夹中的 *mapper.xml 都相关,只是用若依进行基础开发的话,知道这些MVC位置也基本就能够应付了。
序号 | 功能 | 程序位置 |
1 | 业务程序控制器包 | src/main/java/com/ruoyi/web/controller |
2 | 视图模板位置 | src/main/resources/templates |
3 | 主要Mybatis的mapper | src/main/resources/mapper/system |
4 | 主要Service接口和实现类包 | src/main/java/com/ruoyi/system/service |
5 | 主要Dao层基础类包 | src/main/java/com/ruoyi/system/domain |
6 | Configuration注入类包 | src/main/java/com/ruoyi/framework/config |
需要注意的一是若依管理后台是基于Java8的,本地需要有对应的JDK版本,IDEA2024有个比较好的功能就是可以在设置里直接下载集成各种JAVA版本,而不需要自己去独立下载安装然后进行关联。配置好之后运行 RuoYiApplication 项目启动文件,即可运行起若依管理后台。输入默认账号密码 admin/admin123 即可登录,后台系统中随便找了一个界面截图如下:
可以看到其后台功能分成了系统管理、系统监控、系统工具、实例演示4个功能大分类。
- 系统管理里面就是后台管理系统中的基本功能:用户、角色、权限、菜单、设置、公告、日志之类,外加扩展了一个企业中的部门和岗位管理。
- 系统监控中包括在线用户、定时任务、数据监控、服务监控以及缓存监控。这些也都是一些基本的监控管理功能。其中数据监控是 Druid 自带的监控界面,点击之后需要另外再输入账号密码:默认为 ruoyi 123456 登录后的界面如下:
- 系统工具中是为快速开发而设计的一些功能,包括表单构建,就类似于Bootstrap在线编辑一样,只是这里是完全适合于若依风格的表单。代码生成是为二次开发专门设计的,可以让用户不用编写代码快速实现一些功能扩展。系统接口则是一个swagger 接口文档。
- 最后的实例演示也是一个二次开发的辅助工具,可以看作是若依后台风格的所有元素包括表单、表格、弹框等的样式实例,以供开发中使用。
三、 Ruoyi若依管理系统业务程序生成式开发
其实早在很多年前我就接触并使用过程序代码自动生成的框架,那是好多年前PHP时代,YII框架很流行,说真话,YII框架带的 GII 脚手架代码生成功能真的比现在的若依功能还要强大,YII框架将数据库导入后,自动生成一个后台管理系统,里面包括了各个表的CURD、查询搜索等等功能。我已很多年没有再接触过YII,不知道现在演进得怎么样。
回到Ruoyi若依管理系统业务程序生成式开发,自己写模块开发当然不是问题,但既然使用了 若依后台管理系统,建议后续的开发也遵循它一样的规范风格,这样比较好看和整体。所以在进行二次开发前最后使用代码生成一个模块看看增加的功能代码。Ruoyi的代码生成使用步骤如下:
1. 先创建对应的菜单
如果新加入的数据表业务不需要独立表单,这步也可以省略。我这里以文章管理为例。
创建“文章管理”目录,它是一个和系统管理并行的一个目录菜单功能。可以选择图标样式和排序值,排序值越小越靠前。
2. 代码生成-导入表结构
在代码生成中点击上面的“导入”按钮,其会将数据库表展示出来,这里你需要提前将数据表复制到数据库中,建议和若依的数据库表保持一样的风格,即数据库表字段中增加 com/ruoyi/common/core/domain/BaseEntity.java 基础实例中的一些常用字段如发布时间、发布人、修改时间、修改人等。导入成功之后会在代码生成界面展示导入的表列表,点击右侧的编辑来编辑表相关的信息如下:
包括基本信息、字段信息、生成信息。生成信息中需要关注的是生成包路径、生成业务名,其它主要就是字段信息栏目。
3. 代码生成字段信息设置。
代码生成主要就是字段信息修改,根据数据库字段的设计意义来选择物理类型,若依默认很多都是字符串,包括数据库中设计的数值字段,因此需要自己进行修改。另外就是查询列钩选哪些列是需要呈现在查询中做搜索条件的,还有查询方式。
字段信息中还有一个注意项就是最后一列字典类型,这里需要关联“系统设置”中的字典管理,就是我们平常总会用到一些男女、开启关闭、是否之类的字典,如果数据库中有一些类似1/0开关的字段可以选择,如果字典管理中没有就自己在字典管理中添加之后刷新再来这里进行筛选。如下图为我增加的一个字典功能。
各项设置好了之后,进入到代码生成页面,点击对应表最后面的下载按钮下载源码,下载下来的压缩包中一般包括 main 文件夹和 sql文件,sql文件好像没有什么用,主要就是把main中的文件夹复制到对应设置的生成包路径中去。
4. 增加菜单项
上面的程序复制粘贴完成之后,进入菜单 管理,我们在刚才新建的“文章管理”目录下方建立一个子菜单,请求地址设置为生成的控制器中 RequesetMapping中的地址即要,权限标识按需进行配置。不配置则整个后台都能查看,配置了就需要开通权限。其字符串也能在控制器中找到。
完成这一步后,整个业务程序代码生成的步骤即大功告成。如我这里的测试的页面界面截图如下:
四、若依后台系统的程序代码梳理
第三步若依生成的程序代码文件总共就下面这么几个,列个表方便我们查看分析。如下:
序号 | 功能模块 | 功能分类 | 文件路径 |
1 | 程序代码 | 控制器 | com/ruoyi/system/controller/ArtClassController.java |
2 | Dao实体类 | com/ruoyi/system/domain/ArtClass.java | |
3 | Mapper接口 | com/ruoyi/system/mapper/ArtClassMapper.java | |
4 | Service接口 | com/ruoyi/system/service/IArtClassService.java | |
5 | Service实现类 | com/ruoyi/system/service/impl/ArtClassServiceImpl.java | |
6 | 模板资源 | 增加模板 | src/main/resources/templates/system/artclass/add.html |
7 | 列表模板 | src/main/resources/templates/system/artclass/artclass.html | |
8 | 编辑模板 | src/main/resources/templates/system/artclass/edit.html | |
9 | SQL代码 | Mybatis的Sql | src/main/resources/mapper/system/ArtClassMapper.xml |
即添加一些简单的业务模板的话,在添加数据库表之后,只需要添加上面这些程序代码和资源文件(再在菜单中体现链接),即可实现业务功能。
上面的这些文件中,比如列表请求进来后,由控制器类-》Service实现类-》Mapper读取数据库数据然后返回数据给列表模板即实现,其中的链条请求我们看一下其代码执行。
1. 控制器ArtClassController说明
@Controller
@RequestMapping("/system/artclass")
public class ArtClassController extends BaseController
{
private String prefix = "system/artclass";
@Autowired
private IArtClassService artClassService;
/**
* 查询文章分类列表
*/
@RequiresPermissions("system:artclass:list")
@PostMapping("/list")
@ResponseBody
public TableDataInfo list(ArtClass artClass)
{
// 启用分页插件
startPage();
//调用 Service 执行查询
List<ArtClass> list = artClassService.selectArtClassList(artClass);
return getDataTable(list);
}
...
2. Service类中方法说明
@Service
public class ArtClassServiceImpl implements IArtClassService
{
@Autowired
private ArtClassMapper artClassMapper;
/**
* 查询文章分类列表
*
* @param artClass 文章分类
* @return 文章分类
*/
@Override
public List<ArtClass> selectArtClassList(ArtClass artClass)
{
return artClassMapper.selectArtClassList(artClass);
}
...
3. Mapper中对应的SQL代码
<?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.ArtClassMapper">
<sql id="selectArtClassVo">
select id, class_name, class_fname, class_sort from art_class
</sql>
...
4. 静态资源文件代码
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
<th:block th:include="include :: header('文章分类列表')" />
</head>
<body class="gray-bg">
<div class="container-div">
<div class="row">
<div class="col-sm-12 search-collapse">
<form id="formId">
<div class="select-list">
<ul>
<li>
<label>分类名称:</label>
<input type="text" name="className"/>
</li>
<li>
<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i> 搜索</a>
<a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i> 重置</a>
</li>
</ul>
</div>
</form>
</div>
<div class="btn-group-sm" id="toolbar" role="group">
<a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="system:artclass:add">
<i class="fa fa-plus"></i> 添加
</a>
<a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="system:artclass:edit">
<i class="fa fa-edit"></i> 修改
</a>
<a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="system:artclass:remove">
<i class="fa fa-remove"></i> 删除
</a>
<a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="system:artclass:export">
<i class="fa fa-download"></i> 导出
</a>
</div>
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-table"></table>
</div>
</div>
</div>
<th:block th:include="include :: footer" />
<script th:inline="javascript">
var editFlag = [[${@permission.hasPermi('system:artclass:edit')}]];
var removeFlag = [[${@permission.hasPermi('system:artclass:remove')}]];
var prefix = ctx + "system/artclass";
$(function() {
var options = {
url: prefix + "/list",
createUrl: prefix + "/add",
updateUrl: prefix + "/edit/{id}",
removeUrl: prefix + "/remove",
exportUrl: prefix + "/export",
modalName: "文章分类",
columns: [{
checkbox: true
},
{
field: 'id',
title: '自增ID',
visible: false
},
{
field: 'className',
title: '分类名称'
},
{
field: 'classFname',
title: '分类扩展名称'
},
{
field: 'classSort',
title: '排序值'
},
{
title: '操作',
align: 'center',
formatter: function(value, row, index) {
var actions = [];
actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.id + '\')"><i class="fa fa-edit"></i>编辑</a> ');
actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i>删除</a>');
return actions.join('');
}
}]
};
$.table.init(options);
});
</script>
</body>
</html>
其它还有一些实体基础类、Dao层的Mapper接口类我就不在这里呈现了。
五、总结
通过此篇文章的整理,可以对若依后台管理系统有个基本了解,包括产品定位、其部署运行、代码生成的操作过程以及程序代码的梳理,能为第一次接触若依系统的开发者进行二次开发提供一个简单的引导。希望对你有所帮助,最后写文不易,看到这里,如果本文对你能起到一点点帮助的话,希望能给文章点个赞哈。谢谢。
标签:代码生成,SpringBoot,管理系统,生成式,system,Ruoyi,后台,ruoyi,main From: https://blog.csdn.net/weixin_47792780/article/details/143113225