TIMO介绍
序言
TIMO后台管理系统,基于SpringBoot2.0 + Spring Data Jpa + Thymeleaf + Shiro 开发的后台管理系统,采用分模块的方式便于开发和维护,支持前后台模块分别部署,目前支持的功能有:权限管理、部门管理、字典管理、日志记录、文件上传、代码生成等,为快速开发后台系统而生的脚手架
克隆代码配置环境并启动
克隆下来代码
https://gitee.com/aun/Timo?_from=gitee_searchidea导入
设置maven和lombok插件
导入sql 用的是mysql
更改admin下的application.yml
启动 默认:localhost:8080 账号admin 密码123456
代码生成
点击代码生成模块,路径什么的 如果不需要就最不要动
黑色标注部分添加字段,把对应的数据库录入进去。蓝色部分是生成的前端如果需要字段验证可以添加上,会自己生成到后端的pojo实体注解的验证。重点红色部分有坑!!!
可以把这些字段进行保留系统自带的。如果不保留后期crud会有可能报错。在去实体里面进行添加对应报错的字段。id最好是long类型的因为jpa中的方法id是long。没有用没jpa的最好先去看看在使用。后续还有一些jpa的坑。添加完字段以后点击生成会出现生成出来的路径。
点击保存会出现一下路径
如果没天上刚刚说道的自带的字段启动会报错!去对应生成的pjo中添加上注解
CRUD
//@Data 可以少些get、set、toString、equals、hashcode
//需要在pom里添加
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
启动项目 登录 查询成功
如果在生成写字段的时候没有用驼峰命名的话只需要更改pojo的’_'和前端的字段即可!一般情况下查询详情和状态都是可以使用的只要生成的时候整好就行!因为一开始生成有问题来回整了好几遍
分页和模糊查询是可以使用的
如果 查询不出来数据有可能是没有status字段添加上去
1代表启用、2代表冻结、3代表删除。这里面是进行逻辑删除的
如果后续在有字段报错或者类型报错说明有可能是 作者推荐预留的字段。在pojo里添加即可
这里的修改和添加是一个页面
添加需要在进行赋值不然对象属性为null,坑!Debug亲测
添加一样有坑需要添加上new 不然会报错 。当天测试可以第二天修改可以添加报错还以为是页面问题动的哪里了。找了半天原来是对象里有值。添加不能有值,估计是因为添加修改写在一起了。对象里的值没有清空
添加页面
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
<style>
.exp{display:none}
</style>
</head>
<body>
<div class="layui-form timo-compile">
<form th:action="@{/order/crawlExMetalPice/save}">
<input type="hidden" name="id" th:if="${crawlExMetalPice}" th:value="${crawlExMetalPice.id}">
<div th:class="exp" class="layui-form-item">
<label class="layui-form-label">主键ID</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="id" placeholder="请输入主键ID" th:value="${crawlExMetalPice?.id}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">网站首页url</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="websiteHomepageUrl" placeholder="请输入网站首页url" th:value="${crawlExMetalPice?.websiteHomepageUrl}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">目标页url</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="targetWebpageUrl" placeholder="请输入目标页url" th:value="${crawlExMetalPice?.targetWebpageUrl}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">数据标签</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="dataLabel" placeholder="请输入数据标签" th:value="${crawlExMetalPice?.dataLabel}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">用户名</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="userName" placeholder="请输入用户名" th:value="${crawlExMetalPice?.userName}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">密码</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="password" placeholder="请输入密码" th:value="${crawlExMetalPice?.password}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">频率</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="frequency" placefrequencyholder="请输入频率" th:value="${crawlExMetalPice?.frequency}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">网站名称</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="websiteName" placeholder="请输入网站名称" th:value="${crawlExMetalPice?.websiteName}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">爬取次数</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="sucessCounts" placeholder="请输入爬取次数" th:value="${crawlExMetalPice?.sucessCounts}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">标识</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="targetToken" placeholder="请输入标识" th:value="${crawlExMetalPice?.targetToken}">
</div>
</div>
<div th:class="exp" class="layui-form-item">
<label class="layui-form-label">创建时间</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="modifyTime" placeholder="请输入创建时间" th:value="${#dates.format(crawlExMetalPice?.creatTime, 'yyyy-MM-dd HH:mm:ss')}">
</div>
</div>
<div th:class="exp" class="layui-form-item">
<label class="layui-form-label">结束时间</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="modifyTime" placeholder="请输入结束时间" th:value="${#dates.format(crawlExMetalPice?.endTime, 'yyyy-MM-dd HH:mm:ss')}">
</div>
</div>
<div th:class="exp" class="layui-form-item">
<label class="layui-form-label">修改时间</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="modifyTime" placeholder="请输入修改时间" th:value="${#dates.format(crawlExMetalPice?.modifyTime, 'yyyy-MM-dd HH:mm:ss')}">
</div>
</div>
<div th:class="exp" class="layui-form-item">
<label class="layui-form-label">触发时间</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="modifyTime" placeholder="请输入触发时间" th:value="${#dates.format(crawlExMetalPice?.triggerTime, 'yyyy-MM-dd HH:mm:ss')}">
</div>
</div>
<div th:class="exp" class="layui-form-item">
<label class="layui-form-label">是否开启</label>
<div class="layui-input-inline">
<input type="radio" name="status" value="1" title="开启" checked><div class="layui-unselect layui-form-radio layui-form-radioed"><i class="layui-anim layui-icon"></i><div>开启</div></div>
<input type="radio" name="status" value="2" title="禁用" th:checked="${crawlExMetalPice.status} eq 2"><div class="layui-unselect layui-form-radio"><i class="layui-anim layui-icon"></i><div>禁用</div></div>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">标签位置</label>
<div class="layui-input-block">
<textarea class="layui-textarea" type="text" name="dataSite" placeholder="请输入标签位置" th:value="${crawlExMetalPice?.dataSite}">[[${crawlExMetalPice?.dataSite}]]</textarea>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">1~13标识</label>
<div class="layui-input-block">
<textarea class="layui-textarea" type="text" name="stateType" placeholder="请输入1~13标识" th:value="${crawlExMetalPice?.stateType}">[[${crawlExMetalPice?.stateType}]]</textarea>
</div>
</div>
<div class="layui-form-item timo-finally">
<button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 保存</button>
<button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>
</div>
</form>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>
因为不怎么写前端很多错都是前端的问题项目上有表单构建可以上去看生成的html也可以去layui官网
https://www.layui.com/demo/
补充个时间控件
Controller
@GetMapping("/index")
@RequiresPermissions("template:crawlExMetalPrice:index")
public String index(Model model, CrawlExMetalPrice crawlExMetalPrice) {
// 创建匹配器,进行动态查询匹配
ExampleMatcher matcher = ExampleMatcher.matching()
.withMatcher("prodName", match -> match.contains())
.withMatcher("targetObjectUrl", match -> match.contains())
.withMatcher("prodSourceDate", match -> match.contains());
// 获取数据列表
Example<CrawlExMetalPrice> example = Example.of(crawlExMetalPrice, matcher);
Page<CrawlExMetalPrice> list = crawlExMetalPriceService.getPageList(example);
// 封装数据
model.addAttribute("list", list.getContent());
model.addAttribute("page", list);
return "/template/crawlExMetalPrice/index";
}
前端
选择时间控件的时候!要引入css和js!
时间控件格式使用 yyyy/MM/dd 千万不要用 yyyy-MM-dd 或者年月日那种格式,不然会报错 需要用默认的
string 类型的 db和pojo里都是date类型的 你要strig 类型 我没话说。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
xmlns:mo="https://gitee.com/aun/Timo">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
<link rel="stylesheet" href="../../../static/lib/layui-v2.3.0/css/layui.css">
</head>
<body class="timo-layout-page">
<div class="layui-card">
<div class="layui-card-header timo-card-header">
<span><i class="fa fa-bars"></i> 数据查询管理</span>
<i class="layui-icon layui-icon-refresh refresh-btn"></i>
</div>
<div class="layui-card-body">
<div class="layui-row timo-card-screen">
<div class="pull-left layui-form-pane timo-search-box">
<div class="layui-inline">
<label class="layui-form-label">状态</label>
<div class="layui-input-block timo-search-status">
<select class="timo-search-select" name="status" mo:dict="SEARCH_STATUS" mo-selected="${param.status}"></select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label" style="padding:8px 5px">产品名称</label>
<div class="layui-input-block">
<input type="text" name="prodName" th:value="${param.prodName}" placeholder="" autocomplete="off" class="layui-input" style="padding-left:2px;">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label" style="padding:8px 5px">网站地址</label>
<div class="layui-input-block">
<input type="text" name="targetObjectUrl" th:value="${param.targetObjectUrl}" placeholder="" autocomplete="off" class="layui-input" style="padding-left:2px;">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label" style="padding:8px 5px">产品数据的时间</label>
<div class="layui-input-block">
<input type="text"id="test1" name="prodSourceDate" th:value="${param.prodSourceDate}" placeholder="" autocomplete="off" class="layui-input" style="padding-left:2px;">
</div>
</div>
<div class="layui-inline">
<button class="layui-btn timo-search-btn">
<i class="fa fa-search"></i>
</button>
</div>
<div class="pull-right screen-btn-group">
<div class="btn-group">
<button class="layui-btn">操作<span class="caret"></span></button>
<dl class="layui-nav-child layui-anim layui-anim-upbit">
<dd><a class="ajax-status" th:href="@{/template/crawlExMetalPrice/status/ok}">启用</a></dd>
<dd><a class="ajax-status" th:href="@{/template/crawlExMetalPrice/status/freezed}">冻结</a></dd>
<dd><a class="ajax-status" th:href="@{/template/crawlExMetalPrice/status/delete}">删除</a></dd>
</dl>
</div>
</div>
</div>
</div>
<div class="timo-table-wrap">
<table class="layui-table timo-table">
<thead>
<tr>
<th class="timo-table-checkbox">
<label class="timo-checkbox"><input type="checkbox">
<i class="layui-icon layui-icon-ok"></i></label>
</th>
<!-- <th>主键ID</th>-->
<th>目标网站名称</th>
<!-- <th>目标对象网站URL</th>-->
<th>目标网站首页URL</th>
<th>产品名称</th>
<th>产品现货卖价</th>
<th>产品三个月的平均价</th>
<th>产品结算价格,收盘价格</th>
<th>产品开盘价格</th>
<th>产品最高价格</th>
<th>产品最低价格</th>
<th>产品收盘价格</th>
<th>产品库存量</th>
<th>产品库存变化</th>
<th>产品平均价格</th>
<th>产品价格单位</th>
<th>产品数据的时间</th>
<th>数据来源日期</th>
<!-- <th>爬取数据的时间</th>-->
<!-- <th>爬取次数</th>-->
<!-- <th>爬取状态</th>-->
<th>产品平均成交量</th>
<th>模板</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr th:each="item:${list}">
<td><label class="timo-checkbox"><input type="checkbox" th:value="${item.id}">
<i class="layui-icon layui-icon-ok"></i></label></td>
<!-- <td th:text="${item.id}">主键ID</td>-->
<td th:text="${item.targetWebName}">目标网站名称</td>
<!-- <td th:text="${item.targetObjectUrl}">目标对象网站URL</td>-->
<td th:text="${item.targetHomeUrl}">目标网站首页URL</td>
<td th:text="${item.prodName}">产品名称</td>
<td th:text="${item.prodCurrentPrice}">产品现货卖价</td>
<td th:text="${item.prodLast3monthAvg}">产品三个月的平均价</td>
<td th:text="${item.prodSettlementPrice}">产品结算价格,收盘价格</td>
<td th:text="${item.prodOpeningQuotation}">产品开盘价格</td>
<td th:text="${item.prodPeakPrice}">产品最高价格</td>
<td th:text="${item.prodLowestPrice}">产品最低价格</td>
<td th:text="${item.prodClosingQuotation}">产品收盘价格</td>
<td th:text="${item.prodStockCounts}">产品库存量</td>
<td th:text="${item.prodChange}">产品库存变化</td>
<td th:text="${item.prodAvgPrice}">产品平均价格</td>
<td th:text="${item.prodPriceUnit}">产品价格单位</td>
<td th:text="${item.prodSourceTime}">产品数据的时间</td>
<td th:text="${item.prodSourceDate}">数据来源日期</td>
<!-- <td th:text="${item.createDate}">爬取数据的时间</td>-->
<!-- <td th:text="${item.getCounts}">爬取次数</td>-->
<!-- <td th:text="${item.status}">爬取状态</td>-->
<td th:text="${item.prodTradeVolume}">产品平均成交量</td>
<td th:text="${item.confId}">模板</td>
<td>
<!-- <a class="open-popup" data-title="编辑数据查询" th:attr="data-url=@{'/template/crawlExMetalPrice/edit/'+${item.id}}" data-size="auto" href="#">编辑</a>-->
<a class="open-popup" data-title="详细信息" th:attr="data-url=@{'/template/crawlExMetalPrice/detail/'+${item.id}}" data-size="800,600" href="#">详细</a>
<!-- <a class="ajax-get" data-msg="您是否确认删除" th:href="@{/template/crawlExMetalPrice/status/delete(ids=${item.id})}">删除</a>-->
</td>
</tr>
</tbody>
</table>
</div>
<div th:replace="/common/fragment :: page"></div>
</div>
</div>
<script th:replace="/common/template :: script"></script>
<script src="../../../static/lib/layui-v2.3.0/layui.all.js"></script>
<script>
layui.use('laydate', function(){
var laydate = layui.laydate;
//执行一个laydate实例
laydate.render({
elem: '#test1' //指定元素
,format: 'yyyy/MM/dd' //可任意组合
});
})
</script>
</body>
</html>