Compare commits

...

81 Commits

Author SHA1 Message Date
6019ce11c7 build: 修改版本号 2023-10-12 10:02:50 +08:00
3e1c1f02e9 chore: 模版更新 2023-10-12 09:59:08 +08:00
98a5157623 feat: 支付宝手机网站支付 2023-10-12 09:49:03 +08:00
05d65c19a7 perf: 手机端页面优化 2023-10-12 09:42:28 +08:00
4c9f39ab19 feat: 手机端阅读历史页面适配 2023-10-12 09:28:29 +08:00
8bc05a1606 Merge remote-tracking branch 'Gitee/4.1.x' into develop_xxy 2023-10-12 09:03:32 +08:00
f9aad61b10 chore: 模版更新 2023-10-10 19:31:26 +08:00
8311681b23 perf(mobile): 加入书架按钮样式优化 2023-10-10 19:29:26 +08:00
4497dd1974 chore: 模版更新 2023-09-29 19:25:06 +08:00
44bf0cd693 fix: 修复作家专区小说封面更新问题 2023-09-29 19:23:12 +08:00
f333a2c084 perf: 优化小说推荐管理 2023-09-29 19:18:42 +08:00
bff5b0827e perf: 爬虫配置自定义登录页面 2023-06-09 19:25:42 +08:00
14f9205d76 docs: 修正小说内容保存配置的注释 2023-06-05 13:17:43 +08:00
cb2ff39b1e build: 移除 Elasticsearch 依赖 2023-05-28 21:51:07 +08:00
3eaa526093 fix: 修复CVE漏洞 2023-05-28 21:44:44 +08:00
04d7b45334 feat: 移除 FastDFS 模块 2023-05-28 19:14:21 +08:00
24c80e381c fix: 修改依赖组件漏洞 2023-05-28 18:43:05 +08:00
9fe51eab74 fix: 页面请求异常处理 2023-05-17 23:43:27 +08:00
e1c800d78f feat: 手机端用户中心优化 2023-05-14 07:05:36 +08:00
eb982b51f7 feat: 手机端充值页面适配 2023-05-14 06:58:42 +08:00
18f5fbf508 feat: 手机端我的书架页面适配 2023-05-13 23:40:54 +08:00
c63b4d617e feat: 手机端用户中心页面适配 2023-05-13 23:02:53 +08:00
4fb0d478f3 feat: 手机端注册页面适配 2023-05-13 19:57:19 +08:00
dabfb9d1e8 feat: 手机端登录页面适配 2023-05-13 15:15:42 +08:00
dce8a21c0d feat: 首页是否登录识别 2023-05-13 13:11:10 +08:00
d9ad02e3f5 fix(sql): 网站信息修改提示未授权
超级管理员增加网站信息修改权限
2023-05-08 15:52:02 +08:00
b02a2b3b2c build: 4.1.0 发布 2023-04-18 12:00:50 +08:00
f28c8a9c16 revert: 恢复误删文件
作家专区稿费收入报错
2023-04-18 11:34:26 +08:00
e44978617f feat: 后台会员反馈管理 2023-04-18 11:23:45 +08:00
aa2929a3cd feat: 后台小说推荐管理 2023-04-18 10:58:33 +08:00
281561c85b fix: 会员注册验证码 2023-04-18 09:17:30 +08:00
cab350dbb2 fix: 刷新首页新闻缓存 2023-04-18 08:58:30 +08:00
9ed465784a fix: 网站信息管理的权限问题 2023-04-17 10:55:20 +08:00
e2cfa5a788 Update README.md 2023-04-16 08:32:19 +08:00
6fb1e5cc99 chore: 模版更新 2023-04-15 08:37:17 +08:00
749fd1aeaa docs: 项目演示 2023-04-15 08:08:57 +08:00
8c3fb7f1ca build: 4.0.0 发布 2023-04-15 06:50:55 +08:00
c71eadef82 perf: 后台订单管理 2023-04-14 23:22:23 +08:00
3ffa75dc10 perf: 后台评论管理 2023-04-14 23:16:55 +08:00
8ddc6cc434 feat: 后台评论管理 2023-04-14 22:34:36 +08:00
5854536c70 fix: 代码生成数据表查询 2023-04-14 22:06:39 +08:00
a7d825cc54 fix: 后台模块查询过滤相同的行 2023-04-14 21:33:31 +08:00
687eb61846 feat: 后台小说删除 2023-04-14 21:09:37 +08:00
9f23f817b1 feat: 后台小说管理 2023-04-14 18:07:05 +08:00
0c59adf23b feat: 后台订单管理 2023-04-14 17:29:41 +08:00
57eca58b24 feat: 后台会员管理 2023-04-14 16:58:04 +08:00
c76df15a7f feat: 后台友情链接管理 2023-04-14 16:32:05 +08:00
3b0edd8e1f fix: sql 2023-04-14 14:58:38 +08:00
2c3b735d49 feat: 后台网站信息管理 2023-04-14 14:56:11 +08:00
b45b83fdb0 Update README.md 2023-04-14 10:51:42 +08:00
29d074ec18 refactor: 移除 Ehcache,默认缓存设置为 Redis 2023-04-14 10:40:54 +08:00
282bc7b707 refactor: 移除 RabbitMQ 和 Elasticsearch 相关功能 2023-04-14 10:10:09 +08:00
68b3458c30 Add favicon.ico 2023-01-11 19:19:05 +08:00
2f5002f673 Update README.md 2022-08-29 08:12:32 +08:00
d293d7bf91 Merge branch 'develop_xxy' of https://gitee.com/novel_dev_team/novel-plus into develop_xxy 2022-07-31 08:12:41 +08:00
a9080310a4 update template & sql 2022-07-31 08:04:43 +08:00
xxy
1f571f9b64 Update README.md 2022-07-26 17:22:25 +08:00
xxy
7be529fe4a Update README.md 2022-07-26 17:11:15 +08:00
xxy
2f62641b63 Update README.md 2022-07-24 14:53:27 +08:00
xxy
d962620814 Update README.md 2022-07-24 14:51:09 +08:00
xxy
7640d153ac Update README.md 2022-07-21 21:28:26 +08:00
xxy
3d9f52ffee Update README.md 2022-07-20 06:28:17 +08:00
xxy
0112af202b Update README.md 2022-07-20 06:24:29 +08:00
xxy
e3010ea81e Update README.md 2022-07-20 06:21:54 +08:00
xxy
05608d0316 Update README.md 2022-07-20 06:18:52 +08:00
xxy
4f6ec5aa0f Update README.md 2022-07-20 06:17:48 +08:00
xxy
01984f7137 Update README.md 2022-07-18 18:20:06 +08:00
xxy
617f6f50b0 Update README.md 2022-07-18 13:14:27 +08:00
xxy
e0686f079c Update README.md 2022-07-16 07:08:50 +08:00
xxy
5fb1717770 Update README.md 2022-07-15 22:49:11 +08:00
xxy
4bf495b6c0 Update README.md 2022-07-15 22:47:40 +08:00
028c200764 fix: 新笔趣阁规则移动到全量sql文件 2022-07-15 22:36:48 +08:00
xxy
472440ef7c Update README.md 2022-07-15 19:26:12 +08:00
xxy
5278b5fc39 Update README.md 2022-07-15 19:24:04 +08:00
xxy
9a0a79957b Update README.md 2022-07-15 19:19:49 +08:00
xxy
d93bf3dd4e Update README.md 2022-07-15 19:15:42 +08:00
xxy
09a4f39172 Update README.md 2022-07-15 19:15:11 +08:00
xxy
3abe7e22c9 Update README.md 2022-07-15 19:14:05 +08:00
xxy
5e1135268a Update README.md 2022-07-15 19:12:58 +08:00
xxy
54aeef7c80 Update README.md 2022-07-15 07:18:04 +08:00
xxy
027fbffb7f Update README.md 2022-07-15 06:20:04 +08:00
238 changed files with 19132 additions and 8382 deletions

267
README.md
View File

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

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

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

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

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

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

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

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -6,5 +6,15 @@ spring:
url: jdbc:mysql://127.0.0.1:3306/novel_plus?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
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,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;
public class Constant {
//演示系统账户
public static String DEMO_ACCOUNT = "test";
//自动去除表前缀
@ -20,5 +21,7 @@ public class Constant {
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.RedisSessionDAO;
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.session.SessionListener;
import org.apache.shiro.session.mgt.eis.MemorySessionDAO;
import org.apache.shiro.session.mgt.eis.SessionDAO;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
@ -29,6 +26,7 @@ import java.util.LinkedHashMap;
*/
@Configuration
public class ShiroConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.password}")
@ -38,9 +36,6 @@ public class ShiroConfig {
@Value("${spring.redis.timeout}")
private int timeout;
@Value("${spring.cache.type}")
private String cacheType ;
@Value("${server.session-timeout}")
private int tomcatTimeout;
@ -76,7 +71,7 @@ public class ShiroConfig {
filterChainDefinitionMap.put("/docs/**", "anon");
filterChainDefinitionMap.put("/layuimini/**", "anon");
filterChainDefinitionMap.put("/upload/**", "anon");
filterChainDefinitionMap.put("/files/**", "anon");
filterChainDefinitionMap.put(Constant.UPLOAD_FILES_PREFIX + "**", "anon");
filterChainDefinitionMap.put("/logout", "logout");
filterChainDefinitionMap.put("/blog", "anon");
filterChainDefinitionMap.put("/blog/open/**", "anon");
@ -92,11 +87,7 @@ public class ShiroConfig {
//设置realm.
securityManager.setRealm(userRealm());
// 自定义缓存实现 使用redis
if (Constant.CACHE_TYPE_REDIS.equals(cacheType)) {
securityManager.setCacheManager(rediscacheManager());
} else {
securityManager.setCacheManager(ehCacheManager());
}
securityManager.setSessionManager(sessionManager());
return securityManager;
}
@ -108,8 +99,7 @@ public class ShiroConfig {
}
/**
* 开启shiro aop注解支持.
* 使用代理方式;所以需要开启代码支持;
* 开启shiro aop注解支持. 使用代理方式;所以需要开启代码支持;
*
* @param securityManager
* @return
@ -138,8 +128,7 @@ public class ShiroConfig {
}
/**
* cacheManager 缓存 redis实现
* 使用的是shiro-redis开源插件
* cacheManager 缓存 redis实现 使用的是shiro-redis开源插件
*
* @return
*/
@ -151,8 +140,7 @@ public class ShiroConfig {
/**
* RedisSessionDAO shiro sessionDao层的实现 通过redis
* 使用的是shiro-redis开源插件
* RedisSessionDAO shiro sessionDao层的实现 通过redis 使用的是shiro-redis开源插件
*/
@Bean
public RedisSessionDAO redisSessionDAO() {
@ -163,11 +151,7 @@ public class ShiroConfig {
@Bean
public SessionDAO sessionDAO() {
if (Constant.CACHE_TYPE_REDIS.equals(cacheType)) {
return redisSessionDAO();
} else {
return new MemorySessionDAO();
}
}
/**
@ -184,19 +168,4 @@ public class ShiroConfig {
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
class WebConfigurer extends WebMvcConfigurerAdapter {
@Autowired
JnConfig jnConfig;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/files/**").addResourceLocations("file:///"+ jnConfig.getUploadPath());
registry.addResourceHandler(Constant.UPLOAD_FILES_PREFIX + "**")
.addResourceLocations("file:///" + jnConfig.getUploadPath());
}
}

View File

@ -1,12 +1,10 @@
package com.java2nb.common.controller;
import com.java2nb.common.config.Constant;
import com.java2nb.common.config.JnConfig;
import com.java2nb.common.domain.FileDO;
import com.java2nb.common.service.FileService;
import com.java2nb.common.utils.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@ -14,7 +12,11 @@ import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
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.util.Date;
import java.util.HashMap;
@ -115,7 +117,8 @@ public class FileController extends BaseController {
if ("test".equals(getUsername())) {
return R.error(1, "演示系统不允许修改,完整体验请部署程序");
}
String fileName = jnConfig.getUploadPath() + sysFileService.get(id).getUrl().replace("/files/", "");
String fileName =
jnConfig.getUploadPath() + sysFileService.get(id).getUrl().replace(Constant.UPLOAD_FILES_PREFIX, "");
if (sysFileService.remove(id) > 0) {
boolean b = FileUtil.deleteFile(fileName);
if (!b) {
@ -155,7 +158,8 @@ public class FileController extends BaseController {
String fileName = file.getOriginalFilename();
String fileDir = year + "/" + month + "/" + day + "/";
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,
date);
try {
FileUtil.uploadFile(file.getBytes(), jnConfig.getUploadPath() + fileDir, fileName);
} catch (Exception e) {

View File

@ -1,28 +1,33 @@
package com.java2nb.common.dao;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
import java.util.Map;
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},'%')")
@Select(
"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 count(*) from information_schema.tables where table_schema = (select database())")
@Select("select count(*) from information_schema.tables where table_schema = 'novel_plus'")
int count(Map<String, Object> map);
@Select("select table_name tableName, engine, table_comment tableComment, create_time createTime from information_schema.tables \r\n"
+ " where table_schema = (select database()) and table_name = #{tableName}")
@Select(
"select table_name tableName, engine, table_comment tableComment, create_time createTime from information_schema.tables \r\n"
+ " 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"
+ " where table_name = #{tableName} and table_schema = (select database()) order by ordinal_position")
@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' 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 = (select database()) and column_key = 'PRI' limit 1")
@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);
}

View File

@ -3,7 +3,7 @@ package com.java2nb.common.domain;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Objects;
/**
@ -14,6 +14,7 @@ import java.util.Date;
* @date 2019-09-29 18:28:07
*/
public class DictDO implements Serializable {
private static final long serialVersionUID = 1L;
//编号
@ -49,150 +50,175 @@ public class DictDO implements Serializable {
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;
}
/**
* 获取:删除标记
*/
@ -218,4 +244,29 @@ public class DictDO implements Serializable {
", 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;
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.system.domain.UserDO;
import org.springframework.beans.factory.annotation.Autowired;
@ -9,14 +12,12 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import com.java2nb.common.dao.DictDao;
import com.java2nb.common.domain.DictDO;
import com.java2nb.common.service.DictService;
import java.util.stream.Collectors;
@Service
public class DictServiceImpl implements DictService {
@Autowired
private DictDao dictDao;
@ -58,7 +59,7 @@ public class DictServiceImpl implements DictService {
@Override
public List<DictDO> listType() {
return dictDao.listType();
return dictDao.listType().stream().distinct().collect(Collectors.toList());
}
@Override

View File

@ -1,26 +1,28 @@
package com.java2nb.common.service.impl;
import com.java2nb.common.config.Constant;
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.stereotype.Service;
import org.springframework.util.StringUtils;
import java.io.File;
import java.util.List;
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
public class FileServiceImpl implements FileService {
@Autowired
private FileDao sysFileMapper;
@Autowired
private JnConfig jnConfig;
@Override
public FileDO get(Long id) {
return sysFileMapper.get(id);
@ -60,7 +62,7 @@ public class FileServiceImpl implements FileService {
public Boolean isExist(String url) {
Boolean isExist = false;
if (!StringUtils.isEmpty(url)) {
String filePath = url.replace("/files/", "");
String filePath = url.replace(Constant.UPLOAD_FILES_PREFIX, "");
filePath = jnConfig.getUploadPath() + filePath;
File file = new File(filePath);
if (file.exists()) {

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;
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.NewsDO;
import com.java2nb.novel.service.NewsService;
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.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
@RequestMapping("/novel/news")
public class NewsController {
@Autowired
private NewsService newsService;
@Autowired
private RedisTemplate<Object, Object> redisTemplate;
@GetMapping()
@RequiresPermissions("novel:news:news")
@ -89,6 +87,7 @@ public class NewsController {
@RequiresPermissions("novel:news:add")
public R save(NewsDO news) {
if (newsService.save(news) > 0) {
redisTemplate.delete(CacheKey.INDEX_NEWS_KEY);
return R.ok();
}
return R.error();
@ -103,6 +102,7 @@ public class NewsController {
@RequiresPermissions("novel:news:edit")
public R update(NewsDO news) {
newsService.update(news);
redisTemplate.delete(CacheKey.INDEX_NEWS_KEY);
return R.ok();
}
@ -115,6 +115,7 @@ public class NewsController {
@RequiresPermissions("novel:news:remove")
public R remove(Long id) {
if (newsService.remove(id) > 0) {
redisTemplate.delete(CacheKey.INDEX_NEWS_KEY);
return R.ok();
}
return R.error();
@ -129,6 +130,7 @@ public class NewsController {
@RequiresPermissions("novel:news:batchRemove")
public R remove(@RequestParam("ids[]") Long[] ids) {
newsService.batchRemove(ids);
redisTemplate.delete(CacheKey.INDEX_NEWS_KEY);
return R.ok();
}

View File

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

View File

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

View File

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

View File

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

View File

@ -1,15 +1,15 @@
package com.java2nb.novel.dao;
import com.java2nb.novel.domain.BookDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.Date;
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:49:46
@ -32,4 +32,7 @@ public interface BookDao {
int batchRemove(Long[] ids);
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;
import com.java2nb.novel.domain.UserDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.Date;
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:49:08
@ -32,4 +30,6 @@ public interface UserDao {
int batchRemove(Long[] ids);
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,17 +1,11 @@
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;
import java.io.Serializable;
import java.util.Date;
/**
@ -19,9 +13,10 @@ import java.util.Date;
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 03:49:46
* @date 2023-04-14 17:42:55
*/
public class BookDO implements Serializable {
private static final long serialVersionUID = 1L;
@ -36,22 +31,10 @@ public class BookDO implements Serializable {
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中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@ -112,378 +95,357 @@ public class BookDO implements Serializable {
public void setId(Long id) {
this.id = id;
}
/**
* 获取:主键
*/
public Long getId() {
return id;
}
/**
* 设置作品方向0男频1女频'
*/
public void setWorkDirection(Integer workDirection) {
this.workDirection = workDirection;
}
/**
* 获取作品方向0男频1女频'
*/
public Integer getWorkDirection() {
return workDirection;
}
/**
* 设置分类ID
*/
public void setCatId(Integer catId) {
this.catId = catId;
}
/**
* 获取分类ID
*/
public Integer getCatId() {
return catId;
}
/**
* 设置:分类名
*/
public void setCatName(String catName) {
this.catName = catName;
}
/**
* 获取:分类名
*/
public String getCatName() {
return catName;
}
/**
* 设置子分类ID
*/
public void setCatChildId(Integer catChildId) {
this.catChildId = catChildId;
}
/**
* 获取子分类ID
*/
public Integer getCatChildId() {
return catChildId;
}
/**
* 设置:子分类名
*/
public void setCatChildName(String catChildName) {
this.catChildName = catChildName;
}
/**
* 获取:子分类名
*/
public String getCatChildName() {
return catChildName;
}
/**
* 设置:小说封面
*/
public void setPicUrl(String picUrl) {
this.picUrl = picUrl;
}
/**
* 获取:小说封面
*/
public String getPicUrl() {
return picUrl;
}
/**
* 设置:小说名
*/
public void setBookName(String bookName) {
this.bookName = bookName;
}
/**
* 获取:小说名
*/
public String getBookName() {
return bookName;
}
/**
* 设置:男主角姓名
*/
public void setHeroName(String heroName) {
this.heroName = heroName;
}
/**
* 获取:男主角姓名
*/
public String getHeroName() {
return heroName;
}
/**
* 设置:女主角姓名
*/
public void setLadyName(String ladyName) {
this.ladyName = ladyName;
}
/**
* 获取:女主角姓名
*/
public String getLadyName() {
return ladyName;
}
/**
* 设置作品风格0甜宠1虐恋2其他
*/
public void setBookStyle(Integer bookStyle) {
this.bookStyle = bookStyle;
}
/**
* 获取作品风格0甜宠1虐恋2其他
*/
public Integer getBookStyle() {
return bookStyle;
}
/**
* 设置:作品标签
*/
public void setBookLabel(String bookLabel) {
this.bookLabel = bookLabel;
}
/**
* 获取:作品标签
*/
public String getBookLabel() {
return bookLabel;
}
/**
* 设置作者id
*/
public void setAuthorId(Long authorId) {
this.authorId = authorId;
}
/**
* 获取作者id
*/
public Long getAuthorId() {
return authorId;
}
/**
* 设置:作者名
*/
public void setAuthorName(String authorName) {
this.authorName = authorName;
}
/**
* 获取:作者名
*/
public String getAuthorName() {
return authorName;
}
/**
* 设置:书籍描述
*/
public void setBookDesc(String bookDesc) {
this.bookDesc = bookDesc;
}
/**
* 获取:书籍描述
*/
public String getBookDesc() {
return bookDesc;
}
/**
* 设置:评分,预留字段
*/
public void setScore(Float score) {
this.score = score;
}
/**
* 获取:评分,预留字段
*/
public Float getScore() {
return score;
}
/**
* 设置书籍状态0连载中1已完结
*/
public void setBookStatus(Integer bookStatus) {
this.bookStatus = bookStatus;
}
/**
* 获取书籍状态0连载中1已完结
*/
public Integer getBookStatus() {
return bookStatus;
}
/**
* 设置:点击量
*/
public void setVisitCount(Long visitCount) {
this.visitCount = visitCount;
}
/**
* 获取:点击量
*/
public Long getVisitCount() {
return visitCount;
}
/**
* 设置:总字数
*/
public void setWordCount(Integer wordCount) {
this.wordCount = wordCount;
}
/**
* 获取:总字数
*/
public Integer getWordCount() {
return wordCount;
}
/**
* 设置:评论数
*/
public void setCommentCount(Integer commentCount) {
this.commentCount = commentCount;
}
/**
* 获取:评论数
*/
public Integer getCommentCount() {
return commentCount;
}
/**
* 设置:昨日订阅数
*/
public void setYesterdayBuy(Integer yesterdayBuy) {
this.yesterdayBuy = yesterdayBuy;
}
/**
* 获取:昨日订阅数
*/
public Integer getYesterdayBuy() {
return yesterdayBuy;
}
/**
* 设置最新目录ID
*/
public void setLastIndexId(Long lastIndexId) {
this.lastIndexId = lastIndexId;
}
/**
* 获取最新目录ID
*/
public Long getLastIndexId() {
return lastIndexId;
}
/**
* 设置:最新目录名
*/
public void setLastIndexName(String lastIndexName) {
this.lastIndexName = lastIndexName;
}
/**
* 获取:最新目录名
*/
public String getLastIndexName() {
return lastIndexName;
}
/**
* 设置:最新目录更新时间
*/
public void setLastIndexUpdateTime(Date lastIndexUpdateTime) {
this.lastIndexUpdateTime = lastIndexUpdateTime;
}
/**
* 获取:最新目录更新时间
*/
public Date getLastIndexUpdateTime() {
return lastIndexUpdateTime;
}
/**
* 设置是否收费1收费0免费
*/
public void setIsVip(Integer isVip) {
this.isVip = isVip;
}
/**
* 获取是否收费1收费0免费
*/
public Integer getIsVip() {
return isVip;
}
/**
* 设置状态0入库1上架
*/
public void setStatus(Integer status) {
this.status = status;
}
/**
* 获取状态0入库1上架
*/
public Integer getStatus() {
return status;
}
/**
* 设置:更新时间
*/
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
/**
* 获取:更新时间
*/
public Date getUpdateTime() {
return updateTime;
}
/**
* 设置:创建时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:创建时间
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置爬虫源站ID
*/
public void setCrawlSourceId(Integer crawlSourceId) {
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已停止
*/

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,17 +1,11 @@
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;
import java.io.Serializable;
import java.util.Date;
/**
@ -22,6 +16,7 @@ import java.util.Date;
* @date 2020-12-01 03:49:57
*/
public class PayDO implements Serializable {
private static final long serialVersionUID = 1L;
@ -55,108 +50,135 @@ public class PayDO implements Serializable {
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
private String userName;
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;
}
/**
* 设置:保留
*/
public void setOutTradeNo(Long outTradeNo) {
this.outTradeNo = outTradeNo;
}
/**
* 获取:保留
*/
public Long getOutTradeNo() {
return outTradeNo;
}
/**
* 设置:订单号
*/
public void setTradeNo(String tradeNo) {
this.tradeNo = tradeNo;
}
/**
* 获取:订单号
*/
public String getTradeNo() {
return tradeNo;
}
/**
* 设置:保留
*/
public void setPayChannel(Integer payChannel) {
this.payChannel = payChannel;
}
/**
* 获取:保留
*/
public Integer getPayChannel() {
return payChannel;
}
/**
* 设置:交易香蕉币
*/
public void setTotalAmount(Integer totalAmount) {
this.totalAmount = totalAmount;
}
/**
* 获取:交易香蕉币
*/
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;
}
/**
* 获取:更新时间
*/

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,23 +1,30 @@
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.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import com.java2nb.novel.dao.BookDao;
import com.java2nb.novel.domain.BookDO;
import com.java2nb.novel.service.BookService;
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao;
@Autowired
private BookIndexDao bookIndexDao;
@Autowired
private BookContentDao bookContentDao;
@Override
public BookDO get(Long id) {
@ -44,8 +51,15 @@ public class BookServiceImpl implements BookService {
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);
}

View File

@ -0,0 +1,67 @@
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.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,23 +1,27 @@
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.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import com.java2nb.novel.dao.PayDao;
import com.java2nb.novel.domain.PayDO;
import com.java2nb.novel.service.PayService;
@Service
public class PayServiceImpl implements PayService {
@Autowired
private PayDao payDao;
@Autowired
private UserDao userDao;
@Override
public PayDO get(Long id) {
@ -26,7 +30,14 @@ public class PayServiceImpl implements PayService {
@Override
public List<PayDO> list(Map<String, Object> map) {
return payDao.list(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

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.domain.Tree;
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.RoleDO;
import com.java2nb.system.domain.UserDO;
import com.java2nb.system.service.RoleService;
import com.java2nb.system.service.SysUserService;
import com.java2nb.system.vo.UserVO;
import javax.servlet.http.HttpServletRequest;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@ -21,6 +22,7 @@ import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -28,6 +30,7 @@ import java.util.Map;
@RequestMapping("/sys/user")
@Controller
public class SysUserController extends BaseController {
private String prefix = "system/user";
@Autowired
SysUserService userService;
@ -35,8 +38,6 @@ public class SysUserController extends BaseController {
RoleService roleService;
@Autowired
DictService dictService;
@Autowired
RedisUtil redisUtil;
@RequiresPermissions("sys:user:user")
@GetMapping("")
@ -186,6 +187,7 @@ public class SysUserController extends BaseController {
}
}
@RequiresPermissions("sys:user:resetPwd")
@Log("admin提交更改用户密码")
@PostMapping("/adminResetPwd")
@ -202,6 +204,7 @@ public class SysUserController extends BaseController {
}
}
@GetMapping("/tree")
@ResponseBody
public Tree<DeptDO> tree() {
@ -223,6 +226,7 @@ public class SysUserController extends BaseController {
model.addAttribute("sexList", dictService.getSexList());
return prefix + "/personal";
}
@ResponseBody
@PostMapping("/uploadImg")
R uploadImg(@RequestParam("avatar_file") MultipartFile file, String avatar_data, HttpServletRequest request) {

View File

@ -1,17 +1,12 @@
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;
import java.io.Serializable;
import java.util.Date;
import java.util.Objects;
/**
@ -22,6 +17,7 @@ import java.util.Date;
* @date 2019-11-25 11:40:03
*/
public class DataPermDO implements Serializable {
private static final long serialVersionUID = 1L;
@ -57,118 +53,160 @@ public class DataPermDO implements Serializable {
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 setTableName(String tableName) {
this.tableName = tableName;
}
/**
* 获取:数据表名称
*/
public String getTableName() {
return tableName;
}
/**
* 设置:所属模块
*/
public void setModuleName(String moduleName) {
this.moduleName = moduleName;
}
/**
* 获取:所属模块
*/
public String getModuleName() {
return moduleName;
}
/**
* 设置:用户权限控制属性名
*/
public void setCrlAttrName(String crlAttrName) {
this.crlAttrName = crlAttrName;
}
/**
* 获取:用户权限控制属性名
*/
public String getCrlAttrName() {
return crlAttrName;
}
/**
* 设置:数据表权限控制列名
*/
public void setCrlColumnName(String crlColumnName) {
this.crlColumnName = crlColumnName;
}
/**
* 获取:数据表权限控制列名
*/
public String getCrlColumnName() {
return crlColumnName;
}
/**
* 设置权限codeall_开头表示查看所有数据的权限sup_开头表示查看下级数据的权限own_开头表示查看本级数据的权限
*/
public void setPermCode(String permCode) {
this.permCode = permCode;
}
/**
* 获取权限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;
import com.java2nb.common.domain.DictDO;
import com.java2nb.common.domain.Tree;
import com.java2nb.common.utils.BuildTree;
import com.java2nb.common.utils.IdWorker;
import com.java2nb.system.dao.DataPermDao;
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.stereotype.Service;
@ -12,15 +14,12 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.java2nb.system.dao.DataPermDao;
import com.java2nb.system.domain.DataPermDO;
import com.java2nb.system.service.DataPermService;
import java.util.stream.Collectors;
@Service
public class DataPermServiceImpl implements DataPermService {
@Autowired
private DataPermDao dataPermDao;
@ -64,7 +63,7 @@ public class DataPermServiceImpl implements DataPermService {
@Override
public List<DataPermDO> listModuleName() {
return dataPermDao.listModuleName();
return dataPermDao.listModuleName().stream().distinct().collect(Collectors.toList());
}
@Override

View File

@ -1,14 +1,19 @@
package com.java2nb.system.service.impl;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.util.*;
import com.java2nb.common.config.Constant;
import com.java2nb.common.config.JnConfig;
import com.java2nb.common.domain.FileDO;
import com.java2nb.common.domain.Tree;
import com.java2nb.common.service.FileService;
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.SysUserService;
import com.java2nb.system.vo.UserVO;
import org.apache.commons.lang.ArrayUtils;
import org.slf4j.Logger;
@ -16,22 +21,17 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
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 javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.util.*;
@Transactional
@Service
public class SysUserServiceImpl implements SysUserService {
@Autowired
SysUserDao userMapper;
@Autowired
@ -213,7 +213,7 @@ public class SysUserServiceImpl implements SysUserService {
public Map<String, Object> updatePersonalImg(MultipartFile file, String avatar_data, Long userId) throws Exception {
String fileName = file.getOriginalFilename();
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[] str = avatar_data.split(",");

View File

@ -10,7 +10,7 @@ spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
url: jdbc:mysql://127.0.0.1:3306/novel_plus?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: test123456
#password:
@ -39,7 +39,7 @@ spring:
redis:
host: 127.0.0.1
port: 6379
password: test
password: test123456
# 连接超时时间毫秒
timeout: 10000
jedis:
@ -52,3 +52,47 @@ spring:
max-active: 100
# 连接池最大阻塞等待时间使用负值表示没有限制
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

@ -52,3 +52,41 @@ spring:
max-active: 100
# 连接池最大阻塞等待时间使用负值表示没有限制
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

@ -17,17 +17,18 @@ spring:
date-format: yyyy-MM-dd HH:mm:ss
profiles:
active: dev
#上传文件的最大值10M
servlet:
multipart:
max-file-size: 30Mb
max-request-size: 30Mb
max-file-size: 10485760
devtools:
restart:
enabled: true
cache:
type: ehcache
ehcache:
config: classpath:ehcache.xml
main:
allow-bean-definition-overriding: true
mybatis:
configuration:
#自动将数据库带下划线的表字段值映射到Java类的驼峰字段上

View File

@ -4,9 +4,21 @@
<mapper namespace="com.java2nb.common.dao.DictDao">
<select id="get" resultType="com.java2nb.common.domain.DictDO">
select
`id`,`name`,`value`,`type`,`description`,`sort`,`parent_id`,`create_by`,`create_date`,`update_by`,`update_date`,`remarks`,`del_flag`
from sys_dict where id = #{value}
select `id`,
`name`,
`value`,
`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">
@ -63,8 +75,7 @@
<insert id="save" parameterType="com.java2nb.common.domain.DictDO"
useGeneratedKeys="true" keyProperty="id">
insert into sys_dict
(
`name`,
(`name`,
`value`,
`type`,
`description`,
@ -75,11 +86,8 @@
`update_by`,
`update_date`,
`remarks`,
`del_flag`
)
values
(
#{name},
`del_flag`)
values (#{name},
#{value},
#{type},
#{description},
@ -90,8 +98,7 @@
#{updateBy},
#{updateDate},
#{remarks},
#{delFlag}
)
#{delFlag})
</insert>
<update id="update" parameterType="com.java2nb.common.domain.DictDO">
@ -114,7 +121,9 @@
</update>
<delete id="remove">
delete from sys_dict where id = #{value}
delete
from sys_dict
where id = #{value}
</delete>
<delete id="batchRemove">
@ -126,7 +135,8 @@
</delete>
<select id="listType" resultType="com.java2nb.common.domain.DictDO">
select distinct `type` , description from sys_dict
select `type`, description
from sys_dict
</select>
</mapper>

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>

View File

@ -0,0 +1,153 @@
<?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.BookIndexDao">
<select id="get" resultType="com.java2nb.novel.domain.BookIndexDO">
select `id`,
`book_id`,
`index_num`,
`index_name`,
`word_count`,
`is_vip`,
`book_price`,
`storage_type`,
`create_time`,
`update_time`
from book_index
where id = #{value}
</select>
<select id="list" resultType="com.java2nb.novel.domain.BookIndexDO">
select
`id`,`book_id`,`index_num`,`index_name`,`word_count`,`is_vip`,`book_price`,`storage_type`,`create_time`,`update_time`
from book_index
<where>
<if test="id != null and id != ''">and id = #{id}</if>
<if test="bookId != null and bookId != ''">and book_id = #{bookId}</if>
<if test="indexNum != null and indexNum != ''">and index_num = #{indexNum}</if>
<if test="indexName != null and indexName != ''">and index_name = #{indexName}</if>
<if test="wordCount != null and wordCount != ''">and word_count = #{wordCount}</if>
<if test="isVip != null and isVip != ''">and is_vip = #{isVip}</if>
<if test="bookPrice != null and bookPrice != ''">and book_price = #{bookPrice}</if>
<if test="storageType != null and storageType != ''">and storage_type = #{storageType}</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 book_index
<where>
<if test="id != null and id != ''">and id = #{id}</if>
<if test="bookId != null and bookId != ''">and book_id = #{bookId}</if>
<if test="indexNum != null and indexNum != ''">and index_num = #{indexNum}</if>
<if test="indexName != null and indexName != ''">and index_name = #{indexName}</if>
<if test="wordCount != null and wordCount != ''">and word_count = #{wordCount}</if>
<if test="isVip != null and isVip != ''">and is_vip = #{isVip}</if>
<if test="bookPrice != null and bookPrice != ''">and book_price = #{bookPrice}</if>
<if test="storageType != null and storageType != ''">and storage_type = #{storageType}</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>
<select id="getIdsByBookId" resultType="java.lang.Long">
select id
from book_index
where book_id = #{bookId}
</select>
<insert id="save" parameterType="com.java2nb.novel.domain.BookIndexDO">
insert into book_index
(`id`,
`book_id`,
`index_num`,
`index_name`,
`word_count`,
`is_vip`,
`book_price`,
`storage_type`,
`create_time`,
`update_time`)
values (#{id},
#{bookId},
#{indexNum},
#{indexName},
#{wordCount},
#{isVip},
#{bookPrice},
#{storageType},
#{createTime},
#{updateTime})
</insert>
<insert id="saveSelective" parameterType="com.java2nb.novel.domain.BookIndexDO">
insert into book_index
(
<if test="id != null">`id`,</if>
<if test="bookId != null">`book_id`,</if>
<if test="indexNum != null">`index_num`,</if>
<if test="indexName != null">`index_name`,</if>
<if test="wordCount != null">`word_count`,</if>
<if test="isVip != null">`is_vip`,</if>
<if test="bookPrice != null">`book_price`,</if>
<if test="storageType != null">`storage_type`,</if>
<if test="createTime != null">`create_time`,</if>
<if test="updateTime != null">`update_time`</if>
)
values
(
<if test="id != null">#{id},</if>
<if test="bookId != null">#{bookId},</if>
<if test="indexNum != null">#{indexNum},</if>
<if test="indexName != null">#{indexName},</if>
<if test="wordCount != null">#{wordCount},</if>
<if test="isVip != null">#{isVip},</if>
<if test="bookPrice != null">#{bookPrice},</if>
<if test="storageType != null">#{storageType},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateTime != null">#{updateTime}</if>
)
</insert>
<update id="update" parameterType="com.java2nb.novel.domain.BookIndexDO">
update book_index
<set>
<if test="bookId != null">`book_id` = #{bookId},</if>
<if test="indexNum != null">`index_num` = #{indexNum},</if>
<if test="indexName != null">`index_name` = #{indexName},</if>
<if test="wordCount != null">`word_count` = #{wordCount},</if>
<if test="isVip != null">`is_vip` = #{isVip},</if>
<if test="bookPrice != null">`book_price` = #{bookPrice},</if>
<if test="storageType != null">`storage_type` = #{storageType},</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 book_index
where id = #{value}
</delete>
<delete id="batchRemove">
delete from book_index where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -4,24 +4,47 @@
<mapper namespace="com.java2nb.novel.dao.BookDao">
<select id="get" resultType="com.java2nb.novel.domain.BookDO">
select `id`,`work_direction`,`cat_id`,`cat_name`,`cat_child_id`,`cat_child_name`,`pic_url`,`book_name`,`hero_name`,`lady_name`,`book_style`,`book_label`,`author_id`,`author_name`,`book_desc`,`score`,`book_status`,`visit_count`,`word_count`,`comment_count`,`yesterday_buy`,`last_index_id`,`last_index_name`,`last_index_update_time`,`is_vip`,`status`,`update_time`,`create_time`,`crawl_source_id`,`crawl_book_id`,`crawl_last_time`,`crawl_is_stop` from book where id = #{value}
select `id`,
`work_direction`,
`cat_id`,
`cat_name`,
`pic_url`,
`book_name`,
`author_id`,
`author_name`,
`book_desc`,
`score`,
`book_status`,
`visit_count`,
`word_count`,
`comment_count`,
`yesterday_buy`,
`last_index_id`,
`last_index_name`,
`last_index_update_time`,
`is_vip`,
`status`,
`update_time`,
`create_time`,
`crawl_source_id`,
`crawl_book_id`,
`crawl_last_time`,
`crawl_is_stop`
from book
where id = #{value}
</select>
<select id="list" resultType="com.java2nb.novel.domain.BookDO">
select `id`,`work_direction`,`cat_id`,`cat_name`,`cat_child_id`,`cat_child_name`,`pic_url`,`book_name`,`hero_name`,`lady_name`,`book_style`,`book_label`,`author_id`,`author_name`,`book_desc`,`score`,`book_status`,`visit_count`,`word_count`,`comment_count`,`yesterday_buy`,`last_index_id`,`last_index_name`,`last_index_update_time`,`is_vip`,`status`,`update_time`,`create_time`,`crawl_source_id`,`crawl_book_id`,`crawl_last_time`,`crawl_is_stop` from book
select
`id`,`work_direction`,`cat_id`,`cat_name`,`pic_url`,`book_name`,`author_id`,`author_name`,`book_desc`,`score`,`book_status`,`visit_count`,`word_count`,`comment_count`,`yesterday_buy`,`last_index_id`,`last_index_name`,`last_index_update_time`,`is_vip`,`status`,`update_time`,`create_time`,`crawl_source_id`,`crawl_book_id`,`crawl_last_time`,`crawl_is_stop`
from book
<where>
<if test="id != null and id != ''">and id = #{id}</if>
<if test="workDirection != null and workDirection != ''">and work_direction = #{workDirection}</if>
<if test="catId != null and catId != ''">and cat_id = #{catId}</if>
<if test="catName != null and catName != ''">and cat_name = #{catName}</if>
<if test="catChildId != null and catChildId != ''"> and cat_child_id = #{catChildId} </if>
<if test="catChildName != null and catChildName != ''"> and cat_child_name = #{catChildName} </if>
<if test="picUrl != null and picUrl != ''">and pic_url = #{picUrl}</if>
<if test="bookName != null and bookName != ''">and book_name = #{bookName}</if>
<if test="heroName != null and heroName != ''"> and hero_name = #{heroName} </if>
<if test="ladyName != null and ladyName != ''"> and lady_name = #{ladyName} </if>
<if test="bookStyle != null and bookStyle != ''"> and book_style = #{bookStyle} </if>
<if test="bookLabel != null and bookLabel != ''"> and book_label = #{bookLabel} </if>
<if test="authorId != null and authorId != ''">and author_id = #{authorId}</if>
<if test="authorName != null and authorName != ''">and author_name = #{authorName}</if>
<if test="bookDesc != null and bookDesc != ''">and book_desc = #{bookDesc}</if>
@ -33,7 +56,9 @@
<if test="yesterdayBuy != null and yesterdayBuy != ''">and yesterday_buy = #{yesterdayBuy}</if>
<if test="lastIndexId != null and lastIndexId != ''">and last_index_id = #{lastIndexId}</if>
<if test="lastIndexName != null and lastIndexName != ''">and last_index_name = #{lastIndexName}</if>
<if test="lastIndexUpdateTime != null and lastIndexUpdateTime != ''"> and last_index_update_time = #{lastIndexUpdateTime} </if>
<if test="lastIndexUpdateTime != null and lastIndexUpdateTime != ''">and last_index_update_time =
#{lastIndexUpdateTime}
</if>
<if test="isVip != null and isVip != ''">and is_vip = #{isVip}</if>
<if test="status != null and status != ''">and status = #{status}</if>
<if test="updateTime != null and updateTime != ''">and update_time = #{updateTime}</if>
@ -63,14 +88,8 @@
<if test="workDirection != null and workDirection != ''">and work_direction = #{workDirection}</if>
<if test="catId != null and catId != ''">and cat_id = #{catId}</if>
<if test="catName != null and catName != ''">and cat_name = #{catName}</if>
<if test="catChildId != null and catChildId != ''"> and cat_child_id = #{catChildId} </if>
<if test="catChildName != null and catChildName != ''"> and cat_child_name = #{catChildName} </if>
<if test="picUrl != null and picUrl != ''">and pic_url = #{picUrl}</if>
<if test="bookName != null and bookName != ''">and book_name = #{bookName}</if>
<if test="heroName != null and heroName != ''"> and hero_name = #{heroName} </if>
<if test="ladyName != null and ladyName != ''"> and lady_name = #{ladyName} </if>
<if test="bookStyle != null and bookStyle != ''"> and book_style = #{bookStyle} </if>
<if test="bookLabel != null and bookLabel != ''"> and book_label = #{bookLabel} </if>
<if test="authorId != null and authorId != ''">and author_id = #{authorId}</if>
<if test="authorName != null and authorName != ''">and author_name = #{authorName}</if>
<if test="bookDesc != null and bookDesc != ''">and book_desc = #{bookDesc}</if>
@ -82,7 +101,9 @@
<if test="yesterdayBuy != null and yesterdayBuy != ''">and yesterday_buy = #{yesterdayBuy}</if>
<if test="lastIndexId != null and lastIndexId != ''">and last_index_id = #{lastIndexId}</if>
<if test="lastIndexName != null and lastIndexName != ''">and last_index_name = #{lastIndexName}</if>
<if test="lastIndexUpdateTime != null and lastIndexUpdateTime != ''"> and last_index_update_time = #{lastIndexUpdateTime} </if>
<if test="lastIndexUpdateTime != null and lastIndexUpdateTime != ''">and last_index_update_time =
#{lastIndexUpdateTime}
</if>
<if test="isVip != null and isVip != ''">and is_vip = #{isVip}</if>
<if test="status != null and status != ''">and status = #{status}</if>
<if test="updateTime != null and updateTime != ''">and update_time = #{updateTime}</if>
@ -96,19 +117,12 @@
<insert id="save" parameterType="com.java2nb.novel.domain.BookDO">
insert into book
(
`id`,
(`id`,
`work_direction`,
`cat_id`,
`cat_name`,
`cat_child_id`,
`cat_child_name`,
`pic_url`,
`book_name`,
`hero_name`,
`lady_name`,
`book_style`,
`book_label`,
`author_id`,
`author_name`,
`book_desc`,
@ -128,22 +142,13 @@
`crawl_source_id`,
`crawl_book_id`,
`crawl_last_time`,
`crawl_is_stop`
)
values
(
#{id},
`crawl_is_stop`)
values (#{id},
#{workDirection},
#{catId},
#{catName},
#{catChildId},
#{catChildName},
#{picUrl},
#{bookName},
#{heroName},
#{ladyName},
#{bookStyle},
#{bookLabel},
#{authorId},
#{authorName},
#{bookDesc},
@ -163,8 +168,7 @@
#{crawlSourceId},
#{crawlBookId},
#{crawlLastTime},
#{crawlIsStop}
)
#{crawlIsStop})
</insert>
<insert id="saveSelective" parameterType="com.java2nb.novel.domain.BookDO">
@ -174,14 +178,8 @@
<if test="workDirection != null">`work_direction`,</if>
<if test="catId != null">`cat_id`,</if>
<if test="catName != null">`cat_name`,</if>
<if test="catChildId != null"> `cat_child_id`, </if>
<if test="catChildName != null"> `cat_child_name`, </if>
<if test="picUrl != null">`pic_url`,</if>
<if test="bookName != null">`book_name`,</if>
<if test="heroName != null"> `hero_name`, </if>
<if test="ladyName != null"> `lady_name`, </if>
<if test="bookStyle != null"> `book_style`, </if>
<if test="bookLabel != null"> `book_label`, </if>
<if test="authorId != null">`author_id`,</if>
<if test="authorName != null">`author_name`,</if>
<if test="bookDesc != null">`book_desc`,</if>
@ -209,14 +207,8 @@
<if test="workDirection != null">#{workDirection},</if>
<if test="catId != null">#{catId},</if>
<if test="catName != null">#{catName},</if>
<if test="catChildId != null"> #{catChildId}, </if>
<if test="catChildName != null"> #{catChildName}, </if>
<if test="picUrl != null">#{picUrl},</if>
<if test="bookName != null">#{bookName},</if>
<if test="heroName != null"> #{heroName}, </if>
<if test="ladyName != null"> #{ladyName}, </if>
<if test="bookStyle != null"> #{bookStyle}, </if>
<if test="bookLabel != null"> #{bookLabel}, </if>
<if test="authorId != null">#{authorId},</if>
<if test="authorName != null">#{authorName},</if>
<if test="bookDesc != null">#{bookDesc},</if>
@ -246,14 +238,8 @@
<if test="workDirection != null">`work_direction` = #{workDirection},</if>
<if test="catId != null">`cat_id` = #{catId},</if>
<if test="catName != null">`cat_name` = #{catName},</if>
<if test="catChildId != null">`cat_child_id` = #{catChildId}, </if>
<if test="catChildName != null">`cat_child_name` = #{catChildName}, </if>
<if test="picUrl != null">`pic_url` = #{picUrl},</if>
<if test="bookName != null">`book_name` = #{bookName},</if>
<if test="heroName != null">`hero_name` = #{heroName}, </if>
<if test="ladyName != null">`lady_name` = #{ladyName}, </if>
<if test="bookStyle != null">`book_style` = #{bookStyle}, </if>
<if test="bookLabel != null">`book_label` = #{bookLabel}, </if>
<if test="authorId != null">`author_id` = #{authorId},</if>
<if test="authorName != null">`author_name` = #{authorName},</if>
<if test="bookDesc != null">`book_desc` = #{bookDesc},</if>
@ -279,7 +265,9 @@
</update>
<delete id="remove">
delete from book where id = #{value}
delete
from book
where id = #{value}
</delete>
<delete id="batchRemove">
@ -290,17 +278,20 @@
</delete>
<select id="tableSta" resultType="map">
SELECT
DATE_FORMAT( create_time, "%Y-%m-%d" ) AS staDate,
SELECT DATE_FORMAT(create_time, "%Y-%m-%d") AS staDate,
COUNT(1) bookCount
FROM
book
WHERE
create_time >= #{minDate}
GROUP BY
DATE_FORMAT( create_time, "%Y-%m-%d" )
ORDER BY
staDate
FROM book
WHERE create_time >= #{minDate}
GROUP BY DATE_FORMAT(create_time, "%Y-%m-%d")
ORDER BY staDate
</select>
<select id="batchGet" resultType="com.java2nb.novel.domain.BookDO">
select
`id`,`work_direction`,`cat_id`,`cat_name`,`pic_url`,`book_name`,`author_id`,`author_name`,`book_desc`,`score`,`book_status`,`visit_count`,`word_count`,`comment_count`,`yesterday_buy`,`last_index_id`,`last_index_name`,`last_index_update_time`,`is_vip`,`status`,`update_time`,`create_time`,`crawl_source_id`,`crawl_book_id`,`crawl_last_time`,`crawl_is_stop`
from book where id in
<foreach item="id" collection="list" open="(" separator="," close=")">
#{id}
</foreach>
</select>
</mapper>

View File

@ -0,0 +1,131 @@
<?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.BookSettingDao">
<select id="get" resultType="com.java2nb.novel.domain.BookSettingDO">
select `id`,
`book_id`,
`sort`,
`type`,
`create_time`,
`create_user_id`,
`update_time`,
`update_user_id`
from book_setting
where id = #{value}
</select>
<select id="list" resultType="com.java2nb.novel.domain.BookSettingDO">
select `id`,`book_id`,`sort`,`type`,`create_time`,`create_user_id`,`update_time`,`update_user_id` from
book_setting
<where>
<if test="id != null and id != ''">and id = #{id}</if>
<if test="bookId != null and bookId != ''">and book_id = #{bookId}</if>
<if test="sort != null and sort != ''">and sort = #{sort}</if>
<if test="type != null and type != ''">and type = #{type}</if>
<if test="createTime != null and createTime != ''">and create_time = #{createTime}</if>
<if test="createUserId != null and createUserId != ''">and create_user_id = #{createUserId}</if>
<if test="updateTime != null and updateTime != ''">and update_time = #{updateTime}</if>
<if test="updateUserId != null and updateUserId != ''">and update_user_id = #{updateUserId}</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_setting t1 inner join book t2 on t1.book_id = t2.id
<where>
<if test="id != null and id != ''">and t1.id = #{id}</if>
<if test="bookId != null and bookId != ''">and t1.book_id = #{bookId}</if>
<if test="sort != null and sort != ''">and t1.sort = #{sort}</if>
<if test="type != null and type != ''">and t1.type = #{type}</if>
<if test="createTime != null and createTime != ''">and t1.create_time = #{createTime}</if>
<if test="createUserId != null and createUserId != ''">and t1.create_user_id = #{createUserId}</if>
<if test="updateTime != null and updateTime != ''">and t1.update_time = #{updateTime}</if>
<if test="updateUserId != null and updateUserId != ''">and t1.update_user_id = #{updateUserId}</if>
</where>
</select>
<insert id="save" parameterType="com.java2nb.novel.domain.BookSettingDO">
insert into book_setting
(`id`,
`book_id`,
`sort`,
`type`,
`create_time`,
`create_user_id`,
`update_time`,
`update_user_id`)
values (#{id},
#{bookId},
#{sort},
#{type},
#{createTime},
#{createUserId},
#{updateTime},
#{updateUserId})
</insert>
<insert id="saveSelective" parameterType="com.java2nb.novel.domain.BookSettingDO">
insert into book_setting
(
<if test="id != null">`id`,</if>
<if test="bookId != null">`book_id`,</if>
<if test="sort != null">`sort`,</if>
<if test="type != null">`type`,</if>
<if test="createTime != null">`create_time`,</if>
<if test="createUserId != null">`create_user_id`,</if>
<if test="updateTime != null">`update_time`,</if>
<if test="updateUserId != null">`update_user_id`</if>
)
values
(
<if test="id != null">#{id},</if>
<if test="bookId != null">#{bookId},</if>
<if test="sort != null">#{sort},</if>
<if test="type != null">#{type},</if>
<if test="createTime != null">#{createTime},</if>
<if test="createUserId != null">#{createUserId},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="updateUserId != null">#{updateUserId}</if>
)
</insert>
<update id="update" parameterType="com.java2nb.novel.domain.BookSettingDO">
update book_setting
<set>
<if test="bookId != null">`book_id` = #{bookId},</if>
<if test="sort != null">`sort` = #{sort},</if>
<if test="type != null">`type` = #{type},</if>
<if test="createTime != null">`create_time` = #{createTime},</if>
<if test="createUserId != null">`create_user_id` = #{createUserId},</if>
<if test="updateTime != null">`update_time` = #{updateTime},</if>
<if test="updateUserId != null">`update_user_id` = #{updateUserId}</if>
</set>
where id = #{id}
</update>
<delete id="remove">
delete
from book_setting
where id = #{value}
</delete>
<delete id="batchRemove">
delete from book_setting where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -0,0 +1,131 @@
<?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.FriendLinkDao">
<select id="get" resultType="com.java2nb.novel.domain.FriendLinkDO">
select `id`,`link_name`,`link_url`,`sort`,`is_open`,`create_user_id`,`create_time`,`update_user_id`,`update_time` from friend_link where id = #{value}
</select>
<select id="list" resultType="com.java2nb.novel.domain.FriendLinkDO">
select `id`,`link_name`,`link_url`,`sort`,`is_open`,`create_user_id`,`create_time`,`update_user_id`,`update_time` from friend_link
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="linkName != null and linkName != ''"> and link_name = #{linkName} </if>
<if test="linkUrl != null and linkUrl != ''"> and link_url = #{linkUrl} </if>
<if test="sort != null and sort != ''"> and sort = #{sort} </if>
<if test="isOpen != null and isOpen != ''"> and is_open = #{isOpen} </if>
<if test="createUserId != null and createUserId != ''"> and create_user_id = #{createUserId} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
<if test="updateUserId != null and updateUserId != ''"> and update_user_id = #{updateUserId} </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 friend_link
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="linkName != null and linkName != ''"> and link_name = #{linkName} </if>
<if test="linkUrl != null and linkUrl != ''"> and link_url = #{linkUrl} </if>
<if test="sort != null and sort != ''"> and sort = #{sort} </if>
<if test="isOpen != null and isOpen != ''"> and is_open = #{isOpen} </if>
<if test="createUserId != null and createUserId != ''"> and create_user_id = #{createUserId} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
<if test="updateUserId != null and updateUserId != ''"> and update_user_id = #{updateUserId} </if>
<if test="updateTime != null and updateTime != ''"> and update_time = #{updateTime} </if>
</where>
</select>
<insert id="save" parameterType="com.java2nb.novel.domain.FriendLinkDO">
insert into friend_link
(
`id`,
`link_name`,
`link_url`,
`sort`,
`is_open`,
`create_user_id`,
`create_time`,
`update_user_id`,
`update_time`
)
values
(
#{id},
#{linkName},
#{linkUrl},
#{sort},
#{isOpen},
#{createUserId},
#{createTime},
#{updateUserId},
#{updateTime}
)
</insert>
<insert id="saveSelective" parameterType="com.java2nb.novel.domain.FriendLinkDO">
insert into friend_link
(
<if test="id != null"> `id`, </if>
<if test="linkName != null"> `link_name`, </if>
<if test="linkUrl != null"> `link_url`, </if>
<if test="sort != null"> `sort`, </if>
<if test="isOpen != null"> `is_open`, </if>
<if test="createUserId != null"> `create_user_id`, </if>
<if test="createTime != null"> `create_time`, </if>
<if test="updateUserId != null"> `update_user_id`, </if>
<if test="updateTime != null"> `update_time` </if>
)
values
(
<if test="id != null"> #{id}, </if>
<if test="linkName != null"> #{linkName}, </if>
<if test="linkUrl != null"> #{linkUrl}, </if>
<if test="sort != null"> #{sort}, </if>
<if test="isOpen != null"> #{isOpen}, </if>
<if test="createUserId != null"> #{createUserId}, </if>
<if test="createTime != null"> #{createTime}, </if>
<if test="updateUserId != null"> #{updateUserId}, </if>
<if test="updateTime != null"> #{updateTime} </if>
)
</insert>
<update id="update" parameterType="com.java2nb.novel.domain.FriendLinkDO">
update friend_link
<set>
<if test="linkName != null">`link_name` = #{linkName}, </if>
<if test="linkUrl != null">`link_url` = #{linkUrl}, </if>
<if test="sort != null">`sort` = #{sort}, </if>
<if test="isOpen != null">`is_open` = #{isOpen}, </if>
<if test="createUserId != null">`create_user_id` = #{createUserId}, </if>
<if test="createTime != null">`create_time` = #{createTime}, </if>
<if test="updateUserId != null">`update_user_id` = #{updateUserId}, </if>
<if test="updateTime != null">`update_time` = #{updateTime}</if>
</set>
where id = #{id}
</update>
<delete id="remove">
delete from friend_link where id = #{value}
</delete>
<delete id="batchRemove">
delete from friend_link where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -0,0 +1,96 @@
<?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.UserFeedbackDao">
<select id="get" resultType="com.java2nb.novel.domain.UserFeedbackDO">
select `id`,`user_id`,`content`,`create_time` from user_feedback where id = #{value}
</select>
<select id="list" resultType="com.java2nb.novel.domain.UserFeedbackDO">
select `id`,`user_id`,`content`,`create_time` from user_feedback
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="userId != null and userId != ''"> and user_id = #{userId} </if>
<if test="content != null and content != ''"> and content = #{content} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </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_feedback
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="userId != null and userId != ''"> and user_id = #{userId} </if>
<if test="content != null and content != ''"> and content = #{content} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
</where>
</select>
<insert id="save" parameterType="com.java2nb.novel.domain.UserFeedbackDO">
insert into user_feedback
(
`id`,
`user_id`,
`content`,
`create_time`
)
values
(
#{id},
#{userId},
#{content},
#{createTime}
)
</insert>
<insert id="saveSelective" parameterType="com.java2nb.novel.domain.UserFeedbackDO">
insert into user_feedback
(
<if test="id != null"> `id`, </if>
<if test="userId != null"> `user_id`, </if>
<if test="content != null"> `content`, </if>
<if test="createTime != null"> `create_time` </if>
)
values
(
<if test="id != null"> #{id}, </if>
<if test="userId != null"> #{userId}, </if>
<if test="content != null"> #{content}, </if>
<if test="createTime != null"> #{createTime} </if>
)
</insert>
<update id="update" parameterType="com.java2nb.novel.domain.UserFeedbackDO">
update user_feedback
<set>
<if test="userId != null">`user_id` = #{userId}, </if>
<if test="content != null">`content` = #{content}, </if>
<if test="createTime != null">`create_time` = #{createTime}</if>
</set>
where id = #{id}
</update>
<delete id="remove">
delete from user_feedback where id = #{value}
</delete>
<delete id="batchRemove">
delete from user_feedback where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -4,7 +4,18 @@
<mapper namespace="com.java2nb.novel.dao.UserDao">
<select id="get" resultType="com.java2nb.novel.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 `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.novel.domain.UserDO">
@ -54,8 +65,7 @@
<insert id="save" parameterType="com.java2nb.novel.domain.UserDO">
insert into user
(
`id`,
(`id`,
`username`,
`password`,
`nick_name`,
@ -64,11 +74,8 @@
`account_balance`,
`status`,
`create_time`,
`update_time`
)
values
(
#{id},
`update_time`)
values (#{id},
#{username},
#{password},
#{nickName},
@ -77,8 +84,7 @@
#{accountBalance},
#{status},
#{createTime},
#{updateTime}
)
#{updateTime})
</insert>
<insert id="saveSelective" parameterType="com.java2nb.novel.domain.UserDO">
@ -127,7 +133,9 @@
</update>
<delete id="remove">
delete from user where id = #{value}
delete
from user
where id = #{value}
</delete>
<delete id="batchRemove">
@ -138,17 +146,20 @@
</delete>
<select id="tableSta" resultType="map">
SELECT
DATE_FORMAT( create_time, "%Y-%m-%d" ) AS staDate,
SELECT DATE_FORMAT(create_time, "%Y-%m-%d") AS staDate,
COUNT(1) userCount
FROM
user
WHERE
create_time >= #{minDate}
GROUP BY
DATE_FORMAT( create_time, "%Y-%m-%d" )
ORDER BY
staDate
FROM user
WHERE create_time >= #{minDate}
GROUP BY DATE_FORMAT(create_time, "%Y-%m-%d")
ORDER BY staDate
</select>
<select id="batchGet" resultType="com.java2nb.novel.domain.UserDO">
select
`id`,`username`,`password`,`nick_name`,`user_photo`,`user_sex`,`account_balance`,`status`,`create_time`,`update_time`
from user where id in
<foreach item="id" collection="list" open="(" separator="," close=")">
#{id}
</foreach>
</select>
</mapper>

View File

@ -0,0 +1,152 @@
<?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.WebsiteInfoDao">
<select id="get" resultType="com.java2nb.novel.domain.WebsiteInfoDO">
select `id`,`name`,`domain`,`keyword`,`description`,`qq`,`logo`,`logo_dark`,`create_time`,`create_user_id`,`update_time`,`update_user_id` from website_info where id = #{value}
</select>
<select id="list" resultType="com.java2nb.novel.domain.WebsiteInfoDO">
select `id`,`name`,`domain`,`keyword`,`description`,`qq`,`logo`,`logo_dark`,`create_time`,`create_user_id`,`update_time`,`update_user_id` from website_info
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="name != null and name != ''"> and name = #{name} </if>
<if test="domain != null and domain != ''"> and domain = #{domain} </if>
<if test="keyword != null and keyword != ''"> and keyword = #{keyword} </if>
<if test="description != null and description != ''"> and description = #{description} </if>
<if test="qq != null and qq != ''"> and qq = #{qq} </if>
<if test="logo != null and logo != ''"> and logo = #{logo} </if>
<if test="logoDark != null and logoDark != ''"> and logo_dark = #{logoDark} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
<if test="createUserId != null and createUserId != ''"> and create_user_id = #{createUserId} </if>
<if test="updateTime != null and updateTime != ''"> and update_time = #{updateTime} </if>
<if test="updateUserId != null and updateUserId != ''"> and update_user_id = #{updateUserId} </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 website_info
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="name != null and name != ''"> and name = #{name} </if>
<if test="domain != null and domain != ''"> and domain = #{domain} </if>
<if test="keyword != null and keyword != ''"> and keyword = #{keyword} </if>
<if test="description != null and description != ''"> and description = #{description} </if>
<if test="qq != null and qq != ''"> and qq = #{qq} </if>
<if test="logo != null and logo != ''"> and logo = #{logo} </if>
<if test="logoDark != null and logoDark != ''"> and logo_dark = #{logoDark} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
<if test="createUserId != null and createUserId != ''"> and create_user_id = #{createUserId} </if>
<if test="updateTime != null and updateTime != ''"> and update_time = #{updateTime} </if>
<if test="updateUserId != null and updateUserId != ''"> and update_user_id = #{updateUserId} </if>
</where>
</select>
<insert id="save" parameterType="com.java2nb.novel.domain.WebsiteInfoDO">
insert into website_info
(
`id`,
`name`,
`domain`,
`keyword`,
`description`,
`qq`,
`logo`,
`logo_dark`,
`create_time`,
`create_user_id`,
`update_time`,
`update_user_id`
)
values
(
#{id},
#{name},
#{domain},
#{keyword},
#{description},
#{qq},
#{logo},
#{logoDark},
#{createTime},
#{createUserId},
#{updateTime},
#{updateUserId}
)
</insert>
<insert id="saveSelective" parameterType="com.java2nb.novel.domain.WebsiteInfoDO">
insert into website_info
(
<if test="id != null"> `id`, </if>
<if test="name != null"> `name`, </if>
<if test="domain != null"> `domain`, </if>
<if test="keyword != null"> `keyword`, </if>
<if test="description != null"> `description`, </if>
<if test="qq != null"> `qq`, </if>
<if test="logo != null"> `logo`, </if>
<if test="logoDark != null"> `logo_dark`, </if>
<if test="createTime != null"> `create_time`, </if>
<if test="createUserId != null"> `create_user_id`, </if>
<if test="updateTime != null"> `update_time`, </if>
<if test="updateUserId != null"> `update_user_id` </if>
)
values
(
<if test="id != null"> #{id}, </if>
<if test="name != null"> #{name}, </if>
<if test="domain != null"> #{domain}, </if>
<if test="keyword != null"> #{keyword}, </if>
<if test="description != null"> #{description}, </if>
<if test="qq != null"> #{qq}, </if>
<if test="logo != null"> #{logo}, </if>
<if test="logoDark != null"> #{logoDark}, </if>
<if test="createTime != null"> #{createTime}, </if>
<if test="createUserId != null"> #{createUserId}, </if>
<if test="updateTime != null"> #{updateTime}, </if>
<if test="updateUserId != null"> #{updateUserId} </if>
)
</insert>
<update id="update" parameterType="com.java2nb.novel.domain.WebsiteInfoDO">
update website_info
<set>
<if test="name != null">`name` = #{name}, </if>
<if test="domain != null">`domain` = #{domain}, </if>
<if test="keyword != null">`keyword` = #{keyword}, </if>
<if test="description != null">`description` = #{description}, </if>
<if test="qq != null">`qq` = #{qq}, </if>
<if test="logo != null">`logo` = #{logo}, </if>
<if test="logoDark != null">`logo_dark` = #{logoDark}, </if>
<if test="createTime != null">`create_time` = #{createTime}, </if>
<if test="createUserId != null">`create_user_id` = #{createUserId}, </if>
<if test="updateTime != null">`update_time` = #{updateTime}, </if>
<if test="updateUserId != null">`update_user_id` = #{updateUserId}</if>
</set>
where id = #{id}
</update>
<delete id="remove">
delete from website_info where id = #{value}
</delete>
<delete id="batchRemove">
delete from website_info where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -4,11 +4,24 @@
<mapper namespace="com.java2nb.system.dao.DataPermDao">
<select id="get" resultType="com.java2nb.system.domain.DataPermDO">
select `id`,`name`,`table_name`,`module_name`,`crl_attr_name`,`crl_column_name`,`perm_code`,`order_num`,`gmt_create`,`gmt_modified` from sys_data_perm where id = #{value}
select `id`,
`name`,
`table_name`,
`module_name`,
`crl_attr_name`,
`crl_column_name`,
`perm_code`,
`order_num`,
`gmt_create`,
`gmt_modified`
from sys_data_perm
where id = #{value}
</select>
<select id="list" resultType="com.java2nb.system.domain.DataPermDO">
select `id`,`name`,`table_name`,`module_name`,`crl_attr_name`,`crl_column_name`,`perm_code`,`order_num`,`gmt_create`,`gmt_modified` from sys_data_perm
select
`id`,`name`,`table_name`,`module_name`,`crl_attr_name`,`crl_column_name`,`perm_code`,`order_num`,`gmt_create`,`gmt_modified`
from sys_data_perm
<where>
<if test="id != null and id != ''">and id = #{id}</if>
<if test="name != null and name != ''">and name = #{name}</if>
@ -52,8 +65,7 @@
<insert id="save" parameterType="com.java2nb.system.domain.DataPermDO" useGeneratedKeys="true" keyProperty="id">
insert into sys_data_perm
(
`name`,
(`name`,
`table_name`,
`module_name`,
`crl_attr_name`,
@ -61,11 +73,8 @@
`perm_code`,
`order_num`,
`gmt_create`,
`gmt_modified`
)
values
(
#{name},
`gmt_modified`)
values (#{name},
#{tableName},
#{moduleName},
#{crlAttrName},
@ -73,11 +82,11 @@
#{permCode},
#{orderNum},
#{gmtCreate},
#{gmtModified}
)
#{gmtModified})
</insert>
<insert id="saveSelective" parameterType="com.java2nb.system.domain.DataPermDO" useGeneratedKeys="true" keyProperty="id">
<insert id="saveSelective" parameterType="com.java2nb.system.domain.DataPermDO" useGeneratedKeys="true"
keyProperty="id">
insert into sys_data_perm
(
<if test="id != null">`id`,</if>
@ -123,7 +132,9 @@
</update>
<delete id="remove">
delete from sys_data_perm where id = #{value}
delete
from sys_data_perm
where id = #{value}
</delete>
<delete id="batchRemove">
@ -135,13 +146,14 @@
<select id="listModuleName" resultType="com.java2nb.system.domain.DataPermDO">
select distinct `module_name` from sys_data_perm ;
select `module_name`
from sys_data_perm;
</select>
<select id="selectDataPermsByUserId" parameterType="long" resultType="com.java2nb.system.domain.DataPermDO">
select distinct t1.`table_name`,t1.`module_name`,t1.`crl_attr_name`,t1.`crl_column_name`,t1.`perm_code`
select t1.`table_name`, t1.`module_name`, t1.`crl_attr_name`, t1.`crl_column_name`, t1.`perm_code`
from sys_data_perm t1
inner join sys_role_data_perm t2 on t1.id = t2.perm_id
inner join sys_user_role t3 on t2.role_id = t3.role_id

View File

@ -4,8 +4,12 @@
<mapper namespace="com.java2nb.system.dao.DeptDao">
<select id="get" resultType="com.java2nb.system.domain.DeptDO">
select
`dept_id`,`parent_id`,`name`,`order_num`,`del_flag` from sys_dept
select `dept_id`,
`parent_id`,
`name`,
`order_num`,
`del_flag`
from sys_dept
where dept_id = #{value}
</select>
@ -46,19 +50,14 @@
<insert id="save" parameterType="com.java2nb.system.domain.DeptDO"
useGeneratedKeys="true" keyProperty="deptId">
insert into sys_dept
(
`parent_id`,
(`parent_id`,
`name`,
`order_num`,
`del_flag`
)
values
(
#{parentId},
`del_flag`)
values (#{parentId},
#{name},
#{orderNum},
#{delFlag}
)
#{delFlag})
</insert>
<update id="update" parameterType="com.java2nb.system.domain.DeptDO">
@ -73,7 +72,9 @@
</update>
<delete id="remove">
delete from sys_dept where dept_id = #{value}
delete
from sys_dept
where dept_id = #{value}
</delete>
<delete id="batchRemove">
@ -85,14 +86,19 @@
</delete>
<select id="listParentDept" resultType="long">
select DISTINCT parent_id from sys_dept
select parent_id
from sys_dept
</select>
<select id="getDeptUserNumber" resultType="int">
select count(*) from sys_user where dept_id = #{value}
select count(*)
from sys_user
where dept_id = #{value}
</select>
<select id="getDeptIdsByParentId" parameterType="long" resultType="String">
select group_concat(dept_id) from sys_dept where parent_id = #{deptId}
select group_concat(dept_id)
from sys_dept
where parent_id = #{deptId}
</select>
</mapper>

View File

@ -4,9 +4,18 @@
<mapper namespace="com.java2nb.system.dao.MenuDao">
<select id="get" resultType="com.java2nb.system.domain.MenuDO">
select
`menu_id`,`parent_id`,`name`,`url`,`perms`,`type`,`icon`,`order_num`,`gmt_create`,`gmt_modified`
from sys_menu where menu_id = #{value}
select `menu_id`,
`parent_id`,
`name`,
`url`,
`perms`,
`type`,
`icon`,
`order_num`,
`gmt_create`,
`gmt_modified`
from sys_menu
where menu_id = #{value}
</select>
<select id="list" resultType="com.java2nb.system.domain.MenuDO">
@ -57,8 +66,7 @@
<insert id="save" parameterType="com.java2nb.system.domain.MenuDO"
useGeneratedKeys="true" keyProperty="menuId">
insert into sys_menu
(
`parent_id`,
(`parent_id`,
`name`,
`url`,
`perms`,
@ -66,11 +74,8 @@
`icon`,
`order_num`,
`gmt_create`,
`gmt_modified`
)
values
(
#{parentId},
`gmt_modified`)
values (#{parentId},
#{name},
#{url},
#{perms},
@ -78,8 +83,7 @@
#{icon},
#{orderNum},
#{gmtCreate},
#{gmtModified}
)
#{gmtModified})
</insert>
<update id="update" parameterType="com.java2nb.system.domain.MenuDO">
@ -99,7 +103,9 @@
</update>
<delete id="remove">
delete from sys_menu where menu_id = #{value}
delete
from sys_menu
where menu_id = #{value}
</delete>
<delete id="batchRemove">
@ -111,26 +117,34 @@
</delete>
<select id="listMenuByUserId" resultType="com.java2nb.system.domain.MenuDO">
select distinct
m.menu_id , parent_id, name, url,
perms,`type`,icon,order_num,gmt_create, gmt_modified
select m.menu_id,
parent_id,
name,
url,
perms,
`type`,
icon,
order_num,
gmt_create,
gmt_modified
from sys_menu m
left
join sys_role_menu rm on m.menu_id = rm.menu_id left join
left join sys_role_menu rm on m.menu_id = rm.menu_id
left join
sys_user_role ur
on rm.role_id =ur.role_id where ur.user_id = #{id}
and
m.type in(0,1)
order by
m.order_num
on rm.role_id = ur.role_id
where ur.user_id = #{id}
and m.type in (0, 1)
order by m.order_num
</select>
<select id="listUserPerms" resultType="string">
select distinct m.perms
from sys_menu m left join
select m.perms
from sys_menu m
left join
sys_role_menu rm on m.menu_id = rm.menu_id
left join sys_user_role ur
on rm.role_id = ur.role_id where ur.user_id
on rm.role_id = ur.role_id
where ur.user_id
= #{id}
</select>
</mapper>

View File

@ -4,7 +4,27 @@
<mapper namespace="com.java2nb.system.dao.SysUserDao">
<select id="get" resultType="com.java2nb.system.domain.UserDO">
select `user_id`,`username`,`name`,`password`,`dept_id`,`email`,`mobile`,`status`,`user_id_create`,`gmt_create`,`gmt_modified`,`sex`,`birth`,`pic_id`,`live_address`,`hobby`,`province`,`city`,`district` from sys_user where user_id = #{value}
select `user_id`,
`username`,
`name`,
`password`,
`dept_id`,
`email`,
`mobile`,
`status`,
`user_id_create`,
`gmt_create`,
`gmt_modified`,
`sex`,
`birth`,
`pic_id`,
`live_address`,
`hobby`,
`province`,
`city`,
`district`
from sys_user
where user_id = #{value}
</select>
<select id="list" resultType="com.java2nb.system.domain.UserDO">
@ -51,7 +71,8 @@
</select>
<select id="listByPerm" resultType="com.java2nb.system.domain.UserDO">
select `user_id`,`username`,`name`,`password`,`dept_id`,`email`,`mobile`,`status`,`user_id_create`,`gmt_create`,`gmt_modified`,`sex`,`birth`,`pic_id`,`live_address`,`hobby`,`province`,`city`,`district`
select
`user_id`,`username`,`name`,`password`,`dept_id`,`email`,`mobile`,`status`,`user_id_create`,`gmt_create`,`gmt_modified`,`sex`,`birth`,`pic_id`,`live_address`,`hobby`,`province`,`city`,`district`
from (
select
`user_id`,`username`,`name`,`password`,`dept_id`,`email`,`mobile`,`status`,`user_id_create`,`gmt_create`,`gmt_modified`,`sex`,`birth`,`pic_id`,`live_address`,`hobby`,`province`,`city`,`district`
@ -97,7 +118,8 @@
</select>
<select id="countByPerm" resultType="int">
select count(*) from (
select `user_id`,`username`,`name`,`password`,`dept_id`,`email`,`mobile`,`status`,`user_id_create`,`gmt_create`,`gmt_modified`,`sex`,`birth`,`pic_id`,`live_address`,`hobby`,`province`,`city`,`district`
select
`user_id`,`username`,`name`,`password`,`dept_id`,`email`,`mobile`,`status`,`user_id_create`,`gmt_create`,`gmt_modified`,`sex`,`birth`,`pic_id`,`live_address`,`hobby`,`province`,`city`,`district`
from sys_user
<where>
<if test="userId != null and userId != ''">and user_id = #{userId}</if>
@ -150,8 +172,7 @@
<insert id="save" parameterType="com.java2nb.system.domain.UserDO" useGeneratedKeys="true" keyProperty="userId">
insert into sys_user
(
`username`,
(`username`,
`name`,
`password`,
`dept_id`,
@ -168,11 +189,8 @@
`hobby`,
`province`,
`city`,
`district`
)
values
(
#{username},
`district`)
values (#{username},
#{name},
#{password},
#{deptId},
@ -189,8 +207,7 @@
#{hobby},
#{province},
#{city},
#{district}
)
#{district})
</insert>
<update id="update" parameterType="com.java2nb.system.domain.UserDO">
@ -219,7 +236,9 @@
</update>
<delete id="remove">
delete from sys_user where user_id = #{value}
delete
from sys_user
where user_id = #{value}
</delete>
<delete id="batchRemove">
@ -230,7 +249,8 @@
</delete>
<select id="listAllDept" resultType="long">
select DISTINCT dept_id from sys_user
select dept_id
from sys_user
</select>
</mapper>

View File

@ -50,229 +50,114 @@ function load() {
}
},
columns: [
{
checkbox: true
},
{
title: '序号',
formatter: function () {
return arguments[2] + 1;
}
},
{
field: 'id',
title: '主键'
title: '小说ID'
},
{
field: 'workDirection',
title: '作品方向0男频1女频'
title: '作品方向',
formatter: function (value, row, index) {
return value === 0 ? '男频' : '女频';
}
},
{
field: 'catId',
title: '分类ID'
},
{
field: 'catName',
title: '分类名'
},
{
field: 'catChildId',
title: '子分类ID'
},
{
field: 'catChildName',
title: '子分类名'
},
{
field: 'picUrl',
title: '小说封面'
},
{
field: 'bookName',
title: '小说名'
},
{
field: 'heroName',
title: '男主角姓名'
},
{
field: 'ladyName',
title: '女主角姓名'
},
{
field: 'bookStyle',
title: '作品风格0甜宠1虐恋2其他'
},
{
field: 'bookLabel',
title: '作品标签'
},
{
field: 'authorId',
title: '作者id'
},
{
field: 'authorName',
title: '作者名'
},
{
field: 'bookDesc',
title: '书籍描述'
},
{
field: 'score',
title: '评分预留字段'
},
{
field: 'bookStatus',
title: '书籍状态0连载中1已完结'
title: '书籍状态',
formatter: function (value, row, index) {
return value === 0 ? '连载中' : '已完结';
}
},
{
field: 'visitCount',
title: '点击量'
},
{
field: 'wordCount',
title: '总字数'
},
{
field: 'commentCount',
title: '评论数'
},
{
field: 'yesterdayBuy',
title: '昨日订阅数'
},
{
field: 'lastIndexId',
title: '最新目录ID'
},
{
field: 'lastIndexName',
title: '最新目录名'
title: '最新章节'
},
{
field: 'lastIndexUpdateTime',
title: '最新目录更新时间'
title: '最新章节更新时间'
},
{
field: 'isVip',
title: '是否收费1收费0免费'
title: '是否收费',
formatter: function (value, row, index) {
return value === 1 ? '收费' : '免费';
}
},
{
field: 'status',
title: '状态0入库1上架'
},
{
field: 'updateTime',
title: '更新时间'
},
{
field: 'createTime',
title: '创建时间'
title: '入库时间'
},
{
field: 'crawlSourceId',
title: '爬虫源站ID'
},
{
field: 'crawlBookId',
title: '抓取的源站小说ID'
},
{
field: 'crawlLastTime',
title: '最后一次的抓取时间'
},
{
field: 'crawlIsStop',
title: '是否已停止更新0未停止1已停止'
},
{
title: '操作',
field: 'id',
align: 'center',
formatter: function (value, row, index) {
var d = '<a class="btn btn-primary btn-sm ' + s_detail_h + '" href="#" mce_href="#" title="详情" onclick="detail(\''
+ row.id
+ '\')"><i class="fa fa-file"></i></a> ';
var e = '<a class="btn btn-primary btn-sm ' + s_edit_h + '" href="#" mce_href="#" title="编辑" onclick="edit(\''
+ row.id
+ '\')"><i class="fa fa-edit"></i></a> ';
var r = '<a class="btn btn-warning btn-sm ' + s_remove_h + '" href="#" title="删除" mce_href="#" onclick="remove(\''
+ row.id
+ '\')"><i class="fa fa-remove"></i></a> ';
return d + e + r;
return r;
}
}]
}
]
});
}
function reLoad() {
$('#exampleTable').bootstrapTable('refresh');
}
function add() {
layer.open({
type: 2,
@ -283,6 +168,7 @@ function add() {
content: prefix + '/add' // iframe的url
});
}
function detail(id) {
layer.open({
type: 2,
@ -293,6 +179,7 @@ function detail(id) {
content: prefix + '/detail/' + id // iframe的url
});
}
function edit(id) {
layer.open({
type: 2,
@ -303,6 +190,7 @@ function edit(id) {
content: prefix + '/edit/' + id // iframe的url
});
}
function remove(id) {
layer.confirm('确定要删除选中的记录?', {
btn: ['确定', '取消']
@ -327,6 +215,7 @@ function remove(id) {
function resetPwd(id) {
}
function batchRemove() {
var rows = $('#exampleTable').bootstrapTable('getSelections'); // 返回所有选择的行,当没有选择的记录时,返回一个空数组
if (rows.length == 0) {

View File

@ -0,0 +1,107 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
save();
}
});
function save() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/bookComment/save",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
},
messages: {
}
})
}

View File

@ -0,0 +1,201 @@
var prefix = "/novel/bookComment"
$(function () {
load();
});
function load() {
$('#exampleTable')
.bootstrapTable(
{
method: 'get', // 服务器数据的请求方式 get or post
url: prefix + "/list", // 服务器数据的加载地址
// showRefresh : true,
// showToggle : true,
// showColumns : true,
iconSize: 'outline',
toolbar: '#exampleToolbar',
striped: true, // 设置为true会有隔行变色效果
dataType: "json", // 服务器返回的数据类型
pagination: true, // 设置为true会在底部显示分页条
// queryParamsType : "limit",
// //设置为limit则会发送符合RESTFull格式的参数
singleSelect: false, // 设置为true将禁止多选
// contentType : "application/x-www-form-urlencoded",
// //发送到服务器的数据编码类型
pageSize: 10, // 如果设置了分页,每页数据条数
pageNumber: 1, // 如果设置了分布,首页页码
//search : true, // 是否显示搜索框
showColumns: false, // 是否显示内容下拉框(选择显示的列)
sidePagination: "server", // 设置在哪里进行分页,可选值为"client" 或者 "server"
queryParams: function (params) {
//说明传入后台的参数包括offset开始索引limit步长sort排序列orderdesc或者,以及所有列的键值对
var queryParams = getFormJson("searchForm");
queryParams.limit = params.limit;
queryParams.offset = params.offset;
return queryParams;
},
// //请求服务器数据时,你可以通过重写参数的方式添加一些额外的参数,例如 toolbar 中的参数 如果
// queryParamsType = 'limit' ,返回参数必须包含
// limit, offset, search, sort, order 否则, 需要包含:
// pageSize, pageNumber, searchText, sortName,
// sortOrder.
// 返回false将会终止请求
responseHandler: function (rs) {
if (rs.code == 0) {
return rs.data;
} else {
parent.layer.alert(rs.msg)
return {total: 0, rows: []};
}
},
columns: [
{
checkbox: true
},
{
title: '序号',
formatter: function () {
return arguments[2] + 1;
}
},
{
field: 'bookName',
title: '评论小说'
},
{
field: 'commentContent',
title: '评论内容'
},
{
field: 'createTime',
title: '评论时间'
},
{
field: 'userName',
title: '评论人'
},
{
title: '操作',
field: 'id',
align: 'center',
formatter: function (value, row, index) {
var d = '<a class="btn btn-primary btn-sm ' + s_detail_h + '" href="#" mce_href="#" title="详情" onclick="detail(\''
+ row.id
+ '\')"><i class="fa fa-file"></i></a> ';
var e = '<a class="btn btn-primary btn-sm ' + s_edit_h + '" href="#" mce_href="#" title="编辑" onclick="edit(\''
+ row.id
+ '\')"><i class="fa fa-edit"></i></a> ';
var r = '<a class="btn btn-warning btn-sm ' + s_remove_h + '" href="#" title="删除" mce_href="#" onclick="remove(\''
+ row.id
+ '\')"><i class="fa fa-remove"></i></a> ';
return d + e + r;
}
}]
});
}
function reLoad() {
$('#exampleTable').bootstrapTable('refresh');
}
function add() {
layer.open({
type: 2,
title: '增加',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/add' // iframe的url
});
}
function detail(id) {
layer.open({
type: 2,
title: '详情',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/detail/' + id // iframe的url
});
}
function edit(id) {
layer.open({
type: 2,
title: '编辑',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/edit/' + id // iframe的url
});
}
function remove(id) {
layer.confirm('确定要删除选中的记录?', {
btn: ['确定', '取消']
}, function () {
$.ajax({
url: prefix + "/remove",
type: "post",
data: {
'id': id
},
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
})
}
function resetPwd(id) {
}
function batchRemove() {
var rows = $('#exampleTable').bootstrapTable('getSelections'); // 返回所有选择的行,当没有选择的记录时,返回一个空数组
if (rows.length == 0) {
layer.msg("请选择要删除的数据");
return;
}
layer.confirm("确认要删除选中的'" + rows.length + "'条数据吗?", {
btn: ['确定', '取消']
// 按钮
}, function () {
var ids = new Array();
// 遍历所有选择的行数据取每条数据对应的ID
$.each(rows, function (i, row) {
ids[i] = row['id'];
});
$.ajax({
type: 'POST',
data: {
"ids": ids
},
url: prefix + '/batchRemove',
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
}, function () {
});
}

View File

@ -0,0 +1,103 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
editor.txt.html($("#" + relName).val());
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
update();
}
});
function update() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/bookComment/update",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
},
messages: {
}
})
}

View File

@ -0,0 +1,107 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
save();
}
});
function save() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/bookContent/save",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
},
messages: {
}
})
}

View File

@ -0,0 +1,189 @@
var prefix = "/novel/bookContent"
$(function () {
load();
});
function load() {
$('#exampleTable')
.bootstrapTable(
{
method: 'get', // 服务器数据的请求方式 get or post
url: prefix + "/list", // 服务器数据的加载地址
// showRefresh : true,
// showToggle : true,
// showColumns : true,
iconSize: 'outline',
toolbar: '#exampleToolbar',
striped: true, // 设置为true会有隔行变色效果
dataType: "json", // 服务器返回的数据类型
pagination: true, // 设置为true会在底部显示分页条
// queryParamsType : "limit",
// //设置为limit则会发送符合RESTFull格式的参数
singleSelect: false, // 设置为true将禁止多选
// contentType : "application/x-www-form-urlencoded",
// //发送到服务器的数据编码类型
pageSize: 10, // 如果设置了分页,每页数据条数
pageNumber: 1, // 如果设置了分布,首页页码
//search : true, // 是否显示搜索框
showColumns: false, // 是否显示内容下拉框(选择显示的列)
sidePagination: "server", // 设置在哪里进行分页,可选值为"client" 或者 "server"
queryParams: function (params) {
//说明传入后台的参数包括offset开始索引limit步长sort排序列orderdesc或者,以及所有列的键值对
var queryParams = getFormJson("searchForm");
queryParams.limit = params.limit;
queryParams.offset = params.offset;
return queryParams;
},
// //请求服务器数据时,你可以通过重写参数的方式添加一些额外的参数,例如 toolbar 中的参数 如果
// queryParamsType = 'limit' ,返回参数必须包含
// limit, offset, search, sort, order 否则, 需要包含:
// pageSize, pageNumber, searchText, sortName,
// sortOrder.
// 返回false将会终止请求
responseHandler: function (rs) {
if (rs.code == 0) {
return rs.data;
} else {
parent.layer.alert(rs.msg)
return {total: 0, rows: []};
}
},
columns: [
{
checkbox: true
},
{
title: '序号',
formatter: function () {
return arguments[2] + 1;
}
},
{
field: 'id',
title: '主键'
},
{
field: 'indexId',
title: '目录ID'
},
{
field: 'content',
title: '小说章节内容'
},
{
title: '操作',
field: 'id',
align: 'center',
formatter: function (value, row, index) {
var d = '<a class="btn btn-primary btn-sm ' + s_detail_h + '" href="#" mce_href="#" title="详情" onclick="detail(\''
+ row.id
+ '\')"><i class="fa fa-file"></i></a> ';
var e = '<a class="btn btn-primary btn-sm ' + s_edit_h + '" href="#" mce_href="#" title="编辑" onclick="edit(\''
+ row.id
+ '\')"><i class="fa fa-edit"></i></a> ';
var r = '<a class="btn btn-warning btn-sm ' + s_remove_h + '" href="#" title="删除" mce_href="#" onclick="remove(\''
+ row.id
+ '\')"><i class="fa fa-remove"></i></a> ';
return d + e + r;
}
}]
});
}
function reLoad() {
$('#exampleTable').bootstrapTable('refresh');
}
function add() {
layer.open({
type: 2,
title: '增加',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/add' // iframe的url
});
}
function detail(id) {
layer.open({
type: 2,
title: '详情',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/detail/' + id // iframe的url
});
}
function edit(id) {
layer.open({
type: 2,
title: '编辑',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/edit/' + id // iframe的url
});
}
function remove(id) {
layer.confirm('确定要删除选中的记录?', {
btn: ['确定', '取消']
}, function () {
$.ajax({
url: prefix + "/remove",
type: "post",
data: {
'id': id
},
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
})
}
function resetPwd(id) {
}
function batchRemove() {
var rows = $('#exampleTable').bootstrapTable('getSelections'); // 返回所有选择的行,当没有选择的记录时,返回一个空数组
if (rows.length == 0) {
layer.msg("请选择要删除的数据");
return;
}
layer.confirm("确认要删除选中的'" + rows.length + "'条数据吗?", {
btn: ['确定', '取消']
// 按钮
}, function () {
var ids = new Array();
// 遍历所有选择的行数据取每条数据对应的ID
$.each(rows, function (i, row) {
ids[i] = row['id'];
});
$.ajax({
type: 'POST',
data: {
"ids": ids
},
url: prefix + '/batchRemove',
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
}, function () {
});
}

View File

@ -0,0 +1,103 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
editor.txt.html($("#" + relName).val());
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
update();
}
});
function update() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/bookContent/update",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
},
messages: {
}
})
}

View File

@ -0,0 +1,107 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
save();
}
});
function save() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/bookIndex/save",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
},
messages: {
}
})
}

View File

@ -0,0 +1,231 @@
var prefix = "/novel/bookIndex"
$(function () {
load();
});
function load() {
$('#exampleTable')
.bootstrapTable(
{
method: 'get', // 服务器数据的请求方式 get or post
url: prefix + "/list", // 服务器数据的加载地址
// showRefresh : true,
// showToggle : true,
// showColumns : true,
iconSize: 'outline',
toolbar: '#exampleToolbar',
striped: true, // 设置为true会有隔行变色效果
dataType: "json", // 服务器返回的数据类型
pagination: true, // 设置为true会在底部显示分页条
// queryParamsType : "limit",
// //设置为limit则会发送符合RESTFull格式的参数
singleSelect: false, // 设置为true将禁止多选
// contentType : "application/x-www-form-urlencoded",
// //发送到服务器的数据编码类型
pageSize: 10, // 如果设置了分页,每页数据条数
pageNumber: 1, // 如果设置了分布,首页页码
//search : true, // 是否显示搜索框
showColumns: false, // 是否显示内容下拉框(选择显示的列)
sidePagination: "server", // 设置在哪里进行分页,可选值为"client" 或者 "server"
queryParams: function (params) {
//说明传入后台的参数包括offset开始索引limit步长sort排序列orderdesc或者,以及所有列的键值对
var queryParams = getFormJson("searchForm");
queryParams.limit = params.limit;
queryParams.offset = params.offset;
return queryParams;
},
// //请求服务器数据时,你可以通过重写参数的方式添加一些额外的参数,例如 toolbar 中的参数 如果
// queryParamsType = 'limit' ,返回参数必须包含
// limit, offset, search, sort, order 否则, 需要包含:
// pageSize, pageNumber, searchText, sortName,
// sortOrder.
// 返回false将会终止请求
responseHandler: function (rs) {
if (rs.code == 0) {
return rs.data;
} else {
parent.layer.alert(rs.msg)
return {total: 0, rows: []};
}
},
columns: [
{
checkbox: true
},
{
title: '序号',
formatter: function () {
return arguments[2] + 1;
}
},
{
field: 'id',
title: '主键'
},
{
field: 'bookId',
title: '小说ID'
},
{
field: 'indexNum',
title: '目录号'
},
{
field: 'indexName',
title: '目录名'
},
{
field: 'wordCount',
title: '字数'
},
{
field: 'isVip',
title: '是否收费1收费0免费'
},
{
field: 'bookPrice',
title: '章节费用屋币'
},
{
field: 'storageType',
title: '存储方式'
},
{
field: 'createTime',
title: ''
},
{
field: 'updateTime',
title: ''
},
{
title: '操作',
field: 'id',
align: 'center',
formatter: function (value, row, index) {
var d = '<a class="btn btn-primary btn-sm ' + s_detail_h + '" href="#" mce_href="#" title="详情" onclick="detail(\''
+ row.id
+ '\')"><i class="fa fa-file"></i></a> ';
var e = '<a class="btn btn-primary btn-sm ' + s_edit_h + '" href="#" mce_href="#" title="编辑" onclick="edit(\''
+ row.id
+ '\')"><i class="fa fa-edit"></i></a> ';
var r = '<a class="btn btn-warning btn-sm ' + s_remove_h + '" href="#" title="删除" mce_href="#" onclick="remove(\''
+ row.id
+ '\')"><i class="fa fa-remove"></i></a> ';
return d + e + r;
}
}]
});
}
function reLoad() {
$('#exampleTable').bootstrapTable('refresh');
}
function add() {
layer.open({
type: 2,
title: '增加',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/add' // iframe的url
});
}
function detail(id) {
layer.open({
type: 2,
title: '详情',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/detail/' + id // iframe的url
});
}
function edit(id) {
layer.open({
type: 2,
title: '编辑',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/edit/' + id // iframe的url
});
}
function remove(id) {
layer.confirm('确定要删除选中的记录?', {
btn: ['确定', '取消']
}, function () {
$.ajax({
url: prefix + "/remove",
type: "post",
data: {
'id': id
},
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
})
}
function resetPwd(id) {
}
function batchRemove() {
var rows = $('#exampleTable').bootstrapTable('getSelections'); // 返回所有选择的行,当没有选择的记录时,返回一个空数组
if (rows.length == 0) {
layer.msg("请选择要删除的数据");
return;
}
layer.confirm("确认要删除选中的'" + rows.length + "'条数据吗?", {
btn: ['确定', '取消']
// 按钮
}, function () {
var ids = new Array();
// 遍历所有选择的行数据取每条数据对应的ID
$.each(rows, function (i, row) {
ids[i] = row['id'];
});
$.ajax({
type: 'POST',
data: {
"ids": ids
},
url: prefix + '/batchRemove',
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
}, function () {
});
}

View File

@ -0,0 +1,103 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
editor.txt.html($("#" + relName).val());
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
update();
}
});
function update() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/bookIndex/update",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
},
messages: {
}
})
}

View File

@ -0,0 +1,119 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
save();
}
});
function save() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/bookSetting/save",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
bookId: {
required: true
}, sort: {
required: true
}, type: {
required: true
}, },
messages: {
bookId: {
required: icon + "请选择小说ID"
}, sort: {
required: icon + "请选择排序号"
}, type: {
required: icon + "请选择推荐类型"
}, }
})
}

View File

@ -0,0 +1,191 @@
var prefix = "/novel/bookSetting"
$(function () {
load();
});
function load() {
$('#exampleTable')
.bootstrapTable(
{
method: 'get', // 服务器数据的请求方式 get or post
url: prefix + "/list", // 服务器数据的加载地址
// showRefresh : true,
// showToggle : true,
// showColumns : true,
iconSize: 'outline',
toolbar: '#exampleToolbar',
striped: true, // 设置为true会有隔行变色效果
dataType: "json", // 服务器返回的数据类型
pagination: true, // 设置为true会在底部显示分页条
// queryParamsType : "limit",
// //设置为limit则会发送符合RESTFull格式的参数
singleSelect: false, // 设置为true将禁止多选
// contentType : "application/x-www-form-urlencoded",
// //发送到服务器的数据编码类型
pageSize: 10, // 如果设置了分页,每页数据条数
pageNumber: 1, // 如果设置了分布,首页页码
//search : true, // 是否显示搜索框
showColumns: false, // 是否显示内容下拉框(选择显示的列)
sidePagination: "server", // 设置在哪里进行分页,可选值为"client" 或者 "server"
queryParams: function (params) {
//说明传入后台的参数包括offset开始索引limit步长sort排序列orderdesc或者,以及所有列的键值对
var queryParams = getFormJson("searchForm");
queryParams.limit = params.limit;
queryParams.offset = params.offset;
return queryParams;
},
// //请求服务器数据时,你可以通过重写参数的方式添加一些额外的参数,例如 toolbar 中的参数 如果
// queryParamsType = 'limit' ,返回参数必须包含
// limit, offset, search, sort, order 否则, 需要包含:
// pageSize, pageNumber, searchText, sortName,
// sortOrder.
// 返回false将会终止请求
responseHandler: function (rs) {
if (rs.code == 0) {
return rs.data;
} else {
parent.layer.alert(rs.msg)
return {total: 0, rows: []};
}
},
columns: [
{
title: '序号',
formatter: function () {
return arguments[2] + 1;
}
},
{
field: 'bookId',
title: '小说ID'
},
{
field: 'bookName',
title: '小说名'
},
{
field: 'type',
title: '推荐类型',
formatter: function (value, row, index) {
return formatDict("book_rec_type", value);
}
},
{
field: 'sort',
title: '排序号'
},
{
title: '操作',
field: 'id',
align: 'center',
formatter: function (value, row, index) {
var d = '<a class="btn btn-primary btn-sm ' + s_detail_h + '" href="#" mce_href="#" title="详情" onclick="detail(\''
+ row.id
+ '\')"><i class="fa fa-file"></i></a> ';
var e = '<a class="btn btn-primary btn-sm ' + s_edit_h + '" href="#" mce_href="#" title="编辑" onclick="edit(\''
+ row.id
+ '\')"><i class="fa fa-edit"></i></a> ';
return d + e;
}
}]
});
}
function reLoad() {
$('#exampleTable').bootstrapTable('refresh');
}
function add() {
layer.open({
type: 2,
title: '增加',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/add' // iframe的url
});
}
function detail(id) {
layer.open({
type: 2,
title: '详情',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/detail/' + id // iframe的url
});
}
function edit(id) {
layer.open({
type: 2,
title: '编辑',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/edit/' + id // iframe的url
});
}
function remove(id) {
layer.confirm('确定要删除选中的记录?', {
btn: ['确定', '取消']
}, function () {
$.ajax({
url: prefix + "/remove",
type: "post",
data: {
'id': id
},
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
})
}
function resetPwd(id) {
}
function batchRemove() {
var rows = $('#exampleTable').bootstrapTable('getSelections'); // 返回所有选择的行,当没有选择的记录时,返回一个空数组
if (rows.length == 0) {
layer.msg("请选择要删除的数据");
return;
}
layer.confirm("确认要删除选中的'" + rows.length + "'条数据吗?", {
btn: ['确定', '取消']
// 按钮
}, function () {
var ids = new Array();
// 遍历所有选择的行数据取每条数据对应的ID
$.each(rows, function (i, row) {
ids[i] = row['id'];
});
$.ajax({
type: 'POST',
data: {
"ids": ids
},
url: prefix + '/batchRemove',
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
}, function () {
});
}

View File

@ -0,0 +1,121 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
editor.txt.html($("#" + relName).val());
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
update();
}
});
function update() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/bookSetting/update",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
bookId:
{
required: true
}, sort:
{
required: true
}, type:
{
required: true
}, },
messages: {
bookId:
{
required: icon + "请选择小说ID"
}, sort:
{
required: icon + "请选择排序号"
}, type:
{
required: icon + "请选择推荐类型"
}, }
})
}

View File

@ -0,0 +1,107 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
save();
}
});
function save() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/friendLink/save",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
},
messages: {
}
})
}

View File

@ -0,0 +1,103 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
editor.txt.html($("#" + relName).val());
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
update();
}
});
function update() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/friendLink/update",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
},
messages: {
}
})
}

View File

@ -0,0 +1,205 @@
var prefix = "/novel/friendLink"
$(function () {
load();
});
function load() {
$('#exampleTable')
.bootstrapTable(
{
method: 'get', // 服务器数据的请求方式 get or post
url: prefix + "/list", // 服务器数据的加载地址
// showRefresh : true,
// showToggle : true,
// showColumns : true,
iconSize: 'outline',
toolbar: '#exampleToolbar',
striped: true, // 设置为true会有隔行变色效果
dataType: "json", // 服务器返回的数据类型
pagination: true, // 设置为true会在底部显示分页条
// queryParamsType : "limit",
// //设置为limit则会发送符合RESTFull格式的参数
singleSelect: false, // 设置为true将禁止多选
// contentType : "application/x-www-form-urlencoded",
// //发送到服务器的数据编码类型
pageSize: 10, // 如果设置了分页,每页数据条数
pageNumber: 1, // 如果设置了分布,首页页码
//search : true, // 是否显示搜索框
showColumns: false, // 是否显示内容下拉框(选择显示的列)
sidePagination: "server", // 设置在哪里进行分页,可选值为"client" 或者 "server"
queryParams: function (params) {
//说明传入后台的参数包括offset开始索引limit步长sort排序列orderdesc或者,以及所有列的键值对
var queryParams = getFormJson("searchForm");
queryParams.limit = params.limit;
queryParams.offset = params.offset;
return queryParams;
},
// //请求服务器数据时,你可以通过重写参数的方式添加一些额外的参数,例如 toolbar 中的参数 如果
// queryParamsType = 'limit' ,返回参数必须包含
// limit, offset, search, sort, order 否则, 需要包含:
// pageSize, pageNumber, searchText, sortName,
// sortOrder.
// 返回false将会终止请求
responseHandler: function (rs) {
if (rs.code == 0) {
return rs.data;
} else {
parent.layer.alert(rs.msg)
return {total: 0, rows: []};
}
},
columns: [
{
checkbox: true
},
{
title: '序号',
formatter: function () {
return arguments[2] + 1;
}
},
{
field: 'linkName',
title: '链接名'
},
{
field: 'linkUrl',
title: '链接url'
},
{
field: 'sort',
title: '排序号'
},
{
field: 'isOpen',
title: '是否开启',
formatter: function (value, row, index) {
return formatDict("yes_no", value);
}
},
{
title: '操作',
field: 'id',
align: 'center',
formatter: function (value, row, index) {
var d = '<a class="btn btn-primary btn-sm ' + s_detail_h + '" href="#" mce_href="#" title="详情" onclick="detail(\''
+ row.id
+ '\')"><i class="fa fa-file"></i></a> ';
var e = '<a class="btn btn-primary btn-sm ' + s_edit_h + '" href="#" mce_href="#" title="编辑" onclick="edit(\''
+ row.id
+ '\')"><i class="fa fa-edit"></i></a> ';
var r = '<a class="btn btn-warning btn-sm ' + s_remove_h + '" href="#" title="删除" mce_href="#" onclick="remove(\''
+ row.id
+ '\')"><i class="fa fa-remove"></i></a> ';
return d + e + r;
}
}]
});
}
function reLoad() {
$('#exampleTable').bootstrapTable('refresh');
}
function add() {
layer.open({
type: 2,
title: '增加',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/add' // iframe的url
});
}
function detail(id) {
layer.open({
type: 2,
title: '详情',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/detail/' + id // iframe的url
});
}
function edit(id) {
layer.open({
type: 2,
title: '编辑',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/edit/' + id // iframe的url
});
}
function remove(id) {
layer.confirm('确定要删除选中的记录?', {
btn: ['确定', '取消']
}, function () {
$.ajax({
url: prefix + "/remove",
type: "post",
data: {
'id': id
},
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
})
}
function resetPwd(id) {
}
function batchRemove() {
var rows = $('#exampleTable').bootstrapTable('getSelections'); // 返回所有选择的行,当没有选择的记录时,返回一个空数组
if (rows.length == 0) {
layer.msg("请选择要删除的数据");
return;
}
layer.confirm("确认要删除选中的'" + rows.length + "'条数据吗?", {
btn: ['确定', '取消']
// 按钮
}, function () {
var ids = new Array();
// 遍历所有选择的行数据取每条数据对应的ID
$.each(rows, function (i, row) {
ids[i] = row['id'];
});
$.ajax({
type: 'POST',
data: {
"ids": ids
},
url: prefix + '/batchRemove',
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
}, function () {
});
}

View File

@ -50,91 +50,56 @@ function load() {
}
},
columns: [
{
checkbox: true
},
{
title: '序号',
formatter: function () {
return arguments[2] + 1;
}
},
{
field: 'id',
title: '主键'
},
{
field: 'outTradeNo',
title: '保留'
},
{
field: 'tradeNo',
title: '订单号'
},
{
field: 'payChannel',
title: '保留'
},
{
field: 'totalAmount',
title: '交易香蕉币'
title: '充值金额',
formatter: function (value, row, index) {
return '¥' + value;
}
},
{
field: 'userId',
title: '支付用户ID'
field: 'userName',
title: '充值用户'
},
{
field: 'payStatus',
title: '支付状态0支付失败1支付成功2待支付'
title: '状态',
formatter: function (value, row, index) {
return value === 0 ? '充值失败' : value === 1 ? '充值成功' : value === 2 ? '待支付' : '其它';
}
},
{
field: 'createTime',
title: '创建时间'
},
{
field: 'updateTime',
title: '更新时间'
},
{
title: '操作',
field: 'id',
align: 'center',
formatter: function (value, row, index) {
var d = '<a class="btn btn-primary btn-sm ' + s_detail_h + '" href="#" mce_href="#" title="详情" onclick="detail(\''
+ row.id
+ '\')"><i class="fa fa-file"></i></a> ';
var e = '<a class="btn btn-primary btn-sm ' + s_edit_h + '" href="#" mce_href="#" title="编辑" onclick="edit(\''
+ row.id
+ '\')"><i class="fa fa-edit"></i></a> ';
var r = '<a class="btn btn-warning btn-sm ' + s_remove_h + '" href="#" title="删除" mce_href="#" onclick="remove(\''
+ row.id
+ '\')"><i class="fa fa-remove"></i></a> ';
return d + e + r;
}
}]
]
});
}
function reLoad() {
$('#exampleTable').bootstrapTable('refresh');
}
function add() {
layer.open({
type: 2,
@ -145,6 +110,7 @@ function add() {
content: prefix + '/add' // iframe的url
});
}
function detail(id) {
layer.open({
type: 2,
@ -155,6 +121,7 @@ function detail(id) {
content: prefix + '/detail/' + id // iframe的url
});
}
function edit(id) {
layer.open({
type: 2,
@ -165,6 +132,7 @@ function edit(id) {
content: prefix + '/edit/' + id // iframe的url
});
}
function remove(id) {
layer.confirm('确定要删除选中的记录', {
btn: ['确定', '取消']
@ -189,6 +157,7 @@ function remove(id) {
function resetPwd(id) {
}
function batchRemove() {
var rows = $('#exampleTable').bootstrapTable('getSelections'); // 返回所有选择的行,当没有选择的记录时,返回一个空数组
if (rows.length == 0) {

View File

@ -50,97 +50,53 @@ function load() {
}
},
columns: [
{
checkbox: true
},
{
title: '序号',
formatter: function () {
return arguments[2] + 1;
}
},
{
field: 'id',
title: '主键'
},
{
field: 'username',
title: '登录名'
title: '手机号'
},
{
field: 'password',
title: '登录密码'
},
{
field: 'nickName',
title: '昵称'
},
{
field: 'userPhoto',
title: '用户头像'
},
{
field: 'userSex',
title: '用户性别01'
title: '用户性别',
formatter: function (value, row, index) {
return value === 0 ? '男' : value === 1 ? '女' : '未知';
}
},
{
field: 'accountBalance',
title: '账户余额'
},
{
field: 'status',
title: '用户状态0正常'
title: '账户余额',
formatter: function (value, row, index) {
return "¥" + value / 100;
}
},
{
field: 'createTime',
title: '创建时间'
},
{
field: 'updateTime',
title: '更新时间'
},
{
title: '操作',
field: 'id',
align: 'center',
formatter: function (value, row, index) {
var d = '<a class="btn btn-primary btn-sm ' + s_detail_h + '" href="#" mce_href="#" title="详情" onclick="detail(\''
+ row.id
+ '\')"><i class="fa fa-file"></i></a> ';
var e = '<a class="btn btn-primary btn-sm ' + s_edit_h + '" href="#" mce_href="#" title="编辑" onclick="edit(\''
+ row.id
+ '\')"><i class="fa fa-edit"></i></a> ';
var r = '<a class="btn btn-warning btn-sm ' + s_remove_h + '" href="#" title="删除" mce_href="#" onclick="remove(\''
+ row.id
+ '\')"><i class="fa fa-remove"></i></a> ';
return d + e + r;
title: '注册时间'
}
}]
]
});
}
function reLoad() {
$('#exampleTable').bootstrapTable('refresh');
}
function add() {
layer.open({
type: 2,
@ -151,6 +107,7 @@ function add() {
content: prefix + '/add' // iframe的url
});
}
function detail(id) {
layer.open({
type: 2,
@ -161,6 +118,7 @@ function detail(id) {
content: prefix + '/detail/' + id // iframe的url
});
}
function edit(id) {
layer.open({
type: 2,
@ -171,6 +129,7 @@ function edit(id) {
content: prefix + '/edit/' + id // iframe的url
});
}
function remove(id) {
layer.confirm('确定要删除选中的记录', {
btn: ['确定', '取消']
@ -195,6 +154,7 @@ function remove(id) {
function resetPwd(id) {
}
function batchRemove() {
var rows = $('#exampleTable').bootstrapTable('getSelections'); // 返回所有选择的行,当没有选择的记录时,返回一个空数组
if (rows.length == 0) {

View File

@ -0,0 +1,107 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
save();
}
});
function save() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/userFeedback/save",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
},
messages: {
}
})
}

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