Compare commits

...

275 Commits

Author SHA1 Message Date
dependabot[bot]
f846416899 build(deps): bump druid from 1.2.6 to 1.2.16
Bumps [druid](https://github.com/alibaba/druid) from 1.2.6 to 1.2.16.
- [Release notes](https://github.com/alibaba/druid/releases)
- [Commits](https://github.com/alibaba/druid/compare/1.2.6...1.2.16)

---
updated-dependencies:
- dependency-name: com.alibaba:druid
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-01 09:58:19 +00:00
2a3ae4a376 调整 2022-12-02 21:49:31 +08:00
92e818e370 调整 2022-12-02 21:27:47 +08:00
禾几海
c8e93c45c7 Merge pull request #74 from xiaohai2271/dependabot/maven/com.alibaba-druid-1.2.6
build(deps): bump druid from 1.2.5 to 1.2.6
2021-06-02 10:57:25 +08:00
禾几海
32de31a21e Merge pull request #75 from xiaohai2271/dependabot/maven/org.mybatis.spring.boot-mybatis-spring-boot-starter-2.2.0
build(deps): bump mybatis-spring-boot-starter from 2.1.4 to 2.2.0
2021-06-02 10:57:04 +08:00
禾几海
cc20df91e6 Merge pull request #63 from xiaohai2271/dependabot/maven/org.projectlombok-lombok-1.18.20
build(deps): bump lombok from 1.18.18 to 1.18.20
2021-06-01 23:30:23 +08:00
dependabot[bot]
71d79ed008 build(deps): bump mybatis-spring-boot-starter from 2.1.4 to 2.2.0
Bumps [mybatis-spring-boot-starter](https://github.com/mybatis/spring-boot-starter) from 2.1.4 to 2.2.0.
- [Release notes](https://github.com/mybatis/spring-boot-starter/releases)
- [Commits](https://github.com/mybatis/spring-boot-starter/compare/mybatis-spring-boot-2.1.4...mybatis-spring-boot-2.2.0)

---
updated-dependencies:
- dependency-name: org.mybatis.spring.boot:mybatis-spring-boot-starter
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-01 15:30:00 +00:00
dependabot[bot]
f7ff494ea4 build(deps): bump druid from 1.2.5 to 1.2.6
Bumps [druid](https://github.com/alibaba/druid) from 1.2.5 to 1.2.6.
- [Release notes](https://github.com/alibaba/druid/releases)
- [Commits](https://github.com/alibaba/druid/compare/1.2.5...1.2.6)

---
updated-dependencies:
- dependency-name: com.alibaba:druid
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-01 15:29:55 +00:00
禾几海
971f48c5f9 Merge pull request #72 from xiaohai2271/dependabot/maven/org.jetbrains.kotlin-kotlin-maven-plugin-1.5.10
build(deps): bump kotlin-maven-plugin from 1.4.10 to 1.5.10
2021-06-01 23:29:54 +08:00
禾几海
e1522a8cc1 Merge pull request #73 from xiaohai2271/dependabot/maven/net.minidev-json-smart-2.4.7
build(deps): bump json-smart from 2.3 to 2.4.7
2021-06-01 23:29:32 +08:00
dependabot[bot]
3cc4989960 build(deps): bump json-smart from 2.3 to 2.4.7
Bumps [json-smart](https://github.com/netplex/json-smart-v2) from 2.3 to 2.4.7.
- [Release notes](https://github.com/netplex/json-smart-v2/releases)
- [Commits](https://github.com/netplex/json-smart-v2/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-01 05:22:45 +00:00
dependabot[bot]
8c751e6e76 build(deps): bump kotlin-maven-plugin from 1.4.10 to 1.5.10
Bumps kotlin-maven-plugin from 1.4.10 to 1.5.10.

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-01 05:22:39 +00:00
dependabot[bot]
af47631126 build(deps): bump lombok from 1.18.18 to 1.18.20
Bumps [lombok](https://github.com/rzwitserloot/lombok) from 1.18.18 to 1.18.20.
- [Release notes](https://github.com/rzwitserloot/lombok/releases)
- [Changelog](https://github.com/projectlombok/lombok/blob/master/doc/changelog.markdown)
- [Commits](https://github.com/rzwitserloot/lombok/compare/v1.18.18...v1.18.20)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-01 05:24:17 +00:00
禾几海
2107a1c100 Merge pull request #49 from xiaohai2271/dependabot/maven/com.squareup.okhttp3-okhttp-4.9.1
build(deps): bump okhttp from 4.9.0 to 4.9.1
2021-04-01 14:14:35 +08:00
禾几海
2eac16dbe4 Merge pull request #52 from xiaohai2271/dependabot/maven/com.alibaba-druid-1.2.5
build(deps): bump druid from 1.2.3 to 1.2.5
2021-04-01 14:12:39 +08:00
禾几海
d248e15cea fix: 规范请求头的token
规范为` Authorization: Bearer $token`
2021-03-16 20:09:06 +08:00
禾几海
91a818d293 fix: sql条件错误 2021-03-16 15:54:26 +08:00
禾几海
65c31e96b4 test: 补增单元测试 2021-03-16 15:45:49 +08:00
禾几海
81b4851e42 refactor: 分页查询
通过数据库进行分页查询而非查询全部然后分页
2021-03-16 15:38:49 +08:00
禾几海
9c580cf6d9 fix: 文章不可见
当open字段为false时文章应当不被感知
而之前的版本并没有做强制要求
2021-03-16 15:30:05 +08:00
禾几海
9eea5b3db9 ci: Sync repository to gitee 2021-03-15 22:12:49 +08:00
禾几海
eacb2e29f3 fix: 修复数据异常 2021-03-15 18:51:53 +08:00
禾几海
fafee4f918 fix: 分页数据异常 2021-03-15 17:31:37 +08:00
dependabot[bot]
30a4c11366 build(deps): bump druid from 1.2.3 to 1.2.5
Bumps [druid](https://github.com/alibaba/druid) from 1.2.3 to 1.2.5.
- [Release notes](https://github.com/alibaba/druid/releases)
- [Commits](https://github.com/alibaba/druid/compare/1.2.3...1.2.5)

Signed-off-by: dependabot[bot] <support@github.com>
2021-03-01 05:31:55 +00:00
禾几海
5632d47674 Merge pull request #48 from xiaohai2271/dependabot/maven/org.projectlombok-lombok-1.18.18
build(deps): bump lombok from 1.18.16 to 1.18.18
2021-02-28 22:24:55 +08:00
dependabot[bot]
15b5d89554 build(deps): bump okhttp from 4.9.0 to 4.9.1
Bumps [okhttp](https://github.com/square/okhttp) from 4.9.0 to 4.9.1.
- [Release notes](https://github.com/square/okhttp/releases)
- [Changelog](https://github.com/square/okhttp/blob/master/CHANGELOG.md)
- [Commits](https://github.com/square/okhttp/compare/parent-4.9.0...parent-4.9.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-02-01 05:28:43 +00:00
dependabot[bot]
79426dbe24 build(deps): bump lombok from 1.18.16 to 1.18.18
Bumps [lombok](https://github.com/rzwitserloot/lombok) from 1.18.16 to 1.18.18.
- [Release notes](https://github.com/rzwitserloot/lombok/releases)
- [Changelog](https://github.com/rzwitserloot/lombok/blob/master/doc/changelog.markdown)
- [Commits](https://github.com/rzwitserloot/lombok/compare/v1.18.16...v1.18.18)

Signed-off-by: dependabot[bot] <support@github.com>
2021-02-01 05:28:40 +00:00
禾几海
b3b19dbc45 Merge pull request #38 from xiaohai2271/dependabot/maven/net.sourceforge.htmlunit-htmlunit-2.45.0
build(deps): bump htmlunit from 2.44.0 to 2.45.0
2020-12-02 11:00:34 +08:00
禾几海
87ec6d24ca Merge pull request #37 from xiaohai2271/dependabot/maven/org.mybatis.spring.boot-mybatis-spring-boot-starter-2.1.4
build(deps): bump mybatis-spring-boot-starter from 2.1.3 to 2.1.4
2020-12-01 14:08:15 +08:00
禾几海
0148c5e3f5 Merge pull request #39 from xiaohai2271/dependabot/maven/com.alibaba-druid-1.2.3
build(deps): bump druid from 1.2.1 to 1.2.3
2020-12-01 14:04:58 +08:00
禾几海
7cff3b9c08 Merge pull request #40 from xiaohai2271/dependabot/maven/com.sun.xml.bind-jaxb-impl-3.0.0
build(deps): bump jaxb-impl from 2.3.3 to 3.0.0
2020-12-01 14:02:35 +08:00
禾几海
a354f48edf Merge pull request #41 from xiaohai2271/dependabot/maven/org.jetbrains.kotlin-kotlin-stdlib-1.4.20
build(deps): bump kotlin-stdlib from 1.4.10 to 1.4.20
2020-12-01 14:02:02 +08:00
dependabot[bot]
2cd2dc93d7 build(deps): bump kotlin-stdlib from 1.4.10 to 1.4.20
Bumps [kotlin-stdlib](https://github.com/JetBrains/kotlin) from 1.4.10 to 1.4.20.
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v1.4.10...v1.4.20)

Signed-off-by: dependabot[bot] <support@github.com>
2020-12-01 05:39:35 +00:00
dependabot[bot]
d5fbc0fbf1 build(deps): bump jaxb-impl from 2.3.3 to 3.0.0
Bumps jaxb-impl from 2.3.3 to 3.0.0.

Signed-off-by: dependabot[bot] <support@github.com>
2020-12-01 05:39:09 +00:00
dependabot[bot]
b29362eb8c build(deps): bump druid from 1.2.1 to 1.2.3
Bumps [druid](https://github.com/alibaba/druid) from 1.2.1 to 1.2.3.
- [Release notes](https://github.com/alibaba/druid/releases)
- [Commits](https://github.com/alibaba/druid/compare/1.2.1...1.2.3)

Signed-off-by: dependabot[bot] <support@github.com>
2020-12-01 05:39:07 +00:00
dependabot[bot]
d7c6cca683 build(deps): bump htmlunit from 2.44.0 to 2.45.0
Bumps [htmlunit](https://github.com/HtmlUnit/htmlunit) from 2.44.0 to 2.45.0.
- [Release notes](https://github.com/HtmlUnit/htmlunit/releases)
- [Commits](https://github.com/HtmlUnit/htmlunit/compare/2.44.0...2.45.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-12-01 05:39:03 +00:00
dependabot[bot]
8020eaeff3 build(deps): bump mybatis-spring-boot-starter from 2.1.3 to 2.1.4
Bumps [mybatis-spring-boot-starter](https://github.com/mybatis/spring-boot-starter) from 2.1.3 to 2.1.4.
- [Release notes](https://github.com/mybatis/spring-boot-starter/releases)
- [Commits](https://github.com/mybatis/spring-boot-starter/compare/mybatis-spring-boot-2.1.3...mybatis-spring-boot-2.1.4)

Signed-off-by: dependabot[bot] <support@github.com>
2020-12-01 05:39:02 +00:00
禾几海
aedcaf207b ci: skip ci action situation
[skip ci]
2020-11-14 21:38:58 +08:00
禾几海
af9bf9ef46 ci: skip ci action situation 2020-11-14 21:27:44 +08:00
禾几海
b38ce4c8ce Update dependabot.yml 2020-11-02 15:04:20 +08:00
禾几海
3d3548b984 Merge pull request #27 from xiaohai2271/dependabot/maven/com.youbenzi-MDTool-1.2.4
build(deps): bump MDTool from 1.2.3 to 1.2.4
2020-11-01 19:12:55 +08:00
禾几海
4be9eda566 Merge pull request #28 from xiaohai2271/dependabot/maven/com.dyuproject.protostuff-protostuff-runtime-1.1.6
build(deps): bump protostuff-runtime from 1.0.8 to 1.1.6
2020-11-01 19:12:14 +08:00
禾几海
e5711746fb Merge pull request #29 from xiaohai2271/dependabot/maven/org.mybatis.spring.boot-mybatis-spring-boot-starter-2.1.3
build(deps): bump mybatis-spring-boot-starter from 2.0.1 to 2.1.3
2020-11-01 19:11:36 +08:00
禾几海
cc9cf8b1e8 Merge pull request #31 from xiaohai2271/dependabot/maven/com.alibaba-druid-1.2.1
build(deps): bump druid from 1.1.14 to 1.2.1
2020-10-27 13:22:10 +08:00
禾几海
ff076f8366 Merge pull request #32 from xiaohai2271/dependabot/maven/com.squareup.okhttp3-okhttp-4.9.0
build(deps): bump okhttp from 4.8.0 to 4.9.0
2020-10-27 13:17:27 +08:00
禾几海
dd9ae0b3f9 Merge pull request #30 from xiaohai2271/dependabot/maven/eu.bitwalker-UserAgentUtils-1.21
build(deps): bump UserAgentUtils from 1.20 to 1.21
2020-10-22 22:37:46 +08:00
dependabot[bot]
0e7d5f2d23 build(deps): bump okhttp from 4.8.0 to 4.9.0
Bumps [okhttp](https://github.com/square/okhttp) from 4.8.0 to 4.9.0.
- [Release notes](https://github.com/square/okhttp/releases)
- [Changelog](https://github.com/square/okhttp/blob/master/CHANGELOG.md)
- [Commits](https://github.com/square/okhttp/compare/parent-4.8.0...parent-4.9.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-20 16:17:29 +00:00
dependabot[bot]
1de1af2a54 build(deps): bump druid from 1.1.14 to 1.2.1
Bumps [druid](https://github.com/alibaba/druid) from 1.1.14 to 1.2.1.
- [Release notes](https://github.com/alibaba/druid/releases)
- [Commits](https://github.com/alibaba/druid/compare/1.1.14...1.2.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-20 16:17:25 +00:00
dependabot[bot]
857a3d9473 build(deps): bump UserAgentUtils from 1.20 to 1.21
Bumps [UserAgentUtils](https://github.com/HaraldWalker/user-agent-utils) from 1.20 to 1.21.
- [Release notes](https://github.com/HaraldWalker/user-agent-utils/releases)
- [Commits](https://github.com/HaraldWalker/user-agent-utils/compare/1.20...1.21)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-20 16:17:24 +00:00
dependabot[bot]
78efa62476 build(deps): bump protostuff-runtime from 1.0.8 to 1.1.6
Bumps protostuff-runtime from 1.0.8 to 1.1.6.

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-20 16:17:22 +00:00
dependabot[bot]
674812c5c6 build(deps): bump mybatis-spring-boot-starter from 2.0.1 to 2.1.3
Bumps [mybatis-spring-boot-starter](https://github.com/mybatis/spring-boot-starter) from 2.0.1 to 2.1.3.
- [Release notes](https://github.com/mybatis/spring-boot-starter/releases)
- [Commits](https://github.com/mybatis/spring-boot-starter/compare/mybatis-spring-boot-2.0.1...mybatis-spring-boot-2.1.3)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-20 16:17:22 +00:00
dependabot[bot]
14ce46c312 build(deps): bump MDTool from 1.2.3 to 1.2.4
Bumps [MDTool](https://github.com/cevin15/MDTool) from 1.2.3 to 1.2.4.
- [Release notes](https://github.com/cevin15/MDTool/releases)
- [Commits](https://github.com/cevin15/MDTool/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-20 16:17:21 +00:00
禾几海
5f5fbadfd8 Merge pull request #15 from xiaohai2271/dependabot/maven/com.sun.xml.bind-jaxb-core-2.3.0.1
build(deps): bump jaxb-core from 2.3.0 to 2.3.0.1
2020-10-21 00:11:48 +08:00
禾几海
c153d9a0e3 Merge pull request #16 from xiaohai2271/dependabot/maven/org.jetbrains.kotlin-kotlin-maven-plugin-1.4.10
build(deps): bump kotlin-maven-plugin from 1.3.72 to 1.4.10
2020-10-21 00:11:25 +08:00
禾几海
18d35809f5 Merge pull request #17 from xiaohai2271/dependabot/maven/com.sun.xml.bind-jaxb-impl-2.3.3
build(deps): bump jaxb-impl from 2.3.0 to 2.3.3
2020-10-21 00:11:00 +08:00
禾几海
75e2424f75 Merge pull request #22 from xiaohai2271/dependabot/maven/javax.xml.bind-jaxb-api-2.3.1
build(deps): bump jaxb-api from 2.3.0 to 2.3.1
2020-10-21 00:10:24 +08:00
禾几海
b6c4251198 Merge pull request #21 from xiaohai2271/dependabot/maven/com.github.pagehelper-pagehelper-spring-boot-starter-1.3.0
build(deps): bump pagehelper-spring-boot-starter from 1.2.12 to 1.3.0
2020-10-21 00:08:04 +08:00
禾几海
fc1bfa0e4f Merge pull request #19 from xiaohai2271/dependabot/maven/org.jetbrains.kotlin-kotlin-stdlib-1.4.10
build(deps): bump kotlin-stdlib from 1.3.72 to 1.4.10
2020-10-21 00:07:25 +08:00
禾几海
e37de0e177 Merge pull request #20 from xiaohai2271/dependabot/maven/com.dyuproject.protostuff-protostuff-core-1.1.6
build(deps): bump protostuff-core from 1.0.8 to 1.1.6
2020-10-21 00:06:58 +08:00
dependabot[bot]
082662af66 build(deps): bump protostuff-core from 1.0.8 to 1.1.6
Bumps protostuff-core from 1.0.8 to 1.1.6.

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-20 15:11:14 +00:00
dependabot[bot]
0c0e2404d0 Merge pull request #26 from xiaohai2271/dependabot/maven/org.projectlombok-lombok-1.18.16 2020-10-20 14:59:05 +00:00
dependabot[bot]
71f82bfe32 build(deps): bump lombok from 1.18.6 to 1.18.16
Bumps [lombok](https://github.com/rzwitserloot/lombok) from 1.18.6 to 1.18.16.
- [Release notes](https://github.com/rzwitserloot/lombok/releases)
- [Changelog](https://github.com/rzwitserloot/lombok/blob/master/doc/changelog.markdown)
- [Commits](https://github.com/rzwitserloot/lombok/compare/v1.18.6...v1.18.16)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-20 07:06:17 +00:00
禾几海
61ce2fddad Merge pull request #24 from xiaohai2271/dependabot/maven/net.sourceforge.htmlunit-htmlunit-2.44.0
build(deps): bump htmlunit from 2.42.0 to 2.44.0
2020-10-20 13:03:25 +08:00
禾几海
a245f259f7 revert: "Update test.yml"
This reverts commit 2c85c3ea
2020-10-17 23:28:58 +08:00
禾几海
aa22369b13 Merge pull request #25 from kingzhongking/master
style(pom):  delete some comment
2020-10-17 22:51:00 +08:00
kingzhongking
8c3866afe6 style(pom): delete some comment 2020-10-17 14:44:29 +00:00
禾几海
2c85c3eaac Update test.yml 2020-10-16 19:32:36 +08:00
dependabot[bot]
2559937e02 build(deps): bump htmlunit from 2.42.0 to 2.44.0
Bumps [htmlunit](https://github.com/HtmlUnit/htmlunit) from 2.42.0 to 2.44.0.
- [Release notes](https://github.com/HtmlUnit/htmlunit/releases)
- [Commits](https://github.com/HtmlUnit/htmlunit/compare/2.42.0...2.44.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-16 11:21:27 +00:00
dependabot[bot]
8de4be602e build(deps): bump jaxb-api from 2.3.0 to 2.3.1
Bumps [jaxb-api](https://github.com/javaee/jaxb-spec) from 2.3.0 to 2.3.1.
- [Release notes](https://github.com/javaee/jaxb-spec/releases)
- [Commits](https://github.com/javaee/jaxb-spec/compare/2.3.0...2.3.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-16 11:21:23 +00:00
dependabot[bot]
1f88995884 build(deps): bump pagehelper-spring-boot-starter from 1.2.12 to 1.3.0
Bumps pagehelper-spring-boot-starter from 1.2.12 to 1.3.0.

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-16 11:21:23 +00:00
禾几海
c879fbff5f Update dependabot.yml 2020-10-16 19:21:00 +08:00
dependabot[bot]
f6020bf8d0 build(deps): bump kotlin-stdlib from 1.3.72 to 1.4.10
Bumps [kotlin-stdlib](https://github.com/JetBrains/kotlin) from 1.3.72 to 1.4.10.
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/v1.4.10/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v1.3.72...v1.4.10)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-16 11:09:51 +00:00
dependabot[bot]
418b1d78e5 build(deps): bump jaxb-impl from 2.3.0 to 2.3.3
Bumps jaxb-impl from 2.3.0 to 2.3.3.

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-16 11:09:20 +00:00
dependabot[bot]
98ed489bb1 build(deps): bump kotlin-maven-plugin from 1.3.72 to 1.4.10
Bumps kotlin-maven-plugin from 1.3.72 to 1.4.10.

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-16 11:09:19 +00:00
dependabot[bot]
cfdd818829 build(deps): bump jaxb-core from 2.3.0 to 2.3.0.1
Bumps jaxb-core from 2.3.0 to 2.3.0.1.

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-16 11:09:18 +00:00
禾几海
3afbef009f Create dependabot.yml 2020-10-16 19:08:56 +08:00
禾几海
8f4d1cd6c8 Update issue templates 2020-10-15 16:46:31 +08:00
禾几海
0ba7e06695 Merge pull request #12 from xiaohai2271/dependabot/maven/junit-junit-4.13.1
build(deps): bump junit from 4.12 to 4.13.1
2020-10-14 07:56:21 +08:00
dependabot[bot]
512d04f3e9 build(deps): bump junit from 4.12 to 4.13.1
Bumps [junit](https://github.com/junit-team/junit4) from 4.12 to 4.13.1.
- [Release notes](https://github.com/junit-team/junit4/releases)
- [Changelog](https://github.com/junit-team/junit4/blob/main/doc/ReleaseNotes4.12.md)
- [Commits](https://github.com/junit-team/junit4/compare/r4.12...r4.13.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-13 17:49:19 +00:00
禾几海
ada8f67171 Merge remote-tracking branch 'origin/master' 2020-10-09 18:57:42 +08:00
禾几海
6e12331e61 feat: 添加文件上传接口 2020-10-09 18:56:59 +08:00
禾几海
81ee71adf1 Create codeql-analysis.yml 2020-10-03 18:02:48 +08:00
禾几海
7e7332694e docs: typo 2020-09-07 12:28:07 +08:00
禾几海
8db690a55f Update issue templates 2020-09-07 12:23:44 +08:00
禾几海
0b40522e93 feat: 默认返回位置信息 2020-09-05 16:35:45 +08:00
禾几海
9026ba0732 refactor: 简化代码 2020-09-05 15:43:43 +08:00
禾几海
f5f2437fa4 refactor: 简化代码 2020-09-05 15:42:03 +08:00
禾几海
0bcca091e1 refactor: 简化代码 2020-09-04 13:02:36 +08:00
禾几海
3c69baa4ad Merge branch 'feature-ip2region' 2020-09-04 12:29:18 +08:00
禾几海
baf5b1bbb7 feat: 添加对jdk8以上环境的支持 2020-09-04 12:23:15 +08:00
禾几海
38621bcfa4 refactor: 换用ip2region 2020-09-04 12:11:14 +08:00
禾几海
cf435a588f refactor: 添加ip2region 2020-09-04 09:42:55 +08:00
禾几海
feab26f4f7 docs: add some badge 2020-09-01 08:30:26 +08:00
禾几海
578dbe6cc5 docs: api参数变化
- '/admin/articles' deleted 参数   可缺省
- '/admin/users'    status  参数
可缺省
- '/admin/links'    deleted 参数   可缺省
2020-08-31 13:14:37 +08:00
禾几海
f3b03f4853 ci: 调整webhook地址 2020-08-31 13:06:35 +08:00
禾几海
ee85b1f175 Merge pull request #11 from xiaohai2271/dev
分离不同状态的数据
2020-08-31 13:01:09 +08:00
禾几海
925e816f7a fix(login): 账户不存在时引发的空值异常 2020-08-31 12:47:19 +08:00
禾几海
a59bb7f231 feat(login): 非正常账户不可登录 2020-08-31 12:45:49 +08:00
禾几海
7f17c20e01 移除无效脚本 2020-08-31 10:34:34 +08:00
禾几海
6eabb3ab22 refactor: 精简代码 2020-08-31 10:10:21 +08:00
禾几海
72674f4612 test: 补单元测试 2020-08-31 10:02:12 +08:00
禾几海
9b460ff33c feat(link): 分离不同状态的数据 2020-08-31 09:46:15 +08:00
禾几海
a26946a583 feat: 反序列化 2020-08-31 01:10:12 +08:00
禾几海
01407aba7e feat: 分离不同状态的数据 2020-08-31 00:53:48 +08:00
禾几海
a54e04abf3 feat: 序列化 2020-08-31 00:51:01 +08:00
禾几海
450b4a40bd feat(user): 修改status字段类型 2020-08-31 00:17:21 +08:00
禾几海
9f883d12df feat(article): 修改参数 2020-08-30 23:45:18 +08:00
禾几海
c17b56b436 style: 修改部分代码格式 2020-08-30 14:17:34 +08:00
禾几海
b55a50d548 fix(test): 不合理的测试例 2020-08-30 14:01:19 +08:00
禾几海
4c9b193857 Merge branch 'dev' 2020-08-15 16:08:44 +08:00
禾几海
18a8c916c3 Update README.md 2020-08-15 16:07:41 +08:00
禾几海
99f2907621 Update README.md 2020-08-15 16:07:41 +08:00
禾几海
939b06d0a9 切换到jackson(#10)
切换到jackson
2020-08-15 16:05:39 +08:00
禾几海
a7f947a017 fix: 修复部分测试异常 2020-08-15 16:03:22 +08:00
禾几海
40e1f4d6ab fix: 空值异常 2020-08-15 16:00:05 +08:00
禾几海
6b77655c16 style: optimize imports 2020-08-15 15:44:34 +08:00
禾几海
7ff44fd73e Merge branch 'dev' into feature-trans2jackson 2020-08-15 15:33:04 +08:00
禾几海
c9f91bf2c1 fix(test):外键约束引发的异常,替换随机字符串的生成 2020-08-15 15:26:41 +08:00
禾几海
03fcddb971 fix(test):外键约束引发的异常,替换随机字符串的生成 2020-08-15 15:12:07 +08:00
禾几海
dc851e84a4 fix(test): 唯一索引引发的异常 2020-08-15 15:03:16 +08:00
禾几海
b34acee733 refactor: 修改当日剩余时间的计算方法 2020-08-15 15:00:07 +08:00
禾几海
d46dada23a refactor: 替换net.sf.json为fastJson 2020-08-15 14:59:45 +08:00
禾几海
47e5030f52 refactor: 替换net.sf.json为fastJson 2020-08-15 14:39:39 +08:00
禾几海
94c9fc1c46 refactor(Test): 将测试类中随机字符串的生成提到基类中 2020-08-15 12:16:39 +08:00
禾几海
bdcfaef5f8 refactor(Test): 重构 MultipleSubmitFilter 2020-08-15 12:13:08 +08:00
禾几海
3b6439c5cf refactor(Test): 重构 AuthorizationFilter 2020-08-15 12:10:48 +08:00
禾几海
938a051487 refactor(Test): 重构 WebUpdateInfoControllerTest 2020-08-15 12:01:41 +08:00
禾几海
a04b51a82e refactor(Test): 重构 VisitorControllerTest 2020-08-15 11:49:19 +08:00
禾几海
ee4c4bd87e Update README.md 2020-08-15 09:48:19 +08:00
禾几海
e70ad72523 Update README.md 2020-08-15 09:47:34 +08:00
禾几海
c466ddddea 重新配置集成测试(#9) 2020-08-15 02:39:45 +08:00
禾几海
7257f23ef6 refactor(ci): 重新配置ci 2020-08-15 02:27:40 +08:00
禾几海
7c96151830 fix(test): 修复后台服务未开启时测试不通过的情况 2020-08-14 21:37:17 +08:00
禾几海
5a47803611 fix(test): 修改内嵌redis的启动端口 2020-08-14 21:30:40 +08:00
禾几海
af9f243a83 refactor(ci): 重新配置ci 2020-08-14 21:19:53 +08:00
禾几海
3c8abc895a fix(mvnw): 重新生成mvnw 2020-08-14 21:06:14 +08:00
禾几海
9ffa293d24 refactor(Test): 修改上传文件到图床的实现方式 2020-08-14 17:58:08 +08:00
禾几海
d13ab4e522 add(Test): 测试的配置文件 2020-08-14 17:55:36 +08:00
禾几海
2fce2d8a1c refactor(Test): 内嵌redis 2020-08-14 17:17:36 +08:00
禾几海
6eb7d01875 style:修改sql格式 2020-08-14 17:17:35 +08:00
禾几海
aa751dbba1 refactor(Test):内嵌h2 2020-08-14 17:16:49 +08:00
禾几海
14ff60ecfc Update README.md 2020-08-10 16:43:50 +08:00
禾几海
5dae647885 Merge remote-tracking branch 'origin/master' 2020-08-10 16:40:12 +08:00
禾几海
bf2abd6072 Update README.md 2020-08-10 16:39:50 +08:00
禾几海
a62b395a8a Update LICENSE 2020-08-10 16:24:06 +08:00
禾几海
5059859ae4 Update README.md 2020-08-10 16:20:28 +08:00
禾几海
ecdbf8e21c Add Build document 2020-08-10 16:15:43 +08:00
禾几海
c69eee7027 Add api document 2020-08-10 15:59:30 +08:00
禾几海
8e8a7c809d 修复id异常 2020-08-04 22:25:20 +08:00
禾几海
c6a97e4c5b 外键约束 2020-08-04 22:01:02 +08:00
禾几海
d50cd93e55 移动sql位置,开启初始化数据库的设置 2020-08-04 21:47:46 +08:00
禾几海
e32600d892 Update README.md 2020-08-02 11:45:44 +08:00
禾几海
d473b5931b Update test.yml 2020-08-02 11:40:34 +08:00
禾几海
ab6f9d894d Rename deplay.yml to build.yml 2020-08-02 11:38:34 +08:00
禾几海
49ee7c73e2 空值异常 2020-08-01 23:56:10 +08:00
禾几海
4a65df2a7d Update deplay.yml 2020-08-01 21:46:17 +08:00
禾几海
b6c6cda4ae Merge pull request #7 from xiaohai2271/dev
最近的一些修改
2020-08-01 21:26:45 +08:00
禾几海
a9efb1c04d Merge pull request #6 from xiaohai2271/feature-#5
Feature #5  申请友链时自动抓取网页信息
2020-08-01 21:24:46 +08:00
禾几海
4ac430445d remove jacoco 2020-08-01 21:09:29 +08:00
禾几海
7ac3d69da4 单元测试 2020-08-01 12:21:25 +08:00
禾几海
657a200d81 ... 2020-08-01 12:21:03 +08:00
禾几海
85c3541445 修改emailService的bean 2020-08-01 12:20:44 +08:00
禾几海
c6877c2b4a 添加unique约束 2020-08-01 12:19:55 +08:00
禾几海
9e98134003 空值异常 2020-08-01 09:23:48 +08:00
禾几海
7a81d8e4ce 友链申请通过通知,数据防重 2020-08-01 01:41:17 +08:00
禾几海
1b52e27b72 reapply接口 2020-08-01 01:13:15 +08:00
禾几海
cd9d9ff0e6 ... 2020-08-01 01:00:47 +08:00
禾几海
dcf44cefb6 调整,非成功响应情况下返回数据 2020-08-01 01:00:07 +08:00
禾几海
d83e4de9a3 ... 2020-07-31 23:26:30 +08:00
禾几海
9c949576aa 抓取网页信息,进行数据处理 2020-07-31 23:18:05 +08:00
禾几海
85b24891be 使用htmlunit获取js渲染后的数据 2020-07-31 23:16:56 +08:00
禾几海
da95470993 修改异常 2020-07-31 21:49:05 +08:00
禾几海
3b368c92cb 修改数据库字段 2020-07-31 21:19:48 +08:00
禾几海
ad5271f740 添加请求实体,修改请求 2020-07-31 21:19:33 +08:00
禾几海
d2cf640133 调整 2020-07-31 21:19:10 +08:00
禾几海
4a2abc47cc 修改HttpUtil 2020-07-31 21:17:35 +08:00
禾几海
6b29cd39d4 修改getResponse的类型参数 2020-07-31 20:34:00 +08:00
禾几海
69da168fc1 抽离json -> Response 对象的方法 2020-07-31 20:28:37 +08:00
禾几海
f375def613 active-profiles 2020-07-25 17:32:02 +08:00
禾几海
d6cede718b null值异常 2020-07-25 12:08:44 +08:00
禾几海
7922ea558f 调整UserController的测试类 2020-07-25 11:23:03 +08:00
禾几海
f65c96fa2d 调整TagController的测试类 2020-07-24 22:02:24 +08:00
禾几海
af43657b5b null值异常 2020-07-24 21:09:17 +08:00
禾几海
1bfd2d713e . 2020-07-24 21:08:49 +08:00
禾几海
ffed0d5cd0 调整LinkController的测试类 2020-07-24 21:08:40 +08:00
禾几海
b9094c1345 . 2020-07-24 20:24:34 +08:00
禾几海
e9209d1852 调整CommentController的测试类 2020-07-24 20:24:13 +08:00
禾几海
9900605e1a . 2020-07-24 20:06:59 +08:00
禾几海
883a78e872 调整CategoryController的测试类 2020-07-24 20:06:01 +08:00
禾几海
c7016dcf5f 修改getResponse的类型参数 2020-07-24 20:05:17 +08:00
禾几海
526b73b4f8 优化提示 2020-07-24 16:47:26 +08:00
禾几海
66b2b26b15 注销导致token无效的bug 2020-07-24 16:46:35 +08:00
禾几海
f1d3a79919 ... 2020-07-24 13:51:44 +08:00
禾几海
003f74f5f1 调整ArticleController的测试类 2020-07-24 13:49:18 +08:00
禾几海
2f6253c175 抽离json -> Response 对象的方法 2020-07-24 13:48:50 +08:00
禾几海
aa3ee5db72 ... 2020-07-24 00:46:46 +08:00
禾几海
d340ba8218 ... 2020-07-24 00:36:13 +08:00
禾几海
7be1c9dfb0 调整ArticleController的测试类 2020-07-24 00:22:40 +08:00
禾几海
b7f26cbfdb 调整测试基类 2020-07-24 00:21:55 +08:00
禾几海
d9db98849a 调整测试基类 2020-07-23 23:32:42 +08:00
禾几海
6c3645ba15 增加获取已删除数据的选项 2020-07-23 23:08:03 +08:00
禾几海
43a5e2ab2f 抽离Mock请求的方法,过渡到jackson 2020-07-23 23:02:53 +08:00
禾几海
739256424f . 2020-07-18 16:48:04 +08:00
禾几海
3c839ad8ca 数据库建表语句和测试数据 2020-07-18 13:33:33 +08:00
禾几海
efbd5b3d72 删除逻辑 2020-07-18 13:32:50 +08:00
禾几海
5ba7e684fa 生成sitemap过滤文章 2020-07-18 12:32:42 +08:00
禾几海
f7c1726d51 添加deleted字段 2020-07-18 12:30:53 +08:00
禾几海
5504abe3e0 Other.java -> CommonController.java 2020-07-18 12:29:07 +08:00
禾几海
5aeec0cfe4 . 2020-07-11 14:14:36 +08:00
禾几海
e2fe41c2e0 换用knife4j,swaggerUI 2020-07-11 14:12:57 +08:00
禾几海
48f485b378 . 2020-07-11 10:52:24 +08:00
禾几海
6ee8fb65c3 ci 2020-07-11 10:52:13 +08:00
禾几海
de5e40e6b8 pr进行ci测试 2020-05-27 18:30:08 +08:00
禾几海
2106bf4d94 pr 的ci测试 2020-05-27 18:11:27 +08:00
禾几海
72cef158a1 异常 2020-05-27 18:07:55 +08:00
禾几海
d1f08b58c0 Merge pull request #1 from xiaohai2271/dev
调整数据库字段,优化部分接口
2020-05-27 16:45:02 +08:00
禾几海
2ef9073650 调整评论的接口 2020-05-27 16:30:17 +08:00
禾几海
260ae53c8d 调整 2020-05-27 13:28:48 +08:00
禾几海
21adedea84 IDEA代码优化 2020-05-26 14:03:46 +08:00
禾几海
7d7a0fc82d 修改对象类型 2020-05-26 14:01:27 +08:00
禾几海
4770c37f4f 修改Response 2020-05-26 14:00:17 +08:00
禾几海
450978ecd9 修改Response 的date响应字段 2020-05-26 13:59:36 +08:00
禾几海
4035c7e024 更改sql文件 2020-05-26 12:56:57 +08:00
禾几海
7aebaaa98b . 2020-05-26 12:54:51 +08:00
禾几海
03cb04ab06 修复bug 2020-05-26 12:54:24 +08:00
禾几海
aa882406d0 Service,dao层,视图,模型修改 单元测试 2020-05-26 12:34:35 +08:00
禾几海
fde9b8511c Service层修改 单元测试 2020-05-26 00:27:50 +08:00
禾几海
9582725b3a 修改 单元测试 2020-05-26 00:16:09 +08:00
禾几海
2f27578bb0 dao层修改 2020-05-26 00:13:57 +08:00
禾几海
d3757c5880 dao层修改 2020-05-26 00:10:34 +08:00
禾几海
c39dac30fb Service层修改 单元测试 2020-05-26 00:10:09 +08:00
禾几海
73a1d3eadf Service层修改 单元测试 2020-05-25 23:04:41 +08:00
禾几海
4e383b6598 Service层修改 单元测试 2020-05-25 22:48:57 +08:00
禾几海
030aaaca25 Service层修改 单元测试 2020-05-25 22:44:18 +08:00
禾几海
d19e5b6286 Service层修改 单元测试 2020-05-25 22:18:50 +08:00
禾几海
c4ed6602e7 rename method 2020-05-25 22:06:13 +08:00
禾几海
ae7d063fdd Service层修改 单元测试 2020-05-25 22:05:46 +08:00
禾几海
67a1b1faf9 Service层修改 单元测试 2020-05-25 21:43:53 +08:00
禾几海
9e6868b638 dao层修改 单元测试 2020-05-25 14:48:05 +08:00
禾几海
9185ff8f58 dao层修改 单元测试 2020-05-25 13:50:11 +08:00
禾几海
190e1624ca dao层修改 单元测试 2020-05-25 00:20:36 +08:00
禾几海
86b6bae6e6 dao层修改 单元测试 2020-05-25 00:02:26 +08:00
禾几海
0adf936085 dao层修改 单元测试 2020-05-24 23:54:13 +08:00
禾几海
4f63f7b3d5 dao层修改 单元测试 2020-05-24 22:54:51 +08:00
禾几海
0136435a41 dao层修改 单元测试 2020-05-24 22:02:41 +08:00
禾几海
87de48b5a0 dao层修改 单元测试 2020-05-24 22:00:06 +08:00
禾几海
732bbe4444 修改sql 2020-05-24 19:22:38 +08:00
禾几海
9b6293fbeb 修改查询语句 2020-05-23 13:27:30 +08:00
禾几海
bc20173084 数据表改动 2020-05-23 00:16:08 +08:00
禾几海
8b255372dd Merge remote-tracking branch 'origin/master' 2020-05-19 19:56:02 +08:00
小海
f88bf105a9 Update README.md 2020-05-19 19:55:26 +08:00
禾几海
59b7be00eb 添加密码修改的api 2020-05-19 19:53:38 +08:00
禾几海
0e26eab2e6 Merge branch 'dev' 2020-05-18 08:36:19 +08:00
禾几海
2f6a9679da 修复跨域情况下前台获取不到Authorization响应字段 2020-05-18 08:30:50 +08:00
小海
778c2dba58 Update README.md 2020-05-03 22:32:48 +08:00
小海
5b8700930b 修改测试的接口地址 2020-04-23 17:57:05 +08:00
小海
18477706d1 添加github对应的url 2020-04-23 17:30:57 +08:00
小海
cd7e6b6378 修改接口名和响应内容 2020-04-23 16:34:04 +08:00
小海
d934fbe284 提取网络请求部分 2020-04-23 16:12:03 +08:00
小海
55589c6a59 修复响应码错误bug 2020-04-22 15:23:19 +08:00
小海
4ab402ccf8 更新readme 2020-04-17 13:27:21 +08:00
小海
c74aea6c3b 移除gitlab ci 2020-04-17 13:27:06 +08:00
小海
7c2b8d8d28 更新配置文件 2020-04-17 13:01:42 +08:00
小海
6798cae1b8 忘记添加环境变量 2020-04-17 12:41:19 +08:00
小海
ba7a02c5c0 Update mavenpublish.yml 2020-04-17 12:37:35 +08:00
小海
bd50cfc339 Update mavenpublish.yml 2020-04-17 12:13:51 +08:00
小海
e282e16fd3 update mavenpublish.yml 2020-04-17 11:56:43 +08:00
小海
18366b7aa4 Merge branch 'master' of https://github.com/xiaohai2271/blog-backEnd 2020-04-17 11:43:27 +08:00
小海
66dffbfefe 配置ci调整配置文件 2020-04-17 11:29:52 +08:00
小海
a7cd83a6b5 Update mavenpublish.yml 2020-04-17 11:11:12 +08:00
小海
0a5921b66d add github ci 2020-04-17 11:09:48 +08:00
小海
e04238f0c9 更新token 2020-04-16 23:26:41 +08:00
小海
09cb012b14 可能出现为空的情况 2020-04-16 23:25:49 +08:00
小海
922b83e169 修复小bug 2020-04-06 19:47:32 +08:00
小海
1cd6e0d7c9 修改部分api以及响应数据结构 2020-04-06 15:26:41 +08:00
152 changed files with 10667 additions and 4120 deletions

38
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,38 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.

View File

@@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

12
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,12 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: "maven" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "monthly"
open-pull-requests-limit: 10

37
.github/workflows/build.yml vendored Normal file
View File

@@ -0,0 +1,37 @@
# This workflow will build a package using Maven and then publish it to GitHub packages when a release is created
# For more information see: https://github.com/actions/setup-java#apache-maven-with-a-settings-path
name: Build
on:
push:
branches:
- master
jobs:
build:
if: "!contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '.md')" # 如果 commit 信息包含以下关键字则跳过该任务
runs-on: ubuntu-latest
env:
KEY: ${{ secrets.WEB_HOOK_ACCESS_KEY }}
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Sync repository
uses: x-dr/sync-repo-to-gitee@v1.0
env:
# 在 Settings->Secrets 配置 GITEE_KEY
SSH_KEY: ${{ secrets.GITEE_KEY }}
with:
# GitHub存储库的SSH URL.
github-repo: git@github.com:xiaohai2271/blog-backEnd.git
# Gitee存储库的SSH URL.
gitee-repo: git@gitee.com:xiaohai2271/blog-backEnd.git
- name: Deploy
run: mvn -B test --file pom.xml && curl http://bt.celess.cn:2271/hook?access_key=$KEY

71
.github/workflows/codeql-analysis.yml vendored Normal file
View File

@@ -0,0 +1,71 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
name: "CodeQL"
on:
push:
branches: [master]
pull_request:
# The branches below must be a subset of the branches above
branches: [master]
schedule:
- cron: '0 14 * * 2'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
# Override automatic language detection by changing the below list
# Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python']
language: ['java']
# Learn more...
# https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection
steps:
- name: Checkout repository
uses: actions/checkout@v2
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
fetch-depth: 2
# If this run was triggered by a pull request event, then checkout
# the head of the pull request instead of the merge commit.
- run: git checkout HEAD^2
if: ${{ github.event_name == 'pull_request' }}
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

29
.github/workflows/test.yml vendored Normal file
View File

@@ -0,0 +1,29 @@
# This workflow will build a package using Maven and then publish it to GitHub packages when a release is created
# For more information see: https://github.com/actions/setup-java#apache-maven-with-a-settings-path
name: Test
on:
push:
pull_request:
branches: [ master ]
jobs:
build:
if: "!contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '.md')" # 如果 commit 信息包含以下关键字则跳过该任务
runs-on: ubuntu-latest
# env:
# APPLICATION_PROPERTIES_TEST: ${{ secrets.APPLICATION_PROPERTIES_TEST }}
# APPLICATION_PROPERTIES_PROD: ${{ secrets.APPLICATION_PROPERTIES_PROD }}
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Test
run: mvn -B test --file pom.xml

4
.gitignore vendored
View File

@@ -1,8 +1,8 @@
.idea/
*.imi
*.iml
target/
# 本地项目的私有文件
back-end/blog-dev.sql
src/main/resources/application-prod.properties
src/main/resources/application-dev.properties
src/main/resources/application-prod.properties

View File

@@ -1,30 +0,0 @@
image: maven:3.3.9-jdk-8
cache:
paths:
- .m2/repository
stages:
- test
- deploy
test:
stage: test
script:
- cp "$APP_TEST" ./src/main/resources/application-test.properties
- mvn clean test && cat target/site/jacoco/index.html
deploy:
stage: deploy
script:
- cp "$APP_PROD" ./src/main/resources/application-prod.properties
- mvn package -DskipTests
- eval $(ssh-agent -s)
- ssh-add <(echo "$SSH_PRIVATE_KEY" | base64 --decode)
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- ssh-keyscan celess.cn >> ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
- scp target/blog-0.0.1-SNAPSHOT.jar root@celess.cn:/www/wwwroot/api.celess.cn
- ssh root@celess.cn "cd /www/wwwroot/api.celess.cn && bash build.sh"

View File

@@ -1,11 +1,11 @@
/*
* Copyright 2012-2019 the original author or authors.
* Copyright 2007-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.net.*;
import java.io.*;
import java.nio.channels.*;
@@ -21,12 +20,12 @@ import java.util.Properties;
public class MavenWrapperDownloader {
private static final String WRAPPER_VERSION = "0.5.5";
private static final String WRAPPER_VERSION = "0.5.6";
/**
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
*/
private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
/**
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
@@ -55,7 +54,7 @@ public class MavenWrapperDownloader {
// wrapperUrl parameter.
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
String url = DEFAULT_DOWNLOAD_URL;
if (mavenWrapperPropertyFile.exists()) {
if(mavenWrapperPropertyFile.exists()) {
FileInputStream mavenWrapperPropertyFileInputStream = null;
try {
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
@@ -66,7 +65,7 @@ public class MavenWrapperDownloader {
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
} finally {
try {
if (mavenWrapperPropertyFileInputStream != null) {
if(mavenWrapperPropertyFileInputStream != null) {
mavenWrapperPropertyFileInputStream.close();
}
} catch (IOException e) {
@@ -77,8 +76,8 @@ public class MavenWrapperDownloader {
System.out.println("- Downloading from: " + url);
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
if (!outputFile.getParentFile().exists()) {
if (!outputFile.getParentFile().mkdirs()) {
if(!outputFile.getParentFile().exists()) {
if(!outputFile.getParentFile().mkdirs()) {
System.out.println(
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
}

Binary file not shown.

View File

@@ -1,2 +1,2 @@
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.2/apache-maven-3.6.2-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2019 小
Copyright (c) 2020 禾几
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,11 +1,23 @@
# 小海博客后端管理系统
![Gitlab pipeline status](https://img.shields.io/gitlab/pipeline/xiaohai2271/blog-backEnd) ![coverage report](https://gitlab.com/xiaohai2271/blog-backEnd/badges/master/coverage.svg) ![GitHub](https://img.shields.io/github/license/xiaohai2271/blog-backEnd) [![Website](https://img.shields.io/website?up_message=%E5%B0%8F%E6%B5%B7%E5%8D%9A%E5%AE%A2&url=https%3A%2F%2Fwww.celess.cn)](https://www.celess.cn)
## 基于Springboot的后端博客管理系统
<h1 align="center">
小海博客后端管理系统
</h1>
<div align="center">
基于Springboot的后端博客管理系统
[![Build](https://github.com/xiaohai2271/blog-backEnd/workflows/Build/badge.svg)](https://github.com/xiaohai2271/blog-backEnd)
[![Test](https://github.com/xiaohai2271/blog-backEnd/workflows/Test/badge.svg)](https://github.com/xiaohai2271/blog-backEnd)
[![GitHub tag (latest SemVer)](https://img.shields.io/github/v/tag/xiaohai2271/blog-backEnd)](https://github.com/xiaohai2271/blog-backEnd)
[![GitHub](https://img.shields.io/github/license/xiaohai2271/blog-backEnd)](https://github.com/xiaohai2271/blog-backEnd)
[![GitHub top language](https://img.shields.io/github/languages/top/xiaohai2271/blog-backEnd)](https://github.com/xiaohai2271/blog-backEnd)
[![GitHub commit activity](https://img.shields.io/github/commit-activity/m/xiaohai2271/blog-backEnd)](https://github.com/xiaohai2271/blog-backEnd)
[![GitHub last commit](https://img.shields.io/github/last-commit/xiaohai2271/blog-backEnd)](https://github.com/xiaohai2271/blog-backEnd)
[![Website](https://img.shields.io/website?up_message=%E5%B0%8F%E6%B5%B7%E5%8D%9A%E5%AE%A2&url=https%3A%2F%2Fwww.celess.cn)](https://www.celess.cn)
</div>
### 主要使用的技术
> 请配合前端项目一起食用 [https://github.com/xiaohai2271/blog-frontEnd](https://github.com/xiaohai2271/blog-frontEnd)
## 🎈主要使用的技术
| 使用的技术 | 名称 | 版本 |
| :--------------: | :--------: | :-----------: |
@@ -18,18 +30,16 @@
| 接口文档 | Swagger | 2.6.1 |
| 数据库连接池 | druid | 1.1.14 |
| 缓存(线上环境) | redis | 3.0.6 |
|数据库|mysql|5.7|
| 数据库 |mysql |5.7 |
### 接口文档
## 🔨如何构建
详情参照[Build](./doc/Build.md)文档
项目采用swagger2接口文档自动生成具体为 http://ip:端口/swagger-ui.html
### 📝TODO
## 📒接口文档
项目采用swagger2接口文档自动生成具体为 http://ip:port/doc.html
- [x] 密码重置
- [x] 信息修改
- [ ] 接入qq登录
或者参照[离线API文档](./doc/API.md)
### 📌FIXME
- [ ] `/write` 图片上传的跨域问题
## ☀授权协议
[MIT](./LICENSE)

149
blog.iml
View File

@@ -1,149 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="Spring" name="Spring">
<configuration />
</facet>
<facet type="web" name="Web">
<configuration>
<webroots />
<sourceRoots>
<root url="file://$MODULE_DIR$/src/main/java" />
<root url="file://$MODULE_DIR$/src/main/resources" />
</sourceRoots>
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.1.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.1.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.1.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.1.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.11.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.2" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.25" level="project" />
<orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.23" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.1.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.8" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.8" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.8" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.1.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.16" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.16" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.16" level="project" />
<orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.14.Final" level="project" />
<orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.2.Final" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-web:5.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-beans:5.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aop:5.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context:5.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.5.RELEASE" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: mysql:mysql-connector-java:8.0.15" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.1.3.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.1.3.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.1.3.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.11.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:2.23.4" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy:1.9.10" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.9.10" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" />
<orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.1.5.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.1.5.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.6.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: javax.xml.bind:jaxb-api:2.3.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:druid:1.1.14" level="project" />
<orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.6" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.6.1" level="project" />
<orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.10" level="project" />
<orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.10" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.6.1" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-core:2.6.1" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.6.1" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.6.1" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.6.1" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:guava:18.0" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml:classmate:1.4.0" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
<orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.0.0.Final" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.6.1" level="project" />
<orderEntry type="library" name="Maven: com.youbenzi:MDTool:1.2.3" level="project" />
<orderEntry type="library" name="Maven: net.minidev:json-smart:2.3" level="project" />
<orderEntry type="library" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
<orderEntry type="library" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
<orderEntry type="library" name="Maven: net.sf.json-lib:json-lib:jdk15:2.4" level="project" />
<orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.8.0" level="project" />
<orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.1" level="project" />
<orderEntry type="library" name="Maven: commons-lang:commons-lang:2.5" level="project" />
<orderEntry type="library" name="Maven: commons-logging:commons-logging:1.1.1" level="project" />
<orderEntry type="library" name="Maven: net.sf.ezmorph:ezmorph:1.0.6" level="project" />
<orderEntry type="library" name="Maven: com.qiniu:qiniu-java-sdk:7.2.27" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: com.squareup.okhttp3:okhttp:3.14.4" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: com.squareup.okio:okio:1.17.2" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: com.google.code.gson:gson:2.8.5" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-mail:2.1.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.sun.mail:javax.mail:1.6.2" level="project" />
<orderEntry type="library" name="Maven: javax.activation:activation:1.1" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.1.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-tx:5.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.1.4.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.33.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.33.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.33.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.33.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.33.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.33.Final" level="project" />
<orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.2.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.2" level="project" />
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:2.0.1" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.1.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.2.0" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.0.1" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.1" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.1" level="project" />
<orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.2.12" level="project" />
<orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.2.12" level="project" />
<orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.1.10" level="project" />
<orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:2.0" level="project" />
<orderEntry type="library" name="Maven: com.dyuproject.protostuff:protostuff-core:1.0.8" level="project" />
<orderEntry type="library" name="Maven: com.dyuproject.protostuff:protostuff-api:1.0.8" level="project" />
<orderEntry type="library" name="Maven: com.dyuproject.protostuff:protostuff-runtime:1.0.8" level="project" />
<orderEntry type="library" name="Maven: com.dyuproject.protostuff:protostuff-collectionschema:1.0.8" level="project" />
<orderEntry type="library" name="Maven: eu.bitwalker:UserAgentUtils:1.20" level="project" />
<orderEntry type="library" name="Maven: junit:junit:4.12" level="project" />
<orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt:0.9.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.8" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.8" level="project" />
</component>
</module>

View File

@@ -1,92 +0,0 @@
CREATE DATABASE `blog`;
USE blog;
CREATE TABLE `article`
(
`a_id` bigint(20) primary key auto_increment,
`a_title` varchar(255) not null unique comment '文章标题',
`a_summary` varchar(255) not null comment '文章摘要',
`a_md_content` longtext not null comment '文章Markdown内容',
`a_tags_id` varchar(255) not null comment '标签id \',\'处于最尾端',
`a_category_id` bigint(20) not null comment '分类的id',
`a_url` tinytext default null comment '转载文章的原文链接',
`a_author_id` bigint(20) not null comment '作者id',
`a_is_open` boolean default true comment '文章是否可见',
`a_is_original` boolean default true comment '文章是否原创',
`next_a_id` bigint(20) default -1 comment '下篇文章id',
`pre_a_id` bigint(20) default -1 comment '前一篇文章的id',
`a_reading_number` int default 0 comment '文章阅读数',
`a_publish_date` datetime not null comment '文章发布时间',
`a_update_date` datetime default null comment '文章的更新时间'
) DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci,comment '文章表';
CREATE TABLE `tag`
(
`tag_id` bigint(20) primary key auto_increment,
`tag_name` varchar(255) unique not null,
`articles` tinytext default null comment 'tag对应的文章id'
) comment '标签表';
CREATE table `category`
(
`c_id` bigint(20) primary key auto_increment,
`c_name` varchar(255) unique not null,
`articles` varchar(255) comment '分类下的文章'
)comment '分类表';
CREATE TABLE `comment`
(
`co_id` bigint(20) primary key auto_increment,
`co_article_id` bigint(20) default -1 comment '文章id',
`is_comment` boolean default true comment '是否是评论',
`author_id` bigint(20) not null comment '留言者id',
`co_content` text not null comment '评论/留言内容',
`co_date` datetime not null comment '评论/留言的日期',
`co_pid` bigint not null default -1 comment '评论/留言的父id',
`co_response_id` tinytext
) DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci,comment '评论/留言表';
CREATE TABLE `links`
(
`site_id` bigint(20) primary key auto_increment,
`site_name` varchar(255) not null comment '友站名称',
`is_open` boolean default true comment '是否公开',
`site_url` varchar(255) not null comment '首页地址'
) comment '友站表';
CREATE TABLE `visitor`
(
`v_id` bigint(20) primary key auto_increment,
`v_date` datetime not null comment '访问时间',
`v_ip` varchar(255) not null comment '访客ip',
`v_user_agent` text comment '访客ua'
) comment '访客表';
CREATE TABLE IF NOT EXISTS `web_update`
(
`update_id` bigint(20) primary key auto_increment,
`update_info` varchar(255) not null comment '更新内容',
`update_time` datetime not null comment '更新时间'
) comment '更新内容表';
create table `user`
(
`u_id` int not null primary key auto_increment,
`u_email` varchar(50) not null,
`u_uid` varchar(40) default null comment '用户唯一标识码',
`u_pwd` varchar(40) not null comment '密码',
`email_status` boolean default false comment '邮箱验证状态',
`u_avatar` varchar(255) comment '用户头像',
`u_desc` tinytext comment '用户的描述',
`recently_landed_time` datetime comment '最近的登录时间',
`email_verify_id` varchar(40) comment '用于找回密码或验证邮箱的id',
`display_name` varchar(30) comment '展示的昵称',
`role` varchar(40) not null default 'user' comment '权限组',
unique key `uni_user_id` (`u_id`),
unique key `uni_user_uid` (`u_uid`),
unique key `uni_user_email` (`u_email`)
) comment '用户表';

View File

@@ -1,8 +0,0 @@
#!/bin/sh
echo "查询已存在进程"
pgrep -af blog-0.0.1-SNAPSHOT.jar
echo "结束已存在进程"
pkill -f blog-0.0.1-SNAPSHOT.jar
echo "开始运行小海博客"
nohup java -jar -Dfile.encoding=UTF-8 blog-0.0.1-SNAPSHOT.jar >blog.log &
echo "更新结束"

4079
doc/API.md Normal file

File diff suppressed because it is too large Load Diff

33
doc/Build.md Normal file
View File

@@ -0,0 +1,33 @@
# 如何构建
### 1. 构建前准备
- 安装jdk
- 安装maven(也可使使用项目中的maven wrapper)
- 安装mysql
- 安装redis
- 获取七牛云的AccessKey/SecretKey (个人中心-密钥管理) [七牛云官网](https://www.qiniu.com/)
### 2. 拉取项目到本地
``` shell script
git clone https://github.com/xiaohai2271/blog-backEnd.git
# 或
git clone git@github.com:xiaohai2271/blog-backEnd.git
```
### 3. maven构建
```shell script
mvn package
```
### 4. 运行
```shell script
java -jar target/blog-0.0.1-SNAPSHOT.jar
```
### 5. 其他命令
```shell script
mvn clean # 清理项目资源
mvn clean package # 清理项目资源并重新打包
mvn clean package -DskipTests # 清理项目资源,重新打包并跳过测试
mvn test # 运行测试
..... #待添加
```

256
mvnw vendored
View File

@@ -8,7 +8,7 @@
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
@@ -19,7 +19,7 @@
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Maven2 Start Up Batch script
# Maven Start Up Batch script
#
# Required ENV vars:
# ------------------
@@ -34,135 +34,128 @@
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------
if [ -z "$MAVEN_SKIP_RC" ]; then
if [ -z "$MAVEN_SKIP_RC" ] ; then
if [ -f /etc/mavenrc ]; then
if [ -f /etc/mavenrc ] ; then
. /etc/mavenrc
fi
if [ -f "$HOME/.mavenrc" ]; then
if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc"
fi
fi
# OS specific support. $var _must_ be set to either true or false.
cygwin=false
darwin=false
cygwin=false;
darwin=false;
mingw=false
case "$(uname)" in
CYGWIN*) cygwin=true ;;
MINGW*) mingw=true ;;
Darwin*)
darwin=true
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
if [ -z "$JAVA_HOME" ]; then
if [ -x "/usr/libexec/java_home" ]; then
export JAVA_HOME="$(/usr/libexec/java_home)"
else
export JAVA_HOME="/Library/Java/Home"
case "`uname`" in
CYGWIN*) cygwin=true ;;
MINGW*) mingw=true;;
Darwin*) darwin=true
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
if [ -z "$JAVA_HOME" ]; then
if [ -x "/usr/libexec/java_home" ]; then
export JAVA_HOME="`/usr/libexec/java_home`"
else
export JAVA_HOME="/Library/Java/Home"
fi
fi
fi
;;
;;
esac
if [ -z "$JAVA_HOME" ]; then
if [ -r /etc/gentoo-release ]; then
JAVA_HOME=$(java-config --jre-home)
if [ -z "$JAVA_HOME" ] ; then
if [ -r /etc/gentoo-release ] ; then
JAVA_HOME=`java-config --jre-home`
fi
fi
if [ -z "$M2_HOME" ]; then
if [ -z "$M2_HOME" ] ; then
## resolve links - $0 may be a link to maven's home
PRG="$0"
# need this for relative symlinks
while [ -h "$PRG" ]; do
ls=$(ls -ld "$PRG")
link=$(expr "$ls" : '.*-> \(.*\)$')
if expr "$link" : '/.*' >/dev/null; then
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG="$(dirname "$PRG")/$link"
PRG="`dirname "$PRG"`/$link"
fi
done
saveddir=$(pwd)
saveddir=`pwd`
M2_HOME=$(dirname "$PRG")/..
M2_HOME=`dirname "$PRG"`/..
# make it fully qualified
M2_HOME=$(cd "$M2_HOME" && pwd)
M2_HOME=`cd "$M2_HOME" && pwd`
cd "$saveddir"
# echo Using m2 at $M2_HOME
fi
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin; then
if $cygwin ; then
[ -n "$M2_HOME" ] &&
M2_HOME=$(cygpath --unix "$M2_HOME")
M2_HOME=`cygpath --unix "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=$(cygpath --unix "$JAVA_HOME")
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=$(cygpath --path --unix "$CLASSPATH")
CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi
# For Mingw, ensure paths are in UNIX format before anything is touched
if $mingw; then
if $mingw ; then
[ -n "$M2_HOME" ] &&
M2_HOME="$( (
cd "$M2_HOME"
pwd
))"
M2_HOME="`(cd "$M2_HOME"; pwd)`"
[ -n "$JAVA_HOME" ] &&
JAVA_HOME="$( (
cd "$JAVA_HOME"
pwd
))"
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
fi
if [ -z "$JAVA_HOME" ]; then
javaExecutable="$(which javac)"
if [ -n "$javaExecutable" ] && ! [ "$(expr \"$javaExecutable\" : '\([^ ]*\)')" = "no" ]; then
javaExecutable="`which javac`"
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
# readlink(1) is not available as standard on Solaris 10.
readLink=$(which readlink)
if [ ! $(expr "$readLink" : '\([^ ]*\)') = "no" ]; then
if $darwin; then
javaHome="$(dirname \"$javaExecutable\")"
javaExecutable="$(cd \"$javaHome\" && pwd -P)/javac"
readLink=`which readlink`
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
if $darwin ; then
javaHome="`dirname \"$javaExecutable\"`"
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
else
javaExecutable="$(readlink -f \"$javaExecutable\")"
javaExecutable="`readlink -f \"$javaExecutable\"`"
fi
javaHome="$(dirname \"$javaExecutable\")"
javaHome=$(expr "$javaHome" : '\(.*\)/bin')
javaHome="`dirname \"$javaExecutable\"`"
javaHome=`expr "$javaHome" : '\(.*\)/bin'`
JAVA_HOME="$javaHome"
export JAVA_HOME
fi
fi
fi
if [ -z "$JAVACMD" ]; then
if [ -n "$JAVA_HOME" ]; then
if [ -x "$JAVA_HOME/jre/sh/java" ]; then
if [ -z "$JAVACMD" ] ; then
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
else
JAVACMD="$(which java)"
JAVACMD="`which java`"
fi
fi
if [ ! -x "$JAVACMD" ]; then
if [ ! -x "$JAVACMD" ] ; then
echo "Error: JAVA_HOME is not defined correctly." >&2
echo " We cannot execute $JAVACMD" >&2
exit 1
fi
if [ -z "$JAVA_HOME" ]; then
if [ -z "$JAVA_HOME" ] ; then
echo "Warning: JAVA_HOME environment variable is not set."
fi
@@ -172,24 +165,22 @@ CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
# first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() {
if [ -z "$1" ]; then
if [ -z "$1" ]
then
echo "Path not specified to find_maven_basedir"
return 1
fi
basedir="$1"
wdir="$1"
while [ "$wdir" != '/' ]; do
if [ -d "$wdir"/.mvn ]; then
while [ "$wdir" != '/' ] ; do
if [ -d "$wdir"/.mvn ] ; then
basedir=$wdir
break
fi
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
if [ -d "${wdir}" ]; then
wdir=$(
cd "$wdir/.."
pwd
)
wdir=`cd "$wdir/.."; pwd`
fi
# end of workaround
done
@@ -199,13 +190,13 @@ find_maven_basedir() {
# concatenates all lines of a file
concat_lines() {
if [ -f "$1" ]; then
echo "$(tr -s '\n' ' ' <"$1")"
echo "$(tr -s '\n' ' ' < "$1")"
fi
}
BASE_DIR=$(find_maven_basedir "$(pwd)")
BASE_DIR=`find_maven_basedir "$(pwd)"`
if [ -z "$BASE_DIR" ]; then
exit 1
exit 1;
fi
##########################################################################################
@@ -213,78 +204,75 @@ fi
# This allows using the maven wrapper in projects that prohibit checking in binary data.
##########################################################################################
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found .mvn/wrapper/maven-wrapper.jar"
fi
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found .mvn/wrapper/maven-wrapper.jar"
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
fi
if [ -n "$MVNW_REPOURL" ]; then
jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
else
jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
fi
while IFS="=" read key value; do
case "$key" in wrapperUrl)
jarUrl="$value"
break
;;
esac
done <"$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
if [ "$MVNW_VERBOSE" = true ]; then
echo "Downloading from: $jarUrl"
fi
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
if $cygwin; then
wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath")
fi
if command -v wget >/dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found wget ... using wget"
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
wget "$jarUrl" -O "$wrapperJarPath"
if [ -n "$MVNW_REPOURL" ]; then
jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
else
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
fi
elif command -v curl >/dev/null; then
while IFS="=" read key value; do
case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
esac
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found curl ... using curl"
echo "Downloading from: $jarUrl"
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
curl -o "$wrapperJarPath" "$jarUrl" -f
else
curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Falling back to using Java to download"
fi
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
# For Cygwin, switch paths to Windows format before running javac
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
if $cygwin; then
javaClass=$(cygpath --path --windows "$javaClass")
wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
fi
if [ -e "$javaClass" ]; then
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
if command -v wget > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Compiling MavenWrapperDownloader.java ..."
echo "Found wget ... using wget"
fi
# Compiling the Java class
("$JAVA_HOME/bin/javac" "$javaClass")
fi
if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
# Running the downloader
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
wget "$jarUrl" -O "$wrapperJarPath"
else
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
fi
elif command -v curl > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Running MavenWrapperDownloader.java ..."
echo "Found curl ... using curl"
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
curl -o "$wrapperJarPath" "$jarUrl" -f
else
curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Falling back to using Java to download"
fi
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
# For Cygwin, switch paths to Windows format before running javac
if $cygwin; then
javaClass=`cygpath --path --windows "$javaClass"`
fi
if [ -e "$javaClass" ]; then
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Compiling MavenWrapperDownloader.java ..."
fi
# Compiling the Java class
("$JAVA_HOME/bin/javac" "$javaClass")
fi
if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
# Running the downloader
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Running MavenWrapperDownloader.java ..."
fi
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
fi
fi
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
fi
fi
fi
fi
##########################################################################################
# End of extension
@@ -299,13 +287,13 @@ MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
[ -n "$M2_HOME" ] &&
M2_HOME=$(cygpath --path --windows "$M2_HOME")
M2_HOME=`cygpath --path --windows "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME")
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=$(cygpath --path --windows "$CLASSPATH")
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR")
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
fi
# Provide a "standardized" way to retrieve the CLI args that will

10
mvnw.cmd vendored
View File

@@ -7,7 +7,7 @@
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM https://www.apache.org/licenses/LICENSE-2.0
@REM http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@@ -18,7 +18,7 @@
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Maven2 Start Up Batch script
@REM Maven Start Up Batch script
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@@ -26,7 +26,7 @@
@REM Optional ENV vars
@REM M2_HOME - location of maven2's installed home dir
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@@ -120,7 +120,7 @@ SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
@@ -134,7 +134,7 @@ if exist %WRAPPER_JAR% (
)
) else (
if not "%MVNW_REPOURL%" == "" (
SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
)
if "%MVNW_VERBOSE%" == "true" (
echo Couldn't find %WRAPPER_JAR%, downloading it ...

119
pom.xml
View File

@@ -6,7 +6,7 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
<relativePath/>
</parent>
<groupId>cn.celess</groupId>
<artifactId>blog</artifactId>
@@ -40,14 +40,14 @@
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.14</version>
<version>1.2.16</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<version>1.18.20</version>
</dependency>
@@ -55,35 +55,27 @@
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.6.1</version>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.6.1</version>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.9.6</version>
</dependency>
<!--MarkDown 2 html -->
<dependency>
<groupId>com.youbenzi</groupId>
<artifactId>MDTool</artifactId>
<version>1.2.3</version>
<version>1.2.4</version>
</dependency>
<dependency>
<groupId>net.minidev</groupId>
<artifactId>json-smart</artifactId>
<version>2.3</version>
<version>2.4.7</version>
<scope>compile</scope>
</dependency>
<!--Json-->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<!-- 七牛云SDK -->
<dependency>
<groupId>com.qiniu</groupId>
@@ -107,39 +99,39 @@
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
<version>2.2.0</version>
</dependency>
<!-- pageHelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.12</version>
<version>1.3.0</version>
</dependency>
<!-- protostuff序列化依赖 -->
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-core</artifactId>
<version>1.0.8</version>
<version>1.1.6</version>
</dependency>
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-runtime</artifactId>
<version>1.0.8</version>
<version>1.1.6</version>
</dependency>
<!-- Ua解析-->
<dependency>
<groupId>eu.bitwalker</groupId>
<artifactId>UserAgentUtils</artifactId>
<version>1.20</version>
<version>1.21</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<version>4.13.1</version>
</dependency>
<!-- JJwt -->
@@ -148,6 +140,69 @@
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<!-- OkHttp -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.1</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.4.20</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.45.0</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
</dependency>
<dependency>
<groupId>com.github.kstyrc</groupId>
<artifactId>embedded-redis</artifactId>
<version>0.6</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>1.7.2</version>
</dependency>
</dependencies>
<build>
@@ -157,21 +212,15 @@
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.9</version>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>1.5.10</version>
<executions>
<execution>
<id>pre-unit-test</id>
<id>compile</id>
<phase>process-sources</phase>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>post-unit-test</id>
<phase>test</phase>
<goals>
<goal>report</goal>
<goal>compile</goal>
</goals>
</execution>
</executions>

View File

@@ -0,0 +1,66 @@
package cn.celess.blog.configuration;
import cn.celess.blog.util.EnvironmentUtil;
import org.jetbrains.annotations.NotNull;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.boot.logging.DeferredLog;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.Ordered;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Properties;
import java.util.regex.Matcher;
/**
* <p>date: 2022/12/02</P>
* <p>desc: </p>
* <p>mail: a@celess.cn</p>
*
* @author 禾几海
*/
@Component
public class CommonEnvPostProcessor implements EnvironmentPostProcessor, ApplicationListener<ApplicationEvent>, Ordered {
public static final DeferredLog log = new DeferredLog();
private static final String CONFIG_PATH = "/HBlog/config/blog.properties";
private static final String SOURCE_NAME = "localize";
@Override
public void postProcessEnvironment(ConfigurableEnvironment configurableEnvironment, SpringApplication springApplication) {
EnvironmentUtil.setEnvironment(configurableEnvironment);
log.info("加载本地配置文件--");
//获取环境变量
String homeEnv = EnvironmentUtil.getEnv("BLOG_HOME", EnvironmentUtil.getEnv("USERPROFILE"));
String configPath = (homeEnv + CONFIG_PATH).replaceAll("[\\|/]+", Matcher.quoteReplacement(File.separator));
try (InputStream input = Files.newInputStream(Paths.get(configPath))) {
Properties properties = new Properties();
properties.load(input);
PropertiesPropertySource propertySource = new PropertiesPropertySource(SOURCE_NAME, properties);
configurableEnvironment.getPropertySources().addLast(propertySource);
log.info("成功加载本地配置文件:)");
} catch (Exception e) {
log.info("加载本地[" + configPath + "]的配置文件失败:(");
}
}
@Override
public void onApplicationEvent(@NotNull ApplicationEvent event) {
log.replayTo(CommonEnvPostProcessor.class);
}
@Override
public int getOrder() {
return 0;
}
}

View File

@@ -1,5 +1,6 @@
package cn.celess.blog.configuration;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
@@ -13,6 +14,9 @@ import org.springframework.web.filter.CorsFilter;
*/
@Configuration
public class CorsConfig {
@Value("${spring.profiles.active}")
private String activeModel;
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
@@ -22,14 +26,17 @@ public class CorsConfig {
config.addAllowedOrigin("https://celess.cn");
config.addAllowedOrigin("https://www.celess.cn");
// 本地调试时的跨域
config.addAllowedOrigin("http://localhost:4200");
config.addAllowedOrigin("http://127.0.0.1:4200");
if (!"prod".equals(activeModel)) {
config.addAllowedOrigin("http://localhost:4200");
config.addAllowedOrigin("http://127.0.0.1:4200");
}
config.addAllowedHeader("*");
config.addAllowedMethod("OPTIONS");
config.addAllowedMethod("GET");
config.addAllowedMethod("POST");
config.addAllowedMethod("PUT");
config.addAllowedMethod("DELETE");
config.addExposedHeader("Authorization");
config.setAllowCredentials(true);
config.setMaxAge(10800L);
source.registerCorsConfiguration("/**", config);

View File

@@ -26,7 +26,7 @@ public class DruidConfig {
@Bean
public DruidDataSource druidDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setDriverClassName(driverClassName);
// 数据库基本信息
dataSource.setUrl(dbUrl);
dataSource.setUsername(username);

View File

@@ -31,19 +31,16 @@ public class RedisConfig extends CachingConfigurerSupport {
@Override
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
String name = target.getClass().getName();
sb.append(name.substring(name.lastIndexOf(".") + 1));
sb.append(":");
sb.append(method.getName());
for (Object obj : params) {
sb.append("-").append(obj.toString());
}
return sb.toString();
return (target, method, params) -> {
StringBuilder sb = new StringBuilder();
String name = target.getClass().getName();
sb.append(name.substring(name.lastIndexOf(".") + 1));
sb.append(":");
sb.append(method.getName());
for (Object obj : params) {
sb.append("-").append(obj.toString());
}
return sb.toString();
};
}

View File

@@ -7,6 +7,7 @@ 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;
@@ -25,7 +26,7 @@ public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.enable("dev".equals(environment))
.enable(!"prod".equals(environment))
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("cn.celess.blog"))
@@ -37,7 +38,7 @@ public class SwaggerConfig {
return new ApiInfoBuilder()
.title("小海博客的APi")
.description("小海博客的APi")
.contact("小海")
.contact(new Contact("小海", "https://www.celess.cn", "a@celess.cn"))
.version("1.0")
.build();
}

View File

@@ -1,11 +1,11 @@
package cn.celess.blog.configuration.filter;
import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.Response;
import cn.celess.blog.service.UserService;
import cn.celess.blog.util.JwtUtil;
import cn.celess.blog.util.RedisUtil;
import cn.celess.blog.util.ResponseUtil;
import net.sf.json.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -21,6 +21,11 @@ import java.io.IOException;
* @Description: 鉴权拦截器
*/
public class AuthenticationFilter implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(AuthenticationFilter.class);
private static final String USER_PREFIX = "/user";
private static final String ADMIN_PREFIX = "/admin";
private static final String ROLE_ADMIN = "admin";
private static final String ROLE_USER = "user";
@Autowired
JwtUtil jwtUtil;
@Autowired
@@ -28,13 +33,6 @@ public class AuthenticationFilter implements HandlerInterceptor {
@Autowired
UserService userService;
private static final Logger logger = LoggerFactory.getLogger(AuthenticationFilter.class);
private static final String USER_PREFIX = "/user";
private static final String ADMIN_PREFIX = "/admin";
private static final String ROLE_ADMIN = "admin";
private static final String ROLE_USER = "user";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String path = request.getRequestURI();
@@ -58,11 +56,19 @@ public class AuthenticationFilter implements HandlerInterceptor {
return writeResponse(ResponseEnum.LOGIN_EXPIRED, response, request);
}
String email = jwtUtil.getUsernameFromToken(jwtStr);
if (!redisUtil.hasKey(email + "-login") || jwtUtil.isTokenExpired(jwtStr)) {
if (jwtUtil.isTokenExpired(jwtStr)) {
// 登陆过期
return writeResponse(ResponseEnum.LOGIN_EXPIRED, response, request);
}
if (!redisUtil.hasKey(email + "-login")) {
return writeResponse(ResponseEnum.LOGOUT, response, request);
}
String role = userService.getUserRoleByEmail(email);
if (role.equals(ROLE_USER) || role.equals(ROLE_ADMIN)) {
// 更新token
String token = jwtUtil.updateTokenDate(jwtStr);
response.setHeader("Authorization", token);
}
if (role.equals(ROLE_ADMIN)) {
// admin
return true;
@@ -78,7 +84,7 @@ public class AuthenticationFilter implements HandlerInterceptor {
response.setHeader("Content-Type", "application/json;charset=UTF-8");
try {
logger.info("鉴权失败,[code:{},msg:{},path:{}]", e.getCode(), e.getMsg(), request.getRequestURI() + "?" + request.getQueryString());
response.getWriter().println(JSONObject.fromObject(ResponseUtil.response(e, null)));
response.getWriter().println(new ObjectMapper().writeValueAsString(Response.response(e, null)));
} catch (IOException ex) {
ex.printStackTrace();
}

View File

@@ -28,7 +28,7 @@ public class MultipleSubmitFilter implements HandlerInterceptor {
// 请求参数和路径均相同 且请求时间间隔小于 WAIT_TIME
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
Response result = new Response(ResponseEnum.FAILURE.getCode(), "重复请求", null, System.currentTimeMillis());
Response result = new Response(ResponseEnum.FAILURE.getCode(), "重复请求", null);
response.getWriter().println(result.toString());
return false;
}

View File

@@ -25,7 +25,6 @@ public class SessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
// TODO : can move 'visit' api to here
se.getSession().setAttribute("visitDetail", new HashMap<String, Integer>());
// 10s for debug
// se.getSession().setMaxInactiveInterval(10);
@@ -44,9 +43,7 @@ public class SessionListener implements HttpSessionListener {
sb.append("\t登录情况 => ");
String email = (String) se.getSession().getAttribute("email");
sb.append(email == null ? "游客访问" : email);
visitDetail.forEach((s, integer) -> {
sb.append("\n").append("Method:[").append(s.split(":")[1]).append("]\tTimes:[").append(integer).append("]\tPath:[").append(s.split(":")[0]).append("]");
});
visitDetail.forEach((s, integer) -> sb.append("\n").append("Method:[").append(s.split(":")[1]).append("]\tTimes:[").append(integer).append("]\tPath:[").append(s.split(":")[0]).append("]"));
log.info(sb.toString());
}
}

View File

@@ -6,9 +6,9 @@ import cn.celess.blog.entity.model.ArticleModel;
import cn.celess.blog.entity.request.ArticleReq;
import cn.celess.blog.service.ArticleService;
import cn.celess.blog.util.RedisUserUtil;
import cn.celess.blog.util.ResponseUtil;
import cn.celess.blog.util.SitemapGenerateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
@@ -25,6 +25,8 @@ public class ArticleController {
SitemapGenerateUtil sitemapGenerateUtil;
@Autowired
RedisUserUtil redisUserUtil;
@Value("${spring.profiles.active}")
private String activeModel;
/**
* 新建一篇文章
@@ -35,8 +37,10 @@ public class ArticleController {
@PostMapping("/admin/article/create")
public Response create(@RequestBody ArticleReq body) {
ArticleModel articleModel = articleService.create(body);
sitemapGenerateUtil.createSitemap();
return ResponseUtil.success(articleModel);
if ("prod".equals(activeModel)) {
sitemapGenerateUtil.createSitemap();
}
return Response.success(articleModel);
}
/**
@@ -48,8 +52,10 @@ public class ArticleController {
@DeleteMapping("/admin/article/del")
public Response delete(@RequestParam("articleID") long articleId) {
boolean delete = articleService.delete(articleId);
sitemapGenerateUtil.createSitemap();
return ResponseUtil.success(delete);
if ("prod".equals(activeModel)) {
sitemapGenerateUtil.createSitemap();
}
return Response.success(delete);
}
/**
@@ -61,8 +67,10 @@ public class ArticleController {
@PutMapping("/admin/article/update")
public Response update(@RequestBody ArticleReq body) {
ArticleModel update = articleService.update(body);
sitemapGenerateUtil.createSitemap();
return ResponseUtil.success(update);
if ("prod".equals(activeModel)) {
sitemapGenerateUtil.createSitemap();
}
return Response.success(update);
}
/**
@@ -80,13 +88,13 @@ public class ArticleController {
public Response retrieveOneById(@PathVariable("articleID") long articleId,
@RequestParam(value = "update", defaultValue = "false") boolean is4update,
HttpServletRequest request) {
ArticleModel article = articleService.retrieveOneByID(articleId, is4update);
ArticleModel article = articleService.retrieveOneById(articleId, is4update);
if (article.getOpen()) {
return ResponseUtil.success(article);
} else if (article.getAuthorId().equals(redisUserUtil.get().getId())) {
return ResponseUtil.success(article);
return Response.success(article);
} else if (article.getAuthor().getId().equals(redisUserUtil.get().getId())) {
return Response.success(article);
}
return ResponseUtil.response(ResponseEnum.PERMISSION_ERROR, null);
return Response.response(ResponseEnum.PERMISSION_ERROR, null);
}
/**
@@ -99,7 +107,7 @@ public class ArticleController {
@GetMapping("/articles")
public Response articles(@RequestParam(name = "page", defaultValue = "1") int page,
@RequestParam(name = "count", defaultValue = "5") int count) {
return ResponseUtil.success(articleService.retrievePageForOpen(count, page));
return Response.success(articleService.retrievePageForOpen(count, page));
}
/**
@@ -111,8 +119,9 @@ public class ArticleController {
*/
@GetMapping("/admin/articles")
public Response adminArticles(@RequestParam(name = "page", defaultValue = "1") int page,
@RequestParam(name = "count", defaultValue = "10") int count) {
return ResponseUtil.success(articleService.adminArticles(count, page));
@RequestParam(name = "count", defaultValue = "10") int count,
@RequestParam(name = "deleted", required = false) Boolean deleted) {
return Response.success(articleService.adminArticles(count, page, deleted));
}
/**
@@ -127,7 +136,7 @@ public class ArticleController {
public Response findByCategory(@PathVariable("name") String name,
@RequestParam(name = "page", defaultValue = "1") int page,
@RequestParam(name = "count", defaultValue = "10") int count) {
return ResponseUtil.success(articleService.findByCategory(name, page, count));
return Response.success(articleService.findByCategory(name, page, count));
}
/**
@@ -142,13 +151,13 @@ public class ArticleController {
public Response findByTag(@PathVariable("name") String name,
@RequestParam(name = "page", defaultValue = "1") int page,
@RequestParam(name = "count", defaultValue = "10") int count) {
return ResponseUtil.success(articleService.findByTag(name, page, count));
return Response.success(articleService.findByTag(name, page, count));
}
@GetMapping("/createSitemap")
public Response createSitemap() {
sitemapGenerateUtil.createSitemap();
return ResponseUtil.success(null);
return Response.success(null);
}
}

View File

@@ -2,7 +2,6 @@ package cn.celess.blog.controller;
import cn.celess.blog.entity.Response;
import cn.celess.blog.service.CategoryService;
import cn.celess.blog.util.ResponseUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -24,7 +23,7 @@ public class CategoryController {
*/
@PostMapping("/admin/category/create")
public Response addOne(@RequestParam("name") String name) {
return ResponseUtil.success(categoryService.create(name));
return Response.success(categoryService.create(name));
}
/**
@@ -35,7 +34,7 @@ public class CategoryController {
*/
@DeleteMapping("/admin/category/del")
public Response deleteOne(@RequestParam("id") long id) {
return ResponseUtil.success(categoryService.delete(id));
return Response.success(categoryService.delete(id));
}
/**
@@ -48,7 +47,7 @@ public class CategoryController {
@PutMapping("/admin/category/update")
public Response updateOne(@RequestParam("id") Long id,
@RequestParam("name") String name) {
return ResponseUtil.success(categoryService.update(id, name));
return Response.success(categoryService.update(id, name));
}
/**
@@ -57,7 +56,8 @@ public class CategoryController {
* @return Response
*/
@GetMapping("/categories")
public Response getPage() {
return ResponseUtil.success(categoryService.retrievePage());
public Response getPage(@RequestParam(name = "page", defaultValue = "1") int page,
@RequestParam(name = "count", defaultValue = "1000") int count) {
return Response.success(categoryService.retrievePage(page, count));
}
}

View File

@@ -1,10 +1,8 @@
package cn.celess.blog.controller;
import cn.celess.blog.entity.Comment;
import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.request.CommentReq;
import cn.celess.blog.service.CommentService;
import cn.celess.blog.util.ResponseUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -26,76 +24,96 @@ public class CommentController {
*/
@PostMapping("/user/comment/create")
public Response addOne(@RequestBody CommentReq reqBody) {
return ResponseUtil.success(commentService.create(reqBody));
return Response.success(commentService.create(reqBody));
}
@DeleteMapping("/user/comment/del")
public Response delete(@RequestParam("id") long id) {
return ResponseUtil.success(commentService.delete(id));
return Response.success(commentService.delete(id));
}
@PutMapping("/user/comment/update")
public Response update(@RequestBody CommentReq reqBody) {
return ResponseUtil.success(commentService.update(reqBody));
return Response.success(commentService.update(reqBody));
}
/**
* 获取所有的一级评论
* 获取所有的评论
*
* @param articleId 文章id
* @param count 单页数据量
* @param page 页码
* @param pagePath pagePath
* @param count 单页数据量
* @param page 页码
* @return Response
*/
@GetMapping("/comments")
public Response commentsOfArticle(@RequestParam("articleId") long articleId,
@GetMapping("/comments/{pagePath}/{pid}")
public Response commentsOfArticle(@PathVariable("pagePath") String pagePath, @PathVariable(value = "pid") long pid,
@RequestParam(value = "count", required = false, defaultValue = "10") int count,
@RequestParam(value = "page", required = false, defaultValue = "1") int page) {
return ResponseUtil.success(commentService.retrievePageByArticle(articleId, -1, page, count));
String path = "";
if (pagePath.contains("article+")) {
path = "article/" + pagePath.split("\\+", 2)[1];
} else {
path = pagePath;
}
if ("*".equals(pagePath)) {
path = null;
}
return Response.success(commentService.retrievePageByPageAndPid(path, pid, page, count));
}
/**
* 通过pid获取数据
*
* @param pid
* @param count
* @param page
* @return
* @param pagePath pagePath
* @param count count
* @param page page
* @return Response
*/
@GetMapping("/comment/pid/{pid}")
public Response retrievePage(@PathVariable("pid") long pid,
@GetMapping("/comment/pagePath/{pagePath}")
public Response retrievePage(@PathVariable("pagePath") String pagePath,
@RequestParam(value = "count", required = false, defaultValue = "10") int count,
@RequestParam(value = "page", required = false, defaultValue = "1") int page) {
return ResponseUtil.success(commentService.retrievePageByPid(pid, page, count));
String path = "";
if (pagePath.contains("article+")) {
path = "article/" + pagePath.split("\\+", 2)[1];
} else {
path = pagePath;
}
if ("*".equals(pagePath)) {
path = null;
}
return Response.success(commentService.retrievePage(path, page, count));
}
/**
* 获取所以的一级留言
*
* @param count
* @param page
* @return
*/
@GetMapping("/leaveMsg")
public Response retrievePageOfLeaveMsg(@RequestParam(value = "count", required = false, defaultValue = "10") int count,
@RequestParam(value = "page", required = false, defaultValue = "1") int page) {
return ResponseUtil.success(commentService.retrievePageByTypeAndPid(false, -1, page, count));
@GetMapping("/user/comment/pagePath/{pagePath}")
public Response userComment(@PathVariable("pagePath") String pagePath,
@RequestParam(value = "count", required = false, defaultValue = "10") int count,
@RequestParam(value = "page", required = false, defaultValue = "1") int page) {
String path = "";
if (pagePath.contains("article+")) {
path = "article/" + pagePath.split("\\+", 2)[1];
} else {
path = pagePath;
}
if ("*".equals(pagePath)) {
path = null;
}
return Response.success(commentService.retrievePageByAuthor(path, page, count));
}
@GetMapping("/admin/comment/type/{type}")
public Response retrievePageAdmin(
@PathVariable("type") int isComment,
@RequestParam(value = "count", required = false, defaultValue = "10") int count,
@RequestParam(value = "page", required = false, defaultValue = "1") int page) {
return ResponseUtil.success(commentService.retrievePageByType(1 == isComment, page, count));
@GetMapping("/admin/comment/pagePath/{pagePath}")
public Response adminComment(@PathVariable("pagePath") String pagePath,
@RequestParam(value = "count", required = false, defaultValue = "10") int count,
@RequestParam(value = "page", required = false, defaultValue = "1") int page) {
String path = "";
if (pagePath.contains("article+")) {
path = "article/" + pagePath.split("\\+", 2)[1];
} else {
path = pagePath;
}
if ("*".equals(pagePath)) {
path = null;
}
return Response.success(commentService.retrievePageByPage(path, page, count));
}
@GetMapping("/user/comment/type/{type}")
public Response retrievePageByAuthor(
@PathVariable(value = "type") int isComment,
@RequestParam(value = "count", required = false, defaultValue = "10") int count,
@RequestParam(value = "page", required = false, defaultValue = "1") int page) {
return ResponseUtil.success(commentService.retrievePageByAuthor(1 == isComment, page, count));
}
}

View File

@@ -1,216 +1,222 @@
package cn.celess.blog.controller;
import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.model.QiniuResponse;
import cn.celess.blog.exception.MyException;
import cn.celess.blog.service.CountService;
import cn.celess.blog.service.QiniuService;
import cn.celess.blog.util.RedisUtil;
import cn.celess.blog.util.ResponseUtil;
import cn.celess.blog.util.VeriCodeUtil;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* @author : xiaohai
* @date : 2019/04/02 22:03
*/
@RestController
public class Other {
public static final Logger logger = LoggerFactory.getLogger(Object.class);
@Autowired
CountService countService;
@Autowired
QiniuService qiniuService;
@Autowired
RedisUtil redisUtil;
@Autowired
HttpServletRequest request;
@GetMapping("/counts")
public Response allCount() {
Map<String, Long> countMap = new HashMap<>();
countMap.put("articleCount", countService.getArticleCount());
countMap.put("commentCount", countService.getCommentCount());
countMap.put("leaveMsgCount", countService.getLeaveMessageCount());
countMap.put("categoryCount", countService.getCategoriesCount());
countMap.put("tagCount", countService.getTagsCount());
countMap.put("visitorCount", countService.getVisitorCount());
return ResponseUtil.success(countMap);
}
/**
* 获取header的全部参数
*
* @param request HttpServletRequest
* @return Response
*/
@GetMapping("/headerInfo")
public Response headerInfo(HttpServletRequest request) {
Map<String, Object> map = new HashMap<>();
Enumeration<String> headerNames = request.getHeaderNames();
String str = null;
while ((str = headerNames.nextElement()) != null) {
map.put(str, request.getHeader(str));
}
map.put("sessionID", request.getSession().getId());
map.put("request.getRemoteAddr()", request.getRemoteAddr());
return ResponseUtil.success(map);
}
/**
* 返回验证码
*
* @param response HttpServletResponse
* @throws IOException IOException
*/
@GetMapping(value = "/imgCode", produces = MediaType.IMAGE_PNG_VALUE)
public void getImg(HttpServletResponse response) throws IOException {
Object[] obj = VeriCodeUtil.createImage();
request.getSession().setAttribute("code", obj[0]);
//将图片输出给浏览器
BufferedImage image = (BufferedImage) obj[1];
response.setContentType("image/png");
OutputStream os = response.getOutputStream();
ImageIO.write(image, "png", os);
os.close();
}
/**
* 验证 验证码的正确性
*
* @param code 传进来的验证码
* @param request HttpServletRequest
* @return Session中写入验证状态
*/
@PostMapping("/verCode")
public Response verCode(@RequestParam("code") String code, HttpServletRequest request) {
request.getSession().setAttribute("verImgCodeStatus", false);
String codeStr = (String) request.getSession().getAttribute("code");
if (code == null) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
if (codeStr == null) {
throw new MyException(ResponseEnum.IMG_CODE_TIMEOUT);
}
code = code.toLowerCase();
codeStr = codeStr.toLowerCase();
if (code.equals(codeStr)) {
request.getSession().removeAttribute("code");
request.getSession().setAttribute("verImgCodeStatus", true);
return ResponseUtil.success("验证成功");
} else {
request.getSession().removeAttribute("code");
return ResponseUtil.failure("验证失败,请重新获取验证码");
}
}
/**
* FIXME :: 单张图片多次上传的问题
* editor.md图片上传的接口
* FUCK !!!
*
* @param file 文件
* @return
* @throws IOException
*/
@PostMapping("/imgUpload")
public void upload(HttpServletRequest request, HttpServletResponse response, @RequestParam("editormd-image-file") MultipartFile file) throws IOException {
JSONObject jsonObject = new JSONObject();
String uploadTimesStr = redisUtil.get(request.getRemoteAddr() + "-ImgUploadTimes");
int uploadTimes = 0;
if (uploadTimesStr != null) {
uploadTimes = Integer.parseInt(uploadTimesStr);
}
if (uploadTimes == 10) {
throw new MyException(ResponseEnum.FAILURE.getCode(), "上传次数已达10次请2小时后在上传");
}
request.setCharacterEncoding("utf-8");
response.setContentType("text/html");
if (file.isEmpty()) {
jsonObject.put("success", 0);
jsonObject.put("message", "上传失败,请选择文件");
response.getWriter().println(jsonObject.toString());
return;
}
String fileName = file.getOriginalFilename();
String mime = fileName.substring(fileName.lastIndexOf("."));
if (".png".equals(mime.toLowerCase()) || ".jpg".equals(mime.toLowerCase()) ||
".jpeg".equals(mime.toLowerCase()) || ".bmp".equals(mime.toLowerCase())) {
QiniuResponse qiniuResponse = qiniuService.uploadFile(file.getInputStream(), "img_" + System.currentTimeMillis() + mime);
jsonObject.put("success", 0);
jsonObject.put("message", "上传成功");
jsonObject.put("url", "http://cdn.celess.cn/" + qiniuResponse.key);
response.getWriter().println(jsonObject.toString());
redisUtil.setEx(request.getRemoteAddr() + "-ImgUploadTimes", uploadTimes + 1 + "", 2, TimeUnit.HOURS);
return;
}
jsonObject.put("success", 0);
jsonObject.put("message", "上传失败,请上传图片文件");
response.getWriter().println(jsonObject.toString());
}
@GetMapping("/bingPic")
public Response bingPic() {
StringBuffer sb = new StringBuffer();
try {
//建立URL
URL url = new URL("https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN");
//打开http
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setDoInput(true);
urlConnection.setRequestMethod("GET");
urlConnection.connect();
//获得输入
InputStream inputStream = urlConnection.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
//将bufferReader的值给放到buffer里
String str = null;
while ((str = bufferedReader.readLine()) != null) {
sb.append(str);
}
//关闭bufferReader和输入流
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
//断开连接
urlConnection.disconnect();
} catch (Exception e) {
e.printStackTrace();
return ResponseUtil.failure(null);
}
JSONObject imageObj = JSONObject.fromObject(sb.toString());
JSONArray jsonArray = imageObj.getJSONArray("images");
String imageName = jsonArray.getJSONObject(0).getString("url");
return ResponseUtil.success("https://cn.bing.com" + imageName);
}
}
package cn.celess.blog.controller;
import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.model.QiniuResponse;
import cn.celess.blog.exception.MyException;
import cn.celess.blog.service.CountService;
import cn.celess.blog.service.QiniuService;
import cn.celess.blog.util.HttpUtil;
import cn.celess.blog.util.RedisUserUtil;
import cn.celess.blog.util.RedisUtil;
import cn.celess.blog.util.VeriCodeUtil;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* @author : xiaohai
* @date : 2019/04/02 22:03
*/
@RestController
public class CommonController {
public static final Logger logger = LoggerFactory.getLogger(Object.class);
@Autowired
CountService countService;
@Autowired
QiniuService qiniuService;
@Autowired
RedisUtil redisUtil;
@Autowired
RedisUserUtil redisUserUtil;
@GetMapping("/counts")
public Response allCount() {
Map<String, Long> countMap = new HashMap<>();
countMap.put("articleCount", countService.getArticleCount());
countMap.put("commentCount", countService.getCommentCount());
countMap.put("categoryCount", countService.getCategoriesCount());
countMap.put("tagCount", countService.getTagsCount());
countMap.put("visitorCount", countService.getVisitorCount());
return Response.success(countMap);
}
/**
* 获取header的全部参数
*
* @param request HttpServletRequest
* @return Response
*/
@GetMapping("/headerInfo")
public Response headerInfo(HttpServletRequest request) {
Map<String, Object> map = new HashMap<>();
Enumeration<String> headerNames = request.getHeaderNames();
String str = null;
while (headerNames.hasMoreElements()) {
str = headerNames.nextElement();
map.put(str, request.getHeader(str));
}
map.put("sessionID", request.getSession().getId());
map.put("request.getRemoteAddr()", request.getRemoteAddr());
return Response.success(map);
}
/**
* 返回验证码
*
* @param response HttpServletResponse
* @throws IOException IOException
*/
@GetMapping(value = "/imgCode", produces = MediaType.IMAGE_PNG_VALUE)
public void getImg(HttpServletRequest request, HttpServletResponse response) throws IOException {
Object[] obj = VeriCodeUtil.createImage();
request.getSession().setAttribute("code", obj[0]);
//将图片输出给浏览器
BufferedImage image = (BufferedImage) obj[1];
response.setContentType("image/png");
OutputStream os = response.getOutputStream();
ImageIO.write(image, "png", os);
os.close();
}
/**
* 验证 验证码的正确性
*
* @param code 传进来的验证码
* @param request HttpServletRequest
* @return Session中写入验证状态
*/
@PostMapping("/verCode")
public Response verCode(@RequestParam("code") String code, HttpServletRequest request) {
request.getSession().setAttribute("verImgCodeStatus", false);
String codeStr = (String) request.getSession().getAttribute("code");
if (code == null) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
if (codeStr == null) {
throw new MyException(ResponseEnum.IMG_CODE_TIMEOUT);
}
code = code.toLowerCase();
codeStr = codeStr.toLowerCase();
if (code.equals(codeStr)) {
request.getSession().removeAttribute("code");
request.getSession().setAttribute("verImgCodeStatus", true);
return Response.success("验证成功");
} else {
request.getSession().removeAttribute("code");
return Response.failure("验证失败,请重新获取验证码");
}
}
/**
* FIXME :: 单张图片多次上传的问题
* editor.md图片上传的接口
* FUCK !!!
* !! 推荐使用 fileUpload(/fileUpload) 接口
* @param file 文件
*/
@Deprecated
@PostMapping("/imgUpload")
public void upload(HttpServletRequest request, HttpServletResponse response, @RequestParam("editormd-image-file") MultipartFile file) throws IOException {
Map<String, Object> map = new HashMap<>();
ObjectMapper mapper = new ObjectMapper();
String uploadTimesStr = redisUtil.get(request.getRemoteAddr() + "-ImgUploadTimes");
int uploadTimes = 0;
if (uploadTimesStr != null) {
uploadTimes = Integer.parseInt(uploadTimesStr);
}
if (uploadTimes == 10) {
throw new MyException(ResponseEnum.FAILURE.getCode(), "上传次数已达10次请2小时后在上传");
}
request.setCharacterEncoding("utf-8");
response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
if (file.isEmpty()) {
map.put("success", 0);
map.put("message", "上传失败,请选择文件");
response.getWriter().println(mapper.writeValueAsString(map));
return;
}
String fileName = file.getOriginalFilename();
assert fileName != null;
String mime = fileName.substring(fileName.lastIndexOf("."));
if (".png".equals(mime.toLowerCase()) || ".jpg".equals(mime.toLowerCase()) ||
".jpeg".equals(mime.toLowerCase()) || ".bmp".equals(mime.toLowerCase())) {
QiniuResponse qiniuResponse = qiniuService.uploadFile(file.getInputStream(), "img_" + System.currentTimeMillis() + mime);
map.put("success", 1);
map.put("message", "上传成功");
map.put("url", "http://cdn.celess.cn/" + qiniuResponse.key);
response.getWriter().println(mapper.writeValueAsString(map));
redisUtil.setEx(request.getRemoteAddr() + "-ImgUploadTimes", uploadTimes + 1 + "", 2, TimeUnit.HOURS);
return;
}
map.put("success", 0);
map.put("message", "上传失败,请上传图片文件");
response.getWriter().println(mapper.writeValueAsString(map));
}
@GetMapping("/bingPic")
public Response bingPic() {
ObjectMapper mapper = new ObjectMapper();
JsonNode root;
try {
root = mapper.readTree(HttpUtil.get("https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN"));
} catch (IOException e) {
return Response.failure(null);
}
JsonNode images = root.get("images").elements().next();
return Response.success("https://cn.bing.com" + images.get("url").asText());
}
@PostMapping("/fileUpload")
public Response<List<Map<String, Object>>> fileUpload(@RequestParam("file[]") MultipartFile[] files) throws IOException {
List<Map<String, Object>> result = new ArrayList<>();
String uploadTimesStr = redisUtil.get(redisUserUtil.get().getEmail() + "-fileUploadTimes");
int uploadTimes = 0;
if (uploadTimesStr != null) {
uploadTimes = Integer.parseInt(uploadTimesStr);
}
if (uploadTimes == 10) {
throw new MyException(ResponseEnum.FAILURE.getCode(), "上传次数已达10次请2小时后在上传");
}
if (files.length == 0) {
throw new MyException(ResponseEnum.NO_FILE);
}
for (MultipartFile file : files) {
Map<String, Object> resp = new HashMap<>(4);
String fileName = file.getOriginalFilename();
assert fileName != null;
String mime = fileName.substring(fileName.lastIndexOf("."));
String name = fileName.replace(mime, "").replaceAll(" ", "");
QiniuResponse qiniuResponse = qiniuService.uploadFile(file.getInputStream(), "file_" + name + '_' + System.currentTimeMillis() + mime);
resp.put("originalFilename", fileName);
resp.put("success", qiniuResponse != null);
if (qiniuResponse != null) {
resp.put("host", "http://cdn.celess.cn/");
resp.put("path", qiniuResponse.key);
}
result.add(resp);
}
return Response.success(result);
}
}

View File

@@ -1,24 +1,18 @@
package cn.celess.blog.controller;
import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.PartnerSite;
import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.request.LinkApplyReq;
import cn.celess.blog.entity.request.LinkReq;
import cn.celess.blog.exception.MyException;
import cn.celess.blog.service.MailService;
import cn.celess.blog.service.PartnerSiteService;
import cn.celess.blog.util.RedisUtil;
import cn.celess.blog.util.RegexUtil;
import cn.celess.blog.util.ResponseUtil;
import cn.celess.blog.util.DateFormatUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* @author : xiaohai
@@ -37,63 +31,39 @@ public class LinksController {
@PostMapping("/admin/links/create")
public Response create(@RequestBody LinkReq reqBody) {
return ResponseUtil.success(partnerSiteService.create(reqBody));
return Response.success(partnerSiteService.create(reqBody));
}
@DeleteMapping("/admin/links/del/{id}")
public Response del(@PathVariable("id") long id) {
return ResponseUtil.success(partnerSiteService.del(id));
return Response.success(partnerSiteService.del(id));
}
@PutMapping("/admin/links/update")
public Response update(@RequestBody LinkReq reqBody) {
return ResponseUtil.success(partnerSiteService.update(reqBody));
return Response.success(partnerSiteService.update(reqBody));
}
@GetMapping("/links")
public Response allForOpen() {
List<PartnerSite> sites = new ArrayList<>();
for (PartnerSite p : partnerSiteService.findAll()) {
if (p.getOpen()) {
//隐藏open字段
p.setOpen(null);
sites.add(p);
}
}
return ResponseUtil.success(sites);
List<PartnerSite> sites = partnerSiteService.findAll().stream().peek(partnerSite -> partnerSite.setOpen(null)).collect(Collectors.toList());
return Response.success(sites);
}
@GetMapping("/admin/links")
public Response all(@RequestParam("page") int page,
@RequestParam("count") int count) {
return ResponseUtil.success(partnerSiteService.PartnerSitePages(page, count));
@RequestParam("count") int count,
@RequestParam(value = "deleted", required = false) Boolean deleted) {
return Response.success(partnerSiteService.partnerSitePages(page, count, deleted));
}
@PostMapping("/apply")
public Response apply(@RequestParam("name") String name,
@RequestParam("url") String url) {
// TODO :: 弃用发送邮件的方式。
if (name == null || name.replaceAll(" ", "").isEmpty()) {
return ResponseUtil.response(ResponseEnum.PARAMETERS_ERROR, null);
}
if (!RegexUtil.urlMatch(url)) {
return ResponseUtil.response(ResponseEnum.PARAMETERS_URL_ERROR, null);
}
String applyTimeStr = redisUtil.get(request.getRemoteAddr() + "-Apply");
int applyTime = 0;
if (applyTimeStr != null) {
applyTime = Integer.parseInt(applyTimeStr);
}
if (applyTime == 10) {
throw new MyException(ResponseEnum.FAILURE.getCode(), "申请次数已达10次请2小时后重试");
}
SimpleMailMessage message = new SimpleMailMessage();
message.setSubject("友链申请:" + name);
message.setTo("a@celess.cn");
message.setText("name:" + name + "\nurl:" + url + "\n" + DateFormatUtil.getNow());
Boolean send = mailService.send(message);
redisUtil.setEx(request.getRemoteAddr() + "-Apply", applyTime + 1 + "", 2, TimeUnit.HOURS);
return send ? ResponseUtil.success("") : ResponseUtil.failure("");
public Response apply(@RequestBody() LinkApplyReq linkApplyReq) {
return Response.success(partnerSiteService.apply(linkApplyReq));
}
@PostMapping("/reapply")
public Response reapply(@RequestParam("key") String key) {
return Response.success(partnerSiteService.reapply(key));
}
}

View File

@@ -1,16 +1,15 @@
package cn.celess.blog.controller;
import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.Tag;
import cn.celess.blog.entity.model.TagModel;
import cn.celess.blog.service.TagService;
import cn.celess.blog.util.ResponseUtil;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author : xiaohai
@@ -24,47 +23,37 @@ public class TagController {
@PostMapping("/admin/tag/create")
public Response addOne(@RequestParam("name") String name) {
return ResponseUtil.success(tagService.create(name));
return Response.success(tagService.create(name));
}
@DeleteMapping("/admin/tag/del")
public Response delOne(@RequestParam("id") long id) {
return ResponseUtil.success(tagService.delete(id));
return Response.success(tagService.delete(id));
}
@PutMapping("/admin/tag/update")
public Response updateOne(@RequestParam("id") Long id, @RequestParam("name") String name) {
return ResponseUtil.success(tagService.update(id, name));
}
@GetMapping("/tag/id/{id}")
public Response retrieveOneById(@PathVariable("id") long id) {
return ResponseUtil.success(tagService.retrieveOneById(id));
}
@GetMapping("/tag/name/{name}")
public Response retrieveOneByName(@PathVariable("name") String name) {
return ResponseUtil.success(tagService.retrieveOneByName(name));
return Response.success(tagService.update(id, name));
}
@GetMapping("/tags")
public Response getPage(@RequestParam(required = false, defaultValue = "10", value = "count") int count,
@RequestParam(required = false, defaultValue = "1", value = "page") int page) {
return ResponseUtil.success(tagService.retrievePage(page, count));
return Response.success(tagService.retrievePage(page, count));
}
@GetMapping("/tags/nac")
public Response getTagNameAndCount() {
List<JSONObject> nameAndCount = new ArrayList<>();
List<Map<String, Object>> nameAndCount = new ArrayList<>();
List<TagModel> all = tagService.findAll();
for (TagModel t : all) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", t.getName());
jsonObject.put("size", t.getArticles() == null ? 0 : t.getArticles().size());
nameAndCount.add(jsonObject);
Map<String, Object> map = new HashMap<>(2);
map.put("name", t.getName());
map.put("size", t.getArticles().size());
nameAndCount.add(map);
}
return ResponseUtil.success(nameAndCount);
return Response.success(nameAndCount);
}
}

View File

@@ -4,7 +4,6 @@ import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.request.LoginReq;
import cn.celess.blog.entity.request.UserReq;
import cn.celess.blog.service.UserService;
import cn.celess.blog.util.ResponseUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -23,28 +22,28 @@ public class UserController {
@PostMapping("/login")
public Response login(@RequestBody LoginReq loginReq) {
return ResponseUtil.success(userService.login(loginReq));
return Response.success(userService.login(loginReq));
}
@PostMapping("/registration")
public Response registration(@RequestParam("email") String email,
@RequestParam("password") String password) {
return ResponseUtil.success(userService.registration(email, password));
return Response.success(userService.registration(email, password));
}
@GetMapping("/logout")
public Response logout() {
return ResponseUtil.success(userService.logout());
return Response.success(userService.logout());
}
@PutMapping("/user/userInfo/update")
public Response updateInfo(String desc, String displayName) {
return ResponseUtil.success(userService.update(desc, displayName));
return Response.success(userService.update(desc, displayName));
}
@GetMapping("/user/userInfo")
public Response getUserInfo() {
return ResponseUtil.success(userService.getUserInfoBySession());
return Response.success(userService.getUserInfoBySession());
}
/**
@@ -58,7 +57,7 @@ public class UserController {
@ResponseBody
public Response upload(@RequestParam("file") MultipartFile file) throws IOException {
if (file.isEmpty()) {
return ResponseUtil.failure("上传失败,请选择文件");
return Response.failure("上传失败,请选择文件");
}
String fileName = file.getOriginalFilename();
String mime = fileName.substring(fileName.lastIndexOf("."));
@@ -66,56 +65,64 @@ public class UserController {
".jpeg".equals(mime.toLowerCase()) || ".bmp".equals(mime.toLowerCase())) {
return (Response) userService.updateUserAavatarImg(file.getInputStream(), mime);
}
return ResponseUtil.failure("请上传图片文件");
return Response.failure("请上传图片文件");
}
@PostMapping("/sendResetPwdEmail")
public Response sendResetPwdEmail(@RequestParam("email") String email) {
return ResponseUtil.success(userService.sendResetPwdEmail(email));
return Response.success(userService.sendResetPwdEmail(email));
}
@PostMapping("/sendVerifyEmail")
public Response sendVerifyEmail(@RequestParam("email") String email) {
return ResponseUtil.success(userService.sendVerifyEmail(email));
return Response.success(userService.sendVerifyEmail(email));
}
@PostMapping("/emailVerify")
public Response emailVerify(@RequestParam("verifyId") String verifyId,
@RequestParam("email") String mail) {
return ResponseUtil.success(userService.verifyEmail(verifyId, mail));
return Response.success(userService.verifyEmail(verifyId, mail));
}
@PostMapping("/resetPwd")
public Response resetPwd(@RequestParam("verifyId") String verifyId,
@RequestParam("email") String email,
@RequestParam("pwd") String pwd) {
return ResponseUtil.success(userService.reSetPwd(verifyId, email, pwd));
return Response.success(userService.reSetPwd(verifyId, email, pwd));
}
@PostMapping("/user/setPwd")
public Response setPwd(@RequestParam("pwd") String pwd,
@RequestParam("newPwd") String newPwd,
@RequestParam("confirmPwd") String confirmPwd) {
return Response.success(userService.setPwd(pwd, newPwd, confirmPwd));
}
@DeleteMapping("/admin/user/delete")
public Response multipleDelete(@RequestBody Integer[] ids) {
return ResponseUtil.success(userService.deleteUser(ids));
return Response.success(userService.deleteUser(ids));
}
@DeleteMapping("/admin/user/delete/{id}")
public Response delete(@PathVariable("id") Integer id) {
return ResponseUtil.success(userService.deleteUser(new Integer[]{id}));
return Response.success(userService.deleteUser(new Integer[]{id}));
}
@PutMapping("/admin/user")
public Response updateInfoByAdmin(@RequestBody UserReq user) {
return ResponseUtil.success(userService.adminUpdate(user));
return Response.success(userService.adminUpdate(user));
}
@GetMapping("/admin/users")
public Response getAllUser(@RequestParam("page") int pageNum, @RequestParam("count") int count) {
return ResponseUtil.success(userService.getUserList(pageNum, count));
public Response getAllUser(@RequestParam("page") int pageNum, @RequestParam("count") int count, @RequestParam(name = "status", required = false) Integer status) {
return Response.success(userService.getUserList(pageNum, count, status));
}
@GetMapping("/emailStatus/{email}")
public Response getEmailStatus(@PathVariable("email") String email) {
return ResponseUtil.success(userService.getStatusOfEmail(email));
return Response.success(userService.getStatusOfEmail(email));
}

View File

@@ -3,7 +3,6 @@ package cn.celess.blog.controller;
import cn.celess.blog.entity.Response;
import cn.celess.blog.service.CountService;
import cn.celess.blog.service.VisitorService;
import cn.celess.blog.util.ResponseUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -22,29 +21,29 @@ public class VisitorController {
@GetMapping("/visitor/count")
public Response getVisitorCount() {
return ResponseUtil.success(countService.getVisitorCount());
return Response.success(countService.getVisitorCount());
}
@GetMapping("/admin/visitor/page")
public Response page(@RequestParam(value = "count", required = false, defaultValue = "10") int count,
@RequestParam(value = "page", required = false, defaultValue = "1") int page,
@RequestParam(value = "showLocation", required = false, defaultValue = "false") boolean showLocation) {
return ResponseUtil.success(visitorService.visitorPage(page, count, showLocation));
@RequestParam(value = "showLocation", required = false, defaultValue = "true") boolean showLocation) {
return Response.success(visitorService.visitorPage(page, count, showLocation));
}
@PostMapping("/visit")
public Response add(HttpServletRequest request) {
return ResponseUtil.success(visitorService.addVisitor(request));
return Response.success(visitorService.addVisitor(request));
}
@GetMapping("/dayVisitCount")
public Response dayVisitCount() {
return ResponseUtil.success(countService.getDayVisitCount());
return Response.success(countService.getDayVisitCount());
}
@GetMapping("/ip/{ip}")
public Response ipLocation(@PathVariable("ip") String ip) {
return ResponseUtil.success(visitorService.location(ip));
return Response.success(visitorService.location(ip));
}
/**
@@ -55,6 +54,6 @@ public class VisitorController {
*/
@GetMapping("/ip")
public Response getIp(HttpServletRequest request) {
return ResponseUtil.success(request.getRemoteAddr());
return Response.success(request.getRemoteAddr());
}
}

View File

@@ -2,7 +2,6 @@ package cn.celess.blog.controller;
import cn.celess.blog.entity.Response;
import cn.celess.blog.service.WebUpdateInfoService;
import cn.celess.blog.util.ResponseUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -17,31 +16,32 @@ public class WebUpdateInfoController {
@PostMapping("/admin/webUpdate/create")
public Response create(@RequestParam("info") String info) {
return ResponseUtil.success(webUpdateInfoService.create(info));
return Response.success(webUpdateInfoService.create(info));
}
@DeleteMapping("/admin/webUpdate/del/{id}")
public Response del(@PathVariable("id") long id) {
return ResponseUtil.success(webUpdateInfoService.del(id));
return Response.success(webUpdateInfoService.del(id));
}
@PutMapping("/admin/webUpdate/update")
public Response update(@RequestParam("id") long id, @RequestParam("info") String info) {
return ResponseUtil.success(webUpdateInfoService.update(id, info));
return Response.success(webUpdateInfoService.update(id, info));
}
@GetMapping("/webUpdate")
public Response findAll() {
return ResponseUtil.success(webUpdateInfoService.findAll());
return Response.success(webUpdateInfoService.findAll());
}
@GetMapping("/webUpdate/pages")
public Response page(@RequestParam("page") int page, @RequestParam("count") int count) {
return ResponseUtil.success(webUpdateInfoService.pages(count, page));
return Response.success(webUpdateInfoService.pages(count, page));
}
@GetMapping("/lastestUpdateTime")
@GetMapping("/lastestUpdate")
public Response lastestUpdateTime() {
return ResponseUtil.success(webUpdateInfoService.getLastestUpdateTime());
return Response.success(webUpdateInfoService.getLastestUpdateTime());
}

View File

@@ -0,0 +1,23 @@
package cn.celess.blog.enmu;
import lombok.Getter;
/**
* @Author: 小海
* @Date: 2020-05-25 08:58
* @Desc:
*/
@Getter
public enum CommentStatusEnum {
// 正常
NORMAL(0, "正常"),
DELETED(3, "已删除");
private final int code;
private final String msg;
CommentStatusEnum(int code, String msg) {
this.code = code;
this.msg = msg;
}
}

View File

@@ -1,27 +0,0 @@
package cn.celess.blog.enmu;
import lombok.Getter;
/**
* @Author: 小海
* @Date 2019/06/29 00:00
* @Description 文章数据模型转换的级别(响应参数的选择)
*/
@Getter
public enum LevelEnum {
//低级
LOW(0),
//中级
MIDDLE(1),
//另一个级别的转化
BETWEEN_M_AND_H(2),
//高级
HEIGHT(3);
private int levelCode;
LevelEnum(int levelCode) {
this.levelCode = levelCode;
}
}

View File

@@ -11,6 +11,8 @@ public enum ResponseEnum {
FAILURE(-1, "失败"),
ERROR(-2, "错误"),
DATA_IS_DELETED(1000, "数据已被删除"),
//文章类
ARTICLE_NOT_EXIST(2010, "文章不存在"),
ARTICLE_HAS_EXIST(2020, "文章已存在"),
@@ -28,8 +30,12 @@ public enum ResponseEnum {
USEREMAIL_NULL(3310, "未设置邮箱"),
USEREMAIL_NOT_VERIFY(3320, "邮箱未验证"),
LOGIN_LATER(3500, "错误次数已达5次请稍后再试"),
PWD_SAME(3600, "新密码与原密码相同"),
PWD_SAME(3601, "新密码与原密码相同"),
PWD_NOT_SAME(3602, "新密码与原密码不相同"),
LOGIN_EXPIRED(3700, "登陆过期"),
LOGOUT(3710, "账户已注销"),
CAN_NOT_USE(3711, "账户不可用"),
PWD_WRONG(3800, "密码不正确"),
JWT_EXPIRED(3810, "Token过期"),
JWT_MALFORMED(3820, "Token格式不对"),
@@ -53,6 +59,11 @@ public enum ResponseEnum {
DATA_HAS_EXIST(7020, "数据已存在"),
//其他
APPLY_LINK_NO_ADD_THIS_SITE(7200, "暂未在您的网站中抓取到本站链接"),
DATA_EXPIRED(7300, "数据过期"),
CANNOT_GET_DATA(7400, "暂无法获取到数据"),
NO_FILE(7500, "未选择文件,请重新选择"),
//提交更新之前,没有获取数据/,
DID_NOT_GET_THE_DATA(8020, "非法访问"),
@@ -66,9 +77,8 @@ public enum ResponseEnum {
PARAMETERS_QQ_ERROR(8540, "QQ格式错误"),
PARAMETERS_PWD_ERROR(8550, "密码格式错误"),
VERIFY_OUT(8400, "已经验证过了");
private int code;
private String msg;
private final int code;
private final String msg;
ResponseEnum(int code, String msg) {

View File

@@ -0,0 +1,23 @@
package cn.celess.blog.enmu;
import lombok.Getter;
/**
* @Author: 小海
* @Date: 2020-05-24 16:31
* @Desc:
*/
@Getter
public enum RoleEnum {
// admin 权限
ADMIN_ROLE("admin"),
// user 权限
USER_ROLE("user");
private final String roleName;
RoleEnum(String roleName) {
this.roleName = roleName;
}
}

View File

@@ -0,0 +1,72 @@
package cn.celess.blog.enmu;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import java.util.HashMap;
import java.util.Map;
/**
* @Author: 小海
* @Date: 2020-05-22 21:32
* @Desc:
*/
public enum UserAccountStatusEnum {
/**
* 账户正常
*/
NORMAL(0, "正常"),
/**
* 账户被锁定
*/
LOCKED(1, "锁定"),
/**
* 账户被删除
*/
DELETED(2, "已删除");
private final int code;
private final String desc;
UserAccountStatusEnum(int code, String desc) {
this.code = code;
this.desc = desc;
}
public int getCode() {
return code;
}
public String getDesc() {
return desc;
}
public static UserAccountStatusEnum get(int code) {
for (UserAccountStatusEnum value : UserAccountStatusEnum.values()) {
if (value.code == code) {
return value;
}
}
return null;
}
@JsonCreator
public static UserAccountStatusEnum get(Map<String, Object> map) {
for (UserAccountStatusEnum value : UserAccountStatusEnum.values()) {
if (value.code == (int) map.get("code") && value.desc.equals(map.get("desc"))) {
return value;
}
}
return null;
}
@JsonValue
public Map<String, Object> toJson() {
Map<String, Object> map = new HashMap<>(2);
map.put("code", code);
map.put("desc", desc);
return map;
}
}

View File

@@ -3,6 +3,7 @@ package cn.celess.blog.entity;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
* @author : xiaohai
@@ -41,16 +42,6 @@ public class Article {
private Date updateDate = null;
private Long categoryId;
private String tagsId;
private Long authorId;
private Long preArticleId;
private Long nextArticleId;
private Long readingNumber;
/**
@@ -58,4 +49,15 @@ public class Article {
*/
private Boolean open;
private Category category;
private List<Tag> tags;
private Integer likeCount;
private Integer dislikeCount;
private User user;
private boolean deleted = false;
}

View File

@@ -0,0 +1,26 @@
package cn.celess.blog.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author: 小海
* @Date: 2020-05-24 14:52
* @Desc:
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ArticleTag {
private Long id;
private Article article;
private TagCategory tag;
public ArticleTag(Article article, TagCategory tag) {
this.article = article;
this.tag = tag;
}
}

View File

@@ -1,20 +1,14 @@
package cn.celess.blog.entity;
import lombok.Data;
/**
* @author : xiaohai
* @date : 2019/03/28 22:18
*/
@Data
public class Category {
private Long id;
private String name;
private String articles;
}
package cn.celess.blog.entity;
import lombok.NoArgsConstructor;
/**
* @author : xiaohai
* @date : 2019/03/28 22:18
*/
@NoArgsConstructor
public class Category extends TagCategory {
public Category(String name) {
super.setName(name);
}
}

View File

@@ -14,27 +14,21 @@ public class Comment {
private Long id;
/**
* 是评论还是留言 0:评论 其他1留言
*/
private Boolean type;
private int status;
private Long authorID;
private String pagePath;
private String content;
private Long articleID;
private Date date;
/**
* 回应着ID 默认为顶级回复
*/
private String responseId = "";
private User fromUser;
private User toUser;
/**
* 评论的父ID
*/
private Long pid;
// private boolean delete;
}

View File

@@ -19,6 +19,16 @@ public class PartnerSite {
private Boolean open;
private String iconPath;
private String desc;
private Boolean delete = false;
private String email;
private Boolean notification = true;
public PartnerSite() {
}

View File

@@ -1,7 +1,9 @@
package cn.celess.blog.entity;
import cn.celess.blog.enmu.ResponseEnum;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
import net.sf.json.JSONObject;
import lombok.SneakyThrows;
import java.io.Serializable;
@@ -10,25 +12,54 @@ import java.io.Serializable;
* @date : 2019/03/28 15:24
*/
@Data
public class Response implements Serializable {
public class Response<T> implements Serializable {
private int code;
private String msg;
private Object result;
private long date;
private T result;
public Response() {
}
public Response(int code, String msg, Object result, long date) {
public Response(int code, String msg, T result) {
this.code = code;
this.msg = msg;
this.result = result;
this.date = date;
}
/**
* 成功相应
*
* @param result 结果
* @return Response
*/
public static <T> Response<T> success(T result) {
return new Response<T>(ResponseEnum.SUCCESS.getCode(), ResponseEnum.SUCCESS.getMsg(), result);
}
/**
* 失败的响应
*
* @param result 结果
* @return Response
*/
public static Response<String> failure(String result) {
return new Response<String>(ResponseEnum.FAILURE.getCode(), ResponseEnum.FAILURE.getMsg(), result);
}
/**
* 其他的响应
*
* @param r 枚举常量
* @param result 结果
* @return Response
*/
public static <T> Response<T> response(ResponseEnum r, T result) {
return new Response<T>(r.getCode(), r.getMsg(), result);
}
@SneakyThrows
@Override
public String toString() {
JSONObject jsonObject = JSONObject.fromObject(this);
return jsonObject.toString();
return new ObjectMapper().writeValueAsString(this);
}
}

View File

@@ -1,16 +1,15 @@
package cn.celess.blog.entity;
import lombok.Data;
/**
* @author : xiaohai
* @date : 2019/03/28 22:19
*/
@Data
public class Tag {
private Long id;
private String name;
private String articles;
}
package cn.celess.blog.entity;
import lombok.NoArgsConstructor;
/**
* @author : xiaohai
* @date : 2019/03/28 22:19
*/
@NoArgsConstructor
public class Tag extends TagCategory {
public Tag(String name) {
super.setName(name);
}
}

View File

@@ -0,0 +1,19 @@
package cn.celess.blog.entity;
import lombok.Data;
/**
* @Author: 小海
* @Date: 2020-05-24 14:03
* @Desc:
*/
@Data
public class TagCategory {
private Long id;
private String name;
private Boolean category = true;
private Boolean deleted = false;
}

View File

@@ -2,6 +2,7 @@ package cn.celess.blog.entity;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@@ -10,6 +11,7 @@ import java.util.Date;
* @date : 2019/03/28 14:52
*/
@Data
@NoArgsConstructor
public class User {
private Long id;
@@ -18,12 +20,6 @@ public class User {
*/
private String email;
/**
* 用户唯一标识码
*/
@JsonIgnore
private String uid;
/**
* 密码
*/
@@ -46,15 +42,12 @@ public class User {
private Date recentlyLandedDate;
/**
* 随机码 用户验证邮箱/找回密码
* 暂时废弃这一字段
*/
private String emailVerifyId;
private String role = "user";
public User() {
}
private int status;
public User(String email, String pwd) {
this.email = email;
this.pwd = pwd;
}
}

View File

@@ -15,6 +15,7 @@ public class Visitor {
private String ip;
private Date date;
private String ua;
private boolean delete;
public Visitor(String ip, Date date, String ua) {
this.ip = ip;

View File

@@ -17,11 +17,12 @@ public class WebUpdate {
private Date updateTime;
private boolean delete;
public WebUpdate() {
}
public WebUpdate(String updateInfo, Date updateTime) {
public WebUpdate(String updateInfo) {
this.updateInfo = updateInfo;
this.updateTime = updateTime;
}
}

View File

@@ -1,9 +1,10 @@
package cn.celess.blog.entity.model;
import cn.celess.blog.entity.Tag;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.List;
/**
* @author : xiaohai
@@ -57,40 +58,30 @@ public class ArticleModel {
/**
* 标签
*/
private String[] tags;
private List<Tag> tags;
/**
* 作者
*/
private Long authorId;
private UserModel author;
/**
* 作者名字
*/
private String authorName;
private ArticleModel preArticle;
/**
* 上一篇文章
*/
private Long preArticleId;
/**
* 下一篇文章
*/
private Long nextArticleId;
private String preArticleTitle;
private String nextArticleTitle;
private ArticleModel nextArticle;
/**
* 阅读数
*/
private Long readingNumber;
private Integer likeCount;
private Integer dislikeCount;
/**
* 文章的状态 true公开 false:不公开
*/
private Boolean open;
private boolean deleted;
}

View File

@@ -1,12 +1,9 @@
package cn.celess.blog.entity.model;
import cn.celess.blog.entity.Category;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
@@ -22,22 +19,6 @@ public class CategoryModel {
private String name;
private List<Integer> articles;
public CategoryModel(Category category) {
this.id = category.getId();
this.name = category.getName();
if (category.getArticles() == null || category.getArticles().length() == 0) {
articles = null;
} else {
articles = new ArrayList<>();
for (String s : category.getArticles().split(",")) {
if ("".equals(s)) {
return;
}
articles.add(Integer.parseInt(s));
}
}
}
private List<ArticleModel> articles;
private boolean deleted;
}

View File

@@ -3,7 +3,7 @@ package cn.celess.blog.entity.model;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
import java.util.List;
/**
* @author : xiaohai
@@ -14,44 +14,31 @@ import java.util.Date;
public class CommentModel {
private long id;
/**
* 是评论还是留言 0:评论 其他1留言
*/
private boolean isComment;
private UserModel fromUser;
private String authorName;
private String authorAvatarImgUrl;
private UserModel toUser;
/**
* 内容
*/
private String content;
/**
* 文章ID
*/
private long articleID;
/**
* 文章标题
*/
private String articleTitle;
private String pagePath;
/**
* 发布日期
*/
private String date;
/**
* 回应着ID 默认为顶级回复
*/
private String responseId = "";
/**
* 评论的父ID
*/
private long pid = -1;
private Long pid;
private List<CommentModel> respComment;
private int status;
}

View File

@@ -0,0 +1,38 @@
package cn.celess.blog.entity.model;
import com.github.pagehelper.PageInfo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @Author: 小海
* @Date: 2020-05-25 17:13
* @Desc:
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageData<T> {
private List<T> list;
private long total;
private int pageSize;
private int pageNum;
public PageData(PageInfo pageInfo) {
this.pageNum = pageInfo.getPageNum();
this.pageSize = pageInfo.getPageSize();
this.total = pageInfo.getTotal();
}
public PageData(PageInfo pageInfo, List<T> data) {
this(pageInfo);
this.list = data;
}
}

View File

@@ -1,11 +1,9 @@
package cn.celess.blog.entity.model;
import cn.celess.blog.entity.Tag;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
/**
@@ -21,21 +19,7 @@ public class TagModel {
private String name;
private List<Integer> articles;
private List<ArticleModel> articles;
public TagModel(Tag tag) {
this.id = tag.getId();
this.name = tag.getName();
if (tag.getArticles() == null || tag.getArticles().length() == 0) {
articles = null;
} else {
articles = new ArrayList<>();
for (String s : tag.getArticles().split(",")) {
if ("".equals(s)) {
return;
}
articles.add(Integer.parseInt(s));
}
}
}
private boolean deleted;
}

View File

@@ -1,5 +1,6 @@
package cn.celess.blog.entity.model;
import cn.celess.blog.enmu.UserAccountStatusEnum;
import lombok.Getter;
import lombok.Setter;
@@ -37,4 +38,6 @@ public class UserModel {
private String role = "user";
private String token;
private UserAccountStatusEnum status;
}

View File

@@ -21,4 +21,6 @@ public class WebUpdateModel {
this.info = info;
this.time = time;
}
private boolean deleted;
}

View File

@@ -11,7 +11,7 @@ public class ArticleReq {
private Long id;
private String title;
private String mdContent;
private String tags;
private String[] tags;
private Boolean type;
private String url;
private String category;

View File

@@ -9,9 +9,8 @@ import lombok.Data;
@Data
public class CommentReq {
private Long id;
private Boolean comment;
private String content;
private Long pid;
private Long articleID;
private String responseId;
private long pid = -1;
private String pagePath;
private long toUserId = -1;
}

View File

@@ -0,0 +1,17 @@
package cn.celess.blog.entity.request;
import lombok.Data;
/**
* @author : xiaohai
* @date : 2020/07/31 20:50
*/
@Data
public class LinkApplyReq {
private String name;
private String email;
private String url;
private String linkUrl;
private String desc;
private String iconPath;
}

View File

@@ -11,5 +11,7 @@ public class LinkReq {
private long id;
private String name;
private String url;
private String iconPath;
private String desc;
private boolean open;
}

View File

@@ -1,12 +1,16 @@
package cn.celess.blog.entity.request;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author : xiaohai
* @date : 2019/06/01 22:47
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class LoginReq {
private String email;
private String password;

View File

@@ -26,12 +26,11 @@ import javax.servlet.http.HttpServletRequest;
@ControllerAdvice
public class ExceptionHandle {
public static final Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
@Autowired
MailService mailService;
@Autowired
HttpServletRequest request;
public static final Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
@Value("${spring.profiles.active}")
private String activeModel;
@@ -40,28 +39,29 @@ public class ExceptionHandle {
public Response handle(Exception e) {
//自定义错误
if (e instanceof MyException) {
logger.debug("返回了自定义的exception,[code={},msg={}]", ((MyException) e).getCode(), e.getMessage());
return new Response(((MyException) e).getCode(), e.getMessage(), null, System.currentTimeMillis());
MyException exception = (MyException) e;
logger.debug("返回了自定义的exception,[code={},msg={},result={}]", exception.getCode(), e.getMessage(), exception.getResult());
return new Response(exception.getCode(), e.getMessage(), exception.getResult());
}
//请求路径不支持该方法
if (e instanceof HttpRequestMethodNotSupportedException) {
logger.debug("遇到请求路径与请求方法不匹配的请求,[msg={}path:{},method:{}]", e.getMessage(),request.getRequestURL(),request.getMethod());
return new Response(ResponseEnum.ERROR.getCode(), e.getMessage(), null, System.currentTimeMillis());
logger.debug("遇到请求路径与请求方法不匹配的请求,[msg={}path:{},method:{}]", e.getMessage(), request.getRequestURL(), request.getMethod());
return new Response(ResponseEnum.ERROR.getCode(), e.getMessage(), null);
}
//数据输入类型不匹配
if (e instanceof MethodArgumentTypeMismatchException) {
logger.debug("输入类型不匹配,[msg={}]", e.getMessage());
return new Response(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入有问题,请修改后再访问", null, System.currentTimeMillis());
return new Response(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入有问题,请修改后再访问", null);
}
//数据验证失败
if (e instanceof BindException) {
logger.debug("数据验证失败,[msg={}]", e.getMessage());
return new Response(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入有问题,请修改", null, System.currentTimeMillis());
return new Response(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入有问题,请修改", null);
}
//数据输入不完整
if (e instanceof MissingServletRequestParameterException) {
logger.debug("数据输入不完整,[msg={}]", e.getMessage());
return new Response(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入不完整,请检查", null, System.currentTimeMillis());
return new Response(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入不完整,请检查", null);
}
// 发送错误信息到邮箱
@@ -70,7 +70,7 @@ public class ExceptionHandle {
sendMessage(e);
}
e.printStackTrace();
return new Response(ResponseEnum.ERROR.getCode(), "服务器出现错误,已记录", null, System.currentTimeMillis());
return new Response(ResponseEnum.ERROR.getCode(), "服务器出现错误,已记录", null);
}
/**
@@ -83,7 +83,12 @@ public class ExceptionHandle {
simpleMailMessage.setTo("a@celess.cn");
simpleMailMessage.setSubject("服务器出现了错误");
StringBuilder msg = new StringBuilder();
msg.append("requirePath:\n").append(request.getRequestURL().toString()).append("?").append(request.getQueryString()).append("\n\n\n");
String queryString = request.getQueryString();
msg.append("requirePath:\n").append(request.getRequestURL().toString());
if (queryString != null) {
msg.append("?").append(queryString);
}
msg.append("\n\n\n");
msg.append("msg:\n").append(e.getMessage()).append("\n\n\n");
msg.append("date:\n").append(DateFormatUtil.getNow()).append("\n\n\n");
msg.append("from:\n").append(request.getHeader("User-Agent")).append("\n\n\n");

View File

@@ -1,13 +1,16 @@
package cn.celess.blog.exception;
import cn.celess.blog.enmu.ResponseEnum;
import lombok.Data;
/**
* @author : xiaohai
* @date : 2019/03/28 16:56
*/
@Data
public class MyException extends RuntimeException {
private int code;
private Object result;
public MyException(int code, String msg) {
super(msg);
@@ -19,16 +22,20 @@ public class MyException extends RuntimeException {
this.code = e.getCode();
}
public MyException(ResponseEnum e, Object result) {
super(e.getMsg());
this.code = e.getCode();
this.result = result;
}
public MyException(ResponseEnum e, String msg) {
super(msg + e.getMsg());
this.code = e.getCode();
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
public MyException(ResponseEnum e, String msg, Object result) {
super(e.getMsg());
this.code = e.getCode();
this.result = result;
}
}

View File

@@ -1,7 +1,7 @@
package cn.celess.blog.mapper;
import cn.celess.blog.entity.Article;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
@@ -21,21 +21,15 @@ public interface ArticleMapper {
int update(Article a);
int updateNextArticleId(long targetArticleID, long nextArticleID);
int updatePreArticleId(long targetArticleID, long preArticleID);
long getLastestArticleId();
Article getLastestArticle();
Article findArticleById(long id);
boolean existsByTitle(String title);
boolean existsById(long id);
boolean isDeletedById(long id);
List<Article> findAllByAuthorId(long authorID);
List<Article> findAllByAuthorId(long authorId);
List<Article> findAllByOpen(boolean isOpen);
@@ -43,15 +37,15 @@ public interface ArticleMapper {
List<Article> findAllByCategoryId(long id);
List<Article> findAllByCategoryIdAndOpen(long id);
List<Article> findAll();
Article getSimpleInfo(long id);
Article getPreArticle(Long id);
List<Article> getSimpleInfoByCategory(long categoryId);
Article getNextArticle(Long id);
List<Article> getSimpleInfoByTag(List<String> idList);
int setReadingNumber(long number, long id);
int updateReadingNumber(long id);
long count();

View File

@@ -0,0 +1,38 @@
package cn.celess.blog.mapper;
import cn.celess.blog.entity.ArticleTag;
import cn.celess.blog.entity.Tag;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @Author: 小海
* @Date: 2020-05-24 14:21
* @Desc:
*/
@Mapper
@Repository
public interface ArticleTagMapper {
int insert(ArticleTag articleTag);
int update(ArticleTag articleTag);
ArticleTag findOneById(Long id);
int deleteById(Long id);
int deleteByArticleId(Long articleId);
List<ArticleTag> findAllByArticleId(Long articleId);
List<Tag> findTagByArticleId(Long articleId);
int deleteMultiById(List<ArticleTag> articleTags);
List<ArticleTag> findArticleByTag(Long tagId);
List<ArticleTag> findArticleByTagAndOpen(Long tagId);
}

View File

@@ -34,7 +34,7 @@ public interface CategoryMapper {
String getNameById(long id);
Long getIDByName(String name);
Long getIdByName(String name);
Category getLastestCategory();

View File

@@ -8,8 +8,8 @@ import java.util.List;
/**
* @Author: 小海
* @Date 2019/06/30 16:19
* @Description
* @Date: 2019/06/30 16:19
* @Description:
*/
@Mapper
@Repository
@@ -18,11 +18,9 @@ public interface CommentMapper {
int updateContent(String content, long id);
int updateResponder(String responder, long id);
int delete(long id);
int deleteByArticleId(long articleId);
int deleteByPagePath(String pagePath);
boolean existsById(long id);
@@ -30,19 +28,17 @@ public interface CommentMapper {
Comment getLastestComment();
List<Comment> findAllByAuthorIDAndType(long id, boolean isComment);
List<Comment> findAllByFromUser(long id);
List<Comment> findAllByPId(long pid);
List<Comment> findAllByPid(long pid);
List<Comment> findAllByArticleID(long articleId);
List<Comment> findAllByPagePath(String pagePath);
List<Comment> findAllByArticleIDAndPId(long articleID, long pid);
List<Comment> findAllByPagePathAndFromUser(String pagePath, long userId);
List<Comment> findCommentsByTypeAndPId(boolean isComment, long pid);
List<Comment> findAllByPagePathAndPidAndNormal(String pagePath, long pid);
List<Comment> findAllByPId(int pid);
long countByPagePath(String pagePath);
List<Comment> findAllByType(boolean isComment);
long countByType(boolean isComment);
long count();
}

View File

@@ -36,5 +36,6 @@ public interface PartnerMapper {
List<PartnerSite> findAll();
List<PartnerSite> findAll(Boolean deleted);
}

View File

@@ -26,10 +26,6 @@ public interface TagMapper {
Boolean existsByName(String name);
Long getIDByName(String name);
String getNameById(long id);
Tag getLastestTag();
List<Tag> findAll();

View File

@@ -4,7 +4,6 @@ import cn.celess.blog.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List;
/**
@@ -16,13 +15,13 @@ import java.util.List;
@Repository
public interface UserMapper {
int addUser(String email, String pwd);
int addUser(User user);
int updateInfo(String desc, String displayName, long id);
int updateAvatarImgUrl(String avatarImgUrl, long id);
int updateLoginTime(String email, Date date);
int updateLoginTime(String email);
int updateEmailStatus(String email, boolean status);
@@ -50,7 +49,11 @@ public interface UserMapper {
int delete(long id);
int setUserRole(Long uid, String role);
int lock(long id);
int setUserRole(Long id, String role);
List<User> findAll(Integer status);
List<User> findAll();

View File

@@ -20,5 +20,7 @@ public interface VisitorMapper {
List<Visitor> findAll();
List<Visitor> findAllNotDeleted();
long count();
}

View File

@@ -4,7 +4,6 @@ import cn.celess.blog.entity.WebUpdate;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List;
/**
@@ -27,5 +26,7 @@ public interface WebUpdateInfoMapper {
List<WebUpdate> findAll();
Date getLastestOne();
List<WebUpdate> findAllNotDeleted();
WebUpdate getLastestOne();
}

View File

@@ -1,8 +1,8 @@
package cn.celess.blog.service;
import cn.celess.blog.entity.model.ArticleModel;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.request.ArticleReq;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
@@ -39,11 +39,11 @@ public interface ArticleService {
/**
* 获取一篇文章的数据
*
* @param articleID 文章id
* @param articleId 文章id
* @param is4update 是否是因文章更新而请求数据
* @return 文章数据
*/
ArticleModel retrieveOneByID(long articleID, boolean is4update);
ArticleModel retrieveOneById(long articleId, boolean is4update);
/**
* 管理员 获取分页数据
@@ -52,7 +52,7 @@ public interface ArticleService {
* @param page 数据页
* @return 分页数据
*/
PageInfo adminArticles(int count, int page);
PageData<ArticleModel> adminArticles(int count, int page, Boolean deleted);
/**
* 获取文章状态为开放的文章
@@ -61,7 +61,7 @@ public interface ArticleService {
* @param page 数据页
* @return 分页数据
*/
PageInfo retrievePageForOpen(int count, int page);
PageData<ArticleModel> retrievePageForOpen(int count, int page);
/**
* 根据分类名获取文章数据
@@ -71,7 +71,7 @@ public interface ArticleService {
* @param page 数据页
* @return 分页数据
*/
PageInfo findByCategory(String name, int page, int count);
PageData<ArticleModel> findByCategory(String name, int page, int count);
/**
* 根据标签名获取文章数据
@@ -81,5 +81,5 @@ public interface ArticleService {
* @param page 数据页
* @return 分页数据
*/
PageInfo findByTag(String name, int page, int count);
PageData<ArticleModel> findByTag(String name, int page, int count);
}

View File

@@ -1,11 +1,9 @@
package cn.celess.blog.service;
import cn.celess.blog.entity.Category;
import cn.celess.blog.entity.model.CategoryModel;
import cn.celess.blog.entity.model.PageData;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author : xiaohai
* @date : 2019/03/28 22:42
@@ -20,14 +18,6 @@ public interface CategoryService {
*/
CategoryModel create(String name);
/**
* 增加一个分类
*
* @param category 分类对象
* @return 所增加的分类数据
*/
CategoryModel create(Category category);
/**
* 通过id删除分类
*
@@ -50,6 +40,6 @@ public interface CategoryService {
*
* @return 全部的分类数据
*/
List<CategoryModel> retrievePage();
PageData<CategoryModel> retrievePage(int page, int count);
}

View File

@@ -1,10 +1,12 @@
package cn.celess.blog.service;
import cn.celess.blog.entity.model.CommentModel;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.request.CommentReq;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author : xiaohai
* @date : 2019/03/29 16:58
@@ -38,64 +40,52 @@ public interface CommentService {
/**
* 分页获取数据
*
* @param isComment true评论 false留言
* @param count 单页数据量
* @param page 数据页
* @param pagePath pagePath
* @param count 单页数据量
* @param page 数据页
* @return 分页数据
*/
PageInfo<CommentModel> retrievePage(Boolean isComment, int page, int count);
PageData<CommentModel> retrievePage(String pagePath, int page, int count);
/**
* 通过pid获取数据
*
* @param pid 父id
* @param count 单页数据量
* @param page 数据页
* @param pid 父id
* @return 分页数据
*/
PageInfo<CommentModel> retrievePageByPid(long pid, int page, int count);
List<CommentModel> retrievePageByPid(long pid);
/**
* 根据评论者获取数据
*
* @param isComment true评论 false留言
* @param count 单页数据量
* @param page 数据页
* @param pagePath pagePath
* @param count 单页数据量
* @param page 数据页
* @return 分页数据
*/
PageInfo<CommentModel> retrievePageByAuthor(Boolean isComment, int page, int count);
PageData<CommentModel> retrievePageByAuthor(String pagePath, int page, int count);
/**
* 根据文章获取数据
*
* @param articleID 文章id
* @param pid 父id
* @param count 单页数据量
* @param page 数据页
* @return 分页数据
*/
PageInfo<CommentModel> retrievePageByArticle(long articleID, long pid, int page, int count);
/**
* 根据数据的type和pid获取数据
*
* @param isComment true评论 false留言
* @param pid 父id
* @param count 单页数据量
* @param page 数据页
* @param pagePath pagePath
* @param pid 父id
* @param count 单页数据量
* @param page 数据页
* @return 分页数据
*/
PageInfo<CommentModel> retrievePageByTypeAndPid(Boolean isComment, int pid, int page, int count);
PageData<CommentModel> retrievePageByPageAndPid(String pagePath, long pid, int page, int count);
/**
* 根据type获取数据
*
* @param isComment true评论 false留言
* @param count 单页数据量
* @param page 数据页
* @param pagePath pagePath
* @param count 单页数据量
* @param page 数据页
* @return 分页数据
*/
PageInfo<CommentModel> retrievePageByType(Boolean isComment, int page, int count);
PageData<CommentModel> retrievePageByPage(String pagePath, int page, int count);
}

View File

@@ -36,13 +36,6 @@ public interface CountService {
*/
long getTagsCount();
/**
* 获取留言数量
*
* @return 留言数量
*/
long getLeaveMessageCount();
/**
* 获取用户量
*

View File

@@ -1,8 +1,9 @@
package cn.celess.blog.service;
import cn.celess.blog.entity.PartnerSite;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.request.LinkApplyReq;
import cn.celess.blog.entity.request.LinkReq;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -44,7 +45,7 @@ public interface PartnerSiteService {
* @param page 数据页
* @return 分页数据
*/
PageInfo<PartnerSite> PartnerSitePages(int page, int count);
PageData<PartnerSite> partnerSitePages(int page, int count, Boolean deleted);
/**
* 获取全部数据
@@ -53,4 +54,19 @@ public interface PartnerSiteService {
*/
List<PartnerSite> findAll();
/**
* 申请友链
*
* @param linkApplyReq linkApplyReq
* @return linkApplyReq
*/
PartnerSite apply(LinkApplyReq linkApplyReq);
/**
* 重写申请友链
*
* @param key key
* @return msg
*/
String reapply(String key);
}

View File

@@ -1,8 +1,7 @@
package cn.celess.blog.service;
import cn.celess.blog.entity.Tag;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.model.TagModel;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -21,15 +20,6 @@ public interface TagService {
*/
TagModel create(String name);
/**
* 新增数据
*
* @param tag tag对象
* @return 新增后的数据
*/
TagModel create(Tag tag);
/**
* 删除数据
*
@@ -47,23 +37,6 @@ public interface TagService {
*/
TagModel update(Long id, String name);
/**
* 查询单个标签信息
*
* @param tagId id
* @return 标签的数据
*/
TagModel retrieveOneById(long tagId);
/**
* 通过name查询标签的信息
*
* @param name tag的名称
* @return 标签数据
*/
TagModel retrieveOneByName(String name);
/**
* 分页获取标签数据
*
@@ -71,7 +44,7 @@ public interface TagService {
* @param page 数据页
* @return 分页数据
*/
PageInfo<TagModel> retrievePage(int page, int count);
PageData<TagModel> retrievePage(int page, int count);
/**
* 获取全部标签数据

View File

@@ -1,16 +1,12 @@
package cn.celess.blog.service;
import cn.celess.blog.entity.User;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.model.UserModel;
import cn.celess.blog.entity.request.LoginReq;
import cn.celess.blog.entity.request.UserReq;
import com.github.pagehelper.PageInfo;
import net.sf.json.JSONObject;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.io.InputStream;
import java.util.List;
/**
* @author : xiaohai
@@ -42,14 +38,6 @@ public interface UserService {
*/
Object logout();
/**
* 获取用户头像的链接
*
* @param id 用户id
* @return 头像链接
*/
String getAvatarImg(long id);
/**
* 更新用户数据
*
@@ -83,14 +71,6 @@ public interface UserService {
*/
String getUserRoleByEmail(String email);
/**
* 通过邮箱获取用户的信息
*
* @param email 用户邮箱
* @return 用户信息
*/
User getUserInfoByEmail(String email);
/**
* 获取邮箱是否注册过
*
@@ -99,14 +79,6 @@ public interface UserService {
*/
boolean isExistOfEmail(String email);
/**
* 获取用户的name 优先返回displayName 否则返回email
*
* @param id 用户id
* @return name
*/
String getNameById(long id);
/**
* 发送重置密码邮件
*
@@ -157,7 +129,7 @@ public interface UserService {
* @param page 数据页
* @return 分页数据
*/
PageInfo<UserModel> getUserList(Integer page, Integer count);
PageData<UserModel> getUserList(Integer page, Integer count, Integer status);
/**
* 更改用户信息
@@ -174,4 +146,14 @@ public interface UserService {
* @return true:存在 false不存在
*/
boolean getStatusOfEmail(String email);
/**
* 设置密码
*
* @param pwd pwd
* @param newPwd newPwd
* @param confirmPwd confirmPwd
* @return UserModel
*/
UserModel setPwd(String pwd, String newPwd, String confirmPwd);
}

View File

@@ -1,7 +1,7 @@
package cn.celess.blog.service;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.model.VisitorModel;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
@@ -20,7 +20,7 @@ public interface VisitorService {
* @param showLocation 是否显示位置信息 开启改选项数据响应超慢
* @return 分页数据
*/
PageInfo<VisitorModel> visitorPage(int page, int count, boolean showLocation);
PageData<VisitorModel> visitorPage(int page, int count, boolean showLocation);
/**
* 新增访客

View File

@@ -1,10 +1,11 @@
package cn.celess.blog.service;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.model.WebUpdateModel;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* @author : xiaohai
@@ -44,7 +45,7 @@ public interface WebUpdateInfoService {
* @param page 数据页
* @return 分页数据
*/
PageInfo<WebUpdateModel> pages(int count, int page);
PageData<WebUpdateModel> pages(int count, int page);
/**
* 获取全部的更新记录
@@ -58,5 +59,5 @@ public interface WebUpdateInfoService {
*
* @return
*/
String getLastestUpdateTime();
Map<String, Object> getLastestUpdateTime();
}

View File

@@ -1,35 +1,32 @@
package cn.celess.blog.service.serviceimpl;
import cn.celess.blog.enmu.LevelEnum;
import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.enmu.RoleEnum;
import cn.celess.blog.entity.*;
import cn.celess.blog.entity.model.ArticleModel;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.request.ArticleReq;
import cn.celess.blog.exception.MyException;
import cn.celess.blog.mapper.ArticleMapper;
import cn.celess.blog.mapper.CategoryMapper;
import cn.celess.blog.mapper.CommentMapper;
import cn.celess.blog.mapper.TagMapper;
import cn.celess.blog.mapper.*;
import cn.celess.blog.service.ArticleService;
import cn.celess.blog.service.UserService;
import cn.celess.blog.util.DateFormatUtil;
import cn.celess.blog.util.ModalTrans;
import cn.celess.blog.util.RedisUserUtil;
import cn.celess.blog.util.RegexUtil;
import cn.celess.blog.util.StringFromHtmlUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.youbenzi.mdtool.tool.MDTool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
@@ -37,8 +34,8 @@ import java.util.List;
* @date : 2019/03/28 15:21
*/
@Service
@Slf4j
public class ArticleServiceImpl implements ArticleService {
public static final Logger logger = LoggerFactory.getLogger(ArticleServiceImpl.class);
@Autowired
ArticleMapper articleMapper;
@@ -50,6 +47,8 @@ public class ArticleServiceImpl implements ArticleService {
@Autowired
CommentMapper commentMapper;
@Autowired
ArticleTagMapper articleTagMapper;
@Autowired
UserService userService;
@Autowired
HttpServletRequest request;
@@ -79,303 +78,179 @@ public class ArticleServiceImpl implements ArticleService {
if (reqBody.getCategory() == null || reqBody.getCategory().replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
if (reqBody.getTags() == null || reqBody.getTags().replaceAll(" ", "").isEmpty()) {
if (reqBody.getTags() == null || reqBody.getTags().length == 0) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
if (articleMapper.existsByTitle(reqBody.getTitle())) {
throw new MyException(ResponseEnum.ARTICLE_HAS_EXIST);
}
// 查看是否存在已有的分类
Category category = categoryMapper.findCategoryByName(reqBody.getCategory());
if (category == null) {
throw new MyException(ResponseEnum.CATEGORY_NOT_EXIST);
}
//写入数据库的数据
// 构建 需要写入数据库的对象数据
Article article = new Article();
article.setTitle(reqBody.getTitle());
article.setOpen(reqBody.getOpen());
article.setMdContent(reqBody.getMdContent());
article.setUrl(reqBody.getUrl());
article.setType(reqBody.getType());
BeanUtils.copyProperties(reqBody, article);
article.setAuthorId(redisUserUtil.get().getId());
article.setPublishDate(new Date());
//防止出现 “null,xxx”这种情况
article.setTagsId("");
//是否需要更新上一篇文章
boolean isUpdatePreArticle = true;
Article preArticle = null;
if (articleMapper.count() == 0) {
isUpdatePreArticle = false;
} else {
//获取最新的一条数据
preArticle = articleMapper.getLastestArticle();
}
if (isUpdatePreArticle) {
logger.info("上一篇文章的id为" + preArticle.getId());
//设置上一篇文章的id
article.setPreArticleId(preArticle.getId());
}
article.setUser(redisUserUtil.get());
//markdown->html->summary
String str = StringFromHtmlUtil.getString(MDTool.markdown2Html(article.getMdContent()));
//获取摘要 摘要长度为255个字符
String summary = str.length() > 240 ? str.substring(0, 240) + "......" : str;
//去除转换后存在的空格
String tagStr = reqBody.getTags().replaceAll(" ", "");
article.setSummary(summary);
if (articleMapper.existsByTitle(article.getTitle())) {
throw new MyException(ResponseEnum.ARTICLE_HAS_EXIST);
}
//将分类写入数据库
Category category1 = categoryMapper.findCategoryByName(reqBody.getCategory());
if (category1 == null) {
category1 = new Category();
category1.setArticles("");
category1.setName(reqBody.getCategory());
categoryMapper.insert(category1);
}
article.setCategoryId(category1.getId());
article.setCategory(category);
//文章存数据库
articleMapper.insert(article);
//获取新增的文章
if (isUpdatePreArticle) {
//更新上一篇文章的“下一篇文章ID”
articleMapper.updateNextArticleId(preArticle.getId(), article.getId());
}
//无效
// articleMapper.updatePreArticleId(article.getId(), preArticle == null ? -1 : preArticle.getId());
article.setPreArticleId(preArticle == null ? -1 : preArticle.getId());
category1.setArticles(category1.getArticles() + article.getId() + ",");
categoryMapper.update(category1);
//将标签写入数据库
for (String t : tagStr.split(",")) {
if (t.replaceAll(" ", "").length() == 0) {
for (String tagName : reqBody.getTags()) {
if (tagName.replaceAll(" ", "").length() == 0) {
//单个标签只含空格
continue;
}
Tag tag = tagMapper.findTagByName(t);
Tag tag = tagMapper.findTagByName(tagName);
if (tag == null) {
tag = new Tag();
tag.setName(t);
tag.setArticles("");
tag.setName(tagName);
tagMapper.insert(tag);
}
tag.setArticles(tag.getArticles() + article.getId() + ",");
article.setTagsId(article.getTagsId() + tag.getId() + ",");
tagMapper.update(tag);
ArticleTag articleTag = new ArticleTag(article, tag);
articleTagMapper.insert(articleTag);
}
articleMapper.update(article);
return fullTransform(articleMapper.getLastestArticle());
}
Article articleFromDb = articleMapper.findArticleById(article.getId());
ArticleModel articleModel = ModalTrans.article(articleFromDb);
articleModel.setPreArticle(ModalTrans.article(articleMapper.getPreArticle(article.getId()), true));
return articleModel;
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean delete(long articleID) {
Article articleForDel = articleMapper.findArticleById(articleID);
public boolean delete(long articleId) {
Article articleForDel = articleMapper.findArticleById(articleId);
if (articleForDel == null) {
throw new MyException(ResponseEnum.ARTICLE_NOT_EXIST);//文章不存在
//文章不存在
throw new MyException(ResponseEnum.ARTICLE_NOT_EXIST);
}
Article preArticle = articleMapper.findArticleById(articleForDel.getPreArticleId());
Article nextArticle = articleMapper.findArticleById(articleForDel.getNextArticleId());
//对访问情况进行判断 非博主/非自己文章 拒绝访问
//对访问情况进行判断 非admin 权限不可删除文章
User user = redisUserUtil.get();
if (!user.getRole().contains("admin") && !articleForDel.getAuthorId().equals(user.getId())) {
if (!RoleEnum.ADMIN_ROLE.getRoleName().equals(user.getRole())) {
throw new MyException(ResponseEnum.PERMISSION_ERROR);
}
//删除的文章处于中间位置
if (nextArticle != null && preArticle != null) {
//修改上一篇文章的“下一篇文章”y
articleMapper.updateNextArticleId(articleForDel.getPreArticleId(), articleForDel.getNextArticleId());
//修改下一篇文章的 “上一篇文章”
articleMapper.updatePreArticleId(articleForDel.getNextArticleId(), articleForDel.getPreArticleId());
}
if (preArticle == null && nextArticle != null) {
//删除的是第一篇文章
articleMapper.updatePreArticleId(nextArticle.getId(), -1);
}
if (nextArticle == null && preArticle != null) {
//删除的是最后一篇文章
articleMapper.updateNextArticleId(preArticle.getId(), -1);
}
// delete count 为删除的数据数量
int deleteCount = commentMapper.deleteByArticleId(articleID);
//删除标签中的文章id
String tag = articleForDel.getTagsId();
if (tag.length() > 0) {
String[] tags = tag.split(",");
for (String t : tags) {
if (t != null) {
//查询标签
Tag tag1 = tagMapper.findTagById(Long.parseLong(t));
//去除标签中的articleId中的待删除的文章id
String s = tag1.getArticles().replaceAll(articleForDel.getId() + ",", "");
tag1.setArticles(s);
tagMapper.update(tag1);
}
}
}
//删除分类中的文章id
//获取文章的分类
long categoryId = articleForDel.getCategoryId();
Category category = categoryMapper.findCategoryById(categoryId);
//删除文章id
category.setArticles(category.getArticles().replaceAll(articleForDel.getId() + ",", ""));
//更新
categoryMapper.update(category);
//删除指定文章
articleMapper.delete(articleID);
articleMapper.delete(articleId);
//articleTagMapper.deleteByArticleId(articleId);
return true;
}
@Transactional(rollbackFor = Exception.class)
@Override
public ArticleModel update(ArticleReq reqBody) {
if (reqBody == null) {
if (reqBody == null || reqBody.getId() == null) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
// 查找数据
Article article = articleMapper.findArticleById(reqBody.getId());
//数据判断
if (reqBody.getTitle() == null || reqBody.getTitle().replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
} else if (reqBody.getMdContent() == null || reqBody.getMdContent().replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
if (reqBody.getTitle() != null && !reqBody.getTitle().replaceAll(" ", "").isEmpty()) {
if (!article.getTitle().equals(reqBody.getTitle()) && articleMapper.existsByTitle(reqBody.getTitle())) {
throw new MyException(ResponseEnum.ARTICLE_HAS_EXIST);
}
article.setTitle(reqBody.getTitle());
}
if (reqBody.getMdContent() != null && !reqBody.getMdContent().replaceAll(" ", "").isEmpty()) {
article.setMdContent(reqBody.getMdContent());
}
//转载 判断链接
if (!reqBody.getType()) {
if (reqBody.getUrl() == null || reqBody.getUrl().replaceAll(" ", "").isEmpty()) {
if (reqBody.getType() != null) {
if (!reqBody.getType() && reqBody.getUrl() == null) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
} else if (!RegexUtil.urlMatch(reqBody.getUrl())) {
}
if (!reqBody.getType() && !RegexUtil.urlMatch(reqBody.getUrl())) {
throw new MyException(ResponseEnum.PARAMETERS_URL_ERROR);
}
article.setType(reqBody.getType());
article.setUrl(reqBody.getUrl());
}
if (reqBody.getCategory() == null || reqBody.getCategory().replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
// 暂时不更新tags
if (reqBody.getTags() == null || reqBody.getTags().replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
if (reqBody.getCategory() != null && !reqBody.getCategory().replaceAll(" ", "").isEmpty()) {
Category category = categoryMapper.findCategoryByName(reqBody.getCategory());
if (category == null) {
category = new Category();
category.setName(reqBody.getCategory());
categoryMapper.insert(category);
}
article.setCategory(category);
}
//写入数据库的数据
Article article = new Article();
if (reqBody.getId() == null) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR.getCode(), "id不能为空");
}
article.setId(reqBody.getId());
article.setTitle(reqBody.getTitle());
article.setOpen(reqBody.getOpen());
article.setMdContent(reqBody.getMdContent());
article.setUrl(reqBody.getUrl());
article.setType(reqBody.getType());
Article oldArticle = articleMapper.findArticleById(reqBody.getId());
Category category = categoryMapper.findCategoryById(oldArticle.getCategoryId());
if (!(category.getName()).equals(reqBody.getCategory())) {
//修改更新之前数据 的分类
category.setArticles(category.getArticles().replace(reqBody.getId() + ",", ""));
//更新
categoryMapper.update(category);
//更新 更新之后的分类
Category category1 = categoryMapper.findCategoryByName(reqBody.getCategory());
if (category1 == null) {
category1 = new Category();
category1.setName(reqBody.getCategory());
category1.setArticles(reqBody.getId() + ",");
categoryMapper.insert(category1);
}
article.setCategoryId(category1.getId());
} else {
article.setCategoryId(oldArticle.getCategoryId());
}
String[] newTags = reqBody.getTags().split(",");
String[] tagIds = oldArticle.getTagsId().split(",");
//防止出现 null2这种情况
article.setTagsId("");
for (String t : newTags) {
Tag tag = tagMapper.findTagByName(t);
if (tag == null) {
tag = new Tag();
tag.setName(t);
tag.setArticles(oldArticle.getId() + ",");
int status = tagMapper.insert(tag);
if (status == 0) {
// 插入失败
throw new MyException(ResponseEnum.FAILURE);
}
article.setTagsId(article.getTagsId() + tag.getId() + ",");
continue;
}
article.setTagsId(article.getTagsId() + tag.getId() + ",");
}
for (String tagId : tagIds) {
Tag tagById = tagMapper.findTagById(Long.parseLong(tagId));
// 在新更新的tag中是否有原有的tag
boolean isOldTag = false;
for (String s : newTags) {
if (s.equals(tagById.getName())) {
isOldTag = true;
break;
}
}
if (!isOldTag) {
tagById.setArticles(tagById.getArticles().replace(oldArticle.getId() + ",", ""));
}
tagMapper.update(tagById);
}
//
// // TODO:::: tag的更新
// article.setTagsId(oldArticle.getTagsId());
article.setUpdateDate(new Date());
// TODO::::换用beansUtil
// 设置不定参数
article.setReadingNumber(oldArticle.getReadingNumber());
article.setPublishDate(oldArticle.getPublishDate());
article.setAuthorId(redisUserUtil.get().getId());
article.setPreArticleId(oldArticle.getPreArticleId());
article.setNextArticleId(oldArticle.getNextArticleId());
article.setOpen(reqBody.getOpen() == null ? article.getOpen() : reqBody.getOpen());
String str = StringFromHtmlUtil.getString(MDTool.markdown2Html(article.getMdContent()));
article.setSummary(str.length() > 240 ? str.substring(0, 240) + "......" : str);
articleMapper.update(article);
List<ArticleTag> allByArticleId = articleTagMapper.findAllByArticleId(article.getId());
List<ArticleTag> updateList = new ArrayList<>();
List<ArticleTag> deleteList = new ArrayList<>();
// 获取要更新 的标签
for (String tag : reqBody.getTags()) {
boolean contain = allByArticleId.stream().anyMatch(articleTag -> articleTag.getTag().getName().equals(tag));
if (!contain) {
ArticleTag articleTag = new ArticleTag();
articleTag.setArticle(article);
Tag tagByName = tagMapper.findTagByName(tag);
if (tagByName == null) {
tagByName = new Tag(tag);
tagMapper.insert(tagByName);
}
articleTag.setTag(tagByName);
updateList.add(articleTag);
}
}
// 获取要删除的标签
allByArticleId.forEach(articleTag -> {
boolean contain = false;
for (String tag : reqBody.getTags()) {
if (articleTag.getTag().getName().equals(tag)) {
contain = true;
break;
}
}
if (!contain) {
deleteList.add(articleTag);
}
});
if (updateList.size() != 0) {
updateList.forEach(articleTag -> articleTagMapper.insert(articleTag));
}
if (deleteList.size() != 0) {
articleTagMapper.deleteMultiById(deleteList);
}
//更新完成移除
request.getSession().removeAttribute("article4update");
return fullTransform(article);
ArticleModel articleModel = ModalTrans.article(articleMapper.findArticleById(article.getId()));
setPreAndNextArticle(articleModel);
return articleModel;
}
@Override
public ArticleModel retrieveOneByID(long articleID, boolean is4update) {
Article article = articleMapper.findArticleById(articleID);
public ArticleModel retrieveOneById(long articleId, boolean is4update) {
Article article = articleMapper.findArticleById(articleId);
if (article == null) {
throw new MyException(ResponseEnum.ARTICLE_NOT_EXIST);
}
@@ -385,178 +260,102 @@ public class ArticleServiceImpl implements ArticleService {
throw new MyException(ResponseEnum.ARTICLE_NOT_PUBLIC);
}
}
article.setReadingNumber(article.getReadingNumber() + 1);
ArticleModel articleModel = ModalTrans.article(article);
if (is4update) {
//因更新而获取文章 不需要增加阅读量
request.getSession().setAttribute("article4update", article);
return fullTransform(article);
return articleModel;
}
articleMapper.setReadingNumber(article.getReadingNumber() + 1, articleID);
return fullTransform(article);
setPreAndNextArticle(articleModel);
articleMapper.updateReadingNumber(articleId);
return articleModel;
}
/**
* @param count 数目
* @param page 页面 默认减1
* @return
* @param page 页面
* @return PageInfo
*/
@Override
public PageInfo adminArticles(int count, int page) {
public PageData<ArticleModel> adminArticles(int count, int page, Boolean deleted) {
PageHelper.startPage(page, count);
List<Article> articleList = articleMapper.findAll();
PageInfo pageInfo = new PageInfo(articleList);
pageInfo.setList(list2list(articleList, LevelEnum.BETWEEN_M_AND_H));
return pageInfo;
PageData<ArticleModel> pageData = new PageData<>(new PageInfo<>(articleList));
List<Article> collect;
if (deleted != null) {
collect = articleList.stream().filter(article -> article.isDeleted() == deleted).collect(Collectors.toList());
} else {
collect = articleList;
}
List<ArticleModel> articleModels = collect.stream()
.peek(article -> article.setMdContent(null))
.map(ModalTrans::article)
.collect(Collectors.toList());
pageData.setList(articleModels);
return pageData;
}
@Override
public PageInfo retrievePageForOpen(int count, int page) {
public PageData<ArticleModel> retrievePageForOpen(int count, int page) {
PageHelper.startPage(page, count);
List<Article> articleList = articleMapper.findAllByOpen(true);
PageInfo pageInfo = new PageInfo(articleList);
pageInfo.setList(list2list(articleList, LevelEnum.MIDDLE));
return pageInfo;
PageData<ArticleModel> pageData = new PageData<>(new PageInfo<>(articleList));
List<ArticleModel> articleModelList = articleList
.stream()
.map(article -> setPreAndNextArticle(ModalTrans.article(article, true)))
.collect(Collectors.toList());
pageData.setList(articleModelList);
return pageData;
}
@Override
public PageInfo findByCategory(String name, int page, int count) {
Long idByName = categoryMapper.getIDByName(name);
if (idByName == null) {
public PageData<ArticleModel> findByCategory(String name, int page, int count) {
Category category = categoryMapper.findCategoryByName(name);
if (category == null) {
throw new MyException(ResponseEnum.CATEGORY_NOT_EXIST);
}
PageHelper.startPage(page, count);
PageInfo pageInfo = new PageInfo(articleMapper.getSimpleInfoByCategory(idByName));
return pageInfo;
List<Article> open = articleMapper.findAllByCategoryIdAndOpen(category.getId());
List<ArticleModel> modelList = open.stream()
.map(article -> ModalTrans.article(article, true))
.peek(articleModel -> {
articleModel.setNextArticle(null);
articleModel.setPreArticle(null);
})
.collect(Collectors.toList());
return new PageData<>(new PageInfo<>(open), modelList);
}
@Override
public PageInfo findByTag(String name, int page, int count) {
public PageData<ArticleModel> findByTag(String name, int page, int count) {
Tag tag = tagMapper.findTagByName(name);
if (tag == null) {
throw new MyException(ResponseEnum.TAG_NOT_EXIST);
}
PageHelper.startPage(page, count);
String[] split = tag.getArticles().split(",");
List<String> list = Arrays.asList(split);
List<Article> articleList = articleMapper.getSimpleInfoByTag(list);
PageInfo pageInfo = new PageInfo(articleList);
return pageInfo;
List<ArticleTag> articleByTag = articleTagMapper.findArticleByTagAndOpen(tag.getId());
List<ArticleModel> modelList = articleByTag
.stream()
.map(articleTag -> ModalTrans.article(articleTag.getArticle(), true))
.peek(articleModel -> {
articleModel.setNextArticle(null);
articleModel.setPreArticle(null);
}).collect(Collectors.toList());
return new PageData<>(new PageInfo<>(articleByTag), modelList);
}
/**
* page转换
*
* @param articleList 数据源
* @param level 转换级别
* @return list
*/
private List<ArticleModel> list2list(List<Article> articleList, LevelEnum level) {
List<ArticleModel> content = new ArrayList<>();
for (Article a : articleList) {
ArticleModel model;
switch (level.getLevelCode()) {
case 0:
model = simpleTransform(a);
break;
case 1:
model = suitableTransform(a);
break;
case 2:
model = suitableTransformForAdmin(a);
break;
case 3:
default:
model = fullTransform(a);
}
content.add(model);
private ArticleModel setPreAndNextArticle(ArticleModel articleModel) {
if (articleModel == null) {
return null;
}
return content;
articleModel.setPreArticle(ModalTrans.article(articleMapper.getPreArticle(articleModel.getId()), true));
articleModel.setNextArticle(ModalTrans.article(articleMapper.getNextArticle(articleModel.getId()), true));
return articleModel;
}
/**
* 简单的模型转换
* [id,title,summary]
*
* @param a 源数据
* @return 模型
*/
private ArticleModel simpleTransform(Article a) {
ArticleModel model = new ArticleModel();
model.setId(a.getId());
model.setTitle(a.getTitle());
model.setSummary(a.getSummary());
return model;
}
/**
* 中等转换
* [id,title,summary]
* +
* [original,tags,category]
*
* @param a
* @return
*/
private ArticleModel suitableTransform(Article a) {
ArticleModel model = simpleTransform(a);
model.setAuthorName(userService.getNameById(a.getAuthorId()));
model.setPublishDateFormat(DateFormatUtil.get(a.getPublishDate()));
model.setOriginal(a.getType());
model.setCategory(categoryMapper.getNameById(a.getCategoryId()));
String[] split = a.getTagsId().split(",");
String[] tags = new String[split.length];
for (int i = 0; i < split.length; i++) {
if (split[i] == null || "".equals(split[i])) {
continue;
}
tags[i] = tagMapper.getNameById(Long.parseLong(split[i]));
}
model.setTags(tags);
return model;
}
/**
* 中等转换 for admin页面
* [id,title]
* +
* [original,UpdateDate,open,readingNumber]
*
* @param a
* @return
*/
private ArticleModel suitableTransformForAdmin(Article a) {
ArticleModel model = simpleTransform(a);
model.setPublishDateFormat(DateFormatUtil.get(a.getPublishDate()));
model.setUpdateDateFormat(DateFormatUtil.get(a.getUpdateDate()));
model.setReadingNumber(a.getReadingNumber());
model.setOpen(a.getOpen());
model.setOriginal(a.getType());
model.setSummary(null);
return model;
}
/**
* 全转换
* [id,title,summary,original,tags,category]
* +
* [UpdateDate,MdContent,NextArticleId,NextArticleTitle,preArticleId,preArticleTitle,open,url,readingNumber]
*
* @param a
* @return
*/
private ArticleModel fullTransform(Article a) {
ArticleModel model = suitableTransform(a);
model.setUpdateDateFormat(DateFormatUtil.get(a.getUpdateDate()));
model.setMdContent(a.getMdContent());
model.setNextArticleId(a.getNextArticleId());
model.setNextArticleTitle(a.getNextArticleId() == -1 ? "" : articleMapper.getTitleById(a.getNextArticleId()));
model.setPreArticleId(a.getPreArticleId());
model.setPreArticleTitle(a.getPreArticleId() == -1 ? "" : articleMapper.getTitleById(a.getPreArticleId()));
model.setOpen(a.getOpen());
model.setUrl(a.getUrl());
model.setReadingNumber(a.getReadingNumber());
return model;
}
}

View File

@@ -3,17 +3,22 @@ package cn.celess.blog.service.serviceimpl;
import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.Article;
import cn.celess.blog.entity.Category;
import cn.celess.blog.entity.model.ArticleModel;
import cn.celess.blog.entity.model.CategoryModel;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.exception.MyException;
import cn.celess.blog.mapper.ArticleMapper;
import cn.celess.blog.mapper.CategoryMapper;
import cn.celess.blog.service.CategoryService;
import cn.celess.blog.util.ModalTrans;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author : xiaohai
@@ -35,46 +40,19 @@ public class CategoryServiceImpl implements CategoryService {
}
Category category = new Category();
category.setName(name);
category.setArticles("");
categoryMapper.insert(category);
return new CategoryModel(category);
}
@Override
public CategoryModel create(Category category) {
if (category == null) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
categoryMapper.insert(category);
return new CategoryModel(category);
return ModalTrans.category(category);
}
@Override
public boolean delete(long id) {
Category category = categoryMapper.findCategoryById(id);
if (category == null) {
throw new MyException(ResponseEnum.CATEGORY_NOT_EXIST);
}
String[] articleArray = category.getArticles().split(",");
for (int i = 0; i < articleArray.length; i++) {
if (articleArray[i] == null || "".equals(articleArray[i])) {
continue;
}
long articleId = Long.parseLong(articleArray[i]);
Article article = articleMapper.findArticleById(articleId);
if (article == null) {
continue;
}
article.setCategoryId(-1L);
//一个 文章只对应一个分类,分类不存在则文章默认不可见
article.setOpen(false);
articleMapper.update(article);
}
return categoryMapper.delete(id) == 1;
}
@Override
public CategoryModel update(Long id, String name) {
if (id == null) {
@@ -83,13 +61,32 @@ public class CategoryServiceImpl implements CategoryService {
Category category = categoryMapper.findCategoryById(id);
category.setName(name);
categoryMapper.update(category);
return new CategoryModel(category);
return ModalTrans.category(category);
}
@Override
public List<CategoryModel> retrievePage() {
List<CategoryModel> list = new ArrayList<>();
categoryMapper.findAll().forEach(e -> list.add(new CategoryModel(e)));
return list;
public PageData<CategoryModel> retrievePage(int page, int count) {
PageHelper.startPage(page, count);
List<Category> all = categoryMapper.findAll();
// 遍历没一个category
List<CategoryModel> modelList = all
.stream()
.map(ModalTrans::category)
.peek(categoryModel -> {
// 根据category去查article并赋值给categoryModel
List<Article> allByCategoryId = articleMapper.findAllByCategoryId(categoryModel.getId());
List<ArticleModel> articleModelList = allByCategoryId
.stream()
.map(article -> ModalTrans.article(article, true))
.peek(articleModel -> {
// 去除不必要的字段
articleModel.setPreArticle(null);
articleModel.setNextArticle(null);
articleModel.setTags(null);
})
.collect(Collectors.toList());
categoryModel.setArticles(articleModelList);
}).collect(Collectors.toList());
return new PageData<>(new PageInfo<>(all), modelList);
}
}

View File

@@ -1,25 +1,29 @@
package cn.celess.blog.service.serviceimpl;
import cn.celess.blog.enmu.CommentStatusEnum;
import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.Comment;
import cn.celess.blog.entity.User;
import cn.celess.blog.entity.model.CommentModel;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.request.CommentReq;
import cn.celess.blog.exception.MyException;
import cn.celess.blog.mapper.ArticleMapper;
import cn.celess.blog.mapper.CommentMapper;
import cn.celess.blog.mapper.UserMapper;
import cn.celess.blog.service.CommentService;
import cn.celess.blog.service.UserService;
import cn.celess.blog.util.DateFormatUtil;
import cn.celess.blog.util.ModalTrans;
import cn.celess.blog.util.RedisUserUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author : xiaohai
@@ -30,7 +34,7 @@ public class CommentServiceImpl implements CommentService {
@Autowired
CommentMapper commentMapper;
@Autowired
UserService userService;
UserMapper userMapper;
@Autowired
ArticleMapper articleMapper;
@Autowired
@@ -40,52 +44,43 @@ public class CommentServiceImpl implements CommentService {
@Override
public CommentModel create(CommentReq reqBody) {
if (reqBody == null) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
long authorID = redisUserUtil.get().getId();
User user = redisUserUtil.get();
Comment pComment = null;
if (reqBody.getPid() != null && reqBody.getPid() != -1) {
if (reqBody.getPid() != -1) {
pComment = commentMapper.findCommentById(reqBody.getPid());
}
if (reqBody.getPid() == null) {
reqBody.setPid(-1L);
}
//不是一级评论
if (reqBody.getPid() != -1 && pComment == null) {
//父评论不存在
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
Comment comment = new Comment();
comment.setAuthorID(authorID);
comment.setType(reqBody.getComment());
if (reqBody.getComment()) {
//若为评论
if (reqBody.getArticleID() <= 0) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
comment.setArticleID(reqBody.getArticleID());
} else {
comment.setArticleID(-1L);
comment.setFromUser(user);
User userTo = new User();
userTo.setId(null);
if (reqBody.getToUserId() != -1) {
userTo = userMapper.findById(reqBody.getToUserId());
comment.setToUser(userTo);
}
comment.setContent(reqBody.getContent());
comment.setPid(reqBody.getPid());
comment.setDate(new Date());
comment.setResponseId("");
comment.setToUser(userTo);
userMapper.findById(reqBody.getToUserId());
BeanUtils.copyProperties(reqBody, comment);
commentMapper.insert(comment);
if (reqBody.getPid() != -1) {
commentMapper.updateResponder(pComment.getResponseId() + comment.getId() + ",", reqBody.getPid());
}
return trans(comment);
return ModalTrans.comment(commentMapper.findCommentById(comment.getId()));
}
@Override
public boolean delete(long id) {
boolean b = commentMapper.existsById(id);
if (!b) {
Comment b = commentMapper.findCommentById(id);
if (b == null) {
throw new MyException(ResponseEnum.COMMENT_NOT_EXIST);
}
if (b.getStatus() == CommentStatusEnum.DELETED.getCode()) {
throw new MyException(ResponseEnum.DATA_IS_DELETED);
}
commentMapper.delete(id);
return true;
}
@@ -100,93 +95,59 @@ public class CommentServiceImpl implements CommentService {
commentMapper.updateContent(reqBody.getContent(), reqBody.getId());
comment.setContent(reqBody.getContent());
}
if (!comment.getResponseId().equals(reqBody.getResponseId())) {
commentMapper.updateResponder(reqBody.getResponseId(), reqBody.getId());
comment.setResponseId(reqBody.getResponseId());
}
return trans(comment);
}
@Override
public PageInfo<CommentModel> retrievePage(Boolean isComment, int page, int count) {
PageHelper.startPage(page, count);
List<Comment> commentList = commentMapper.findAllByType(isComment);
PageInfo pageInfo = new PageInfo(commentList);
pageInfo.setList(list2List(commentList));
return pageInfo;
return ModalTrans.comment(comment);
}
@Override
public PageInfo<CommentModel> retrievePageByPid(long pid, int page, int count) {
public PageData<CommentModel> retrievePage(String pagePath, int page, int count) {
PageHelper.startPage(page, count);
List<Comment> commentList = commentMapper.findAllByPId(pid);
PageInfo pageInfo = new PageInfo(commentList);
pageInfo.setList(list2List(commentList));
return pageInfo;
List<Comment> list = commentMapper.findAllByPagePathAndPidAndNormal(pagePath, -1);
return pageTrans(list);
}
@Override
public PageInfo<CommentModel> retrievePageByArticle(long articleID, long pid, int page, int count) {
PageHelper.startPage(page, count);
List<Comment> commentList = commentMapper.findAllByArticleIDAndPId(articleID, pid);
PageInfo pageInfo = new PageInfo(commentList);
pageInfo.setList(list2List(commentList));
return pageInfo;
public List<CommentModel> retrievePageByPid(long pid) {
List<Comment> allByPagePath = commentMapper.findAllByPid(pid);
return allByPagePath
.stream()
.filter(comment -> comment.getStatus() != CommentStatusEnum.DELETED.getCode())
.map(ModalTrans::comment)
.collect(Collectors.toList());
}
@Override
public PageInfo<CommentModel> retrievePageByTypeAndPid(Boolean isComment, int pid, int page, int count) {
public PageData<CommentModel> retrievePageByAuthor(String pagePath, int page, int count) {
User user = redisUserUtil.get();
PageHelper.startPage(page, count);
List<Comment> commentList = commentMapper.findCommentsByTypeAndPId(isComment, pid);
PageInfo pageInfo = new PageInfo(commentList);
pageInfo.setList(list2List(commentList));
return pageInfo;
List<Comment> list = commentMapper.findAllByPagePathAndFromUser(pagePath, user.getId());
return pageTrans(list);
}
@Override
public PageInfo<CommentModel> retrievePageByAuthor(Boolean isComment, int page, int count) {
public PageData<CommentModel> retrievePageByPageAndPid(String pagePath, long pid, int page, int count) {
PageHelper.startPage(page, count);
List<Comment> commentList = commentMapper.findAllByAuthorIDAndType(redisUserUtil.get().getId(), isComment);
PageInfo pageInfo = new PageInfo(commentList);
pageInfo.setList(list2List(commentList));
return pageInfo;
List<Comment> list = commentMapper.findAllByPagePath(pagePath);
return pageTrans(list, true);
}
@Override
public PageInfo<CommentModel> retrievePageByType(Boolean isComment, int page, int count) {
public PageData<CommentModel> retrievePageByPage(String pagePath, int page, int count) {
PageHelper.startPage(page, count);
List<Comment> commentList = commentMapper.findAllByType(isComment);
PageInfo pageInfo = new PageInfo(commentList);
pageInfo.setList(list2List(commentList));
return pageInfo;
List<Comment> list = commentMapper.findAllByPagePath(pagePath);
return pageTrans(list, true);
}
private List<CommentModel> list2List(List<Comment> commentList) {
List<CommentModel> content = new ArrayList<>();
for (Comment c : commentList) {
content.add(trans(c));
}
return content;
private PageData<CommentModel> pageTrans(List<Comment> commentList) {
return pageTrans(commentList, false);
}
private CommentModel trans(Comment comment) {
CommentModel commentModel = new CommentModel();
commentModel.setId(comment.getId());
commentModel.setComment(comment.getType());
commentModel.setContent(comment.getContent());
commentModel.setArticleID(comment.getArticleID());
commentModel.setDate(DateFormatUtil.get(comment.getDate()));
commentModel.setResponseId(comment.getResponseId());
commentModel.setPid(comment.getPid());
commentModel.setAuthorName(userService.getNameById(comment.getAuthorID()));
commentModel.setAuthorAvatarImgUrl("http://cdn.celess.cn/" + userService.getAvatarImg(comment.getAuthorID()));
if (comment.getType() && commentModel.getArticleID() > 0) {
commentModel.setArticleTitle(articleMapper.getTitleById(comment.getArticleID()));
}
return commentModel;
private PageData<CommentModel> pageTrans(List<Comment> commentList, boolean noResponseList) {
PageInfo<Comment> p = PageInfo.of(commentList);
List<CommentModel> modelList = commentList
.stream()
.map(ModalTrans::comment)
.peek(commentModel -> commentModel.setRespComment(this.retrievePageByPid(commentModel.getId())))
.collect(Collectors.toList());
return new PageData<>(p, modelList);
}
}

View File

@@ -29,7 +29,7 @@ public class CountServiceImpl implements CountService {
@Override
public long getCommentCount() {
return commentMapper.countByType(true);
return commentMapper.count();
}
@Override
@@ -47,11 +47,6 @@ public class CountServiceImpl implements CountService {
return tagMapper.count();
}
@Override
public long getLeaveMessageCount() {
return commentMapper.countByType(false);
}
@Override
public long getUserCount() {
return userMapper.count();

View File

@@ -2,18 +2,30 @@ package cn.celess.blog.service.serviceimpl;
import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.PartnerSite;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.request.LinkApplyReq;
import cn.celess.blog.entity.request.LinkReq;
import cn.celess.blog.exception.MyException;
import cn.celess.blog.mapper.PartnerMapper;
import cn.celess.blog.service.MailService;
import cn.celess.blog.service.PartnerSiteService;
import cn.celess.blog.util.HttpUtil;
import cn.celess.blog.util.RedisUtil;
import cn.celess.blog.util.RegexUtil;
import com.alibaba.druid.util.StringUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.SneakyThrows;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
/**
* @author : xiaohai
@@ -23,6 +35,13 @@ import java.util.List;
public class PartnerSiteServiceImpl implements PartnerSiteService {
@Autowired
PartnerMapper partnerMapper;
@Autowired
MailService mailService;
@Autowired
RedisUtil redisUtil;
private static final String SITE_NAME = "小海博客";
private static final String SITE_URL = "celess.cn";
private static final String SITE_EMAIL = "a@celess.cn";
@Override
public PartnerSite create(LinkReq reqBody) {
@@ -51,6 +70,12 @@ public class PartnerSiteServiceImpl implements PartnerSiteService {
reqBody.setUrl("http://" + reqBody.getUrl());
}
BeanUtils.copyProperties(reqBody, partnerSite);
if (reqBody.getIconPath() == null) {
partnerSite.setIconPath("");
}
if (reqBody.getDesc() == null) {
partnerSite.setDesc("");
}
partnerMapper.insert(partnerSite);
return partnerSite;
}
@@ -79,26 +104,125 @@ public class PartnerSiteServiceImpl implements PartnerSiteService {
if (!reqBody.getUrl().contains("http://") && !reqBody.getUrl().contains("https://")) {
reqBody.setUrl("http://" + reqBody.getUrl());
}
if (reqBody.isOpen() != partnerSite.getOpen() && !partnerSite.getNotification() && !StringUtils.isEmpty(partnerSite.getEmail())) {
SimpleMailMessage smm = new SimpleMailMessage();
smm.setTo(partnerSite.getEmail());
smm.setText("您的友链申请,已通过");
smm.setSubject("友链申请通过");
smm.setSentDate(new Date());
mailService.send(smm);
partnerSite.setNotification(true);
}
BeanUtils.copyProperties(reqBody, partnerSite);
partnerMapper.update(partnerSite);
partnerSite.setName(reqBody.getName());
partnerSite.setUrl(reqBody.getUrl());
partnerSite.setOpen(reqBody.isOpen());
partnerMapper.update(partnerSite);
return partnerSite;
}
@Override
public PageInfo<PartnerSite> PartnerSitePages(int page, int count) {
public PageData<PartnerSite> partnerSitePages(int page, int count, Boolean deleted) {
PageHelper.startPage(page, count);
List<PartnerSite> sitePage = partnerMapper.findAll();
PageInfo pageInfo = new PageInfo(sitePage);
return pageInfo;
List<PartnerSite> sitePage = partnerMapper.findAll(deleted);
PageInfo<PartnerSite> pageInfo = new PageInfo<PartnerSite>(sitePage);
return new PageData<>(pageInfo, sitePage);
}
@Override
public List<PartnerSite> findAll() {
List<PartnerSite> all = partnerMapper.findAll();
all.forEach(partnerSite -> partnerSite.setDelete(null));
return all;
}
@SneakyThrows
@Override
public PartnerSite apply(LinkApplyReq linkApplyReq) {
// 空值字段
if (StringUtils.isEmpty(linkApplyReq.getName())
|| StringUtils.isEmpty(linkApplyReq.getUrl())
|| StringUtils.isEmpty(linkApplyReq.getEmail())
|| StringUtils.isEmpty(linkApplyReq.getLinkUrl())) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
// 链接不合法
if (!RegexUtil.emailMatch(linkApplyReq.getEmail())) {
throw new MyException(ResponseEnum.PARAMETERS_EMAIL_ERROR);
}
if (!RegexUtil.urlMatch(linkApplyReq.getLinkUrl()) || !RegexUtil.urlMatch(linkApplyReq.getUrl())) {
throw new MyException(ResponseEnum.PARAMETERS_URL_ERROR);
}
if (!StringUtils.isEmpty(linkApplyReq.getIconPath()) && !RegexUtil.urlMatch(linkApplyReq.getIconPath())) {
throw new MyException(ResponseEnum.PARAMETERS_URL_ERROR);
}
// 非强制字段 设置空
if (StringUtils.isEmpty(linkApplyReq.getIconPath())) {
linkApplyReq.setIconPath("");
}
// 抓取页面
String resp = HttpUtil.getAfterRendering(linkApplyReq.getLinkUrl());
if (resp == null) {
throw new MyException(ResponseEnum.CANNOT_GET_DATA);
}
PartnerSite ps = new PartnerSite();
if (resp.contains(SITE_URL)) {
//包含站点
BeanUtils.copyProperties(linkApplyReq, ps);
ps.setNotification(false);
ps.setOpen(false);
boolean exists = partnerMapper.existsByUrl(linkApplyReq.getUrl());
if (!exists) {
partnerMapper.insert(ps);
} else {
ps.setId(partnerMapper.findByUrl(linkApplyReq.getUrl()).getId());
}
SimpleMailMessage smm = new SimpleMailMessage();
smm.setSubject("友链申请");
smm.setText("有一条友链申请" + (exists ? ",已存在的友链链接" : "") + "[\n" + linkApplyReq.toString() + "\n]");
smm.setTo(SITE_EMAIL);
smm.setSentDate(new Date());
mailService.send(smm);
} else {
// 不包含站点
String uuid;
ObjectMapper mapper = new ObjectMapper();
if (redisUtil.hasKey(linkApplyReq.getUrl())) {
uuid = redisUtil.get(linkApplyReq.getUrl());
if (!redisUtil.hasKey(uuid)) {
redisUtil.setEx(uuid, mapper.writeValueAsString(linkApplyReq), 10, TimeUnit.MINUTES);
}
} else {
uuid = UUID.randomUUID().toString().replaceAll("-", "");
redisUtil.setEx(uuid, mapper.writeValueAsString(linkApplyReq), 10, TimeUnit.MINUTES);
redisUtil.setEx(linkApplyReq.getUrl(), uuid, 10, TimeUnit.MINUTES);
}
throw new MyException(ResponseEnum.APPLY_LINK_NO_ADD_THIS_SITE, null, uuid);
}
return ps;
}
@SneakyThrows
@Override
public String reapply(String key) {
if (!redisUtil.hasKey(key)) {
throw new MyException(ResponseEnum.DATA_EXPIRED);
}
String s = redisUtil.get(key);
ObjectMapper mapper = new ObjectMapper();
LinkApplyReq linkApplyReq = mapper.readValue(s, LinkApplyReq.class);
if (linkApplyReq == null) {
throw new MyException(ResponseEnum.DATA_NOT_EXIST);
}
SimpleMailMessage smm = new SimpleMailMessage();
smm.setSubject("友链申请");
smm.setText("有一条未抓取到信息的友链申请,[\n" + linkApplyReq.toString() + "\n]");
smm.setTo(SITE_EMAIL);
smm.setSentDate(new Date());
mailService.send(smm);
redisUtil.delete(key);
redisUtil.delete(linkApplyReq.getUrl());
return "success";
}
}

View File

@@ -21,7 +21,7 @@ import java.io.InputStream;
*/
@Service
public class QiniuServiceImpl implements QiniuService {
private static Configuration cfg = new Configuration(Zone.zone2());
private static final Configuration cfg = new Configuration(Zone.zone2());
private static UploadManager uploadManager;
private static BucketManager bucketManager;
private static Auth auth;

View File

@@ -1,21 +1,27 @@
package cn.celess.blog.service.serviceimpl;
import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.Article;
import cn.celess.blog.entity.ArticleTag;
import cn.celess.blog.entity.Tag;
import cn.celess.blog.entity.model.ArticleModel;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.model.TagModel;
import cn.celess.blog.exception.MyException;
import cn.celess.blog.mapper.ArticleMapper;
import cn.celess.blog.mapper.ArticleTagMapper;
import cn.celess.blog.mapper.TagMapper;
import cn.celess.blog.service.TagService;
import cn.celess.blog.util.ModalTrans;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author : xiaohai
@@ -29,6 +35,8 @@ public class TagServiceImpl implements TagService {
HttpServletRequest request;
@Autowired
ArticleMapper articleMapper;
@Autowired
ArticleTagMapper articleTagMapper;
@Override
public TagModel create(String name) {
@@ -39,40 +47,19 @@ public class TagServiceImpl implements TagService {
Tag tag = new Tag();
tag.setName(name);
tagMapper.insert(tag);
return new TagModel(tag);
}
@Override
public TagModel create(Tag tag) {
if (tag == null) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
tagMapper.insert(tag);
return new TagModel(tag);
return ModalTrans.tag(tag);
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean delete(long tagId) {
Tag tag = tagMapper.findTagById(tagId);
if (tag == null) {
throw new MyException(ResponseEnum.TAG_NOT_EXIST);
}
if (tag.getArticles() == null) {
return tagMapper.delete(tagId) == 1;
}
String[] articleArray = tag.getArticles().split(",");
for (int i = 0; i < articleArray.length; i++) {
if (articleArray[i] == null || "".equals(articleArray[i])) {
continue;
}
long articleID = Long.parseLong(articleArray[i]);
Article article = articleMapper.findArticleById(articleID);
if (article == null) {
continue;
}
article.setTagsId(article.getTagsId().replace(tagId + ",", ""));
articleMapper.update(article);
}
List<ArticleTag> articleByTag = articleTagMapper.findArticleByTag(tagId);
// 删除文章
articleByTag.forEach(articleTag -> articleMapper.delete(articleTag.getArticle().getId()));
return tagMapper.delete(tagId) == 1;
}
@@ -82,47 +69,35 @@ public class TagServiceImpl implements TagService {
if (id == null) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR.getCode(), "缺少ID");
}
Tag tagFromDB = tagMapper.findTagById(id);
tagFromDB.setName(name);
tagMapper.update(tagFromDB);
return new TagModel(tagFromDB);
Tag tag = tagMapper.findTagById(id);
tag.setName(name);
tagMapper.update(tag);
return ModalTrans.tag(tag);
}
@Override
public TagModel retrieveOneById(long tagId) {
Tag tag = tagMapper.findTagById(tagId);
if (tag == null) {
throw new MyException(ResponseEnum.TAG_NOT_EXIST);
}
return new TagModel(tag);
}
@Override
public TagModel retrieveOneByName(String name) {
Tag tag = tagMapper.findTagByName(name);
if (tag == null) {
throw new MyException(ResponseEnum.TAG_NOT_EXIST);
}
return new TagModel(tag);
}
@Override
public PageInfo<TagModel> retrievePage(int page, int count) {
public PageData<TagModel> retrievePage(int page, int count) {
PageHelper.startPage(page, count);
List<Tag> tagList = tagMapper.findAll();
PageInfo pageInfo = new PageInfo(tagList);
List<TagModel> list = new ArrayList<>();
tagList.forEach(e -> list.add(new TagModel(e)));
pageInfo.setList(list);
return pageInfo;
List<TagModel> modelList = new ArrayList<>();
tagList.forEach(tag -> modelList.add(ModalTrans.tag(tag)));
return new PageData<>(new PageInfo<>(tagList), modelList);
}
@Override
public List<TagModel> findAll() {
List<TagModel> list = new ArrayList<>();
tagMapper.findAll().forEach(e -> list.add(new TagModel(e)));
return list;
return tagMapper.findAll().stream()
.map(ModalTrans::tag)
.peek(tagModel -> {
List<ArticleTag> articleByTagAndOpen = articleTagMapper.findArticleByTagAndOpen(tagModel.getId());
tagModel.setArticles(
articleByTagAndOpen
.stream()
.map(articleTag -> ModalTrans.article(articleTag.getArticle(), true))
.collect(Collectors.toList())
);
})
.collect(Collectors.toList());
}
}

View File

@@ -1,7 +1,11 @@
package cn.celess.blog.service.serviceimpl;
import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.enmu.RoleEnum;
import cn.celess.blog.enmu.UserAccountStatusEnum;
import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.User;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.model.QiniuResponse;
import cn.celess.blog.entity.model.UserModel;
import cn.celess.blog.entity.request.LoginReq;
@@ -14,8 +18,6 @@ import cn.celess.blog.service.UserService;
import cn.celess.blog.util.*;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -25,11 +27,9 @@ import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.beans.Transient;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* @author : xiaohai
@@ -74,7 +74,8 @@ public class UserServiceImpl implements UserService {
if (userMapper.existsByEmail(email)) {
throw new MyException(ResponseEnum.USERNAME_HAS_EXIST);
}
boolean b = userMapper.addUser(email, MD5Util.getMD5(password)) == 1;
User user = new User(email, MD5Util.getMD5(password));
boolean b = userMapper.addUser(user) == 1;
if (b) {
String verifyId = UUID.randomUUID().toString().replaceAll("-", "");
redisUtil.setEx(email + "-verify", verifyId, 2, TimeUnit.DAYS);
@@ -99,6 +100,16 @@ public class UserServiceImpl implements UserService {
if (!RegexUtil.pwdMatch(loginReq.getPassword())) {
throw new MyException(ResponseEnum.PARAMETERS_PWD_ERROR);
}
User user = userMapper.findByEmail(loginReq.getEmail());
if (user == null) {
// 用户不存在
throw new MyException(ResponseEnum.USER_NOT_EXIST);
}
if (user.getStatus() != UserAccountStatusEnum.NORMAL.getCode()) {
throw new MyException(ResponseEnum.CAN_NOT_USE, UserAccountStatusEnum.get(user.getStatus()));
}
//获取redis缓存中登录失败次数
String s = redisUtil.get(loginReq.getEmail() + "-passwordWrongTime");
if (s != null) {
@@ -106,17 +117,12 @@ public class UserServiceImpl implements UserService {
throw new MyException(ResponseEnum.LOGIN_LATER, loginReq.getEmail());
}
}
User user = null;
user = userMapper.findByEmail(loginReq.getEmail());
String token = null;
String token;
// 密码比对
if (user == null) {
// 用户不存在
throw new MyException(ResponseEnum.USER_NOT_EXIST);
}
if (user.getPwd().equals(MD5Util.getMD5(loginReq.getPassword()))) {
logger.info("====> {} 进行权限认证 状态:登录成功 <====", loginReq.getEmail());
userMapper.updateLoginTime(loginReq.getEmail(), new Date());
userMapper.updateLoginTime(loginReq.getEmail());
redisUtil.delete(loginReq.getEmail() + "-passwordWrongTime");
// redis 标记
redisUserUtil.set(user, loginReq.getIsRememberMe());
@@ -137,7 +143,7 @@ public class UserServiceImpl implements UserService {
redisUtil.setEx(loginReq.getEmail() + "-passwordWrongTime", count + "", 2, TimeUnit.HOURS);
throw new MyException(ResponseEnum.LOGIN_FAILURE);
}
UserModel trans = trans(user);
UserModel trans = ModalTrans.userFullInfo(user);
trans.setToken(token);
return trans;
@@ -164,7 +170,7 @@ public class UserServiceImpl implements UserService {
userMapper.updateInfo(desc, displayName, user.getId());
redisUserUtil.set(user);
return trans(user);
return ModalTrans.userFullInfo(user);
}
@Override
@@ -176,20 +182,6 @@ public class UserServiceImpl implements UserService {
return role;
}
@Override
public User getUserInfoByEmail(String email) {
User user = userMapper.findByEmail(email);
if (user == null) {
throw new MyException(ResponseEnum.USER_NOT_EXIST);
}
return user;
}
@Override
public String getAvatarImg(long id) {
return userMapper.getAvatarImgUrlById(id);
}
@Override
public Object updateUserAavatarImg(InputStream is, String mime) {
User user = redisUserUtil.get();
@@ -197,13 +189,13 @@ public class UserServiceImpl implements UserService {
user.setAvatarImgUrl(upload.key);
userMapper.updateAvatarImgUrl(upload.key, user.getId());
redisUserUtil.set(user);
return ResponseUtil.success(user.getAvatarImgUrl());
return Response.success(user.getAvatarImgUrl());
}
@Override
public UserModel getUserInfoBySession() {
User user = redisUserUtil.get();
return trans(user);
return ModalTrans.userFullInfo(user);
}
@Override
@@ -211,18 +203,6 @@ public class UserServiceImpl implements UserService {
return userMapper.existsByEmail(email);
}
@Override
public String getNameById(long id) {
String name = userMapper.getDisPlayName(id);
if (name == null) {
name = userMapper.getEmail(id);
if (name == null) {
throw new MyException(ResponseEnum.USER_NOT_EXIST);
}
}
return name;
}
/**
* 找回密码
*/
@@ -254,7 +234,6 @@ public class UserServiceImpl implements UserService {
return "发送成功!";
}
//TODO
@Override
public Object sendVerifyEmail(String email) {
if (!RegexUtil.emailMatch(email)) {
@@ -336,14 +315,14 @@ public class UserServiceImpl implements UserService {
@Override
public Object deleteUser(Integer[] id) {
JSONArray status = new JSONArray();
List<Map<String, Object>> status = new ArrayList<>();
if (id == null || id.length == 0) {
return null;
}
for (Integer integer : id) {
String role = userMapper.getRoleById(integer);
int deleteResult = 0;
JSONObject deleteStatus = new JSONObject();
Map<String, Object> deleteStatus = new HashMap<>(3);
deleteStatus.put("id", integer);
// 管理员账户不可删
if ("admin".equals(role)) {
@@ -366,14 +345,11 @@ public class UserServiceImpl implements UserService {
}
@Override
public PageInfo<UserModel> getUserList(Integer page, Integer count) {
public PageData<UserModel> getUserList(Integer page, Integer count, Integer status) {
PageHelper.startPage(page, count);
List<User> all = userMapper.findAll();
PageInfo pageInfo = PageInfo.of(all);
List<UserModel> modelList = new ArrayList<>();
all.forEach(user -> modelList.add(trans(user)));
pageInfo.setList(modelList);
return pageInfo;
List<User> all = userMapper.findAll(status);
List<UserModel> modelList = all.stream().map(ModalTrans::userFullInfo).collect(Collectors.toList());
return new PageData<>(PageInfo.of(all), modelList);
}
@Override
@@ -402,8 +378,7 @@ public class UserServiceImpl implements UserService {
user.setPwd(MD5Util.getMD5(userReq.getPwd()));
}
if (userReq.getRole() != null) {
// TODO:用enum存放角色分类
if ("user".equals(userReq.getRole()) || "admin".equals(userReq.getRole())) {
if (RoleEnum.USER_ROLE.getRoleName().equals(userReq.getRole()) || RoleEnum.ADMIN_ROLE.getRoleName().equals(userReq.getRole())) {
user.setRole(userReq.getRole());
} else {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
@@ -413,7 +388,6 @@ public class UserServiceImpl implements UserService {
if (!RegexUtil.emailMatch(userReq.getEmail())) {
throw new MyException(ResponseEnum.PARAMETERS_EMAIL_ERROR);
}
// TODO :: 邮件提醒
user.setEmail(userReq.getEmail());
}
// 数据写入
@@ -425,7 +399,7 @@ public class UserServiceImpl implements UserService {
redisUserUtil.set(user);
}
logger.info("修改了用户 [id={}] 的用户的资料", userReq.getId());
return trans(user);
return ModalTrans.userFullInfo(user);
}
@Override
@@ -433,16 +407,17 @@ public class UserServiceImpl implements UserService {
return userMapper.existsByEmail(email);
}
private UserModel trans(User u) {
UserModel user = new UserModel();
user.setId(u.getId());
user.setAvatarImgUrl(u.getAvatarImgUrl() == null ? null : "http://cdn.celess.cn/" + u.getAvatarImgUrl());
user.setEmail(u.getEmail());
user.setDesc(u.getDesc());
user.setDisplayName(u.getDisplayName() == null ? u.getEmail() : u.getDisplayName());
user.setEmailStatus(u.getEmailStatus());
user.setRecentlyLandedDate(DateFormatUtil.get(u.getRecentlyLandedDate()));
user.setRole(u.getRole());
return user;
@Override
public UserModel setPwd(String pwd, String newPwd, String confirmPwd) {
User user = redisUserUtil.get();
String pwd1 = userMapper.getPwd(user.getEmail());
if (!MD5Util.getMD5(pwd).equals(pwd1)) {
throw new MyException(ResponseEnum.PWD_WRONG);
}
if (!newPwd.equals(confirmPwd)) {
throw new MyException(ResponseEnum.PWD_NOT_SAME);
}
userMapper.updatePwd(user.getEmail(), MD5Util.getMD5(newPwd));
return ModalTrans.userFullInfo(userMapper.findByEmail(user.getEmail()));
}
}

View File

@@ -2,10 +2,12 @@ package cn.celess.blog.service.serviceimpl;
import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.Visitor;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.model.VisitorModel;
import cn.celess.blog.exception.MyException;
import cn.celess.blog.mapper.VisitorMapper;
import cn.celess.blog.service.VisitorService;
import cn.celess.blog.util.AddressUtil;
import cn.celess.blog.util.DateFormatUtil;
import cn.celess.blog.util.RedisUtil;
import com.github.pagehelper.PageHelper;
@@ -14,7 +16,6 @@ import eu.bitwalker.useragentutils.Browser;
import eu.bitwalker.useragentutils.OperatingSystem;
import eu.bitwalker.useragentutils.UserAgent;
import eu.bitwalker.useragentutils.Version;
import org.apache.commons.lang.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.json.JsonParserFactory;
import org.springframework.stereotype.Service;
@@ -25,6 +26,8 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.concurrent.TimeUnit;
@@ -45,12 +48,10 @@ public class VisitorServiceImpl implements VisitorService {
}
@Override
public PageInfo<VisitorModel> visitorPage(int page, int count, boolean showLocation) {
public PageData<VisitorModel> visitorPage(int page, int count, boolean showLocation) {
PageHelper.startPage(page, count);
List<Visitor> visitorList = visitorMapper.findAll();
PageInfo pageInfo = new PageInfo(visitorList);
pageInfo.setList(list2List(visitorList, showLocation));
return pageInfo;
return new PageData<>(new PageInfo<>(visitorList), list2List(visitorList, showLocation));
}
@Override
@@ -68,8 +69,9 @@ public class VisitorServiceImpl implements VisitorService {
visitor.setUa(request.getHeader("User-Agent"));
//记录当日的访问
String dayVisitCount = redisUtil.get("dayVisitCount");
long secondsLeftToday = 86400 - DateUtils.getFragmentInSeconds(Calendar.getInstance(), Calendar.DATE);
Date date = new Date(Calendar.YEAR);
LocalDateTime midnight = LocalDateTime.now().plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
long secondsLeftToday = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight);
if (dayVisitCount == null) {
redisUtil.setEx("dayVisitCount", "1", secondsLeftToday, TimeUnit.SECONDS);
} else {
@@ -150,60 +152,7 @@ public class VisitorServiceImpl implements VisitorService {
* @return
*/
private String getLocation(String ip) {
StringBuilder result = new StringBuilder();
URL url;
HttpURLConnection conn = null;
InputStream inputStream = null;
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null;
try {
url = new URL("http://ip.taobao.com/service/getIpInfo.php?ip=" + ip);
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(3000);
conn.setDoInput(true);
conn.setRequestMethod("GET");
inputStream = conn.getInputStream();
inputStreamReader = new InputStreamReader(inputStream);
bufferedReader = new BufferedReader(inputStreamReader);
String tmp;
while ((tmp = bufferedReader.readLine()) != null) {
result.append(tmp);
}
} catch (Exception e) {
// ignore
} finally {
try {
if (conn != null) {
conn.disconnect();
}
if (inputStream != null) {
inputStream.close();
}
if (inputStreamReader != null) {
inputStreamReader.close();
}
if (bufferedReader != null) {
bufferedReader.close();
}
} catch (Exception e) {
// ignore
}
}
StringBuilder sb = new StringBuilder();
if ("".equals(result.toString())) {
throw new MyException(ResponseEnum.FAILURE);
}
Map<String, Object> stringObjectMap = JsonParserFactory.getJsonParser().parseMap(result.toString());
if ((Integer) stringObjectMap.get("code") == 0) {
LinkedHashMap data = (LinkedHashMap) stringObjectMap.get("data");
sb.append(data.get("country"))
.append("-")
.append(data.get("region"))
.append("-")
.append(data.get("city"));
}
return sb.toString();
return AddressUtil.getCityInfo(ip);
}

View File

@@ -1,99 +1,114 @@
package cn.celess.blog.service.serviceimpl;
import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.WebUpdate;
import cn.celess.blog.entity.model.WebUpdateModel;
import cn.celess.blog.exception.MyException;
import cn.celess.blog.mapper.WebUpdateInfoMapper;
import cn.celess.blog.service.WebUpdateInfoService;
import cn.celess.blog.util.DateFormatUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author : xiaohai
* @date : 2019/05/12 11:43
*/
@Service
public class WebUpdateInfoServiceImpl implements WebUpdateInfoService {
@Autowired
WebUpdateInfoMapper webUpdateInfoMapper;
@Override
public WebUpdateModel create(String info) {
if (info == null || info.replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
WebUpdate webUpdate = new WebUpdate(info, new Date());
if (webUpdateInfoMapper.insert(webUpdate) == 0) {
throw new MyException(ResponseEnum.FAILURE);
}
return trans(webUpdate);
}
@Override
public Boolean del(long id) {
if (!webUpdateInfoMapper.existsById(id)) {
throw new MyException(ResponseEnum.DATA_NOT_EXIST);
}
return webUpdateInfoMapper.delete(id) == 1;
}
@Override
public WebUpdateModel update(long id, String info) {
WebUpdate webUpdate = webUpdateInfoMapper.findById(id);
if (webUpdate == null) {
throw new MyException(ResponseEnum.DATA_NOT_EXIST);
}
if (info == null || info.replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
webUpdate.setUpdateInfo(info);
webUpdateInfoMapper.update(id, info);
return trans(webUpdate);
}
@Override
public PageInfo<WebUpdateModel> pages(int count, int page) {
PageHelper.startPage(page, count);
List<WebUpdate> updateList = webUpdateInfoMapper.findAll();
PageInfo pageInfo = new PageInfo(updateList);
pageInfo.setList(list2List(updateList));
return pageInfo;
}
@Override
public List<WebUpdateModel> findAll() {
List<WebUpdate> all = webUpdateInfoMapper.findAll();
List<WebUpdateModel> webUpdateModels = new ArrayList<>();
for (WebUpdate w : all) {
webUpdateModels.add(trans(w));
}
return webUpdateModels;
}
@Override
public String getLastestUpdateTime() {
return DateFormatUtil.get(webUpdateInfoMapper.getLastestOne());
}
private List<WebUpdateModel> list2List(List<WebUpdate> webUpdates) {
List<WebUpdateModel> webUpdateModels = new ArrayList<>();
for (WebUpdate w : webUpdates) {
webUpdateModels.add(trans(w));
}
return webUpdateModels;
}
private WebUpdateModel trans(WebUpdate webUpdate) {
return new WebUpdateModel(webUpdate.getId(), webUpdate.getUpdateInfo(), DateFormatUtil.get(webUpdate.getUpdateTime()));
}
}
package cn.celess.blog.service.serviceimpl;
import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.WebUpdate;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.model.WebUpdateModel;
import cn.celess.blog.exception.MyException;
import cn.celess.blog.mapper.WebUpdateInfoMapper;
import cn.celess.blog.service.WebUpdateInfoService;
import cn.celess.blog.util.DateFormatUtil;
import cn.celess.blog.util.HttpUtil;
import cn.celess.blog.util.ModalTrans;
import com.alibaba.druid.util.StringUtils;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.time.Instant;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author : xiaohai
* @date : 2019/05/12 11:43
*/
@Service
@Slf4j
public class WebUpdateInfoServiceImpl implements WebUpdateInfoService {
@Autowired
WebUpdateInfoMapper webUpdateInfoMapper;
@Override
public WebUpdateModel create(String info) {
if (info == null || info.replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
WebUpdate webUpdate = new WebUpdate(info);
if (webUpdateInfoMapper.insert(webUpdate) == 0) {
throw new MyException(ResponseEnum.FAILURE);
}
return ModalTrans.webUpdate(webUpdateInfoMapper.findById(webUpdate.getId()));
}
@Override
public Boolean del(long id) {
if (!webUpdateInfoMapper.existsById(id)) {
throw new MyException(ResponseEnum.DATA_NOT_EXIST);
}
return webUpdateInfoMapper.delete(id) == 1;
}
@Override
public WebUpdateModel update(long id, String info) {
WebUpdate webUpdate = webUpdateInfoMapper.findById(id);
if (webUpdate == null) {
throw new MyException(ResponseEnum.DATA_NOT_EXIST);
}
if (info == null || info.replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
webUpdate.setUpdateInfo(info);
webUpdateInfoMapper.update(id, info);
return ModalTrans.webUpdate(webUpdate);
}
@Override
public PageData<WebUpdateModel> pages(int count, int page) {
PageHelper.startPage(page, count);
List<WebUpdate> updateList = webUpdateInfoMapper.findAll();
return new PageData<>(new PageInfo<>(updateList), list2List(updateList));
}
@Override
public List<WebUpdateModel> findAll() {
List<WebUpdate> all = webUpdateInfoMapper.findAll();
return list2List(all);
}
@Override
public Map<String, Object> getLastestUpdateTime() {
Map<String, Object> map = new HashMap<>();
map.put("lastUpdateTime", DateFormatUtil.get(webUpdateInfoMapper.getLastestOne().getUpdateTime()));
map.put("lastUpdateInfo", webUpdateInfoMapper.getLastestOne().getUpdateInfo());
try {
ObjectMapper mapper = new ObjectMapper();
String respStr = HttpUtil.get("https://api.github.com/repos/xiaohai2271/blog-frontEnd/commits?page=1&per_page=1");
if (!StringUtils.isEmpty(respStr)) {
JsonNode root = mapper.readTree(respStr);
Iterator<JsonNode> elements = root.elements();
JsonNode next = elements.next();
JsonNode commit = next.get("commit");
map.put("lastCommit", commit.get("message"));
map.put("committerAuthor", commit.get("committer").get("name"));
Instant parse = Instant.parse(commit.get("committer").get("date").asText());
map.put("committerDate", DateFormatUtil.get(Date.from(parse)));
map.put("commitUrl", "https://github.com/xiaohai2271/blog-frontEnd/tree/" + next.get("sha").asText());
}
} catch (IOException e) {
log.info("网络请求失败{}", e.getMessage());
}
return map;
}
private List<WebUpdateModel> list2List(List<WebUpdate> webUpdates) {
return webUpdates.stream().map(ModalTrans::webUpdate).collect(Collectors.toList());
}
}

View File

@@ -0,0 +1,71 @@
package cn.celess.blog.util;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.lionsoul.ip2region.DataBlock;
import org.lionsoul.ip2region.DbConfig;
import org.lionsoul.ip2region.DbSearcher;
import org.lionsoul.ip2region.Util;
import java.io.File;
import java.lang.reflect.Method;
import java.util.Objects;
/**
* @author : xiaohai
* @date : 2020/09/04 9:36
*/
@Slf4j
public class AddressUtil {
public static String getCityInfo(String ip) {
File file;
try {
//db
String dbPath = AddressUtil.class.getResource("/ip2region/ip2region.db").getPath();
file = new File(dbPath);
if (!file.exists()) {
String tmpDir = System.getProperties().getProperty("java.io.tmpdir");
dbPath = tmpDir + "ip.db";
file = new File(dbPath);
FileUtils.copyInputStreamToFile(Objects.requireNonNull(AddressUtil.class.getClassLoader().getResourceAsStream("classpath:ip2region/ip2region.db")), file);
}
//查询算法
//B-tree
int algorithm = DbSearcher.BTREE_ALGORITHM;
try {
DbConfig config = new DbConfig();
DbSearcher searcher = new DbSearcher(config, dbPath);
Method method = null;
switch (algorithm) {
case DbSearcher.BTREE_ALGORITHM:
method = searcher.getClass().getMethod("btreeSearch", String.class);
break;
case DbSearcher.BINARY_ALGORITHM:
method = searcher.getClass().getMethod("binarySearch", String.class);
break;
case DbSearcher.MEMORY_ALGORITYM:
method = searcher.getClass().getMethod("memorySearch", String.class);
break;
}
DataBlock dataBlock;
if (!Util.isIpAddress(ip)) {
System.out.println("Error: Invalid ip address");
}
dataBlock = (DataBlock) method.invoke(searcher, ip);
return dataBlock.getRegion();
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

View File

@@ -0,0 +1,51 @@
package cn.celess.blog.util;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.env.Environment;
/**
* <p>date: 2022/12/02</P>
* <p>desc: </p>
* <p>mail: a@celess.cn</p>
*
* @author 禾几海
*/
@Slf4j
public class EnvironmentUtil {
private static Environment environment;
public static String getEnv(String name) {
String value = System.getenv(name);
if (StringUtils.isBlank(value)) {
log.error("没有找到环境变量:" + name);
}
return value;
}
public static String getEnv(String name, String defaultValue) {
String env = getEnv(name);
if (env == null) {
return defaultValue;
}
return env;
}
public static String getProperties(String key) {
String value = environment.getProperty(key);
if (StringUtils.isBlank(value)) {
log.error("没有找到配置项: {}", key);
}
return value;
}
public static String getProperties(String key, String defaultValue) {
return environment.getProperty(key, defaultValue);
}
public static void setEnvironment(Environment environment) {
EnvironmentUtil.environment = environment;
}
}

View File

@@ -0,0 +1,50 @@
package cn.celess.blog.util;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
import java.util.Objects;
/**
* @Author: 小海
* @Date: 2020-04-23 15:51
* @Desc:
*/
public class HttpUtil {
private static final OkHttpClient CLIENT = new OkHttpClient();
public static String get(String urlStr) {
Request request = new Request.Builder()
.url(urlStr)
.get()
.build();
try (Response response = CLIENT.newCall(request).execute()) {
return Objects.requireNonNull(response.body()).string();
} catch (IOException e) {
return null;
}
}
public static String getAfterRendering(String url) {
try (final WebClient webClient = new WebClient(BrowserVersion.CHROME)) {
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setDownloadImages(false);
webClient.getOptions().setActiveXNative(false);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
final HtmlPage page = webClient.getPage(url);
return page.asXml();
} catch (IOException e) {
return null;
}
}
}

View File

@@ -21,17 +21,17 @@ import java.util.Map;
@Component
@Log4j2
public class JwtUtil {
private static final String CLAIM_KEY_USERNAME = "sub";
/**
* 5天(毫秒)
*/
public static final long EXPIRATION_LONG_TIME = 432000000;
/**
* 两小时(毫秒)
*/
public static final long EXPIRATION_SHORT_TIME = 7200000;
private static final String CLAIM_KEY_USERNAME = "sub";
private static final String BEARER_PREFIX_UPPER = "Bearer";
private static final String BEARER_PREFIX_LOWER = "bearer";
/**
* JWT 秘钥需自行设置不可泄露
*/
@@ -50,7 +50,7 @@ public class JwtUtil {
}
public String updateTokenDate(String token) {
Claims claims = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token).getBody();
Claims claims = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(getJwtString(token)).getBody();
return Jwts.builder()
.setClaims(claims)
.setExpiration(new Date(claims.getExpiration().getTime() + EXPIRATION_SHORT_TIME))
@@ -62,7 +62,7 @@ public class JwtUtil {
* 获取token是否过期
*/
public Boolean isTokenExpired(String token) {
Date expiration = getExpirationDateFromToken(token);
Date expiration = getExpirationDateFromToken(getJwtString(token));
return expiration == null || expiration.before(new Date());
}
@@ -70,7 +70,7 @@ public class JwtUtil {
* 根据token获取username
*/
public String getUsernameFromToken(String token) {
Claims claims = getClaimsFromToken(token);
Claims claims = getClaimsFromToken(getJwtString(token));
return claims == null ? null : claims.getSubject();
}
@@ -78,7 +78,7 @@ public class JwtUtil {
* 获取token的过期时间
*/
public Date getExpirationDateFromToken(String token) {
Claims claims = getClaimsFromToken(token);
Claims claims = getClaimsFromToken(getJwtString(token));
return claims == null ? null : claims.getExpiration();
}
@@ -90,7 +90,7 @@ public class JwtUtil {
try {
claims = Jwts.parser()
.setSigningKey(SECRET)
.parseClaimsJws(token)
.parseClaimsJws(getJwtString(token))
.getBody();
} catch (ExpiredJwtException e) {
log.info("JWT令牌过期");
@@ -109,4 +109,9 @@ public class JwtUtil {
return claims;
}
private String getJwtString(String token) {
if (token == null) return token;
return token.replaceFirst(BEARER_PREFIX_UPPER, "").replace(BEARER_PREFIX_LOWER, "");
}
}

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