Compare commits
1 Commits
v5.1.5
...
release_v2
Author | SHA1 | Date | |
---|---|---|---|
f6a3510c1a |
79
.github/workflows/release.yml
vendored
@ -1,79 +0,0 @@
|
|||||||
name: Create novel-plus Maven Release with ZIPs
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
# 匹配所有以'v'开头的标签
|
|
||||||
tags:
|
|
||||||
- 'v*'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-and-release:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Set up JDK 21
|
|
||||||
uses: actions/setup-java@v3
|
|
||||||
with:
|
|
||||||
java-version: '21'
|
|
||||||
# 可选,默认是 temurin,也可以选择其他发行版
|
|
||||||
distribution: 'temurin'
|
|
||||||
|
|
||||||
- name: Build project with Maven
|
|
||||||
run: mvn clean install -DskipTests=true -Pcentral-repo
|
|
||||||
|
|
||||||
- name: Create Release
|
|
||||||
id: create_release
|
|
||||||
uses: actions/create-release@v1
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
with:
|
|
||||||
# 使用 tag_name 而不是 github.ref
|
|
||||||
tag_name: ${{ github.ref_name }}
|
|
||||||
release_name: novel-plus ${{ github.ref_name }}
|
|
||||||
draft: false
|
|
||||||
prerelease: false
|
|
||||||
|
|
||||||
|
|
||||||
# 使用 action 来替代直接 curl 进行上传
|
|
||||||
- name: Upload sql.zip
|
|
||||||
uses: actions/upload-release-asset@v1
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
with:
|
|
||||||
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
|
||||||
asset_path: ${{ github.workspace }}/novel-common/target/build/sql.zip
|
|
||||||
asset_name: sql.zip
|
|
||||||
asset_content_type: application/zip
|
|
||||||
|
|
||||||
- name: Upload novel-crawl.zip
|
|
||||||
uses: actions/upload-release-asset@v1
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
with:
|
|
||||||
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
|
||||||
asset_path: ${{ github.workspace }}/novel-crawl/target/build/novel-crawl.zip
|
|
||||||
asset_name: novel-crawl.zip
|
|
||||||
asset_content_type: application/zip
|
|
||||||
|
|
||||||
- name: Upload novel-front.zip
|
|
||||||
uses: actions/upload-release-asset@v1
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
with:
|
|
||||||
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
|
||||||
asset_path: ${{ github.workspace }}/novel-front/target/build/novel-front.zip
|
|
||||||
asset_name: novel-front.zip
|
|
||||||
asset_content_type: application/zip
|
|
||||||
|
|
||||||
- name: Upload novel-admin.zip
|
|
||||||
uses: actions/upload-release-asset@v1
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
with:
|
|
||||||
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
|
||||||
asset_path: ${{ github.workspace }}/novel-admin/target/build/novel-admin.zip
|
|
||||||
asset_name: novel-admin.zip
|
|
||||||
asset_content_type: application/zip
|
|
25
.gitignore
vendored
@ -1,7 +1,18 @@
|
|||||||
**/logs
|
/.idea
|
||||||
**/.idea
|
/cachedata
|
||||||
**/cachedata
|
/logs
|
||||||
**/target
|
/novel-common/target
|
||||||
**/*.iml
|
/novel-front/target
|
||||||
**/.DS_Store
|
/novel-front/*.iml
|
||||||
|
/novel-common/*.iml
|
||||||
|
/novel-mobile/target
|
||||||
|
/novel-mobile/*.iml
|
||||||
|
/novel-front/novel-front.iml
|
||||||
|
/novel-crawl/novel-crawl.iml
|
||||||
|
/novel-crawl/target
|
||||||
|
/novel-admin/target
|
||||||
|
/*.iml
|
||||||
|
/novel-admin/*.iml
|
||||||
|
.DS_Store
|
||||||
|
/novel-admin/cachedata
|
||||||
|
/novel-admin/logs
|
||||||
|
262
README.md
@ -1,134 +1,206 @@
|
|||||||
<p align="center">
|
[]( https://cloud.tencent.com/act/cps/redirect?redirect=1052&cps_key=736e609d66e0ac4e57813316cec6fd0b&from=console )
|
||||||
<a href="https://cloud.tencent.com/act/cps/redirect?redirect=2446&cps_key=736e609d66e0ac4e57813316cec6fd0b&from=console"><img src="https://youdoc.github.io/img/tencent.jpg" alt="AD" ></a>
|
|
||||||
</p>
|
|
||||||
<p align="center">
|
|
||||||
<a href='https://github.com/201206030/novel-plus'><img alt="Github stars" src="https://img.shields.io/github/stars/201206030/novel-plus?logo=github"></a>
|
|
||||||
<a href='https://github.com/201206030/novel-plus'><img alt="Github forks" src="https://img.shields.io/github/forks/201206030/novel-plus?logo=github"></a>
|
|
||||||
<a href='https://gitee.com/novel_dev_team/novel-plus'><img alt="Gitee stars" src="https://gitee.com/novel_dev_team/novel-plus/badge/star.svg?theme=gitee"></a>
|
|
||||||
<a href='https://gitee.com/novel_dev_team/novel-plus'><img alt="Gitee forks" src="https://gitee.com/novel_dev_team/novel-plus/badge/fork.svg?theme=gitee"></a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
# 小说精品屋-plus
|
||||||
👉 <a href='https://novel.xxyopen.com'>官网</a> | 👉 <a href='http://117.72.165.13:8888'>演示站点</a> | 👉 <a href='https://docs.xxyopen.com/course/novelplus/1.html'>安装教程</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
## 项目介绍
|
#### 新项目:小说精品屋-微服务版
|
||||||
|
|
||||||
novel-plus 是一个多端(PC、WAP)阅读,功能完善的原创文学 CMS
|
基于小说精品屋-plus构建的Spring Cloud 微服务小说门户平台。
|
||||||
系统。由前台门户系统、作家后台管理系统、平台后台管理系统和爬虫管理系统等多个子系统构成,包括小说推荐、作品检索、小说排行、小说阅读、小说评论、会员中心、作家专区等功能,支持自定义多模版、可拓展的多种小说内容存储方式(内置数据库分表存储和
|
|
||||||
TXT 文本存储)、阅读主题切换、多爬虫源自动采集和更新数据、AI写作、会员充值、订阅模式、新闻发布和实时统计报表。
|
|
||||||
|
|
||||||
## 项目地址
|
Gitee仓库地址: https://gitee.com/xiongxyang/novel-cloud
|
||||||
|
|
||||||
- 学习版:[GitHub](https://github.com/201206030/novel) | [码云](https://gitee.com/novel_dev_team/novel)
|
GitHub仓库地址: https://github.com/201206030/novel-cloud
|
||||||
| [保姆级教程](https://docs.xxyopen.com)
|
|
||||||
- **应用版**:[GitHub](https://github.com/201206030/novel-plus) | [码云](https://gitee.com/novel_dev_team/novel-plus) | [演示站点](http://117.72.165.13:8888)
|
|
||||||
- 微服务版:[GitHub](https://github.com/201206030/novel-cloud) | [码云](https://gitee.com/novel_dev_team/novel-cloud)
|
|
||||||
|
|
||||||
## 项目结构
|
#### 演示地址
|
||||||
|
|
||||||
|
[点击前往](http://www.java2nb.com)(前台门户)
|
||||||
|
|
||||||
|
#### 前言
|
||||||
|
|
||||||
|
小说精品屋-plus致力于打造一个完整的商用小说门户平台,使用前建议先阅读此文档。
|
||||||
|
|
||||||
|
#### 项目介绍
|
||||||
|
|
||||||
|
[小说精品屋](https://github.com/201206030/fiction_house)是一个多平台(web、安卓app、微信小程序)、功能完善的小说弹幕网站,包含精品小说专区、轻小说专区和漫画专区。包括小说/漫画分类、小说/漫画搜索、小说/漫画排行、完本小说/漫画、小说/漫画评分、小说/漫画在线阅读、小说/漫画书架、小说/漫画阅读记录、小说下载、小说弹幕、小说/漫画自动爬取、小说内容自动分享到微博、邮件自动推广、链接自动推送到百度搜索引擎等功能。包含电脑端、移动端、微信小程序等多个平台,现已开源web端、安卓端、小程序端源码。
|
||||||
|
|
||||||
|
小说精品屋-plus是在小说精品屋的基础上,重新进行了数据库设计、代码重构和功能增强,提升了程序整体的可读性和性能,增加了很多商用特性。主要升级如下:
|
||||||
|
|
||||||
|
- [x] 数据库重新设计,结构调整。
|
||||||
|
- [x] 服务端代码重构,MyBatis3升级为MyBatis3DynamicSql。
|
||||||
|
- [x] 移动站与PC站站点分离,浏览器自动识别跳转。
|
||||||
|
- [x] PC站UI更新。
|
||||||
|
- [x] 新闻模块。
|
||||||
|
- [x] 排行榜。
|
||||||
|
- [x] 小说评论模块。
|
||||||
|
- [x] 阅读主题模块。
|
||||||
|
- [x] 作家专区。
|
||||||
|
- [x] 充值。
|
||||||
|
- [x] 后台管理系统。
|
||||||
|
- [x] 爬虫管理系统。
|
||||||
|
|
||||||
|
#### 项目结构
|
||||||
|
|
||||||
```
|
```
|
||||||
novel-plus -- 父工程
|
novel-plus -- 父工程
|
||||||
├── novel-common -- 通用模块
|
├── novel-common -- 通用模块
|
||||||
├── novel-front -- 前台门户&作家后台
|
├── novel-front -- 前台门户系统
|
||||||
├── novel-crawl -- 爬虫
|
├── novel-crawl -- 爬虫管理系统
|
||||||
├── novel-admin -- 管理后台
|
└── novel-admin -- 后台管理系统
|
||||||
└── templates -- 前端模版
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 技术选型
|
#### 技术选型
|
||||||
|
|
||||||
| 技术 | 说明
|
| 技术 | 说明
|
||||||
|---------------------|---------------------
|
| -------------------- | ---------------------------
|
||||||
| Spring Boot | Spring 应用快速开发脚手架
|
| SpringBoot | Spring应用快速开发脚手架
|
||||||
| Spring AI | Spring 官方 AI 框架
|
| MyBatis | 持久层ORM框架
|
||||||
| MyBatis | 持久层 ORM 框架
|
| MyBatis Dynamic SQL | Mybatis动态sql
|
||||||
| MyBatis Dynamic SQL | Mybatis 动态 sql
|
| PageHelper | MyBatis分页插件
|
||||||
| PageHelper | MyBatis 分页插件
|
| MyBatisGenerator | 持久层代码生成插件
|
||||||
| MyBatis Generator | 持久层代码生成插件
|
| Sharding-Jdbc | 代码层分库分表中间件
|
||||||
| Sharding-JDBC | 代码层分库分表中间件
|
| JJWT | JWT登录支持
|
||||||
| JJWT | JWT 登录支持
|
| SpringSecurity | 安全框架
|
||||||
| Spring Security | 安全框架
|
| Shiro | 安全框架
|
||||||
| Apache Shiro | 安全框架
|
| Ehcache | Java进程内缓存框架(默认缓存)
|
||||||
| Redis | 缓存方案
|
| Redis | 分布式缓存(缓存替换方案,默认关闭,一行配置开启)
|
||||||
| Aliyun OSS | 阿里云对象存储服务(图片存储备选方案)
|
| ElasticSearch | 搜索引擎(搜索增强方案,默认关闭,一行配置开启)
|
||||||
| Lombok | 简化对象封装工具
|
| RabbitMq | 消息队列(流量削峰,默认关闭,一行配置开启)
|
||||||
| Docker | 应用容器引擎
|
| OSS | 阿里云对象存储服务(图片存储方式之一,一行配置即可切换)
|
||||||
| MySQL | 数据库服务
|
| FastDfs |开源轻量级分布式文件系统(图片存储方式之一,一行配置即可切换)
|
||||||
| Thymeleaf | 模板引擎
|
| Redisson | 实现分布式锁
|
||||||
| Layui | 前端 UI 框架
|
| Lombok | 简化对象封装工具
|
||||||
|
| Docker | 应用容器引擎
|
||||||
|
| Mysql | 数据库服务
|
||||||
|
| Thymeleaf | 模板引擎
|
||||||
|
| Layui | 前端UI
|
||||||
|
|
||||||
|
|
||||||
## 项目截图
|
#### PC站截图
|
||||||
|
|
||||||
### 绿色主题模版
|
1. 首页
|
||||||
|
|
||||||
[](https://www.xxyopen.com/images/green_novel.png)
|

|
||||||
[](https://www.xxyopen.com/images/resource/os/novel-plus/green3.png)
|
|
||||||
[](https://www.xxyopen.com/images/resource/os/novel-plus/green2.png)
|
|
||||||
|
|
||||||
## 演示视频
|
2. 分类索引页
|
||||||
|
|
||||||
https://www.bilibili.com/video/BV18e41197xs
|

|
||||||
|
|
||||||
## AI 功能
|
3. 搜索页
|
||||||
|
|
||||||
novel-plus 5.x 已集成 Spring 官方最新发布的 Spring AI 框架,并推出多项 AI 功能:
|

|
||||||
|
|
||||||
1. v5.0.0 版本在小说章节发布页面的文本编辑器中集成了多项智能编辑功能,包括 AI 扩写、缩写、续写及文本润色等。这些功能的设计灵感来源于百家号文章编辑器中的 AI 助手。
|

|
||||||
2. v5.1.0 版本在小说发布页面,新增 AI 生成封面图功能。若作家未上传自定义封面图,系统将根据小说信息自动生成封面图。
|
|
||||||
|
|
||||||
目前,AI 功能仍处于实验阶段,仅实现了基础的核心功能。我们非常重视用户的实际使用体验和反馈,未来将根据用户需求和使用情况,持续优化和调整该功能。如果用户反馈积极,我们计划进一步开发更高级的
|
4. 排行榜
|
||||||
AI 功能,例如自动生成有声小说、智能情节推荐等,以全面提升 novel-plus 的创作能力和用户体验。
|
|
||||||
|
|
||||||
我们将持续关注 AI 技术的发展,并致力于将其与小说创作场景深度融合,为用户带来更智能、更便捷的创作工具。
|

|
||||||
|
|
||||||
由于 DeepSeek 官方 API 目前不可用,novel-plus 项目默认使用的是第三方[硅基流动](https://cloud.siliconflow.cn/i/DOgMRH9S)
|
5. 详情页
|
||||||
提供的 API,采用的 AI 模型有对话模型`deepseek-ai/DeepSeek-R1-Distill-Llama-8B`(DeepSeek-R1 的蒸馏版本,免费使用)和生图模型`Kwai-Kolors/Kolors`(快手 Kolors 团队开发的文本到图像生成模型,免费使用)。只需注册一个硅基流动账号,创建一个
|
|
||||||
API 密钥,并将其添加到 novel-plus 项目 novel-front 模块的 yaml 配置文件中,即可体验 novel-plus 项目的 AI 写作功能。
|
|
||||||
|
|
||||||
```yaml
|

|
||||||
spring:
|
|
||||||
ai:
|
|
||||||
openai:
|
|
||||||
image:
|
|
||||||
enabled: true
|
|
||||||
base-url: https://api.siliconflow.cn
|
|
||||||
api-key: sk-rrrupturhdofbiqzjutduuiceecpvfqlnvmgcyiaipbdikoi
|
|
||||||
options:
|
|
||||||
model: Kwai-Kolors/Kolors
|
|
||||||
response_format: URL
|
|
||||||
api-key: sk-rrrupturhdofbiqzjutduuiceecpvfqlnvmgcyiaipbdikoi
|
|
||||||
base-url: https://api.siliconflow.cn
|
|
||||||
chat:
|
|
||||||
options:
|
|
||||||
model: deepseek-ai/DeepSeek-R1-Distill-Llama-8B
|
|
||||||
```
|
|
||||||
|
|
||||||
> ⚠️ novel-plus 项目默认使用的都是免费 AI 模型,生成效果有限。如果对生成内容有更高的要求,建议选用付费的 AI 模型。
|
6. 阅读页
|
||||||
|
|
||||||
## 增值服务
|

|
||||||
|
|
||||||
👉 [了解详情](https://novel.xxyopen.com/service.htm)
|
7. 用户中心
|
||||||
|
|
||||||
## 微信公众号
|

|
||||||
|
|
||||||
发布最新更新动态、最新前端模版、最新爬虫规则、文档教程等。
|
8. 充值
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## 赞赏支持
|

|
||||||
|
|
||||||
开源项目不易,若此项目能得到你的青睐,那么你可以赞赏支持作者持续开发与维护。
|
9. 作家专区
|
||||||
|
|
||||||
- 服务器的费用也是一笔开销
|

|
||||||
- 编写更完备的文档教程
|
|
||||||
- 发布更多前端模版和爬虫规则
|
|
||||||
- 一杯咖啡
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## 免责声明
|
10. 购买
|
||||||
|
|
||||||
本项目提供的爬虫工具仅用于采集项目初期的测试数据,请勿用于商业盈利。 用户使用本系统从事任何违法违规的事情,一切后果由用户自行承担,作者不承担任何责任。
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
#### 手机站截图
|
||||||
|
|
||||||
|
1. 首页
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
2. 小说详情页
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
3. 目录页
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
4. 小说阅读页
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
#### 爬虫管理系统截图
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
#### 后台管理系统截图
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
#### 安装步骤
|
||||||
|
|
||||||
|
##### 数据库安装:
|
||||||
|
|
||||||
|
1. 安装MySQL软件。
|
||||||
|
2. 修改MySQL`max_allowed_packet `配置(建议100M)。
|
||||||
|
3. 新建数据库,设置编码为utf8mb4。
|
||||||
|
4. 执行sql/novel_plus.sql脚本文件。
|
||||||
|
|
||||||
|
##### 爬虫管理系统安装:
|
||||||
|
|
||||||
|
1. 修改novel-common模块下application-dev.yml文件中的数据库的配置。
|
||||||
|
2. 修改novel-crawl模块下application.yml文件中的管理员账号密码。
|
||||||
|
3. 启动程序,打开浏览器,默认8081端口访问。
|
||||||
|
4. 选择已有或新增爬虫源(支持自定义爬虫规则),点击`开启`按钮,开始爬取小说数据。
|
||||||
|
|
||||||
|
##### 前台小说门户安装:
|
||||||
|
|
||||||
|
1. 修改novel-common模块下application-dev.yml文件中的数据库的配置。
|
||||||
|
2. 启动程序,打开浏览器,默认8080端口访问。
|
||||||
|
|
||||||
|
**喜欢此项目的可以给我的GitHub和Gitee加个Star支持一下 。**
|
||||||
|
|
||||||
|
#### 其他安装教程
|
||||||
|
|
||||||
|
包安装教程:[点击前往](https://my.oschina.net/java2nb/blog/4272630)
|
||||||
|
|
||||||
|
宝塔安装教程(非官方):[点击前往](https://www.daniao.org/9166.html)
|
||||||
|
|
||||||
|
docker安装教程:[点击前往](https://my.oschina.net/java2nb/blog/4271989)
|
||||||
|
|
||||||
|
#### 代码仓库
|
||||||
|
|
||||||
|
Gitee仓库地址: https://gitee.com/xiongxyang/novel-plus
|
||||||
|
|
||||||
|
GitHub仓库地址: https://github.com/201206030/novel-plus
|
||||||
|
|
||||||
|
#### QQ交流群
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
#### 捐赠支持
|
||||||
|
|
||||||
|
开源项目不易,若此项目能得到你的青睐,可以捐赠支持作者持续开发与维护。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
#### 备注
|
||||||
|
|
||||||
|
精品小说屋所有相关项目均已在开源中国公开,感兴趣的可进入[开源中国](https://www.oschina.net/p/fiction_house)按关键字`精品小说屋`搜索。
|
||||||
|
|
||||||
|
[](https://www.aliyun.com/minisite/goods?userCode=uf4nasee )
|
||||||
|
BIN
assets/120060.jpg
Normal file
After Width: | Height: | Size: 81 KiB |
BIN
assets/1573592459699.png
Normal file
After Width: | Height: | Size: 411 KiB |
BIN
assets/1588548668698.gif
Normal file
After Width: | Height: | Size: 1.4 MiB |
BIN
assets/1588548784395.gif
Normal file
After Width: | Height: | Size: 1.2 MiB |
BIN
assets/1588548916980.gif
Normal file
After Width: | Height: | Size: 263 KiB |
BIN
assets/640x100.jpg
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
assets/IMG_1736.JPG
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
assets/IMG_1737.JPG
Normal file
After Width: | Height: | Size: 75 KiB |
BIN
assets/QQ20200520-215756.png
Normal file
After Width: | Height: | Size: 105 KiB |
BIN
assets/QQ图片20191018161330.jpg
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
assets/QQ图片20191018161901.png
Normal file
After Width: | Height: | Size: 63 KiB |
BIN
assets/QQ图片20191018162208.jpg
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
assets/QQ图片20191108022250.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
assets/android_index.png
Normal file
After Width: | Height: | Size: 461 KiB |
BIN
assets/baijiahao.jpg
Normal file
After Width: | Height: | Size: 111 KiB |
BIN
assets/chapter_manager.png
Normal file
After Width: | Height: | Size: 93 KiB |
BIN
assets/chapter_pub.png
Normal file
After Width: | Height: | Size: 91 KiB |
BIN
assets/charset_config.png
Normal file
After Width: | Height: | Size: 5.9 KiB |
BIN
assets/craw_config.png
Normal file
After Width: | Height: | Size: 7.5 KiB |
BIN
assets/crawl_config.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
assets/crawl_index.png
Normal file
After Width: | Height: | Size: 62 KiB |
BIN
assets/crawl_pic.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
assets/database_config.png
Normal file
After Width: | Height: | Size: 6.6 KiB |
BIN
assets/index_config.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
assets/jk.png
Normal file
After Width: | Height: | Size: 130 KiB |
BIN
assets/jk_ali.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
assets/jk_wc.png
Normal file
After Width: | Height: | Size: 82 KiB |
BIN
assets/login.png
Normal file
After Width: | Height: | Size: 61 KiB |
BIN
assets/manhua_content.png
Normal file
After Width: | Height: | Size: 310 KiB |
BIN
assets/mh_content.png
Normal file
After Width: | Height: | Size: 1.5 MiB |
BIN
assets/mh_index.png
Normal file
After Width: | Height: | Size: 223 KiB |
BIN
assets/mini-code.png
Normal file
After Width: | Height: | Size: 4.5 KiB |
BIN
assets/mini4.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
assets/novel_list.png
Normal file
After Width: | Height: | Size: 79 KiB |
BIN
assets/novel_pub.png
Normal file
After Width: | Height: | Size: 69 KiB |
BIN
assets/oschina_tp.png
Normal file
After Width: | Height: | Size: 46 KiB |
BIN
assets/pc_all.png
Normal file
After Width: | Height: | Size: 155 KiB |
BIN
assets/pc_catalog.png
Normal file
After Width: | Height: | Size: 1.2 MiB |
BIN
assets/pc_content1.png
Normal file
After Width: | Height: | Size: 360 KiB |
BIN
assets/pc_content2.png
Normal file
After Width: | Height: | Size: 357 KiB |
BIN
assets/pc_detail.png
Normal file
After Width: | Height: | Size: 307 KiB |
BIN
assets/pc_index.png
Normal file
After Width: | Height: | Size: 929 KiB |
BIN
assets/pc_rank.png
Normal file
After Width: | Height: | Size: 194 KiB |
BIN
assets/pic_save_type.png
Normal file
After Width: | Height: | Size: 7.2 KiB |
BIN
assets/qq_group.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
assets/score_config.png
Normal file
After Width: | Height: | Size: 4.3 KiB |
BIN
assets/springcloud.jpg
Normal file
After Width: | Height: | Size: 62 KiB |
BIN
assets/upload_config.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
assets/小说精品屋功能清单.bak
Normal file
BIN
assets/小说精品屋功能清单.twdx
Normal file
BIN
assets/小说精品屋开源项目交流群群二维码.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
assets/小说精品屋开源项目交流群群聊二维码.png
Normal file
After Width: | Height: | Size: 185 KiB |
BIN
assets/微信图片_20190904181558.png
Normal file
After Width: | Height: | Size: 85 KiB |
BIN
assets/热门云产品1040.100.jpg
Normal file
After Width: | Height: | Size: 77 KiB |
BIN
assets/精品小说楼.png
Normal file
After Width: | Height: | Size: 764 KiB |
BIN
assets/精品小说楼_轻小说专区.png
Normal file
After Width: | Height: | Size: 1.1 MiB |
@ -1,53 +0,0 @@
|
|||||||
mode:
|
|
||||||
# 单机模式
|
|
||||||
type: Standalone
|
|
||||||
# 元数据持久化
|
|
||||||
repository:
|
|
||||||
# 数据库持久化
|
|
||||||
type: JDBC
|
|
||||||
|
|
||||||
# 数据源配置
|
|
||||||
dataSources:
|
|
||||||
ds_1:
|
|
||||||
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
|
|
||||||
driverClassName: com.mysql.cj.jdbc.Driver
|
|
||||||
jdbcUrl: jdbc:mysql://localhost:3306/novel_plus?allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
|
|
||||||
username: root
|
|
||||||
password: test123456
|
|
||||||
ds_2:
|
|
||||||
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
|
|
||||||
driverClassName: com.mysql.cj.jdbc.Driver
|
|
||||||
url: jdbc:mysql://localhost:3306/information_schema?allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
|
|
||||||
username: root
|
|
||||||
password: test123456
|
|
||||||
# 规则配置
|
|
||||||
rules:
|
|
||||||
- !SINGLE
|
|
||||||
tables:
|
|
||||||
- "*.*"
|
|
||||||
- !SHARDING
|
|
||||||
tables: # 数据分片规则配置
|
|
||||||
book_content:
|
|
||||||
# 分库策略,缺省表示使用默认分库策略
|
|
||||||
actualDataNodes: ds_${1}.book_content${0..9}
|
|
||||||
# 分表策略
|
|
||||||
tableStrategy:
|
|
||||||
standard:
|
|
||||||
# 分片列名称
|
|
||||||
shardingColumn: index_id
|
|
||||||
# 分片算法名称
|
|
||||||
shardingAlgorithmName: bookContentSharding
|
|
||||||
|
|
||||||
shardingAlgorithms:
|
|
||||||
bookContentSharding:
|
|
||||||
# 行表达式分片算法,使用 Groovy 的表达式,提供对 SQL 语句中的 = 和 IN 的分片操作支持
|
|
||||||
type: INLINE
|
|
||||||
props:
|
|
||||||
# 分片算法的行表达式
|
|
||||||
algorithm-expression: book_content${index_id % 10}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
props:
|
|
||||||
# 是否在日志中打印 SQL
|
|
||||||
sql-show: true
|
|
@ -1,27 +0,0 @@
|
|||||||
CREATE TABLE `author_income_detail` (
|
|
||||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
|
||||||
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
|
|
||||||
`author_id` bigint(20) NOT NULL COMMENT '作家ID',
|
|
||||||
`book_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '作品ID,0表示全部作品',
|
|
||||||
`income_date` date NOT NULL COMMENT '收入日期',
|
|
||||||
`income_account` int(11) NOT NULL DEFAULT '0' COMMENT '订阅总额',
|
|
||||||
`income_count` int(11) NOT NULL DEFAULT '0' COMMENT '订阅次数',
|
|
||||||
`income_number` int(11) NOT NULL DEFAULT '0' COMMENT '订阅人数',
|
|
||||||
`create_time` datetime DEFAULT NULL,
|
|
||||||
PRIMARY KEY (`id`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='稿费收入明细统计表';
|
|
||||||
|
|
||||||
CREATE TABLE `author_income` (
|
|
||||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
|
||||||
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
|
|
||||||
`author_id` bigint(20) NOT NULL COMMENT '作家ID',
|
|
||||||
`book_id` bigint(20) NOT NULL COMMENT '作品ID',
|
|
||||||
`income_month` date NOT NULL COMMENT '收入月份',
|
|
||||||
`pre_tax_income` bigint(20) NOT NULL DEFAULT '0' COMMENT '税前收入(分)',
|
|
||||||
`after_tax_income` bigint(20) NOT NULL DEFAULT '0' COMMENT '税后收入(分)',
|
|
||||||
`pay_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '支付状态,0:待支付,1:已支付',
|
|
||||||
`confirm_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '稿费确认状态,0:待确认,1:已确认',
|
|
||||||
`detail` varchar(255) DEFAULT NULL COMMENT '详情',
|
|
||||||
`create_time` datetime DEFAULT NULL,
|
|
||||||
PRIMARY KEY (`id`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='稿费收入统计表';
|
|
@ -1 +0,0 @@
|
|||||||
alter table book add column `yesterday_buy` int(11) DEFAULT '0' COMMENT '昨日订阅数' after comment_count;
|
|
@ -1 +0,0 @@
|
|||||||
alter table book_index add column `book_price` int(3) DEFAULT 0 COMMENT '章节费用(屋币)' after `is_vip`;
|
|
@ -1,32 +0,0 @@
|
|||||||
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES (246, 241, '批量删除', NULL, 'novel:news:batchRemove', 2, NULL, 6, NULL, NULL);
|
|
||||||
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES (245, 241, '删除', NULL, 'novel:news:remove', 2, NULL, 6, NULL, NULL);
|
|
||||||
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES (244, 241, '修改', NULL, 'novel:news:edit', 2, NULL, 6, NULL, NULL);
|
|
||||||
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES (243, 241, '新增', NULL, 'novel:news:add', 2, NULL, 6, NULL, NULL);
|
|
||||||
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES (242, 241, '查看', NULL, 'novel:news:detail', 2, NULL, 6, NULL, NULL);
|
|
||||||
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES (241, 234, '新闻列表', 'novel/news', 'novel:news:news', 1, 'fa', 8, NULL, NULL);
|
|
||||||
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES (240, 235, '批量删除', NULL, 'novel:category:batchRemove', 2, NULL, 6, NULL, NULL);
|
|
||||||
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES (239, 235, '删除', NULL, 'novel:category:remove', 2, NULL, 6, NULL, NULL);
|
|
||||||
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES (238, 235, '修改', NULL, 'novel:category:edit', 2, NULL, 6, NULL, NULL);
|
|
||||||
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES (237, 235, '新增', NULL, 'novel:category:add', 2, NULL, 6, NULL, NULL);
|
|
||||||
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES (236, 235, '查看', NULL, 'novel:category:detail', 2, NULL, 6, NULL, NULL);
|
|
||||||
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES (235, 234, '类别管理', 'novel/category', 'novel:category:category', 1, 'fa', 6, NULL, NULL);
|
|
||||||
INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES (234, 0, '新闻管理', '', '', 0, 'fa fa-newspaper-o', 8, NULL, NULL);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
INSERT INTO `sys_role_menu`(`id`, `role_id`, `menu_id`) VALUES (4889, 1, 246);
|
|
||||||
INSERT INTO `sys_role_menu`(`id`, `role_id`, `menu_id`) VALUES (4890, 1, 245);
|
|
||||||
INSERT INTO `sys_role_menu`(`id`, `role_id`, `menu_id`) VALUES (4891, 1, 244);
|
|
||||||
INSERT INTO `sys_role_menu`(`id`, `role_id`, `menu_id`) VALUES (4892, 1, 243);
|
|
||||||
INSERT INTO `sys_role_menu`(`id`, `role_id`, `menu_id`) VALUES (4893, 1, 242);
|
|
||||||
INSERT INTO `sys_role_menu`(`id`, `role_id`, `menu_id`) VALUES (4899, 1, 241);
|
|
||||||
INSERT INTO `sys_role_menu`(`id`, `role_id`, `menu_id`) VALUES (4894, 1, 240);
|
|
||||||
INSERT INTO `sys_role_menu`(`id`, `role_id`, `menu_id`) VALUES (4895, 1, 239);
|
|
||||||
INSERT INTO `sys_role_menu`(`id`, `role_id`, `menu_id`) VALUES (4896, 1, 238);
|
|
||||||
INSERT INTO `sys_role_menu`(`id`, `role_id`, `menu_id`) VALUES (4897, 1, 237);
|
|
||||||
INSERT INTO `sys_role_menu`(`id`, `role_id`, `menu_id`) VALUES (4898, 1, 236);
|
|
||||||
INSERT INTO `sys_role_menu`(`id`, `role_id`, `menu_id`) VALUES (4900, 1, 235);
|
|
||||||
INSERT INTO `sys_role_menu`(`id`, `role_id`, `menu_id`) VALUES (4888, 1, 234);
|
|
||||||
|
|
||||||
|
|
||||||
delete from sys_menu where menu_id = 202;
|
|
@ -1 +0,0 @@
|
|||||||
alter table news add column `read_count` BIGINT NOT NULL DEFAULT '0' COMMENT '阅读量' after content;
|
|
@ -1,3 +0,0 @@
|
|||||||
alter table book_index add column storage_type varchar(10) NOT NULL DEFAULT 'db' COMMENT '存储方式' after book_price ;
|
|
||||||
|
|
||||||
|
|
@ -1,121 +0,0 @@
|
|||||||
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,原创文学系统,开源小说系统,免费小说建站程序',
|
|
||||||
'小说精品屋是一个多端(PC、WAP)阅读、功能完善的原创文学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);
|
|
@ -1,51 +0,0 @@
|
|||||||
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);
|
|
@ -1,4 +0,0 @@
|
|||||||
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);
|
|
@ -1,3 +0,0 @@
|
|||||||
update crawl_source
|
|
||||||
set crawl_rule = replace(crawl_rule, 'ibiquge.net', 'ibiquzw.org')
|
|
||||||
where id = 16;
|
|
@ -1,44 +0,0 @@
|
|||||||
INSERT INTO crawl_source (source_name, crawl_rule, source_status, create_time, update_time)
|
|
||||||
VALUES ('香书小说网', '{
|
|
||||||
"bookListUrl": "http://www.xbiqugu.la/fenlei/{catId}_{page}.html",
|
|
||||||
"catIdRule": {
|
|
||||||
"catId1": "1",
|
|
||||||
"catId2": "2",
|
|
||||||
"catId3": "3",
|
|
||||||
"catId4": "4",
|
|
||||||
"catId5": "6",
|
|
||||||
"catId6": "5"
|
|
||||||
},
|
|
||||||
"bookIdPatten": "<a\\\\s+href=\\"http://www.xbiqugu.la/(\\\\d+/\\\\d+)/\\"\\\\s+target=\\"_blank\\">",
|
|
||||||
"pagePatten": "<em\\\\s+id=\\"pagestats\\">(\\\\d+)/\\\\d+</em>",
|
|
||||||
"totalPagePatten": "<em\\\\s+id=\\"pagestats\\">\\\\d+/(\\\\d+)</em>",
|
|
||||||
"bookDetailUrl": "http://www.xbiqugu.la/{bookId}/",
|
|
||||||
"bookNamePatten": "<h1>([^/]+)</h1>",
|
|
||||||
"authorNamePatten": "者:([^/]+)</p>",
|
|
||||||
"picUrlPatten": "src=\\"(http://www.xbiqugu.la/files/article/image/\\\\d+/\\\\d+/\\\\d+s\\\\.jpg)\\"",
|
|
||||||
"bookStatusRule": {},
|
|
||||||
"descStart": "<div id=\\"intro\\">",
|
|
||||||
"descEnd": "</div>",
|
|
||||||
"upadateTimePatten": "<p>最后更新:(\\\\d+-\\\\d+-\\\\d+\\\\s\\\\d+:\\\\d+:\\\\d+)</p>",
|
|
||||||
"upadateTimeFormatPatten": "yyyy-MM-dd HH:mm:ss",
|
|
||||||
"bookIndexUrl": "http://www.xbiqugu.la/{bookId}/",
|
|
||||||
"indexIdPatten": "<a\\\\s+href=''/\\\\d+/\\\\d+/(\\\\d+)\\\\.html''\\\\s+>[^/]+</a>",
|
|
||||||
"indexNamePatten": "<a\\\\s+href=''/\\\\d+/\\\\d+/\\\\d+\\\\.html''\\\\s+>([^/]+)</a>",
|
|
||||||
"bookContentUrl": "http://www.xbiqugu.la/{bookId}/{indexId}.html",
|
|
||||||
"contentStart": "<div id=\\"content\\">",
|
|
||||||
"contentEnd": "<p>",
|
|
||||||
"filterContent":"<div\\\\s+id=\\"content_tip\\">\\\\s*<b>([^/]+)</b>\\\\s*</div>"
|
|
||||||
}', 0, '2024-06-01 10:11:39', '2024-06-01 10:11:39');
|
|
||||||
|
|
||||||
|
|
||||||
update crawl_source
|
|
||||||
set crawl_rule = replace(crawl_rule, 'ibiquzw.org', 'biquxs.info')
|
|
||||||
where id = 16;
|
|
||||||
|
|
||||||
delete
|
|
||||||
from sys_menu
|
|
||||||
where menu_id = 104;
|
|
||||||
|
|
||||||
delete
|
|
||||||
from sys_menu
|
|
||||||
where menu_id = 57;
|
|
@ -1,2 +0,0 @@
|
|||||||
FROM mysql:8.0
|
|
||||||
COPY novel_plus.sql /docker-entrypoint-initdb.d/init.sql
|
|
@ -1,3 +0,0 @@
|
|||||||
1. novel_plus.sql 为全量 sql 文件,yyyyMMdd.sql 为增量 sql 文件
|
|
||||||
2. 第一次安装只需要执行 novel_plus.sql 文件即可
|
|
||||||
3. 后续版本升级需要根据上次代码版本的时间,执行该日期之后的增量 sql 文件(简单来说就是 sql 文件夹中相较于上次多出来的 sql 文件)
|
|
6
novel-admin/Dockerfile
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
FROM java:8
|
||||||
|
ADD novel-admin-1.0.0.jar /root
|
||||||
|
ENV dburl=""
|
||||||
|
ENV username=""
|
||||||
|
ENV password=""
|
||||||
|
ENTRYPOINT ["sh","-c","java -Dspring.datasource.url=${dburl} -Dspring.datasource.username=${username} -Dspring.datasource.password=${password} -jar /root/novel-admin-1.0.0.jar"]
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
<groupId>com.java2nb</groupId>
|
<groupId>com.java2nb</groupId>
|
||||||
<artifactId>novel-admin</artifactId>
|
<artifactId>novel-admin</artifactId>
|
||||||
<version>5.1.5</version>
|
<version>1.0.0</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>novel-admin</name>
|
<name>novel-admin</name>
|
||||||
@ -14,14 +14,16 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-parent</artifactId>
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
<version>2.7.18</version>
|
<version>2.0.1.RELEASE</version>
|
||||||
<relativePath/>
|
<relativePath/>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<java.version>21</java.version>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
|
<java.version>1.8</java.version>
|
||||||
<velocity.version>1.7</velocity.version>
|
<velocity.version>1.7</velocity.version>
|
||||||
<shardingsphere-jdbc.version>5.5.1</shardingsphere-jdbc.version>
|
<activiti.version>5.22.0</activiti.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
@ -56,16 +58,16 @@
|
|||||||
<groupId>net.sourceforge.nekohtml</groupId>
|
<groupId>net.sourceforge.nekohtml</groupId>
|
||||||
<artifactId>nekohtml</artifactId>
|
<artifactId>nekohtml</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- 请求参数校验相关 -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.hibernate.validator</groupId>
|
|
||||||
<artifactId>hibernate-validator</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<!--mybatis -->
|
<!--mybatis -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>mysql</groupId>
|
<groupId>mysql</groupId>
|
||||||
<artifactId>mysql-connector-java</artifactId>
|
<artifactId>mysql-connector-java</artifactId>
|
||||||
<version>8.0.29</version>
|
<version>8.0.11</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mybatis</groupId>
|
||||||
|
<artifactId>mybatis</artifactId>
|
||||||
|
<version>3.4.4</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -73,7 +75,18 @@
|
|||||||
<artifactId>mybatis-spring-boot-starter</artifactId>
|
<artifactId>mybatis-spring-boot-starter</artifactId>
|
||||||
<version>1.1.1</version>
|
<version>1.1.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!--druid -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba</groupId>
|
||||||
|
<artifactId>druid</artifactId>
|
||||||
|
<version>1.0.28</version>
|
||||||
|
</dependency>
|
||||||
<!--commons -->
|
<!--commons -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-lang3</artifactId>
|
||||||
|
<version>3.6</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>commons-configuration</groupId>
|
<groupId>commons-configuration</groupId>
|
||||||
<artifactId>commons-configuration</artifactId>
|
<artifactId>commons-configuration</artifactId>
|
||||||
@ -82,18 +95,18 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>commons-io</groupId>
|
<groupId>commons-io</groupId>
|
||||||
<artifactId>commons-io</artifactId>
|
<artifactId>commons-io</artifactId>
|
||||||
<version>2.9.0</version>
|
<version>2.5</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!--shiro -->
|
<!--shiro -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.shiro</groupId>
|
<groupId>org.apache.shiro</groupId>
|
||||||
<artifactId>shiro-core</artifactId>
|
<artifactId>shiro-core</artifactId>
|
||||||
<version>1.11.0</version>
|
<version>1.3.2</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.shiro</groupId>
|
<groupId>org.apache.shiro</groupId>
|
||||||
<artifactId>shiro-spring</artifactId>
|
<artifactId>shiro-spring</artifactId>
|
||||||
<version>1.11.0</version>
|
<version>1.3.2</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- shiro ehcache -->
|
<!-- shiro ehcache -->
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -105,7 +118,7 @@
|
|||||||
<artifactId>ehcache-core</artifactId>
|
<artifactId>ehcache-core</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
<version>1.11.0</version>
|
<version>1.4.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.theborakompanioni</groupId>
|
<groupId>com.github.theborakompanioni</groupId>
|
||||||
@ -116,19 +129,13 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.alibaba</groupId>
|
<groupId>com.alibaba</groupId>
|
||||||
<artifactId>fastjson</artifactId>
|
<artifactId>fastjson</artifactId>
|
||||||
<version>1.2.83</version>
|
<version>1.2.31</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!--velocity代码生成使用模板 -->
|
<!--velocity代码生成使用模板 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.velocity</groupId>
|
<groupId>org.apache.velocity</groupId>
|
||||||
<artifactId>velocity</artifactId>
|
<artifactId>velocity</artifactId>
|
||||||
<version>1.7</version>
|
<version>1.7</version>
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<artifactId>commons-lang</artifactId>
|
|
||||||
<groupId>commons-lang</groupId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
<!--<dependency>-->
|
<!--<dependency>-->
|
||||||
<!--<groupId>org.springframework.boot</groupId>-->
|
<!--<groupId>org.springframework.boot</groupId>-->
|
||||||
@ -157,12 +164,6 @@
|
|||||||
<groupId>io.springfox</groupId>
|
<groupId>io.springfox</groupId>
|
||||||
<artifactId>springfox-swagger2</artifactId>
|
<artifactId>springfox-swagger2</artifactId>
|
||||||
<version>2.6.1</version>
|
<version>2.6.1</version>
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<artifactId>guava</artifactId>
|
|
||||||
<groupId>com.google.guava</groupId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.springfox</groupId>
|
<groupId>io.springfox</groupId>
|
||||||
@ -192,29 +193,16 @@
|
|||||||
<groupId>org.apache.commons</groupId>
|
<groupId>org.apache.commons</groupId>
|
||||||
<artifactId>commons-text</artifactId>
|
<artifactId>commons-text</artifactId>
|
||||||
<version>1.4</version>
|
<version>1.4</version>
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<artifactId>commons-lang3</artifactId>
|
|
||||||
<groupId>org.apache.commons</groupId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- ShardingSphere-JDBC -->
|
<!-- ehchache -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.shardingsphere</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>shardingsphere-jdbc</artifactId>
|
<artifactId>spring-boot-starter-cache</artifactId>
|
||||||
<version>${shardingsphere-jdbc.version}</version>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.yaml</groupId>
|
<groupId>net.sf.ehcache</groupId>
|
||||||
<artifactId>snakeyaml</artifactId>
|
<artifactId>ehcache</artifactId>
|
||||||
<version>2.2</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.h2database</groupId>
|
|
||||||
<artifactId>h2</artifactId>
|
|
||||||
<scope>runtime</scope>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!--war包部署需要-->
|
<!--war包部署需要-->
|
||||||
@ -236,131 +224,41 @@
|
|||||||
<!--<scope>provided</scope>-->
|
<!--<scope>provided</scope>-->
|
||||||
<!--</dependency>-->
|
<!--</dependency>-->
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<!-- <build>
|
|
||||||
<plugins>
|
|
||||||
<!–<plugin>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
|
||||||
<configuration>
|
|
||||||
<executable>true</executable>
|
|
||||||
</configuration>
|
|
||||||
</plugin>–>
|
|
||||||
<!–SpringBoot项目默认使用spring-boot-maven-plugin,要打成被其他项目引用的jar包,需要更换此插件–>
|
|
||||||
<!– <plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
|
||||||
<configuration>
|
|
||||||
<source>1.8</source>
|
|
||||||
<target>1.8</target>
|
|
||||||
<encoding>UTF-8</encoding>
|
|
||||||
</configuration>
|
|
||||||
</plugin>–>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>-->
|
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
|
<!--<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<executable>true</executable>
|
||||||
|
</configuration>
|
||||||
|
</plugin>-->
|
||||||
|
<!--SpringBoot项目默认使用spring-boot-maven-plugin,要打成被其他项目引用的jar包,需要更换此插件-->
|
||||||
|
<!-- <plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>1.8</source>
|
||||||
|
<target>1.8</target>
|
||||||
|
<encoding>UTF-8</encoding>
|
||||||
|
</configuration>
|
||||||
|
</plugin>-->
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
|
||||||
<artifactId>maven-antrun-plugin</artifactId>
|
|
||||||
<version>1.8</version>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<phase>package</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>run</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<tasks>
|
|
||||||
<!-- 文件夹 -->
|
|
||||||
<copy todir="${project.build.directory}/build/config" overwrite="true">
|
|
||||||
<fileset dir="${basedir}/src/main/build/config">
|
|
||||||
<include name="*.*"/>
|
|
||||||
</fileset>
|
|
||||||
</copy>
|
|
||||||
<copy file="${project.build.directory}/${project.artifactId}-${project.version}.jar"
|
|
||||||
tofile="${project.build.directory}/build/${project.artifactId}.jar"/>
|
|
||||||
|
|
||||||
<fixcrlf srcdir="${basedir}/src/main/build/scripts" eol="unix"/>
|
|
||||||
<copy todir="${project.build.directory}/build/bin">
|
|
||||||
<fileset dir="${basedir}/src/main/build/scripts">
|
|
||||||
<include name="*.sh"/>
|
|
||||||
<include name="*.txt"/>
|
|
||||||
<include name="*.bat"/>
|
|
||||||
</fileset>
|
|
||||||
</copy>
|
|
||||||
<zip destfile='${project.build.directory}/build/${project.artifactId}.zip'>
|
|
||||||
<zipfileset filemode="755" dir='${project.build.directory}/build/'/>
|
|
||||||
</zip>
|
|
||||||
|
|
||||||
<copy file="${basedir}/src/main/build/docker/Dockerfile"
|
|
||||||
tofile="${project.build.directory}/build/Dockerfile"/>
|
|
||||||
</tasks>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
<repositories>
|
<!--<distributionManagement>
|
||||||
<repository>
|
<repository>
|
||||||
<id>ali</id>
|
<id>nexus_release</id>
|
||||||
<url>https://maven.aliyun.com/repository/public</url>
|
<name>release</name>
|
||||||
<releases>
|
<url>http://47.106.243.172:8081/nexus/content/repositories/releases/</url>
|
||||||
<enabled>true</enabled>
|
|
||||||
</releases>
|
|
||||||
<snapshots>
|
|
||||||
<enabled>false</enabled>
|
|
||||||
</snapshots>
|
|
||||||
</repository>
|
</repository>
|
||||||
</repositories>
|
<snapshotRepository>
|
||||||
<pluginRepositories>
|
<id>nexus_snapshots</id>
|
||||||
<pluginRepository>
|
<name>snapshots</name>
|
||||||
<id>ali-plugin</id>
|
<url>http://47.106.243.172:8081/nexus/content/repositories/snapshots/</url>
|
||||||
<url>https://maven.aliyun.com/repository/public</url>
|
</snapshotRepository>
|
||||||
<releases>
|
</distributionManagement>-->
|
||||||
<enabled>true</enabled>
|
|
||||||
</releases>
|
|
||||||
<snapshots>
|
|
||||||
<enabled>false</enabled>
|
|
||||||
</snapshots>
|
|
||||||
</pluginRepository>
|
|
||||||
</pluginRepositories>
|
|
||||||
|
|
||||||
<profiles>
|
|
||||||
<profile>
|
|
||||||
<!-- 定义一个用于切换到中央仓库的profile -->
|
|
||||||
<id>central-repo</id>
|
|
||||||
<repositories>
|
|
||||||
<repository>
|
|
||||||
<id>central</id>
|
|
||||||
<url>https://repo.maven.apache.org/maven2/</url>
|
|
||||||
<releases>
|
|
||||||
<enabled>true</enabled>
|
|
||||||
</releases>
|
|
||||||
<snapshots>
|
|
||||||
<enabled>false</enabled>
|
|
||||||
</snapshots>
|
|
||||||
</repository>
|
|
||||||
</repositories>
|
|
||||||
<pluginRepositories>
|
|
||||||
<pluginRepository>
|
|
||||||
<id>central-plugin</id>
|
|
||||||
<url>https://repo.maven.apache.org/maven2/</url>
|
|
||||||
<releases>
|
|
||||||
<enabled>true</enabled>
|
|
||||||
</releases>
|
|
||||||
<snapshots>
|
|
||||||
<enabled>false</enabled>
|
|
||||||
</snapshots>
|
|
||||||
</pluginRepository>
|
|
||||||
</pluginRepositories>
|
|
||||||
</profile>
|
|
||||||
</profiles>
|
|
||||||
</project>
|
</project>
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
#端口号
|
|
||||||
server:
|
|
||||||
port: 8088
|
|
||||||
spring:
|
|
||||||
redis:
|
|
||||||
host: 127.0.0.1
|
|
||||||
port: 6379
|
|
||||||
password: test123456
|
|
||||||
|
|
@ -1,47 +0,0 @@
|
|||||||
mode:
|
|
||||||
# 单机模式
|
|
||||||
type: Standalone
|
|
||||||
# 元数据持久化
|
|
||||||
repository:
|
|
||||||
# 数据库持久化
|
|
||||||
type: JDBC
|
|
||||||
|
|
||||||
# 数据源配置
|
|
||||||
dataSources:
|
|
||||||
ds_1:
|
|
||||||
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
|
|
||||||
driverClassName: com.mysql.cj.jdbc.Driver
|
|
||||||
jdbcUrl: jdbc:mysql://localhost:3306/novel_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
|
|
||||||
username: root
|
|
||||||
password: test123456
|
|
||||||
# 规则配置
|
|
||||||
rules:
|
|
||||||
- !SINGLE
|
|
||||||
tables:
|
|
||||||
- "*.*"
|
|
||||||
- !SHARDING
|
|
||||||
tables: # 数据分片规则配置
|
|
||||||
book_content:
|
|
||||||
# 分库策略,缺省表示使用默认分库策略
|
|
||||||
actualDataNodes: ds_${1}.book_content${0..9}
|
|
||||||
# 分表策略
|
|
||||||
tableStrategy:
|
|
||||||
standard:
|
|
||||||
# 分片列名称
|
|
||||||
shardingColumn: index_id
|
|
||||||
# 分片算法名称
|
|
||||||
shardingAlgorithmName: bookContentSharding
|
|
||||||
|
|
||||||
shardingAlgorithms:
|
|
||||||
bookContentSharding:
|
|
||||||
# 行表达式分片算法,使用 Groovy 的表达式,提供对 SQL 语句中的 = 和 IN 的分片操作支持
|
|
||||||
type: INLINE
|
|
||||||
props:
|
|
||||||
# 分片算法的行表达式
|
|
||||||
algorithm-expression: book_content${index_id % 10}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
props:
|
|
||||||
# 是否在日志中打印 SQL
|
|
||||||
sql-show: true
|
|
@ -1,9 +0,0 @@
|
|||||||
FROM openjdk:8
|
|
||||||
ADD novel-admin.jar /root
|
|
||||||
ENV dburl=""
|
|
||||||
ENV username=""
|
|
||||||
ENV password=""
|
|
||||||
ENV redishost = ""
|
|
||||||
ENV redisport = ""
|
|
||||||
ENV redispwd = ""
|
|
||||||
ENTRYPOINT ["sh","-c","java -Dspring.datasource.url=${dburl} -Dspring.datasource.username=${username} -Dspring.datasource.password=${password} -Dspring.redis.host=${redishost} -Dspring.redis.port=${redisport} -Dspring.redis.password=${redispwd} -jar /root/novel-admin.jar"]
|
|
@ -1,94 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
APP_NAME=novel-admin
|
|
||||||
JAR_NAME=$APP_NAME\.jar
|
|
||||||
#PID 代表是PID文件
|
|
||||||
PID=$APP_NAME\.pid
|
|
||||||
|
|
||||||
|
|
||||||
#使用说明,用来提示输入参数
|
|
||||||
usage() {
|
|
||||||
echo "Usage: ./novel-admin.sh [start|stop|restart|status]"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
#检查程序是否在运行
|
|
||||||
is_exist(){
|
|
||||||
pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
|
|
||||||
#如果不存在返回1,存在返回0
|
|
||||||
if [ -z "${pid}" ]; then
|
|
||||||
return 1
|
|
||||||
else
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
#启动方法
|
|
||||||
start(){
|
|
||||||
is_exist
|
|
||||||
if [ $? -eq "0" ]; then
|
|
||||||
echo ">>> 小说精品屋后台正在运行 PID = ${pid} <<<"
|
|
||||||
else
|
|
||||||
echo ">>> 小说精品屋后台开始启动 <<<"
|
|
||||||
nohup java -jar -Dspring.profiles.active=prod $JAR_NAME >/dev/null 2>&1 &
|
|
||||||
sleep 20
|
|
||||||
echo $! > $PID
|
|
||||||
echo ">>> 小说精品屋后台启动完成 PID = $! <<<"
|
|
||||||
status
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
#停止方法
|
|
||||||
stop(){
|
|
||||||
#is_exist
|
|
||||||
pidf=$(cat $PID)
|
|
||||||
#echo "$pidf"
|
|
||||||
echo ">>> 小说精品屋后台 PID = $pidf 开始停止 <<<"
|
|
||||||
kill $pidf
|
|
||||||
rm -rf $PID
|
|
||||||
sleep 2
|
|
||||||
is_exist
|
|
||||||
if [ $? -eq "0" ]; then
|
|
||||||
echo ">>> 小说精品屋后台 PID = $pid 开始强制停止 <<<"
|
|
||||||
kill -9 $pid
|
|
||||||
sleep 2
|
|
||||||
status
|
|
||||||
else
|
|
||||||
status
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
#输出运行状态
|
|
||||||
status(){
|
|
||||||
is_exist
|
|
||||||
if [ $? -eq "0" ]; then
|
|
||||||
echo ">>> 小说精品屋后台正在运行 PID = ${pid} <<<"
|
|
||||||
else
|
|
||||||
echo ">>> 小说精品屋后台没有运行 <<<"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
#重启
|
|
||||||
restart(){
|
|
||||||
stop
|
|
||||||
start
|
|
||||||
}
|
|
||||||
|
|
||||||
#根据输入参数,选择执行对应方法,不输入则执行使用说明
|
|
||||||
case "$1" in
|
|
||||||
"start")
|
|
||||||
start
|
|
||||||
;;
|
|
||||||
"stop")
|
|
||||||
stop
|
|
||||||
;;
|
|
||||||
"status")
|
|
||||||
status
|
|
||||||
;;
|
|
||||||
"restart")
|
|
||||||
restart
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
usage
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
exit 0
|
|
@ -1,47 +1,25 @@
|
|||||||
package com.java2nb;
|
package com.java2nb;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.mybatis.spring.annotation.MapperScan;
|
import org.mybatis.spring.annotation.MapperScan;
|
||||||
import org.springframework.boot.CommandLineRunner;
|
|
||||||
import org.springframework.boot.SpringApplication;
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
import org.springframework.boot.web.servlet.ServletComponentScan;
|
import org.springframework.boot.web.servlet.ServletComponentScan;
|
||||||
import org.springframework.cache.annotation.EnableCaching;
|
import org.springframework.cache.annotation.EnableCaching;
|
||||||
import org.springframework.context.ApplicationContext;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
|
||||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
//关闭SpringSecurity的功能
|
||||||
import java.net.InetAddress;
|
@EnableAutoConfiguration(exclude = {
|
||||||
import java.sql.Connection;
|
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class
|
||||||
|
})
|
||||||
|
|
||||||
@EnableTransactionManagement
|
@EnableTransactionManagement
|
||||||
@ServletComponentScan
|
@ServletComponentScan
|
||||||
@MapperScan("com.java2nb.*.dao")
|
@MapperScan("com.java2nb.*.dao")
|
||||||
@SpringBootApplication(exclude = {
|
@SpringBootApplication
|
||||||
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class
|
|
||||||
})
|
|
||||||
@EnableCaching
|
@EnableCaching
|
||||||
@Slf4j
|
|
||||||
public class AdminApplication {
|
public class AdminApplication {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
SpringApplication.run(AdminApplication.class, args);
|
SpringApplication.run(AdminApplication.class, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
|
||||||
public CommandLineRunner commandLineRunner(ApplicationContext ctx, DataSource dataSource) {
|
|
||||||
return args -> {
|
|
||||||
log.info("创建连接池...");
|
|
||||||
try (Connection connection = dataSource.getConnection()) {
|
|
||||||
log.info("连接池已创建.");
|
|
||||||
log.info("数据库:{}", connection.getMetaData().getDatabaseProductName());
|
|
||||||
log.info("数据库版本:{}", connection.getMetaData().getDatabaseProductVersion());
|
|
||||||
}
|
|
||||||
log.info("项目启动啦,访问路径:{}",
|
|
||||||
"http://" + InetAddress.getLocalHost().getHostAddress() + ":" + ctx.getEnvironment()
|
|
||||||
.getProperty("server.port"));
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,16 +1,19 @@
|
|||||||
package com.java2nb.common.aspect;
|
package com.java2nb.common.aspect;
|
||||||
|
|
||||||
import com.java2nb.common.utils.IPUtils;
|
import com.java2nb.common.utils.HttpContextUtils;
|
||||||
import org.aspectj.lang.JoinPoint;
|
import org.aspectj.lang.JoinPoint;
|
||||||
import org.aspectj.lang.ProceedingJoinPoint;
|
import org.aspectj.lang.ProceedingJoinPoint;
|
||||||
import org.aspectj.lang.annotation.*;
|
import org.aspectj.lang.annotation.*;
|
||||||
|
import org.aspectj.lang.reflect.MethodSignature;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.web.context.request.RequestContextHolder;
|
import org.springframework.web.context.request.RequestContextHolder;
|
||||||
import org.springframework.web.context.request.ServletRequestAttributes;
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||||
|
import sun.net.util.IPAddressUtil;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
@Aspect
|
@Aspect
|
||||||
@ -34,10 +37,11 @@ public class WebLogAspect {
|
|||||||
logger.info("请求地址 : " + request.getRequestURL().toString());
|
logger.info("请求地址 : " + request.getRequestURL().toString());
|
||||||
logger.info("HTTP METHOD : " + request.getMethod());
|
logger.info("HTTP METHOD : " + request.getMethod());
|
||||||
// 获取真实的ip地址
|
// 获取真实的ip地址
|
||||||
logger.info("IP : " + IPUtils.getIpAddr(request));
|
//logger.info("IP : " + IPAddressUtil.getClientIpAddress(request));
|
||||||
logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "."
|
logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "."
|
||||||
+ joinPoint.getSignature().getName());
|
+ joinPoint.getSignature().getName());
|
||||||
logger.info("参数 : " + Arrays.toString(joinPoint.getArgs()));
|
logger.info("参数 : " + Arrays.toString(joinPoint.getArgs()));
|
||||||
|
// loggger.info("参数 : " + joinPoint.getArgs());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,73 +0,0 @@
|
|||||||
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";
|
|
||||||
}
|
|
@ -1,7 +1,6 @@
|
|||||||
package com.java2nb.common.config;
|
package com.java2nb.common.config;
|
||||||
|
|
||||||
public class Constant {
|
public class Constant {
|
||||||
|
|
||||||
//演示系统账户
|
//演示系统账户
|
||||||
public static String DEMO_ACCOUNT = "test";
|
public static String DEMO_ACCOUNT = "test";
|
||||||
//自动去除表前缀
|
//自动去除表前缀
|
||||||
@ -17,11 +16,9 @@ public class Constant {
|
|||||||
//部门根节点id
|
//部门根节点id
|
||||||
public static Long DEPT_ROOT_ID = 0l;
|
public static Long DEPT_ROOT_ID = 0l;
|
||||||
//缓存方式
|
//缓存方式
|
||||||
public static String CACHE_TYPE_REDIS = "redis";
|
public static String CACHE_TYPE_REDIS ="redis";
|
||||||
|
|
||||||
public static String LOG_ERROR = "error";
|
public static String LOG_ERROR = "error";
|
||||||
|
|
||||||
public static final String UPLOAD_FILES_PREFIX = "/files/";
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,132 @@
|
|||||||
|
package com.java2nb.common.config;
|
||||||
|
import com.alibaba.druid.pool.DruidDataSource;
|
||||||
|
import com.alibaba.druid.support.http.StatViewServlet;
|
||||||
|
import com.alibaba.druid.support.http.WebStatFilter;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
||||||
|
import org.springframework.boot.web.servlet.ServletRegistrationBean;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.annotation.Primary;
|
||||||
|
|
||||||
|
import javax.sql.DataSource;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by PrimaryKey on 17/2/4.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("AlibabaRemoveCommentedCode")
|
||||||
|
@Configuration
|
||||||
|
public class DruidDBConfig {
|
||||||
|
private Logger logger = LoggerFactory.getLogger(DruidDBConfig.class);
|
||||||
|
@Value("${spring.datasource.url}")
|
||||||
|
private String dbUrl;
|
||||||
|
|
||||||
|
@Value("${spring.datasource.username}")
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
@Value("${spring.datasource.password}")
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
@Value("${spring.datasource.driverClassName}")
|
||||||
|
private String driverClassName;
|
||||||
|
|
||||||
|
@Value("${spring.datasource.initialSize}")
|
||||||
|
private int initialSize;
|
||||||
|
|
||||||
|
@Value("${spring.datasource.minIdle}")
|
||||||
|
private int minIdle;
|
||||||
|
|
||||||
|
@Value("${spring.datasource.maxActive}")
|
||||||
|
private int maxActive;
|
||||||
|
|
||||||
|
@Value("${spring.datasource.maxWait}")
|
||||||
|
private int maxWait;
|
||||||
|
|
||||||
|
@Value("${spring.datasource.timeBetweenEvictionRunsMillis}")
|
||||||
|
private int timeBetweenEvictionRunsMillis;
|
||||||
|
|
||||||
|
@Value("${spring.datasource.minEvictableIdleTimeMillis}")
|
||||||
|
private int minEvictableIdleTimeMillis;
|
||||||
|
|
||||||
|
@Value("${spring.datasource.validationQuery}")
|
||||||
|
private String validationQuery;
|
||||||
|
|
||||||
|
@Value("${spring.datasource.testWhileIdle}")
|
||||||
|
private boolean testWhileIdle;
|
||||||
|
|
||||||
|
@Value("${spring.datasource.testOnBorrow}")
|
||||||
|
private boolean testOnBorrow;
|
||||||
|
|
||||||
|
@Value("${spring.datasource.testOnReturn}")
|
||||||
|
private boolean testOnReturn;
|
||||||
|
|
||||||
|
@Value("${spring.datasource.poolPreparedStatements}")
|
||||||
|
private boolean poolPreparedStatements;
|
||||||
|
|
||||||
|
@Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")
|
||||||
|
private int maxPoolPreparedStatementPerConnectionSize;
|
||||||
|
|
||||||
|
@Value("${spring.datasource.filters}")
|
||||||
|
private String filters;
|
||||||
|
|
||||||
|
@Value("{spring.datasource.connectionProperties}")
|
||||||
|
private String connectionProperties;
|
||||||
|
|
||||||
|
@Bean(initMethod = "init", destroyMethod = "close") //声明其为Bean实例
|
||||||
|
@Primary //在同样的DataSource中,首先使用被标注的DataSource
|
||||||
|
public DataSource dataSource() {
|
||||||
|
DruidDataSource datasource = new DruidDataSource();
|
||||||
|
|
||||||
|
datasource.setUrl(this.dbUrl);
|
||||||
|
datasource.setUsername(username);
|
||||||
|
datasource.setPassword(password);
|
||||||
|
datasource.setDriverClassName(driverClassName);
|
||||||
|
|
||||||
|
//configuration
|
||||||
|
datasource.setInitialSize(initialSize);
|
||||||
|
datasource.setMinIdle(minIdle);
|
||||||
|
datasource.setMaxActive(maxActive);
|
||||||
|
datasource.setMaxWait(maxWait);
|
||||||
|
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
|
||||||
|
datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
|
||||||
|
datasource.setValidationQuery(validationQuery);
|
||||||
|
datasource.setTestWhileIdle(testWhileIdle);
|
||||||
|
datasource.setTestOnBorrow(testOnBorrow);
|
||||||
|
datasource.setTestOnReturn(testOnReturn);
|
||||||
|
datasource.setPoolPreparedStatements(poolPreparedStatements);
|
||||||
|
datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
|
||||||
|
try {
|
||||||
|
datasource.setFilters(filters);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
logger.error("druid configuration initialization filter", e);
|
||||||
|
}
|
||||||
|
datasource.setConnectionProperties(connectionProperties);
|
||||||
|
|
||||||
|
return datasource;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public ServletRegistrationBean druidServlet() {
|
||||||
|
ServletRegistrationBean reg = new ServletRegistrationBean();
|
||||||
|
reg.setServlet(new StatViewServlet());
|
||||||
|
reg.addUrlMappings("/druid/*");
|
||||||
|
reg.addInitParameter("allow", ""); //白名单
|
||||||
|
return reg;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean public FilterRegistrationBean filterRegistrationBean() {
|
||||||
|
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
|
||||||
|
filterRegistrationBean.setFilter(new WebStatFilter());
|
||||||
|
filterRegistrationBean.addUrlPatterns("/*");
|
||||||
|
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
|
||||||
|
filterRegistrationBean.addInitParameter("profileEnable", "true");
|
||||||
|
filterRegistrationBean.addInitParameter("principalCookieName","USER_COOKIE");
|
||||||
|
filterRegistrationBean.addInitParameter("principalSessionName","USER_SESSION");
|
||||||
|
filterRegistrationBean.addInitParameter("DruidWebStatFilter","/*");
|
||||||
|
return filterRegistrationBean;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,82 @@
|
|||||||
|
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;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -5,8 +5,11 @@ import com.java2nb.common.redis.shiro.RedisCacheManager;
|
|||||||
import com.java2nb.common.redis.shiro.RedisManager;
|
import com.java2nb.common.redis.shiro.RedisManager;
|
||||||
import com.java2nb.common.redis.shiro.RedisSessionDAO;
|
import com.java2nb.common.redis.shiro.RedisSessionDAO;
|
||||||
import com.java2nb.system.shiro.UserRealm;
|
import com.java2nb.system.shiro.UserRealm;
|
||||||
|
import net.sf.ehcache.CacheManager;
|
||||||
|
import org.apache.shiro.cache.ehcache.EhCacheManager;
|
||||||
import org.apache.shiro.mgt.SecurityManager;
|
import org.apache.shiro.mgt.SecurityManager;
|
||||||
import org.apache.shiro.session.SessionListener;
|
import org.apache.shiro.session.SessionListener;
|
||||||
|
import org.apache.shiro.session.mgt.eis.MemorySessionDAO;
|
||||||
import org.apache.shiro.session.mgt.eis.SessionDAO;
|
import org.apache.shiro.session.mgt.eis.SessionDAO;
|
||||||
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
|
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
|
||||||
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
|
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
|
||||||
@ -26,7 +29,6 @@ import java.util.LinkedHashMap;
|
|||||||
*/
|
*/
|
||||||
@Configuration
|
@Configuration
|
||||||
public class ShiroConfig {
|
public class ShiroConfig {
|
||||||
|
|
||||||
@Value("${spring.redis.host}")
|
@Value("${spring.redis.host}")
|
||||||
private String host;
|
private String host;
|
||||||
@Value("${spring.redis.password}")
|
@Value("${spring.redis.password}")
|
||||||
@ -36,6 +38,9 @@ public class ShiroConfig {
|
|||||||
@Value("${spring.redis.timeout}")
|
@Value("${spring.redis.timeout}")
|
||||||
private int timeout;
|
private int timeout;
|
||||||
|
|
||||||
|
@Value("${spring.cache.type}")
|
||||||
|
private String cacheType ;
|
||||||
|
|
||||||
@Value("${server.session-timeout}")
|
@Value("${server.session-timeout}")
|
||||||
private int tomcatTimeout;
|
private int tomcatTimeout;
|
||||||
|
|
||||||
@ -62,17 +67,17 @@ public class ShiroConfig {
|
|||||||
shiroFilterFactoryBean.setSuccessUrl("/index");
|
shiroFilterFactoryBean.setSuccessUrl("/index");
|
||||||
shiroFilterFactoryBean.setUnauthorizedUrl("/403");
|
shiroFilterFactoryBean.setUnauthorizedUrl("/403");
|
||||||
LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
|
LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
|
||||||
filterChainDefinitionMap.put("/login", "anon");
|
filterChainDefinitionMap.put("/login","anon");
|
||||||
filterChainDefinitionMap.put("/getVerify", "anon");
|
filterChainDefinitionMap.put("/getVerify","anon");
|
||||||
filterChainDefinitionMap.put("/css/**", "anon");
|
filterChainDefinitionMap.put("/css/**", "anon");
|
||||||
filterChainDefinitionMap.put("/js/**", "anon");
|
filterChainDefinitionMap.put("/js/**", "anon");
|
||||||
filterChainDefinitionMap.put("/fonts/**", "anon");
|
filterChainDefinitionMap.put("/fonts/**", "anon");
|
||||||
filterChainDefinitionMap.put("/img/**", "anon");
|
filterChainDefinitionMap.put("/img/**", "anon");
|
||||||
filterChainDefinitionMap.put("/favicon.ico", "anon");
|
|
||||||
filterChainDefinitionMap.put("/docs/**", "anon");
|
filterChainDefinitionMap.put("/docs/**", "anon");
|
||||||
filterChainDefinitionMap.put("/layuimini/**", "anon");
|
filterChainDefinitionMap.put("/layuimini/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/druid/**", "anon");
|
||||||
filterChainDefinitionMap.put("/upload/**", "anon");
|
filterChainDefinitionMap.put("/upload/**", "anon");
|
||||||
filterChainDefinitionMap.put(Constant.UPLOAD_FILES_PREFIX + "**", "anon");
|
filterChainDefinitionMap.put("/files/**", "anon");
|
||||||
filterChainDefinitionMap.put("/logout", "logout");
|
filterChainDefinitionMap.put("/logout", "logout");
|
||||||
filterChainDefinitionMap.put("/blog", "anon");
|
filterChainDefinitionMap.put("/blog", "anon");
|
||||||
filterChainDefinitionMap.put("/blog/open/**", "anon");
|
filterChainDefinitionMap.put("/blog/open/**", "anon");
|
||||||
@ -88,7 +93,11 @@ public class ShiroConfig {
|
|||||||
//设置realm.
|
//设置realm.
|
||||||
securityManager.setRealm(userRealm());
|
securityManager.setRealm(userRealm());
|
||||||
// 自定义缓存实现 使用redis
|
// 自定义缓存实现 使用redis
|
||||||
securityManager.setCacheManager(rediscacheManager());
|
if (Constant.CACHE_TYPE_REDIS.equals(cacheType)) {
|
||||||
|
securityManager.setCacheManager(rediscacheManager());
|
||||||
|
} else {
|
||||||
|
securityManager.setCacheManager(ehCacheManager());
|
||||||
|
}
|
||||||
securityManager.setSessionManager(sessionManager());
|
securityManager.setSessionManager(sessionManager());
|
||||||
return securityManager;
|
return securityManager;
|
||||||
}
|
}
|
||||||
@ -100,7 +109,8 @@ public class ShiroConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 开启shiro aop注解支持. 使用代理方式;所以需要开启代码支持;
|
* 开启shiro aop注解支持.
|
||||||
|
* 使用代理方式;所以需要开启代码支持;
|
||||||
*
|
*
|
||||||
* @param securityManager
|
* @param securityManager
|
||||||
* @return
|
* @return
|
||||||
@ -129,7 +139,8 @@ public class ShiroConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cacheManager 缓存 redis实现 使用的是shiro-redis开源插件
|
* cacheManager 缓存 redis实现
|
||||||
|
* 使用的是shiro-redis开源插件
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@ -141,7 +152,8 @@ public class ShiroConfig {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RedisSessionDAO shiro sessionDao层的实现 通过redis 使用的是shiro-redis开源插件
|
* RedisSessionDAO shiro sessionDao层的实现 通过redis
|
||||||
|
* 使用的是shiro-redis开源插件
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
public RedisSessionDAO redisSessionDAO() {
|
public RedisSessionDAO redisSessionDAO() {
|
||||||
@ -152,7 +164,11 @@ public class ShiroConfig {
|
|||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public SessionDAO sessionDAO() {
|
public SessionDAO sessionDAO() {
|
||||||
return redisSessionDAO();
|
if (Constant.CACHE_TYPE_REDIS.equals(cacheType)) {
|
||||||
|
return redisSessionDAO();
|
||||||
|
} else {
|
||||||
|
return new MemorySessionDAO();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -169,4 +185,19 @@ public class ShiroConfig {
|
|||||||
return sessionManager;
|
return sessionManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public EhCacheManager ehCacheManager() {
|
||||||
|
EhCacheManager em = new EhCacheManager();
|
||||||
|
em.setCacheManager(cacheManager());
|
||||||
|
return em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean("cacheManager2")
|
||||||
|
CacheManager cacheManager(){
|
||||||
|
return CacheManager.create();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,48 @@
|
|||||||
|
package com.java2nb.common.config;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import springfox.documentation.builders.ApiInfoBuilder;
|
||||||
|
import springfox.documentation.builders.PathSelectors;
|
||||||
|
import springfox.documentation.builders.RequestHandlerSelectors;
|
||||||
|
import springfox.documentation.service.ApiInfo;
|
||||||
|
import springfox.documentation.service.Contact;
|
||||||
|
import springfox.documentation.spi.DocumentationType;
|
||||||
|
import springfox.documentation.spring.web.plugins.Docket;
|
||||||
|
import springfox.documentation.swagger2.annotations.EnableSwagger2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ${DESCRIPTION}
|
||||||
|
*
|
||||||
|
* @author xiongxy
|
||||||
|
* @create 2019-11-02 23:53
|
||||||
|
*/
|
||||||
|
@EnableSwagger2
|
||||||
|
@Configuration
|
||||||
|
public class Swagger2Config {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Docket createRestApi() {
|
||||||
|
return new Docket(DocumentationType.SWAGGER_2)
|
||||||
|
.apiInfo(apiInfo())
|
||||||
|
.select()
|
||||||
|
//为当前包路径
|
||||||
|
.apis(RequestHandlerSelectors.any())
|
||||||
|
.paths(PathSelectors.any())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
//构建 api文档的详细信息函数
|
||||||
|
private ApiInfo apiInfo() {
|
||||||
|
return new ApiInfoBuilder()
|
||||||
|
//页面标题
|
||||||
|
.title("功能测试")
|
||||||
|
//创建人
|
||||||
|
.contact(new Contact("xiongxy", "1179705413@qq.com", "1179705413@qq.com"))
|
||||||
|
//版本号
|
||||||
|
.version("1.0")
|
||||||
|
//描述
|
||||||
|
.description("API 描述")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
@ -7,14 +7,11 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
|
|||||||
|
|
||||||
@Component
|
@Component
|
||||||
class WebConfigurer extends WebMvcConfigurerAdapter {
|
class WebConfigurer extends WebMvcConfigurerAdapter {
|
||||||
|
@Autowired
|
||||||
@Autowired
|
|
||||||
JnConfig jnConfig;
|
JnConfig jnConfig;
|
||||||
|
@Override
|
||||||
@Override
|
public void addResourceHandlers(ResourceHandlerRegistry registry) {
|
||||||
public void addResourceHandlers(ResourceHandlerRegistry registry) {
|
registry.addResourceHandler("/files/**").addResourceLocations("file:///"+ jnConfig.getUploadPath());
|
||||||
registry.addResourceHandler(Constant.UPLOAD_FILES_PREFIX + "**")
|
}
|
||||||
.addResourceLocations("file:///" + jnConfig.getUploadPath());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
@ -1,10 +1,12 @@
|
|||||||
package com.java2nb.common.controller;
|
package com.java2nb.common.controller;
|
||||||
|
|
||||||
import com.java2nb.common.config.Constant;
|
|
||||||
import com.java2nb.common.config.JnConfig;
|
import com.java2nb.common.config.JnConfig;
|
||||||
import com.java2nb.common.domain.FileDO;
|
import com.java2nb.common.domain.FileDO;
|
||||||
import com.java2nb.common.service.FileService;
|
import com.java2nb.common.service.FileService;
|
||||||
import com.java2nb.common.utils.*;
|
import com.java2nb.common.utils.*;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
@ -12,11 +14,7 @@ import org.springframework.ui.Model;
|
|||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import java.io.*;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@ -25,7 +23,7 @@ import java.util.Map;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 文件上传
|
* 文件上传
|
||||||
*
|
*
|
||||||
* @author xiongxy
|
* @author xiongxy
|
||||||
* @email 1179705413@qq.com
|
* @email 1179705413@qq.com
|
||||||
* @date 2019-09-19 16:02:20
|
* @date 2019-09-19 16:02:20
|
||||||
@ -34,167 +32,165 @@ import java.util.Map;
|
|||||||
@RequestMapping("/common/sysFile")
|
@RequestMapping("/common/sysFile")
|
||||||
public class FileController extends BaseController {
|
public class FileController extends BaseController {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private FileService sysFileService;
|
private FileService sysFileService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private JnConfig jnConfig;
|
private JnConfig jnConfig;
|
||||||
|
|
||||||
@GetMapping()
|
@GetMapping()
|
||||||
@RequiresPermissions("common:sysFile:sysFile")
|
@RequiresPermissions("common:sysFile:sysFile")
|
||||||
String sysFile(Model model) {
|
String sysFile(Model model) {
|
||||||
Map<String, Object> params = new HashMap<>(16);
|
Map<String, Object> params = new HashMap<>(16);
|
||||||
return "common/file/file";
|
return "common/file/file";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
@GetMapping("/list")
|
@GetMapping("/list")
|
||||||
@RequiresPermissions("common:sysFile:sysFile")
|
@RequiresPermissions("common:sysFile:sysFile")
|
||||||
public PageBean list(@RequestParam Map<String, Object> params) {
|
public PageBean list(@RequestParam Map<String, Object> params) {
|
||||||
// 查询列表数据
|
// 查询列表数据
|
||||||
Query query = new Query(params);
|
Query query = new Query(params);
|
||||||
List<FileDO> sysFileList = sysFileService.list(query);
|
List<FileDO> sysFileList = sysFileService.list(query);
|
||||||
int total = sysFileService.count(query);
|
int total = sysFileService.count(query);
|
||||||
PageBean pageBean = new PageBean(sysFileList, total);
|
PageBean pageBean = new PageBean(sysFileList, total);
|
||||||
return pageBean;
|
return pageBean;
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/add")
|
@GetMapping("/add")
|
||||||
// @RequiresPermissions("common:bComments")
|
// @RequiresPermissions("common:bComments")
|
||||||
String add() {
|
String add() {
|
||||||
return "common/sysFile/add";
|
return "common/sysFile/add";
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/edit")
|
@GetMapping("/edit")
|
||||||
// @RequiresPermissions("common:bComments")
|
// @RequiresPermissions("common:bComments")
|
||||||
String edit(Long id, Model model) {
|
String edit(Long id, Model model) {
|
||||||
FileDO sysFile = sysFileService.get(id);
|
FileDO sysFile = sysFileService.get(id);
|
||||||
model.addAttribute("sysFile", sysFile);
|
model.addAttribute("sysFile", sysFile);
|
||||||
return "common/sysFile/edit";
|
return "common/sysFile/edit";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 信息
|
* 信息
|
||||||
*/
|
*/
|
||||||
@RequestMapping("/info/{id}")
|
@RequestMapping("/info/{id}")
|
||||||
@RequiresPermissions("common:info")
|
@RequiresPermissions("common:info")
|
||||||
public R info(@PathVariable("id") Long id) {
|
public R info(@PathVariable("id") Long id) {
|
||||||
FileDO sysFile = sysFileService.get(id);
|
FileDO sysFile = sysFileService.get(id);
|
||||||
return R.ok().put("sysFile", sysFile);
|
return R.ok().put("sysFile", sysFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 保存
|
* 保存
|
||||||
*/
|
*/
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
@PostMapping("/save")
|
@PostMapping("/save")
|
||||||
@RequiresPermissions("common:save")
|
@RequiresPermissions("common:save")
|
||||||
public R save(FileDO sysFile) {
|
public R save(FileDO sysFile) {
|
||||||
if (sysFileService.save(sysFile) > 0) {
|
if (sysFileService.save(sysFile) > 0) {
|
||||||
return R.ok();
|
return R.ok();
|
||||||
}
|
}
|
||||||
return R.error();
|
return R.error();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改
|
* 修改
|
||||||
*/
|
*/
|
||||||
@RequestMapping("/update")
|
@RequestMapping("/update")
|
||||||
@RequiresPermissions("common:update")
|
@RequiresPermissions("common:update")
|
||||||
public R update(@RequestBody FileDO sysFile) {
|
public R update(@RequestBody FileDO sysFile) {
|
||||||
sysFileService.update(sysFile);
|
sysFileService.update(sysFile);
|
||||||
|
|
||||||
return R.ok();
|
return R.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除
|
* 删除
|
||||||
*/
|
*/
|
||||||
@PostMapping("/remove")
|
@PostMapping("/remove")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
// @RequiresPermissions("common:remove")
|
// @RequiresPermissions("common:remove")
|
||||||
public R remove(Long id, HttpServletRequest request) {
|
public R remove(Long id, HttpServletRequest request) {
|
||||||
if ("test".equals(getUsername())) {
|
if ("test".equals(getUsername())) {
|
||||||
return R.error(1, "演示系统不允许修改,完整体验请部署程序");
|
return R.error(1, "演示系统不允许修改,完整体验请部署程序");
|
||||||
}
|
}
|
||||||
String fileName =
|
String fileName = jnConfig.getUploadPath() + sysFileService.get(id).getUrl().replace("/files/", "");
|
||||||
jnConfig.getUploadPath() + sysFileService.get(id).getUrl().replace(Constant.UPLOAD_FILES_PREFIX, "");
|
if (sysFileService.remove(id) > 0) {
|
||||||
if (sysFileService.remove(id) > 0) {
|
boolean b = FileUtil.deleteFile(fileName);
|
||||||
boolean b = FileUtil.deleteFile(fileName);
|
if (!b) {
|
||||||
if (!b) {
|
return R.error("数据库记录删除成功,文件删除失败");
|
||||||
return R.error("数据库记录删除成功,文件删除失败");
|
}
|
||||||
}
|
return R.ok();
|
||||||
return R.ok();
|
} else {
|
||||||
} else {
|
return R.error();
|
||||||
return R.error();
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除
|
* 删除
|
||||||
*/
|
*/
|
||||||
@PostMapping("/batchRemove")
|
@PostMapping("/batchRemove")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
@RequiresPermissions("common:remove")
|
@RequiresPermissions("common:remove")
|
||||||
public R remove(@RequestParam("ids[]") Long[] ids) {
|
public R remove(@RequestParam("ids[]") Long[] ids) {
|
||||||
if ("test".equals(getUsername())) {
|
if ("test".equals(getUsername())) {
|
||||||
return R.error(1, "演示系统不允许修改,完整体验请部署程序");
|
return R.error(1, "演示系统不允许修改,完整体验请部署程序");
|
||||||
}
|
}
|
||||||
sysFileService.batchRemove(ids);
|
sysFileService.batchRemove(ids);
|
||||||
return R.ok();
|
return R.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
@PostMapping("/upload")
|
@PostMapping("/upload")
|
||||||
R upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
|
R upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
|
||||||
if ("test".equals(getUsername())) {
|
if ("test".equals(getUsername())) {
|
||||||
return R.error(1, "演示系统不允许修改,完整体验请部署程序");
|
return R.error(1, "演示系统不允许修改,完整体验请部署程序");
|
||||||
}
|
}
|
||||||
Date date = new Date();
|
Date date = new Date();
|
||||||
String year = DateUtils.format(date, DateUtils.YEAR_PATTERN);
|
String year = DateUtils.format(date,DateUtils.YEAR_PATTERN);
|
||||||
String month = DateUtils.format(date, DateUtils.MONTH_PATTERN);
|
String month = DateUtils.format(date,DateUtils.MONTH_PATTERN);
|
||||||
String day = DateUtils.format(date, DateUtils.DAY_PATTERN);
|
String day = DateUtils.format(date,DateUtils.DAY_PATTERN);
|
||||||
|
|
||||||
String fileName = file.getOriginalFilename();
|
String fileName = file.getOriginalFilename();
|
||||||
String fileDir = year + "/" + month + "/" + day + "/";
|
String fileDir = year+"/"+month+"/"+day + "/";
|
||||||
fileName = FileUtil.renameToUUID(fileName);
|
fileName = FileUtil.renameToUUID(fileName);
|
||||||
FileDO sysFile = new FileDO(FileType.fileType(fileName), Constant.UPLOAD_FILES_PREFIX + fileDir + fileName,
|
FileDO sysFile = new FileDO(FileType.fileType(fileName), "/files/" + fileDir + fileName, date);
|
||||||
date);
|
try {
|
||||||
try {
|
FileUtil.uploadFile(file.getBytes(), jnConfig.getUploadPath()+fileDir, fileName);
|
||||||
FileUtil.uploadFile(file.getBytes(), jnConfig.getUploadPath() + fileDir, fileName);
|
} catch (Exception e) {
|
||||||
} catch (Exception e) {
|
return R.error();
|
||||||
return R.error();
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (sysFileService.save(sysFile) > 0) {
|
if (sysFileService.save(sysFile) > 0) {
|
||||||
return R.ok().put("fileName", sysFile.getUrl());
|
return R.ok().put("fileName",sysFile.getUrl());
|
||||||
}
|
}
|
||||||
return R.error();
|
return R.error();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 文件下载
|
* 文件下载
|
||||||
*/
|
*/
|
||||||
@RequestMapping(value = "/download")
|
@RequestMapping(value = "/download")
|
||||||
public void fileDownload(String filePath, String fileName, HttpServletResponse resp) throws Exception {
|
public void fileDownload(String filePath,String fileName, HttpServletResponse resp) throws Exception {
|
||||||
String realFilePath = jnConfig.getUploadPath() + filePath;
|
String realFilePath = jnConfig.getUploadPath() + filePath;
|
||||||
InputStream in = new FileInputStream(realFilePath);
|
InputStream in = new FileInputStream(realFilePath);
|
||||||
//设置响应头,对文件进行url编码
|
//设置响应头,对文件进行url编码
|
||||||
fileName = URLEncoder.encode(fileName, "UTF-8");
|
fileName = URLEncoder.encode(fileName, "UTF-8");
|
||||||
resp.setHeader("Content-Disposition", "attachment;filename=" + fileName);
|
resp.setHeader("Content-Disposition", "attachment;filename=" + fileName);
|
||||||
|
|
||||||
resp.setContentLength(in.available());
|
resp.setContentLength(in.available());
|
||||||
|
|
||||||
OutputStream out = resp.getOutputStream();
|
OutputStream out = resp.getOutputStream();
|
||||||
byte[] b = new byte[1024];
|
byte[] b = new byte[1024];
|
||||||
int len = 0;
|
int len = 0;
|
||||||
while ((len = in.read(b)) != -1) {
|
while ((len = in.read(b)) != -1) {
|
||||||
out.write(b, 0, len);
|
out.write(b, 0, len);
|
||||||
}
|
}
|
||||||
out.flush();
|
out.flush();
|
||||||
out.close();
|
out.close();
|
||||||
in.close();
|
in.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,33 +1,28 @@
|
|||||||
package com.java2nb.common.dao;
|
package com.java2nb.common.dao;
|
||||||
|
|
||||||
import org.apache.ibatis.annotations.Param;
|
|
||||||
import org.apache.ibatis.annotations.Select;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
import org.apache.ibatis.annotations.Select;
|
||||||
|
|
||||||
public interface GeneratorMapper {
|
public interface GeneratorMapper {
|
||||||
|
@Select("select table_name tableName, engine, table_comment tableComment, create_time createTime from information_schema.tables"
|
||||||
|
+ " where table_schema = (select database()) and table_name like concat('%',#{tableName},'%')")
|
||||||
|
List<Map<String, Object>> list(@Param("tableName") String tableName);
|
||||||
|
|
||||||
@Select(
|
@Select("select count(*) from information_schema.tables where table_schema = (select database())")
|
||||||
"select table_name tableName, engine, table_comment tableComment, create_time createTime from tables"
|
int count(Map<String, Object> map);
|
||||||
+ " where table_schema = 'novel_plus' and table_name like concat('%',#{tableName},'%')")
|
|
||||||
List<Map<String, Object>> list(@Param("tableName") String tableName);
|
|
||||||
|
|
||||||
@Select("select count(*) from tables where table_schema = 'novel_plus'")
|
@Select("select table_name tableName, engine, table_comment tableComment, create_time createTime from information_schema.tables \r\n"
|
||||||
int count(Map<String, Object> map);
|
+ " where table_schema = (select database()) and table_name = #{tableName}")
|
||||||
|
Map<String, String> get(String tableName);
|
||||||
|
|
||||||
@Select(
|
@Select("select column_name columnName, data_type dataType, column_comment columnComment, column_key columnKey, extra from information_schema.columns\r\n"
|
||||||
"select table_name tableName, engine, table_comment tableComment, create_time createTime from tables \r\n"
|
+ " where table_name = #{tableName} and table_schema = (select database()) order by ordinal_position")
|
||||||
+ " where table_schema = 'novel_plus' and table_name = #{tableName}")
|
List<Map<String, String>> listColumns(String tableName);
|
||||||
Map<String, String> get(String tableName);
|
|
||||||
|
|
||||||
@Select(
|
@Select("select column_name columnName, data_type dataType, column_comment columnComment, column_key columnKey, extra from information_schema.columns\r\n"
|
||||||
"select column_name columnName, data_type dataType, column_comment columnComment, column_key columnKey, extra from columns\r\n"
|
+ " where table_name = #{tableName} and table_schema = (select database()) and column_key = 'PRI' limit 1")
|
||||||
+ " 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 columns\r\n"
|
|
||||||
+ " where table_name = #{tableName} and table_schema = 'novel_plus' and column_key = 'PRI' limit 1")
|
|
||||||
Map<String, String> getPriColumn(String tableName);
|
Map<String, String> getPriColumn(String tableName);
|
||||||
}
|
}
|
||||||
|
@ -3,270 +3,219 @@ package com.java2nb.common.domain;
|
|||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 字典表
|
* 字典表
|
||||||
*
|
*
|
||||||
* @author xiongxy
|
* @author xiongxy
|
||||||
* @email 1179705413@qq.com
|
* @email 1179705413@qq.com
|
||||||
* @date 2019-09-29 18:28:07
|
* @date 2019-09-29 18:28:07
|
||||||
*/
|
*/
|
||||||
public class DictDO implements Serializable {
|
public class DictDO implements Serializable {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
//编号
|
||||||
|
private Long id;
|
||||||
|
//标签名
|
||||||
|
private String name;
|
||||||
|
//数据值
|
||||||
|
private String value;
|
||||||
|
//类型
|
||||||
|
private String type;
|
||||||
|
//描述
|
||||||
|
private String description;
|
||||||
|
//排序(升序)
|
||||||
|
private BigDecimal sort;
|
||||||
|
//父级编号
|
||||||
|
private Long parentId;
|
||||||
|
//创建者
|
||||||
|
private Integer createBy;
|
||||||
|
//创建时间
|
||||||
|
private Date createDate;
|
||||||
|
//更新者
|
||||||
|
private Long updateBy;
|
||||||
|
//更新时间
|
||||||
|
private Date updateDate;
|
||||||
|
//备注信息
|
||||||
|
private String remarks;
|
||||||
|
//删除标记
|
||||||
|
private String delFlag;
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
/**
|
||||||
|
* 设置:编号
|
||||||
|
*/
|
||||||
|
public void setId(Long id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获取:编号
|
||||||
|
*/
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 设置:标签名
|
||||||
|
*/
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获取:标签名
|
||||||
|
*/
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 设置:数据值
|
||||||
|
*/
|
||||||
|
public void setValue(String value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获取:数据值
|
||||||
|
*/
|
||||||
|
public String getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 设置:类型
|
||||||
|
*/
|
||||||
|
public void setType(String type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获取:类型
|
||||||
|
*/
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 设置:描述
|
||||||
|
*/
|
||||||
|
public void setDescription(String description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获取:描述
|
||||||
|
*/
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 设置:排序(升序)
|
||||||
|
*/
|
||||||
|
public void setSort(BigDecimal sort) {
|
||||||
|
this.sort = sort;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获取:排序(升序)
|
||||||
|
*/
|
||||||
|
public BigDecimal getSort() {
|
||||||
|
return sort;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 设置:父级编号
|
||||||
|
*/
|
||||||
|
public void setParentId(Long parentId) {
|
||||||
|
this.parentId = parentId;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获取:父级编号
|
||||||
|
*/
|
||||||
|
public Long getParentId() {
|
||||||
|
return parentId;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 设置:创建者
|
||||||
|
*/
|
||||||
|
public void setCreateBy(Integer createBy) {
|
||||||
|
this.createBy = createBy;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获取:创建者
|
||||||
|
*/
|
||||||
|
public Integer getCreateBy() {
|
||||||
|
return createBy;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 设置:创建时间
|
||||||
|
*/
|
||||||
|
public void setCreateDate(Date createDate) {
|
||||||
|
this.createDate = createDate;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获取:创建时间
|
||||||
|
*/
|
||||||
|
public Date getCreateDate() {
|
||||||
|
return createDate;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 设置:更新者
|
||||||
|
*/
|
||||||
|
public void setUpdateBy(Long updateBy) {
|
||||||
|
this.updateBy = updateBy;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获取:更新者
|
||||||
|
*/
|
||||||
|
public Long getUpdateBy() {
|
||||||
|
return updateBy;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 设置:更新时间
|
||||||
|
*/
|
||||||
|
public void setUpdateDate(Date updateDate) {
|
||||||
|
this.updateDate = updateDate;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获取:更新时间
|
||||||
|
*/
|
||||||
|
public Date getUpdateDate() {
|
||||||
|
return updateDate;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 设置:备注信息
|
||||||
|
*/
|
||||||
|
public void setRemarks(String remarks) {
|
||||||
|
this.remarks = remarks;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获取:备注信息
|
||||||
|
*/
|
||||||
|
public String getRemarks() {
|
||||||
|
return remarks;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 设置:删除标记
|
||||||
|
*/
|
||||||
|
public void setDelFlag(String delFlag) {
|
||||||
|
this.delFlag = delFlag;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获取:删除标记
|
||||||
|
*/
|
||||||
|
public String getDelFlag() {
|
||||||
|
return delFlag;
|
||||||
|
}
|
||||||
|
|
||||||
//编号
|
@Override
|
||||||
private Long id;
|
public String toString() {
|
||||||
//标签名
|
return "DictDO{" +
|
||||||
private String name;
|
"id=" + id +
|
||||||
//数据值
|
", name='" + name + '\'' +
|
||||||
private String value;
|
", value='" + value + '\'' +
|
||||||
//类型
|
", type='" + type + '\'' +
|
||||||
private String type;
|
", description='" + description + '\'' +
|
||||||
//描述
|
", sort=" + sort +
|
||||||
private String description;
|
", parentId=" + parentId +
|
||||||
//排序(升序)
|
", createBy=" + createBy +
|
||||||
private BigDecimal sort;
|
", createDate=" + createDate +
|
||||||
//父级编号
|
", updateBy=" + updateBy +
|
||||||
private Long parentId;
|
", updateDate=" + updateDate +
|
||||||
//创建者
|
", remarks='" + remarks + '\'' +
|
||||||
private Integer createBy;
|
", delFlag='" + delFlag + '\'' +
|
||||||
//创建时间
|
'}';
|
||||||
private Date createDate;
|
}
|
||||||
//更新者
|
|
||||||
private Long updateBy;
|
|
||||||
//更新时间
|
|
||||||
private Date updateDate;
|
|
||||||
//备注信息
|
|
||||||
private String remarks;
|
|
||||||
//删除标记
|
|
||||||
private String delFlag;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置:编号
|
|
||||||
*/
|
|
||||||
public void setId(Long id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取:编号
|
|
||||||
*/
|
|
||||||
public Long getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置:标签名
|
|
||||||
*/
|
|
||||||
public void setName(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取:标签名
|
|
||||||
*/
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置:数据值
|
|
||||||
*/
|
|
||||||
public void setValue(String value) {
|
|
||||||
this.value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取:数据值
|
|
||||||
*/
|
|
||||||
public String getValue() {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置:类型
|
|
||||||
*/
|
|
||||||
public void setType(String type) {
|
|
||||||
this.type = type;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取:类型
|
|
||||||
*/
|
|
||||||
public String getType() {
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置:描述
|
|
||||||
*/
|
|
||||||
public void setDescription(String description) {
|
|
||||||
this.description = description;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取:描述
|
|
||||||
*/
|
|
||||||
public String getDescription() {
|
|
||||||
return description;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置:排序(升序)
|
|
||||||
*/
|
|
||||||
public void setSort(BigDecimal sort) {
|
|
||||||
this.sort = sort;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取:排序(升序)
|
|
||||||
*/
|
|
||||||
public BigDecimal getSort() {
|
|
||||||
return sort;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置:父级编号
|
|
||||||
*/
|
|
||||||
public void setParentId(Long parentId) {
|
|
||||||
this.parentId = parentId;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取:父级编号
|
|
||||||
*/
|
|
||||||
public Long getParentId() {
|
|
||||||
return parentId;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置:创建者
|
|
||||||
*/
|
|
||||||
public void setCreateBy(Integer createBy) {
|
|
||||||
this.createBy = createBy;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取:创建者
|
|
||||||
*/
|
|
||||||
public Integer getCreateBy() {
|
|
||||||
return createBy;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置:创建时间
|
|
||||||
*/
|
|
||||||
public void setCreateDate(Date createDate) {
|
|
||||||
this.createDate = createDate;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取:创建时间
|
|
||||||
*/
|
|
||||||
public Date getCreateDate() {
|
|
||||||
return createDate;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置:更新者
|
|
||||||
*/
|
|
||||||
public void setUpdateBy(Long updateBy) {
|
|
||||||
this.updateBy = updateBy;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取:更新者
|
|
||||||
*/
|
|
||||||
public Long getUpdateBy() {
|
|
||||||
return updateBy;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置:更新时间
|
|
||||||
*/
|
|
||||||
public void setUpdateDate(Date updateDate) {
|
|
||||||
this.updateDate = updateDate;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取:更新时间
|
|
||||||
*/
|
|
||||||
public Date getUpdateDate() {
|
|
||||||
return updateDate;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置:备注信息
|
|
||||||
*/
|
|
||||||
public void setRemarks(String remarks) {
|
|
||||||
this.remarks = remarks;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取:备注信息
|
|
||||||
*/
|
|
||||||
public String getRemarks() {
|
|
||||||
return remarks;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置:删除标记
|
|
||||||
*/
|
|
||||||
public void setDelFlag(String delFlag) {
|
|
||||||
this.delFlag = delFlag;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取:删除标记
|
|
||||||
*/
|
|
||||||
public String getDelFlag() {
|
|
||||||
return delFlag;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "DictDO{" +
|
|
||||||
"id=" + id +
|
|
||||||
", name='" + name + '\'' +
|
|
||||||
", value='" + value + '\'' +
|
|
||||||
", type='" + type + '\'' +
|
|
||||||
", description='" + description + '\'' +
|
|
||||||
", sort=" + sort +
|
|
||||||
", parentId=" + parentId +
|
|
||||||
", createBy=" + createBy +
|
|
||||||
", createDate=" + createDate +
|
|
||||||
", updateBy=" + updateBy +
|
|
||||||
", updateDate=" + updateDate +
|
|
||||||
", remarks='" + remarks + '\'' +
|
|
||||||
", delFlag='" + delFlag + '\'' +
|
|
||||||
'}';
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (o == null || getClass() != o.getClass()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
DictDO dictDO = (DictDO) o;
|
|
||||||
return Objects.equals(id, dictDO.id) && Objects.equals(name, dictDO.name)
|
|
||||||
&& Objects.equals(value, dictDO.value) && Objects.equals(type, dictDO.type)
|
|
||||||
&& Objects.equals(description, dictDO.description) && Objects.equals(sort, dictDO.sort)
|
|
||||||
&& Objects.equals(parentId, dictDO.parentId) && Objects.equals(createBy, dictDO.createBy)
|
|
||||||
&& Objects.equals(createDate, dictDO.createDate) && Objects.equals(updateBy,
|
|
||||||
dictDO.updateBy) && Objects.equals(updateDate, dictDO.updateDate) && Objects.equals(remarks,
|
|
||||||
dictDO.remarks) && Objects.equals(delFlag, dictDO.delFlag);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return Objects.hash(id, name, value, type, description, sort, parentId, createBy, createDate, updateBy,
|
|
||||||
updateDate,
|
|
||||||
remarks, delFlag);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -2,27 +2,32 @@ package com.java2nb.common.exception;
|
|||||||
|
|
||||||
|
|
||||||
import com.java2nb.common.utils.R;
|
import com.java2nb.common.utils.R;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.boot.web.servlet.error.ErrorAttributes;
|
import org.springframework.boot.web.servlet.error.ErrorAttributes;
|
||||||
import org.springframework.boot.web.servlet.error.ErrorController;
|
import org.springframework.boot.web.servlet.error.ErrorController;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.servlet.ModelAndView;
|
import org.springframework.web.servlet.ModelAndView;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
public class MainsiteErrorController implements ErrorController {
|
public class MainsiteErrorController implements ErrorController {
|
||||||
|
private Logger logger = LoggerFactory.getLogger(getClass());
|
||||||
private static final String ERROR_PATH = "/error";
|
private static final String ERROR_PATH = "/error";
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
ErrorAttributes errorAttributes;
|
ErrorAttributes errorAttributes;
|
||||||
|
|
||||||
@RequestMapping(
|
@RequestMapping(
|
||||||
value = {ERROR_PATH},
|
value = {ERROR_PATH},
|
||||||
produces = {"text/html"}
|
produces = {"text/html"}
|
||||||
)
|
)
|
||||||
public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
|
public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
|
||||||
int code = response.getStatus();
|
int code = response.getStatus();
|
||||||
@ -53,4 +58,9 @@ public class MainsiteErrorController implements ErrorController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getErrorPath() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return ERROR_PATH;
|
||||||
|
}
|
||||||
}
|
}
|
@ -1,8 +1,5 @@
|
|||||||
package com.java2nb.common.service.impl;
|
package com.java2nb.common.service.impl;
|
||||||
|
|
||||||
import com.java2nb.common.dao.DictDao;
|
|
||||||
import com.java2nb.common.domain.DictDO;
|
|
||||||
import com.java2nb.common.service.DictService;
|
|
||||||
import com.java2nb.common.utils.StringUtils;
|
import com.java2nb.common.utils.StringUtils;
|
||||||
import com.java2nb.system.domain.UserDO;
|
import com.java2nb.system.domain.UserDO;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@ -12,12 +9,14 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
import com.java2nb.common.dao.DictDao;
|
||||||
|
import com.java2nb.common.domain.DictDO;
|
||||||
|
import com.java2nb.common.service.DictService;
|
||||||
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class DictServiceImpl implements DictService {
|
public class DictServiceImpl implements DictService {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private DictDao dictDao;
|
private DictDao dictDao;
|
||||||
|
|
||||||
@ -59,7 +58,7 @@ public class DictServiceImpl implements DictService {
|
|||||||
@Override
|
@Override
|
||||||
|
|
||||||
public List<DictDO> listType() {
|
public List<DictDO> listType() {
|
||||||
return dictDao.listType().stream().distinct().collect(Collectors.toList());
|
return dictDao.listType();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1,74 +1,72 @@
|
|||||||
package com.java2nb.common.service.impl;
|
package com.java2nb.common.service.impl;
|
||||||
|
|
||||||
import com.java2nb.common.config.Constant;
|
|
||||||
import com.java2nb.common.config.JnConfig;
|
import com.java2nb.common.config.JnConfig;
|
||||||
import com.java2nb.common.dao.FileDao;
|
|
||||||
import com.java2nb.common.domain.FileDO;
|
|
||||||
import com.java2nb.common.service.FileService;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.java2nb.common.dao.FileDao;
|
||||||
|
import com.java2nb.common.domain.FileDO;
|
||||||
|
import com.java2nb.common.service.FileService;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class FileServiceImpl implements FileService {
|
public class FileServiceImpl implements FileService {
|
||||||
|
@Autowired
|
||||||
|
private FileDao sysFileMapper;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private FileDao sysFileMapper;
|
private JnConfig jnConfig;
|
||||||
|
@Override
|
||||||
@Autowired
|
public FileDO get(Long id){
|
||||||
private JnConfig jnConfig;
|
return sysFileMapper.get(id);
|
||||||
|
}
|
||||||
@Override
|
|
||||||
public FileDO get(Long id) {
|
@Override
|
||||||
return sysFileMapper.get(id);
|
public List<FileDO> list(Map<String, Object> map){
|
||||||
}
|
return sysFileMapper.list(map);
|
||||||
|
}
|
||||||
@Override
|
|
||||||
public List<FileDO> list(Map<String, Object> map) {
|
@Override
|
||||||
return sysFileMapper.list(map);
|
public int count(Map<String, Object> map){
|
||||||
}
|
return sysFileMapper.count(map);
|
||||||
|
}
|
||||||
@Override
|
|
||||||
public int count(Map<String, Object> map) {
|
@Override
|
||||||
return sysFileMapper.count(map);
|
public int save(FileDO sysFile){
|
||||||
}
|
return sysFileMapper.save(sysFile);
|
||||||
|
}
|
||||||
@Override
|
|
||||||
public int save(FileDO sysFile) {
|
@Override
|
||||||
return sysFileMapper.save(sysFile);
|
public int update(FileDO sysFile){
|
||||||
}
|
return sysFileMapper.update(sysFile);
|
||||||
|
}
|
||||||
@Override
|
|
||||||
public int update(FileDO sysFile) {
|
@Override
|
||||||
return sysFileMapper.update(sysFile);
|
public int remove(Long id){
|
||||||
}
|
return sysFileMapper.remove(id);
|
||||||
|
}
|
||||||
@Override
|
|
||||||
public int remove(Long id) {
|
@Override
|
||||||
return sysFileMapper.remove(id);
|
public int batchRemove(Long[] ids){
|
||||||
}
|
return sysFileMapper.batchRemove(ids);
|
||||||
|
}
|
||||||
@Override
|
|
||||||
public int batchRemove(Long[] ids) {
|
|
||||||
return sysFileMapper.batchRemove(ids);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Boolean isExist(String url) {
|
public Boolean isExist(String url) {
|
||||||
Boolean isExist = false;
|
Boolean isExist = false;
|
||||||
if (!StringUtils.isEmpty(url)) {
|
if (!StringUtils.isEmpty(url)) {
|
||||||
String filePath = url.replace(Constant.UPLOAD_FILES_PREFIX, "");
|
String filePath = url.replace("/files/", "");
|
||||||
filePath = jnConfig.getUploadPath() + filePath;
|
filePath = jnConfig.getUploadPath() + filePath;
|
||||||
File file = new File(filePath);
|
File file = new File(filePath);
|
||||||
if (file.exists()) {
|
if (file.exists()) {
|
||||||
isExist = true;
|
isExist = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return isExist;
|
return isExist;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,14 +1,10 @@
|
|||||||
package com.java2nb.common.utils;
|
package com.java2nb.common.utils;
|
||||||
|
|
||||||
import lombok.SneakyThrows;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Calendar;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 日期处理
|
* 日期处理
|
||||||
@ -95,37 +91,4 @@ public class DateUtils {
|
|||||||
r += "前";
|
r += "前";
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取过去第几天的日期
|
|
||||||
*
|
|
||||||
* @param past
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@SneakyThrows
|
|
||||||
public static String getPastDate(int past,Date date) {
|
|
||||||
Calendar calendar = Calendar.getInstance();
|
|
||||||
calendar.setTime(date);
|
|
||||||
calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) - past);
|
|
||||||
Date today = calendar.getTime();
|
|
||||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
|
||||||
return sdf.format(today);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取过去几天的日期集合
|
|
||||||
*
|
|
||||||
* @param past
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public static List<String> getDateList(int past,Date date) {
|
|
||||||
List<String> result = new ArrayList<>(past);
|
|
||||||
for(int i = past - 1 ; i > 0 ; i--){
|
|
||||||
result.add(getPastDate(i,date));
|
|
||||||
}
|
|
||||||
//今天的日期
|
|
||||||
result.add(new SimpleDateFormat("yyyy-MM-dd").format(date));
|
|
||||||
return result;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.java2nb.common.utils;
|
package com.java2nb.common.utils;
|
||||||
|
|
||||||
|
import com.alibaba.druid.util.StringUtils;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
|
||||||
@ -7,80 +8,79 @@ import java.util.HashMap;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class JSONUtils {
|
public class JSONUtils {
|
||||||
|
/**
|
||||||
|
* Bean对象转JSON
|
||||||
|
*
|
||||||
|
* @param object
|
||||||
|
* @param dataFormatString
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String beanToJson(Object object, String dataFormatString) {
|
||||||
|
if (object != null) {
|
||||||
|
if (StringUtils.isEmpty(dataFormatString)) {
|
||||||
|
return JSONObject.toJSONString(object);
|
||||||
|
}
|
||||||
|
return JSON.toJSONStringWithDateFormat(object, dataFormatString);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bean对象转JSON
|
* Bean对象转JSON
|
||||||
*
|
*
|
||||||
* @param object
|
* @param object
|
||||||
* @param dataFormatString
|
* @return
|
||||||
* @return
|
*/
|
||||||
*/
|
public static String beanToJson(Object object) {
|
||||||
public static String beanToJson(Object object, String dataFormatString) {
|
if (object != null) {
|
||||||
if (object != null) {
|
return JSON.toJSONString(object);
|
||||||
if (StringUtils.isEmpty(dataFormatString)) {
|
} else {
|
||||||
return JSONObject.toJSONString(object);
|
return null;
|
||||||
}
|
}
|
||||||
return JSON.toJSONStringWithDateFormat(object, dataFormatString);
|
}
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bean对象转JSON
|
* String转JSON字符串
|
||||||
*
|
*
|
||||||
* @param object
|
* @param key
|
||||||
* @return
|
* @param value
|
||||||
*/
|
* @return
|
||||||
public static String beanToJson(Object object) {
|
*/
|
||||||
if (object != null) {
|
public static String stringToJsonByFastjson(String key, String value) {
|
||||||
return JSON.toJSONString(object);
|
if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {
|
||||||
} else {
|
return null;
|
||||||
return null;
|
}
|
||||||
}
|
Map<String, String> map = new HashMap<String, String>(16);
|
||||||
}
|
map.put(key, value);
|
||||||
|
return beanToJson(map, null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* String转JSON字符串
|
* 将json字符串转换成对象
|
||||||
*
|
*
|
||||||
* @param key
|
* @param json
|
||||||
* @param value
|
* @param clazz
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static String stringToJsonByFastjson(String key, String value) {
|
public static Object jsonToBean(String json, Object clazz) {
|
||||||
if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {
|
if (StringUtils.isEmpty(json) || clazz == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
Map<String, String> map = new HashMap<String, String>(16);
|
return JSON.parseObject(json, clazz.getClass());
|
||||||
map.put(key, value);
|
}
|
||||||
return beanToJson(map, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 将json字符串转换成对象
|
* json字符串转map
|
||||||
*
|
*
|
||||||
* @param json
|
* @param json
|
||||||
* @param clazz
|
* @return
|
||||||
* @return
|
*/
|
||||||
*/
|
@SuppressWarnings("unchecked")
|
||||||
public static Object jsonToBean(String json, Object clazz) {
|
public static Map<String, Object> jsonToMap(String json) {
|
||||||
if (StringUtils.isEmpty(json) || clazz == null) {
|
if (StringUtils.isEmpty(json)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return JSON.parseObject(json, clazz.getClass());
|
return JSON.parseObject(json, Map.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* json字符串转map
|
|
||||||
*
|
|
||||||
* @param json
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public static Map<String, Object> jsonToMap(String json) {
|
|
||||||
if (StringUtils.isEmpty(json)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return JSON.parseObject(json, Map.class);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,601 @@
|
|||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -14,7 +14,7 @@ public class XssAndSqlHttpServletRequestWrapper extends HttpServletRequestWrappe
|
|||||||
/**
|
/**
|
||||||
* 假如有有html 代码是自己传来的 需要设定对应的name 不过滤
|
* 假如有有html 代码是自己传来的 需要设定对应的name 不过滤
|
||||||
*/
|
*/
|
||||||
private static final List<String> noFilterNames = Arrays.asList("attach","push_ip","content");
|
private static final List<String> noFilterNames = Arrays.asList("attach","push_ip");
|
||||||
|
|
||||||
public XssAndSqlHttpServletRequestWrapper(HttpServletRequest request) {
|
public XssAndSqlHttpServletRequestWrapper(HttpServletRequest request) {
|
||||||
super(request);
|
super(request);
|
||||||
|