Compare commits

...

215 Commits

Author SHA1 Message Date
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
xxy
5d70e44021 Update README.md 2022-07-15 00:49:35 +08:00
607deaa82f build: v3.6.2 发布 2022-07-15 00:44:10 +08:00
b997367f1a Merge github.com:201206030/novel-plus into develop_xxy 2022-07-15 00:32:30 +08:00
3d3cbc22b6 feat: 增加 HTTP 代理配置,助力爬虫采集 2022-07-14 23:41:47 +08:00
ba272bd89a feat: 增加 HTTP 代理配置,助力爬虫采集 2022-07-14 22:14:11 +08:00
xxy
7d1b024c4d Update README.md 2022-07-14 17:48:10 +08:00
xxy
e732c0fdee Update README.md 2022-07-14 17:47:29 +08:00
xxy
78de1de846 Update README.md 2022-07-14 17:45:36 +08:00
0b728b9fe5 docs: 修改 sql 文件说明 2022-07-14 14:19:05 +08:00
ec3428c358 docs: 增加 sql 说明 2022-07-14 14:09:43 +08:00
xxy
3c322a9d0e Update README.md 2022-07-14 13:44:54 +08:00
xxy
cdceb3818d Update README.md 2022-07-14 13:40:23 +08:00
6fc2df9b5a docs: 更新源码安装教程 2022-07-14 11:34:25 +08:00
c45b81fbbf build: 优化打包 2022-07-14 09:49:36 +08:00
40a999f353 perf: 模版更新 2022-07-14 09:48:22 +08:00
547bf00f46 docs: update README.md 2022-05-22 21:43:47 +08:00
xxy
d6849bc5a2 update README.md. 2022-05-17 23:00:29 +00:00
xxy
dc654086f3 update README.md. 2022-05-17 03:22:26 +00:00
xxy
303cc2051f update README.md 2022-05-17 03:19:22 +00:00
fe90345f0b fix: 首页小说推荐数据渲染
顶部推荐栏重复渲染同一本小说
2022-05-01 10:29:09 +08:00
7ac4b62840 update 2022-04-27 19:48:47 +08:00
029cce959b update 2022-04-27 19:41:23 +08:00
7395cf63e5 add: 启动日志 2022-04-26 09:15:24 +08:00
906e7762c9 Merge github.com:201206030/novel-plus into develop_xxy 2022-01-17 21:03:39 +08:00
465e03a17b perf: 缓存预编译的Pattern对象 2022-01-17 20:58:57 +08:00
2a69a28a0c perf: 预加载IdWorker 2022-01-08 11:59:28 +08:00
c1eb7b8954 docs: 增加说明 2022-01-07 18:02:46 +08:00
16e381f384 chore(sh): 修改JVM启动参数
兼容低配置机器
2022-01-07 17:24:20 +08:00
094ac95428 build(pom): 打包时复制common模块配置文件到外部 2021-12-28 14:40:16 +08:00
96662fcb17 feat(crawl): 新增编辑规则和测试规则
合并mstaer分支的pull request #71
2021-12-24 17:38:23 +08:00
fecf03b3f5 fix: 升级mybatis版本,增加Optional支持 2021-12-24 11:35:59 +08:00
e7f702ece0 docs: 微信群说明 2021-12-23 10:27:05 +08:00
b2c67c4f15 build: 修改打包配置 2021-12-17 19:53:21 +08:00
6a385877ac Merge pull request #69 from a100488/feature/saw_fenbao
feat(打包改为分包): 打包改为分包
2021-12-17 16:45:13 +08:00
7cde6ebf61 feat(打包改为分包): 打包改为分包 2021-12-17 16:33:45 +08:00
78969f9fd1 fix: 修复单本小说采集即使没有采集到内容仍然标记状态为采集成功的问题 2021-12-17 10:20:59 +08:00
b2eb6686e9 build: 更新xxyopen依赖版本 2021-12-12 20:44:09 +08:00
c537f6fb20 docs: maven仓库配置说明 2021-12-11 20:56:11 +08:00
16e4c98a45 refactor: 引入xxy-common相关依赖 2021-12-11 18:30:22 +08:00
776083076c update 2021-11-11 14:28:05 +08:00
2bf945fe0e 样式调整 2021-11-08 19:55:03 +08:00
ede7aca66d 作家作品列表分页修复 2021-09-27 22:35:48 +08:00
396452b46e 3.6.1发布 2021-09-13 22:24:08 +08:00
fc2ea40c6a 实现小说内容多种存储方式(txt、db..)并存 2021-09-13 22:21:50 +08:00
bfe4d938fd 去除重复依赖 2021-09-11 22:07:14 +08:00
7f4728191a 修改配置项命名 2021-09-04 16:27:02 +08:00
80b393fdda v3.6.0发布 2021-08-17 21:14:15 +08:00
e7897c988a 更新文档 2021-08-17 20:00:53 +08:00
750c8dee02 增加小说内容TXT文本存储方案(一行配置切换) 2021-08-17 19:55:24 +08:00
cbfd0b049f 爬虫部分代码重构,准备适配TXT文本存储方案 2021-08-17 11:08:51 +08:00
7f0331e095 解决爬虫运行时的UnrecognizedPropertyException 2021-08-16 15:58:32 +08:00
3520200a87 部分代码重构 2021-08-16 15:42:56 +08:00
4939bcf418 模版更新 2021-08-09 19:46:32 +08:00
1cffbae495 增加新闻阅读数 2021-07-26 19:06:57 +08:00
b99b6ae4f2 新闻详情时间显示 2021-07-24 17:52:25 +08:00
2e2a58c84b Merge pull request #41 from 201206030/dependabot/maven/novel-admin/org.apache.shiro-shiro-spring-1.7.0
Bump shiro-spring from 1.3.2 to 1.7.0 in /novel-admin
2021-07-24 16:54:19 +08:00
4fe36a8f4f 部分爬虫代码优化 2021-07-24 15:51:54 +08:00
b5df86d5c7 perf(index.html): orange模版更新 2021-07-03 12:00:17 +08:00
9b3ba1d8c1 perf(index): 首页优化 2021-07-03 11:51:47 +08:00
c4db754d23 docs(readme): 更新官网地址 2021-06-10 09:42:07 +08:00
8d3ce53dba build(pom): v3.5.4发布 2021-06-01 23:14:35 +08:00
d32d9d8410 perf(html): 模版更新 2021-06-01 23:13:18 +08:00
05ae012e05 fix(yml): Public Key Retrieval is not allowed 2021-06-01 23:03:15 +08:00
b60a0c9b40 perf(监控): 设置druid监控信息登陆后查看 2021-06-01 22:49:23 +08:00
3efaf8ce5f perf(评论): 优化评论显示 2021-06-01 22:01:05 +08:00
ebc4210774 fix(章节更新): xss 2021-06-01 21:44:18 +08:00
655ec90906 fix(data submit): Xss攻击 2021-06-01 20:58:06 +08:00
f28dd867ef v3.5.3发布 2021-05-28 20:32:08 +08:00
8e6842a495 模版更新 2021-05-28 20:08:45 +08:00
928cb2417f 小说详情页优化 2021-05-28 20:04:52 +08:00
625694ba1e Merge branch 'release_3.5.3' into develop_xxy 2021-05-28 11:54:24 +08:00
d6c0337c09 首页SEO优化 2021-05-28 11:51:11 +08:00
689efc0807 style(novel-common/bean): ResultBean更新
代码格式化,去除多余分号
2021-05-16 10:54:25 +08:00
4540c3781e 模版更新 2021-05-16 09:49:35 +08:00
9d2c453bb0 图片上传流程优化 2021-05-16 09:47:23 +08:00
xxy
9de47ce697 update README.md. 2021-04-25 07:39:56 +08:00
c79974ff77 3.5.2发布 2021-04-24 10:46:59 +08:00
fb0098aef8 作家后台新增作品封片图片修改功能 2021-04-24 10:38:55 +08:00
e83494cb17 Bump shiro-spring from 1.3.2 to 1.7.0 in /novel-admin
Bumps shiro-spring from 1.3.2 to 1.7.0.

Signed-off-by: dependabot[bot] <support@github.com>
2021-04-22 17:07:42 +00:00
419d7a971b 优化首页显示(修改周推小说数量) 2021-02-11 18:03:27 +08:00
83eda2a44d 模版更新 2021-02-11 12:25:04 +08:00
3182029bdd 文件压缩 2021-02-11 10:26:48 +08:00
19d4a9960d 使用图片懒加载优化首页加载速度 2021-02-11 09:36:03 +08:00
2603150b33 作家专区的跳转方式改为新标签页跳转 2021-02-11 08:31:27 +08:00
f5e440390b 修改404页面自动跳转首页的时间 2021-02-11 08:27:11 +08:00
91e525ec8e v3.5.1发布 2021-02-05 00:39:25 +08:00
83afb9e6e2 新增内置爬虫源i笔趣阁 2021-02-05 00:17:19 +08:00
19d4c6b778 修复部分分页接口的查询bug 2021-02-04 23:59:26 +08:00
d22200b8c7 文档update 2021-01-28 09:00:36 +08:00
43fe1150fd 文档update 2021-01-28 08:58:20 +08:00
65b65f874f 文档update 2021-01-28 08:46:56 +08:00
3b6bc859a5 文档update 2021-01-28 08:35:08 +08:00
cfc55a6c92 update 2021-01-28 08:33:05 +08:00
0a80c5662d update 2021-01-28 08:28:03 +08:00
02fd0d7e25 模版更新 2021-01-25 18:10:47 +08:00
521142a792 v3.5.1发布 2021-01-25 16:56:41 +08:00
c567e37423 v3.5.1发布 2021-01-25 14:56:05 +08:00
b5e0814eb4 小说内容页性能优化 2021-01-25 14:14:54 +08:00
ca6c2aec96 update 2021-01-24 14:07:14 +08:00
34859c839b update 2021-01-22 10:18:25 +08:00
039f9d9cf8 update 2021-01-21 21:03:08 +08:00
224829dd1f v3.5.0发布 2021-01-19 19:39:33 +08:00
1a5122209a 个人中心新增头像设置 2021-01-19 19:34:14 +08:00
48aff7cf37 个人中心新增头像设置 2021-01-19 19:32:32 +08:00
e673f9be9d 新增启动banner 2021-01-19 19:00:54 +08:00
20469bd669 增加生产环境配置 2021-01-19 18:53:47 +08:00
755300db3c update 2021-01-14 23:26:38 +08:00
a790f8042d update 2021-01-14 23:22:03 +08:00
d0db2021a6 v3.4.1发布 2021-01-10 17:55:48 +08:00
c403fc7496 更新orange主题手机端首尾章节跳转逻辑 2021-01-07 20:59:19 +08:00
e4927d7ac6 爬虫管理系统设置session默认超时时间为1天,解决由于编写爬虫规则时间过长导致的提交失败问题 2021-01-05 21:46:01 +08:00
a00a2141f2 爬虫管理系统设置session默认超时时间为1天,解决由于编写爬虫规则时间过长导致的提交失败问题 2021-01-05 21:45:04 +08:00
7cc7d8b541 v3.4.0发布 2021-01-04 10:28:01 +08:00
e4822979e2 elasticsearch升级到7.x,集成RestHighLevelClient客户端 2021-01-03 13:42:40 +08:00
ab741ec6bf v3.3.0发布 2020-12-28 12:06:19 +08:00
057c0646cd v3.3.0发布 2020-12-28 12:02:34 +08:00
57a9cd09ef v3.3.0发布 2020-12-28 11:06:27 +08:00
1a49e2a340 增加外部配置文件来配置网站信息 2020-12-28 10:58:38 +08:00
f8411c2337 v3.3.0发布 2020-12-28 09:34:22 +08:00
343a741c21 更新展示图片 2020-12-27 15:54:50 +08:00
f1a5fb4813 更新展示图片 2020-12-27 15:34:23 +08:00
0428356bd4 新增蓝色主题模版 2020-12-27 09:43:45 +08:00
c01097cd5f 更新v3.3.0的安装文档 2020-12-26 23:53:05 +08:00
7e650a0a04 修改版本号 2020-12-26 22:27:51 +08:00
45c59ecc37 前端新增深色主题模版 2020-12-26 22:16:58 +08:00
5e3962fef4 update 2020-12-26 20:10:11 +08:00
7f5035e369 update 2020-12-26 20:08:07 +08:00
44aad39847 update 2020-12-26 20:00:21 +08:00
6ad51908d5 文件夹结构调整,新增模版自定义功能 2020-12-26 19:13:07 +08:00
f03ab953d0 v3.2.0发布 2020-12-26 11:45:19 +08:00
5cc9dfa1bc v3.2.0发布 2020-12-26 11:42:09 +08:00
2fbda60617 修复jwt校验失败后的bug 2020-12-24 17:13:36 +08:00
39c19ac004 页面不存在则跳转到404页面 2020-12-24 16:54:37 +08:00
7494fe431a 页面不存在则跳转到404页面 2020-12-24 16:45:48 +08:00
c9f1500976 新增404页面,访问已删除的书页/目录页/内容页自动跳转到404页面 2020-12-24 16:26:21 +08:00
f61c252e71 爬虫代码优化 2020-12-24 01:30:00 +08:00
6fd183c2ae 爬虫代码优化 2020-12-24 01:22:19 +08:00
c3daaecaaa 爬虫代码优化 2020-12-24 01:17:52 +08:00
1b6cc8ccd5 爬虫代码优化 2020-12-24 00:10:19 +08:00
0a10504461 优化章节字数算法,优化爬虫代码 2020-12-23 23:48:34 +08:00
1046a7ffc1 后台数据校验优化 2020-12-22 23:12:22 +08:00
612555dbe6 更新QQ群 2020-12-22 09:35:24 +08:00
d5768e4011 后台首页gitee仓库地址更新 2020-12-21 17:51:54 +08:00
5982eb623f 更新文档 2020-12-16 09:53:39 +08:00
85ad5fa3b2 增加官网地址 2020-12-15 10:23:12 +08:00
bdc81f7676 更新安卓客户端 2020-12-13 10:09:42 +08:00
f31c86f362 修复手机端导航栏书架的点击问题 2020-12-13 09:33:59 +08:00
45d8902429 更新接口文档示例 2020-12-12 12:16:13 +08:00
ff9696bb7e 添加接口文档示例 2020-12-12 12:03:40 +08:00
cacebcaa33 小说章节列表接口排序字段新增默认值 2020-12-12 11:16:24 +08:00
355cb80458 restful api改造 2020-12-12 10:03:15 +08:00
a8c74d061c 修改gitee仓库地址 2020-12-11 13:40:35 +08:00
a713b66c1b 爬虫优化,兼容更多源站 2020-12-10 19:04:44 +08:00
e9d915c1fe 修改版本号 2020-12-10 13:39:57 +08:00
cd3520971d 修改版本号 2020-12-10 08:40:15 +08:00
dc4c9138ee novel-admin加入父工程管理 2020-12-09 18:24:23 +08:00
f830600c3e 爬虫优化,提升兼容性 2020-12-09 16:39:15 +08:00
154210719f 简化.gitignore 2020-12-09 08:48:27 +08:00
11e744e6a8 删掉不知道是啥文件 2020-12-07 16:11:20 +08:00
944ef912e2 修复后台管理首页因为数据库大小写敏感导致的报错 2020-12-07 16:06:46 +08:00
1513 changed files with 129162 additions and 22301 deletions

25
.gitignore vendored
View File

@ -1,18 +1,7 @@
/.idea **/logs
/cachedata **/.idea
/logs **/cachedata
/novel-common/target **/target
/novel-front/target **/*.iml
/novel-front/*.iml **/.DS_Store
/novel-common/*.iml
/novel-mobile/target
/novel-mobile/*.iml
/novel-front/novel-front.iml
/novel-crawl/novel-crawl.iml
/novel-crawl/target
/novel-admin/target
/*.iml
/novel-admin/*.iml
.DS_Store
/novel-admin/cachedata
/novel-admin/logs

View File

@ -1,32 +0,0 @@
package com.java2nb.system.dao;
import com.java2nb.system.domain.UserDO;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
/**
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 03:46:33
*/
@Mapper
public interface UserDao {
UserDO get(Long id);
List<UserDO> list(Map<String,Object> map);
int count(Map<String,Object> map);
int save(UserDO user);
int update(UserDO user);
int remove(Long id);
int batchRemove(Long[] ids);
}

View File

@ -1,177 +0,0 @@
package com.java2nb.system.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 2020-12-01 03:46:33
*/
public class UserDO implements Serializable {
private static final long serialVersionUID = 1L;
//主键
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long id;
//登录名
private String username;
//登录密码
private String password;
//昵称
private String nickName;
//用户头像
private String userPhoto;
//用户性别01
private Integer userSex;
//账户余额
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long accountBalance;
//用户状态0正常
private Integer status;
//创建时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
//更新时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 设置:主键
*/
public void setId(Long id) {
this.id = id;
}
/**
* 获取:主键
*/
public Long getId() {
return id;
}
/**
* 设置:登录名
*/
public void setUsername(String username) {
this.username = username;
}
/**
* 获取:登录名
*/
public String getUsername() {
return username;
}
/**
* 设置:登录密码
*/
public void setPassword(String password) {
this.password = password;
}
/**
* 获取:登录密码
*/
public String getPassword() {
return password;
}
/**
* 设置:昵称
*/
public void setNickName(String nickName) {
this.nickName = nickName;
}
/**
* 获取:昵称
*/
public String getNickName() {
return nickName;
}
/**
* 设置:用户头像
*/
public void setUserPhoto(String userPhoto) {
this.userPhoto = userPhoto;
}
/**
* 获取:用户头像
*/
public String getUserPhoto() {
return userPhoto;
}
/**
* 设置用户性别01
*/
public void setUserSex(Integer userSex) {
this.userSex = userSex;
}
/**
* 获取用户性别01
*/
public Integer getUserSex() {
return userSex;
}
/**
* 设置:账户余额
*/
public void setAccountBalance(Long accountBalance) {
this.accountBalance = accountBalance;
}
/**
* 获取:账户余额
*/
public Long getAccountBalance() {
return accountBalance;
}
/**
* 设置用户状态0正常
*/
public void setStatus(Integer status) {
this.status = status;
}
/**
* 获取用户状态0正常
*/
public Integer getStatus() {
return status;
}
/**
* 设置:创建时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:创建时间
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置:更新时间
*/
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
/**
* 获取:更新时间
*/
public Date getUpdateTime() {
return updateTime;
}
}

View File

@ -1,30 +0,0 @@
package com.java2nb.system.service;
import com.java2nb.system.domain.UserDO;
import java.util.List;
import java.util.Map;
/**
*
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 03:46:33
*/
public interface UserService {
UserDO get(Long id);
List<UserDO> list(Map<String, Object> map);
int count(Map<String, Object> map);
int save(UserDO user);
int update(UserDO user);
int remove(Long id);
int batchRemove(Long[] ids);
}

View File

@ -1,55 +0,0 @@
package com.java2nb.system.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import com.java2nb.system.dao.UserDao;
import com.java2nb.system.domain.UserDO;
import com.java2nb.system.service.UserService;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public UserDO get(Long id){
return userDao.get(id);
}
@Override
public List<UserDO> list(Map<String, Object> map){
return userDao.list(map);
}
@Override
public int count(Map<String, Object> map){
return userDao.count(map);
}
@Override
public int save(UserDO user){
return userDao.save(user);
}
@Override
public int update(UserDO user){
return userDao.update(user);
}
@Override
public int remove(Long id){
return userDao.remove(id);
}
@Override
public int batchRemove(Long[] ids){
return userDao.batchRemove(ids);
}
}

View File

@ -1,138 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.java2nb.system.dao.UserDao">
<select id="get" resultType="com.java2nb.system.domain.UserDO">
select `id`,`username`,`password`,`nick_name`,`user_photo`,`user_sex`,`account_balance`,`status`,`create_time`,`update_time` from user where id = #{value}
</select>
<select id="list" resultType="com.java2nb.system.domain.UserDO">
select `id`,`username`,`password`,`nick_name`,`user_photo`,`user_sex`,`account_balance`,`status`,`create_time`,`update_time` from user
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="username != null and username != ''"> and username = #{username} </if>
<if test="password != null and password != ''"> and password = #{password} </if>
<if test="nickName != null and nickName != ''"> and nick_name = #{nickName} </if>
<if test="userPhoto != null and userPhoto != ''"> and user_photo = #{userPhoto} </if>
<if test="userSex != null and userSex != ''"> and user_sex = #{userSex} </if>
<if test="accountBalance != null and accountBalance != ''"> and account_balance = #{accountBalance} </if>
<if test="status != null and status != ''"> and status = #{status} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
<if test="updateTime != null and updateTime != ''"> and update_time = #{updateTime} </if>
</where>
<choose>
<when test="sort != null and sort.trim() != ''">
order by ${sort} ${order}
</when>
<otherwise>
order by id desc
</otherwise>
</choose>
<if test="offset != null and limit != null">
limit #{offset}, #{limit}
</if>
</select>
<select id="count" resultType="int">
select count(*) from user
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="username != null and username != ''"> and username = #{username} </if>
<if test="password != null and password != ''"> and password = #{password} </if>
<if test="nickName != null and nickName != ''"> and nick_name = #{nickName} </if>
<if test="userPhoto != null and userPhoto != ''"> and user_photo = #{userPhoto} </if>
<if test="userSex != null and userSex != ''"> and user_sex = #{userSex} </if>
<if test="accountBalance != null and accountBalance != ''"> and account_balance = #{accountBalance} </if>
<if test="status != null and status != ''"> and status = #{status} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
<if test="updateTime != null and updateTime != ''"> and update_time = #{updateTime} </if>
</where>
</select>
<insert id="save" parameterType="com.java2nb.system.domain.UserDO">
insert into user
(
`id`,
`username`,
`password`,
`nick_name`,
`user_photo`,
`user_sex`,
`account_balance`,
`status`,
`create_time`,
`update_time`
)
values
(
#{id},
#{username},
#{password},
#{nickName},
#{userPhoto},
#{userSex},
#{accountBalance},
#{status},
#{createTime},
#{updateTime}
)
</insert>
<insert id="saveSelective" parameterType="com.java2nb.system.domain.UserDO">
insert into user
(
<if test="id != null"> `id`, </if>
<if test="username != null"> `username`, </if>
<if test="password != null"> `password`, </if>
<if test="nickName != null"> `nick_name`, </if>
<if test="userPhoto != null"> `user_photo`, </if>
<if test="userSex != null"> `user_sex`, </if>
<if test="accountBalance != null"> `account_balance`, </if>
<if test="status != null"> `status`, </if>
<if test="createTime != null"> `create_time`, </if>
<if test="updateTime != null"> `update_time` </if>
)
values
(
<if test="id != null"> #{id}, </if>
<if test="username != null"> #{username}, </if>
<if test="password != null"> #{password}, </if>
<if test="nickName != null"> #{nickName}, </if>
<if test="userPhoto != null"> #{userPhoto}, </if>
<if test="userSex != null"> #{userSex}, </if>
<if test="accountBalance != null"> #{accountBalance}, </if>
<if test="status != null"> #{status}, </if>
<if test="createTime != null"> #{createTime}, </if>
<if test="updateTime != null"> #{updateTime} </if>
)
</insert>
<update id="update" parameterType="com.java2nb.system.domain.UserDO">
update user
<set>
<if test="username != null">`username` = #{username}, </if>
<if test="password != null">`password` = #{password}, </if>
<if test="nickName != null">`nick_name` = #{nickName}, </if>
<if test="userPhoto != null">`user_photo` = #{userPhoto}, </if>
<if test="userSex != null">`user_sex` = #{userSex}, </if>
<if test="accountBalance != null">`account_balance` = #{accountBalance}, </if>
<if test="status != null">`status` = #{status}, </if>
<if test="createTime != null">`create_time` = #{createTime}, </if>
<if test="updateTime != null">`update_time` = #{updateTime}</if>
</set>
where id = #{id}
</update>
<delete id="remove">
delete from user where id = #{value}
</delete>
<delete id="batchRemove">
delete from user where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

261
README.md
View File

@ -1,231 +1,88 @@
[![index]( https://s1.ax1x.com/2020/07/03/NOSA5q.jpg )]( https://cloud.tencent.com/act/cps/redirect?redirect=1052&cps_key=736e609d66e0ac4e57813316cec6fd0b&from=console ) [![index]( https://youdoc.github.io/img/tencent.jpg )]( https://cloud.tencent.com/act/cps/redirect?redirect=2446&cps_key=736e609d66e0ac4e57813316cec6fd0b&from=console )
# 小说精品屋-plus <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 forks" src="https://img.shields.io/github/forks/201206030/novel-plus?logo=github"></a>
<a href='https://gitee.com/novel_dev_team/novel-plus'><img alt="Gitee stars" src="https://gitee.com/novel_dev_team/novel-plus/badge/star.svg?theme=gitee"></a>
<a href='https://gitee.com/novel_dev_team/novel-plus'><img alt="Gitee forks" src="https://gitee.com/novel_dev_team/novel-plus/badge/fork.svg?theme=gitee"></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 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>
基于小说精品屋-plus构建的Spring Cloud 微服务小说门户平台 ## 项目介绍
Gitee仓库地址 https://gitee.com/xiongxyang/novel-cloud novel-plus 是一个多端PCWAP阅读功能完善的原创文学 CMS
系统由前台门户系统作家后台管理系统平台后台管理系统和爬虫管理系统等多个子系统构成包括小说推荐作品检索小说排行小说阅读小说评论会员中心作家专区等功能支持自定义多模版可拓展的多种小说内容存储方式内置数据库分表存储和
TXT 文本存储阅读主题切换多爬虫源自动采集和更新数据会员充值订阅模式新闻发布和实时统计报表
GitHub仓库地址 https://github.com/201206030/novel-cloud ## 项目地址
#### 演示地址 - 学习版[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)
[点击前往](http://47.106.243.172:8888/) ## 项目结构
#### 前言
小说精品屋-plus致力于打造一个完整的商用小说门户平台使用前建议先阅读此文档
#### 项目介绍
小说精品屋-plus是在[小说精品屋](https://github.com/201206030/fiction_house)的基础上去除了漫画和弹幕模块专注于小说是一个多端PC、移动阅读、功能完善的小说原创/爬虫网站项目既包含了作家专区供原创作者上传小说又提供了爬虫工具通过规则多线程全自动采集任意小说网站数据已兼容99%的小说网站),新书自动入库,老书自动更新。
小说精品屋-plus重新进行了数据库设计代码重构和功能增强提升了程序整体的可读性和性能增加了很多商用特性主要升级如下
- [x] 数据库重新设计结构调整
- [x] 服务端代码重构MyBatis3升级为MyBatis3DynamicSql
- [x] 移动站与PC站站点分离浏览器自动识别跳转
- [x] PC站UI更新
- [x] 新闻模块
- [x] 排行榜
- [x] 小说评论模块
- [x] 阅读主题模块
- [x] 作家专区
- [x] 充值
- [x] 订阅
- [x] 后台管理系统
- [x] 爬虫管理系统
#### 项目结构
``` ```
novel-plus -- 父工程 novel-plus -- 父工程
novel-common -- 通用模块 novel-common -- 通用模块
novel-front -- 前台门户系统 novel-front -- 前台门户&作家后台
novel-crawl -- 爬虫管理系统 novel-crawl -- 爬虫
novel-admin -- 后台管理系统 novel-admin -- 管理后台
templates -- 前端模版
``` ```
#### 技术选型 ## 技术选型
| 技术 | 说明 | 技术 | 说明
| -------------------- | --------------------------- |---------------------| ---------------------------
| SpringBoot | Spring应用快速开发脚手架 | Spring Boot | Spring 应用快速开发脚手架
| 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 | 搜索引擎(搜索增强方案默认关闭一行配置开启) | FastDFS | 开源轻量级分布式文件系统(图片存储方式之一一行配置即可切换)
| RabbitMq | 消息队列(流量削峰默认关闭一行配置开启) | Lombok | 简化对象封装工具
| OSS | 阿里云对象存储服务(图片存储方式之一一行配置即可切换) | Docker | 应用容器引擎
| FastDfs |开源轻量级分布式文件系统(图片存储方式之一一行配置即可切换) | MySQL | 数据库服务
| Redisson | 实现分布式锁 | Thymeleaf | 模板引擎
| Lombok | 简化对象封装工具 | Layui | 前端 UI 框架
| Docker | 应用容器引擎
| Mysql | 数据库服务
| Thymeleaf | 模板引擎
| Layui | 前端UI
#### PC站截图 ## 项目演示
1. 首页 https://www.bilibili.com/video/BV1Zo4y187Mi
![img](https://oscimg.oschina.net/oscnet/up-bbb1c7f72e183327bff754a9fa8bb75223e.png) ## 增值服务
2. 分类索引页 👉 [了解详情](https://novel.xxyopen.com/service.htm)
![img](https://oscimg.oschina.net/oscnet/up-d0b2e03129bfae47b8bb96a491b73d383c5.png) ## 微信公众号
3. 搜索页 发布最新更新动态最新前端模版最新爬虫规则文档教程等
![img](https://gitee.com/xiongxyang/novel-plus/raw/release_v2.1.0/assets/QQ20200520-215756.png) ![](https://youdoc.github.io/img/qrcode_for_gh.jpg)
![img](https://oscimg.oschina.net/oscnet/up-ed5f689557718924acac76bc3ebca36afcb.png) ## 赞赏支持
4. 排行榜
![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/04/DbsSoj.jpg" alt="index" style="zoom:33%;" />
2. 小说列表页
<img src="https://s3.ax1x.com/2020/12/04/DbrfsO.jpg" alt="微信图片_20190904181558" style="zoom: 33%;" />
3. 小说详情页
<img src="https://s3.ax1x.com/2020/12/04/DbsklV.jpg" alt="QQ图片20191018161901" style="zoom:33%;" />
4. 小说阅读页
<img src="https://s3.ax1x.com/2020/12/04/Dbsew4.jpg" alt="QQ图片20191018161901" style="zoom:33%;" />
#### 爬虫管理系统截图
![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)
#### 安装步骤
##### 数据库安装
1. 安装MySQL软件
2. 修改MySQL`max_allowed_packet `配置建议100M
3. 新建数据库设置编码为utf8mb4
4. 执行sql/novel_plus.sql脚本文件
##### 爬虫管理系统安装
1. 修改novel-common模块下application-dev.yml文件中的数据库的配置
2. 修改novel-crawl模块下application.yml文件中的管理员账号密码
3. 启动程序打开浏览器默认8081端口访问
4. 选择已有或新增爬虫源支持自定义爬虫规则点击`开启`按钮开始爬取小说数据
##### 前台小说门户安装
1. 修改novel-common模块下application-dev.yml文件中的数据库的配置
2. 启动程序打开浏览器默认8080端口访问
**喜欢此项目的可以给我的GitHub和Gitee加个Star支持一下 **
#### 其他安装教程
包安装教程[点击前往](https://my.oschina.net/java2nb/blog/4272630)
宝塔安装教程非官方[点击前往](https://www.daniao.org/9166.html)
docker安装教程[点击前往](https://my.oschina.net/java2nb/blog/4271989)
#### 代码仓库
Gitee仓库地址 https://gitee.com/xiongxyang/novel-plus
GitHub仓库地址 https://github.com/201206030/novel-plus
#### QQ交流群
![mini-code](https://s1.ax1x.com/2020/10/31/BUQVeI.png)
#### 微信公众号发布最新更新资讯
![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)
### 免责声明 ## 免责声明
本项目提供的爬虫工具仅用于采集项目初期的测试数据请勿用于商业盈利 本项目提供的爬虫工具仅用于采集项目初期的测试数据请勿用于商业盈利 用户使用本系统从事任何违法违规的事情一切后果由用户自行承担作者不承担任何责任
用户使用本系统从事任何违法违规的事情一切后果由用户自行承担作者不承担任何责任
#### 备注
精品小说屋所有相关项目均已在开源中国公开感兴趣的可进入[开源中国](https://www.oschina.net/p/fiction_house)按关键字`精品小说屋`搜索。
[![index](https://s1.ax1x.com/2020/07/03/NOSuMF.jpg)](https://www.aliyun.com/minisite/goods?userCode=uf4nasee )

116
doc/api/api.md Normal file
View File

@ -0,0 +1,116 @@
<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>

1
doc/sql/20210726.sql Normal file
View File

@ -0,0 +1 @@
alter table news add column `read_count` BIGINT NOT NULL DEFAULT '0' COMMENT '阅读量' after content;

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

@ -0,0 +1,3 @@
alter table book_index add column storage_type varchar(10) NOT NULL DEFAULT 'db' COMMENT '存储方式' after book_price ;

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);

3002
doc/sql/novel_plus.sql Normal file

File diff suppressed because it is too large Load Diff

3
doc/sql/readme.md Normal file
View File

@ -0,0 +1,3 @@
1. novel_plus.sql 为全量 sql 文件yyyyMMdd.sql 为增量 sql 文件
2. 第一次安装只需要执行 novel_plus.sql 文件即可
3. 后续版本升级需要根据上次代码版本的时间执行该日期之后的增量 sql 文件简单来说就是 sql 文件夹中相较于上次多出来的 sql 文件

View File

@ -5,7 +5,7 @@
<groupId>com.java2nb</groupId> <groupId>com.java2nb</groupId>
<artifactId>novel-admin</artifactId> <artifactId>novel-admin</artifactId>
<version>2.11.0</version> <version>4.1.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.8.RELEASE</version>
<relativePath/> <relativePath/>
</parent> </parent>
@ -24,6 +24,7 @@
<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>
</properties> </properties>
<dependencies> <dependencies>
@ -106,7 +107,7 @@
<dependency> <dependency>
<groupId>org.apache.shiro</groupId> <groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId> <artifactId>shiro-spring</artifactId>
<version>1.3.2</version> <version>1.7.0</version>
</dependency> </dependency>
<!-- shiro ehcache --> <!-- shiro ehcache -->
<dependency> <dependency>
@ -195,14 +196,16 @@
<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>
<!--war包部署需要--> <!--war包部署需要-->
@ -224,41 +227,97 @@
<!--<scope>provided</scope>--> <!--<scope>provided</scope>-->
<!--</dependency>--> <!--</dependency>-->
</dependencies> </dependencies>
<!-- <build>
<plugins>
&lt;!&ndash;<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>&ndash;&gt;
&lt;!&ndash;SpringBoot项目默认使用spring-boot-maven-plugin要打成被其他项目引用的jar包需要更换此插件&ndash;&gt;
&lt;!&ndash; <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>&ndash;&gt;
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>-->
<build> <build>
<plugins> <plugins>
<!--<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>-->
<!--SpringBoot项目默认使用spring-boot-maven-plugin要打成被其他项目引用的jar包需要更换此插件-->
<!-- <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>-->
<plugin> <plugin>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
</plugin> </plugin>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<!-- 文件夹 -->
<copy todir="${project.build.directory}/build/config" overwrite="true">
<fileset dir="${basedir}/src/main/build/config">
<include name="*.*"/>
</fileset>
</copy>
<copy file="${project.build.directory}/${project.artifactId}-${project.version}.jar"
tofile="${project.build.directory}/build/${project.artifactId}.jar"/>
<fixcrlf srcdir="${basedir}/src/main/build/scripts" eol="unix"/>
<copy todir="${project.build.directory}/build/bin">
<fileset dir="${basedir}/src/main/build/scripts">
<include name="*.sh"/>
<include name="*.txt"/>
<include name="*.bat"/>
</fileset>
</copy>
<zip destfile='${project.build.directory}/build/${project.artifactId}.zip'>
<zipfileset filemode="755" dir='${project.build.directory}/build/'/>
</zip>
</tasks>
</configuration>
</execution>
</executions>
</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

@ -0,0 +1,20 @@
#端口号
server:
port: 8088
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/novel_plus?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
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,94 @@
#!/bin/sh
APP_NAME=novel-admin
JAR_NAME=$APP_NAME\.jar
#PID 代表是PID文件
PID=$APP_NAME\.pid
#使用说明,用来提示输入参数
usage() {
echo "Usage: ./novel-admin.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
#如果不存在返回1存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq "0" ]; then
echo ">>> 小说精品屋后台正在运行 PID = ${pid} <<<"
else
echo ">>> 小说精品屋后台开始启动 <<<"
nohup java -jar -Dspring.profiles.active=prod $JAR_NAME >/dev/null 2>&1 &
sleep 20
echo $! > $PID
echo ">>> 小说精品屋后台启动完成 PID = $! <<<"
status
fi
}
#停止方法
stop(){
#is_exist
pidf=$(cat $PID)
#echo "$pidf"
echo ">>> 小说精品屋后台 PID = $pidf 开始停止 <<<"
kill $pidf
rm -rf $PID
sleep 2
is_exist
if [ $? -eq "0" ]; then
echo ">>> 小说精品屋后台 PID = $pid 开始强制停止 <<<"
kill -9 $pid
sleep 2
status
else
status
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo ">>> 小说精品屋后台正在运行 PID = ${pid} <<<"
else
echo ">>> 小说精品屋后台没有运行 <<<"
fi
}
#重启
restart(){
stop
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
exit 0

View File

@ -1,25 +1,37 @@
package com.java2nb; package com.java2nb;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
//关闭SpringSecurity的功能 import java.net.InetAddress;
@EnableAutoConfiguration(exclude = {
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class
})
@EnableTransactionManagement @EnableTransactionManagement
@ServletComponentScan @ServletComponentScan
@MapperScan("com.java2nb.*.dao") @MapperScan("com.java2nb.*.dao")
@SpringBootApplication @SpringBootApplication(exclude = {
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class
})
@EnableCaching @EnableCaching
@Slf4j
public class AdminApplication { public class AdminApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(AdminApplication.class, args); SpringApplication.run(AdminApplication.class, args);
} }
@Bean
public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
return args -> {
log.info("项目启动啦,访问路径:{}", "http://" + InetAddress.getLocalHost().getHostAddress() + ":" + ctx.getEnvironment().getProperty("server.port"));
};
}
} }

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,17 +62,16 @@ 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("/docs/**", "anon"); filterChainDefinitionMap.put("/docs/**", "anon");
filterChainDefinitionMap.put("/layuimini/**", "anon"); filterChainDefinitionMap.put("/layuimini/**", "anon");
filterChainDefinitionMap.put("/druid/**", "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");
@ -93,11 +87,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;
} }
@ -109,8 +99,7 @@ public class ShiroConfig {
} }
/** /**
* 开启shiro aop注解支持. * 开启shiro aop注解支持. 使用代理方式;所以需要开启代码支持;
* 使用代理方式;所以需要开启代码支持;
* *
* @param securityManager * @param securityManager
* @return * @return
@ -139,8 +128,7 @@ public class ShiroConfig {
} }
/** /**
* cacheManager 缓存 redis实现 * cacheManager 缓存 redis实现 使用的是shiro-redis开源插件
* 使用的是shiro-redis开源插件
* *
* @return * @return
*/ */
@ -152,8 +140,7 @@ public class ShiroConfig {
/** /**
* RedisSessionDAO shiro sessionDao层的实现 通过redis * RedisSessionDAO shiro sessionDao层的实现 通过redis 使用的是shiro-redis开源插件
* 使用的是shiro-redis开源插件
*/ */
@Bean @Bean
public RedisSessionDAO redisSessionDAO() { public RedisSessionDAO redisSessionDAO() {
@ -164,11 +151,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();
}
} }
/** /**
@ -185,19 +168,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,135 @@
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.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(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(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

@ -1,19 +1,17 @@
package com.java2nb.novel.controller; package com.java2nb.novel.controller;
import com.java2nb.common.utils.DateUtils; import com.java2nb.common.utils.DateUtils;
import com.java2nb.common.utils.PageBean;
import com.java2nb.common.utils.Query;
import com.java2nb.common.utils.R; import com.java2nb.common.utils.R;
import com.java2nb.novel.domain.AuthorCodeDO; import com.java2nb.novel.service.AuthorService;
import com.java2nb.novel.service.*; import com.java2nb.novel.service.BookService;
import com.java2nb.test.service.OrderService; import com.java2nb.novel.service.PayService;
import io.swagger.annotations.ApiOperation; import com.java2nb.novel.service.UserService;
import lombok.SneakyThrows; import lombok.SneakyThrows;
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;
import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;

View File

@ -1,4 +1,4 @@
package com.java2nb.system.controller; package com.java2nb.novel.controller;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -16,8 +16,8 @@ import org.springframework.web.bind.annotation.ResponseBody;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import com.java2nb.system.domain.UserDO; import com.java2nb.novel.domain.UserFeedbackDO;
import com.java2nb.system.service.UserService; import com.java2nb.novel.service.UserFeedbackService;
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;
@ -27,57 +27,57 @@ import com.java2nb.common.utils.R;
* *
* @author xiongxy * @author xiongxy
* @email 1179705413@qq.com * @email 1179705413@qq.com
* @date 2020-12-01 03:46:33 * @date 2023-04-18 11:08:54
*/ */
@Controller @Controller
@RequestMapping("/system/user") @RequestMapping("/novel/userFeedback")
public class UserController { public class UserFeedbackController {
@Autowired @Autowired
private UserService userService; private UserFeedbackService userFeedbackService;
@GetMapping() @GetMapping()
@RequiresPermissions("system:user:user") @RequiresPermissions("novel:userFeedback:userFeedback")
String User() { String UserFeedback() {
return "system/user/user"; return "novel/userFeedback/userFeedback";
} }
@ApiOperation(value = "获取列表", notes = "获取列表") @ApiOperation(value = "获取列表", notes = "获取列表")
@ResponseBody @ResponseBody
@GetMapping("/list") @GetMapping("/list")
@RequiresPermissions("system:user:user") @RequiresPermissions("novel:userFeedback:userFeedback")
public R list(@RequestParam Map<String, Object> params) { public R list(@RequestParam Map<String, Object> params) {
//查询列表数据 //查询列表数据
Query query = new Query(params); Query query = new Query(params);
List<UserDO> userList = userService.list(query); List<UserFeedbackDO> userFeedbackList = userFeedbackService.list(query);
int total = userService.count(query); int total = userFeedbackService.count(query);
PageBean pageBean = new PageBean(userList, total); PageBean pageBean = new PageBean(userFeedbackList, total);
return R.ok().put("data", pageBean); return R.ok().put("data", pageBean);
} }
@ApiOperation(value = "新增页面", notes = "新增页面") @ApiOperation(value = "新增页面", notes = "新增页面")
@GetMapping("/add") @GetMapping("/add")
@RequiresPermissions("system:user:add") @RequiresPermissions("novel:userFeedback:add")
String add() { String add() {
return "system/user/add"; return "novel/userFeedback/add";
} }
@ApiOperation(value = "修改页面", notes = "修改页面") @ApiOperation(value = "修改页面", notes = "修改页面")
@GetMapping("/edit/{id}") @GetMapping("/edit/{id}")
@RequiresPermissions("system:user:edit") @RequiresPermissions("novel:userFeedback:edit")
String edit(@PathVariable("id") Long id, Model model) { String edit(@PathVariable("id") Long id, Model model) {
UserDO user = userService.get(id); UserFeedbackDO userFeedback = userFeedbackService.get(id);
model.addAttribute("user", user); model.addAttribute("userFeedback", userFeedback);
return "system/user/edit"; return "novel/userFeedback/edit";
} }
@ApiOperation(value = "查看页面", notes = "查看页面") @ApiOperation(value = "查看页面", notes = "查看页面")
@GetMapping("/detail/{id}") @GetMapping("/detail/{id}")
@RequiresPermissions("system:user:detail") @RequiresPermissions("novel:userFeedback:detail")
String detail(@PathVariable("id") Long id, Model model) { String detail(@PathVariable("id") Long id, Model model) {
UserDO user = userService.get(id); UserFeedbackDO userFeedback = userFeedbackService.get(id);
model.addAttribute("user", user); model.addAttribute("userFeedback", userFeedback);
return "system/user/detail"; return "novel/userFeedback/detail";
} }
/** /**
@ -86,9 +86,9 @@ public class UserController {
@ApiOperation(value = "新增", notes = "新增") @ApiOperation(value = "新增", notes = "新增")
@ResponseBody @ResponseBody
@PostMapping("/save") @PostMapping("/save")
@RequiresPermissions("system:user:add") @RequiresPermissions("novel:userFeedback:add")
public R save( UserDO user) { public R save( UserFeedbackDO userFeedback) {
if (userService.save(user) > 0) { if (userFeedbackService.save(userFeedback) > 0) {
return R.ok(); return R.ok();
} }
return R.error(); return R.error();
@ -100,9 +100,9 @@ public class UserController {
@ApiOperation(value = "修改", notes = "修改") @ApiOperation(value = "修改", notes = "修改")
@ResponseBody @ResponseBody
@RequestMapping("/update") @RequestMapping("/update")
@RequiresPermissions("system:user:edit") @RequiresPermissions("novel:userFeedback:edit")
public R update( UserDO user) { public R update( UserFeedbackDO userFeedback) {
userService.update(user); userFeedbackService.update(userFeedback);
return R.ok(); return R.ok();
} }
@ -112,9 +112,9 @@ public class UserController {
@ApiOperation(value = "删除", notes = "删除") @ApiOperation(value = "删除", notes = "删除")
@PostMapping("/remove") @PostMapping("/remove")
@ResponseBody @ResponseBody
@RequiresPermissions("system:user:remove") @RequiresPermissions("novel:userFeedback:remove")
public R remove( Long id) { public R remove( Long id) {
if (userService.remove(id) > 0) { if (userFeedbackService.remove(id) > 0) {
return R.ok(); return R.ok();
} }
return R.error(); return R.error();
@ -126,9 +126,9 @@ public class UserController {
@ApiOperation(value = "批量删除", notes = "批量删除") @ApiOperation(value = "批量删除", notes = "批量删除")
@PostMapping("/batchRemove") @PostMapping("/batchRemove")
@ResponseBody @ResponseBody
@RequiresPermissions("system:user:batchRemove") @RequiresPermissions("novel:userFeedback:batchRemove")
public R remove(@RequestParam("ids[]") Long[] ids) { public R remove(@RequestParam("ids[]") Long[] ids) {
userService.batchRemove(ids); userFeedbackService.batchRemove(ids);
return R.ok(); 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;
}
} }

View File

@ -0,0 +1,177 @@
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:51:54
*/
public class BookIndexDO 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 Integer indexNum;
//目录名
private String indexName;
//字数
private Integer wordCount;
//是否收费1收费0免费
private Integer isVip;
//章节费用(屋币)
private Integer bookPrice;
//存储方式
private String storageType;
//
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
//
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 设置:主键
*/
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 setIndexNum(Integer indexNum) {
this.indexNum = indexNum;
}
/**
* 获取:目录号
*/
public Integer getIndexNum() {
return indexNum;
}
/**
* 设置:目录名
*/
public void setIndexName(String indexName) {
this.indexName = indexName;
}
/**
* 获取:目录名
*/
public String getIndexName() {
return indexName;
}
/**
* 设置:字数
*/
public void setWordCount(Integer wordCount) {
this.wordCount = wordCount;
}
/**
* 获取:字数
*/
public Integer getWordCount() {
return wordCount;
}
/**
* 设置是否收费1收费0免费
*/
public void setIsVip(Integer isVip) {
this.isVip = isVip;
}
/**
* 获取是否收费1收费0免费
*/
public Integer getIsVip() {
return isVip;
}
/**
* 设置:章节费用(屋币)
*/
public void setBookPrice(Integer bookPrice) {
this.bookPrice = bookPrice;
}
/**
* 获取:章节费用(屋币)
*/
public Integer getBookPrice() {
return bookPrice;
}
/**
* 设置:存储方式
*/
public void setStorageType(String storageType) {
this.storageType = storageType;
}
/**
* 获取:存储方式
*/
public String getStorageType() {
return storageType;
}
/**
* 设置:
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置:
*/
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
/**
* 获取:
*/
public Date getUpdateTime() {
return updateTime;
}
}

View File

@ -0,0 +1,175 @@
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-18 10:01:13
*/
public class BookSettingDO 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 Integer sort;
//类型0轮播图1顶部小说栏设置2本周强推3热门推荐4精品推荐
private Integer type;
//创建时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
//创建人ID
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long createUserId;
//更新时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
//更新人ID
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long updateUserId;
private String bookName;
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
/**
* 设置:
*/
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 setSort(Integer sort) {
this.sort = sort;
}
/**
* 获取:排序号
*/
public Integer getSort() {
return sort;
}
/**
* 设置类型0轮播图1顶部小说栏设置2本周强推3热门推荐4精品推荐
*/
public void setType(Integer type) {
this.type = type;
}
/**
* 获取类型0轮播图1顶部小说栏设置2本周强推3热门推荐4精品推荐
*/
public Integer getType() {
return type;
}
/**
* 设置:创建时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:创建时间
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置创建人ID
*/
public void setCreateUserId(Long createUserId) {
this.createUserId = createUserId;
}
/**
* 获取创建人ID
*/
public Long getCreateUserId() {
return createUserId;
}
/**
* 设置:更新时间
*/
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
/**
* 获取:更新时间
*/
public Date getUpdateTime() {
return updateTime;
}
/**
* 设置更新人ID
*/
public void setUpdateUserId(Long updateUserId) {
this.updateUserId = updateUserId;
}
/**
* 获取更新人ID
*/
public Long getUpdateUserId() {
return updateUserId;
}
}

View File

@ -0,0 +1,163 @@
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 15:12:25
*/
public class FriendLinkDO implements Serializable {
private static final long serialVersionUID = 1L;
//主键
private Integer id;
//链接名
private String linkName;
//链接url
private String linkUrl;
//排序号
private Integer sort;
//是否开启0不开启1开启
private Integer isOpen;
//创建人id
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long createUserId;
//创建时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
//更新者用户id
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long updateUserId;
//更新时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 设置:主键
*/
public void setId(Integer id) {
this.id = id;
}
/**
* 获取:主键
*/
public Integer getId() {
return id;
}
/**
* 设置:链接名
*/
public void setLinkName(String linkName) {
this.linkName = linkName;
}
/**
* 获取:链接名
*/
public String getLinkName() {
return linkName;
}
/**
* 设置链接url
*/
public void setLinkUrl(String linkUrl) {
this.linkUrl = linkUrl;
}
/**
* 获取链接url
*/
public String getLinkUrl() {
return linkUrl;
}
/**
* 设置:排序号
*/
public void setSort(Integer sort) {
this.sort = sort;
}
/**
* 获取:排序号
*/
public Integer getSort() {
return sort;
}
/**
* 设置是否开启0不开启1开启
*/
public void setIsOpen(Integer isOpen) {
this.isOpen = isOpen;
}
/**
* 获取是否开启0不开启1开启
*/
public Integer getIsOpen() {
return isOpen;
}
/**
* 设置创建人id
*/
public void setCreateUserId(Long createUserId) {
this.createUserId = createUserId;
}
/**
* 获取创建人id
*/
public Long getCreateUserId() {
return createUserId;
}
/**
* 设置:创建时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:创建时间
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置更新者用户id
*/
public void setUpdateUserId(Long updateUserId) {
this.updateUserId = updateUserId;
}
/**
* 获取更新者用户id
*/
public Long getUpdateUserId() {
return updateUserId;
}
/**
* 设置:更新时间
*/
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
/**
* 获取:更新时间
*/
public Date getUpdateTime() {
return updateTime;
}
}

View File

@ -1,166 +1,188 @@
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:57 * @date 2020-12-01 03:49:57
*/ */
public class PayDO implements Serializable { public class PayDO 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;
//保留
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long outTradeNo;
//订单号
private String tradeNo;
//保留
private Integer payChannel;
//交易香蕉币
private Integer totalAmount;
//支付用户ID
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long userId;
//支付状态0支付失败1支付成功2待支付
private Integer payStatus;
//创建时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
//更新时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 设置:主键 //主键
*/ //java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
public void setId(Long id) { //所以通过序列化成字符串来解决
this.id = id; @JsonSerialize(using = LongToStringSerializer.class)
} private Long id;
/** //保留
* 获取:主键 //java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
*/ //所以通过序列化成字符串来解决
public Long getId() { @JsonSerialize(using = LongToStringSerializer.class)
return id; private Long outTradeNo;
} //订单号
/** private String tradeNo;
* 设置:保留 //保留
*/ private Integer payChannel;
public void setOutTradeNo(Long outTradeNo) { //交易香蕉币
this.outTradeNo = outTradeNo; private Integer totalAmount;
} //支付用户ID
/** //java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
* 获取:保留 //所以通过序列化成字符串来解决
*/ @JsonSerialize(using = LongToStringSerializer.class)
public Long getOutTradeNo() { private Long userId;
return outTradeNo; //支付状态0支付失败1支付成功2待支付
} private Integer payStatus;
/** //创建时间
* 设置:订单号 @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
*/ private Date createTime;
public void setTradeNo(String tradeNo) { //更新时间
this.tradeNo = tradeNo; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
} private Date updateTime;
/**
* 获取:订单号 private String userName;
*/
public String getTradeNo() { public String getUserName() {
return tradeNo; return userName;
} }
/**
* 设置:保留 public void setUserName(String userName) {
*/ this.userName = userName;
public void setPayChannel(Integer payChannel) { }
this.payChannel = payChannel;
} /**
/** * 设置:主键
* 获取:保留 */
*/ public void setId(Long id) {
public Integer getPayChannel() { this.id = id;
return payChannel; }
}
/** /**
* 设置:交易香蕉币 * 获取:主键
*/ */
public void setTotalAmount(Integer totalAmount) { public Long getId() {
this.totalAmount = totalAmount; return id;
} }
/**
* 获取:交易香蕉币 /**
*/ * 设置:保留
public Integer getTotalAmount() { */
return totalAmount; public void setOutTradeNo(Long outTradeNo) {
} this.outTradeNo = outTradeNo;
/** }
* 设置支付用户ID
*/ /**
public void setUserId(Long userId) { * 获取:保留
this.userId = userId; */
} public Long getOutTradeNo() {
/** return outTradeNo;
* 获取支付用户ID }
*/
public Long getUserId() { /**
return userId; * 设置:订单号
} */
/** public void setTradeNo(String tradeNo) {
* 设置支付状态0支付失败1支付成功2待支付 this.tradeNo = tradeNo;
*/ }
public void setPayStatus(Integer payStatus) {
this.payStatus = payStatus; /**
} * 获取:订单号
/** */
* 获取支付状态0支付失败1支付成功2待支付 public String getTradeNo() {
*/ return tradeNo;
public Integer getPayStatus() { }
return payStatus;
} /**
/** * 设置:保留
* 设置:创建时间 */
*/ public void setPayChannel(Integer payChannel) {
public void setCreateTime(Date createTime) { this.payChannel = payChannel;
this.createTime = createTime; }
}
/** /**
* 获取:创建时间 * 获取:保留
*/ */
public Date getCreateTime() { public Integer getPayChannel() {
return createTime; return payChannel;
} }
/**
* 设置:更新时间 /**
*/ * 设置:交易香蕉币
public void setUpdateTime(Date updateTime) { */
this.updateTime = updateTime; public void setTotalAmount(Integer totalAmount) {
} this.totalAmount = totalAmount;
/** }
* 获取:更新时间
*/ /**
public Date getUpdateTime() { * 获取:交易香蕉币
return updateTime; */
} public Integer getTotalAmount() {
return totalAmount;
}
/**
* 设置支付用户ID
*/
public void setUserId(Long userId) {
this.userId = userId;
}
/**
* 获取支付用户ID
*/
public Long getUserId() {
return userId;
}
/**
* 设置支付状态0支付失败1支付成功2待支付
*/
public void setPayStatus(Integer payStatus) {
this.payStatus = payStatus;
}
/**
* 获取支付状态0支付失败1支付成功2待支付
*/
public Integer getPayStatus() {
return payStatus;
}
/**
* 设置:创建时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:创建时间
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置:更新时间
*/
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
/**
* 获取:更新时间
*/
public Date getUpdateTime() {
return updateTime;
}
} }

View File

@ -0,0 +1,103 @@
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-18 11:08:54
*/
public class UserFeedbackDO implements Serializable {
private static final long serialVersionUID = 1L;
//主键id
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long id;
//用户id
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long userId;
//反馈内容
private String content;
//反馈时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
/**
* 设置主键id
*/
public void setId(Long id) {
this.id = id;
}
/**
* 获取主键id
*/
public Long getId() {
return id;
}
/**
* 设置用户id
*/
public void setUserId(Long userId) {
this.userId = userId;
}
/**
* 获取用户id
*/
public Long getUserId() {
return userId;
}
/**
* 设置:反馈内容
*/
public void setContent(String content) {
this.content = content;
}
/**
* 获取:反馈内容
*/
public String getContent() {
return content;
}
/**
* 设置:反馈时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:反馈时间
*/
public Date getCreateTime() {
return createTime;
}
}

View File

@ -0,0 +1,208 @@
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 11:05:43
*/
public class WebsiteInfoDO implements Serializable {
private static final long serialVersionUID = 1L;
//主键
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long id;
//网站名
private String name;
//网站域名
private String domain;
//SEO关键词
private String keyword;
//网站描述
private String description;
//站长QQ
private String qq;
//网站logo图片默认
private String logo;
//网站logo图片深色
private String logoDark;
//创建时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
//创建人ID
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long createUserId;
//更新时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
//更新人ID
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long updateUserId;
/**
* 设置:主键
*/
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 setDomain(String domain) {
this.domain = domain;
}
/**
* 获取:网站域名
*/
public String getDomain() {
return domain;
}
/**
* 设置SEO关键词
*/
public void setKeyword(String keyword) {
this.keyword = keyword;
}
/**
* 获取SEO关键词
*/
public String getKeyword() {
return keyword;
}
/**
* 设置:网站描述
*/
public void setDescription(String description) {
this.description = description;
}
/**
* 获取:网站描述
*/
public String getDescription() {
return description;
}
/**
* 设置站长QQ
*/
public void setQq(String qq) {
this.qq = qq;
}
/**
* 获取站长QQ
*/
public String getQq() {
return qq;
}
/**
* 设置网站logo图片默认
*/
public void setLogo(String logo) {
this.logo = logo;
}
/**
* 获取网站logo图片默认
*/
public String getLogo() {
return logo;
}
/**
* 设置网站logo图片深色
*/
public void setLogoDark(String logoDark) {
this.logoDark = logoDark;
}
/**
* 获取网站logo图片深色
*/
public String getLogoDark() {
return logoDark;
}
/**
* 设置:创建时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:创建时间
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置创建人ID
*/
public void setCreateUserId(Long createUserId) {
this.createUserId = createUserId;
}
/**
* 获取创建人ID
*/
public Long getCreateUserId() {
return createUserId;
}
/**
* 设置:更新时间
*/
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
/**
* 获取:更新时间
*/
public Date getUpdateTime() {
return updateTime;
}
/**
* 设置更新人ID
*/
public void setUpdateUserId(Long updateUserId) {
this.updateUserId = updateUserId;
}
/**
* 获取更新人ID
*/
public Long getUpdateUserId() {
return updateUserId;
}
}

View File

@ -0,0 +1,30 @@
package com.java2nb.novel.service;
import com.java2nb.novel.domain.BookCommentDO;
import java.util.List;
import java.util.Map;
/**
* 小说评论表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-14 21:59:28
*/
public interface BookCommentService {
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,30 @@
package com.java2nb.novel.service;
import com.java2nb.novel.domain.BookContentDO;
import java.util.List;
import java.util.Map;
/**
* 小说内容表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-14 19:52:06
*/
public interface BookContentService {
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);
}

View File

@ -0,0 +1,30 @@
package com.java2nb.novel.service;
import com.java2nb.novel.domain.BookIndexDO;
import java.util.List;
import java.util.Map;
/**
* 小说目录表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-14 19:51:54
*/
public interface BookIndexService {
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);
}

View File

@ -0,0 +1,30 @@
package com.java2nb.novel.service;
import com.java2nb.novel.domain.BookSettingDO;
import java.util.List;
import java.util.Map;
/**
* 首页小说设置表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-18 10:01:13
*/
public interface BookSettingService {
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,30 @@
package com.java2nb.novel.service;
import com.java2nb.novel.domain.FriendLinkDO;
import java.util.List;
import java.util.Map;
/**
*
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-14 15:12:25
*/
public interface FriendLinkService {
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

@ -0,0 +1,30 @@
package com.java2nb.novel.service;
import com.java2nb.novel.domain.UserFeedbackDO;
import java.util.List;
import java.util.Map;
/**
*
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-18 11:08:54
*/
public interface UserFeedbackService {
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,30 @@
package com.java2nb.novel.service;
import com.java2nb.novel.domain.WebsiteInfoDO;
import java.util.List;
import java.util.Map;
/**
* 网站信息表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2023-04-14 11:05:43
*/
public interface WebsiteInfoService {
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,77 @@
package com.java2nb.novel.service.impl;
import com.java2nb.novel.dao.BookCommentDao;
import com.java2nb.novel.dao.BookDao;
import com.java2nb.novel.dao.UserDao;
import com.java2nb.novel.domain.BookCommentDO;
import com.java2nb.novel.domain.BookDO;
import com.java2nb.novel.domain.UserDO;
import com.java2nb.novel.service.BookCommentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
public class BookCommentServiceImpl implements BookCommentService {
@Autowired
private BookCommentDao bookCommentDao;
@Autowired
private BookDao bookDao;
@Autowired
private UserDao userDao;
@Override
public BookCommentDO get(Long id) {
return bookCommentDao.get(id);
}
@Override
public List<BookCommentDO> list(Map<String, Object> map) {
List<BookCommentDO> list = bookCommentDao.list(map);
if (!CollectionUtils.isEmpty(list)) {
List<Long> bookIds = list.stream().map(BookCommentDO::getBookId).collect(Collectors.toList());
Map<Long, String> bookNameMap = bookDao.batchGet(bookIds).stream()
.collect(Collectors.toMap(BookDO::getId, BookDO::getBookName));
List<Long> userIds = list.stream().map(BookCommentDO::getCreateUserId).collect(Collectors.toList());
Map<Long, String> userNameMap = userDao.batchGet(userIds).stream()
.collect(Collectors.toMap(UserDO::getId, UserDO::getUsername));
list.forEach(v -> {
v.setBookName(bookNameMap.get(v.getBookId()));
v.setUserName(userNameMap.get(v.getCreateUserId()));
});
}
return list;
}
@Override
public int count(Map<String, Object> map) {
return bookCommentDao.count(map);
}
@Override
public int save(BookCommentDO bookComment) {
return bookCommentDao.save(bookComment);
}
@Override
public int update(BookCommentDO bookComment) {
return bookCommentDao.update(bookComment);
}
@Override
public int remove(Long id) {
return bookCommentDao.remove(id);
}
@Override
public int batchRemove(Long[] ids) {
return bookCommentDao.batchRemove(ids);
}
}

View File

@ -0,0 +1,55 @@
package com.java2nb.novel.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import com.java2nb.novel.dao.BookContentDao;
import com.java2nb.novel.domain.BookContentDO;
import com.java2nb.novel.service.BookContentService;
@Service
public class BookContentServiceImpl implements BookContentService {
@Autowired
private BookContentDao bookContentDao;
@Override
public BookContentDO get(Long id){
return bookContentDao.get(id);
}
@Override
public List<BookContentDO> list(Map<String, Object> map){
return bookContentDao.list(map);
}
@Override
public int count(Map<String, Object> map){
return bookContentDao.count(map);
}
@Override
public int save(BookContentDO bookContent){
return bookContentDao.save(bookContent);
}
@Override
public int update(BookContentDO bookContent){
return bookContentDao.update(bookContent);
}
@Override
public int remove(Long id){
return bookContentDao.remove(id);
}
@Override
public int batchRemove(Long[] ids){
return bookContentDao.batchRemove(ids);
}
}

View File

@ -0,0 +1,55 @@
package com.java2nb.novel.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import com.java2nb.novel.dao.BookIndexDao;
import com.java2nb.novel.domain.BookIndexDO;
import com.java2nb.novel.service.BookIndexService;
@Service
public class BookIndexServiceImpl implements BookIndexService {
@Autowired
private BookIndexDao bookIndexDao;
@Override
public BookIndexDO get(Long id){
return bookIndexDao.get(id);
}
@Override
public List<BookIndexDO> list(Map<String, Object> map){
return bookIndexDao.list(map);
}
@Override
public int count(Map<String, Object> map){
return bookIndexDao.count(map);
}
@Override
public int save(BookIndexDO bookIndex){
return bookIndexDao.save(bookIndex);
}
@Override
public int update(BookIndexDO bookIndex){
return bookIndexDao.update(bookIndex);
}
@Override
public int remove(Long id){
return bookIndexDao.remove(id);
}
@Override
public int batchRemove(Long[] ids){
return bookIndexDao.batchRemove(ids);
}
}

View File

@ -1,65 +1,79 @@
package com.java2nb.novel.service.impl; package com.java2nb.novel.service.impl;
import com.java2nb.novel.dao.BookContentDao;
import com.java2nb.novel.dao.BookDao;
import com.java2nb.novel.dao.BookIndexDao;
import com.java2nb.novel.domain.BookDO;
import com.java2nb.novel.service.BookService;
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.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
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 java.util.stream.Collectors; import java.util.stream.Collectors;
import com.java2nb.novel.dao.BookDao;
import com.java2nb.novel.domain.BookDO;
import com.java2nb.novel.service.BookService;
@Service @Service
public class BookServiceImpl implements BookService { public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao;
@Override
public BookDO get(Long id){
return bookDao.get(id);
}
@Override
public List<BookDO> list(Map<String, Object> map){
return bookDao.list(map);
}
@Override
public int count(Map<String, Object> map){
return bookDao.count(map);
}
@Override
public int save(BookDO book){
return bookDao.save(book);
}
@Override
public int update(BookDO book){
return bookDao.update(book);
}
@Override
public int remove(Long id){
return bookDao.remove(id);
}
@Override
public int batchRemove(Long[] ids){
return bookDao.batchRemove(ids);
}
@Override @Autowired
public Map<Object, Object> tableSta(Date minDate) { private BookDao bookDao;
List<Map<Object, Object>> maps = bookDao.tableSta(minDate); @Autowired
private BookIndexDao bookIndexDao;
@Autowired
private BookContentDao bookContentDao;
return maps.stream().collect(Collectors.toMap(x -> x.get("staDate"), x -> x.get("bookCount"))); @Override
public BookDO get(Long id) {
return bookDao.get(id);
}
} @Override
public List<BookDO> list(Map<String, Object> map) {
return bookDao.list(map);
}
@Override
public int count(Map<String, Object> map) {
return bookDao.count(map);
}
@Override
public int save(BookDO book) {
return bookDao.save(book);
}
@Override
public int update(BookDO book) {
return bookDao.update(book);
}
@Transactional(rollbackFor = Exception.class)
@Override
public int remove(Long id) {
List<Long> indexIds = bookIndexDao.getIdsByBookId(id);
if (!CollectionUtils.isEmpty(indexIds)) {
Long[] indexIdArray = indexIds.toArray(new Long[0]);
bookIndexDao.batchRemove(indexIdArray);
bookContentDao.removeByIndexIds(indexIdArray);
}
return bookDao.remove(id);
}
@Override
public int batchRemove(Long[] ids) {
return bookDao.batchRemove(ids);
}
@Override
public Map<Object, Object> tableSta(Date minDate) {
List<Map<Object, Object>> maps = bookDao.tableSta(minDate);
return maps.stream().collect(Collectors.toMap(x -> x.get("staDate"), x -> x.get("bookCount")));
}
} }

View File

@ -0,0 +1,68 @@
package com.java2nb.novel.service.impl;
import com.java2nb.novel.dao.BookDao;
import com.java2nb.novel.dao.BookSettingDao;
import com.java2nb.novel.domain.BookDO;
import com.java2nb.novel.domain.BookSettingDO;
import com.java2nb.novel.service.BookSettingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
public class BookSettingServiceImpl implements BookSettingService {
@Autowired
private BookSettingDao bookSettingDao;
@Autowired
private BookDao bookDao;
@Override
public BookSettingDO get(Long id) {
return bookSettingDao.get(id);
}
@Override
public List<BookSettingDO> list(Map<String, Object> map) {
List<BookSettingDO> list = bookSettingDao.list(map);
if (!CollectionUtils.isEmpty(list)) {
List<Long> bookIds = list.stream().map(BookSettingDO::getBookId).collect(Collectors.toList());
Map<Long, String> bookNameMap = bookDao.batchGet(bookIds).stream()
.collect(Collectors.toMap(BookDO::getId, BookDO::getBookName));
list = list.stream().filter(v -> bookNameMap.containsKey(v.getBookId())).collect(Collectors.toList());
list.forEach(v -> v.setBookName(bookNameMap.get(v.getBookId())));
}
return list;
}
@Override
public int count(Map<String, Object> map) {
return bookSettingDao.count(map);
}
@Override
public int save(BookSettingDO bookSetting) {
return bookSettingDao.save(bookSetting);
}
@Override
public int update(BookSettingDO bookSetting) {
return bookSettingDao.update(bookSetting);
}
@Override
public int remove(Long id) {
return bookSettingDao.remove(id);
}
@Override
public int batchRemove(Long[] ids) {
return bookSettingDao.batchRemove(ids);
}
}

View File

@ -0,0 +1,55 @@
package com.java2nb.novel.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import com.java2nb.novel.dao.FriendLinkDao;
import com.java2nb.novel.domain.FriendLinkDO;
import com.java2nb.novel.service.FriendLinkService;
@Service
public class FriendLinkServiceImpl implements FriendLinkService {
@Autowired
private FriendLinkDao friendLinkDao;
@Override
public FriendLinkDO get(Integer id){
return friendLinkDao.get(id);
}
@Override
public List<FriendLinkDO> list(Map<String, Object> map){
return friendLinkDao.list(map);
}
@Override
public int count(Map<String, Object> map){
return friendLinkDao.count(map);
}
@Override
public int save(FriendLinkDO friendLink){
return friendLinkDao.save(friendLink);
}
@Override
public int update(FriendLinkDO friendLink){
return friendLinkDao.update(friendLink);
}
@Override
public int remove(Integer id){
return friendLinkDao.remove(id);
}
@Override
public int batchRemove(Integer[] ids){
return friendLinkDao.batchRemove(ids);
}
}

View File

@ -1,66 +1,77 @@
package com.java2nb.novel.service.impl; package com.java2nb.novel.service.impl;
import com.java2nb.novel.dao.PayDao;
import com.java2nb.novel.dao.UserDao;
import com.java2nb.novel.domain.PayDO;
import com.java2nb.novel.domain.UserDO;
import com.java2nb.novel.service.PayService;
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.CollectionUtils;
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 java.util.stream.Collectors; import java.util.stream.Collectors;
import com.java2nb.novel.dao.PayDao;
import com.java2nb.novel.domain.PayDO;
import com.java2nb.novel.service.PayService;
@Service @Service
public class PayServiceImpl implements PayService { public class PayServiceImpl implements PayService {
@Autowired
private PayDao payDao;
@Override
public PayDO get(Long id){
return payDao.get(id);
}
@Override
public List<PayDO> list(Map<String, Object> map){
return payDao.list(map);
}
@Override
public int count(Map<String, Object> map){
return payDao.count(map);
}
@Override
public int save(PayDO pay){
return payDao.save(pay);
}
@Override
public int update(PayDO pay){
return payDao.update(pay);
}
@Override
public int remove(Long id){
return payDao.remove(id);
}
@Override
public int batchRemove(Long[] ids){
return payDao.batchRemove(ids);
}
@Override @Autowired
public Map<Object, Object> tableSta(Date minDate) { private PayDao payDao;
List<Map<Object, Object>> maps = payDao.tableSta(minDate); @Autowired
private UserDao userDao;
return maps.stream().collect(Collectors.toMap(x -> x.get("staDate"), x -> x.get("orderCount"))); @Override
public PayDO get(Long id) {
return payDao.get(id);
}
@Override
public List<PayDO> list(Map<String, Object> map) {
List<PayDO> list = payDao.list(map);
if (!CollectionUtils.isEmpty(list)) {
List<Long> userIds = list.stream().map(PayDO::getUserId).collect(Collectors.toList());
Map<Long, String> userNameMap = userDao.batchGet(userIds).stream()
.collect(Collectors.toMap(UserDO::getId, UserDO::getUsername));
list.forEach(v -> v.setUserName(userNameMap.get(v.getUserId())));
}
return list;
}
@Override
public int count(Map<String, Object> map) {
return payDao.count(map);
}
@Override
public int save(PayDO pay) {
return payDao.save(pay);
}
@Override
public int update(PayDO pay) {
return payDao.update(pay);
}
@Override
public int remove(Long id) {
return payDao.remove(id);
}
@Override
public int batchRemove(Long[] ids) {
return payDao.batchRemove(ids);
}
@Override
public Map<Object, Object> tableSta(Date minDate) {
List<Map<Object, Object>> maps = payDao.tableSta(minDate);
return maps.stream().collect(Collectors.toMap(x -> x.get("staDate"), x -> x.get("orderCount")));
} }
} }

View File

@ -0,0 +1,67 @@
package com.java2nb.novel.service.impl;
import com.java2nb.novel.dao.UserDao;
import com.java2nb.novel.dao.UserFeedbackDao;
import com.java2nb.novel.domain.UserDO;
import com.java2nb.novel.domain.UserFeedbackDO;
import com.java2nb.novel.service.UserFeedbackService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
public class UserFeedbackServiceImpl implements UserFeedbackService {
@Autowired
private UserFeedbackDao userFeedbackDao;
@Autowired
private UserDao userDao;
@Override
public UserFeedbackDO get(Long id) {
return userFeedbackDao.get(id);
}
@Override
public List<UserFeedbackDO> list(Map<String, Object> map) {
List<UserFeedbackDO> list = userFeedbackDao.list(map);
if (!CollectionUtils.isEmpty(list)) {
List<Long> userIds = list.stream().map(UserFeedbackDO::getUserId).collect(Collectors.toList());
Map<Long, String> userNameMap = userDao.batchGet(userIds).stream()
.collect(Collectors.toMap(UserDO::getId, UserDO::getUsername));
list.forEach(v -> v.setUserName(userNameMap.get(v.getUserId())));
}
return list;
}
@Override
public int count(Map<String, Object> map) {
return userFeedbackDao.count(map);
}
@Override
public int save(UserFeedbackDO userFeedback) {
return userFeedbackDao.save(userFeedback);
}
@Override
public int update(UserFeedbackDO userFeedback) {
return userFeedbackDao.update(userFeedback);
}
@Override
public int remove(Long id) {
return userFeedbackDao.remove(id);
}
@Override
public int batchRemove(Long[] ids) {
return userFeedbackDao.batchRemove(ids);
}
}

View File

@ -0,0 +1,55 @@
package com.java2nb.novel.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import com.java2nb.novel.dao.WebsiteInfoDao;
import com.java2nb.novel.domain.WebsiteInfoDO;
import com.java2nb.novel.service.WebsiteInfoService;
@Service
public class WebsiteInfoServiceImpl implements WebsiteInfoService {
@Autowired
private WebsiteInfoDao websiteInfoDao;
@Override
public WebsiteInfoDO get(Long id){
return websiteInfoDao.get(id);
}
@Override
public List<WebsiteInfoDO> list(Map<String, Object> map){
return websiteInfoDao.list(map);
}
@Override
public int count(Map<String, Object> map){
return websiteInfoDao.count(map);
}
@Override
public int save(WebsiteInfoDO websiteInfo){
return websiteInfoDao.save(websiteInfo);
}
@Override
public int update(WebsiteInfoDO websiteInfo){
return websiteInfoDao.update(websiteInfo);
}
@Override
public int remove(Long id){
return websiteInfoDao.remove(id);
}
@Override
public int batchRemove(Long[] ids){
return websiteInfoDao.batchRemove(ids);
}
}

View File

@ -5,15 +5,16 @@ import com.java2nb.common.config.Constant;
import com.java2nb.common.controller.BaseController; import com.java2nb.common.controller.BaseController;
import com.java2nb.common.domain.Tree; import com.java2nb.common.domain.Tree;
import com.java2nb.common.service.DictService; import com.java2nb.common.service.DictService;
import com.java2nb.common.utils.*; import com.java2nb.common.utils.MD5Utils;
import com.java2nb.common.utils.PageBean;
import com.java2nb.common.utils.Query;
import com.java2nb.common.utils.R;
import com.java2nb.system.domain.DeptDO; import com.java2nb.system.domain.DeptDO;
import com.java2nb.system.domain.RoleDO; import com.java2nb.system.domain.RoleDO;
import com.java2nb.system.domain.UserDO; import com.java2nb.system.domain.UserDO;
import com.java2nb.system.service.RoleService; import com.java2nb.system.service.RoleService;
import com.java2nb.system.service.SysUserService; import com.java2nb.system.service.SysUserService;
import com.java2nb.system.vo.UserVO; import com.java2nb.system.vo.UserVO;
import javax.servlet.http.HttpServletRequest;
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;
@ -21,6 +22,7 @@ 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 javax.servlet.http.HttpServletRequest;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -28,217 +30,219 @@ import java.util.Map;
@RequestMapping("/sys/user") @RequestMapping("/sys/user")
@Controller @Controller
public class SysUserController extends BaseController { public class SysUserController extends BaseController {
private String prefix="system/user" ;
@Autowired
SysUserService userService;
@Autowired
RoleService roleService;
@Autowired
DictService dictService;
@Autowired
RedisUtil redisUtil;
@RequiresPermissions("sys:user:user") private String prefix = "system/user";
@GetMapping("") @Autowired
String user(Model model) { SysUserService userService;
return prefix + "/user"; @Autowired
} RoleService roleService;
@Autowired
DictService dictService;
@GetMapping("/list") @RequiresPermissions("sys:user:user")
@ResponseBody @GetMapping("")
PageBean list(@RequestParam Map<String, Object> params) { String user(Model model) {
// 查询列表数据 return prefix + "/user";
Query query = new Query(params); }
List<UserDO> sysUserList = userService.list(query);
int total = userService.count(query);
PageBean pageUtil = new PageBean(sysUserList, total);
return pageUtil;
}
@RequiresPermissions("sys:user:add") @GetMapping("/list")
@Log("添加用户") @ResponseBody
@GetMapping("/add") PageBean list(@RequestParam Map<String, Object> params) {
String add(Model model) { // 查询列表数据
List<RoleDO> roles = roleService.list(); Query query = new Query(params);
model.addAttribute("roles", roles); List<UserDO> sysUserList = userService.list(query);
return prefix + "/add"; int total = userService.count(query);
} PageBean pageUtil = new PageBean(sysUserList, total);
return pageUtil;
}
@RequiresPermissions("sys:user:edit") @RequiresPermissions("sys:user:add")
@Log("编辑用户") @Log("添加用户")
@GetMapping("/edit/{id}") @GetMapping("/add")
String edit(Model model, @PathVariable("id") Long id) { String add(Model model) {
UserDO userDO = userService.get(id); List<RoleDO> roles = roleService.list();
model.addAttribute("user", userDO); model.addAttribute("roles", roles);
List<RoleDO> roles = roleService.list(id); return prefix + "/add";
model.addAttribute("roles", roles); }
return prefix+"/edit";
}
public static void main(String[] args) { @RequiresPermissions("sys:user:edit")
System.out.println(MD5Utils.encrypt("admin", "admin")); @Log("编辑用户")
} @GetMapping("/edit/{id}")
String edit(Model model, @PathVariable("id") Long id) {
UserDO userDO = userService.get(id);
model.addAttribute("user", userDO);
List<RoleDO> roles = roleService.list(id);
model.addAttribute("roles", roles);
return prefix + "/edit";
}
@RequiresPermissions("sys:user:add") public static void main(String[] args) {
@Log("保存用户") System.out.println(MD5Utils.encrypt("admin", "admin"));
@PostMapping("/save") }
@ResponseBody
R save(UserDO user) {
if (Constant.DEMO_ACCOUNT.equals(getUsername())) {
return R.error(1, "演示系统不允许修改,完整体验请部署程序");
}
user.setPassword(MD5Utils.encrypt(user.getUsername(), user.getPassword()));
if (userService.save(user) > 0) {
return R.ok();
}
return R.error();
}
@RequiresPermissions("sys:user:edit") @RequiresPermissions("sys:user:add")
@Log("更新用户") @Log("保存用户")
@PostMapping("/update") @PostMapping("/save")
@ResponseBody @ResponseBody
R update(UserDO user) { R save(UserDO user) {
if (Constant.DEMO_ACCOUNT.equals(getUsername())) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) {
return R.error(1, "演示系统不允许修改,完整体验请部署程序"); return R.error(1, "演示系统不允许修改,完整体验请部署程序");
} }
if (userService.update(user) > 0) { user.setPassword(MD5Utils.encrypt(user.getUsername(), user.getPassword()));
return R.ok(); if (userService.save(user) > 0) {
} return R.ok();
return R.error(); }
} return R.error();
}
@RequiresPermissions("sys:user:edit")
@Log("更新用户")
@PostMapping("/update")
@ResponseBody
R update(UserDO user) {
if (Constant.DEMO_ACCOUNT.equals(getUsername())) {
return R.error(1, "演示系统不允许修改,完整体验请部署程序");
}
if (userService.update(user) > 0) {
return R.ok();
}
return R.error();
}
@RequiresPermissions("sys:user:edit") @RequiresPermissions("sys:user:edit")
@Log("更新用户") @Log("更新用户")
@PostMapping("/updatePeronal") @PostMapping("/updatePeronal")
@ResponseBody @ResponseBody
R updatePeronal(UserDO user) { R updatePeronal(UserDO user) {
if (Constant.DEMO_ACCOUNT.equals(getUsername())) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) {
return R.error(1, "演示系统不允许修改,完整体验请部署程序"); return R.error(1, "演示系统不允许修改,完整体验请部署程序");
} }
if (userService.updatePersonal(user) > 0) { if (userService.updatePersonal(user) > 0) {
return R.ok(); return R.ok();
} }
return R.error(); return R.error();
} }
@RequiresPermissions("sys:user:remove") @RequiresPermissions("sys:user:remove")
@Log("删除用户") @Log("删除用户")
@PostMapping("/remove") @PostMapping("/remove")
@ResponseBody @ResponseBody
R remove(Long id) { R remove(Long id) {
if (Constant.DEMO_ACCOUNT.equals(getUsername())) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) {
return R.error(1, "演示系统不允许修改,完整体验请部署程序"); return R.error(1, "演示系统不允许修改,完整体验请部署程序");
} }
if (userService.remove(id) > 0) { if (userService.remove(id) > 0) {
return R.ok(); return R.ok();
} }
return R.error(); return R.error();
} }
@RequiresPermissions("sys:user:batchRemove") @RequiresPermissions("sys:user:batchRemove")
@Log("批量删除用户") @Log("批量删除用户")
@PostMapping("/batchRemove") @PostMapping("/batchRemove")
@ResponseBody @ResponseBody
R batchRemove(@RequestParam("ids[]") Long[] userIds) { R batchRemove(@RequestParam("ids[]") Long[] userIds) {
if (Constant.DEMO_ACCOUNT.equals(getUsername())) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) {
return R.error(1, "演示系统不允许修改,完整体验请部署程序"); return R.error(1, "演示系统不允许修改,完整体验请部署程序");
} }
int r = userService.batchremove(userIds); int r = userService.batchremove(userIds);
if (r > 0) { if (r > 0) {
return R.ok(); return R.ok();
} }
return R.error(); return R.error();
} }
@PostMapping("/exit") @PostMapping("/exit")
@ResponseBody @ResponseBody
boolean exit(@RequestParam Map<String, Object> params) { boolean exit(@RequestParam Map<String, Object> params) {
// 存在不通过false // 存在不通过false
return !userService.exit(params); return !userService.exit(params);
} }
@RequiresPermissions("sys:user:resetPwd") @RequiresPermissions("sys:user:resetPwd")
@Log("请求更改用户密码") @Log("请求更改用户密码")
@GetMapping("/resetPwd/{id}") @GetMapping("/resetPwd/{id}")
String resetPwd(@PathVariable("id") Long userId, Model model) { String resetPwd(@PathVariable("id") Long userId, Model model) {
UserDO userDO = new UserDO(); UserDO userDO = new UserDO();
userDO.setUserId(userId); userDO.setUserId(userId);
model.addAttribute("user", userDO); model.addAttribute("user", userDO);
return prefix + "/reset_pwd"; return prefix + "/reset_pwd";
} }
@Log("提交更改用户密码") @Log("提交更改用户密码")
@PostMapping("/resetPwd") @PostMapping("/resetPwd")
@ResponseBody @ResponseBody
R resetPwd(UserVO userVO) { R resetPwd(UserVO userVO) {
if (Constant.DEMO_ACCOUNT.equals(getUsername())) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) {
return R.error(1, "演示系统不允许修改,完整体验请部署程序"); return R.error(1, "演示系统不允许修改,完整体验请部署程序");
} }
try{ try {
userService.resetPwd(userVO,getUser()); userService.resetPwd(userVO, getUser());
return R.ok(); return R.ok();
}catch (Exception e){ } catch (Exception e) {
return R.error(1,e.getMessage()); return R.error(1, e.getMessage());
} }
} }
@RequiresPermissions("sys:user:resetPwd")
@Log("admin提交更改用户密码")
@PostMapping("/adminResetPwd")
@ResponseBody
R adminResetPwd(UserVO userVO) {
if (Constant.DEMO_ACCOUNT.equals(getUsername())) {
return R.error(1, "演示系统不允许修改,完整体验请部署程序");
}
try{
userService.adminResetPwd(userVO);
return R.ok();
}catch (Exception e){
return R.error(1,e.getMessage());
}
} @RequiresPermissions("sys:user:resetPwd")
@GetMapping("/tree") @Log("admin提交更改用户密码")
@ResponseBody @PostMapping("/adminResetPwd")
public Tree<DeptDO> tree() { @ResponseBody
Tree<DeptDO> tree = new Tree<DeptDO>(); R adminResetPwd(UserVO userVO) {
tree = userService.getTree(); if (Constant.DEMO_ACCOUNT.equals(getUsername())) {
return tree; return R.error(1, "演示系统不允许修改,完整体验请部署程序");
} }
try {
userService.adminResetPwd(userVO);
return R.ok();
} catch (Exception e) {
return R.error(1, e.getMessage());
}
@GetMapping("/treeView") }
String treeView() {
return prefix + "/userTree";
}
@GetMapping("/personal") @GetMapping("/tree")
String personal(Model model) { @ResponseBody
UserDO userDO = userService.get(getUserId()); public Tree<DeptDO> tree() {
model.addAttribute("user",userDO); Tree<DeptDO> tree = new Tree<DeptDO>();
model.addAttribute("hobbyList",dictService.getHobbyList(userDO)); tree = userService.getTree();
model.addAttribute("sexList",dictService.getSexList()); return tree;
return prefix + "/personal"; }
}
@ResponseBody @GetMapping("/treeView")
@PostMapping("/uploadImg") String treeView() {
R uploadImg(@RequestParam("avatar_file") MultipartFile file, String avatar_data, HttpServletRequest request) { return prefix + "/userTree";
if ("test".equals(getUsername())) { }
return R.error(1, "演示系统不允许修改,完整体验请部署程序");
} @GetMapping("/personal")
Map<String, Object> result = new HashMap<>(); String personal(Model model) {
try { UserDO userDO = userService.get(getUserId());
result = userService.updatePersonalImg(file, avatar_data, getUserId()); model.addAttribute("user", userDO);
} catch (Exception e) { model.addAttribute("hobbyList", dictService.getHobbyList(userDO));
return R.error("更新图像失败!"); model.addAttribute("sexList", dictService.getSexList());
} return prefix + "/personal";
if(result!=null && result.size()>0){ }
return R.ok(result);
}else { @ResponseBody
return R.error("更新图像失败!"); @PostMapping("/uploadImg")
} R uploadImg(@RequestParam("avatar_file") MultipartFile file, String avatar_data, HttpServletRequest request) {
} if ("test".equals(getUsername())) {
return R.error(1, "演示系统不允许修改,完整体验请部署程序");
}
Map<String, Object> result = new HashMap<>();
try {
result = userService.updatePersonalImg(file, avatar_data, getUserId());
} catch (Exception e) {
return R.error("更新图像失败!");
}
if (result != null && result.size() > 0) {
return R.ok(result);
} else {
return R.error("更新图像失败!");
}
}
} }

View File

@ -1,174 +1,212 @@
package com.java2nb.system.domain; package com.java2nb.system.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;
import java.util.Objects;
/** /**
* 数据权限管理 * 数据权限管理
* *
* @author xiongxy * @author xiongxy
* @email 1179705413@qq.com * @email 1179705413@qq.com
* @date 2019-11-25 11:40:03 * @date 2019-11-25 11:40:03
*/ */
public class DataPermDO implements Serializable { public class DataPermDO 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;
//权限名称
private String name;
//数据表名称
private String tableName;
//所属模块
private String moduleName;
//用户权限控制属性名
private String crlAttrName;
//数据表权限控制列名
private String crlColumnName;
//权限codeall_开头表示查看所有数据的权限sup_开头表示查看下级数据的权限own_开头表示查看本级数据的权限
private String permCode;
//排序
private Integer orderNum;
//创建时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date gmtCreate;
//修改时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date gmtModified;
/**
* 设置: //
*/ //java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
public void setId(Long id) { //所以通过序列化成字符串来解决
this.id = id; @JsonSerialize(using = LongToStringSerializer.class)
} private Long id;
/** //权限名称
* 获取: private String name;
*/ //数据表名称
public Long getId() { private String tableName;
return id; //所属模块
} private String moduleName;
/** //用户权限控制属性名
* 设置:权限名称 private String crlAttrName;
*/ //数据表权限控制列名
public void setName(String name) { private String crlColumnName;
this.name = name; //权限codeall_开头表示查看所有数据的权限sup_开头表示查看下级数据的权限own_开头表示查看本级数据的权限
} private String permCode;
/** //排序
* 获取:权限名称 private Integer orderNum;
*/ //创建时间
public String getName() { @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
return name; private Date gmtCreate;
} //修改时间
/** @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
* 设置:数据表名称 private Date gmtModified;
*/
public void setTableName(String tableName) { /**
this.tableName = tableName; * 设置:
} */
/** public void setId(Long id) {
* 获取:数据表名称 this.id = id;
*/ }
public String getTableName() {
return tableName; /**
} * 获取:
/** */
* 设置:所属模块 public Long getId() {
*/ return id;
public void setModuleName(String moduleName) { }
this.moduleName = moduleName;
} /**
/** * 设置:权限名称
* 获取:所属模块 */
*/ public void setName(String name) {
public String getModuleName() { this.name = name;
return moduleName; }
}
/** /**
* 设置:用户权限控制属性名 * 获取:权限名称
*/ */
public void setCrlAttrName(String crlAttrName) { public String getName() {
this.crlAttrName = crlAttrName; return name;
} }
/**
* 获取:用户权限控制属性名 /**
*/ * 设置:数据表名称
public String getCrlAttrName() { */
return crlAttrName; public void setTableName(String tableName) {
} this.tableName = tableName;
/** }
* 设置:数据表权限控制列名
*/ /**
public void setCrlColumnName(String crlColumnName) { * 获取:数据表名称
this.crlColumnName = crlColumnName; */
} public String getTableName() {
/** return tableName;
* 获取:数据表权限控制列名 }
*/
public String getCrlColumnName() { /**
return crlColumnName; * 设置:所属模块
} */
/** public void setModuleName(String moduleName) {
* 设置权限codeall_开头表示查看所有数据的权限sup_开头表示查看下级数据的权限own_开头表示查看本级数据的权限 this.moduleName = moduleName;
*/ }
public void setPermCode(String permCode) {
this.permCode = permCode; /**
} * 获取:所属模块
/** */
* 获取权限codeall_开头表示查看所有数据的权限sup_开头表示查看下级数据的权限own_开头表示查看本级数据的权限 public String getModuleName() {
*/ return moduleName;
public String getPermCode() { }
return permCode;
} /**
/** * 设置:用户权限控制属性名
* 设置:排序 */
*/ public void setCrlAttrName(String crlAttrName) {
public void setOrderNum(Integer orderNum) { this.crlAttrName = crlAttrName;
this.orderNum = orderNum; }
}
/** /**
* 获取:排序 * 获取:用户权限控制属性名
*/ */
public Integer getOrderNum() { public String getCrlAttrName() {
return orderNum; return crlAttrName;
} }
/**
* 设置:创建时间 /**
*/ * 设置:数据表权限控制列名
public void setGmtCreate(Date gmtCreate) { */
this.gmtCreate = gmtCreate; public void setCrlColumnName(String crlColumnName) {
} this.crlColumnName = crlColumnName;
/** }
* 获取:创建时间
*/ /**
public Date getGmtCreate() { * 获取:数据表权限控制列名
return gmtCreate; */
} public String getCrlColumnName() {
/** return crlColumnName;
* 设置:修改时间 }
*/
public void setGmtModified(Date gmtModified) { /**
this.gmtModified = gmtModified; * 设置权限codeall_开头表示查看所有数据的权限sup_开头表示查看下级数据的权限own_开头表示查看本级数据的权限
} */
/** public void setPermCode(String permCode) {
* 获取:修改时间 this.permCode = permCode;
*/ }
public Date getGmtModified() {
return gmtModified; /**
} * 获取权限codeall_开头表示查看所有数据的权限sup_开头表示查看下级数据的权限own_开头表示查看本级数据的权限
*/
public String getPermCode() {
return permCode;
}
/**
* 设置:排序
*/
public void setOrderNum(Integer orderNum) {
this.orderNum = orderNum;
}
/**
* 获取:排序
*/
public Integer getOrderNum() {
return orderNum;
}
/**
* 设置:创建时间
*/
public void setGmtCreate(Date gmtCreate) {
this.gmtCreate = gmtCreate;
}
/**
* 获取:创建时间
*/
public Date getGmtCreate() {
return gmtCreate;
}
/**
* 设置:修改时间
*/
public void setGmtModified(Date gmtModified) {
this.gmtModified = gmtModified;
}
/**
* 获取:修改时间
*/
public Date getGmtModified() {
return gmtModified;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
DataPermDO that = (DataPermDO) o;
return Objects.equals(id, that.id) && Objects.equals(name, that.name)
&& Objects.equals(tableName, that.tableName) && Objects.equals(moduleName, that.moduleName)
&& Objects.equals(crlAttrName, that.crlAttrName) && Objects.equals(crlColumnName,
that.crlColumnName) && Objects.equals(permCode, that.permCode) && Objects.equals(orderNum,
that.orderNum) && Objects.equals(gmtCreate, that.gmtCreate) && Objects.equals(gmtModified,
that.gmtModified);
}
@Override
public int hashCode() {
return Objects.hash(id, name, tableName, moduleName, crlAttrName, crlColumnName, permCode, orderNum, gmtCreate,
gmtModified);
}
} }

View File

@ -1,10 +1,12 @@
package com.java2nb.system.service.impl; package com.java2nb.system.service.impl;
import com.java2nb.common.domain.DictDO;
import com.java2nb.common.domain.Tree; import com.java2nb.common.domain.Tree;
import com.java2nb.common.utils.BuildTree; import com.java2nb.common.utils.BuildTree;
import com.java2nb.common.utils.IdWorker; import com.java2nb.common.utils.IdWorker;
import com.java2nb.system.dao.DataPermDao;
import com.java2nb.system.dao.RoleDataPermDao; import com.java2nb.system.dao.RoleDataPermDao;
import com.java2nb.system.domain.DataPermDO;
import com.java2nb.system.service.DataPermService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -12,119 +14,116 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
import com.java2nb.system.dao.DataPermDao;
import com.java2nb.system.domain.DataPermDO;
import com.java2nb.system.service.DataPermService;
@Service @Service
public class DataPermServiceImpl implements DataPermService { public class DataPermServiceImpl implements DataPermService {
@Autowired
private DataPermDao dataPermDao;
@Autowired @Autowired
private RoleDataPermDao roleDataPermDao; private DataPermDao dataPermDao;
@Override
public DataPermDO get(Long id){
return dataPermDao.get(id);
}
@Override
public List<DataPermDO> list(Map<String, Object> map){
return dataPermDao.list(map);
}
@Override
public int count(Map<String, Object> map){
return dataPermDao.count(map);
}
@Override
public int save(DataPermDO dataPerm){
return dataPermDao.save(dataPerm);
}
@Override
public int update(DataPermDO dataPerm){
return dataPermDao.update(dataPerm);
}
@Override
public int remove(Long id){
return dataPermDao.remove(id);
}
@Override
public int batchRemove(Long[] ids){
return dataPermDao.batchRemove(ids);
}
@Override @Autowired
public List<DataPermDO> listModuleName() { private RoleDataPermDao roleDataPermDao;
return dataPermDao.listModuleName();
}
@Override @Override
public Tree<DataPermDO> getTree() { public DataPermDO get(Long id) {
List<Tree<DataPermDO>> trees = new ArrayList<Tree<DataPermDO>>(); return dataPermDao.get(id);
List<DataPermDO> permDOs = dataPermDao.list(new HashMap<>(16)); }
Map<String,String> topTree = new HashMap<>();
for (DataPermDO permDO : permDOs) {
Tree<DataPermDO> tree = new Tree<>();
tree.setId(permDO.getId().toString());
if(!topTree.containsKey(permDO.getModuleName())){
Tree<DataPermDO> parentTree = new Tree<>();
String id = new IdWorker().nextId()+"";
parentTree.setId(id);
parentTree.setParentId(0+"");
parentTree.setText(permDO.getModuleName());
topTree.put(permDO.getModuleName(),id);
trees.add(parentTree);
}
tree.setParentId(topTree.get(permDO.getModuleName()));
tree.setText(permDO.getName());
trees.add(tree);
}
// 默认顶级菜单为0,根据数据库实际情况调整
Tree<DataPermDO> t = BuildTree.build(trees);
return t;
}
@Override @Override
public Tree<DataPermDO> getTree(Long roleId) { public List<DataPermDO> list(Map<String, Object> map) {
List<Tree<DataPermDO>> trees = new ArrayList<Tree<DataPermDO>>(); return dataPermDao.list(map);
List<DataPermDO> permDOs = dataPermDao.list(new HashMap<>(16)); }
List<Long> permIds = roleDataPermDao.listPermIdByRoleId(roleId);
Map<String,String> topTree = new HashMap<>(); @Override
for (DataPermDO permDO : permDOs) { public int count(Map<String, Object> map) {
Tree<DataPermDO> tree = new Tree<>(); return dataPermDao.count(map);
tree.setId(permDO.getId().toString()); }
if(!topTree.containsKey(permDO.getModuleName())){
Tree<DataPermDO> parentTree = new Tree<>(); @Override
String id = new IdWorker().nextId()+""; public int save(DataPermDO dataPerm) {
parentTree.setId(id); return dataPermDao.save(dataPerm);
parentTree.setParentId(0+""); }
parentTree.setText(permDO.getModuleName());
topTree.put(permDO.getModuleName(),id); @Override
trees.add(parentTree); public int update(DataPermDO dataPerm) {
} return dataPermDao.update(dataPerm);
tree.setParentId(topTree.get(permDO.getModuleName())); }
tree.setText(permDO.getName());
Map<String, Object> state = new HashMap<>(16); @Override
if (permIds.contains(permDO.getId())) { public int remove(Long id) {
state.put("selected", true); return dataPermDao.remove(id);
} else { }
state.put("selected", false);
} @Override
tree.setState(state); public int batchRemove(Long[] ids) {
trees.add(tree); return dataPermDao.batchRemove(ids);
} }
// 默认顶级菜单为0,根据数据库实际情况调整
Tree<DataPermDO> t = BuildTree.build(trees); @Override
return t; public List<DataPermDO> listModuleName() {
} return dataPermDao.listModuleName().stream().distinct().collect(Collectors.toList());
}
@Override
public Tree<DataPermDO> getTree() {
List<Tree<DataPermDO>> trees = new ArrayList<Tree<DataPermDO>>();
List<DataPermDO> permDOs = dataPermDao.list(new HashMap<>(16));
Map<String, String> topTree = new HashMap<>();
for (DataPermDO permDO : permDOs) {
Tree<DataPermDO> tree = new Tree<>();
tree.setId(permDO.getId().toString());
if (!topTree.containsKey(permDO.getModuleName())) {
Tree<DataPermDO> parentTree = new Tree<>();
String id = new IdWorker().nextId() + "";
parentTree.setId(id);
parentTree.setParentId(0 + "");
parentTree.setText(permDO.getModuleName());
topTree.put(permDO.getModuleName(), id);
trees.add(parentTree);
}
tree.setParentId(topTree.get(permDO.getModuleName()));
tree.setText(permDO.getName());
trees.add(tree);
}
// 默认顶级菜单为0,根据数据库实际情况调整
Tree<DataPermDO> t = BuildTree.build(trees);
return t;
}
@Override
public Tree<DataPermDO> getTree(Long roleId) {
List<Tree<DataPermDO>> trees = new ArrayList<Tree<DataPermDO>>();
List<DataPermDO> permDOs = dataPermDao.list(new HashMap<>(16));
List<Long> permIds = roleDataPermDao.listPermIdByRoleId(roleId);
Map<String, String> topTree = new HashMap<>();
for (DataPermDO permDO : permDOs) {
Tree<DataPermDO> tree = new Tree<>();
tree.setId(permDO.getId().toString());
if (!topTree.containsKey(permDO.getModuleName())) {
Tree<DataPermDO> parentTree = new Tree<>();
String id = new IdWorker().nextId() + "";
parentTree.setId(id);
parentTree.setParentId(0 + "");
parentTree.setText(permDO.getModuleName());
topTree.put(permDO.getModuleName(), id);
trees.add(parentTree);
}
tree.setParentId(topTree.get(permDO.getModuleName()));
tree.setText(permDO.getName());
Map<String, Object> state = new HashMap<>(16);
if (permIds.contains(permDO.getId())) {
state.put("selected", true);
} else {
state.put("selected", false);
}
tree.setState(state);
trees.add(tree);
}
// 默认顶级菜单为0,根据数据库实际情况调整
Tree<DataPermDO> t = BuildTree.build(trees);
return t;
}
} }

View File

@ -1,14 +1,19 @@
package com.java2nb.system.service.impl; package com.java2nb.system.service.impl;
import java.awt.image.BufferedImage; import com.java2nb.common.config.Constant;
import java.io.ByteArrayOutputStream;
import java.util.*;
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.domain.Tree;
import com.java2nb.common.service.FileService; import com.java2nb.common.service.FileService;
import com.java2nb.common.utils.*; import com.java2nb.common.utils.*;
import com.java2nb.system.dao.DeptDao;
import com.java2nb.system.dao.SysUserDao;
import com.java2nb.system.dao.UserRoleDao;
import com.java2nb.system.domain.DeptDO;
import com.java2nb.system.domain.UserDO;
import com.java2nb.system.domain.UserRoleDO;
import com.java2nb.system.service.DeptService; import com.java2nb.system.service.DeptService;
import com.java2nb.system.service.SysUserService;
import com.java2nb.system.vo.UserVO; import com.java2nb.system.vo.UserVO;
import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.ArrayUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -16,22 +21,17 @@ import org.slf4j.LoggerFactory;
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.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import com.java2nb.common.domain.Tree;
import com.java2nb.system.dao.DeptDao;
import com.java2nb.system.dao.SysUserDao;
import com.java2nb.system.dao.UserRoleDao;
import com.java2nb.system.domain.DeptDO;
import com.java2nb.system.domain.UserDO;
import com.java2nb.system.domain.UserRoleDO;
import com.java2nb.system.service.SysUserService;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.util.*;
@Transactional @Transactional
@Service @Service
public class SysUserServiceImpl implements SysUserService { public class SysUserServiceImpl implements SysUserService {
@Autowired @Autowired
SysUserDao userMapper; SysUserDao userMapper;
@Autowired @Autowired
@ -64,7 +64,7 @@ public class SysUserServiceImpl implements SysUserService {
List<Long> childIds = deptService.listChildrenIds(deptIdl); List<Long> childIds = deptService.listChildrenIds(deptIdl);
childIds.add(deptIdl); childIds.add(deptIdl);
map.put("deptId", null); map.put("deptId", null);
map.put("deptIds",childIds); map.put("deptIds", childIds);
} }
return userMapper.listByPerm(map); return userMapper.listByPerm(map);
} }
@ -213,7 +213,7 @@ public class SysUserServiceImpl implements SysUserService {
public Map<String, Object> updatePersonalImg(MultipartFile file, String avatar_data, Long userId) throws Exception { public Map<String, Object> updatePersonalImg(MultipartFile file, String avatar_data, Long userId) throws Exception {
String fileName = file.getOriginalFilename(); String fileName = file.getOriginalFilename();
fileName = FileUtil.renameToUUID(fileName); fileName = FileUtil.renameToUUID(fileName);
FileDO sysFile = new FileDO(FileType.fileType(fileName), "/files/" + fileName, new Date()); FileDO sysFile = new FileDO(FileType.fileType(fileName), Constant.UPLOAD_FILES_PREFIX + fileName, new Date());
//获取图片后缀 //获取图片后缀
String prefix = fileName.substring((fileName.lastIndexOf(".") + 1)); String prefix = fileName.substring((fileName.lastIndexOf(".") + 1));
String[] str = avatar_data.split(","); String[] str = avatar_data.split(",");

View File

@ -1,135 +0,0 @@
package com.java2nb.test.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.test.domain.OrderDO;
import com.java2nb.test.service.OrderService;
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 2019-11-25 11:57:16
*/
@Controller
@RequestMapping("/test/order")
public class OrderController {
@Autowired
private OrderService orderService;
@GetMapping()
@RequiresPermissions("test:order:order")
String Order() {
return "test/order/order";
}
@ApiOperation(value = "获取付呗-订单信息表列表", notes = "获取付呗-订单信息表列表")
@ResponseBody
@GetMapping("/list")
@RequiresPermissions("test:order:order")
public R list(@RequestParam Map<String, Object> params) {
//查询列表数据
Query query = new Query(params);
List<OrderDO> orderList = orderService.list(query);
int total = orderService.count(query);
PageBean pageBean = new PageBean(orderList, total);
return R.ok().put("data", pageBean);
}
@ApiOperation(value = "新增付呗-订单信息表页面", notes = "新增付呗-订单信息表页面")
@GetMapping("/add")
@RequiresPermissions("test:order:add")
String add() {
return "test/order/add";
}
@ApiOperation(value = "修改付呗-订单信息表页面", notes = "修改付呗-订单信息表页面")
@GetMapping("/edit/{id}")
@RequiresPermissions("test:order:edit")
String edit(@PathVariable("id") Long id, Model model) {
OrderDO order = orderService.get(id);
model.addAttribute("order", order);
return "test/order/edit";
}
@ApiOperation(value = "查看付呗-订单信息表页面", notes = "查看付呗-订单信息表页面")
@GetMapping("/detail/{id}")
@RequiresPermissions("test:order:detail")
String detail(@PathVariable("id") Long id, Model model) {
OrderDO order = orderService.get(id);
model.addAttribute("order", order);
return "test/order/detail";
}
/**
* 保存
*/
@ApiOperation(value = "新增付呗-订单信息表", notes = "新增付呗-订单信息表")
@ResponseBody
@PostMapping("/save")
@RequiresPermissions("test:order:add")
public R save( OrderDO order) {
if (orderService.save(order) > 0) {
return R.ok();
}
return R.error();
}
/**
* 修改
*/
@ApiOperation(value = "修改付呗-订单信息表", notes = "修改付呗-订单信息表")
@ResponseBody
@RequestMapping("/update")
@RequiresPermissions("test:order:edit")
public R update( OrderDO order) {
orderService.update(order);
return R.ok();
}
/**
* 删除
*/
@ApiOperation(value = "删除付呗-订单信息表", notes = "删除付呗-订单信息表")
@PostMapping("/remove")
@ResponseBody
@RequiresPermissions("test:order:remove")
public R remove( Long id) {
if (orderService.remove(id) > 0) {
return R.ok();
}
return R.error();
}
/**
* 删除
*/
@ApiOperation(value = "批量删除付呗-订单信息表", notes = "批量删除付呗-订单信息表")
@PostMapping("/batchRemove")
@ResponseBody
@RequiresPermissions("test:order:batchRemove")
public R remove(@RequestParam("ids[]") Long[] ids) {
orderService.batchRemove(ids);
return R.ok();
}
}

View File

@ -1,32 +0,0 @@
package com.java2nb.test.dao;
import com.java2nb.test.domain.OrderDO;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
/**
* 付呗-订单信息表
* @author xiongxy
* @email 1179705413@qq.com
* @date 2019-11-25 11:57:16
*/
@Mapper
public interface OrderDao {
OrderDO get(Long id);
List<OrderDO> list(Map<String,Object> map);
int count(Map<String,Object> map);
int save(OrderDO order);
int update(OrderDO order);
int remove(Long id);
int batchRemove(Long[] ids);
}

View File

@ -1,475 +0,0 @@
package com.java2nb.test.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 2019-11-25 11:57:16
*/
public class OrderDO implements Serializable {
private static final long serialVersionUID = 1L;
//主键
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long id;
//付呗商户号
private String fbMerchantCode;
//第三方商户的订单号
private String merchantOrderSn;
//付呗订单号
private String orderSn;
//平台方订单号
private String platformOrderNo;
//商户单号
private String tradeNo;
//订单状态1未支付2支付成功3支付失败4支付取消
private Integer orderState;
//蜂鸟优惠卷抵扣
private Double fnCoupon;
//红包抵扣
private BigDecimal redPacket;
//实收金额(元)
private BigDecimal totalFee;
//订单金额
private BigDecimal orderPrice;
//手续费(元)
private BigDecimal fee;
//对商品或交易的描述
private String body;
//附加数据
private String attach;
//付呗系统的门店id
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long storeId;
//付呗系统的收银员id
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long cashierId;
//设备终端号
private String deviceNo;
//微信顾客支付授权的“open_id”或者支付宝顾客的“buyer_user_id”
private String userId;
//支付宝顾客的账号
private String userLogonId;
//交易成功的时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date payTime;
//支付通道:1微信、2支付宝、3银联
private Integer payChannel;
//免充值代金券金额(元)
private BigDecimal noCashCouponFee;
//预充值代金券金额(元)
private BigDecimal cashCouponFee;
//顾客实际支付金额(元)
private BigDecimal cashFee;
//签名
private String sign;
//其它选项
private String options;
//创建时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
//推送时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date pushTime;
//推送IP
private String pushIp;
//商户id
private BigDecimal mchtId;
//QR编号
private String sn;
/**
* 设置:主键
*/
public void setId(Long id) {
this.id = id;
}
/**
* 获取:主键
*/
public Long getId() {
return id;
}
/**
* 设置:付呗商户号
*/
public void setFbMerchantCode(String fbMerchantCode) {
this.fbMerchantCode = fbMerchantCode;
}
/**
* 获取:付呗商户号
*/
public String getFbMerchantCode() {
return fbMerchantCode;
}
/**
* 设置:第三方商户的订单号
*/
public void setMerchantOrderSn(String merchantOrderSn) {
this.merchantOrderSn = merchantOrderSn;
}
/**
* 获取:第三方商户的订单号
*/
public String getMerchantOrderSn() {
return merchantOrderSn;
}
/**
* 设置:付呗订单号
*/
public void setOrderSn(String orderSn) {
this.orderSn = orderSn;
}
/**
* 获取:付呗订单号
*/
public String getOrderSn() {
return orderSn;
}
/**
* 设置:平台方订单号
*/
public void setPlatformOrderNo(String platformOrderNo) {
this.platformOrderNo = platformOrderNo;
}
/**
* 获取:平台方订单号
*/
public String getPlatformOrderNo() {
return platformOrderNo;
}
/**
* 设置:商户单号
*/
public void setTradeNo(String tradeNo) {
this.tradeNo = tradeNo;
}
/**
* 获取:商户单号
*/
public String getTradeNo() {
return tradeNo;
}
/**
* 设置订单状态1未支付2支付成功3支付失败4支付取消
*/
public void setOrderState(Integer orderState) {
this.orderState = orderState;
}
/**
* 获取订单状态1未支付2支付成功3支付失败4支付取消
*/
public Integer getOrderState() {
return orderState;
}
/**
* 设置:蜂鸟优惠卷抵扣
*/
public void setFnCoupon(Double fnCoupon) {
this.fnCoupon = fnCoupon;
}
/**
* 获取:蜂鸟优惠卷抵扣
*/
public Double getFnCoupon() {
return fnCoupon;
}
/**
* 设置:红包抵扣
*/
public void setRedPacket(BigDecimal redPacket) {
this.redPacket = redPacket;
}
/**
* 获取:红包抵扣
*/
public BigDecimal getRedPacket() {
return redPacket;
}
/**
* 设置:实收金额(元)
*/
public void setTotalFee(BigDecimal totalFee) {
this.totalFee = totalFee;
}
/**
* 获取:实收金额(元)
*/
public BigDecimal getTotalFee() {
return totalFee;
}
/**
* 设置:订单金额
*/
public void setOrderPrice(BigDecimal orderPrice) {
this.orderPrice = orderPrice;
}
/**
* 获取:订单金额
*/
public BigDecimal getOrderPrice() {
return orderPrice;
}
/**
* 设置:手续费(元)
*/
public void setFee(BigDecimal fee) {
this.fee = fee;
}
/**
* 获取:手续费(元)
*/
public BigDecimal getFee() {
return fee;
}
/**
* 设置:对商品或交易的描述
*/
public void setBody(String body) {
this.body = body;
}
/**
* 获取:对商品或交易的描述
*/
public String getBody() {
return body;
}
/**
* 设置:附加数据
*/
public void setAttach(String attach) {
this.attach = attach;
}
/**
* 获取:附加数据
*/
public String getAttach() {
return attach;
}
/**
* 设置付呗系统的门店id
*/
public void setStoreId(Long storeId) {
this.storeId = storeId;
}
/**
* 获取付呗系统的门店id
*/
public Long getStoreId() {
return storeId;
}
/**
* 设置付呗系统的收银员id
*/
public void setCashierId(Long cashierId) {
this.cashierId = cashierId;
}
/**
* 获取付呗系统的收银员id
*/
public Long getCashierId() {
return cashierId;
}
/**
* 设置:设备终端号
*/
public void setDeviceNo(String deviceNo) {
this.deviceNo = deviceNo;
}
/**
* 获取:设备终端号
*/
public String getDeviceNo() {
return deviceNo;
}
/**
* 设置微信顾客支付授权的“open_id”或者支付宝顾客的“buyer_user_id”
*/
public void setUserId(String userId) {
this.userId = userId;
}
/**
* 获取微信顾客支付授权的“open_id”或者支付宝顾客的“buyer_user_id”
*/
public String getUserId() {
return userId;
}
/**
* 设置:支付宝顾客的账号
*/
public void setUserLogonId(String userLogonId) {
this.userLogonId = userLogonId;
}
/**
* 获取:支付宝顾客的账号
*/
public String getUserLogonId() {
return userLogonId;
}
/**
* 设置:交易成功的时间
*/
public void setPayTime(Date payTime) {
this.payTime = payTime;
}
/**
* 获取:交易成功的时间
*/
public Date getPayTime() {
return payTime;
}
/**
* 设置:支付通道:1微信、2支付宝、3银联
*/
public void setPayChannel(Integer payChannel) {
this.payChannel = payChannel;
}
/**
* 获取:支付通道:1微信、2支付宝、3银联
*/
public Integer getPayChannel() {
return payChannel;
}
/**
* 设置:免充值代金券金额(元)
*/
public void setNoCashCouponFee(BigDecimal noCashCouponFee) {
this.noCashCouponFee = noCashCouponFee;
}
/**
* 获取:免充值代金券金额(元)
*/
public BigDecimal getNoCashCouponFee() {
return noCashCouponFee;
}
/**
* 设置:预充值代金券金额(元)
*/
public void setCashCouponFee(BigDecimal cashCouponFee) {
this.cashCouponFee = cashCouponFee;
}
/**
* 获取:预充值代金券金额(元)
*/
public BigDecimal getCashCouponFee() {
return cashCouponFee;
}
/**
* 设置:顾客实际支付金额(元)
*/
public void setCashFee(BigDecimal cashFee) {
this.cashFee = cashFee;
}
/**
* 获取:顾客实际支付金额(元)
*/
public BigDecimal getCashFee() {
return cashFee;
}
/**
* 设置:签名
*/
public void setSign(String sign) {
this.sign = sign;
}
/**
* 获取:签名
*/
public String getSign() {
return sign;
}
/**
* 设置:其它选项
*/
public void setOptions(String options) {
this.options = options;
}
/**
* 获取:其它选项
*/
public String getOptions() {
return options;
}
/**
* 设置:创建时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:创建时间
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置:推送时间
*/
public void setPushTime(Date pushTime) {
this.pushTime = pushTime;
}
/**
* 获取:推送时间
*/
public Date getPushTime() {
return pushTime;
}
/**
* 设置推送IP
*/
public void setPushIp(String pushIp) {
this.pushIp = pushIp;
}
/**
* 获取推送IP
*/
public String getPushIp() {
return pushIp;
}
/**
* 设置商户id
*/
public void setMchtId(BigDecimal mchtId) {
this.mchtId = mchtId;
}
/**
* 获取商户id
*/
public BigDecimal getMchtId() {
return mchtId;
}
/**
* 设置QR编号
*/
public void setSn(String sn) {
this.sn = sn;
}
/**
* 获取QR编号
*/
public String getSn() {
return sn;
}
}

View File

@ -1,30 +0,0 @@
package com.java2nb.test.service;
import com.java2nb.test.domain.OrderDO;
import java.util.List;
import java.util.Map;
/**
* 付呗-订单信息表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2019-11-25 11:57:16
*/
public interface OrderService {
OrderDO get(Long id);
List<OrderDO> list(Map<String, Object> map);
int count(Map<String, Object> map);
int save(OrderDO order);
int update(OrderDO order);
int remove(Long id);
int batchRemove(Long[] ids);
}

View File

@ -1,55 +0,0 @@
package com.java2nb.test.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import com.java2nb.test.dao.OrderDao;
import com.java2nb.test.domain.OrderDO;
import com.java2nb.test.service.OrderService;
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderDao orderDao;
@Override
public OrderDO get(Long id){
return orderDao.get(id);
}
@Override
public List<OrderDO> list(Map<String, Object> map){
return orderDao.list(map);
}
@Override
public int count(Map<String, Object> map){
return orderDao.count(map);
}
@Override
public int save(OrderDO order){
return orderDao.save(order);
}
@Override
public int update(OrderDO order){
return orderDao.update(order);
}
@Override
public int remove(Long id){
return orderDao.remove(id);
}
@Override
public int batchRemove(Long[] ids){
return orderDao.batchRemove(ids);
}
}

View File

@ -1,5 +1,5 @@
java2nb: java2nb:
uploadPath: c:/var/java2nb/uploaded_files/ uploadPath: /var/pic/
username: admin username: admin
password: 111111 password: 111111
logging: logging:
@ -9,8 +9,8 @@ logging:
spring: spring:
datasource: datasource:
type: com.alibaba.druid.pool.DruidDataSource type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/novel_plus?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai url: jdbc:mysql://127.0.0.1:3306/novel_plus?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root username: root
password: test123456 password: test123456
#password: #password:
@ -39,7 +39,7 @@ spring:
redis: redis:
host: 127.0.0.1 host: 127.0.0.1
port: 6379 port: 6379
password: test password: test123456
# 连接超时时间毫秒 # 连接超时时间毫秒
timeout: 10000 timeout: 10000
jedis: jedis:
@ -51,4 +51,48 @@ spring:
# 连接池最大连接数使用负值表示没有限制 # 连接池最大连接数使用负值表示没有限制
max-active: 100 max-active: 100
# 连接池最大阻塞等待时间使用负值表示没有限制 # 连接池最大阻塞等待时间使用负值表示没有限制
max-wait: -1 max-wait: -1
####使用shardingJdbc时
####所有的jdbcType都不能是LONGVARCHAR,否则会导致java.io.NotSerializableException: java.io.StringReader错误
##### 应该替换所有的 LONGVARCHAR 类型为VARCHAR
sharding:
jdbc:
datasource:
names: ds0,ds1
ds0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/novel_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: test123456
ds1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/information_schema?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: test123456
config:
sharding:
props:
sql.show: true
tables:
book_content: #book_content表
key-generator-column-name: id #主键
actual-data-nodes: ds${0}.book_content${0..9} #数据节点
# database-strategy: #分库策略
# inline:
# sharding-column: book_id
# algorithm-expression: ds${book_id % 10}
table-strategy: #分表策略
inline:
shardingColumn: index_id
algorithm-expression: book_content${index_id % 10}
tables:
actual-data-nodes: ds${1}.tables
columns:
actual-data-nodes: ds${1}.columns
default-data-source-name: ds0

View File

@ -1,16 +1,19 @@
java2nb: java2nb:
uploadPath: /var/java2nb/uploaded_files/ uploadPath: /var/pic/
username: admin
password: 111111
logging: logging:
level: level:
root: error root: error
com.java2nb: info com.java2nb: error
spring: spring:
datasource: datasource:
type: com.alibaba.druid.pool.DruidDataSource type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/java2nb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: java2nb username: root
password: java2nb1019 password: test123456
#password:
initialSize: 1 initialSize: 1
minIdle: 3 minIdle: 3
maxActive: 20 maxActive: 20
@ -34,18 +37,56 @@ spring:
# 合并多个DruidDataSource的监控数据 # 合并多个DruidDataSource的监控数据
#useGlobalDataSourceStat: true #useGlobalDataSourceStat: true
redis: redis:
host: 127.0.0.1 host: 127.0.0.1
port: 6379 port: 6379
password: password: test
# 连接超时时间毫秒 # 连接超时时间毫秒
timeout: 10000 timeout: 10000
jedis: jedis:
pool: pool:
# 连接池中的最大空闲连接 # 连接池中的最大空闲连接
max-idle: 8 max-idle: 8
# 连接池中的最小空闲连接 # 连接池中的最小空闲连接
min-idle: 10 min-idle: 10
# 连接池最大连接数使用负值表示没有限制 # 连接池最大连接数使用负值表示没有限制
max-active: 100 max-active: 100
# 连接池最大阻塞等待时间使用负值表示没有限制 # 连接池最大阻塞等待时间使用负值表示没有限制
max-wait: -1 max-wait: -1
####使用shardingJdbc时
####所有的jdbcType都不能是LONGVARCHAR,否则会导致java.io.NotSerializableException: java.io.StringReader错误
##### 应该替换所有的 LONGVARCHAR 类型为VARCHAR
sharding:
jdbc:
datasource:
names: ds0 #,ds1
ds0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/novel_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: test123456
# ds1:
# type: com.alibaba.druid.pool.DruidDataSource
# driver-class-name: com.mysql.jdbc.Driver
# url: jdbc:mysql://localhost:3306/novel_plus2
# username: root
# password: test123456
config:
sharding:
props:
sql.show: true
tables:
book_content: #book_content表
key-generator-column-name: id #主键
actual-data-nodes: ds${0}.book_content${0..9} #数据节点
# database-strategy: #分库策略
# inline:
# sharding-column: book_id
# algorithm-expression: ds${book_id % 10}
table-strategy: #分表策略
inline:
shardingColumn: index_id
algorithm-expression: book_content${index_id % 10}

View File

@ -1,8 +1,8 @@
server: server:
session-timeout: 18000 session-timeout: 18000
# tomcat: # tomcat:
# max-threads: 1000 # max-threads: 1000
# min-spare-threads: 30 # min-spare-threads: 30
port: 80 port: 80
# uri-encoding: utf-8 # uri-encoding: utf-8
#security: #security:
@ -15,19 +15,20 @@ spring:
jackson: jackson:
time-zone: GMT+8 time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss date-format: yyyy-MM-dd HH:mm:ss
profiles: profiles:
active: dev active: dev
#上传文件的最大值10M
servlet: servlet:
multipart: multipart:
max-file-size: 30Mb max-file-size: 10485760
max-request-size: 30Mb
devtools: devtools:
restart: restart:
enabled: true enabled: true
cache: main:
type: ehcache allow-bean-definition-overriding: true
ehcache:
config: classpath:ehcache.xml
mybatis: mybatis:
configuration: configuration:
#自动将数据库带下划线的表字段值映射到Java类的驼峰字段上 #自动将数据库带下划线的表字段值映射到Java类的驼峰字段上
@ -36,3 +37,7 @@ mybatis:
typeAliasesPackage: com.java2nb.**.domain typeAliasesPackage: com.java2nb.**.domain
#[弃用]配置缓存和session存储方式默认ehcache,可选redis,[弃用]调整至 spring cache typeshiro.用户权限sessionspring.cache通用 #[弃用]配置缓存和session存储方式默认ehcache,可选redis,[弃用]调整至 spring cache typeshiro.用户权限sessionspring.cache通用
#[弃用]cacheType: ehcache #[弃用]cacheType: ehcache
logging:
config: classpath:logback-boot.xml

View File

@ -1,6 +1,15 @@
__ ________ ___. ${AnsiColor.CYAN}
|__|____ ___ _______ \_____ \ ____\_ |__
| \__ \\ \/ /\__ \ / ____/ / \| __ \ --------------------------------------------------------------------------------
| |/ __ \\ / / __ \_/ \| | \ \_\ \ ${AnsiColor.RED}
/\__| (____ /\_/ (____ /\_______ \___| /___ / || / | / /
\______| \/ \/ \/ \/ \/ || / | / / ___ // ___ ___ _ __
|| / /||/ / //___) ) // // ) ) // ) ) // ) ) ) )
||/ / | / // // // // / / // / / / /
| / | / ((____ // ((____ ((___/ / // / / / / 小说精品屋欢迎您!!!
-------Powered By XXY
${AnsiColor.CYAN}
--------------------------------------------------------------------------------
${AnsiColor.BRIGHT_YELLOW}
::: Spring-Boot ${spring-boot.formatted-version} :::

View File

@ -24,7 +24,7 @@
<!-- RollingFileAppender滚动记录文件先将日志记录到指定文件当符合某个条件时将日志记录到其他文件 --> <!-- RollingFileAppender滚动记录文件先将日志记录到指定文件当符合某个条件时将日志记录到其他文件 -->
<!-- 以下的大概意思是1.先按日期存日志日期变了将前一天的日志文件名重命名为XXX%日期%索引新的日志仍然是demo.log --> <!-- 以下的大概意思是1.先按日期存日志日期变了将前一天的日志文件名重命名为XXX%日期%索引新的日志仍然是demo.log -->
<!-- 2.如果日期没有发生变化但是当前日志的文件大小超过1KB时对当前日志进行分割 重命名 --> <!-- 2.如果日期没有发生变化但是当前日志的文件大小超过1KB时对当前日志进行分割 重命名 -->
<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>logs/debug.log</File> <File>logs/debug.log</File>
<!-- rollingPolicy:当发生滚动时决定 RollingFileAppender 的行为涉及文件移动和重命名 --> <!-- rollingPolicy:当发生滚动时决定 RollingFileAppender 的行为涉及文件移动和重命名 -->
@ -52,11 +52,13 @@
<!-- 控制台输出日志级别 --> <!-- 控制台输出日志级别 -->
<root level="INFO"> <root level="INFO">
<appender-ref ref="STDOUT" /> <appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root> </root>
<!-- 指定项目中某个包当有日志操作行为时的日志记录级别 --> <!-- 指定项目中某个包当有日志操作行为时的日志记录级别 -->
<!-- com.maijinjie.springboot 为根包也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG --> <!-- com.maijinjie.springboot 为根包也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->
<!-- 级别依次为从高到低FATAL > ERROR > WARN > INFO > DEBUG > TRACE --> <!-- 级别依次为从高到低FATAL > ERROR > WARN > INFO > DEBUG > TRACE -->
<logger name="com.java2nb" level="DEBUG"> <logger name="com.java2nb" level="DEBUG" additivity="false">
<appender-ref ref="debug" /> <appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</logger> </logger>
</configuration> </configuration>

View File

@ -3,130 +3,140 @@
<mapper namespace="com.java2nb.common.dao.DictDao"> <mapper namespace="com.java2nb.common.dao.DictDao">
<select id="get" resultType="com.java2nb.common.domain.DictDO"> <select id="get" resultType="com.java2nb.common.domain.DictDO">
select select `id`,
`id`,`name`,`value`,`type`,`description`,`sort`,`parent_id`,`create_by`,`create_date`,`update_by`,`update_date`,`remarks`,`del_flag` `name`,
from sys_dict where id = #{value} `value`,
</select> `type`,
`description`,
`sort`,
`parent_id`,
`create_by`,
`create_date`,
`update_by`,
`update_date`,
`remarks`,
`del_flag`
from sys_dict
where id = #{value}
</select>
<select id="list" resultType="com.java2nb.common.domain.DictDO"> <select id="list" resultType="com.java2nb.common.domain.DictDO">
select select
`id`,`name`,`value`,`type`,`description`,`sort`,`parent_id`,`create_by`,`create_date`,`update_by`,`update_date`,`remarks`,`del_flag` `id`,`name`,`value`,`type`,`description`,`sort`,`parent_id`,`create_by`,`create_date`,`update_by`,`update_date`,`remarks`,`del_flag`
from sys_dict from sys_dict
<where> <where>
<if test="id != null and id != ''"> and id = #{id} </if> <if test="id != null and id != ''">and id = #{id}</if>
<if test="name != null and name != ''"> and name = #{name} </if> <if test="name != null and name != ''">and name = #{name}</if>
<if test="value != null and value != ''"> and value = #{value} </if> <if test="value != null and value != ''">and value = #{value}</if>
<if test="type != null and type != ''"> and type = #{type} </if> <if test="type != null and type != ''">and type = #{type}</if>
<if test="description != null and description != ''"> and description = #{description} </if> <if test="description != null and description != ''">and description = #{description}</if>
<if test="sort != null and sort != ''"> and sort = #{sort} </if> <if test="sort != null and sort != ''">and sort = #{sort}</if>
<if test="parentId != null and parentId != ''"> and parent_id = #{parentId} </if> <if test="parentId != null and parentId != ''">and parent_id = #{parentId}</if>
<if test="createBy != null and createBy != ''"> and create_by = #{createBy} </if> <if test="createBy != null and createBy != ''">and create_by = #{createBy}</if>
<if test="createDate != null and createDate != ''"> and create_date = #{createDate} </if> <if test="createDate != null and createDate != ''">and create_date = #{createDate}</if>
<if test="updateBy != null and updateBy != ''"> and update_by = #{updateBy} </if> <if test="updateBy != null and updateBy != ''">and update_by = #{updateBy}</if>
<if test="updateDate != null and updateDate != ''"> and update_date = #{updateDate} </if> <if test="updateDate != null and updateDate != ''">and update_date = #{updateDate}</if>
<if test="remarks != null and remarks != ''"> and remarks = #{remarks} </if> <if test="remarks != null and remarks != ''">and remarks = #{remarks}</if>
<if test="delFlag != null and delFlag != ''"> and del_flag = #{delFlag} </if> <if test="delFlag != null and delFlag != ''">and del_flag = #{delFlag}</if>
</where> </where>
<choose> <choose>
<when test="sort != null and sort.trim() != ''"> <when test="sort != null and sort.trim() != ''">
order by ${sort} ${order} order by ${sort} ${order}
</when> </when>
<otherwise> <otherwise>
order by id desc order by id desc
</otherwise> </otherwise>
</choose> </choose>
<if test="offset != null and limit != null"> <if test="offset != null and limit != null">
limit #{offset}, #{limit} limit #{offset}, #{limit}
</if> </if>
</select> </select>
<select id="count" resultType="int"> <select id="count" resultType="int">
select count(*) from sys_dict select count(*) from sys_dict
<where> <where>
<if test="id != null and id != ''"> and id = #{id} </if> <if test="id != null and id != ''">and id = #{id}</if>
<if test="name != null and name != ''"> and name = #{name} </if> <if test="name != null and name != ''">and name = #{name}</if>
<if test="value != null and value != ''"> and value = #{value} </if> <if test="value != null and value != ''">and value = #{value}</if>
<if test="type != null and type != ''"> and type = #{type} </if> <if test="type != null and type != ''">and type = #{type}</if>
<if test="description != null and description != ''"> and description = #{description} </if> <if test="description != null and description != ''">and description = #{description}</if>
<if test="sort != null and sort != ''"> and sort = #{sort} </if> <if test="sort != null and sort != ''">and sort = #{sort}</if>
<if test="parentId != null and parentId != ''"> and parent_id = #{parentId} </if> <if test="parentId != null and parentId != ''">and parent_id = #{parentId}</if>
<if test="createBy != null and createBy != ''"> and create_by = #{createBy} </if> <if test="createBy != null and createBy != ''">and create_by = #{createBy}</if>
<if test="createDate != null and createDate != ''"> and create_date = #{createDate} </if> <if test="createDate != null and createDate != ''">and create_date = #{createDate}</if>
<if test="updateBy != null and updateBy != ''"> and update_by = #{updateBy} </if> <if test="updateBy != null and updateBy != ''">and update_by = #{updateBy}</if>
<if test="updateDate != null and updateDate != ''"> and update_date = #{updateDate} </if> <if test="updateDate != null and updateDate != ''">and update_date = #{updateDate}</if>
<if test="remarks != null and remarks != ''"> and remarks = #{remarks} </if> <if test="remarks != null and remarks != ''">and remarks = #{remarks}</if>
<if test="delFlag != null and delFlag != ''"> and del_flag = #{delFlag} </if> <if test="delFlag != null and delFlag != ''">and del_flag = #{delFlag}</if>
</where> </where>
</select> </select>
<insert id="save" parameterType="com.java2nb.common.domain.DictDO" <insert id="save" parameterType="com.java2nb.common.domain.DictDO"
useGeneratedKeys="true" keyProperty="id"> useGeneratedKeys="true" keyProperty="id">
insert into sys_dict insert into sys_dict
( (`name`,
`name`, `value`,
`value`, `type`,
`type`, `description`,
`description`, `sort`,
`sort`, `parent_id`,
`parent_id`, `create_by`,
`create_by`, `create_date`,
`create_date`, `update_by`,
`update_by`, `update_date`,
`update_date`, `remarks`,
`remarks`, `del_flag`)
`del_flag` values (#{name},
) #{value},
values #{type},
( #{description},
#{name}, #{sort},
#{value}, #{parentId},
#{type}, #{createBy},
#{description}, #{createDate},
#{sort}, #{updateBy},
#{parentId}, #{updateDate},
#{createBy}, #{remarks},
#{createDate}, #{delFlag})
#{updateBy}, </insert>
#{updateDate},
#{remarks},
#{delFlag}
)
</insert>
<update id="update" parameterType="com.java2nb.common.domain.DictDO"> <update id="update" parameterType="com.java2nb.common.domain.DictDO">
update sys_dict update sys_dict
<set> <set>
<if test="name != null">`name` = #{name}, </if> <if test="name != null">`name` = #{name},</if>
<if test="value != null">`value` = #{value}, </if> <if test="value != null">`value` = #{value},</if>
<if test="type != null">`type` = #{type}, </if> <if test="type != null">`type` = #{type},</if>
<if test="description != null">`description` = #{description}, </if> <if test="description != null">`description` = #{description},</if>
<if test="sort != null">`sort` = #{sort}, </if> <if test="sort != null">`sort` = #{sort},</if>
<if test="parentId != null">`parent_id` = #{parentId}, </if> <if test="parentId != null">`parent_id` = #{parentId},</if>
<if test="createBy != null">`create_by` = #{createBy}, </if> <if test="createBy != null">`create_by` = #{createBy},</if>
<if test="createDate != null">`create_date` = #{createDate}, </if> <if test="createDate != null">`create_date` = #{createDate},</if>
<if test="updateBy != null">`update_by` = #{updateBy}, </if> <if test="updateBy != null">`update_by` = #{updateBy},</if>
<if test="updateDate != null">`update_date` = #{updateDate}, </if> <if test="updateDate != null">`update_date` = #{updateDate},</if>
<if test="remarks != null">`remarks` = #{remarks}, </if> <if test="remarks != null">`remarks` = #{remarks},</if>
<if test="delFlag != null">`del_flag` = #{delFlag}</if> <if test="delFlag != null">`del_flag` = #{delFlag}</if>
</set> </set>
where id = #{id} where id = #{id}
</update> </update>
<delete id="remove"> <delete id="remove">
delete from sys_dict where id = #{value} delete
</delete> from sys_dict
where id = #{value}
</delete>
<delete id="batchRemove"> <delete id="batchRemove">
delete from sys_dict where id in delete from sys_dict where id in
<foreach item="id" collection="array" open="(" separator="," <foreach item="id" collection="array" open="(" separator=","
close=")"> close=")">
#{id} #{id}
</foreach> </foreach>
</delete> </delete>
<select id="listType" resultType="com.java2nb.common.domain.DictDO"> <select id="listType" resultType="com.java2nb.common.domain.DictDO">
select distinct `type` , description from sys_dict select `type`, description
</select> from sys_dict
</select>
</mapper> </mapper>

View File

@ -138,7 +138,7 @@
DATE_FORMAT( create_time, "%Y-%m-%d" ) AS staDate, DATE_FORMAT( create_time, "%Y-%m-%d" ) AS staDate,
COUNT( 1 ) authorCount COUNT( 1 ) authorCount
FROM FROM
AUTHOR author
WHERE WHERE
create_time >= #{minDate} create_time >= #{minDate}
GROUP BY GROUP BY

View File

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.java2nb.novel.dao.BookCommentDao">
<select id="get" resultType="com.java2nb.novel.domain.BookCommentDO">
select `id`,`book_id`,`comment_content`,`reply_count`,`audit_status`,`create_time`,`create_user_id` from book_comment where id = #{value}
</select>
<select id="list" resultType="com.java2nb.novel.domain.BookCommentDO">
select `id`,`book_id`,`comment_content`,`reply_count`,`audit_status`,`create_time`,`create_user_id` from book_comment
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="bookId != null and bookId != ''"> and book_id = #{bookId} </if>
<if test="commentContent != null and commentContent != ''"> and comment_content = #{commentContent} </if>
<if test="replyCount != null and replyCount != ''"> and reply_count = #{replyCount} </if>
<if test="auditStatus != null and auditStatus != ''"> and audit_status = #{auditStatus} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
<if test="createUserId != null and createUserId != ''"> and create_user_id = #{createUserId} </if>
</where>
<choose>
<when test="sort != null and sort.trim() != ''">
order by ${sort} ${order}
</when>
<otherwise>
order by id desc
</otherwise>
</choose>
<if test="offset != null and limit != null">
limit #{offset}, #{limit}
</if>
</select>
<select id="count" resultType="int">
select count(*) from book_comment
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="bookId != null and bookId != ''"> and book_id = #{bookId} </if>
<if test="commentContent != null and commentContent != ''"> and comment_content = #{commentContent} </if>
<if test="replyCount != null and replyCount != ''"> and reply_count = #{replyCount} </if>
<if test="auditStatus != null and auditStatus != ''"> and audit_status = #{auditStatus} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
<if test="createUserId != null and createUserId != ''"> and create_user_id = #{createUserId} </if>
</where>
</select>
<insert id="save" parameterType="com.java2nb.novel.domain.BookCommentDO">
insert into book_comment
(
`id`,
`book_id`,
`comment_content`,
`reply_count`,
`audit_status`,
`create_time`,
`create_user_id`
)
values
(
#{id},
#{bookId},
#{commentContent},
#{replyCount},
#{auditStatus},
#{createTime},
#{createUserId}
)
</insert>
<insert id="saveSelective" parameterType="com.java2nb.novel.domain.BookCommentDO">
insert into book_comment
(
<if test="id != null"> `id`, </if>
<if test="bookId != null"> `book_id`, </if>
<if test="commentContent != null"> `comment_content`, </if>
<if test="replyCount != null"> `reply_count`, </if>
<if test="auditStatus != null"> `audit_status`, </if>
<if test="createTime != null"> `create_time`, </if>
<if test="createUserId != null"> `create_user_id` </if>
)
values
(
<if test="id != null"> #{id}, </if>
<if test="bookId != null"> #{bookId}, </if>
<if test="commentContent != null"> #{commentContent}, </if>
<if test="replyCount != null"> #{replyCount}, </if>
<if test="auditStatus != null"> #{auditStatus}, </if>
<if test="createTime != null"> #{createTime}, </if>
<if test="createUserId != null"> #{createUserId} </if>
)
</insert>
<update id="update" parameterType="com.java2nb.novel.domain.BookCommentDO">
update book_comment
<set>
<if test="bookId != null">`book_id` = #{bookId}, </if>
<if test="commentContent != null">`comment_content` = #{commentContent}, </if>
<if test="replyCount != null">`reply_count` = #{replyCount}, </if>
<if test="auditStatus != null">`audit_status` = #{auditStatus}, </if>
<if test="createTime != null">`create_time` = #{createTime}, </if>
<if test="createUserId != null">`create_user_id` = #{createUserId}</if>
</set>
where id = #{id}
</update>
<delete id="remove">
delete from book_comment where id = #{value}
</delete>
<delete id="batchRemove">
delete from book_comment where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -0,0 +1,94 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.java2nb.novel.dao.BookContentDao">
<select id="get" resultType="com.java2nb.novel.domain.BookContentDO">
select `id`, `index_id`, `content`
from book_content
where id = #{value}
</select>
<select id="list" resultType="com.java2nb.novel.domain.BookContentDO">
select `id`,`index_id`,`content` from book_content
<where>
<if test="id != null and id != ''">and id = #{id}</if>
<if test="indexId != null and indexId != ''">and index_id = #{indexId}</if>
<if test="content != null and content != ''">and content = #{content}</if>
</where>
<choose>
<when test="sort != null and sort.trim() != ''">
order by ${sort} ${order}
</when>
<otherwise>
order by id desc
</otherwise>
</choose>
<if test="offset != null and limit != null">
limit #{offset}, #{limit}
</if>
</select>
<select id="count" resultType="int">
select count(*) from book_content
<where>
<if test="id != null and id != ''">and id = #{id}</if>
<if test="indexId != null and indexId != ''">and index_id = #{indexId}</if>
<if test="content != null and content != ''">and content = #{content}</if>
</where>
</select>
<insert id="save" parameterType="com.java2nb.novel.domain.BookContentDO">
insert into book_content
(`id`,
`index_id`,
`content`)
values (#{id},
#{indexId},
#{content})
</insert>
<insert id="saveSelective" parameterType="com.java2nb.novel.domain.BookContentDO">
insert into book_content
(
<if test="id != null">`id`,</if>
<if test="indexId != null">`index_id`,</if>
<if test="content != null">`content`</if>
)
values
(
<if test="id != null">#{id},</if>
<if test="indexId != null">#{indexId},</if>
<if test="content != null">#{content}</if>
)
</insert>
<update id="update" parameterType="com.java2nb.novel.domain.BookContentDO">
update book_content
<set>
<if test="indexId != null">`index_id` = #{indexId},</if>
<if test="content != null">`content` = #{content}</if>
</set>
where id = #{id}
</update>
<delete id="remove">
delete
from book_content
where id = #{value}
</delete>
<delete id="batchRemove">
delete from book_content where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<delete id="removeByIndexIds">
delete from book_content where index_id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

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