Compare commits

...

140 Commits

Author SHA1 Message Date
3849a9b86f build: 修改版本号 2024-11-02 18:32:01 +08:00
71b9d1d916 模版更新 2024-11-02 18:31:47 +08:00
4b9dbe969c 修复i笔趣阁爬虫规则 2024-11-02 18:26:40 +08:00
2136f7490f 增加爬虫规则 2024-11-02 13:24:28 +08:00
3586ffbc0a 优化 2024-09-21 11:14:07 +08:00
f78a2a36cf 优化 2024-09-21 11:10:44 +08:00
a8219253e9 优化 2024-09-21 10:15:45 +08:00
5c35f7af0a 更换默认logo图片 2024-09-16 21:08:32 +08:00
d55e1a3e22 revert: sql格式化还原 2024-08-06 22:42:43 +08:00
21a6a49ce9 fix: 作家稿费统计 2024-08-06 21:14:22 +08:00
3735023cef perf(novel-front): UI优化 2024-07-20 21:48:29 +08:00
89992dc781 perf(novel-crawl): 增加小说内容过滤 2024-06-01 09:56:07 +08:00
976db9420e build: 修改版本号 2024-05-31 20:59:34 +08:00
e33db86081 Update README.md 2024-05-28 12:34:00 +08:00
48a70c2aca build: 修改版本号 2024-05-28 09:45:23 +08:00
ea5c0e8bd1 模版更新 2024-05-28 09:42:27 +08:00
b0c249cdca fix: 默认logo图片失效 2024-05-26 22:50:57 +08:00
730fcb4c76 fix: 默认logo图片失效 2024-05-26 22:46:46 +08:00
b976a00389 perf: UI优化 2024-05-26 22:31:26 +08:00
6d9b563583 fix: 文件上传大小限制 2024-05-25 22:05:03 +08:00
bfb7d6cc5c fix: i笔趣阁域名更换 2024-05-12 17:26:59 +08:00
9d4dc409c6 fix: URI编码 2024-03-03 11:10:46 +08:00
34d211afbf fix: 只推荐有内容的小说 2024-02-21 19:27:48 +08:00
2d218076c4 chore: 修改打包默认模版 2024-02-18 10:28:29 +08:00
674e4df84c chore: 模版更新 2024-02-07 14:59:31 +08:00
331f56d112 fix: 移动端首页在数据量小于10时报错 2024-02-07 14:58:36 +08:00
f494aae2c7 chore: 模版更新 2024-02-07 14:23:32 +08:00
2fc533f8ae fix(novel-crawl): 登录页样式问题 2024-02-05 21:12:41 +08:00
82758271e3 feat: 增加语音播放小说内容 2024-02-05 12:05:26 +08:00
4c82c2d720 perf: 优化支付宝支付流程 2024-02-04 12:25:26 +08:00
4665b5c4b9 fix: bug 2024-02-03 16:14:36 +08:00
7bbabb3492 fix: 修复充值页面的未登录跳转路径 2024-02-03 14:03:23 +08:00
d6093d8182 fix(novel-admin): 友情链接URL格式校验 2023-12-29 18:54:53 +08:00
f77792aa3c perf: 限制昵称长度并优化显示 2023-12-29 00:34:04 +08:00
c62da9bb3a fix: nickName、userPhoto 更新校验 2023-12-29 00:11:01 +08:00
8a63cff0b5 Update README.md 2023-10-31 08:24:54 +08:00
07bed12fa5 fix(mobile): 充值页标题 2023-10-30 14:17:03 +08:00
0d6e0ffb06 perf(mobile): 内容页优化
去掉小说内容前面的多余空格
2023-10-30 14:07:31 +08:00
e7005004bb perf(mobile): 登录/注册页优化 2023-10-30 14:01:39 +08:00
ff68cdd829 perf(mobile): 首页优化 2023-10-30 14:01:24 +08:00
b61dc4d0d5 build(Docker): 管理 Dockerfile 文件 2023-10-22 19:20:52 +08:00
98f1f804c3 chore(sql): 自动创建 novel_plus 数据库 2023-10-22 19:07:32 +08:00
5978d6cbcc build: 修改版本号 2023-10-21 21:21:54 +08:00
ef290bed9c fix: 书架列表时间格式化 2023-10-21 21:02:00 +08:00
5543e5aa57 perf: 设置网站 ico 图标 2023-10-15 20:30:11 +08:00
0332802fe5 feat(crawl): 账号退出 2023-10-15 19:13:07 +08:00
a55f456b3d perf: 更新爬虫管理系统主题颜色 2023-10-15 17:54:44 +08:00
f6d66e69fb Update README.md 2023-10-14 18:19:00 +08:00
96960789e1 fix(alipay): 修改默认支付宝支付成功跳转地址 2023-10-14 17:50:14 +08:00
1998dcd460 fix(alipay): 修复支付宝支付页面报错
沙箱环境自动升级到新版后,没有在代码中更换新版本的应用/网关/账号信息,也没有从左边栏沙箱工具中下载最新版本的沙箱支付宝APP安装使用。
2023-10-14 17:42:42 +08:00
a33d8f68a2 删除垃圾文件 2023-10-14 13:42:37 +08:00
30959da038 删除垃圾文件 2023-10-14 13:39:11 +08:00
5406783344 删除垃圾文件 2023-10-14 12:54:33 +08:00
d84345918b Update README.md 2023-10-14 10:32:46 +08:00
a5394cb426 Update README.md 2023-10-14 10:20:16 +08:00
2275b85752 chore: 模版更新 2023-10-14 10:16:41 +08:00
2062123edd perf(mobile): 去除手机网站底部空白间隙 2023-10-14 10:06:16 +08:00
255b3f8c4b feat(templates): 新增绿色主题模版,并设置为默认模版
和文档站点 docs.xxyopen.com 风格保持一致
2023-10-13 21:21:21 +08:00
00179359bd chore: 更新 Dockerfile 文件 2023-10-12 16:33:57 +08:00
6019ce11c7 build: 修改版本号 2023-10-12 10:02:50 +08:00
3e1c1f02e9 chore: 模版更新 2023-10-12 09:59:08 +08:00
98a5157623 feat: 支付宝手机网站支付 2023-10-12 09:49:03 +08:00
05d65c19a7 perf: 手机端页面优化 2023-10-12 09:42:28 +08:00
4c9f39ab19 feat: 手机端阅读历史页面适配 2023-10-12 09:28:29 +08:00
8bc05a1606 Merge remote-tracking branch 'Gitee/4.1.x' into develop_xxy 2023-10-12 09:03:32 +08:00
f9aad61b10 chore: 模版更新 2023-10-10 19:31:26 +08:00
8311681b23 perf(mobile): 加入书架按钮样式优化 2023-10-10 19:29:26 +08:00
4497dd1974 chore: 模版更新 2023-09-29 19:25:06 +08:00
44bf0cd693 fix: 修复作家专区小说封面更新问题 2023-09-29 19:23:12 +08:00
f333a2c084 perf: 优化小说推荐管理 2023-09-29 19:18:42 +08:00
bff5b0827e perf: 爬虫配置自定义登录页面 2023-06-09 19:25:42 +08:00
14f9205d76 docs: 修正小说内容保存配置的注释 2023-06-05 13:17:43 +08:00
cb2ff39b1e build: 移除 Elasticsearch 依赖 2023-05-28 21:51:07 +08:00
3eaa526093 fix: 修复CVE漏洞 2023-05-28 21:44:44 +08:00
04d7b45334 feat: 移除 FastDFS 模块 2023-05-28 19:14:21 +08:00
24c80e381c fix: 修改依赖组件漏洞 2023-05-28 18:43:05 +08:00
9fe51eab74 fix: 页面请求异常处理 2023-05-17 23:43:27 +08:00
e1c800d78f feat: 手机端用户中心优化 2023-05-14 07:05:36 +08:00
eb982b51f7 feat: 手机端充值页面适配 2023-05-14 06:58:42 +08:00
18f5fbf508 feat: 手机端我的书架页面适配 2023-05-13 23:40:54 +08:00
c63b4d617e feat: 手机端用户中心页面适配 2023-05-13 23:02:53 +08:00
4fb0d478f3 feat: 手机端注册页面适配 2023-05-13 19:57:19 +08:00
dabfb9d1e8 feat: 手机端登录页面适配 2023-05-13 15:15:42 +08:00
dce8a21c0d feat: 首页是否登录识别 2023-05-13 13:11:10 +08:00
d9ad02e3f5 fix(sql): 网站信息修改提示未授权
超级管理员增加网站信息修改权限
2023-05-08 15:52:02 +08:00
b02a2b3b2c build: 4.1.0 发布 2023-04-18 12:00:50 +08:00
f28c8a9c16 revert: 恢复误删文件
作家专区稿费收入报错
2023-04-18 11:34:26 +08:00
e44978617f feat: 后台会员反馈管理 2023-04-18 11:23:45 +08:00
aa2929a3cd feat: 后台小说推荐管理 2023-04-18 10:58:33 +08:00
281561c85b fix: 会员注册验证码 2023-04-18 09:17:30 +08:00
cab350dbb2 fix: 刷新首页新闻缓存 2023-04-18 08:58:30 +08:00
9ed465784a fix: 网站信息管理的权限问题 2023-04-17 10:55:20 +08:00
e2cfa5a788 Update README.md 2023-04-16 08:32:19 +08:00
6fb1e5cc99 chore: 模版更新 2023-04-15 08:37:17 +08:00
749fd1aeaa docs: 项目演示 2023-04-15 08:08:57 +08:00
8c3fb7f1ca build: 4.0.0 发布 2023-04-15 06:50:55 +08:00
c71eadef82 perf: 后台订单管理 2023-04-14 23:22:23 +08:00
3ffa75dc10 perf: 后台评论管理 2023-04-14 23:16:55 +08:00
8ddc6cc434 feat: 后台评论管理 2023-04-14 22:34:36 +08:00
5854536c70 fix: 代码生成数据表查询 2023-04-14 22:06:39 +08:00
a7d825cc54 fix: 后台模块查询过滤相同的行 2023-04-14 21:33:31 +08:00
687eb61846 feat: 后台小说删除 2023-04-14 21:09:37 +08:00
9f23f817b1 feat: 后台小说管理 2023-04-14 18:07:05 +08:00
0c59adf23b feat: 后台订单管理 2023-04-14 17:29:41 +08:00
57eca58b24 feat: 后台会员管理 2023-04-14 16:58:04 +08:00
c76df15a7f feat: 后台友情链接管理 2023-04-14 16:32:05 +08:00
3b0edd8e1f fix: sql 2023-04-14 14:58:38 +08:00
2c3b735d49 feat: 后台网站信息管理 2023-04-14 14:56:11 +08:00
b45b83fdb0 Update README.md 2023-04-14 10:51:42 +08:00
29d074ec18 refactor: 移除 Ehcache,默认缓存设置为 Redis 2023-04-14 10:40:54 +08:00
282bc7b707 refactor: 移除 RabbitMQ 和 Elasticsearch 相关功能 2023-04-14 10:10:09 +08:00
68b3458c30 Add favicon.ico 2023-01-11 19:19:05 +08:00
2f5002f673 Update README.md 2022-08-29 08:12:32 +08:00
d293d7bf91 Merge branch 'develop_xxy' of https://gitee.com/novel_dev_team/novel-plus into develop_xxy 2022-07-31 08:12:41 +08:00
a9080310a4 update template & sql 2022-07-31 08:04:43 +08:00
xxy
1f571f9b64 Update README.md 2022-07-26 17:22:25 +08:00
xxy
7be529fe4a Update README.md 2022-07-26 17:11:15 +08:00
xxy
2f62641b63 Update README.md 2022-07-24 14:53:27 +08:00
xxy
d962620814 Update README.md 2022-07-24 14:51:09 +08:00
xxy
7640d153ac Update README.md 2022-07-21 21:28:26 +08:00
xxy
3d9f52ffee Update README.md 2022-07-20 06:28:17 +08:00
xxy
0112af202b Update README.md 2022-07-20 06:24:29 +08:00
xxy
e3010ea81e Update README.md 2022-07-20 06:21:54 +08:00
xxy
05608d0316 Update README.md 2022-07-20 06:18:52 +08:00
xxy
4f6ec5aa0f Update README.md 2022-07-20 06:17:48 +08:00
xxy
01984f7137 Update README.md 2022-07-18 18:20:06 +08:00
xxy
617f6f50b0 Update README.md 2022-07-18 13:14:27 +08:00
xxy
e0686f079c Update README.md 2022-07-16 07:08:50 +08:00
xxy
5fb1717770 Update README.md 2022-07-15 22:49:11 +08:00
xxy
4bf495b6c0 Update README.md 2022-07-15 22:47:40 +08:00
028c200764 fix: 新笔趣阁规则移动到全量sql文件 2022-07-15 22:36:48 +08:00
xxy
472440ef7c Update README.md 2022-07-15 19:26:12 +08:00
xxy
5278b5fc39 Update README.md 2022-07-15 19:24:04 +08:00
xxy
9a0a79957b Update README.md 2022-07-15 19:19:49 +08:00
xxy
d93bf3dd4e Update README.md 2022-07-15 19:15:42 +08:00
xxy
09a4f39172 Update README.md 2022-07-15 19:15:11 +08:00
xxy
3abe7e22c9 Update README.md 2022-07-15 19:14:05 +08:00
xxy
5e1135268a Update README.md 2022-07-15 19:12:58 +08:00
xxy
54aeef7c80 Update README.md 2022-07-15 07:18:04 +08:00
xxy
027fbffb7f Update README.md 2022-07-15 06:20:04 +08:00
925 changed files with 78374 additions and 28130 deletions

273
README.md
View File

@ -1,4 +1,4 @@
[![index]( https://youdoc.github.io/img/kuaidl4.png )]( https://www.kuaidaili.com/?ref=mdpz65syhqup ) [![index]( https://youdoc.github.io/img/tencent.jpg )]( https://cloud.tencent.com/act/cps/redirect?redirect=2446&cps_key=736e609d66e0ac4e57813316cec6fd0b&from=console )
<p align="center"> <p align="center">
<a href='https://github.com/201206030/novel-plus'><img alt="Github stars" src="https://img.shields.io/github/stars/201206030/novel-plus?logo=github"></a> <a href='https://github.com/201206030/novel-plus'><img alt="Github stars" src="https://img.shields.io/github/stars/201206030/novel-plus?logo=github"></a>
@ -8,40 +8,35 @@
<a href="https://github.com/201206030/novel-plus"><img src="https://visitor-badge.glitch.me/badge?page_id=201206030.novel-plus" alt="visitors"></a> <a href="https://github.com/201206030/novel-plus"><img src="https://visitor-badge.glitch.me/badge?page_id=201206030.novel-plus" alt="visitors"></a>
</p> </p>
#### 官网 <p align="center">
👉 <a href='https://novel.xxyopen.com'>官网</a> | 👉 <a href='https://www.bilibili.com/video/BV1Zo4y187Mi'>项目演示</a> | 👉 <a href='https://docs.xxyopen.com/course/novelplus/1.html'>安装教程</a>
</p>
https://201206030.github.io ## 项目介绍
#### 学习版
[基于 Spring Boot 3 + Vue 3 开发的前后端分离学习型小说项目](https://github.com/201206030/novel)
#### 微服务版
[Github](https://github.com/201206030/novel-cloud) | [码云](https://gitee.com/novel_dev_team/novel-cloud)
#### 演示地址
[点击前往](http://47.106.243.172:8888/)
#### 项目介绍
novel-plus 是一个多端PCWAP阅读功能完善的原创文学 CMS novel-plus 是一个多端PCWAP阅读功能完善的原创文学 CMS
系统由前台门户系统作家后台管理系统平台后台管理系统和爬虫管理系统等多个子系统构成包括小说推荐作品检索小说排行小说阅读小说评论会员中心作家专区等功能支持自定义多模版可拓展的多种小说内容存储方式内置数据库分表存储和 系统由前台门户系统作家后台管理系统平台后台管理系统和爬虫管理系统等多个子系统构成包括小说推荐作品检索小说排行小说阅读小说评论会员中心作家专区等功能支持自定义多模版可拓展的多种小说内容存储方式内置数据库分表存储和
TXT 文本存储阅读主题切换多爬虫源自动采集和更新数据会员充值订阅模式新闻发布和实时统计报表 TXT 文本存储阅读主题切换多爬虫源自动采集和更新数据会员充值订阅模式新闻发布和实时统计报表
#### 项目结构 ## 项目地址
- 学习版[GitHub](https://github.com/201206030/novel) [码云](https://gitee.com/novel_dev_team/novel)
[保姆级教程](https://docs.xxyopen.com)
- **应用版**[GitHub](https://github.com/201206030/novel-plus) [码云](https://gitee.com/novel_dev_team/novel-plus)
- 微服务版[GitHub](https://github.com/201206030/novel-cloud) [码云](https://gitee.com/novel_dev_team/novel-cloud)
## 项目结构
``` ```
novel-plus -- 父工程 novel-plus -- 父工程
novel-common -- 通用模块 novel-common -- 通用模块
novel-front -- 前台门户&作家后台管理子系统可拆分 novel-front -- 前台门户&作家后台
novel-crawl -- 爬虫管理子系统 novel-crawl -- 爬虫
novel-admin -- 平台后台管理子系统 novel-admin -- 管理后台
templates -- 前端模版 templates -- 前端模版
``` ```
#### 技术选型 ## 技术选型
| 技术 | 说明 | 技术 | 说明
|---------------------| --------------------------- |---------------------| ---------------------------
@ -49,240 +44,52 @@ novel-plus -- 父工程
| MyBatis | 持久层 ORM 框架 | MyBatis | 持久层 ORM 框架
| MyBatis Dynamic SQL | Mybatis 动态 sql | MyBatis Dynamic SQL | Mybatis 动态 sql
| PageHelper | MyBatis 分页插件 | PageHelper | MyBatis 分页插件
| MyBatisGenerator | 持久层代码生成插件 | MyBatis Generator | 持久层代码生成插件
| Sharding-Jdbc | 代码层分库分表中间件 | Sharding-JDBC | 代码层分库分表中间件
| JJWT | JWT 登录支持 | JJWT | JWT 登录支持
| SpringSecurity | 安全框架 | Spring Security | 安全框架
| Shiro | 安全框架 | Apache Shiro | 安全框架
| Ehcache | Java 进程内缓存框架(默认缓存) | Redis | 缓存方案
| Redis | 分布式缓存(缓存替换方案默认关闭一行配置开启) | Aliyun OSS | 阿里云对象存储服务图片存储备选方案
| Elasticsearch | 搜索引擎(搜索增强方案默认关闭一行配置开启)
| RabbitMQ | 消息队列(流量削峰默认关闭一行配置开启)
| Aliyun OSS | 阿里云对象存储服务(图片存储方式之一一行配置即可切换)
| FastDFS | 开源轻量级分布式文件系统(图片存储方式之一一行配置即可切换)
| Redisson | 实现分布式锁
| Lombok | 简化对象封装工具 | Lombok | 简化对象封装工具
| Docker | 应用容器引擎 | Docker | 应用容器引擎
| MySQL | 数据库服务 | MySQL | 数据库服务
| Thymeleaf | 模板引擎 | Thymeleaf | 模板引擎
| Layui | 前端 UI 框架 | Layui | 前端 UI 框架
#### 橙色主题模版截图 ## 项目截图
##### PC站截图 ### 绿色主题模版
1. 首页 [![点击查看大图](https://www.xxyopen.com/images/green_novel.png)](https://www.xxyopen.com/images/green_novel.png)
[![点击查看大图](https://www.xxyopen.com/images/resource/os/novel-plus/green3.png)](https://www.xxyopen.com/images/resource/os/novel-plus/green3.png)
[![点击查看大图](https://www.xxyopen.com/images/resource/os/novel-plus/green2.png)](https://www.xxyopen.com/images/resource/os/novel-plus/green2.png)
![img](https://s3.ax1x.com/2020/12/27/r5400A.png) ## 演示视频
2. 分类索引页 https://www.bilibili.com/video/BV18e41197xs
![img](https://oscimg.oschina.net/oscnet/up-d0b2e03129bfae47b8bb96a491b73d383c5.png) ## 增值服务
3. 搜索页 👉 [了解详情](https://novel.xxyopen.com/service.htm)
![img](https://s3.ax1x.com/2020/12/27/r5TO8x.png) ## 微信公众号
![img](https://oscimg.oschina.net/oscnet/up-ed5f689557718924acac76bc3ebca36afcb.png) 发布最新更新动态最新前端模版最新爬虫规则文档教程等
4. 排行榜 ![](https://youdoc.github.io/img/qrcode_for_gh.jpg)
![img](https://oscimg.oschina.net/oscnet/up-78d5a68586cd92a86c669311f414508f922.png) ## 赞赏支持
5. 详情页
![img](https://oscimg.oschina.net/oscnet/up-8be2495a2869f93626b0c9c1df6f329747a.png)
6. 阅读页
![img](https://oscimg.oschina.net/oscnet/up-517c84148d2db8e11717a8bbecc57fa1be7.png)
7. 用户中心
![img](https://oscimg.oschina.net/oscnet/up-805a30e7a663a3fd5cb39a7ea26bc132a01.png)
8. 充值
![img](https://oscimg.oschina.net/oscnet/up-5a601b0b3af3224d0bebcfe12fc15075d34.png)
![img](https://oscimg.oschina.net/oscnet/up-face25d02c07b05b2ce954cc4bf4ee6a0cc.png)
9. 作家专区
![img](https://oscimg.oschina.net/oscnet/up-30766372cc7f56480ff1d7d55198204f6ea.png)
![img](https://s3.ax1x.com/2020/11/17/DVFiQI.png)
![img](https://s1.ax1x.com/2020/11/09/B7X5oF.png)
![img](https://s1.ax1x.com/2020/11/09/B7XLsx.png)
10. 购买
![img](https://oscimg.oschina.net/oscnet/up-ce0f585efd82a9670335f118cf5897c85e9.png)
![img](https://oscimg.oschina.net/oscnet/up-f849960f4c1303fea77d26e64fc505a7180.png)
##### 手机站截图
1. 首页
<img src="https://s3.ax1x.com/2020/12/27/r5447n.jpg" alt="index" width="300" />
2. 小说列表页
<img src="https://s3.ax1x.com/2020/12/27/r55xKg.jpg" alt="微信图片_20190904181558" width="300" />
3. 小说详情页
<img src="https://s3.ax1x.com/2020/12/28/roZWOf.jpg" alt="QQ图片20191018161901" width="300" />
4. 小说阅读页
<img src="https://s3.ax1x.com/2020/12/27/r55Stx.jpg" alt="QQ图片20191018161901" width="300" />
##### 爬虫管理系统截图
![img](https://s1.ax1x.com/2020/11/03/BsOgbD.png)
![img](https://s1.ax1x.com/2020/11/03/BsOHr8.png)
##### 后台管理系统截图
![img](https://oscimg.oschina.net/oscnet/up-0552343538674a22a64819834100558f39b.png)
![img](https://s3.ax1x.com/2020/12/01/DWgLNT.png)
![img](https://s3.ax1x.com/2020/12/01/DfmRCd.png)
![img](https://oscimg.oschina.net/oscnet/up-faf5dda7320674c29a1772bc0c81d74762e.png)
#### 深色主题模版截图
##### PC站截图
1. 首页
![index](https://static.oschina.net/uploads/img/202006/24151811_wIus.png)
##### 手机站截图
1. 首页
![index](https://static.oschina.net/uploads/img/202006/24151812_OOob.jpg)
4. 小说详情页
![微信图片_20190904181558](https://static.oschina.net/uploads/img/202006/24151812_ZosF.png)
5. 目录页
![QQ图片20191018161901](https://static.oschina.net/uploads/img/202006/24151812_Krva.png)
5. 小说阅读页
![QQ图片20191018161901](https://static.oschina.net/uploads/img/202006/24151813_fDgT.png)
#### 蓝色主题模版截图更新中
![QQ图片20191018161901](https://s3.ax1x.com/2020/12/27/r5Fe0A.png)
#### 源码安装教程
- JDK 安装
建议[安装 JDK 8](https://docs.oracle.com/javase/8/docs/technotes/guides/install/linux_jdk.html)
- MySQL 安装
1. [安装 MySQL 服务](https://dev.mysql.com/doc/refman/8.0/en/linux-installation.html)
2. 修改 MySQL`max_allowed_packet `配置建议 100 M
3. 新建数据库设置编码为 utf8mb4
4. 执行 doc/sql/novel_plus.sql 脚本文件
- Maven 安装
[安装 Apache Maven](https://maven.apache.org/install.html)
- 源码打包
novel-plus 根目录下执行打包命令`mvn clean package -Dmaven.test.skip`
- 爬虫安装
1. 上传 novel-crawl/target/build/novel-crawl.zip 压缩包到 Linux 服务器的 novel-crawl 目录
2. 使用`unzip novel-crawl.zip`命令解压 novel-crawl.zip
3. 修改 `config/application-common-prod.yml` 文件中的数据库配置
4. 修改 `config/application-common-prod.yml` 文件中的管理员账号密码
5. 根据需要[设置爬虫的代理IP](https://github.com/201206030/novel-plus/wiki/%E7%88%AC%E8%99%AB%E7%A8%8B%E5%BA%8F-HTTP-%E4%BB%A3%E7%90%86%E8%AE%BE%E7%BD%AE)
6. novel-crawl 目录下使用`bin/novel-crawl.sh start`命令启动爬虫程序
7. 打开浏览器默认`8083`端口访问
8. 选择已有或新增爬虫源支持自定义爬虫规则点击`开启`按钮开始采集小说数据
9. novel-crawl 目录下使用`bin/novel-crawl.sh stop`命令停止爬虫程序
10. novel-crawl 目录下使用`bin/novel-crawl.sh restart`命令重启爬虫程序
11. novel-crawl 目录下使用`bin/novel-crawl.sh status`命令查看爬虫程序的运行状态
- 前台安装
1. 上传 novel-front/target/build/novel-front.zip 压缩包到 Linux 服务器的 novel-front 目录
2. 使用`unzip novel-front.zip`命令解压 novel-front.zip
3. 修改 `config/application-common-prod.yml` 文件中的数据库配置
4. 修改 `config/application-website.yml` 配置文件中的网站信息
5. novel-front 目录下使用`bin/novel-front.sh start`命令启动前台程序
6. 打开浏览器默认`8085`端口访问
7. novel-front 目录下使用`bin/novel-front.sh stop`命令停止前台程序
8. novel-front 目录下使用`bin/novel-front.sh restart`命令重启前台程序
9. novel-front 目录下使用`bin/novel-front.sh status`命令查看前台程序的运行状态
- 后台安装
1. 上传 novel-admin/target/build/novel-admin.zip 压缩包到 Linux 服务器的 novel-admin 目录
2. 使用`unzip novel-admin.zip`命令解压 novel-admin.zip
3. 修改 `config/application-prod.yml` 文件中的数据库配置
4. novel-admin 目录下使用`bin/novel-admin.sh start`命令启动后台程序
5. 打开浏览器默认`8088`端口访问
6. novel-admin 目录下使用`bin/novel-admin.sh stop`命令停止后台程序
7. novel-admin 目录下使用`bin/novel-admin.sh restart`命令重启后台程序
8. novel-admin 目录下使用`bin/novel-admin.sh status`命令查看后台程序的运行状态
**部分环境如新版 Mac OS 系统获取不到主机 IP需要手动修改 hosts 文件增加 IP-主机名通过 hostname 命令查看主机名的映射**
#### 代码仓库
Github 仓库地址 https://github.com/201206030/novel-plus
Gitee 仓库地址 https://gitee.com/novel_dev_team/novel-plus
#### QQ 交流群
[点击前往官网查看](https://xiongxyang.gitee.io/service.htm)
#### 微信交流群
微信群二维码会过期所以每周在公众号更新一次请关注公众号**xxyopen**回复关键词**微信群**获取
问问题的三要素
1. 说明背景使用了哪个模块要做什么
2. 怎么输入或操作的得到了什么结果 截图日志
3. 哪里不明白或有什么疑问
#### 微信公众号发布最新更新资讯最新前端模版最新爬虫规则技术文档等
![mini-code](https://s3.ax1x.com/2020/12/03/DoImOx.png)
#### 赞赏支持
开源项目不易若此项目能得到你的青睐那么你可以赞赏支持作者持续开发与维护 开源项目不易若此项目能得到你的青睐那么你可以赞赏支持作者持续开发与维护
- 服务器的费用也是一笔开销 - 服务器的费用也是一笔开销
- 为用户提供更好的开发环境 - 编写更完备的文档教程
- 发布更多前端模版和爬虫规则
- 一杯咖啡 - 一杯咖啡
![mini-code](https://s1.ax1x.com/2020/10/31/BUQJwq.png) ![](https://s1.ax1x.com/2020/10/31/BUQJwq.png)
#### 免责声明 ## 免责声明
本项目提供的爬虫工具仅用于采集项目初期的测试数据请勿用于商业盈利 用户使用本系统从事任何违法违规的事情一切后果由用户自行承担作者不承担任何责任 本项目提供的爬虫工具仅用于采集项目初期的测试数据请勿用于商业盈利 用户使用本系统从事任何违法违规的事情一切后果由用户自行承担作者不承担任何责任

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 411 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 263 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 461 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 223 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 360 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 357 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 307 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 929 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 764 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

View File

@ -1,116 +0,0 @@
<h1 class="curproject-name"> 小说精品屋-plus </h1>
小说精品屋-plus接口
# 作家模块
## 小说章节分页列表查询接口
<a id=小说章节分页列表查询接口> </a>
### 基本信息
**Path** /book/queryIndexList
**Method** GET
**接口描述:**
<p>作家后台章节管理页面需要请求该接口获取小说章节分页列表信息</p>
### 请求参数
**Query**
| 参数名称 | 是否必须 | 示例 | 备注 |
| ------------ | ------------ | ------------ | ------------ |
| bookId | 是 | 1334337530296893441 | 小说ID |
| curr | 否 | 1 | 查询页码默认1 |
| limit | 否 | 5 | 分页大小默认5 |
### 返回数据
<table>
<thead class="ant-table-thead">
<tr>
<th key=name>名称</th><th key=type>类型</th><th key=required>是否必须</th><th key=default>默认值</th><th key=desc>备注</th><th key=sub>其他信息</th>
</tr>
</thead><tbody className="ant-table-tbody"><tr key=0-0><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> code</span></td><td key=1><span>number</span></td><td key=2>必须</td><td key=3></td><td key=4><span style="white-space: pre-wrap">响应状态吗200表示成功</span></td><td key=5></td></tr><tr key=0-1><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> msg</span></td><td key=1><span>string</span></td><td key=2>必须</td><td key=3></td><td key=4><span style="white-space: pre-wrap">响应信息</span></td><td key=5></td></tr><tr key=0-2><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> data</span></td><td key=1><span>object</span></td><td key=2>必须</td><td key=3></td><td key=4><span style="white-space: pre-wrap">响应数据</span></td><td key=5></td></tr><tr key=0-2-0><td key=0><span style="padding-left: 20px"><span style="color: #8c8a8a">├─</span> total</span></td><td key=1><span>number</span></td><td key=2>必须</td><td key=3></td><td key=4><span style="white-space: pre-wrap">总数量</span></td><td key=5></td></tr><tr key=0-2-1><td key=0><span style="padding-left: 20px"><span style="color: #8c8a8a">├─</span> list</span></td><td key=1><span>object []</span></td><td key=2>必须</td><td key=3></td><td key=4><span style="white-space: pre-wrap">章节数据集合</span></td><td key=5><p key=3><span style="font-weight: '700'">item 类型: </span><span>object</span></p></td></tr><tr key=0-2-1-0><td key=0><span style="padding-left: 40px"><span style="color: #8c8a8a">├─</span> id</span></td><td key=1><span>string</span></td><td key=2>必须</td><td key=3></td><td key=4><span style="white-space: pre-wrap">章节ID</span></td><td key=5></td></tr><tr key=0-2-1-1><td key=0><span style="padding-left: 40px"><span style="color: #8c8a8a">├─</span> bookId</span></td><td key=1><span>string</span></td><td key=2>必须</td><td key=3></td><td key=4><span style="white-space: pre-wrap">小说ID</span></td><td key=5></td></tr><tr key=0-2-1-2><td key=0><span style="padding-left: 40px"><span style="color: #8c8a8a">├─</span> indexName</span></td><td key=1><span>string</span></td><td key=2>必须</td><td key=3></td><td key=4><span style="white-space: pre-wrap">章节名</span></td><td key=5></td></tr><tr key=0-2-1-3><td key=0><span style="padding-left: 40px"><span style="color: #8c8a8a">├─</span> isVip</span></td><td key=1><span>number</span></td><td key=2>必须</td><td key=3></td><td key=4><span style="white-space: pre-wrap">是否收费1:收费0:免费</span></td><td key=5></td></tr><tr key=0-2-1-4><td key=0><span style="padding-left: 40px"><span style="color: #8c8a8a">├─</span> updateTime</span></td><td key=1><span>string</span></td><td key=2>必须</td><td key=3></td><td key=4><span style="white-space: pre-wrap">更新时间</span></td><td key=5></td></tr><tr key=0-2-2><td key=0><span style="padding-left: 20px"><span style="color: #8c8a8a">├─</span> pageNum</span></td><td key=1><span>number</span></td><td key=2>必须</td><td key=3></td><td key=4><span style="white-space: pre-wrap">页码</span></td><td key=5></td></tr><tr key=0-2-3><td key=0><span style="padding-left: 20px"><span style="color: #8c8a8a">├─</span> pageSize</span></td><td key=1><span>number</span></td><td key=2>必须</td><td key=3></td><td key=4><span style="white-space: pre-wrap">分页大小</span></td><td key=5></td></tr><tr key=0-2-4><td key=0><span style="padding-left: 20px"><span style="color: #8c8a8a">├─</span> size</span></td><td key=1><span>number</span></td><td key=2>必须</td><td key=3></td><td key=4><span style="white-space: pre-wrap">当前页数量</span></td><td key=5></td></tr>
</tbody>
</table>
## 小说章节删除接口
<a id=小说章节删除接口> </a>
### 基本信息
**Path** /author/deleteIndex/{indexId}
**Method** DELETE
**接口描述:**
<p>作家后台章节管理页面点击删除按钮请求该接口删除小说章节内容</p>
### 请求参数
**Headers**
| 参数名称 | 参数值 | 是否必须 | 示例 | 备注 |
| ------------ | ------------ | ------------ | ------------ | ------------ |
| Content-Type | application/x-www-form-urlencoded | 是 | | |
| Authorization | | 是 | eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE2MDgzNDg0NzksInN1YiI6IntcImlkXCI6MTI1NTA2MDMyODMyMjAyNzUyMCxcInVzZXJuYW1lXCI6XCIxMzU2MDQyMTMyNFwiLFwibmlja05hbWVcIjpcIjEzNTYwNDIxMzI0XCJ9IiwiY3JlYXRlZCI6MTYwNzc0MzY3OTkxM30.0qhwis_zPb6t8wGNejMhDZ2iHCL9Tgh2UHd1gcQBCp8t6RW3ggSwtfo4l_RgMT_v8jOkLW91GzTVWlNnTE6LCA | 认证JWT请求登录接口成功后返回 |
**路径参数**
| 参数名称 | 示例 | 备注 |
| ------------ | ------------ | ------------ |
| indexId | 1337603246936645632 | 章节ID |
### 返回数据
<table>
<thead class="ant-table-thead">
<tr>
<th key=name>名称</th><th key=type>类型</th><th key=required>是否必须</th><th key=default>默认值</th><th key=desc>备注</th><th key=sub>其他信息</th>
</tr>
</thead><tbody className="ant-table-tbody"><tr key=0-0><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> code</span></td><td key=1><span>number</span></td><td key=2>必须</td><td key=3></td><td key=4><span style="white-space: pre-wrap">响应状态吗200表示成功</span></td><td key=5></td></tr><tr key=0-1><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> msg</span></td><td key=1><span>string</span></td><td key=2>必须</td><td key=3></td><td key=4><span style="white-space: pre-wrap">响应信息</span></td><td key=5></td></tr>
</tbody>
</table>
## 小说章节发布接口
<a id=小说章节发布接口> </a>
### 基本信息
**Path** /author/addBookContent
**Method** POST
**接口描述:**
<p>作家后台章节发布页面点击提交按钮请求该接口新增小说章节内容</p>
### 请求参数
**Headers**
| 参数名称 | 参数值 | 是否必须 | 示例 | 备注 |
| ------------ | ------------ | ------------ | ------------ | ------------ |
| Content-Type | application/x-www-form-urlencoded | 是 | | |
| Authorization | | 是 | eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE2MDgzNDg0NzksInN1YiI6IntcImlkXCI6MTI1NTA2MDMyODMyMjAyNzUyMCxcInVzZXJuYW1lXCI6XCIxMzU2MDQyMTMyNFwiLFwibmlja05hbWVcIjpcIjEzNTYwNDIxMzI0XCJ9IiwiY3JlYXRlZCI6MTYwNzc0MzY3OTkxM30.0qhwis_zPb6t8wGNejMhDZ2iHCL9Tgh2UHd1gcQBCp8t6RW3ggSwtfo4l_RgMT_v8jOkLW91GzTVWlNnTE6LCA | 认证JWT请求登录接口成功后返回 |
**Body**
| 参数名称 | 参数类型 | 是否必须 | 示例 | 备注 |
| ------------ | ------------ | ------------ | ------------ | ------------ |
| bookId | text | 是 | 1334337530296893441 | 小说ID |
| indexName | text | 是 | 第六章未婚妻(下) | 章节名 |
| content | text | 是 | 开始之时,李七夜还是生疏无比,那怕他对于刀术的所有奥义了然于胸,但是,他出刀之时依然会颤抖,无法达到妙及巅毫的要求。 | 章节内容 |
| isVip | text | 是 | 1 | 是否收费1:收费0:免费 |
### 返回数据
<table>
<thead class="ant-table-thead">
<tr>
<th key=name>名称</th><th key=type>类型</th><th key=required>是否必须</th><th key=default>默认值</th><th key=desc>备注</th><th key=sub>其他信息</th>
</tr>
</thead><tbody className="ant-table-tbody"><tr key=0-0><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> code</span></td><td key=1><span>number</span></td><td key=2>必须</td><td key=3></td><td key=4><span style="white-space: pre-wrap">响应状态吗200表示成功</span></td><td key=5></td></tr><tr key=0-1><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> msg</span></td><td key=1><span>string</span></td><td key=2>必须</td><td key=3></td><td key=4><span style="white-space: pre-wrap">响应信息</span></td><td key=5></td></tr>
</tbody>
</table>

121
doc/sql/20230413.sql Normal file
View File

@ -0,0 +1,121 @@
CREATE TABLE `website_info`
(
id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
name varchar(50) NOT NULL COMMENT '网站名',
domain varchar(50) NOT NULL COMMENT '网站域名',
keyword varchar(50) NOT NULL COMMENT 'SEO关键词',
description varchar(512) NOT NULL COMMENT '网站描述',
qq varchar(20) NOT NULL COMMENT '站长QQ',
logo varchar(200) NOT NULL COMMENT '网站logo图片默认',
logo_dark varchar(200) NOT NULL COMMENT '网站logo图片深色',
create_time datetime null comment '创建时间',
create_user_id bigint null comment '创建人ID',
update_time datetime null comment '更新时间',
update_user_id bigint null comment '更新人ID',
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4 COMMENT ='网站信息表';
INSERT INTO website_info (id, name, domain, keyword, description, qq, logo, logo_dark, create_time, create_user_id,
update_time, update_user_id)
VALUES (1, '小说精品屋', 'www.xxyopen.com', '小说精品屋,小说,小说CMS,原创文学系统,开源小说系统,免费小说建站程序',
'小说精品屋是一个多端PCWAP阅读功能完善的原创文学CMS系统由前台门户系统作家后台管理系统平台后台管理系统爬虫管理系统等多个子系统构成支持会员充值订阅模式新闻发布和实时统计报表等功能新书自动入库老书自动更新',
'1179705413', 'https://youdoc.gitee.io/resource/images/logo/logo.png',
'https://youdoc.gitee.io/resource/images/logo/logo_white.png', null, null, null, null);
INSERT INTO sys_menu (menu_id, parent_id, name, url, perms, type, icon, order_num, gmt_create, gmt_modified)
VALUES (300, 0, '网站管理', '', '', 0, 'fa fa-television', 6, null, null);
INSERT
INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES (301, 300, '网站信息', 'novel/websiteInfo', 'novel:websiteInfo:websiteInfo', '1', 'fa', '6');
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 300);
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 301);
INSERT INTO `sys_menu` (menu_id, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES (310, 300, '友情链接', 'novel/friendLink', 'novel:friendLink:friendLink', '1', 'fa', '16');
INSERT INTO `sys_menu` (menu_id, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES (311, 310, '查看', null, 'novel:friendLink:detail', '2', null, '6');
INSERT INTO `sys_menu` (menu_id, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES (312, 310, '新增', null, 'novel:friendLink:add', '2', null, '6');
INSERT INTO `sys_menu` (menu_id, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES (313, 310, '修改', null, 'novel:friendLink:edit', '2', null, '6');
INSERT INTO `sys_menu` (menu_id, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES (314, 310, '删除', null, 'novel:friendLink:remove', '2', null, '6');
INSERT INTO `sys_menu` (menu_id, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES (315, 310, '批量删除', null, 'novel:friendLink:batchRemove', '2', null, '6');
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 310);
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 311);
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 312);
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 313);
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 314);
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 315);
INSERT INTO sys_menu (menu_id, parent_id, name, url, perms, type, icon, order_num, gmt_create, gmt_modified)
VALUES (400, 0, '会员管理', '', '', 0, 'fa fa-vcard', 9, null, null);
INSERT
INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES (401, 400, '会员列表', 'novel/user', 'novel:user:user', '1', 'fa', '6');
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 400);
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 401);
INSERT INTO sys_menu (menu_id, parent_id, name, url, perms, type, icon, order_num, gmt_create, gmt_modified)
VALUES (500, 0, '订单管理', '', '', 0, 'fa fa-money', 19, null, null);
INSERT
INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES (501, 500, '订单列表', 'novel/pay', 'novel:pay:pay', '1', 'fa', '6');
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 500);
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 501);
INSERT INTO sys_menu (menu_id, parent_id, name, url, perms, type, icon, order_num, gmt_create, gmt_modified)
VALUES (600, 0, '小说管理', '', '', 0, 'fa fa-book', 15, null, null);
INSERT
INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES (601, 600, '小说列表', 'novel/book', 'novel:book:book', '1', 'fa', '6');
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 600);
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 601);
INSERT INTO `sys_menu` (menu_id, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES (602, 601, '删除', null, 'novel:book:remove', '2', null, '6');
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 602);
INSERT
INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES (603, 600, '评论管理', 'novel/bookComment', 'novel:bookComment:bookComment', '1', 'fa', '10');
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 603);
INSERT INTO `sys_menu` (menu_id, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES (604, 603, '删除', null, 'novel:bookComment:remove', '2', null, '6');
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 604);

51
doc/sql/20230418.sql Normal file
View File

@ -0,0 +1,51 @@
INSERT INTO sys_dict (name, value, type, description, sort, parent_id, create_by, create_date, update_by,
update_date, remarks, del_flag)
VALUES ('轮播图', '0', 'book_rec_type', '小说推荐类型', 0, null, null, null, null, null, '', null);
INSERT INTO sys_dict (name, value, type, description, sort, parent_id, create_by, create_date, update_by,
update_date, remarks, del_flag)
VALUES ('顶部小说栏', '1', 'book_rec_type', '小说推荐类型', 1, null, null, null, null, null, '', null);
INSERT INTO sys_dict (name, value, type, description, sort, parent_id, create_by, create_date, update_by,
update_date, remarks, del_flag)
VALUES ('本周强推', '2', 'book_rec_type', '小说推荐类型', 2, null, null, null, null, null, '', null);
INSERT INTO sys_dict (name, value, type, description, sort, parent_id, create_by, create_date, update_by,
update_date, remarks, del_flag)
VALUES ('热门推荐', '3', 'book_rec_type', '小说推荐类型', 3, null, null, null, null, null, '', null);
INSERT INTO sys_dict (name, value, type, description, sort, parent_id, create_by, create_date, update_by,
update_date, remarks, del_flag)
VALUES ('精品推荐', '4', 'book_rec_type', '小说推荐类型', 4, null, null, null, null, null, '', null);
INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES (320, '300', '小说推荐', 'novel/bookSetting', 'novel:bookSetting:bookSetting', '1', 'fa', '6');
INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES (321, '320', '查看', null, 'novel:bookSetting:detail', '2', null, '6');
INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES (322, '320', '新增', null, 'novel:bookSetting:add', '2', null, '6');
INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES (323, '320', '修改', null, 'novel:bookSetting:edit', '2', null, '6');
INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES (324, '320', '删除', null, 'novel:bookSetting:remove', '2', null, '6');
INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES (325, '320', '批量删除', null, 'novel:bookSetting:batchRemove', '2', null, '6');
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 320);
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 321);
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 322);
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 323);
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 324);
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 325);
INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES (410, '400', '会员反馈', 'novel/userFeedback', 'novel:userFeedback:userFeedback', '1', 'fa', '16');
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 410);

4
doc/sql/20230508.sql Normal file
View File

@ -0,0 +1,4 @@
INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES (305, '301', '修改', null, 'novel:websiteInfo:edit', '2', null, '6');
INSERT INTO sys_role_menu (role_id, menu_id)
VALUES (1, 305);

3
doc/sql/20240512.sql Normal file
View File

@ -0,0 +1,3 @@
update crawl_source
set crawl_rule = replace(crawl_rule, 'ibiquge.net', 'ibiquzw.org')
where id = 16;

2
doc/sql/Dockerfile Normal file
View File

@ -0,0 +1,2 @@
FROM mysql:8.0
COPY novel_plus.sql /docker-entrypoint-initdb.d/init.sql

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +0,0 @@
FROM java:8
ADD novel-admin-1.0.0.jar /root
ENV dburl=""
ENV username=""
ENV password=""
ENTRYPOINT ["sh","-c","java -Dspring.datasource.url=${dburl} -Dspring.datasource.username=${username} -Dspring.datasource.password=${password} -jar /root/novel-admin-1.0.0.jar"]

View File

@ -5,7 +5,7 @@
<groupId>com.java2nb</groupId> <groupId>com.java2nb</groupId>
<artifactId>novel-admin</artifactId> <artifactId>novel-admin</artifactId>
<version>3.6.2</version> <version>4.4.0</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>novel-admin</name> <name>novel-admin</name>
@ -14,7 +14,7 @@
<parent> <parent>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version> <version>2.1.18.RELEASE</version>
<relativePath/> <relativePath/>
</parent> </parent>
@ -24,6 +24,8 @@
<java.version>1.8</java.version> <java.version>1.8</java.version>
<velocity.version>1.7</velocity.version> <velocity.version>1.7</velocity.version>
<activiti.version>5.22.0</activiti.version> <activiti.version>5.22.0</activiti.version>
<sharding.jdbc.version>3.0.0</sharding.jdbc.version>
<jackson.version>2.15.1</jackson.version>
</properties> </properties>
<dependencies> <dependencies>
@ -62,12 +64,12 @@
<dependency> <dependency>
<groupId>mysql</groupId> <groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId> <artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version> <version>8.0.29</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.mybatis</groupId> <groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId> <artifactId>mybatis</artifactId>
<version>3.4.4</version> <version>3.5.6</version>
</dependency> </dependency>
<dependency> <dependency>
@ -79,7 +81,7 @@
<dependency> <dependency>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>druid</artifactId> <artifactId>druid</artifactId>
<version>1.0.28</version> <version>1.2.9</version>
</dependency> </dependency>
<!--commons --> <!--commons -->
<dependency> <dependency>
@ -95,18 +97,18 @@
<dependency> <dependency>
<groupId>commons-io</groupId> <groupId>commons-io</groupId>
<artifactId>commons-io</artifactId> <artifactId>commons-io</artifactId>
<version>2.5</version> <version>2.9.0</version>
</dependency> </dependency>
<!--shiro --> <!--shiro -->
<dependency> <dependency>
<groupId>org.apache.shiro</groupId> <groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId> <artifactId>shiro-core</artifactId>
<version>1.3.2</version> <version>1.11.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.shiro</groupId> <groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId> <artifactId>shiro-spring</artifactId>
<version>1.7.0</version> <version>1.11.0</version>
</dependency> </dependency>
<!-- shiro ehcache --> <!-- shiro ehcache -->
<dependency> <dependency>
@ -118,7 +120,7 @@
<artifactId>ehcache-core</artifactId> <artifactId>ehcache-core</artifactId>
</exclusion> </exclusion>
</exclusions> </exclusions>
<version>1.4.0</version> <version>1.11.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.github.theborakompanioni</groupId> <groupId>com.github.theborakompanioni</groupId>
@ -129,7 +131,7 @@
<dependency> <dependency>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId> <artifactId>fastjson</artifactId>
<version>1.2.31</version> <version>1.2.83</version>
</dependency> </dependency>
<!--velocity代码生成使用模板 --> <!--velocity代码生成使用模板 -->
<dependency> <dependency>
@ -195,14 +197,22 @@
<version>1.4</version> <version>1.4</version>
</dependency> </dependency>
<!-- ehchache -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>io.shardingsphere</groupId>
<artifactId>spring-boot-starter-cache</artifactId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>${sharding.jdbc.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.sf.ehcache</groupId> <groupId>io.shardingsphere</groupId>
<artifactId>ehcache</artifactId> <artifactId>sharding-jdbc-spring-namespace</artifactId>
<version>${sharding.jdbc.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency> </dependency>
<!--war包部署需要--> <!--war包部署需要-->
@ -286,6 +296,9 @@
<zip destfile='${project.build.directory}/build/${project.artifactId}.zip'> <zip destfile='${project.build.directory}/build/${project.artifactId}.zip'>
<zipfileset filemode="755" dir='${project.build.directory}/build/'/> <zipfileset filemode="755" dir='${project.build.directory}/build/'/>
</zip> </zip>
<copy file="${basedir}/src/main/build/docker/Dockerfile"
tofile="${project.build.directory}/build/Dockerfile"/>
</tasks> </tasks>
</configuration> </configuration>
</execution> </execution>
@ -293,16 +306,28 @@
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
<!--<distributionManagement> <repositories>
<repository> <repository>
<id>nexus_release</id> <id>ali</id>
<name>release</name> <url>https://maven.aliyun.com/repository/public</url>
<url>http://47.106.243.172:8081/nexus/content/repositories/releases/</url> <releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository> </repository>
<snapshotRepository> </repositories>
<id>nexus_snapshots</id> <pluginRepositories>
<name>snapshots</name> <pluginRepository>
<url>http://47.106.243.172:8081/nexus/content/repositories/snapshots/</url> <id>ali-plugin</id>
</snapshotRepository> <url>https://maven.aliyun.com/repository/public</url>
</distributionManagement>--> <releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project> </project>

View File

@ -6,5 +6,15 @@ spring:
url: jdbc:mysql://127.0.0.1:3306/novel_plus?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai url: jdbc:mysql://127.0.0.1:3306/novel_plus?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: root username: root
password: test123456 password: test123456
redis:
host: 127.0.0.1
port: 6379
password: test123456
sharding:
jdbc:
datasource:
ds0:
jdbc-url: jdbc:mysql://localhost:3306/novel_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: test123456

View File

@ -0,0 +1,9 @@
FROM openjdk:8
ADD novel-admin.jar /root
ENV dburl=""
ENV username=""
ENV password=""
ENV redishost = ""
ENV redisport = ""
ENV redispwd = ""
ENTRYPOINT ["sh","-c","java -Dspring.datasource.url=${dburl} -Dspring.datasource.username=${username} -Dspring.datasource.password=${password} -Dspring.redis.host=${redishost} -Dspring.redis.port=${redisport} -Dspring.redis.password=${redispwd} -jar /root/novel-admin.jar"]

View File

@ -0,0 +1,73 @@
package com.java2nb.common.config;
/**
* @author 11797
*/
public interface CacheKey {
/**
* 首页小说设置
*/
String INDEX_BOOK_SETTINGS_KEY = "indexBookSettingsKey";
/**
* 首页新闻
*/
String INDEX_NEWS_KEY = "indexNewsKey";
/**
* 首页点击榜单
*/
String INDEX_CLICK_BANK_BOOK_KEY = "indexClickBankBookKey";
/**
* 首页友情链接
*/
String INDEX_LINK_KEY = "indexLinkKey";
/**
* 首页新书榜单
*/
String INDEX_NEW_BOOK_KEY = "indexNewBookKey";
/**
* 首页更新榜单
*/
String INDEX_UPDATE_BOOK_KEY = "indexUpdateBookKey";
/**
* 模板目录保存key
*/
String TEMPLATE_DIR_KEY = "templateDirKey";
;
/**
* 正在运行的爬虫线程存储KEY前缀
*/
String RUNNING_CRAWL_THREAD_KEY_PREFIX = "runningCrawlTreadDataKeyPrefix";
/**
* 上一次搜索引擎更新的时间
*/
String ES_LAST_UPDATE_TIME = "esLastUpdateTime";
/**
* 搜索引擎转换锁
*/
String ES_TRANS_LOCK = "esTransLock";
/**
* 上一次搜索引擎是否更新过小说点击量
*/
String ES_IS_UPDATE_VISIT = "esIsUpdateVisit";
/**
* 累积的小说点击量
*/
String BOOK_ADD_VISIT_COUNT = "bookAddVisitCount";
/**
* 测试爬虫规则缓存
*/
String BOOK_TEST_PARSE = "testParse";
}

View File

@ -1,6 +1,7 @@
package com.java2nb.common.config; package com.java2nb.common.config;
public class Constant { public class Constant {
//演示系统账户 //演示系统账户
public static String DEMO_ACCOUNT = "test"; public static String DEMO_ACCOUNT = "test";
//自动去除表前缀 //自动去除表前缀
@ -16,9 +17,11 @@ public class Constant {
//部门根节点id //部门根节点id
public static Long DEPT_ROOT_ID = 0l; public static Long DEPT_ROOT_ID = 0l;
//缓存方式 //缓存方式
public static String CACHE_TYPE_REDIS ="redis"; public static String CACHE_TYPE_REDIS = "redis";
public static String LOG_ERROR = "error"; public static String LOG_ERROR = "error";
public static final String UPLOAD_FILES_PREFIX = "/files/";
} }

View File

@ -1,82 +0,0 @@
package com.java2nb.common.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}

View File

@ -5,11 +5,8 @@ import com.java2nb.common.redis.shiro.RedisCacheManager;
import com.java2nb.common.redis.shiro.RedisManager; import com.java2nb.common.redis.shiro.RedisManager;
import com.java2nb.common.redis.shiro.RedisSessionDAO; import com.java2nb.common.redis.shiro.RedisSessionDAO;
import com.java2nb.system.shiro.UserRealm; import com.java2nb.system.shiro.UserRealm;
import net.sf.ehcache.CacheManager;
import org.apache.shiro.cache.ehcache.EhCacheManager;
import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.SessionListener; import org.apache.shiro.session.SessionListener;
import org.apache.shiro.session.mgt.eis.MemorySessionDAO;
import org.apache.shiro.session.mgt.eis.SessionDAO; import org.apache.shiro.session.mgt.eis.SessionDAO;
import org.apache.shiro.spring.LifecycleBeanPostProcessor; import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
@ -29,6 +26,7 @@ import java.util.LinkedHashMap;
*/ */
@Configuration @Configuration
public class ShiroConfig { public class ShiroConfig {
@Value("${spring.redis.host}") @Value("${spring.redis.host}")
private String host; private String host;
@Value("${spring.redis.password}") @Value("${spring.redis.password}")
@ -38,9 +36,6 @@ public class ShiroConfig {
@Value("${spring.redis.timeout}") @Value("${spring.redis.timeout}")
private int timeout; private int timeout;
@Value("${spring.cache.type}")
private String cacheType ;
@Value("${server.session-timeout}") @Value("${server.session-timeout}")
private int tomcatTimeout; private int tomcatTimeout;
@ -67,16 +62,17 @@ public class ShiroConfig {
shiroFilterFactoryBean.setSuccessUrl("/index"); shiroFilterFactoryBean.setSuccessUrl("/index");
shiroFilterFactoryBean.setUnauthorizedUrl("/403"); shiroFilterFactoryBean.setUnauthorizedUrl("/403");
LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>(); LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/login","anon"); filterChainDefinitionMap.put("/login", "anon");
filterChainDefinitionMap.put("/getVerify","anon"); filterChainDefinitionMap.put("/getVerify", "anon");
filterChainDefinitionMap.put("/css/**", "anon"); filterChainDefinitionMap.put("/css/**", "anon");
filterChainDefinitionMap.put("/js/**", "anon"); filterChainDefinitionMap.put("/js/**", "anon");
filterChainDefinitionMap.put("/fonts/**", "anon"); filterChainDefinitionMap.put("/fonts/**", "anon");
filterChainDefinitionMap.put("/img/**", "anon"); filterChainDefinitionMap.put("/img/**", "anon");
filterChainDefinitionMap.put("/favicon.ico", "anon");
filterChainDefinitionMap.put("/docs/**", "anon"); filterChainDefinitionMap.put("/docs/**", "anon");
filterChainDefinitionMap.put("/layuimini/**", "anon"); filterChainDefinitionMap.put("/layuimini/**", "anon");
filterChainDefinitionMap.put("/upload/**", "anon"); filterChainDefinitionMap.put("/upload/**", "anon");
filterChainDefinitionMap.put("/files/**", "anon"); filterChainDefinitionMap.put(Constant.UPLOAD_FILES_PREFIX + "**", "anon");
filterChainDefinitionMap.put("/logout", "logout"); filterChainDefinitionMap.put("/logout", "logout");
filterChainDefinitionMap.put("/blog", "anon"); filterChainDefinitionMap.put("/blog", "anon");
filterChainDefinitionMap.put("/blog/open/**", "anon"); filterChainDefinitionMap.put("/blog/open/**", "anon");
@ -92,11 +88,7 @@ public class ShiroConfig {
//设置realm. //设置realm.
securityManager.setRealm(userRealm()); securityManager.setRealm(userRealm());
// 自定义缓存实现 使用redis // 自定义缓存实现 使用redis
if (Constant.CACHE_TYPE_REDIS.equals(cacheType)) { securityManager.setCacheManager(rediscacheManager());
securityManager.setCacheManager(rediscacheManager());
} else {
securityManager.setCacheManager(ehCacheManager());
}
securityManager.setSessionManager(sessionManager()); securityManager.setSessionManager(sessionManager());
return securityManager; return securityManager;
} }
@ -108,8 +100,7 @@ public class ShiroConfig {
} }
/** /**
* 开启shiro aop注解支持. * 开启shiro aop注解支持. 使用代理方式;所以需要开启代码支持;
* 使用代理方式;所以需要开启代码支持;
* *
* @param securityManager * @param securityManager
* @return * @return
@ -138,8 +129,7 @@ public class ShiroConfig {
} }
/** /**
* cacheManager 缓存 redis实现 * cacheManager 缓存 redis实现 使用的是shiro-redis开源插件
* 使用的是shiro-redis开源插件
* *
* @return * @return
*/ */
@ -151,8 +141,7 @@ public class ShiroConfig {
/** /**
* RedisSessionDAO shiro sessionDao层的实现 通过redis * RedisSessionDAO shiro sessionDao层的实现 通过redis 使用的是shiro-redis开源插件
* 使用的是shiro-redis开源插件
*/ */
@Bean @Bean
public RedisSessionDAO redisSessionDAO() { public RedisSessionDAO redisSessionDAO() {
@ -163,11 +152,7 @@ public class ShiroConfig {
@Bean @Bean
public SessionDAO sessionDAO() { public SessionDAO sessionDAO() {
if (Constant.CACHE_TYPE_REDIS.equals(cacheType)) { return redisSessionDAO();
return redisSessionDAO();
} else {
return new MemorySessionDAO();
}
} }
/** /**
@ -184,19 +169,4 @@ public class ShiroConfig {
return sessionManager; return sessionManager;
} }
@Bean
public EhCacheManager ehCacheManager() {
EhCacheManager em = new EhCacheManager();
em.setCacheManager(cacheManager());
return em;
}
@Bean("cacheManager2")
CacheManager cacheManager(){
return CacheManager.create();
}
} }

View File

@ -7,11 +7,14 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
@Component @Component
class WebConfigurer extends WebMvcConfigurerAdapter { class WebConfigurer extends WebMvcConfigurerAdapter {
@Autowired
@Autowired
JnConfig jnConfig; JnConfig jnConfig;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) { @Override
registry.addResourceHandler("/files/**").addResourceLocations("file:///"+ jnConfig.getUploadPath()); public void addResourceHandlers(ResourceHandlerRegistry registry) {
} registry.addResourceHandler(Constant.UPLOAD_FILES_PREFIX + "**")
.addResourceLocations("file:///" + jnConfig.getUploadPath());
}
} }

View File

@ -1,12 +1,10 @@
package com.java2nb.common.controller; package com.java2nb.common.controller;
import com.java2nb.common.config.Constant;
import com.java2nb.common.config.JnConfig; import com.java2nb.common.config.JnConfig;
import com.java2nb.common.domain.FileDO; import com.java2nb.common.domain.FileDO;
import com.java2nb.common.service.FileService; import com.java2nb.common.service.FileService;
import com.java2nb.common.utils.*; import com.java2nb.common.utils.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.shiro.authz.annotation.RequiresPermissions; import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
@ -14,7 +12,11 @@ import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.*; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
@ -23,7 +25,7 @@ import java.util.Map;
/** /**
* 文件上传 * 文件上传
* *
* @author xiongxy * @author xiongxy
* @email 1179705413@qq.com * @email 1179705413@qq.com
* @date 2019-09-19 16:02:20 * @date 2019-09-19 16:02:20
@ -32,165 +34,167 @@ import java.util.Map;
@RequestMapping("/common/sysFile") @RequestMapping("/common/sysFile")
public class FileController extends BaseController { public class FileController extends BaseController {
@Autowired @Autowired
private FileService sysFileService; private FileService sysFileService;
@Autowired @Autowired
private JnConfig jnConfig; private JnConfig jnConfig;
@GetMapping() @GetMapping()
@RequiresPermissions("common:sysFile:sysFile") @RequiresPermissions("common:sysFile:sysFile")
String sysFile(Model model) { String sysFile(Model model) {
Map<String, Object> params = new HashMap<>(16); Map<String, Object> params = new HashMap<>(16);
return "common/file/file"; return "common/file/file";
} }
@ResponseBody @ResponseBody
@GetMapping("/list") @GetMapping("/list")
@RequiresPermissions("common:sysFile:sysFile") @RequiresPermissions("common:sysFile:sysFile")
public PageBean list(@RequestParam Map<String, Object> params) { public PageBean list(@RequestParam Map<String, Object> params) {
// 查询列表数据 // 查询列表数据
Query query = new Query(params); Query query = new Query(params);
List<FileDO> sysFileList = sysFileService.list(query); List<FileDO> sysFileList = sysFileService.list(query);
int total = sysFileService.count(query); int total = sysFileService.count(query);
PageBean pageBean = new PageBean(sysFileList, total); PageBean pageBean = new PageBean(sysFileList, total);
return pageBean; return pageBean;
} }
@GetMapping("/add") @GetMapping("/add")
// @RequiresPermissions("common:bComments") // @RequiresPermissions("common:bComments")
String add() { String add() {
return "common/sysFile/add"; return "common/sysFile/add";
} }
@GetMapping("/edit") @GetMapping("/edit")
// @RequiresPermissions("common:bComments") // @RequiresPermissions("common:bComments")
String edit(Long id, Model model) { String edit(Long id, Model model) {
FileDO sysFile = sysFileService.get(id); FileDO sysFile = sysFileService.get(id);
model.addAttribute("sysFile", sysFile); model.addAttribute("sysFile", sysFile);
return "common/sysFile/edit"; return "common/sysFile/edit";
} }
/** /**
* 信息 * 信息
*/ */
@RequestMapping("/info/{id}") @RequestMapping("/info/{id}")
@RequiresPermissions("common:info") @RequiresPermissions("common:info")
public R info(@PathVariable("id") Long id) { public R info(@PathVariable("id") Long id) {
FileDO sysFile = sysFileService.get(id); FileDO sysFile = sysFileService.get(id);
return R.ok().put("sysFile", sysFile); return R.ok().put("sysFile", sysFile);
} }
/** /**
* 保存 * 保存
*/ */
@ResponseBody @ResponseBody
@PostMapping("/save") @PostMapping("/save")
@RequiresPermissions("common:save") @RequiresPermissions("common:save")
public R save(FileDO sysFile) { public R save(FileDO sysFile) {
if (sysFileService.save(sysFile) > 0) { if (sysFileService.save(sysFile) > 0) {
return R.ok(); return R.ok();
} }
return R.error(); return R.error();
} }
/** /**
* 修改 * 修改
*/ */
@RequestMapping("/update") @RequestMapping("/update")
@RequiresPermissions("common:update") @RequiresPermissions("common:update")
public R update(@RequestBody FileDO sysFile) { public R update(@RequestBody FileDO sysFile) {
sysFileService.update(sysFile); sysFileService.update(sysFile);
return R.ok(); return R.ok();
} }
/** /**
* 删除 * 删除
*/ */
@PostMapping("/remove") @PostMapping("/remove")
@ResponseBody @ResponseBody
// @RequiresPermissions("common:remove") // @RequiresPermissions("common:remove")
public R remove(Long id, HttpServletRequest request) { public R remove(Long id, HttpServletRequest request) {
if ("test".equals(getUsername())) { if ("test".equals(getUsername())) {
return R.error(1, "演示系统不允许修改,完整体验请部署程序"); return R.error(1, "演示系统不允许修改,完整体验请部署程序");
} }
String fileName = jnConfig.getUploadPath() + sysFileService.get(id).getUrl().replace("/files/", ""); String fileName =
if (sysFileService.remove(id) > 0) { jnConfig.getUploadPath() + sysFileService.get(id).getUrl().replace(Constant.UPLOAD_FILES_PREFIX, "");
boolean b = FileUtil.deleteFile(fileName); if (sysFileService.remove(id) > 0) {
if (!b) { boolean b = FileUtil.deleteFile(fileName);
return R.error("数据库记录删除成功,文件删除失败"); if (!b) {
} return R.error("数据库记录删除成功,文件删除失败");
return R.ok(); }
} else { return R.ok();
return R.error(); } else {
} return R.error();
} }
}
/** /**
* 删除 * 删除
*/ */
@PostMapping("/batchRemove") @PostMapping("/batchRemove")
@ResponseBody @ResponseBody
@RequiresPermissions("common:remove") @RequiresPermissions("common:remove")
public R remove(@RequestParam("ids[]") Long[] ids) { public R remove(@RequestParam("ids[]") Long[] ids) {
if ("test".equals(getUsername())) { if ("test".equals(getUsername())) {
return R.error(1, "演示系统不允许修改,完整体验请部署程序"); return R.error(1, "演示系统不允许修改,完整体验请部署程序");
} }
sysFileService.batchRemove(ids); sysFileService.batchRemove(ids);
return R.ok(); return R.ok();
} }
@ResponseBody @ResponseBody
@PostMapping("/upload") @PostMapping("/upload")
R upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) { R upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
if ("test".equals(getUsername())) { if ("test".equals(getUsername())) {
return R.error(1, "演示系统不允许修改,完整体验请部署程序"); return R.error(1, "演示系统不允许修改,完整体验请部署程序");
} }
Date date = new Date(); Date date = new Date();
String year = DateUtils.format(date,DateUtils.YEAR_PATTERN); String year = DateUtils.format(date, DateUtils.YEAR_PATTERN);
String month = DateUtils.format(date,DateUtils.MONTH_PATTERN); String month = DateUtils.format(date, DateUtils.MONTH_PATTERN);
String day = DateUtils.format(date,DateUtils.DAY_PATTERN); String day = DateUtils.format(date, DateUtils.DAY_PATTERN);
String fileName = file.getOriginalFilename(); String fileName = file.getOriginalFilename();
String fileDir = year+"/"+month+"/"+day + "/"; String fileDir = year + "/" + month + "/" + day + "/";
fileName = FileUtil.renameToUUID(fileName); fileName = FileUtil.renameToUUID(fileName);
FileDO sysFile = new FileDO(FileType.fileType(fileName), "/files/" + fileDir + fileName, date); FileDO sysFile = new FileDO(FileType.fileType(fileName), Constant.UPLOAD_FILES_PREFIX + fileDir + fileName,
try { date);
FileUtil.uploadFile(file.getBytes(), jnConfig.getUploadPath()+fileDir, fileName); try {
} catch (Exception e) { FileUtil.uploadFile(file.getBytes(), jnConfig.getUploadPath() + fileDir, fileName);
return R.error(); } catch (Exception e) {
} return R.error();
}
if (sysFileService.save(sysFile) > 0) { if (sysFileService.save(sysFile) > 0) {
return R.ok().put("fileName",sysFile.getUrl()); return R.ok().put("fileName", sysFile.getUrl());
} }
return R.error(); return R.error();
} }
/** /**
* 文件下载 * 文件下载
*/ */
@RequestMapping(value = "/download") @RequestMapping(value = "/download")
public void fileDownload(String filePath,String fileName, HttpServletResponse resp) throws Exception { public void fileDownload(String filePath, String fileName, HttpServletResponse resp) throws Exception {
String realFilePath = jnConfig.getUploadPath() + filePath; String realFilePath = jnConfig.getUploadPath() + filePath;
InputStream in = new FileInputStream(realFilePath); InputStream in = new FileInputStream(realFilePath);
//设置响应头对文件进行url编码 //设置响应头对文件进行url编码
fileName = URLEncoder.encode(fileName, "UTF-8"); fileName = URLEncoder.encode(fileName, "UTF-8");
resp.setHeader("Content-Disposition", "attachment;filename=" + fileName); resp.setHeader("Content-Disposition", "attachment;filename=" + fileName);
resp.setContentLength(in.available()); resp.setContentLength(in.available());
OutputStream out = resp.getOutputStream(); OutputStream out = resp.getOutputStream();
byte[] b = new byte[1024]; byte[] b = new byte[1024];
int len = 0; int len = 0;
while ((len = in.read(b)) != -1) { while ((len = in.read(b)) != -1) {
out.write(b, 0, len); out.write(b, 0, len);
} }
out.flush(); out.flush();
out.close(); out.close();
in.close(); in.close();
} }
} }

View File

@ -1,28 +1,33 @@
package com.java2nb.common.dao; package com.java2nb.common.dao;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Select;
import java.util.List;
import java.util.Map;
public interface GeneratorMapper { public interface GeneratorMapper {
@Select("select table_name tableName, engine, table_comment tableComment, create_time createTime from information_schema.tables"
+ " where table_schema = (select database()) and table_name like concat('%',#{tableName},'%')")
List<Map<String, Object>> list(@Param("tableName") String tableName);
@Select("select count(*) from information_schema.tables where table_schema = (select database())") @Select(
int count(Map<String, Object> map); "select table_name tableName, engine, table_comment tableComment, create_time createTime from information_schema.tables"
+ " where table_schema = 'novel_plus' and table_name like concat('%',#{tableName},'%')")
List<Map<String, Object>> list(@Param("tableName") String tableName);
@Select("select table_name tableName, engine, table_comment tableComment, create_time createTime from information_schema.tables \r\n" @Select("select count(*) from information_schema.tables where table_schema = 'novel_plus'")
+ " where table_schema = (select database()) and table_name = #{tableName}") int count(Map<String, Object> map);
Map<String, String> get(String tableName);
@Select("select column_name columnName, data_type dataType, column_comment columnComment, column_key columnKey, extra from information_schema.columns\r\n" @Select(
+ " where table_name = #{tableName} and table_schema = (select database()) order by ordinal_position") "select table_name tableName, engine, table_comment tableComment, create_time createTime from information_schema.tables \r\n"
List<Map<String, String>> listColumns(String tableName); + " where table_schema = 'novel_plus' and table_name = #{tableName}")
Map<String, String> get(String tableName);
@Select("select column_name columnName, data_type dataType, column_comment columnComment, column_key columnKey, extra from information_schema.columns\r\n" @Select(
+ " where table_name = #{tableName} and table_schema = (select database()) and column_key = 'PRI' limit 1") "select column_name columnName, data_type dataType, column_comment columnComment, column_key columnKey, extra from information_schema.columns\r\n"
+ " where table_name = #{tableName} and table_schema = 'novel_plus' order by ordinal_position")
List<Map<String, String>> listColumns(String tableName);
@Select(
"select column_name columnName, data_type dataType, column_comment columnComment, column_key columnKey, extra from information_schema.columns\r\n"
+ " where table_name = #{tableName} and table_schema = 'novel_plus' and column_key = 'PRI' limit 1")
Map<String, String> getPriColumn(String tableName); Map<String, String> getPriColumn(String tableName);
} }

View File

@ -3,219 +3,270 @@ package com.java2nb.common.domain;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
import java.util.Objects;
/** /**
* 字典表 * 字典表
* *
* @author xiongxy * @author xiongxy
* @email 1179705413@qq.com * @email 1179705413@qq.com
* @date 2019-09-29 18:28:07 * @date 2019-09-29 18:28:07
*/ */
public class DictDO implements Serializable { public class DictDO implements Serializable {
private static final long serialVersionUID = 1L;
//编号
private Long id;
//标签名
private String name;
//数据值
private String value;
//类型
private String type;
//描述
private String description;
//排序(升序)
private BigDecimal sort;
//父级编号
private Long parentId;
//创建者
private Integer createBy;
//创建时间
private Date createDate;
//更新者
private Long updateBy;
//更新时间
private Date updateDate;
//备注信息
private String remarks;
//删除标记
private String delFlag;
/** private static final long serialVersionUID = 1L;
* 设置:编号
*/
public void setId(Long id) {
this.id = id;
}
/**
* 获取:编号
*/
public Long getId() {
return id;
}
/**
* 设置:标签名
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取:标签名
*/
public String getName() {
return name;
}
/**
* 设置:数据值
*/
public void setValue(String value) {
this.value = value;
}
/**
* 获取:数据值
*/
public String getValue() {
return value;
}
/**
* 设置:类型
*/
public void setType(String type) {
this.type = type;
}
/**
* 获取:类型
*/
public String getType() {
return type;
}
/**
* 设置:描述
*/
public void setDescription(String description) {
this.description = description;
}
/**
* 获取:描述
*/
public String getDescription() {
return description;
}
/**
* 设置:排序(升序)
*/
public void setSort(BigDecimal sort) {
this.sort = sort;
}
/**
* 获取:排序(升序)
*/
public BigDecimal getSort() {
return sort;
}
/**
* 设置:父级编号
*/
public void setParentId(Long parentId) {
this.parentId = parentId;
}
/**
* 获取:父级编号
*/
public Long getParentId() {
return parentId;
}
/**
* 设置:创建者
*/
public void setCreateBy(Integer createBy) {
this.createBy = createBy;
}
/**
* 获取:创建者
*/
public Integer getCreateBy() {
return createBy;
}
/**
* 设置:创建时间
*/
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
/**
* 获取:创建时间
*/
public Date getCreateDate() {
return createDate;
}
/**
* 设置:更新者
*/
public void setUpdateBy(Long updateBy) {
this.updateBy = updateBy;
}
/**
* 获取:更新者
*/
public Long getUpdateBy() {
return updateBy;
}
/**
* 设置:更新时间
*/
public void setUpdateDate(Date updateDate) {
this.updateDate = updateDate;
}
/**
* 获取:更新时间
*/
public Date getUpdateDate() {
return updateDate;
}
/**
* 设置:备注信息
*/
public void setRemarks(String remarks) {
this.remarks = remarks;
}
/**
* 获取:备注信息
*/
public String getRemarks() {
return remarks;
}
/**
* 设置:删除标记
*/
public void setDelFlag(String delFlag) {
this.delFlag = delFlag;
}
/**
* 获取:删除标记
*/
public String getDelFlag() {
return delFlag;
}
@Override //编号
public String toString() { private Long id;
return "DictDO{" + //标签名
"id=" + id + private String name;
", name='" + name + '\'' + //数据值
", value='" + value + '\'' + private String value;
", type='" + type + '\'' + //类型
", description='" + description + '\'' + private String type;
", sort=" + sort + //描述
", parentId=" + parentId + private String description;
", createBy=" + createBy + //排序(升序)
", createDate=" + createDate + private BigDecimal sort;
", updateBy=" + updateBy + //父级编号
", updateDate=" + updateDate + private Long parentId;
", remarks='" + remarks + '\'' + //创建者
", delFlag='" + delFlag + '\'' + private Integer createBy;
'}'; //创建时间
} private Date createDate;
//更新者
private Long updateBy;
//更新时间
private Date updateDate;
//备注信息
private String remarks;
//删除标记
private String delFlag;
/**
* 设置:编号
*/
public void setId(Long id) {
this.id = id;
}
/**
* 获取:编号
*/
public Long getId() {
return id;
}
/**
* 设置:标签名
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取:标签名
*/
public String getName() {
return name;
}
/**
* 设置:数据值
*/
public void setValue(String value) {
this.value = value;
}
/**
* 获取:数据值
*/
public String getValue() {
return value;
}
/**
* 设置:类型
*/
public void setType(String type) {
this.type = type;
}
/**
* 获取:类型
*/
public String getType() {
return type;
}
/**
* 设置:描述
*/
public void setDescription(String description) {
this.description = description;
}
/**
* 获取:描述
*/
public String getDescription() {
return description;
}
/**
* 设置:排序(升序)
*/
public void setSort(BigDecimal sort) {
this.sort = sort;
}
/**
* 获取:排序(升序)
*/
public BigDecimal getSort() {
return sort;
}
/**
* 设置:父级编号
*/
public void setParentId(Long parentId) {
this.parentId = parentId;
}
/**
* 获取:父级编号
*/
public Long getParentId() {
return parentId;
}
/**
* 设置:创建者
*/
public void setCreateBy(Integer createBy) {
this.createBy = createBy;
}
/**
* 获取:创建者
*/
public Integer getCreateBy() {
return createBy;
}
/**
* 设置:创建时间
*/
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
/**
* 获取:创建时间
*/
public Date getCreateDate() {
return createDate;
}
/**
* 设置:更新者
*/
public void setUpdateBy(Long updateBy) {
this.updateBy = updateBy;
}
/**
* 获取:更新者
*/
public Long getUpdateBy() {
return updateBy;
}
/**
* 设置:更新时间
*/
public void setUpdateDate(Date updateDate) {
this.updateDate = updateDate;
}
/**
* 获取:更新时间
*/
public Date getUpdateDate() {
return updateDate;
}
/**
* 设置:备注信息
*/
public void setRemarks(String remarks) {
this.remarks = remarks;
}
/**
* 获取:备注信息
*/
public String getRemarks() {
return remarks;
}
/**
* 设置:删除标记
*/
public void setDelFlag(String delFlag) {
this.delFlag = delFlag;
}
/**
* 获取:删除标记
*/
public String getDelFlag() {
return delFlag;
}
@Override
public String toString() {
return "DictDO{" +
"id=" + id +
", name='" + name + '\'' +
", value='" + value + '\'' +
", type='" + type + '\'' +
", description='" + description + '\'' +
", sort=" + sort +
", parentId=" + parentId +
", createBy=" + createBy +
", createDate=" + createDate +
", updateBy=" + updateBy +
", updateDate=" + updateDate +
", remarks='" + remarks + '\'' +
", delFlag='" + delFlag + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
DictDO dictDO = (DictDO) o;
return Objects.equals(id, dictDO.id) && Objects.equals(name, dictDO.name)
&& Objects.equals(value, dictDO.value) && Objects.equals(type, dictDO.type)
&& Objects.equals(description, dictDO.description) && Objects.equals(sort, dictDO.sort)
&& Objects.equals(parentId, dictDO.parentId) && Objects.equals(createBy, dictDO.createBy)
&& Objects.equals(createDate, dictDO.createDate) && Objects.equals(updateBy,
dictDO.updateBy) && Objects.equals(updateDate, dictDO.updateDate) && Objects.equals(remarks,
dictDO.remarks) && Objects.equals(delFlag, dictDO.delFlag);
}
@Override
public int hashCode() {
return Objects.hash(id, name, value, type, description, sort, parentId, createBy, createDate, updateBy,
updateDate,
remarks, delFlag);
}
} }

View File

@ -1,5 +1,8 @@
package com.java2nb.common.service.impl; package com.java2nb.common.service.impl;
import com.java2nb.common.dao.DictDao;
import com.java2nb.common.domain.DictDO;
import com.java2nb.common.service.DictService;
import com.java2nb.common.utils.StringUtils; import com.java2nb.common.utils.StringUtils;
import com.java2nb.system.domain.UserDO; import com.java2nb.system.domain.UserDO;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -9,14 +12,12 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors;
import com.java2nb.common.dao.DictDao;
import com.java2nb.common.domain.DictDO;
import com.java2nb.common.service.DictService;
@Service @Service
public class DictServiceImpl implements DictService { public class DictServiceImpl implements DictService {
@Autowired @Autowired
private DictDao dictDao; private DictDao dictDao;
@ -58,7 +59,7 @@ public class DictServiceImpl implements DictService {
@Override @Override
public List<DictDO> listType() { public List<DictDO> listType() {
return dictDao.listType(); return dictDao.listType().stream().distinct().collect(Collectors.toList());
} }
@Override @Override

View File

@ -1,72 +1,74 @@
package com.java2nb.common.service.impl; package com.java2nb.common.service.impl;
import com.java2nb.common.config.Constant;
import com.java2nb.common.config.JnConfig; import com.java2nb.common.config.JnConfig;
import com.java2nb.common.dao.FileDao;
import com.java2nb.common.domain.FileDO;
import com.java2nb.common.service.FileService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.io.File; import java.io.File;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import com.java2nb.common.dao.FileDao;
import com.java2nb.common.domain.FileDO;
import com.java2nb.common.service.FileService;
import org.springframework.util.StringUtils;
@Service @Service
public class FileServiceImpl implements FileService { public class FileServiceImpl implements FileService {
@Autowired
private FileDao sysFileMapper;
@Autowired @Autowired
private JnConfig jnConfig; private FileDao sysFileMapper;
@Override
public FileDO get(Long id){ @Autowired
return sysFileMapper.get(id); private JnConfig jnConfig;
}
@Override
@Override public FileDO get(Long id) {
public List<FileDO> list(Map<String, Object> map){ return sysFileMapper.get(id);
return sysFileMapper.list(map); }
}
@Override
@Override public List<FileDO> list(Map<String, Object> map) {
public int count(Map<String, Object> map){ return sysFileMapper.list(map);
return sysFileMapper.count(map); }
}
@Override
@Override public int count(Map<String, Object> map) {
public int save(FileDO sysFile){ return sysFileMapper.count(map);
return sysFileMapper.save(sysFile); }
}
@Override
@Override public int save(FileDO sysFile) {
public int update(FileDO sysFile){ return sysFileMapper.save(sysFile);
return sysFileMapper.update(sysFile); }
}
@Override
@Override public int update(FileDO sysFile) {
public int remove(Long id){ return sysFileMapper.update(sysFile);
return sysFileMapper.remove(id); }
}
@Override
@Override public int remove(Long id) {
public int batchRemove(Long[] ids){ return sysFileMapper.remove(id);
return sysFileMapper.batchRemove(ids); }
}
@Override
public int batchRemove(Long[] ids) {
return sysFileMapper.batchRemove(ids);
}
@Override @Override
public Boolean isExist(String url) { public Boolean isExist(String url) {
Boolean isExist = false; Boolean isExist = false;
if (!StringUtils.isEmpty(url)) { if (!StringUtils.isEmpty(url)) {
String filePath = url.replace("/files/", ""); String filePath = url.replace(Constant.UPLOAD_FILES_PREFIX, "");
filePath = jnConfig.getUploadPath() + filePath; filePath = jnConfig.getUploadPath() + filePath;
File file = new File(filePath); File file = new File(filePath);
if (file.exists()) { if (file.exists()) {
isExist = true; isExist = true;
} }
} }
return isExist; return isExist;
} }
} }

View File

@ -1,601 +0,0 @@
package com.java2nb.common.utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@Component
@Slf4j
public final class RedisUtil {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/**
* 指定缓存失效时间
*
* @param key 键
* @param time 时间(秒)
* @return
*/
public boolean expire(String key, long time) {
try {
if (time > 0) {
redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
log.error(e.getMessage(),e);
return false;
}
}
/**
* 根据key 获取过期时间
*
* @param key 键 不能为null
* @return 时间(秒) 返回0代表为永久有效
*/
public long getExpire(String key) {
return redisTemplate.getExpire(key, TimeUnit.SECONDS);
}
/**
* 判断key是否存在
*
* @param key 键
* @return true 存在 false不存在
*/
public boolean hasKey(String key) {
try {
return redisTemplate.hasKey(key);
} catch (Exception e) {
log.error(e.getMessage(),e);
return false;
}
}
/**
* 删除缓存
*
* @param key 可以传一个值 或多个
*/
public void del(String... key) {
if (key != null && key.length > 0) {
if (key.length == 1) {
redisTemplate.delete(key[0]);
} else {
redisTemplate.delete(CollectionUtils.arrayToList(key));
}
}
}
/**
* 普通缓存获取
*
* @param key 键
* @return 值
*/
public Object get(String key) {
return key == null ? null : redisTemplate.opsForValue().get(key);
}
/**
* 普通缓存放入
*
* @param key 键
* @param value 值
* @return true成功 false失败
*/
public boolean set(String key, Object value) {
try {
redisTemplate.opsForValue().set(key, value);
return true;
} catch (Exception e) {
log.error(e.getMessage(),e);
return false;
}
}
/**
* 普通缓存放入并设置时间
*
* @param key 键
* @param value 值
* @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
* @return true成功 false 失败
*/
public boolean set(String key, Object value, long time) {
try {
if (time > 0) {
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
} else {
set(key, value);
}
return true;
} catch (Exception e) {
log.error(e.getMessage(),e);
return false;
}
}
/**
* 递增
*
* @param key 键
* @param delta 要增加几(大于0)
* @return
*/
public long incr(String key, long delta) {
if (delta < 0) {
throw new RuntimeException("递增因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, delta);
}
/**
* 递减
*
* @param key 键
* @param delta 要减少几(小于0)
* @return
*/
public long decr(String key, long delta) {
if (delta < 0) {
throw new RuntimeException("递减因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, -delta);
}
// ================================Map=================================
/**
* HashGet
*
* @param key 键 不能为null
* @param item 项 不能为null
* @return 值
*/
public Object hget(String key, String item) {
return redisTemplate.opsForHash().get(key, item);
}
/**
* 获取hashKey对应的所有键值
*
* @param key 键
* @return 对应的多个键值
*/
public Map<Object, Object> hmget(String key) {
return redisTemplate.opsForHash().entries(key);
}
/**
* HashSet
*
* @param key 键
* @param map 对应多个键值
* @return true 成功 false 失败
*/
public boolean hmset(String key, Map<String, Object> map) {
try {
redisTemplate.opsForHash().putAll(key, map);
return true;
} catch (Exception e) {
log.error(e.getMessage(),e);
return false;
}
}
/**
* HashSet 并设置时间
*
* @param key 键
* @param map 对应多个键值
* @param time 时间(秒)
* @return true成功 false失败
*/
public boolean hmset(String key, Map<String, Object> map, long time) {
try {
redisTemplate.opsForHash().putAll(key, map);
if (time > 0) {
expire(key, time);
}
return true;
} catch (Exception e) {
log.error(e.getMessage(),e);
return false;
}
}
/**
* 向一张hash表中放入数据,如果不存在将创建
*
* @param key 键
* @param item 项
* @param value 值
* @return true 成功 false失败
*/
public boolean hset(String key, String item, Object value) {
try {
redisTemplate.opsForHash().put(key, item, value);
return true;
} catch (Exception e) {
log.error(e.getMessage(),e);
return false;
}
}
/**
* 向一张hash表中放入数据,如果不存在将创建
*
* @param key 键
* @param item 项
* @param value 值
* @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
* @return true 成功 false失败
*/
public boolean hset(String key, String item, Object value, long time) {
try {
redisTemplate.opsForHash().put(key, item, value);
if (time > 0) {
expire(key, time);
}
return true;
} catch (Exception e) {
log.error(e.getMessage(),e);
return false;
}
}
/**
* 删除hash表中的值
*
* @param key 键 不能为null
* @param item 项 可以使多个 不能为null
*/
public void hdel(String key, Object... item) {
redisTemplate.opsForHash().delete(key, item);
}
/**
* 判断hash表中是否有该项的值
*
* @param key 键 不能为null
* @param item 项 不能为null
* @return true 存在 false不存在
*/
public boolean hHasKey(String key, String item) {
return redisTemplate.opsForHash().hasKey(key, item);
}
/**
* hash递增 如果不存在,就会创建一个 并把新增后的值返回
*
* @param key 键
* @param item 项
* @param by 要增加几(大于0)
* @return
*/
public double hincr(String key, String item, double by) {
return redisTemplate.opsForHash().increment(key, item, by);
}
/**
* hash递减
*
* @param key 键
* @param item 项
* @param by 要减少记(小于0)
* @return
*/
public double hdecr(String key, String item, double by) {
return redisTemplate.opsForHash().increment(key, item, -by);
}
/**
* 根据key获取Set中的所有值
*
* @param key 键
* @return
*/
public Set<Object> sGet(String key) {
try {
return redisTemplate.opsForSet().members(key);
} catch (Exception e) {
log.error(e.getMessage(),e);
return null;
}
}
/**
* 根据value从一个set中查询,是否存在
*
* @param key 键
* @param value 值
* @return true 存在 false不存在
*/
public boolean sHasKey(String key, Object value) {
try {
return redisTemplate.opsForSet().isMember(key, value);
} catch (Exception e) {
log.error(e.getMessage(),e);
return false;
}
}
/**
* 将数据放入set缓存
*
* @param key 键
* @param values 值 可以是多个
* @return 成功个数
*/
public long sSet(String key, Object... values) {
try {
return redisTemplate.opsForSet().add(key, values);
} catch (Exception e) {
log.error(e.getMessage(),e);
return 0;
}
}
/**
* 将set数据放入缓存
*
* @param key 键
* @param time 时间(秒)
* @param values 值 可以是多个
* @return 成功个数
*/
public long sSetAndTime(String key, long time, Object... values) {
try {
Long count = redisTemplate.opsForSet().add(key, values);
if (time > 0)
expire(key, time);
return count;
} catch (Exception e) {
log.error(e.getMessage(),e);
return 0;
}
}
/**
* 获取set缓存的长度
*
* @param key 键
* @return
*/
public long sGetSetSize(String key) {
try {
return redisTemplate.opsForSet().size(key);
} catch (Exception e) {
log.error(e.getMessage(),e);
return 0;
}
}
/**
* 移除值为value的
*
* @param key 键
* @param values 值 可以是多个
* @return 移除的个数
*/
public long setRemove(String key, Object... values) {
try {
Long count = redisTemplate.opsForSet().remove(key, values);
return count;
} catch (Exception e) {
log.error(e.getMessage(),e);
return 0;
}
}
/**
* 获取list缓存的内容
*
* @param key 键
* @param start 开始
* @param end 结束 0 到 -代表所有值
* @return
*/
public List<Object> lGet(String key, long start, long end) {
try {
return redisTemplate.opsForList().range(key, start, end);
} catch (Exception e) {
log.error(e.getMessage(),e);
return null;
}
}
/**
* 获取list缓存的长度
*
* @param key 键
* @return
*/
public long lGetListSize(String key) {
try {
return redisTemplate.opsForList().size(key);
} catch (Exception e) {
log.error(e.getMessage(),e);
return 0;
}
}
/**
* 通过索引 获取list中的值
*
* @param key 键
* @param index 索引 index>=0时 0 表头, 第二个元素依次类推index<0时-,表尾,-倒数第二个元素,依次类推
* @return
*/
public Object lGetIndex(String key, long index) {
try {
return redisTemplate.opsForList().index(key, index);
} catch (Exception e) {
log.error(e.getMessage(),e);
return null;
}
}
/**
* 将list放入缓存
*
* @param key 键
* @param value 值
* @return
*/
public boolean lSet(String key, Object value) {
try {
redisTemplate.opsForList().rightPush(key, value);
return true;
} catch (Exception e) {
log.error(e.getMessage(),e);
return false;
}
}
/**
* 将list放入缓存
*
* @param key 键
* @param value 值
* @param time 时间(秒)
* @return
*/
public boolean lSet(String key, Object value, long time) {
try {
redisTemplate.opsForList().rightPush(key, value);
if (time > 0)
expire(key, time);
return true;
} catch (Exception e) {
log.error(e.getMessage(),e);
return false;
}
}
/**
* 将list放入缓存
*
* @param key 键
* @param value 值
* @return
*/
public boolean lSet(String key, List<Object> value) {
try {
redisTemplate.opsForList().rightPushAll(key, value);
return true;
} catch (Exception e) {
log.error(e.getMessage(),e);
return false;
}
}
/**
* 将list放入缓存
*
* @param key 键
* @param value 值
* @param time 时间(秒)
* @return
*/
public boolean lSet(String key, List<Object> value, long time) {
try {
redisTemplate.opsForList().rightPushAll(key, value);
if (time > 0)
expire(key, time);
return true;
} catch (Exception e) {
log.error(e.getMessage(),e);
return false;
}
}
/**
* 根据索引修改list中的某条数据
*
* @param key 键
* @param index 索引
* @param value 值
* @return
*/
public boolean lUpdateIndex(String key, long index, Object value) {
try {
redisTemplate.opsForList().set(key, index, value);
return true;
} catch (Exception e) {
log.error(e.getMessage(),e);
return false;
}
}
/**
* 移除N个值为value
*
* @param key 键
* @param count 移除多少个
* @param value 值
* @return 移除的个数
*/
public long lRemove(String key, long count, Object value) {
try {
Long remove = redisTemplate.opsForList().remove(key, count, value);
return remove;
} catch (Exception e) {
log.error(e.getMessage(),e);
return 0;
}
}
}

View File

@ -0,0 +1,135 @@
package com.java2nb.novel.controller;
import java.util.List;
import java.util.Map;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import io.swagger.annotations.ApiOperation;
import com.java2nb.novel.domain.BookCommentDO;
import com.java2nb.novel.service.BookCommentService;
import com.java2nb.common.utils.PageBean;
import com.java2nb.common.utils.Query;
import com.java2nb.common.utils.R;
/**
* 小说评论表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-14 21:59:28
*/
@Controller
@RequestMapping("/novel/bookComment")
public class BookCommentController {
@Autowired
private BookCommentService bookCommentService;
@GetMapping()
@RequiresPermissions("novel:bookComment:bookComment")
String BookComment() {
return "novel/bookComment/bookComment";
}
@ApiOperation(value = "获取小说评论表列表", notes = "获取小说评论表列表")
@ResponseBody
@GetMapping("/list")
@RequiresPermissions("novel:bookComment:bookComment")
public R list(@RequestParam Map<String, Object> params) {
//查询列表数据
Query query = new Query(params);
List<BookCommentDO> bookCommentList = bookCommentService.list(query);
int total = bookCommentService.count(query);
PageBean pageBean = new PageBean(bookCommentList, total);
return R.ok().put("data", pageBean);
}
@ApiOperation(value = "新增小说评论表页面", notes = "新增小说评论表页面")
@GetMapping("/add")
@RequiresPermissions("novel:bookComment:add")
String add() {
return "novel/bookComment/add";
}
@ApiOperation(value = "修改小说评论表页面", notes = "修改小说评论表页面")
@GetMapping("/edit/{id}")
@RequiresPermissions("novel:bookComment:edit")
String edit(@PathVariable("id") Long id, Model model) {
BookCommentDO bookComment = bookCommentService.get(id);
model.addAttribute("bookComment", bookComment);
return "novel/bookComment/edit";
}
@ApiOperation(value = "查看小说评论表页面", notes = "查看小说评论表页面")
@GetMapping("/detail/{id}")
@RequiresPermissions("novel:bookComment:detail")
String detail(@PathVariable("id") Long id, Model model) {
BookCommentDO bookComment = bookCommentService.get(id);
model.addAttribute("bookComment", bookComment);
return "novel/bookComment/detail";
}
/**
* 保存
*/
@ApiOperation(value = "新增小说评论表", notes = "新增小说评论表")
@ResponseBody
@PostMapping("/save")
@RequiresPermissions("novel:bookComment:add")
public R save( BookCommentDO bookComment) {
if (bookCommentService.save(bookComment) > 0) {
return R.ok();
}
return R.error();
}
/**
* 修改
*/
@ApiOperation(value = "修改小说评论表", notes = "修改小说评论表")
@ResponseBody
@RequestMapping("/update")
@RequiresPermissions("novel:bookComment:edit")
public R update( BookCommentDO bookComment) {
bookCommentService.update(bookComment);
return R.ok();
}
/**
* 删除
*/
@ApiOperation(value = "删除小说评论表", notes = "删除小说评论表")
@PostMapping("/remove")
@ResponseBody
@RequiresPermissions("novel:bookComment:remove")
public R remove( Long id) {
if (bookCommentService.remove(id) > 0) {
return R.ok();
}
return R.error();
}
/**
* 删除
*/
@ApiOperation(value = "批量删除小说评论表", notes = "批量删除小说评论表")
@PostMapping("/batchRemove")
@ResponseBody
@RequiresPermissions("novel:bookComment:batchRemove")
public R remove(@RequestParam("ids[]") Long[] ids) {
bookCommentService.batchRemove(ids);
return R.ok();
}
}

View File

@ -0,0 +1,135 @@
package com.java2nb.novel.controller;
import java.util.List;
import java.util.Map;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import io.swagger.annotations.ApiOperation;
import com.java2nb.novel.domain.BookContentDO;
import com.java2nb.novel.service.BookContentService;
import com.java2nb.common.utils.PageBean;
import com.java2nb.common.utils.Query;
import com.java2nb.common.utils.R;
/**
* 小说内容表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-14 19:52:06
*/
@Controller
@RequestMapping("/novel/bookContent")
public class BookContentController {
@Autowired
private BookContentService bookContentService;
@GetMapping()
@RequiresPermissions("novel:bookContent:bookContent")
String BookContent() {
return "novel/bookContent/bookContent";
}
@ApiOperation(value = "获取小说内容表列表", notes = "获取小说内容表列表")
@ResponseBody
@GetMapping("/list")
@RequiresPermissions("novel:bookContent:bookContent")
public R list(@RequestParam Map<String, Object> params) {
//查询列表数据
Query query = new Query(params);
List<BookContentDO> bookContentList = bookContentService.list(query);
int total = bookContentService.count(query);
PageBean pageBean = new PageBean(bookContentList, total);
return R.ok().put("data", pageBean);
}
@ApiOperation(value = "新增小说内容表页面", notes = "新增小说内容表页面")
@GetMapping("/add")
@RequiresPermissions("novel:bookContent:add")
String add() {
return "novel/bookContent/add";
}
@ApiOperation(value = "修改小说内容表页面", notes = "修改小说内容表页面")
@GetMapping("/edit/{id}")
@RequiresPermissions("novel:bookContent:edit")
String edit(@PathVariable("id") Long id, Model model) {
BookContentDO bookContent = bookContentService.get(id);
model.addAttribute("bookContent", bookContent);
return "novel/bookContent/edit";
}
@ApiOperation(value = "查看小说内容表页面", notes = "查看小说内容表页面")
@GetMapping("/detail/{id}")
@RequiresPermissions("novel:bookContent:detail")
String detail(@PathVariable("id") Long id, Model model) {
BookContentDO bookContent = bookContentService.get(id);
model.addAttribute("bookContent", bookContent);
return "novel/bookContent/detail";
}
/**
* 保存
*/
@ApiOperation(value = "新增小说内容表", notes = "新增小说内容表")
@ResponseBody
@PostMapping("/save")
@RequiresPermissions("novel:bookContent:add")
public R save( BookContentDO bookContent) {
if (bookContentService.save(bookContent) > 0) {
return R.ok();
}
return R.error();
}
/**
* 修改
*/
@ApiOperation(value = "修改小说内容表", notes = "修改小说内容表")
@ResponseBody
@RequestMapping("/update")
@RequiresPermissions("novel:bookContent:edit")
public R update( BookContentDO bookContent) {
bookContentService.update(bookContent);
return R.ok();
}
/**
* 删除
*/
@ApiOperation(value = "删除小说内容表", notes = "删除小说内容表")
@PostMapping("/remove")
@ResponseBody
@RequiresPermissions("novel:bookContent:remove")
public R remove( Long id) {
if (bookContentService.remove(id) > 0) {
return R.ok();
}
return R.error();
}
/**
* 删除
*/
@ApiOperation(value = "批量删除小说内容表", notes = "批量删除小说内容表")
@PostMapping("/batchRemove")
@ResponseBody
@RequiresPermissions("novel:bookContent:batchRemove")
public R remove(@RequestParam("ids[]") Long[] ids) {
bookContentService.batchRemove(ids);
return R.ok();
}
}

View File

@ -0,0 +1,135 @@
package com.java2nb.novel.controller;
import java.util.List;
import java.util.Map;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import io.swagger.annotations.ApiOperation;
import com.java2nb.novel.domain.BookIndexDO;
import com.java2nb.novel.service.BookIndexService;
import com.java2nb.common.utils.PageBean;
import com.java2nb.common.utils.Query;
import com.java2nb.common.utils.R;
/**
* 小说目录表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-14 19:51:54
*/
@Controller
@RequestMapping("/novel/bookIndex")
public class BookIndexController {
@Autowired
private BookIndexService bookIndexService;
@GetMapping()
@RequiresPermissions("novel:bookIndex:bookIndex")
String BookIndex() {
return "novel/bookIndex/bookIndex";
}
@ApiOperation(value = "获取小说目录表列表", notes = "获取小说目录表列表")
@ResponseBody
@GetMapping("/list")
@RequiresPermissions("novel:bookIndex:bookIndex")
public R list(@RequestParam Map<String, Object> params) {
//查询列表数据
Query query = new Query(params);
List<BookIndexDO> bookIndexList = bookIndexService.list(query);
int total = bookIndexService.count(query);
PageBean pageBean = new PageBean(bookIndexList, total);
return R.ok().put("data", pageBean);
}
@ApiOperation(value = "新增小说目录表页面", notes = "新增小说目录表页面")
@GetMapping("/add")
@RequiresPermissions("novel:bookIndex:add")
String add() {
return "novel/bookIndex/add";
}
@ApiOperation(value = "修改小说目录表页面", notes = "修改小说目录表页面")
@GetMapping("/edit/{id}")
@RequiresPermissions("novel:bookIndex:edit")
String edit(@PathVariable("id") Long id, Model model) {
BookIndexDO bookIndex = bookIndexService.get(id);
model.addAttribute("bookIndex", bookIndex);
return "novel/bookIndex/edit";
}
@ApiOperation(value = "查看小说目录表页面", notes = "查看小说目录表页面")
@GetMapping("/detail/{id}")
@RequiresPermissions("novel:bookIndex:detail")
String detail(@PathVariable("id") Long id, Model model) {
BookIndexDO bookIndex = bookIndexService.get(id);
model.addAttribute("bookIndex", bookIndex);
return "novel/bookIndex/detail";
}
/**
* 保存
*/
@ApiOperation(value = "新增小说目录表", notes = "新增小说目录表")
@ResponseBody
@PostMapping("/save")
@RequiresPermissions("novel:bookIndex:add")
public R save( BookIndexDO bookIndex) {
if (bookIndexService.save(bookIndex) > 0) {
return R.ok();
}
return R.error();
}
/**
* 修改
*/
@ApiOperation(value = "修改小说目录表", notes = "修改小说目录表")
@ResponseBody
@RequestMapping("/update")
@RequiresPermissions("novel:bookIndex:edit")
public R update( BookIndexDO bookIndex) {
bookIndexService.update(bookIndex);
return R.ok();
}
/**
* 删除
*/
@ApiOperation(value = "删除小说目录表", notes = "删除小说目录表")
@PostMapping("/remove")
@ResponseBody
@RequiresPermissions("novel:bookIndex:remove")
public R remove( Long id) {
if (bookIndexService.remove(id) > 0) {
return R.ok();
}
return R.error();
}
/**
* 删除
*/
@ApiOperation(value = "批量删除小说目录表", notes = "批量删除小说目录表")
@PostMapping("/batchRemove")
@ResponseBody
@RequiresPermissions("novel:bookIndex:batchRemove")
public R remove(@RequestParam("ids[]") Long[] ids) {
bookIndexService.batchRemove(ids);
return R.ok();
}
}

View File

@ -0,0 +1,134 @@
package com.java2nb.novel.controller;
import com.java2nb.common.config.CacheKey;
import com.java2nb.common.utils.PageBean;
import com.java2nb.common.utils.Query;
import com.java2nb.common.utils.R;
import com.java2nb.novel.domain.BookSettingDO;
import com.java2nb.novel.service.BookSettingService;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* 首页小说推荐
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-18 10:01:13
*/
@Controller
@RequestMapping("/novel/bookSetting")
public class BookSettingController {
@Autowired
private BookSettingService bookSettingService;
@Autowired
private StringRedisTemplate redisTemplate;
@GetMapping()
@RequiresPermissions("novel:bookSetting:bookSetting")
String BookSetting() {
return "novel/bookSetting/bookSetting";
}
@ApiOperation(value = "获取首页小说设置表列表", notes = "获取首页小说设置表列表")
@ResponseBody
@GetMapping("/list")
@RequiresPermissions("novel:bookSetting:bookSetting")
public R list(@RequestParam Map<String, Object> params) {
//查询列表数据
Query query = new Query(params);
List<BookSettingDO> bookSettingList = bookSettingService.list(query);
int total = bookSettingService.count(query);
PageBean pageBean = new PageBean(bookSettingList, total);
return R.ok().put("data", pageBean);
}
@ApiOperation(value = "新增首页小说设置表页面", notes = "新增首页小说设置表页面")
@GetMapping("/add")
@RequiresPermissions("novel:bookSetting:add")
String add() {
return "novel/bookSetting/add";
}
@ApiOperation(value = "修改首页小说设置表页面", notes = "修改首页小说设置表页面")
@GetMapping("/edit/{id}")
@RequiresPermissions("novel:bookSetting:edit")
String edit(@PathVariable("id") Long id, Model model) {
BookSettingDO bookSetting = bookSettingService.get(id);
model.addAttribute("bookSetting", bookSetting);
return "novel/bookSetting/edit";
}
@ApiOperation(value = "查看首页小说设置表页面", notes = "查看首页小说设置表页面")
@GetMapping("/detail/{id}")
@RequiresPermissions("novel:bookSetting:detail")
String detail(@PathVariable("id") Long id, Model model) {
BookSettingDO bookSetting = bookSettingService.get(id);
model.addAttribute("bookSetting", bookSetting);
return "novel/bookSetting/detail";
}
/**
* 保存
*/
@ApiOperation(value = "新增首页小说设置表", notes = "新增首页小说设置表")
@ResponseBody
@PostMapping("/save")
@RequiresPermissions("novel:bookSetting:add")
public R save(BookSettingDO bookSetting) {
if (bookSettingService.save(bookSetting) > 0) {
return R.ok();
}
return R.error();
}
/**
* 修改
*/
@ApiOperation(value = "修改首页小说设置表", notes = "修改首页小说设置表")
@ResponseBody
@RequestMapping("/update")
@RequiresPermissions("novel:bookSetting:edit")
public R update(BookSettingDO bookSetting) {
bookSettingService.update(bookSetting);
redisTemplate.delete(CacheKey.INDEX_BOOK_SETTINGS_KEY);
return R.ok();
}
/**
* 删除
*/
@ApiOperation(value = "删除首页小说设置表", notes = "删除首页小说设置表")
@PostMapping("/remove")
@ResponseBody
@RequiresPermissions("novel:bookSetting:remove")
public R remove(Long id) {
if (bookSettingService.remove(id) > 0) {
return R.ok();
}
return R.error();
}
/**
* 删除
*/
@ApiOperation(value = "批量删除首页小说设置表", notes = "批量删除首页小说设置表")
@PostMapping("/batchRemove")
@ResponseBody
@RequiresPermissions("novel:bookSetting:batchRemove")
public R remove(@RequestParam("ids[]") Long[] ids) {
bookSettingService.batchRemove(ids);
return R.ok();
}
}

View File

@ -0,0 +1,136 @@
package com.java2nb.novel.controller;
import com.java2nb.common.config.CacheKey;
import com.java2nb.common.utils.PageBean;
import com.java2nb.common.utils.Query;
import com.java2nb.common.utils.R;
import com.java2nb.novel.domain.FriendLinkDO;
import com.java2nb.novel.service.FriendLinkService;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-14 15:12:25
*/
@Controller
@RequestMapping("/novel/friendLink")
public class FriendLinkController {
@Autowired
private FriendLinkService friendLinkService;
@Autowired
private RedisTemplate<Object, Object> redisTemplate;
@GetMapping()
@RequiresPermissions("novel:friendLink:friendLink")
String FriendLink() {
return "novel/friendLink/friendLink";
}
@ApiOperation(value = "获取列表", notes = "获取列表")
@ResponseBody
@GetMapping("/list")
@RequiresPermissions("novel:friendLink:friendLink")
public R list(@RequestParam Map<String, Object> params) {
//查询列表数据
Query query = new Query(params);
List<FriendLinkDO> friendLinkList = friendLinkService.list(query);
int total = friendLinkService.count(query);
PageBean pageBean = new PageBean(friendLinkList, total);
return R.ok().put("data", pageBean);
}
@ApiOperation(value = "新增页面", notes = "新增页面")
@GetMapping("/add")
@RequiresPermissions("novel:friendLink:add")
String add() {
return "novel/friendLink/add";
}
@ApiOperation(value = "修改页面", notes = "修改页面")
@GetMapping("/edit/{id}")
@RequiresPermissions("novel:friendLink:edit")
String edit(@PathVariable("id") Integer id, Model model) {
FriendLinkDO friendLink = friendLinkService.get(id);
model.addAttribute("friendLink", friendLink);
return "novel/friendLink/edit";
}
@ApiOperation(value = "查看页面", notes = "查看页面")
@GetMapping("/detail/{id}")
@RequiresPermissions("novel:friendLink:detail")
String detail(@PathVariable("id") Integer id, Model model) {
FriendLinkDO friendLink = friendLinkService.get(id);
model.addAttribute("friendLink", friendLink);
return "novel/friendLink/detail";
}
/**
* 保存
*/
@ApiOperation(value = "新增", notes = "新增")
@ResponseBody
@PostMapping("/save")
@RequiresPermissions("novel:friendLink:add")
public R save(@Validated FriendLinkDO friendLink) {
if (friendLinkService.save(friendLink) > 0) {
redisTemplate.delete(CacheKey.INDEX_LINK_KEY);
return R.ok();
}
return R.error();
}
/**
* 修改
*/
@ApiOperation(value = "修改", notes = "修改")
@ResponseBody
@RequestMapping("/update")
@RequiresPermissions("novel:friendLink:edit")
public R update(@Validated FriendLinkDO friendLink) {
friendLinkService.update(friendLink);
redisTemplate.delete(CacheKey.INDEX_LINK_KEY);
return R.ok();
}
/**
* 删除
*/
@ApiOperation(value = "删除", notes = "删除")
@PostMapping("/remove")
@ResponseBody
@RequiresPermissions("novel:friendLink:remove")
public R remove(Integer id) {
if (friendLinkService.remove(id) > 0) {
redisTemplate.delete(CacheKey.INDEX_LINK_KEY);
return R.ok();
}
return R.error();
}
/**
* 删除
*/
@ApiOperation(value = "批量删除", notes = "批量删除")
@PostMapping("/batchRemove")
@ResponseBody
@RequiresPermissions("novel:friendLink:batchRemove")
public R remove(@RequestParam("ids[]") Integer[] ids) {
friendLinkService.batchRemove(ids);
redisTemplate.delete(CacheKey.INDEX_LINK_KEY);
return R.ok();
}
}

View File

@ -1,26 +1,21 @@
package com.java2nb.novel.controller; package com.java2nb.novel.controller;
import java.util.List; import com.java2nb.common.config.CacheKey;
import java.util.Map;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import io.swagger.annotations.ApiOperation;
import com.java2nb.novel.domain.NewsDO;
import com.java2nb.novel.service.NewsService;
import com.java2nb.common.utils.PageBean; import com.java2nb.common.utils.PageBean;
import com.java2nb.common.utils.Query; import com.java2nb.common.utils.Query;
import com.java2nb.common.utils.R; import com.java2nb.common.utils.R;
import com.java2nb.novel.domain.NewsDO;
import com.java2nb.novel.service.NewsService;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/** /**
* 新闻表 * 新闻表
@ -33,8 +28,11 @@ import com.java2nb.common.utils.R;
@Controller @Controller
@RequestMapping("/novel/news") @RequestMapping("/novel/news")
public class NewsController { public class NewsController {
@Autowired @Autowired
private NewsService newsService; private NewsService newsService;
@Autowired
private RedisTemplate<Object, Object> redisTemplate;
@GetMapping() @GetMapping()
@RequiresPermissions("novel:news:news") @RequiresPermissions("novel:news:news")
@ -66,7 +64,7 @@ public class NewsController {
@GetMapping("/edit/{id}") @GetMapping("/edit/{id}")
@RequiresPermissions("novel:news:edit") @RequiresPermissions("novel:news:edit")
String edit(@PathVariable("id") Long id, Model model) { String edit(@PathVariable("id") Long id, Model model) {
NewsDO news = newsService.get(id); NewsDO news = newsService.get(id);
model.addAttribute("news", news); model.addAttribute("news", news);
return "novel/news/edit"; return "novel/news/edit";
} }
@ -75,7 +73,7 @@ public class NewsController {
@GetMapping("/detail/{id}") @GetMapping("/detail/{id}")
@RequiresPermissions("novel:news:detail") @RequiresPermissions("novel:news:detail")
String detail(@PathVariable("id") Long id, Model model) { String detail(@PathVariable("id") Long id, Model model) {
NewsDO news = newsService.get(id); NewsDO news = newsService.get(id);
model.addAttribute("news", news); model.addAttribute("news", news);
return "novel/news/detail"; return "novel/news/detail";
} }
@ -87,8 +85,9 @@ public class NewsController {
@ResponseBody @ResponseBody
@PostMapping("/save") @PostMapping("/save")
@RequiresPermissions("novel:news:add") @RequiresPermissions("novel:news:add")
public R save( NewsDO news) { public R save(NewsDO news) {
if (newsService.save(news) > 0) { if (newsService.save(news) > 0) {
redisTemplate.delete(CacheKey.INDEX_NEWS_KEY);
return R.ok(); return R.ok();
} }
return R.error(); return R.error();
@ -101,8 +100,9 @@ public class NewsController {
@ResponseBody @ResponseBody
@RequestMapping("/update") @RequestMapping("/update")
@RequiresPermissions("novel:news:edit") @RequiresPermissions("novel:news:edit")
public R update( NewsDO news) { public R update(NewsDO news) {
newsService.update(news); newsService.update(news);
redisTemplate.delete(CacheKey.INDEX_NEWS_KEY);
return R.ok(); return R.ok();
} }
@ -113,8 +113,9 @@ public class NewsController {
@PostMapping("/remove") @PostMapping("/remove")
@ResponseBody @ResponseBody
@RequiresPermissions("novel:news:remove") @RequiresPermissions("novel:news:remove")
public R remove( Long id) { public R remove(Long id) {
if (newsService.remove(id) > 0) { if (newsService.remove(id) > 0) {
redisTemplate.delete(CacheKey.INDEX_NEWS_KEY);
return R.ok(); return R.ok();
} }
return R.error(); return R.error();
@ -128,7 +129,8 @@ public class NewsController {
@ResponseBody @ResponseBody
@RequiresPermissions("novel:news:batchRemove") @RequiresPermissions("novel:news:batchRemove")
public R remove(@RequestParam("ids[]") Long[] ids) { public R remove(@RequestParam("ids[]") Long[] ids) {
newsService.batchRemove(ids); newsService.batchRemove(ids);
redisTemplate.delete(CacheKey.INDEX_NEWS_KEY);
return R.ok(); return R.ok();
} }

View File

@ -0,0 +1,135 @@
package com.java2nb.novel.controller;
import java.util.List;
import java.util.Map;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import io.swagger.annotations.ApiOperation;
import com.java2nb.novel.domain.UserFeedbackDO;
import com.java2nb.novel.service.UserFeedbackService;
import com.java2nb.common.utils.PageBean;
import com.java2nb.common.utils.Query;
import com.java2nb.common.utils.R;
/**
*
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-18 11:08:54
*/
@Controller
@RequestMapping("/novel/userFeedback")
public class UserFeedbackController {
@Autowired
private UserFeedbackService userFeedbackService;
@GetMapping()
@RequiresPermissions("novel:userFeedback:userFeedback")
String UserFeedback() {
return "novel/userFeedback/userFeedback";
}
@ApiOperation(value = "获取列表", notes = "获取列表")
@ResponseBody
@GetMapping("/list")
@RequiresPermissions("novel:userFeedback:userFeedback")
public R list(@RequestParam Map<String, Object> params) {
//查询列表数据
Query query = new Query(params);
List<UserFeedbackDO> userFeedbackList = userFeedbackService.list(query);
int total = userFeedbackService.count(query);
PageBean pageBean = new PageBean(userFeedbackList, total);
return R.ok().put("data", pageBean);
}
@ApiOperation(value = "新增页面", notes = "新增页面")
@GetMapping("/add")
@RequiresPermissions("novel:userFeedback:add")
String add() {
return "novel/userFeedback/add";
}
@ApiOperation(value = "修改页面", notes = "修改页面")
@GetMapping("/edit/{id}")
@RequiresPermissions("novel:userFeedback:edit")
String edit(@PathVariable("id") Long id, Model model) {
UserFeedbackDO userFeedback = userFeedbackService.get(id);
model.addAttribute("userFeedback", userFeedback);
return "novel/userFeedback/edit";
}
@ApiOperation(value = "查看页面", notes = "查看页面")
@GetMapping("/detail/{id}")
@RequiresPermissions("novel:userFeedback:detail")
String detail(@PathVariable("id") Long id, Model model) {
UserFeedbackDO userFeedback = userFeedbackService.get(id);
model.addAttribute("userFeedback", userFeedback);
return "novel/userFeedback/detail";
}
/**
* 保存
*/
@ApiOperation(value = "新增", notes = "新增")
@ResponseBody
@PostMapping("/save")
@RequiresPermissions("novel:userFeedback:add")
public R save( UserFeedbackDO userFeedback) {
if (userFeedbackService.save(userFeedback) > 0) {
return R.ok();
}
return R.error();
}
/**
* 修改
*/
@ApiOperation(value = "修改", notes = "修改")
@ResponseBody
@RequestMapping("/update")
@RequiresPermissions("novel:userFeedback:edit")
public R update( UserFeedbackDO userFeedback) {
userFeedbackService.update(userFeedback);
return R.ok();
}
/**
* 删除
*/
@ApiOperation(value = "删除", notes = "删除")
@PostMapping("/remove")
@ResponseBody
@RequiresPermissions("novel:userFeedback:remove")
public R remove( Long id) {
if (userFeedbackService.remove(id) > 0) {
return R.ok();
}
return R.error();
}
/**
* 删除
*/
@ApiOperation(value = "批量删除", notes = "批量删除")
@PostMapping("/batchRemove")
@ResponseBody
@RequiresPermissions("novel:userFeedback:batchRemove")
public R remove(@RequestParam("ids[]") Long[] ids) {
userFeedbackService.batchRemove(ids);
return R.ok();
}
}

View File

@ -0,0 +1,50 @@
package com.java2nb.novel.controller;
import com.java2nb.common.utils.R;
import com.java2nb.novel.domain.WebsiteInfoDO;
import com.java2nb.novel.service.WebsiteInfoService;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 网站信息表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-14 11:05:43
*/
@Controller
@RequestMapping("/novel/websiteInfo")
public class WebsiteInfoController {
@Autowired
private WebsiteInfoService websiteInfoService;
@GetMapping()
@RequiresPermissions("novel:websiteInfo:websiteInfo")
String detail(Model model) {
WebsiteInfoDO websiteInfo = websiteInfoService.get(1L);
model.addAttribute("websiteInfo", websiteInfo);
return "novel/websiteInfo/detail";
}
/**
* 修改
*/
@ApiOperation(value = "修改网站信息表", notes = "修改网站信息表")
@ResponseBody
@RequestMapping("/update")
@RequiresPermissions("novel:websiteInfo:edit")
public R update(WebsiteInfoDO websiteInfo) {
websiteInfoService.update(websiteInfo);
return R.ok();
}
}

View File

@ -0,0 +1,32 @@
package com.java2nb.novel.dao;
import com.java2nb.novel.domain.BookCommentDO;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
/**
* 小说评论表
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-14 21:59:28
*/
@Mapper
public interface BookCommentDao {
BookCommentDO get(Long id);
List<BookCommentDO> list(Map<String,Object> map);
int count(Map<String,Object> map);
int save(BookCommentDO bookComment);
int update(BookCommentDO bookComment);
int remove(Long id);
int batchRemove(Long[] ids);
}

View File

@ -0,0 +1,34 @@
package com.java2nb.novel.dao;
import com.java2nb.novel.domain.BookContentDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;
/**
* 小说内容表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-14 19:52:06
*/
@Mapper
public interface BookContentDao {
BookContentDO get(Long id);
List<BookContentDO> list(Map<String, Object> map);
int count(Map<String, Object> map);
int save(BookContentDO bookContent);
int update(BookContentDO bookContent);
int remove(Long id);
int batchRemove(Long[] ids);
int removeByIndexIds(Long[] indexIds);
}

View File

@ -1,15 +1,15 @@
package com.java2nb.novel.dao; package com.java2nb.novel.dao;
import com.java2nb.novel.domain.BookDO; import com.java2nb.novel.domain.BookDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
/** /**
* 小说表 * 小说表
*
* @author xiongxy * @author xiongxy
* @email 1179705413@qq.com * @email 1179705413@qq.com
* @date 2020-12-01 03:49:46 * @date 2020-12-01 03:49:46
@ -17,19 +17,22 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface BookDao { public interface BookDao {
BookDO get(Long id); BookDO get(Long id);
List<BookDO> list(Map<String,Object> map); List<BookDO> list(Map<String, Object> map);
int count(Map<String,Object> map); int count(Map<String, Object> map);
int save(BookDO book); int save(BookDO book);
int update(BookDO book); int update(BookDO book);
int remove(Long id); int remove(Long id);
int batchRemove(Long[] ids); int batchRemove(Long[] ids);
List<Map<Object, Object>> tableSta(Date minDate); List<Map<Object, Object>> tableSta(Date minDate);
List<BookDO> batchGet(List<Long> ids);
} }

View File

@ -0,0 +1,34 @@
package com.java2nb.novel.dao;
import com.java2nb.novel.domain.BookIndexDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;
/**
* 小说目录表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-14 19:51:54
*/
@Mapper
public interface BookIndexDao {
BookIndexDO get(Long id);
List<BookIndexDO> list(Map<String, Object> map);
int count(Map<String, Object> map);
int save(BookIndexDO bookIndex);
int update(BookIndexDO bookIndex);
int remove(Long id);
int batchRemove(Long[] ids);
List<Long> getIdsByBookId(Long bookId);
}

View File

@ -0,0 +1,32 @@
package com.java2nb.novel.dao;
import com.java2nb.novel.domain.BookSettingDO;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
/**
* 首页小说设置表
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-18 10:01:13
*/
@Mapper
public interface BookSettingDao {
BookSettingDO get(Long id);
List<BookSettingDO> list(Map<String,Object> map);
int count(Map<String,Object> map);
int save(BookSettingDO bookSetting);
int update(BookSettingDO bookSetting);
int remove(Long id);
int batchRemove(Long[] ids);
}

View File

@ -0,0 +1,32 @@
package com.java2nb.novel.dao;
import com.java2nb.novel.domain.FriendLinkDO;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
/**
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-14 15:12:25
*/
@Mapper
public interface FriendLinkDao {
FriendLinkDO get(Integer id);
List<FriendLinkDO> list(Map<String,Object> map);
int count(Map<String,Object> map);
int save(FriendLinkDO friendLink);
int update(FriendLinkDO friendLink);
int remove(Integer id);
int batchRemove(Integer[] ids);
}

View File

@ -1,15 +1,13 @@
package com.java2nb.novel.dao; package com.java2nb.novel.dao;
import com.java2nb.novel.domain.UserDO; import com.java2nb.novel.domain.UserDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
/** /**
*
* @author xiongxy * @author xiongxy
* @email 1179705413@qq.com * @email 1179705413@qq.com
* @date 2020-12-01 03:49:08 * @date 2020-12-01 03:49:08
@ -17,19 +15,21 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface UserDao { public interface UserDao {
UserDO get(Long id); UserDO get(Long id);
List<UserDO> list(Map<String,Object> map); List<UserDO> list(Map<String, Object> map);
int count(Map<String,Object> map); int count(Map<String, Object> map);
int save(UserDO user); int save(UserDO user);
int update(UserDO user); int update(UserDO user);
int remove(Long id); int remove(Long id);
int batchRemove(Long[] ids); int batchRemove(Long[] ids);
List<Map<Object, Object>> tableSta(Date minDate); List<Map<Object, Object>> tableSta(Date minDate);
List<UserDO> batchGet(List<Long> userIds);
} }

View File

@ -0,0 +1,32 @@
package com.java2nb.novel.dao;
import com.java2nb.novel.domain.UserFeedbackDO;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
/**
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-18 11:08:54
*/
@Mapper
public interface UserFeedbackDao {
UserFeedbackDO get(Long id);
List<UserFeedbackDO> list(Map<String,Object> map);
int count(Map<String,Object> map);
int save(UserFeedbackDO userFeedback);
int update(UserFeedbackDO userFeedback);
int remove(Long id);
int batchRemove(Long[] ids);
}

View File

@ -0,0 +1,32 @@
package com.java2nb.novel.dao;
import com.java2nb.novel.domain.WebsiteInfoDO;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
/**
* 网站信息表
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-14 11:05:43
*/
@Mapper
public interface WebsiteInfoDao {
WebsiteInfoDO get(Long id);
List<WebsiteInfoDO> list(Map<String,Object> map);
int count(Map<String,Object> map);
int save(WebsiteInfoDO websiteInfo);
int update(WebsiteInfoDO websiteInfo);
int remove(Long id);
int batchRemove(Long[] ids);
}

View File

@ -0,0 +1,165 @@
package com.java2nb.novel.domain;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.java2nb.common.jsonserializer.LongToStringSerializer;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
* 小说评论表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-14 21:59:28
*/
public class BookCommentDO implements Serializable {
private static final long serialVersionUID = 1L;
//主键
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long id;
//小说ID
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long bookId;
//评价内容
private String commentContent;
//回复数量
private Integer replyCount;
//审核状态0待审核1审核通过2审核不通过
private Integer auditStatus;
//评价时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
//评价人
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long createUserId;
private String bookName;
private String userName;
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
/**
* 设置:主键
*/
public void setId(Long id) {
this.id = id;
}
/**
* 获取:主键
*/
public Long getId() {
return id;
}
/**
* 设置小说ID
*/
public void setBookId(Long bookId) {
this.bookId = bookId;
}
/**
* 获取小说ID
*/
public Long getBookId() {
return bookId;
}
/**
* 设置:评价内容
*/
public void setCommentContent(String commentContent) {
this.commentContent = commentContent;
}
/**
* 获取:评价内容
*/
public String getCommentContent() {
return commentContent;
}
/**
* 设置:回复数量
*/
public void setReplyCount(Integer replyCount) {
this.replyCount = replyCount;
}
/**
* 获取:回复数量
*/
public Integer getReplyCount() {
return replyCount;
}
/**
* 设置审核状态0待审核1审核通过2审核不通过
*/
public void setAuditStatus(Integer auditStatus) {
this.auditStatus = auditStatus;
}
/**
* 获取审核状态0待审核1审核通过2审核不通过
*/
public Integer getAuditStatus() {
return auditStatus;
}
/**
* 设置:评价时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:评价时间
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置:评价人
*/
public void setCreateUserId(Long createUserId) {
this.createUserId = createUserId;
}
/**
* 获取:评价人
*/
public Long getCreateUserId() {
return createUserId;
}
}

View File

@ -0,0 +1,77 @@
package com.java2nb.novel.domain;
import java.io.Serializable;
import java.math.BigDecimal;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.java2nb.common.jsonserializer.LongToStringSerializer;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 小说内容表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-14 19:52:06
*/
public class BookContentDO implements Serializable {
private static final long serialVersionUID = 1L;
//主键
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long id;
//目录ID
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long indexId;
//小说章节内容
private String content;
/**
* 设置:主键
*/
public void setId(Long id) {
this.id = id;
}
/**
* 获取:主键
*/
public Long getId() {
return id;
}
/**
* 设置目录ID
*/
public void setIndexId(Long indexId) {
this.indexId = indexId;
}
/**
* 获取目录ID
*/
public Long getIndexId() {
return indexId;
}
/**
* 设置:小说章节内容
*/
public void setContent(String content) {
this.content = content;
}
/**
* 获取:小说章节内容
*/
public String getContent() {
return content;
}
}

View File

@ -1,493 +1,455 @@
package com.java2nb.novel.domain; package com.java2nb.novel.domain;
import java.io.Serializable;
import java.math.BigDecimal;
import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.java2nb.common.jsonserializer.LongToStringSerializer; import com.java2nb.common.jsonserializer.LongToStringSerializer;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.io.Serializable;
import java.util.Date;
/** /**
* 小说表 * 小说表
* *
* @author xiongxy * @author xiongxy
* @email 1179705413@qq.com * @email 1179705413@qq.com
* @date 2020-12-01 03:49:46 * @date 2023-04-14 17:42:55
*/ */
public class BookDO implements Serializable { public class BookDO implements Serializable {
private static final long serialVersionUID = 1L;
private static final long serialVersionUID = 1L;
//主键
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long id;
//作品方向0男频1女频'
private Integer workDirection;
//分类ID
private Integer catId;
//分类名
private String catName;
//子分类ID
private Integer catChildId;
//子分类名
private String catChildName;
//小说封面
private String picUrl;
//小说名
private String bookName;
//男主角姓名
private String heroName;
//女主角姓名
private String ladyName;
//作品风格0甜宠1虐恋2其他
private Integer bookStyle;
//作品标签
private String bookLabel;
//作者id
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long authorId;
//作者名
private String authorName;
//书籍描述
private String bookDesc;
//评分,预留字段
private Float score;
//书籍状态0连载中1已完结
private Integer bookStatus;
//点击量
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long visitCount;
//总字数
private Integer wordCount;
//评论数
private Integer commentCount;
//昨日订阅数
private Integer yesterdayBuy;
//最新目录ID
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long lastIndexId;
//最新目录名
private String lastIndexName;
//最新目录更新时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date lastIndexUpdateTime;
//是否收费1收费0免费
private Integer isVip;
//状态0入库1上架
private Integer status;
//更新时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
//创建时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
//爬虫源站ID
private Integer crawlSourceId;
//抓取的源站小说ID
private String crawlBookId;
//最后一次的抓取时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date crawlLastTime;
//是否已停止更新0未停止1已停止
private Integer crawlIsStop;
/**
* 设置:主键 //主键
*/ //java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
public void setId(Long id) { //所以通过序列化成字符串来解决
this.id = id; @JsonSerialize(using = LongToStringSerializer.class)
} private Long id;
/** //作品方向0男频1女频'
* 获取:主键 private Integer workDirection;
*/ //分类ID
public Long getId() { private Integer catId;
return id; //分类名
} private String catName;
/** //小说封面
* 设置作品方向0男频1女频' private String picUrl;
*/ //小说名
public void setWorkDirection(Integer workDirection) { private String bookName;
this.workDirection = workDirection; //作者id
} //java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
/** //所以通过序列化成字符串来解决
* 获取作品方向0男频1女频' @JsonSerialize(using = LongToStringSerializer.class)
*/ private Long authorId;
public Integer getWorkDirection() { //作者名
return workDirection; private String authorName;
} //书籍描述
/** private String bookDesc;
* 设置分类ID //评分,预留字段
*/ private Float score;
public void setCatId(Integer catId) { //书籍状态0连载中1已完结
this.catId = catId; private Integer bookStatus;
} //点击量
/** //java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
* 获取分类ID //所以通过序列化成字符串来解决
*/ @JsonSerialize(using = LongToStringSerializer.class)
public Integer getCatId() { private Long visitCount;
return catId; //总字数
} private Integer wordCount;
/** //评论数
* 设置:分类名 private Integer commentCount;
*/ //昨日订阅数
public void setCatName(String catName) { private Integer yesterdayBuy;
this.catName = catName; //最新目录ID
} //java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
/** //所以通过序列化成字符串来解决
* 获取:分类名 @JsonSerialize(using = LongToStringSerializer.class)
*/ private Long lastIndexId;
public String getCatName() { //最新目录名
return catName; private String lastIndexName;
} //最新目录更新时间
/** @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
* 设置子分类ID private Date lastIndexUpdateTime;
*/ //是否收费1收费0免费
public void setCatChildId(Integer catChildId) { private Integer isVip;
this.catChildId = catChildId; //状态0入库1上架
} private Integer status;
/** //更新时间
* 获取子分类ID @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
*/ private Date updateTime;
public Integer getCatChildId() { //创建时间
return catChildId; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
} private Date createTime;
/** //爬虫源站ID
* 设置:子分类名 private Integer crawlSourceId;
*/ //抓取的源站小说ID
public void setCatChildName(String catChildName) { private String crawlBookId;
this.catChildName = catChildName; //最后一次的抓取时间
} @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
/** private Date crawlLastTime;
* 获取:子分类名 //是否已停止更新0未停止1已停止
*/ private Integer crawlIsStop;
public String getCatChildName() {
return catChildName; /**
} * 设置:主键
/** */
* 设置:小说封面 public void setId(Long id) {
*/ this.id = id;
public void setPicUrl(String picUrl) { }
this.picUrl = picUrl;
} /**
/** * 获取:主键
* 获取:小说封面 */
*/ public Long getId() {
public String getPicUrl() { return id;
return picUrl; }
}
/** /**
* 设置:小说名 * 设置:作品方向0男频1女频'
*/ */
public void setBookName(String bookName) { public void setWorkDirection(Integer workDirection) {
this.bookName = bookName; this.workDirection = workDirection;
} }
/**
* 获取:小说名 /**
*/ * 获取作品方向0男频1女频'
public String getBookName() { */
return bookName; public Integer getWorkDirection() {
} return workDirection;
/** }
* 设置:男主角姓名
*/ /**
public void setHeroName(String heroName) { * 设置分类ID
this.heroName = heroName; */
} public void setCatId(Integer catId) {
/** this.catId = catId;
* 获取:男主角姓名 }
*/
public String getHeroName() { /**
return heroName; * 获取分类ID
} */
/** public Integer getCatId() {
* 设置:女主角姓名 return catId;
*/ }
public void setLadyName(String ladyName) {
this.ladyName = ladyName; /**
} * 设置:分类名
/** */
* 获取:女主角姓名 public void setCatName(String catName) {
*/ this.catName = catName;
public String getLadyName() { }
return ladyName;
} /**
/** * 获取:分类名
* 设置作品风格0甜宠1虐恋2其他 */
*/ public String getCatName() {
public void setBookStyle(Integer bookStyle) { return catName;
this.bookStyle = bookStyle; }
}
/** /**
* 获取作品风格0甜宠1虐恋2其他 * 设置:小说封面
*/ */
public Integer getBookStyle() { public void setPicUrl(String picUrl) {
return bookStyle; this.picUrl = picUrl;
} }
/**
* 设置:作品标签 /**
*/ * 获取:小说封面
public void setBookLabel(String bookLabel) { */
this.bookLabel = bookLabel; public String getPicUrl() {
} return picUrl;
/** }
* 获取:作品标签
*/ /**
public String getBookLabel() { * 设置:小说名
return bookLabel; */
} public void setBookName(String bookName) {
/** this.bookName = bookName;
* 设置作者id }
*/
public void setAuthorId(Long authorId) { /**
this.authorId = authorId; * 获取:小说名
} */
/** public String getBookName() {
* 获取作者id return bookName;
*/ }
public Long getAuthorId() {
return authorId; /**
} * 设置作者id
/** */
* 设置:作者名 public void setAuthorId(Long authorId) {
*/ this.authorId = authorId;
public void setAuthorName(String authorName) { }
this.authorName = authorName;
} /**
/** * 获取作者id
* 获取:作者名 */
*/ public Long getAuthorId() {
public String getAuthorName() { return authorId;
return authorName; }
}
/** /**
* 设置:书籍描述 * 设置:作者名
*/ */
public void setBookDesc(String bookDesc) { public void setAuthorName(String authorName) {
this.bookDesc = bookDesc; this.authorName = authorName;
} }
/**
* 获取:书籍描述 /**
*/ * 获取:作者名
public String getBookDesc() { */
return bookDesc; public String getAuthorName() {
} return authorName;
/** }
* 设置:评分,预留字段
*/ /**
public void setScore(Float score) { * 设置:书籍描述
this.score = score; */
} public void setBookDesc(String bookDesc) {
/** this.bookDesc = bookDesc;
* 获取:评分,预留字段 }
*/
public Float getScore() { /**
return score; * 获取:书籍描述
} */
/** public String getBookDesc() {
* 设置书籍状态0连载中1已完结 return bookDesc;
*/ }
public void setBookStatus(Integer bookStatus) {
this.bookStatus = bookStatus; /**
} * 设置:评分,预留字段
/** */
* 获取书籍状态0连载中1已完结 public void setScore(Float score) {
*/ this.score = score;
public Integer getBookStatus() { }
return bookStatus;
} /**
/** * 获取:评分,预留字段
* 设置:点击量 */
*/ public Float getScore() {
public void setVisitCount(Long visitCount) { return score;
this.visitCount = visitCount; }
}
/** /**
* 获取:点击量 * 设置书籍状态0连载中1已完结
*/ */
public Long getVisitCount() { public void setBookStatus(Integer bookStatus) {
return visitCount; this.bookStatus = bookStatus;
} }
/**
* 设置:总字数 /**
*/ * 获取书籍状态0连载中1已完结
public void setWordCount(Integer wordCount) { */
this.wordCount = wordCount; public Integer getBookStatus() {
} return bookStatus;
/** }
* 获取:总字数
*/ /**
public Integer getWordCount() { * 设置:点击量
return wordCount; */
} public void setVisitCount(Long visitCount) {
/** this.visitCount = visitCount;
* 设置:评论数 }
*/
public void setCommentCount(Integer commentCount) { /**
this.commentCount = commentCount; * 获取:点击量
} */
/** public Long getVisitCount() {
* 获取:评论数 return visitCount;
*/ }
public Integer getCommentCount() {
return commentCount; /**
} * 设置:总字数
/** */
* 设置:昨日订阅数 public void setWordCount(Integer wordCount) {
*/ this.wordCount = wordCount;
public void setYesterdayBuy(Integer yesterdayBuy) { }
this.yesterdayBuy = yesterdayBuy;
} /**
/** * 获取:总字数
* 获取:昨日订阅数 */
*/ public Integer getWordCount() {
public Integer getYesterdayBuy() { return wordCount;
return yesterdayBuy; }
}
/** /**
* 设置:最新目录ID * 设置:评论数
*/ */
public void setLastIndexId(Long lastIndexId) { public void setCommentCount(Integer commentCount) {
this.lastIndexId = lastIndexId; this.commentCount = commentCount;
} }
/**
* 获取最新目录ID /**
*/ * 获取:评论数
public Long getLastIndexId() { */
return lastIndexId; public Integer getCommentCount() {
} return commentCount;
/** }
* 设置:最新目录名
*/ /**
public void setLastIndexName(String lastIndexName) { * 设置:昨日订阅数
this.lastIndexName = lastIndexName; */
} public void setYesterdayBuy(Integer yesterdayBuy) {
/** this.yesterdayBuy = yesterdayBuy;
* 获取:最新目录名 }
*/
public String getLastIndexName() { /**
return lastIndexName; * 获取:昨日订阅数
} */
/** public Integer getYesterdayBuy() {
* 设置:最新目录更新时间 return yesterdayBuy;
*/ }
public void setLastIndexUpdateTime(Date lastIndexUpdateTime) {
this.lastIndexUpdateTime = lastIndexUpdateTime; /**
} * 设置最新目录ID
/** */
* 获取:最新目录更新时间 public void setLastIndexId(Long lastIndexId) {
*/ this.lastIndexId = lastIndexId;
public Date getLastIndexUpdateTime() { }
return lastIndexUpdateTime;
} /**
/** * 获取最新目录ID
* 设置是否收费1收费0免费 */
*/ public Long getLastIndexId() {
public void setIsVip(Integer isVip) { return lastIndexId;
this.isVip = isVip; }
}
/** /**
* 获取是否收费1收费0免费 * 设置:最新目录名
*/ */
public Integer getIsVip() { public void setLastIndexName(String lastIndexName) {
return isVip; this.lastIndexName = lastIndexName;
} }
/**
* 设置状态0入库1上架 /**
*/ * 获取:最新目录名
public void setStatus(Integer status) { */
this.status = status; public String getLastIndexName() {
} return lastIndexName;
/** }
* 获取状态0入库1上架
*/ /**
public Integer getStatus() { * 设置:最新目录更新时间
return status; */
} public void setLastIndexUpdateTime(Date lastIndexUpdateTime) {
/** this.lastIndexUpdateTime = lastIndexUpdateTime;
* 设置:更新时间 }
*/
public void setUpdateTime(Date updateTime) { /**
this.updateTime = updateTime; * 获取:最新目录更新时间
} */
/** public Date getLastIndexUpdateTime() {
* 获取:更新时间 return lastIndexUpdateTime;
*/ }
public Date getUpdateTime() {
return updateTime; /**
} * 设置是否收费1收费0免费
/** */
* 设置:创建时间 public void setIsVip(Integer isVip) {
*/ this.isVip = isVip;
public void setCreateTime(Date createTime) { }
this.createTime = createTime;
} /**
/** * 获取是否收费1收费0免费
* 获取:创建时间 */
*/ public Integer getIsVip() {
public Date getCreateTime() { return isVip;
return createTime; }
}
/** /**
* 设置:爬虫源站ID * 设置:状态0入库1上架
*/ */
public void setCrawlSourceId(Integer crawlSourceId) { public void setStatus(Integer status) {
this.crawlSourceId = crawlSourceId; this.status = status;
} }
/**
* 获取爬虫源站ID /**
*/ * 获取状态0入库1上架
public Integer getCrawlSourceId() { */
return crawlSourceId; public Integer getStatus() {
} return status;
/** }
* 设置抓取的源站小说ID
*/ /**
public void setCrawlBookId(String crawlBookId) { * 设置:更新时间
this.crawlBookId = crawlBookId; */
} public void setUpdateTime(Date updateTime) {
/** this.updateTime = updateTime;
* 获取抓取的源站小说ID }
*/
public String getCrawlBookId() { /**
return crawlBookId; * 获取:更新时间
} */
/** public Date getUpdateTime() {
* 设置:最后一次的抓取时间 return updateTime;
*/ }
public void setCrawlLastTime(Date crawlLastTime) {
this.crawlLastTime = crawlLastTime; /**
} * 设置:创建时间
/** */
* 获取:最后一次的抓取时间 public void setCreateTime(Date createTime) {
*/ this.createTime = createTime;
public Date getCrawlLastTime() { }
return crawlLastTime;
} /**
/** * 获取:创建时间
* 设置是否已停止更新0未停止1已停止 */
*/ public Date getCreateTime() {
public void setCrawlIsStop(Integer crawlIsStop) { return createTime;
this.crawlIsStop = crawlIsStop; }
}
/** /**
* 获取是否已停止更新0未停止1已停止 * 设置爬虫源站ID
*/ */
public Integer getCrawlIsStop() { public void setCrawlSourceId(Integer crawlSourceId) {
return crawlIsStop; this.crawlSourceId = crawlSourceId;
} }
/**
* 获取爬虫源站ID
*/
public Integer getCrawlSourceId() {
return crawlSourceId;
}
/**
* 设置抓取的源站小说ID
*/
public void setCrawlBookId(String crawlBookId) {
this.crawlBookId = crawlBookId;
}
/**
* 获取抓取的源站小说ID
*/
public String getCrawlBookId() {
return crawlBookId;
}
/**
* 设置:最后一次的抓取时间
*/
public void setCrawlLastTime(Date crawlLastTime) {
this.crawlLastTime = crawlLastTime;
}
/**
* 获取:最后一次的抓取时间
*/
public Date getCrawlLastTime() {
return crawlLastTime;
}
/**
* 设置是否已停止更新0未停止1已停止
*/
public void setCrawlIsStop(Integer crawlIsStop) {
this.crawlIsStop = crawlIsStop;
}
/**
* 获取是否已停止更新0未停止1已停止
*/
public Integer getCrawlIsStop() {
return crawlIsStop;
}
} }

Some files were not shown because too many files have changed in this diff Show More