Compare commits

..

220 Commits

Author SHA1 Message Date
dependabot[bot]
f7c8bca7df build(deps): bump lombok from 1.18.20 to 1.18.26
Bumps [lombok](https://github.com/projectlombok/lombok) from 1.18.20 to 1.18.26.
- [Release notes](https://github.com/projectlombok/lombok/releases)
- [Changelog](https://github.com/projectlombok/lombok/blob/master/doc/changelog.markdown)
- [Commits](https://github.com/projectlombok/lombok/compare/v1.18.20...v1.18.26)

---
updated-dependencies:
- dependency-name: org.projectlombok:lombok
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-01 09:58:24 +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
禾几海
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
禾几海
0e26eab2e6 Merge branch 'dev' 2020-05-18 08:36:19 +08:00
小海
778c2dba58 Update README.md 2020-05-03 22:32:48 +08:00
106 changed files with 8032 additions and 2301 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

View File

@@ -1,47 +0,0 @@
# 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: Blog backEnd CI
on:
push:
branches:
- master
jobs:
build:
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: Build jar file
run: echo $APPLICATION_PROPERTIES_TEST|base64 -d > src/main/resources/application-test.properties && echo $APPLICATION_PROPERTIES_PROD|base64 -d> src/main/resources/application-prod.properties && mvn -B package --file pom.xml
- name: SCP
uses: appleboy/scp-action@master
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
password: ${{ secrets.SSH_PASSWORD }}
port: ${{ secrets.SSH_PORT }}
source: "target/blog-0.0.1-SNAPSHOT.jar"
target: "/www/wwwroot/api.celess.cn"
- name: Run SSH command
uses: garygrossgarten/github-action-ssh@v0.5.0
with:
command: cd /www/wwwroot/api.celess.cn && bash build.sh
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
password: ${{ secrets.SSH_PASSWORD }}
port: ${{ secrets.SSH_PORT }}

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

2
.gitignore vendored
View File

@@ -4,7 +4,5 @@
target/ target/
# 本地项目的私有文件 # 本地项目的私有文件
back-end/blog-dev.sql
src/main/resources/application-dev.properties src/main/resources/application-dev.properties
src/main/resources/application-prod.properties src/main/resources/application-prod.properties
src/main/resources/application-test.properties

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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * 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 * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * 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 * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
import java.net.*; import java.net.*;
import java.io.*; import java.io.*;
import java.nio.channels.*; import java.nio.channels.*;
@@ -21,7 +20,7 @@ import java.util.Properties;
public class MavenWrapperDownloader { 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. * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
*/ */
@@ -55,7 +54,7 @@ public class MavenWrapperDownloader {
// wrapperUrl parameter. // wrapperUrl parameter.
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
String url = DEFAULT_DOWNLOAD_URL; String url = DEFAULT_DOWNLOAD_URL;
if (mavenWrapperPropertyFile.exists()) { if(mavenWrapperPropertyFile.exists()) {
FileInputStream mavenWrapperPropertyFileInputStream = null; FileInputStream mavenWrapperPropertyFileInputStream = null;
try { try {
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
@@ -66,7 +65,7 @@ public class MavenWrapperDownloader {
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
} finally { } finally {
try { try {
if (mavenWrapperPropertyFileInputStream != null) { if(mavenWrapperPropertyFileInputStream != null) {
mavenWrapperPropertyFileInputStream.close(); mavenWrapperPropertyFileInputStream.close();
} }
} catch (IOException e) { } catch (IOException e) {
@@ -77,8 +76,8 @@ public class MavenWrapperDownloader {
System.out.println("- Downloading from: " + url); System.out.println("- Downloading from: " + url);
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
if (!outputFile.getParentFile().exists()) { if(!outputFile.getParentFile().exists()) {
if (!outputFile.getParentFile().mkdirs()) { if(!outputFile.getParentFile().mkdirs()) {
System.out.println( System.out.println(
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); "- 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 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.5/maven-wrapper-0.5.5.jar 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 MIT License
Copyright (c) 2019 小 Copyright (c) 2020 禾几
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,11 +1,23 @@
# 小海博客后端管理系统 <h1 align="center">
![Build Staus](https://github.com/xiaohai2271/blog-backEnd/workflows/Blog%20backEnd%20CI/badge.svg?branch=master&event=push) ![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>
<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 | | 接口文档 | Swagger | 2.6.1 |
| 数据库连接池 | druid | 1.1.14 | | 数据库连接池 | druid | 1.1.14 |
| 缓存(线上环境) | redis | 3.0.6 | | 缓存(线上环境) | 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] 密码重置 或者参照[离线API文档](./doc/API.md)
- [x] 信息修改
- [ ] 接入qq登录
### 📌FIXME ## ☀授权协议
[MIT](./LICENSE)
- [ ] `/write` 图片上传的跨域问题

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 # 运行测试
..... #待添加
```

146
mvnw vendored
View File

@@ -8,7 +8,7 @@
# "License"); you may not use this file except in compliance # "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at # 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, # Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an # 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: # Required ENV vars:
# ------------------ # ------------------
@@ -34,32 +34,31 @@
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files # 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 . /etc/mavenrc
fi fi
if [ -f "$HOME/.mavenrc" ]; then if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc" . "$HOME/.mavenrc"
fi fi
fi fi
# OS specific support. $var _must_ be set to either true or false. # OS specific support. $var _must_ be set to either true or false.
cygwin=false cygwin=false;
darwin=false darwin=false;
mingw=false mingw=false
case "$(uname)" in case "`uname`" in
CYGWIN*) cygwin=true ;; CYGWIN*) cygwin=true ;;
MINGW*) mingw=true ;; MINGW*) mingw=true;;
Darwin*) Darwin*) darwin=true
darwin=true
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home # 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 # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
if [ -z "$JAVA_HOME" ]; then if [ -z "$JAVA_HOME" ]; then
if [ -x "/usr/libexec/java_home" ]; then if [ -x "/usr/libexec/java_home" ]; then
export JAVA_HOME="$(/usr/libexec/java_home)" export JAVA_HOME="`/usr/libexec/java_home`"
else else
export JAVA_HOME="/Library/Java/Home" export JAVA_HOME="/Library/Java/Home"
fi fi
@@ -67,102 +66,96 @@ Darwin*)
;; ;;
esac esac
if [ -z "$JAVA_HOME" ]; then if [ -z "$JAVA_HOME" ] ; then
if [ -r /etc/gentoo-release ]; then if [ -r /etc/gentoo-release ] ; then
JAVA_HOME=$(java-config --jre-home) JAVA_HOME=`java-config --jre-home`
fi fi
fi fi
if [ -z "$M2_HOME" ]; then if [ -z "$M2_HOME" ] ; then
## resolve links - $0 may be a link to maven's home ## resolve links - $0 may be a link to maven's home
PRG="$0" PRG="$0"
# need this for relative symlinks # need this for relative symlinks
while [ -h "$PRG" ]; do while [ -h "$PRG" ] ; do
ls=$(ls -ld "$PRG") ls=`ls -ld "$PRG"`
link=$(expr "$ls" : '.*-> \(.*\)$') link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' >/dev/null; then if expr "$link" : '/.*' > /dev/null; then
PRG="$link" PRG="$link"
else else
PRG="$(dirname "$PRG")/$link" PRG="`dirname "$PRG"`/$link"
fi fi
done done
saveddir=$(pwd) saveddir=`pwd`
M2_HOME=$(dirname "$PRG")/.. M2_HOME=`dirname "$PRG"`/..
# make it fully qualified # make it fully qualified
M2_HOME=$(cd "$M2_HOME" && pwd) M2_HOME=`cd "$M2_HOME" && pwd`
cd "$saveddir" cd "$saveddir"
# echo Using m2 at $M2_HOME # echo Using m2 at $M2_HOME
fi fi
# For Cygwin, ensure paths are in UNIX format before anything is touched # For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin; then if $cygwin ; then
[ -n "$M2_HOME" ] && [ -n "$M2_HOME" ] &&
M2_HOME=$(cygpath --unix "$M2_HOME") M2_HOME=`cygpath --unix "$M2_HOME"`
[ -n "$JAVA_HOME" ] && [ -n "$JAVA_HOME" ] &&
JAVA_HOME=$(cygpath --unix "$JAVA_HOME") JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
[ -n "$CLASSPATH" ] && [ -n "$CLASSPATH" ] &&
CLASSPATH=$(cygpath --path --unix "$CLASSPATH") CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi fi
# For Mingw, ensure paths are in UNIX format before anything is touched # For Mingw, ensure paths are in UNIX format before anything is touched
if $mingw; then if $mingw ; then
[ -n "$M2_HOME" ] && [ -n "$M2_HOME" ] &&
M2_HOME="$( ( M2_HOME="`(cd "$M2_HOME"; pwd)`"
cd "$M2_HOME"
pwd
))"
[ -n "$JAVA_HOME" ] && [ -n "$JAVA_HOME" ] &&
JAVA_HOME="$( ( JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
cd "$JAVA_HOME"
pwd
))"
fi fi
if [ -z "$JAVA_HOME" ]; then if [ -z "$JAVA_HOME" ]; then
javaExecutable="$(which javac)" javaExecutable="`which javac`"
if [ -n "$javaExecutable" ] && ! [ "$(expr \"$javaExecutable\" : '\([^ ]*\)')" = "no" ]; then if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
# readlink(1) is not available as standard on Solaris 10. # readlink(1) is not available as standard on Solaris 10.
readLink=$(which readlink) readLink=`which readlink`
if [ ! $(expr "$readLink" : '\([^ ]*\)') = "no" ]; then if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
if $darwin; then if $darwin ; then
javaHome="$(dirname \"$javaExecutable\")" javaHome="`dirname \"$javaExecutable\"`"
javaExecutable="$(cd \"$javaHome\" && pwd -P)/javac" javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
else else
javaExecutable="$(readlink -f \"$javaExecutable\")" javaExecutable="`readlink -f \"$javaExecutable\"`"
fi fi
javaHome="$(dirname \"$javaExecutable\")" javaHome="`dirname \"$javaExecutable\"`"
javaHome=$(expr "$javaHome" : '\(.*\)/bin') javaHome=`expr "$javaHome" : '\(.*\)/bin'`
JAVA_HOME="$javaHome" JAVA_HOME="$javaHome"
export JAVA_HOME export JAVA_HOME
fi fi
fi fi
fi fi
if [ -z "$JAVACMD" ]; then if [ -z "$JAVACMD" ] ; then
if [ -n "$JAVA_HOME" ]; then if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ]; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables # IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java" JAVACMD="$JAVA_HOME/jre/sh/java"
else else
JAVACMD="$JAVA_HOME/bin/java" JAVACMD="$JAVA_HOME/bin/java"
fi fi
else else
JAVACMD="$(which java)" JAVACMD="`which java`"
fi fi
fi fi
if [ ! -x "$JAVACMD" ]; then if [ ! -x "$JAVACMD" ] ; then
echo "Error: JAVA_HOME is not defined correctly." >&2 echo "Error: JAVA_HOME is not defined correctly." >&2
echo " We cannot execute $JAVACMD" >&2 echo " We cannot execute $JAVACMD" >&2
exit 1 exit 1
fi fi
if [ -z "$JAVA_HOME" ]; then if [ -z "$JAVA_HOME" ] ; then
echo "Warning: JAVA_HOME environment variable is not set." echo "Warning: JAVA_HOME environment variable is not set."
fi fi
@@ -172,24 +165,22 @@ CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
# first directory with .mvn subdirectory is considered project base directory # first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() { find_maven_basedir() {
if [ -z "$1" ]; then if [ -z "$1" ]
then
echo "Path not specified to find_maven_basedir" echo "Path not specified to find_maven_basedir"
return 1 return 1
fi fi
basedir="$1" basedir="$1"
wdir="$1" wdir="$1"
while [ "$wdir" != '/' ]; do while [ "$wdir" != '/' ] ; do
if [ -d "$wdir"/.mvn ]; then if [ -d "$wdir"/.mvn ] ; then
basedir=$wdir basedir=$wdir
break break
fi fi
# workaround for JBEAP-8937 (on Solaris 10/Sparc) # workaround for JBEAP-8937 (on Solaris 10/Sparc)
if [ -d "${wdir}" ]; then if [ -d "${wdir}" ]; then
wdir=$( wdir=`cd "$wdir/.."; pwd`
cd "$wdir/.."
pwd
)
fi fi
# end of workaround # end of workaround
done done
@@ -199,13 +190,13 @@ find_maven_basedir() {
# concatenates all lines of a file # concatenates all lines of a file
concat_lines() { concat_lines() {
if [ -f "$1" ]; then if [ -f "$1" ]; then
echo "$(tr -s '\n' ' ' <"$1")" echo "$(tr -s '\n' ' ' < "$1")"
fi fi
} }
BASE_DIR=$(find_maven_basedir "$(pwd)") BASE_DIR=`find_maven_basedir "$(pwd)"`
if [ -z "$BASE_DIR" ]; then if [ -z "$BASE_DIR" ]; then
exit 1 exit 1;
fi fi
########################################################################################## ##########################################################################################
@@ -221,26 +212,23 @@ else
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
fi fi
if [ -n "$MVNW_REPOURL" ]; then if [ -n "$MVNW_REPOURL" ]; then
jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar" jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
else else
jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar" jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
fi fi
while IFS="=" read key value; do while IFS="=" read key value; do
case "$key" in wrapperUrl) case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
jarUrl="$value"
break
;;
esac esac
done <"$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
if [ "$MVNW_VERBOSE" = true ]; then if [ "$MVNW_VERBOSE" = true ]; then
echo "Downloading from: $jarUrl" echo "Downloading from: $jarUrl"
fi fi
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
if $cygwin; then if $cygwin; then
wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
fi fi
if command -v wget >/dev/null; then if command -v wget > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then if [ "$MVNW_VERBOSE" = true ]; then
echo "Found wget ... using wget" echo "Found wget ... using wget"
fi fi
@@ -249,7 +237,7 @@ else
else else
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
fi fi
elif command -v curl >/dev/null; then elif command -v curl > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then if [ "$MVNW_VERBOSE" = true ]; then
echo "Found curl ... using curl" echo "Found curl ... using curl"
fi fi
@@ -266,7 +254,7 @@ else
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
# For Cygwin, switch paths to Windows format before running javac # For Cygwin, switch paths to Windows format before running javac
if $cygwin; then if $cygwin; then
javaClass=$(cygpath --path --windows "$javaClass") javaClass=`cygpath --path --windows "$javaClass"`
fi fi
if [ -e "$javaClass" ]; then if [ -e "$javaClass" ]; then
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
@@ -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 # For Cygwin, switch paths to Windows format before running java
if $cygwin; then if $cygwin; then
[ -n "$M2_HOME" ] && [ -n "$M2_HOME" ] &&
M2_HOME=$(cygpath --path --windows "$M2_HOME") M2_HOME=`cygpath --path --windows "$M2_HOME"`
[ -n "$JAVA_HOME" ] && [ -n "$JAVA_HOME" ] &&
JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
[ -n "$CLASSPATH" ] && [ -n "$CLASSPATH" ] &&
CLASSPATH=$(cygpath --path --windows "$CLASSPATH") CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
[ -n "$MAVEN_PROJECTBASEDIR" ] && [ -n "$MAVEN_PROJECTBASEDIR" ] &&
MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
fi fi
# Provide a "standardized" way to retrieve the CLI args that will # 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 "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at @REM with the License. You may obtain a copy of the License at
@REM @REM
@REM https://www.apache.org/licenses/LICENSE-2.0 @REM http://www.apache.org/licenses/LICENSE-2.0
@REM @REM
@REM Unless required by applicable law or agreed to in writing, @REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an @REM software distributed under the License is distributed on an
@@ -18,7 +18,7 @@
@REM ---------------------------------------------------------------------------- @REM ----------------------------------------------------------------------------
@REM ---------------------------------------------------------------------------- @REM ----------------------------------------------------------------------------
@REM Maven2 Start Up Batch script @REM Maven Start Up Batch script
@REM @REM
@REM Required ENV vars: @REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir @REM JAVA_HOME - location of a JDK home dir
@@ -26,7 +26,7 @@
@REM Optional ENV vars @REM Optional ENV vars
@REM M2_HOME - location of maven2's installed home dir @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_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 MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use @REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 @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_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 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 ( FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
@@ -134,7 +134,7 @@ if exist %WRAPPER_JAR% (
) )
) else ( ) else (
if not "%MVNW_REPOURL%" == "" ( 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" ( if "%MVNW_VERBOSE%" == "true" (
echo Couldn't find %WRAPPER_JAR%, downloading it ... echo Couldn't find %WRAPPER_JAR%, downloading it ...

119
pom.xml
View File

@@ -6,7 +6,7 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version> <version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository --> <relativePath/>
</parent> </parent>
<groupId>cn.celess</groupId> <groupId>cn.celess</groupId>
<artifactId>blog</artifactId> <artifactId>blog</artifactId>
@@ -40,14 +40,14 @@
<dependency> <dependency>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>druid</artifactId> <artifactId>druid</artifactId>
<version>1.1.14</version> <version>1.2.6</version>
</dependency> </dependency>
<!-- lombok --> <!-- lombok -->
<dependency> <dependency>
<groupId>org.projectlombok</groupId> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
<version>1.18.6</version> <version>1.18.26</version>
</dependency> </dependency>
@@ -55,35 +55,27 @@
<dependency> <dependency>
<groupId>io.springfox</groupId> <groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId> <artifactId>springfox-swagger2</artifactId>
<version>2.6.1</version> <version>2.9.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>io.springfox</groupId> <groupId>com.github.xiaoymin</groupId>
<artifactId>springfox-swagger-ui</artifactId> <artifactId>swagger-bootstrap-ui</artifactId>
<version>2.6.1</version> <version>1.9.6</version>
</dependency> </dependency>
<!--MarkDown 2 html --> <!--MarkDown 2 html -->
<dependency> <dependency>
<groupId>com.youbenzi</groupId> <groupId>com.youbenzi</groupId>
<artifactId>MDTool</artifactId> <artifactId>MDTool</artifactId>
<version>1.2.3</version> <version>1.2.4</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.minidev</groupId> <groupId>net.minidev</groupId>
<artifactId>json-smart</artifactId> <artifactId>json-smart</artifactId>
<version>2.3</version> <version>2.4.7</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<!--Json-->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<!-- 七牛云SDK --> <!-- 七牛云SDK -->
<dependency> <dependency>
<groupId>com.qiniu</groupId> <groupId>com.qiniu</groupId>
@@ -107,39 +99,39 @@
<dependency> <dependency>
<groupId>org.mybatis.spring.boot</groupId> <groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId> <artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version> <version>2.2.0</version>
</dependency> </dependency>
<!-- pageHelper --> <!-- pageHelper -->
<dependency> <dependency>
<groupId>com.github.pagehelper</groupId> <groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId> <artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.12</version> <version>1.3.0</version>
</dependency> </dependency>
<!-- protostuff序列化依赖 --> <!-- protostuff序列化依赖 -->
<dependency> <dependency>
<groupId>com.dyuproject.protostuff</groupId> <groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-core</artifactId> <artifactId>protostuff-core</artifactId>
<version>1.0.8</version> <version>1.1.6</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.dyuproject.protostuff</groupId> <groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-runtime</artifactId> <artifactId>protostuff-runtime</artifactId>
<version>1.0.8</version> <version>1.1.6</version>
</dependency> </dependency>
<!-- Ua解析--> <!-- Ua解析-->
<dependency> <dependency>
<groupId>eu.bitwalker</groupId> <groupId>eu.bitwalker</groupId>
<artifactId>UserAgentUtils</artifactId> <artifactId>UserAgentUtils</artifactId>
<version>1.20</version> <version>1.21</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
<artifactId>junit</artifactId> <artifactId>junit</artifactId>
<version>4.12</version> <version>4.13.1</version>
</dependency> </dependency>
<!-- JJwt --> <!-- JJwt -->
@@ -148,6 +140,69 @@
<artifactId>jjwt</artifactId> <artifactId>jjwt</artifactId>
<version>0.9.1</version> <version>0.9.1</version>
</dependency> </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> </dependencies>
<build> <build>
@@ -157,21 +212,15 @@
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.jacoco</groupId> <groupId>org.jetbrains.kotlin</groupId>
<artifactId>jacoco-maven-plugin</artifactId> <artifactId>kotlin-maven-plugin</artifactId>
<version>0.7.9</version> <version>1.5.10</version>
<executions> <executions>
<execution> <execution>
<id>pre-unit-test</id> <id>compile</id>
<phase>process-sources</phase>
<goals> <goals>
<goal>prepare-agent</goal> <goal>compile</goal>
</goals>
</execution>
<execution>
<id>post-unit-test</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals> </goals>
</execution> </execution>
</executions> </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

@@ -26,7 +26,7 @@ public class CorsConfig {
config.addAllowedOrigin("https://celess.cn"); config.addAllowedOrigin("https://celess.cn");
config.addAllowedOrigin("https://www.celess.cn"); config.addAllowedOrigin("https://www.celess.cn");
// 本地调试时的跨域 // 本地调试时的跨域
if ("dev".equals(activeModel)) { if (!"prod".equals(activeModel)) {
config.addAllowedOrigin("http://localhost:4200"); config.addAllowedOrigin("http://localhost:4200");
config.addAllowedOrigin("http://127.0.0.1:4200"); config.addAllowedOrigin("http://127.0.0.1:4200");
} }

View File

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

View File

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

View File

@@ -7,6 +7,7 @@ import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo; import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2; import springfox.documentation.swagger2.annotations.EnableSwagger2;
@@ -25,7 +26,7 @@ public class SwaggerConfig {
@Bean @Bean
public Docket createRestApi() { public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2) return new Docket(DocumentationType.SWAGGER_2)
.enable("dev".equals(environment)) .enable(!"prod".equals(environment))
.apiInfo(apiInfo()) .apiInfo(apiInfo())
.select() .select()
.apis(RequestHandlerSelectors.basePackage("cn.celess.blog")) .apis(RequestHandlerSelectors.basePackage("cn.celess.blog"))
@@ -37,7 +38,7 @@ public class SwaggerConfig {
return new ApiInfoBuilder() return new ApiInfoBuilder()
.title("小海博客的APi") .title("小海博客的APi")
.description("小海博客的APi") .description("小海博客的APi")
.contact("小海") .contact(new Contact("小海", "https://www.celess.cn", "a@celess.cn"))
.version("1.0") .version("1.0")
.build(); .build();
} }

View File

@@ -5,7 +5,7 @@ import cn.celess.blog.entity.Response;
import cn.celess.blog.service.UserService; import cn.celess.blog.service.UserService;
import cn.celess.blog.util.JwtUtil; import cn.celess.blog.util.JwtUtil;
import cn.celess.blog.util.RedisUtil; import cn.celess.blog.util.RedisUtil;
import net.sf.json.JSONObject; import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -56,10 +56,13 @@ public class AuthenticationFilter implements HandlerInterceptor {
return writeResponse(ResponseEnum.LOGIN_EXPIRED, response, request); return writeResponse(ResponseEnum.LOGIN_EXPIRED, response, request);
} }
String email = jwtUtil.getUsernameFromToken(jwtStr); String email = jwtUtil.getUsernameFromToken(jwtStr);
if (!redisUtil.hasKey(email + "-login") || jwtUtil.isTokenExpired(jwtStr)) { if (jwtUtil.isTokenExpired(jwtStr)) {
// 登陆过期 // 登陆过期
return writeResponse(ResponseEnum.LOGIN_EXPIRED, response, request); return writeResponse(ResponseEnum.LOGIN_EXPIRED, response, request);
} }
if (!redisUtil.hasKey(email + "-login")) {
return writeResponse(ResponseEnum.LOGOUT, response, request);
}
String role = userService.getUserRoleByEmail(email); String role = userService.getUserRoleByEmail(email);
if (role.equals(ROLE_USER) || role.equals(ROLE_ADMIN)) { if (role.equals(ROLE_USER) || role.equals(ROLE_ADMIN)) {
// 更新token // 更新token
@@ -81,7 +84,7 @@ public class AuthenticationFilter implements HandlerInterceptor {
response.setHeader("Content-Type", "application/json;charset=UTF-8"); response.setHeader("Content-Type", "application/json;charset=UTF-8");
try { try {
logger.info("鉴权失败,[code:{},msg:{},path:{}]", e.getCode(), e.getMsg(), request.getRequestURI() + "?" + request.getQueryString()); logger.info("鉴权失败,[code:{},msg:{},path:{}]", e.getCode(), e.getMsg(), request.getRequestURI() + "?" + request.getQueryString());
response.getWriter().println(JSONObject.fromObject(Response.response(e, null))); response.getWriter().println(new ObjectMapper().writeValueAsString(Response.response(e, null)));
} catch (IOException ex) { } catch (IOException ex) {
ex.printStackTrace(); ex.printStackTrace();
} }

View File

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

View File

@@ -8,6 +8,7 @@ import cn.celess.blog.service.ArticleService;
import cn.celess.blog.util.RedisUserUtil; import cn.celess.blog.util.RedisUserUtil;
import cn.celess.blog.util.SitemapGenerateUtil; import cn.celess.blog.util.SitemapGenerateUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@@ -24,6 +25,8 @@ public class ArticleController {
SitemapGenerateUtil sitemapGenerateUtil; SitemapGenerateUtil sitemapGenerateUtil;
@Autowired @Autowired
RedisUserUtil redisUserUtil; RedisUserUtil redisUserUtil;
@Value("${spring.profiles.active}")
private String activeModel;
/** /**
* 新建一篇文章 * 新建一篇文章
@@ -34,7 +37,9 @@ public class ArticleController {
@PostMapping("/admin/article/create") @PostMapping("/admin/article/create")
public Response create(@RequestBody ArticleReq body) { public Response create(@RequestBody ArticleReq body) {
ArticleModel articleModel = articleService.create(body); ArticleModel articleModel = articleService.create(body);
if ("prod".equals(activeModel)) {
sitemapGenerateUtil.createSitemap(); sitemapGenerateUtil.createSitemap();
}
return Response.success(articleModel); return Response.success(articleModel);
} }
@@ -47,7 +52,9 @@ public class ArticleController {
@DeleteMapping("/admin/article/del") @DeleteMapping("/admin/article/del")
public Response delete(@RequestParam("articleID") long articleId) { public Response delete(@RequestParam("articleID") long articleId) {
boolean delete = articleService.delete(articleId); boolean delete = articleService.delete(articleId);
if ("prod".equals(activeModel)) {
sitemapGenerateUtil.createSitemap(); sitemapGenerateUtil.createSitemap();
}
return Response.success(delete); return Response.success(delete);
} }
@@ -60,7 +67,9 @@ public class ArticleController {
@PutMapping("/admin/article/update") @PutMapping("/admin/article/update")
public Response update(@RequestBody ArticleReq body) { public Response update(@RequestBody ArticleReq body) {
ArticleModel update = articleService.update(body); ArticleModel update = articleService.update(body);
if ("prod".equals(activeModel)) {
sitemapGenerateUtil.createSitemap(); sitemapGenerateUtil.createSitemap();
}
return Response.success(update); return Response.success(update);
} }
@@ -110,8 +119,9 @@ public class ArticleController {
*/ */
@GetMapping("/admin/articles") @GetMapping("/admin/articles")
public Response adminArticles(@RequestParam(name = "page", defaultValue = "1") int page, public Response adminArticles(@RequestParam(name = "page", defaultValue = "1") int page,
@RequestParam(name = "count", defaultValue = "10") int count) { @RequestParam(name = "count", defaultValue = "10") int count,
return Response.success(articleService.adminArticles(count, page)); @RequestParam(name = "deleted", required = false) Boolean deleted) {
return Response.success(articleService.adminArticles(count, page, deleted));
} }
/** /**

View File

@@ -7,10 +7,11 @@ import cn.celess.blog.exception.MyException;
import cn.celess.blog.service.CountService; import cn.celess.blog.service.CountService;
import cn.celess.blog.service.QiniuService; import cn.celess.blog.service.QiniuService;
import cn.celess.blog.util.HttpUtil; import cn.celess.blog.util.HttpUtil;
import cn.celess.blog.util.RedisUserUtil;
import cn.celess.blog.util.RedisUtil; import cn.celess.blog.util.RedisUtil;
import cn.celess.blog.util.VeriCodeUtil; import cn.celess.blog.util.VeriCodeUtil;
import net.sf.json.JSONArray; import com.fasterxml.jackson.databind.JsonNode;
import net.sf.json.JSONObject; import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -27,9 +28,7 @@ import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.Enumeration; import java.util.*;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/** /**
@@ -37,7 +36,7 @@ import java.util.concurrent.TimeUnit;
* @date : 2019/04/02 22:03 * @date : 2019/04/02 22:03
*/ */
@RestController @RestController
public class Other { public class CommonController {
public static final Logger logger = LoggerFactory.getLogger(Object.class); public static final Logger logger = LoggerFactory.getLogger(Object.class);
@Autowired @Autowired
@@ -47,7 +46,7 @@ public class Other {
@Autowired @Autowired
RedisUtil redisUtil; RedisUtil redisUtil;
@Autowired @Autowired
HttpServletRequest request; RedisUserUtil redisUserUtil;
@GetMapping("/counts") @GetMapping("/counts")
@@ -89,7 +88,7 @@ public class Other {
* @throws IOException IOException * @throws IOException IOException
*/ */
@GetMapping(value = "/imgCode", produces = MediaType.IMAGE_PNG_VALUE) @GetMapping(value = "/imgCode", produces = MediaType.IMAGE_PNG_VALUE)
public void getImg(HttpServletResponse response) throws IOException { public void getImg(HttpServletRequest request, HttpServletResponse response) throws IOException {
Object[] obj = VeriCodeUtil.createImage(); Object[] obj = VeriCodeUtil.createImage();
request.getSession().setAttribute("code", obj[0]); request.getSession().setAttribute("code", obj[0]);
//将图片输出给浏览器 //将图片输出给浏览器
@@ -133,14 +132,14 @@ public class Other {
* FIXME :: 单张图片多次上传的问题 * FIXME :: 单张图片多次上传的问题
* editor.md图片上传的接口 * editor.md图片上传的接口
* FUCK !!! * FUCK !!!
* * !! 推荐使用 fileUpload(/fileUpload) 接口
* @param file 文件 * @param file 文件
* @return
* @throws IOException
*/ */
@Deprecated
@PostMapping("/imgUpload") @PostMapping("/imgUpload")
public void upload(HttpServletRequest request, HttpServletResponse response, @RequestParam("editormd-image-file") MultipartFile file) throws IOException { public void upload(HttpServletRequest request, HttpServletResponse response, @RequestParam("editormd-image-file") MultipartFile file) throws IOException {
JSONObject jsonObject = new JSONObject(); Map<String, Object> map = new HashMap<>();
ObjectMapper mapper = new ObjectMapper();
String uploadTimesStr = redisUtil.get(request.getRemoteAddr() + "-ImgUploadTimes"); String uploadTimesStr = redisUtil.get(request.getRemoteAddr() + "-ImgUploadTimes");
int uploadTimes = 0; int uploadTimes = 0;
if (uploadTimesStr != null) { if (uploadTimesStr != null) {
@@ -150,41 +149,74 @@ public class Other {
throw new MyException(ResponseEnum.FAILURE.getCode(), "上传次数已达10次请2小时后在上传"); throw new MyException(ResponseEnum.FAILURE.getCode(), "上传次数已达10次请2小时后在上传");
} }
request.setCharacterEncoding("utf-8"); request.setCharacterEncoding("utf-8");
response.setContentType("text/html"); response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
if (file.isEmpty()) { if (file.isEmpty()) {
jsonObject.put("success", 0); map.put("success", 0);
jsonObject.put("message", "上传失败,请选择文件"); map.put("message", "上传失败,请选择文件");
response.getWriter().println(jsonObject.toString()); response.getWriter().println(mapper.writeValueAsString(map));
return; return;
} }
String fileName = file.getOriginalFilename(); String fileName = file.getOriginalFilename();
assert fileName != null;
String mime = fileName.substring(fileName.lastIndexOf(".")); String mime = fileName.substring(fileName.lastIndexOf("."));
if (".png".equals(mime.toLowerCase()) || ".jpg".equals(mime.toLowerCase()) || if (".png".equals(mime.toLowerCase()) || ".jpg".equals(mime.toLowerCase()) ||
".jpeg".equals(mime.toLowerCase()) || ".bmp".equals(mime.toLowerCase())) { ".jpeg".equals(mime.toLowerCase()) || ".bmp".equals(mime.toLowerCase())) {
QiniuResponse qiniuResponse = qiniuService.uploadFile(file.getInputStream(), "img_" + System.currentTimeMillis() + mime); QiniuResponse qiniuResponse = qiniuService.uploadFile(file.getInputStream(), "img_" + System.currentTimeMillis() + mime);
jsonObject.put("success", 1); map.put("success", 1);
jsonObject.put("message", "上传成功"); map.put("message", "上传成功");
jsonObject.put("url", "http://cdn.celess.cn/" + qiniuResponse.key); map.put("url", "http://cdn.celess.cn/" + qiniuResponse.key);
response.getWriter().println(jsonObject.toString()); response.getWriter().println(mapper.writeValueAsString(map));
redisUtil.setEx(request.getRemoteAddr() + "-ImgUploadTimes", uploadTimes + 1 + "", 2, TimeUnit.HOURS); redisUtil.setEx(request.getRemoteAddr() + "-ImgUploadTimes", uploadTimes + 1 + "", 2, TimeUnit.HOURS);
return; return;
} }
jsonObject.put("success", 0); map.put("success", 0);
jsonObject.put("message", "上传失败,请上传图片文件"); map.put("message", "上传失败,请上传图片文件");
response.getWriter().println(jsonObject.toString()); response.getWriter().println(mapper.writeValueAsString(map));
} }
@GetMapping("/bingPic") @GetMapping("/bingPic")
public Response bingPic() { public Response bingPic() {
ObjectMapper mapper = new ObjectMapper();
JSONObject imageObj; JsonNode root;
try { try {
imageObj = JSONObject.fromObject(HttpUtil.get("https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN")); root = mapper.readTree(HttpUtil.get("https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN"));
} catch (IOException e) { } catch (IOException e) {
return Response.failure(null); return Response.failure(null);
} }
JSONArray jsonArray = imageObj.getJSONArray("images"); JsonNode images = root.get("images").elements().next();
String imageName = jsonArray.getJSONObject(0).getString("url"); return Response.success("https://cn.bing.com" + images.get("url").asText());
return Response.success("https://cn.bing.com" + imageName); }
@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,23 +1,18 @@
package cn.celess.blog.controller; package cn.celess.blog.controller;
import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.PartnerSite; import cn.celess.blog.entity.PartnerSite;
import cn.celess.blog.entity.Response; import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.request.LinkApplyReq;
import cn.celess.blog.entity.request.LinkReq; import cn.celess.blog.entity.request.LinkReq;
import cn.celess.blog.exception.MyException;
import cn.celess.blog.service.MailService; import cn.celess.blog.service.MailService;
import cn.celess.blog.service.PartnerSiteService; import cn.celess.blog.service.PartnerSiteService;
import cn.celess.blog.util.DateFormatUtil;
import cn.celess.blog.util.RedisUtil; import cn.celess.blog.util.RedisUtil;
import cn.celess.blog.util.RegexUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.stream.Collectors;
/** /**
* @author : xiaohai * @author : xiaohai
@@ -51,47 +46,24 @@ public class LinksController {
@GetMapping("/links") @GetMapping("/links")
public Response allForOpen() { public Response allForOpen() {
List<PartnerSite> sites = new ArrayList<>(); List<PartnerSite> sites = partnerSiteService.findAll().stream().peek(partnerSite -> partnerSite.setOpen(null)).collect(Collectors.toList());
for (PartnerSite p : partnerSiteService.findAll()) {
if (p.getOpen()) {
//隐藏open字段
p.setOpen(null);
sites.add(p);
}
}
return Response.success(sites); return Response.success(sites);
} }
@GetMapping("/admin/links") @GetMapping("/admin/links")
public Response all(@RequestParam("page") int page, public Response all(@RequestParam("page") int page,
@RequestParam("count") int count) { @RequestParam("count") int count,
return Response.success(partnerSiteService.partnerSitePages(page, count)); @RequestParam(value = "deleted", required = false) Boolean deleted) {
return Response.success(partnerSiteService.partnerSitePages(page, count, deleted));
} }
@PostMapping("/apply") @PostMapping("/apply")
public Response apply(@RequestParam("name") String name, public Response apply(@RequestBody() LinkApplyReq linkApplyReq) {
@RequestParam("url") String url) { return Response.success(partnerSiteService.apply(linkApplyReq));
// TODO :: 弃用发送邮件的方式。
if (name == null || name.replaceAll(" ", "").isEmpty()) {
return Response.response(ResponseEnum.PARAMETERS_ERROR, null);
} }
if (!RegexUtil.urlMatch(url)) {
return Response.response(ResponseEnum.PARAMETERS_URL_ERROR, null); @PostMapping("/reapply")
} public Response reapply(@RequestParam("key") String key) {
String applyTimeStr = redisUtil.get(request.getRemoteAddr() + "-Apply"); return Response.success(partnerSiteService.reapply(key));
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 ? Response.success("") : Response.failure("");
} }
} }

View File

@@ -3,12 +3,13 @@ package cn.celess.blog.controller;
import cn.celess.blog.entity.Response; import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.model.TagModel; import cn.celess.blog.entity.model.TagModel;
import cn.celess.blog.service.TagService; import cn.celess.blog.service.TagService;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* @author : xiaohai * @author : xiaohai
@@ -44,13 +45,13 @@ public class TagController {
@GetMapping("/tags/nac") @GetMapping("/tags/nac")
public Response getTagNameAndCount() { public Response getTagNameAndCount() {
List<JSONObject> nameAndCount = new ArrayList<>(); List<Map<String, Object>> nameAndCount = new ArrayList<>();
List<TagModel> all = tagService.findAll(); List<TagModel> all = tagService.findAll();
for (TagModel t : all) { for (TagModel t : all) {
JSONObject jsonObject = new JSONObject(); Map<String, Object> map = new HashMap<>(2);
jsonObject.put("name", t.getName()); map.put("name", t.getName());
jsonObject.put("size", t.getArticles().size()); map.put("size", t.getArticles().size());
nameAndCount.add(jsonObject); nameAndCount.add(map);
} }
return Response.success(nameAndCount); return Response.success(nameAndCount);
} }

View File

@@ -116,8 +116,8 @@ public class UserController {
} }
@GetMapping("/admin/users") @GetMapping("/admin/users")
public Response getAllUser(@RequestParam("page") int pageNum, @RequestParam("count") int 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)); return Response.success(userService.getUserList(pageNum, count, status));
} }
@GetMapping("/emailStatus/{email}") @GetMapping("/emailStatus/{email}")

View File

@@ -27,7 +27,7 @@ public class VisitorController {
@GetMapping("/admin/visitor/page") @GetMapping("/admin/visitor/page")
public Response page(@RequestParam(value = "count", required = false, defaultValue = "10") int count, public Response page(@RequestParam(value = "count", required = false, defaultValue = "10") int count,
@RequestParam(value = "page", required = false, defaultValue = "1") int page, @RequestParam(value = "page", required = false, defaultValue = "1") int page,
@RequestParam(value = "showLocation", required = false, defaultValue = "false") boolean showLocation) { @RequestParam(value = "showLocation", required = false, defaultValue = "true") boolean showLocation) {
return Response.success(visitorService.visitorPage(page, count, showLocation)); return Response.success(visitorService.visitorPage(page, count, showLocation));
} }

View File

@@ -33,6 +33,8 @@ public enum ResponseEnum {
PWD_SAME(3601, "新密码与原密码相同"), PWD_SAME(3601, "新密码与原密码相同"),
PWD_NOT_SAME(3602, "新密码与原密码不相同"), PWD_NOT_SAME(3602, "新密码与原密码不相同"),
LOGIN_EXPIRED(3700, "登陆过期"), LOGIN_EXPIRED(3700, "登陆过期"),
LOGOUT(3710, "账户已注销"),
CAN_NOT_USE(3711, "账户不可用"),
PWD_WRONG(3800, "密码不正确"), PWD_WRONG(3800, "密码不正确"),
JWT_EXPIRED(3810, "Token过期"), JWT_EXPIRED(3810, "Token过期"),
@@ -57,6 +59,11 @@ public enum ResponseEnum {
DATA_HAS_EXIST(7020, "数据已存在"), 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, "非法访问"), DID_NOT_GET_THE_DATA(8020, "非法访问"),

View File

@@ -1,5 +1,11 @@
package cn.celess.blog.enmu; 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: 小海 * @Author: 小海
* @Date: 2020-05-22 21:32 * @Date: 2020-05-22 21:32
@@ -36,4 +42,31 @@ public enum UserAccountStatusEnum {
public String getDesc() { public String getDesc() {
return desc; 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

@@ -25,6 +25,10 @@ public class PartnerSite {
private Boolean delete = false; private Boolean delete = false;
private String email;
private Boolean notification = true;
public PartnerSite() { public PartnerSite() {
} }

View File

@@ -1,8 +1,9 @@
package cn.celess.blog.entity; package cn.celess.blog.entity;
import cn.celess.blog.enmu.ResponseEnum; import cn.celess.blog.enmu.ResponseEnum;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data; import lombok.Data;
import net.sf.json.JSONObject; import lombok.SneakyThrows;
import java.io.Serializable; import java.io.Serializable;
@@ -11,15 +12,15 @@ import java.io.Serializable;
* @date : 2019/03/28 15:24 * @date : 2019/03/28 15:24
*/ */
@Data @Data
public class Response implements Serializable { public class Response<T> implements Serializable {
private int code; private int code;
private String msg; private String msg;
private Object result; private T result;
public Response() { public Response() {
} }
public Response(int code, String msg, Object result) { public Response(int code, String msg, T result) {
this.code = code; this.code = code;
this.msg = msg; this.msg = msg;
this.result = result; this.result = result;
@@ -31,8 +32,8 @@ public class Response implements Serializable {
* @param result 结果 * @param result 结果
* @return Response * @return Response
*/ */
public static Response success(Object result) { public static <T> Response<T> success(T result) {
return new Response(ResponseEnum.SUCCESS.getCode(), ResponseEnum.SUCCESS.getMsg(), result); return new Response<T>(ResponseEnum.SUCCESS.getCode(), ResponseEnum.SUCCESS.getMsg(), result);
} }
/** /**
@@ -41,8 +42,8 @@ public class Response implements Serializable {
* @param result 结果 * @param result 结果
* @return Response * @return Response
*/ */
public static Response failure(String result) { public static Response<String> failure(String result) {
return new Response(ResponseEnum.FAILURE.getCode(), ResponseEnum.FAILURE.getMsg(), result); return new Response<String>(ResponseEnum.FAILURE.getCode(), ResponseEnum.FAILURE.getMsg(), result);
} }
/** /**
@@ -52,13 +53,13 @@ public class Response implements Serializable {
* @param result 结果 * @param result 结果
* @return Response * @return Response
*/ */
public static Response response(ResponseEnum r, String result) { public static <T> Response<T> response(ResponseEnum r, T result) {
return new Response(r.getCode(), r.getMsg(), result); return new Response<T>(r.getCode(), r.getMsg(), result);
} }
@SneakyThrows
@Override @Override
public String toString() { public String toString() {
JSONObject jsonObject = JSONObject.fromObject(this); return new ObjectMapper().writeValueAsString(this);
return jsonObject.toString();
} }
} }

View File

@@ -82,4 +82,6 @@ public class ArticleModel {
* 文章的状态 true公开 false:不公开 * 文章的状态 true公开 false:不公开
*/ */
private Boolean open; private Boolean open;
private boolean deleted;
} }

View File

@@ -20,4 +20,5 @@ public class CategoryModel {
private String name; private String name;
private List<ArticleModel> articles; private List<ArticleModel> articles;
private boolean deleted;
} }

View File

@@ -21,4 +21,5 @@ public class TagModel {
private List<ArticleModel> articles; private List<ArticleModel> articles;
private boolean deleted;
} }

View File

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

View File

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

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

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

View File

@@ -39,8 +39,9 @@ public class ExceptionHandle {
public Response handle(Exception e) { public Response handle(Exception e) {
//自定义错误 //自定义错误
if (e instanceof MyException) { if (e instanceof MyException) {
logger.debug("返回了自定义的exception,[code={},msg={}]", ((MyException) e).getCode(), e.getMessage()); MyException exception = (MyException) e;
return new Response(((MyException) e).getCode(), e.getMessage(), null); 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) { if (e instanceof HttpRequestMethodNotSupportedException) {
@@ -82,7 +83,12 @@ public class ExceptionHandle {
simpleMailMessage.setTo("a@celess.cn"); simpleMailMessage.setTo("a@celess.cn");
simpleMailMessage.setSubject("服务器出现了错误"); simpleMailMessage.setSubject("服务器出现了错误");
StringBuilder msg = new StringBuilder(); 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("msg:\n").append(e.getMessage()).append("\n\n\n");
msg.append("date:\n").append(DateFormatUtil.getNow()).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"); msg.append("from:\n").append(request.getHeader("User-Agent")).append("\n\n\n");

View File

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

View File

@@ -1,6 +1,7 @@
package cn.celess.blog.mapper; package cn.celess.blog.mapper;
import cn.celess.blog.entity.ArticleTag; import cn.celess.blog.entity.ArticleTag;
import cn.celess.blog.entity.Tag;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
@@ -27,6 +28,8 @@ public interface ArticleTagMapper {
List<ArticleTag> findAllByArticleId(Long articleId); List<ArticleTag> findAllByArticleId(Long articleId);
List<Tag> findTagByArticleId(Long articleId);
int deleteMultiById(List<ArticleTag> articleTags); int deleteMultiById(List<ArticleTag> articleTags);
List<ArticleTag> findArticleByTag(Long tagId); List<ArticleTag> findArticleByTag(Long tagId);

View File

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

View File

@@ -53,6 +53,8 @@ public interface UserMapper {
int setUserRole(Long id, String role); int setUserRole(Long id, String role);
List<User> findAll(Integer status);
List<User> findAll(); List<User> findAll();
int update(User user); int update(User user);

View File

@@ -52,7 +52,7 @@ public interface ArticleService {
* @param page 数据页 * @param page 数据页
* @return 分页数据 * @return 分页数据
*/ */
PageData<ArticleModel> adminArticles(int count, int page); PageData<ArticleModel> adminArticles(int count, int page, Boolean deleted);
/** /**
* 获取文章状态为开放的文章 * 获取文章状态为开放的文章

View File

@@ -2,6 +2,7 @@ package cn.celess.blog.service;
import cn.celess.blog.entity.PartnerSite; import cn.celess.blog.entity.PartnerSite;
import cn.celess.blog.entity.model.PageData; 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.entity.request.LinkReq;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -44,7 +45,7 @@ public interface PartnerSiteService {
* @param page 数据页 * @param page 数据页
* @return 分页数据 * @return 分页数据
*/ */
PageData<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(); List<PartnerSite> findAll();
/**
* 申请友链
*
* @param linkApplyReq linkApplyReq
* @return linkApplyReq
*/
PartnerSite apply(LinkApplyReq linkApplyReq);
/**
* 重写申请友链
*
* @param key key
* @return msg
*/
String reapply(String key);
} }

View File

@@ -129,7 +129,7 @@ public interface UserService {
* @param page 数据页 * @param page 数据页
* @return 分页数据 * @return 分页数据
*/ */
PageData<UserModel> getUserList(Integer page, Integer count); PageData<UserModel> getUserList(Integer page, Integer count, Integer status);
/** /**
* 更改用户信息 * 更改用户信息

View File

@@ -2,10 +2,10 @@ package cn.celess.blog.service;
import cn.celess.blog.entity.model.PageData; import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.model.WebUpdateModel; import cn.celess.blog.entity.model.WebUpdateModel;
import net.sf.json.JSONObject;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* @author : xiaohai * @author : xiaohai
@@ -59,5 +59,5 @@ public interface WebUpdateInfoService {
* *
* @return * @return
*/ */
JSONObject getLastestUpdateTime(); Map<String, Object> getLastestUpdateTime();
} }

View File

@@ -26,6 +26,7 @@ import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
@@ -145,7 +146,7 @@ public class ArticleServiceImpl implements ArticleService {
//删除指定文章 //删除指定文章
articleMapper.delete(articleId); articleMapper.delete(articleId);
articleTagMapper.deleteByArticleId(articleId); //articleTagMapper.deleteByArticleId(articleId);
return true; return true;
} }
@@ -273,21 +274,28 @@ public class ArticleServiceImpl implements ArticleService {
/** /**
* @param count 数目 * @param count 数目
* @param page 页面 默认减1 * @param page 页面
* @return PageInfo * @return PageInfo
*/ */
@Override @Override
public PageData<ArticleModel> adminArticles(int count, int page) { public PageData<ArticleModel> adminArticles(int count, int page, Boolean deleted) {
PageHelper.startPage(page, count, "articleId desc"); PageHelper.startPage(page, count);
List<Article> articleList = articleMapper.findAll(); List<Article> articleList = articleMapper.findAll();
PageData<ArticleModel> pageData = new PageData<ArticleModel>(new PageInfo<Article>(articleList));
List<ArticleModel> articleModelList = new ArrayList<>(); PageData<ArticleModel> pageData = new PageData<>(new PageInfo<>(articleList));
articleList.forEach(article -> {
ArticleModel articleModel = ModalTrans.article(article); List<Article> collect;
articleModel.setMdContent(null); if (deleted != null) {
articleModelList.add(articleModel); collect = articleList.stream().filter(article -> article.isDeleted() == deleted).collect(Collectors.toList());
}); } else {
pageData.setList(articleModelList); collect = articleList;
}
List<ArticleModel> articleModels = collect.stream()
.peek(article -> article.setMdContent(null))
.map(ModalTrans::article)
.collect(Collectors.toList());
pageData.setList(articleModels);
return pageData; return pageData;
} }
@@ -295,16 +303,12 @@ public class ArticleServiceImpl implements ArticleService {
public PageData<ArticleModel> retrievePageForOpen(int count, int page) { public PageData<ArticleModel> retrievePageForOpen(int count, int page) {
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
List<Article> articleList = articleMapper.findAllByOpen(true); List<Article> articleList = articleMapper.findAllByOpen(true);
PageData<ArticleModel> pageData = new PageData<>(new PageInfo<Article>(articleList)); PageData<ArticleModel> pageData = new PageData<>(new PageInfo<>(articleList));
List<ArticleModel> articleModelList = new ArrayList<>();
articleList.forEach(article -> {
ArticleModel model = ModalTrans.article(article, true);
setPreAndNextArticle(model);
articleModelList.add(model);
});
List<ArticleModel> articleModelList = articleList
.stream()
.map(article -> setPreAndNextArticle(ModalTrans.article(article, true)))
.collect(Collectors.toList());
pageData.setList(articleModelList); pageData.setList(articleModelList);
return pageData; return pageData;
} }
@@ -318,17 +322,14 @@ public class ArticleServiceImpl implements ArticleService {
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
List<Article> open = articleMapper.findAllByCategoryIdAndOpen(category.getId()); List<Article> open = articleMapper.findAllByCategoryIdAndOpen(category.getId());
List<ArticleModel> modelList = new ArrayList<>(); List<ArticleModel> modelList = open.stream()
.map(article -> ModalTrans.article(article, true))
open.forEach(article -> { .peek(articleModel -> {
ArticleModel model = ModalTrans.article(article, true); articleModel.setNextArticle(null);
model.setTags(null); articleModel.setPreArticle(null);
// setPreAndNextArticle(model); })
model.setNextArticle(null); .collect(Collectors.toList());
model.setPreArticle(null); return new PageData<>(new PageInfo<>(open), modelList);
modelList.add(model);
});
return new PageData<ArticleModel>(new PageInfo<Article>(open), modelList);
} }
@Override @Override
@@ -339,21 +340,22 @@ public class ArticleServiceImpl implements ArticleService {
} }
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
List<ArticleTag> articleByTag = articleTagMapper.findArticleByTagAndOpen(tag.getId()); List<ArticleTag> articleByTag = articleTagMapper.findArticleByTagAndOpen(tag.getId());
List<ArticleModel> modelList = new ArrayList<>(); List<ArticleModel> modelList = articleByTag
articleByTag.forEach(articleTag -> { .stream()
ArticleModel model = ModalTrans.article(articleTag.getArticle(), true); .map(articleTag -> ModalTrans.article(articleTag.getArticle(), true))
model.setNextArticle(null); .peek(articleModel -> {
model.setPreArticle(null); articleModel.setNextArticle(null);
modelList.add(model); articleModel.setPreArticle(null);
}); }).collect(Collectors.toList());
return new PageData<ArticleModel>(new PageInfo<ArticleTag>(articleByTag), modelList); return new PageData<>(new PageInfo<>(articleByTag), modelList);
} }
private void setPreAndNextArticle(ArticleModel articleModel) { private ArticleModel setPreAndNextArticle(ArticleModel articleModel) {
if (articleModel == null) { if (articleModel == null) {
return; return null;
} }
articleModel.setPreArticle(ModalTrans.article(articleMapper.getPreArticle(articleModel.getId()), true)); articleModel.setPreArticle(ModalTrans.article(articleMapper.getPreArticle(articleModel.getId()), true));
articleModel.setNextArticle(ModalTrans.article(articleMapper.getNextArticle(articleModel.getId()), true)); articleModel.setNextArticle(ModalTrans.article(articleMapper.getNextArticle(articleModel.getId()), true));
return articleModel;
} }
} }

View File

@@ -17,8 +17,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
* @author : xiaohai * @author : xiaohai
@@ -68,22 +68,25 @@ public class CategoryServiceImpl implements CategoryService {
public PageData<CategoryModel> retrievePage(int page, int count) { public PageData<CategoryModel> retrievePage(int page, int count) {
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
List<Category> all = categoryMapper.findAll(); List<Category> all = categoryMapper.findAll();
List<CategoryModel> modelList = new ArrayList<>(); // 遍历没一个category
all.forEach(e -> { List<CategoryModel> modelList = all
CategoryModel model = ModalTrans.category(e); .stream()
List<Article> allByCategoryId = articleMapper.findAllByCategoryId(e.getId()); .map(ModalTrans::category)
List<ArticleModel> articleModelList = new ArrayList<>(); .peek(categoryModel -> {
allByCategoryId.forEach(article -> { // 根据category去查article并赋值给categoryModel
ArticleModel articleModel = ModalTrans.article(article, true); List<Article> allByCategoryId = articleMapper.findAllByCategoryId(categoryModel.getId());
List<ArticleModel> articleModelList = allByCategoryId
.stream()
.map(article -> ModalTrans.article(article, true))
.peek(articleModel -> {
// 去除不必要的字段
articleModel.setPreArticle(null); articleModel.setPreArticle(null);
articleModel.setNextArticle(null); articleModel.setNextArticle(null);
articleModel.setTags(null); articleModel.setTags(null);
articleModelList.add(articleModel); })
}); .collect(Collectors.toList());
model.setArticles(articleModelList); categoryModel.setArticles(articleModelList);
modelList.add(model); }).collect(Collectors.toList());
}); return new PageData<>(new PageInfo<>(all), modelList);
return new PageData<CategoryModel>(new PageInfo<Category>(all), modelList);
} }
} }

View File

@@ -23,6 +23,7 @@ import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
* @author : xiaohai * @author : xiaohai
@@ -59,7 +60,7 @@ public class CommentServiceImpl implements CommentService {
Comment comment = new Comment(); Comment comment = new Comment();
comment.setFromUser(user); comment.setFromUser(user);
User userTo = new User(); User userTo = new User();
userTo.setId(-1L); userTo.setId(null);
if (reqBody.getToUserId() != -1) { if (reqBody.getToUserId() != -1) {
userTo = userMapper.findById(reqBody.getToUserId()); userTo = userMapper.findById(reqBody.getToUserId());
comment.setToUser(userTo); comment.setToUser(userTo);
@@ -107,14 +108,11 @@ public class CommentServiceImpl implements CommentService {
@Override @Override
public List<CommentModel> retrievePageByPid(long pid) { public List<CommentModel> retrievePageByPid(long pid) {
List<Comment> allByPagePath = commentMapper.findAllByPid(pid); List<Comment> allByPagePath = commentMapper.findAllByPid(pid);
List<CommentModel> commentModels = new ArrayList<>(); return allByPagePath
allByPagePath.forEach(comment -> { .stream()
if (comment.getStatus() != CommentStatusEnum.DELETED.getCode()) { .filter(comment -> comment.getStatus() != CommentStatusEnum.DELETED.getCode())
commentModels.add(ModalTrans.comment(comment)); .map(ModalTrans::comment)
} .collect(Collectors.toList());
});
return commentModels;
} }
@Override @Override
@@ -145,14 +143,11 @@ public class CommentServiceImpl implements CommentService {
private PageData<CommentModel> pageTrans(List<Comment> commentList, boolean noResponseList) { private PageData<CommentModel> pageTrans(List<Comment> commentList, boolean noResponseList) {
PageInfo<Comment> p = PageInfo.of(commentList); PageInfo<Comment> p = PageInfo.of(commentList);
List<CommentModel> modelList = new ArrayList<>(); List<CommentModel> modelList = commentList
commentList.forEach(l -> { .stream()
CommentModel model = ModalTrans.comment(l); .map(ModalTrans::comment)
if (!noResponseList) { .peek(commentModel -> commentModel.setRespComment(this.retrievePageByPid(commentModel.getId())))
model.setRespComment(this.retrievePageByPid(model.getId())); .collect(Collectors.toList());
} return new PageData<>(p, modelList);
modelList.add(model);
});
return new PageData<CommentModel>(p, modelList);
} }
} }

View File

@@ -3,18 +3,29 @@ package cn.celess.blog.service.serviceimpl;
import cn.celess.blog.enmu.ResponseEnum; import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.PartnerSite; import cn.celess.blog.entity.PartnerSite;
import cn.celess.blog.entity.model.PageData; 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.entity.request.LinkReq;
import cn.celess.blog.exception.MyException; import cn.celess.blog.exception.MyException;
import cn.celess.blog.mapper.PartnerMapper; import cn.celess.blog.mapper.PartnerMapper;
import cn.celess.blog.service.MailService;
import cn.celess.blog.service.PartnerSiteService; 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 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.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import lombok.SneakyThrows;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
/** /**
* @author : xiaohai * @author : xiaohai
@@ -24,6 +35,13 @@ import java.util.List;
public class PartnerSiteServiceImpl implements PartnerSiteService { public class PartnerSiteServiceImpl implements PartnerSiteService {
@Autowired @Autowired
PartnerMapper partnerMapper; 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 @Override
public PartnerSite create(LinkReq reqBody) { public PartnerSite create(LinkReq reqBody) {
@@ -52,6 +70,12 @@ public class PartnerSiteServiceImpl implements PartnerSiteService {
reqBody.setUrl("http://" + reqBody.getUrl()); reqBody.setUrl("http://" + reqBody.getUrl());
} }
BeanUtils.copyProperties(reqBody, partnerSite); BeanUtils.copyProperties(reqBody, partnerSite);
if (reqBody.getIconPath() == null) {
partnerSite.setIconPath("");
}
if (reqBody.getDesc() == null) {
partnerSite.setDesc("");
}
partnerMapper.insert(partnerSite); partnerMapper.insert(partnerSite);
return partnerSite; return partnerSite;
} }
@@ -80,17 +104,28 @@ public class PartnerSiteServiceImpl implements PartnerSiteService {
if (!reqBody.getUrl().contains("http://") && !reqBody.getUrl().contains("https://")) { if (!reqBody.getUrl().contains("http://") && !reqBody.getUrl().contains("https://")) {
reqBody.setUrl("http://" + reqBody.getUrl()); 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.setName(reqBody.getName());
partnerSite.setUrl(reqBody.getUrl()); partnerSite.setUrl(reqBody.getUrl());
partnerSite.setOpen(reqBody.isOpen()); partnerSite.setOpen(reqBody.isOpen());
partnerMapper.update(partnerSite);
return partnerSite; return partnerSite;
} }
@Override @Override
public PageData<PartnerSite> partnerSitePages(int page, int count) { public PageData<PartnerSite> partnerSitePages(int page, int count, Boolean deleted) {
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
List<PartnerSite> sitePage = partnerMapper.findAll(); List<PartnerSite> sitePage = partnerMapper.findAll(deleted);
PageInfo<PartnerSite> pageInfo = new PageInfo<PartnerSite>(sitePage); PageInfo<PartnerSite> pageInfo = new PageInfo<PartnerSite>(sitePage);
return new PageData<>(pageInfo, sitePage); return new PageData<>(pageInfo, sitePage);
} }
@@ -102,5 +137,92 @@ public class PartnerSiteServiceImpl implements PartnerSiteService {
return all; 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,6 +21,7 @@ import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
* @author : xiaohai * @author : xiaohai
@@ -81,20 +82,22 @@ public class TagServiceImpl implements TagService {
List<Tag> tagList = tagMapper.findAll(); List<Tag> tagList = tagMapper.findAll();
List<TagModel> modelList = new ArrayList<>(); List<TagModel> modelList = new ArrayList<>();
tagList.forEach(tag -> modelList.add(ModalTrans.tag(tag))); tagList.forEach(tag -> modelList.add(ModalTrans.tag(tag)));
return new PageData<TagModel>(new PageInfo<Tag>(tagList), modelList); return new PageData<>(new PageInfo<>(tagList), modelList);
} }
@Override @Override
public List<TagModel> findAll() { public List<TagModel> findAll() {
List<TagModel> list = new ArrayList<>(); return tagMapper.findAll().stream()
tagMapper.findAll().forEach(e -> { .map(ModalTrans::tag)
TagModel model = ModalTrans.tag(e); .peek(tagModel -> {
List<ArticleTag> articleByTagAndOpen = articleTagMapper.findArticleByTagAndOpen(e.getId()); List<ArticleTag> articleByTagAndOpen = articleTagMapper.findArticleByTagAndOpen(tagModel.getId());
List<ArticleModel> articleModelList = new ArrayList<>(); tagModel.setArticles(
articleByTagAndOpen.forEach(articleTag -> articleModelList.add(ModalTrans.article(articleTag.getArticle(), true))); articleByTagAndOpen
model.setArticles(articleModelList); .stream()
list.add(model); .map(articleTag -> ModalTrans.article(articleTag.getArticle(), true))
}); .collect(Collectors.toList())
return list; );
})
.collect(Collectors.toList());
} }
} }

View File

@@ -2,6 +2,7 @@ package cn.celess.blog.service.serviceimpl;
import cn.celess.blog.enmu.ResponseEnum; import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.enmu.RoleEnum; import cn.celess.blog.enmu.RoleEnum;
import cn.celess.blog.enmu.UserAccountStatusEnum;
import cn.celess.blog.entity.Response; import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.User; import cn.celess.blog.entity.User;
import cn.celess.blog.entity.model.PageData; import cn.celess.blog.entity.model.PageData;
@@ -17,8 +18,6 @@ import cn.celess.blog.service.UserService;
import cn.celess.blog.util.*; import cn.celess.blog.util.*;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -28,10 +27,9 @@ import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.beans.Transient; import java.beans.Transient;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/** /**
* @author : xiaohai * @author : xiaohai
@@ -102,6 +100,16 @@ public class UserServiceImpl implements UserService {
if (!RegexUtil.pwdMatch(loginReq.getPassword())) { if (!RegexUtil.pwdMatch(loginReq.getPassword())) {
throw new MyException(ResponseEnum.PARAMETERS_PWD_ERROR); 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缓存中登录失败次数 //获取redis缓存中登录失败次数
String s = redisUtil.get(loginReq.getEmail() + "-passwordWrongTime"); String s = redisUtil.get(loginReq.getEmail() + "-passwordWrongTime");
if (s != null) { if (s != null) {
@@ -109,14 +117,9 @@ public class UserServiceImpl implements UserService {
throw new MyException(ResponseEnum.LOGIN_LATER, loginReq.getEmail()); throw new MyException(ResponseEnum.LOGIN_LATER, loginReq.getEmail());
} }
} }
User user = null;
user = userMapper.findByEmail(loginReq.getEmail()); String token;
String token = null;
// 密码比对 // 密码比对
if (user == null) {
// 用户不存在
throw new MyException(ResponseEnum.USER_NOT_EXIST);
}
if (user.getPwd().equals(MD5Util.getMD5(loginReq.getPassword()))) { if (user.getPwd().equals(MD5Util.getMD5(loginReq.getPassword()))) {
logger.info("====> {} 进行权限认证 状态:登录成功 <====", loginReq.getEmail()); logger.info("====> {} 进行权限认证 状态:登录成功 <====", loginReq.getEmail());
userMapper.updateLoginTime(loginReq.getEmail()); userMapper.updateLoginTime(loginReq.getEmail());
@@ -312,14 +315,14 @@ public class UserServiceImpl implements UserService {
@Override @Override
public Object deleteUser(Integer[] id) { public Object deleteUser(Integer[] id) {
JSONArray status = new JSONArray(); List<Map<String, Object>> status = new ArrayList<>();
if (id == null || id.length == 0) { if (id == null || id.length == 0) {
return null; return null;
} }
for (Integer integer : id) { for (Integer integer : id) {
String role = userMapper.getRoleById(integer); String role = userMapper.getRoleById(integer);
int deleteResult = 0; int deleteResult = 0;
JSONObject deleteStatus = new JSONObject(); Map<String, Object> deleteStatus = new HashMap<>(3);
deleteStatus.put("id", integer); deleteStatus.put("id", integer);
// 管理员账户不可删 // 管理员账户不可删
if ("admin".equals(role)) { if ("admin".equals(role)) {
@@ -342,12 +345,11 @@ public class UserServiceImpl implements UserService {
} }
@Override @Override
public PageData<UserModel> getUserList(Integer page, Integer count) { public PageData<UserModel> getUserList(Integer page, Integer count, Integer status) {
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
List<User> all = userMapper.findAll(); List<User> all = userMapper.findAll(status);
List<UserModel> modelList = new ArrayList<>(); List<UserModel> modelList = all.stream().map(ModalTrans::userFullInfo).collect(Collectors.toList());
all.forEach(user -> modelList.add(ModalTrans.userFullInfo(user))); return new PageData<>(PageInfo.of(all), modelList);
return new PageData<UserModel>(PageInfo.of(all), modelList);
} }
@Override @Override

View File

@@ -7,6 +7,7 @@ import cn.celess.blog.entity.model.VisitorModel;
import cn.celess.blog.exception.MyException; import cn.celess.blog.exception.MyException;
import cn.celess.blog.mapper.VisitorMapper; import cn.celess.blog.mapper.VisitorMapper;
import cn.celess.blog.service.VisitorService; import cn.celess.blog.service.VisitorService;
import cn.celess.blog.util.AddressUtil;
import cn.celess.blog.util.DateFormatUtil; import cn.celess.blog.util.DateFormatUtil;
import cn.celess.blog.util.RedisUtil; import cn.celess.blog.util.RedisUtil;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
@@ -15,7 +16,6 @@ import eu.bitwalker.useragentutils.Browser;
import eu.bitwalker.useragentutils.OperatingSystem; import eu.bitwalker.useragentutils.OperatingSystem;
import eu.bitwalker.useragentutils.UserAgent; import eu.bitwalker.useragentutils.UserAgent;
import eu.bitwalker.useragentutils.Version; import eu.bitwalker.useragentutils.Version;
import org.apache.commons.lang.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.json.JsonParserFactory; import org.springframework.boot.json.JsonParserFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -26,6 +26,8 @@ import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.URL; import java.net.URL;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@@ -49,7 +51,7 @@ public class VisitorServiceImpl implements VisitorService {
public PageData<VisitorModel> visitorPage(int page, int count, boolean showLocation) { public PageData<VisitorModel> visitorPage(int page, int count, boolean showLocation) {
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
List<Visitor> visitorList = visitorMapper.findAll(); List<Visitor> visitorList = visitorMapper.findAll();
return new PageData<VisitorModel>(new PageInfo<Visitor>(visitorList), list2List(visitorList, showLocation)); return new PageData<>(new PageInfo<>(visitorList), list2List(visitorList, showLocation));
} }
@Override @Override
@@ -67,8 +69,9 @@ public class VisitorServiceImpl implements VisitorService {
visitor.setUa(request.getHeader("User-Agent")); visitor.setUa(request.getHeader("User-Agent"));
//记录当日的访问 //记录当日的访问
String dayVisitCount = redisUtil.get("dayVisitCount"); 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) { if (dayVisitCount == null) {
redisUtil.setEx("dayVisitCount", "1", secondsLeftToday, TimeUnit.SECONDS); redisUtil.setEx("dayVisitCount", "1", secondsLeftToday, TimeUnit.SECONDS);
} else { } else {
@@ -149,60 +152,7 @@ public class VisitorServiceImpl implements VisitorService {
* @return * @return
*/ */
private String getLocation(String ip) { private String getLocation(String ip) {
StringBuilder result = new StringBuilder(); return AddressUtil.getCityInfo(ip);
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();
} }

View File

@@ -10,20 +10,19 @@ import cn.celess.blog.service.WebUpdateInfoService;
import cn.celess.blog.util.DateFormatUtil; import cn.celess.blog.util.DateFormatUtil;
import cn.celess.blog.util.HttpUtil; import cn.celess.blog.util.HttpUtil;
import cn.celess.blog.util.ModalTrans; 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.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.IOException; import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Instant; import java.time.Instant;
import java.util.ArrayList; import java.util.*;
import java.util.Date; import java.util.stream.Collectors;
import java.util.List;
/** /**
* @author : xiaohai * @author : xiaohai
@@ -74,7 +73,7 @@ public class WebUpdateInfoServiceImpl implements WebUpdateInfoService {
public PageData<WebUpdateModel> pages(int count, int page) { public PageData<WebUpdateModel> pages(int count, int page) {
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
List<WebUpdate> updateList = webUpdateInfoMapper.findAll(); List<WebUpdate> updateList = webUpdateInfoMapper.findAll();
return new PageData<WebUpdateModel>(new PageInfo<WebUpdate>(updateList), list2List(updateList)); return new PageData<>(new PageInfo<>(updateList), list2List(updateList));
} }
@Override @Override
@@ -84,29 +83,32 @@ public class WebUpdateInfoServiceImpl implements WebUpdateInfoService {
} }
@Override @Override
public JSONObject getLastestUpdateTime() {
JSONObject jsonObject = new JSONObject(); public Map<String, Object> getLastestUpdateTime() {
jsonObject.put("lastUpdateTime", DateFormatUtil.get(webUpdateInfoMapper.getLastestOne().getUpdateTime())); Map<String, Object> map = new HashMap<>();
jsonObject.put("lastUpdateInfo", webUpdateInfoMapper.getLastestOne().getUpdateInfo()); map.put("lastUpdateTime", DateFormatUtil.get(webUpdateInfoMapper.getLastestOne().getUpdateTime()));
map.put("lastUpdateInfo", webUpdateInfoMapper.getLastestOne().getUpdateInfo());
try { try {
JSONArray array = JSONArray.fromObject(HttpUtil.get("https://api.github.com/repos/xiaohai2271/blog-frontEnd/commits?page=1&per_page=1")); ObjectMapper mapper = new ObjectMapper();
JSONObject object = array.getJSONObject(0); String respStr = HttpUtil.get("https://api.github.com/repos/xiaohai2271/blog-frontEnd/commits?page=1&per_page=1");
JSONObject commit = object.getJSONObject("commit"); if (!StringUtils.isEmpty(respStr)) {
jsonObject.put("lastCommit", commit.getString("message")); JsonNode root = mapper.readTree(respStr);
jsonObject.put("committerAuthor", commit.getJSONObject("committer").getString("name")); Iterator<JsonNode> elements = root.elements();
SimpleDateFormat sdf = new SimpleDateFormat(); JsonNode next = elements.next();
Instant parse = Instant.parse(commit.getJSONObject("committer").getString("date")); JsonNode commit = next.get("commit");
jsonObject.put("committerDate", DateFormatUtil.get(Date.from(parse))); map.put("lastCommit", commit.get("message"));
jsonObject.put("commitUrl", "https://github.com/xiaohai2271/blog-frontEnd/tree/" + object.getString("sha")); 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) { } catch (IOException e) {
log.info("网络请求失败{}", e.getMessage()); log.info("网络请求失败{}", e.getMessage());
} }
return jsonObject; return map;
} }
private List<WebUpdateModel> list2List(List<WebUpdate> webUpdates) { private List<WebUpdateModel> list2List(List<WebUpdate> webUpdates) {
List<WebUpdateModel> webUpdateModels = new ArrayList<>(); return webUpdates.stream().map(ModalTrans::webUpdate).collect(Collectors.toList());
webUpdates.forEach(update -> webUpdateModels.add(ModalTrans.webUpdate(update)));
return webUpdateModels;
} }
} }

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

@@ -1,12 +1,15 @@
package cn.celess.blog.util; package cn.celess.blog.util;
import java.io.BufferedReader; 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.io.IOException;
import java.io.InputStream; import java.util.Objects;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
/** /**
* @Author: 小海 * @Author: 小海
@@ -14,38 +17,34 @@ import java.nio.charset.StandardCharsets;
* @Desc: * @Desc:
*/ */
public class HttpUtil { public class HttpUtil {
private static final OkHttpClient CLIENT = new OkHttpClient();
public static String get(String urlStr) throws IOException { public static String get(String urlStr) {
Request request = new Request.Builder()
StringBuffer sb = new StringBuffer(); .url(urlStr)
.get()
HttpURLConnection urlConnection = null; .build();
try { try (Response response = CLIENT.newCall(request).execute()) {
URL url = new URL(urlStr); return Objects.requireNonNull(response.body()).string();
} catch (IOException e) {
//打开http return null;
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setDoInput(true);
urlConnection.setRequestMethod("GET");
urlConnection.connect();
try (
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);
} }
} }
} finally {
//断开连接
if (urlConnection != null) { public static String getAfterRendering(String url) {
urlConnection.disconnect(); 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;
} }
} }
return sb.toString();
}
} }

View File

@@ -30,6 +30,8 @@ public class JwtUtil {
*/ */
public static final long EXPIRATION_SHORT_TIME = 7200000; public static final long EXPIRATION_SHORT_TIME = 7200000;
private static final String CLAIM_KEY_USERNAME = "sub"; 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 秘钥需自行设置不可泄露 * JWT 秘钥需自行设置不可泄露
*/ */
@@ -48,7 +50,7 @@ public class JwtUtil {
} }
public String updateTokenDate(String token) { 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() return Jwts.builder()
.setClaims(claims) .setClaims(claims)
.setExpiration(new Date(claims.getExpiration().getTime() + EXPIRATION_SHORT_TIME)) .setExpiration(new Date(claims.getExpiration().getTime() + EXPIRATION_SHORT_TIME))
@@ -60,7 +62,7 @@ public class JwtUtil {
* 获取token是否过期 * 获取token是否过期
*/ */
public Boolean isTokenExpired(String token) { public Boolean isTokenExpired(String token) {
Date expiration = getExpirationDateFromToken(token); Date expiration = getExpirationDateFromToken(getJwtString(token));
return expiration == null || expiration.before(new Date()); return expiration == null || expiration.before(new Date());
} }
@@ -68,7 +70,7 @@ public class JwtUtil {
* 根据token获取username * 根据token获取username
*/ */
public String getUsernameFromToken(String token) { public String getUsernameFromToken(String token) {
Claims claims = getClaimsFromToken(token); Claims claims = getClaimsFromToken(getJwtString(token));
return claims == null ? null : claims.getSubject(); return claims == null ? null : claims.getSubject();
} }
@@ -76,7 +78,7 @@ public class JwtUtil {
* 获取token的过期时间 * 获取token的过期时间
*/ */
public Date getExpirationDateFromToken(String token) { public Date getExpirationDateFromToken(String token) {
Claims claims = getClaimsFromToken(token); Claims claims = getClaimsFromToken(getJwtString(token));
return claims == null ? null : claims.getExpiration(); return claims == null ? null : claims.getExpiration();
} }
@@ -88,7 +90,7 @@ public class JwtUtil {
try { try {
claims = Jwts.parser() claims = Jwts.parser()
.setSigningKey(SECRET) .setSigningKey(SECRET)
.parseClaimsJws(token) .parseClaimsJws(getJwtString(token))
.getBody(); .getBody();
} catch (ExpiredJwtException e) { } catch (ExpiredJwtException e) {
log.info("JWT令牌过期"); log.info("JWT令牌过期");
@@ -107,4 +109,9 @@ public class JwtUtil {
return claims; return claims;
} }
private String getJwtString(String token) {
if (token == null) return token;
return token.replaceFirst(BEARER_PREFIX_UPPER, "").replace(BEARER_PREFIX_LOWER, "");
}
} }

View File

@@ -1,5 +1,6 @@
package cn.celess.blog.util; package cn.celess.blog.util;
import cn.celess.blog.enmu.UserAccountStatusEnum;
import cn.celess.blog.entity.*; import cn.celess.blog.entity.*;
import cn.celess.blog.entity.model.*; import cn.celess.blog.entity.model.*;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
@@ -46,6 +47,7 @@ public class ModalTrans {
} }
UserModel userModel = new UserModel(); UserModel userModel = new UserModel();
BeanUtils.copyProperties(user, userModel); BeanUtils.copyProperties(user, userModel);
userModel.setStatus(UserAccountStatusEnum.get(user.getStatus()));
userModel.setAvatarImgUrl(user.getAvatarImgUrl() == null || user.getAvatarImgUrl().length() == 0 ? userModel.setAvatarImgUrl(user.getAvatarImgUrl() == null || user.getAvatarImgUrl().length() == 0 ?
null : null :
"http://cdn.celess.cn/" + user.getAvatarImgUrl()); "http://cdn.celess.cn/" + user.getAvatarImgUrl());

View File

@@ -3,7 +3,8 @@ package cn.celess.blog.util;
import cn.celess.blog.enmu.ResponseEnum; import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.User; import cn.celess.blog.entity.User;
import cn.celess.blog.exception.MyException; import cn.celess.blog.exception.MyException;
import net.sf.json.JSONObject; import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -31,24 +32,27 @@ public class RedisUserUtil {
return user; return user;
} }
@SneakyThrows
public User getWithOutExc() { public User getWithOutExc() {
String token = request.getHeader("Authorization"); String token = request.getHeader("Authorization");
if (token == null || token.isEmpty()) { if (token == null || token.isEmpty()) {
return null; return null;
} }
String email = jwtUtil.getUsernameFromToken(token); String email = jwtUtil.getUsernameFromToken(token);
return (User) JSONObject.toBean(JSONObject.fromObject(redisUtil.get(email + "-login")), User.class); return new ObjectMapper().readValue(redisUtil.get(email + "-login"), User.class);
} }
@SneakyThrows
public User set(User user) { public User set(User user) {
Long expire = redisUtil.getExpire(user.getEmail() + "-login"); Long expire = redisUtil.getExpire(user.getEmail() + "-login");
redisUtil.setEx(user.getEmail() + "-login", JSONObject.fromObject(user).toString(), redisUtil.setEx(user.getEmail() + "-login", new ObjectMapper().writeValueAsString(user),
expire > 0 ? expire : JwtUtil.EXPIRATION_SHORT_TIME, TimeUnit.MILLISECONDS); expire > 0 ? expire : JwtUtil.EXPIRATION_SHORT_TIME, TimeUnit.MILLISECONDS);
return user; return user;
} }
@SneakyThrows
public User set(User user, boolean isRemember) { public User set(User user, boolean isRemember) {
redisUtil.setEx(user.getEmail() + "-login", JSONObject.fromObject(user).toString(), redisUtil.setEx(user.getEmail() + "-login", new ObjectMapper().writeValueAsString(user),
isRemember ? JwtUtil.EXPIRATION_LONG_TIME : JwtUtil.EXPIRATION_SHORT_TIME, TimeUnit.MILLISECONDS); isRemember ? JwtUtil.EXPIRATION_LONG_TIME : JwtUtil.EXPIRATION_SHORT_TIME, TimeUnit.MILLISECONDS);
request.getSession().setAttribute("email", user.getEmail()); request.getSession().setAttribute("email", user.getEmail());
return user; return user;

View File

@@ -24,6 +24,7 @@ import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
/** /**
* @Author: 小海 * @Author: 小海
@@ -99,7 +100,7 @@ public class SitemapGenerateUtil {
urlList.put("https://www.celess.cn", DateFormatUtil.getForXmlDate(new Date())); urlList.put("https://www.celess.cn", DateFormatUtil.getForXmlDate(new Date()));
urlList.put("https://www.celess.cn/links", DateFormatUtil.getForXmlDate(new Date())); urlList.put("https://www.celess.cn/links", DateFormatUtil.getForXmlDate(new Date()));
urlList.put("https://www.celess.cn/leaveMsg", DateFormatUtil.getForXmlDate(new Date())); urlList.put("https://www.celess.cn/leaveMsg", DateFormatUtil.getForXmlDate(new Date()));
List<Article> articles = articleMapper.findAll(); List<Article> articles = articleMapper.findAll().stream().filter(article -> article.getOpen()&&!article.isDeleted()).collect(Collectors.toList());
articles.forEach(article -> { articles.forEach(article -> {
urlList.put("https://www.celess.cn/article/" + article.getId(), DateFormatUtil.getForXmlDate( urlList.put("https://www.celess.cn/article/" + article.getId(), DateFormatUtil.getForXmlDate(
article.getUpdateDate() == null ? article.getPublishDate() : article.getUpdateDate())); article.getUpdateDate() == null ? article.getPublishDate() : article.getUpdateDate()));

View File

@@ -0,0 +1,2 @@
org.springframework.boot.env.EnvironmentPostProcessor=cn.celess.blog.configuration.CommonEnvPostProcessor
org.springframework.context.ApplicationListener=cn.celess.blog.configuration.CommonEnvPostProcessor

View File

@@ -1,31 +1,37 @@
server.port=8081 server.port=8081
# 七牛的密钥配置 # ???????
qiniu.accessKey= qiniu.accessKey=
qiniu.secretKey= qiniu.secretKey=
qiniu.bucket= qiniu.bucket=
# sitemap 存放地址 # sitemap ????
sitemap.path= sitemap.path=
# 生成JWT时候的密钥 # ??JWT?????
jwt.secret= jwt.secret=
spring.jpa.show-sql=false spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=update spring.jpa.hibernate.ddl-auto=update
# 上传单个文件的大小 # ?????????
spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-file-size=10MB
# 上传文件的总大小 # ????????
spring.servlet.multipart.max-request-size=10MB spring.servlet.multipart.max-request-size=10MB
##null字段不显示 ##null?????
spring.jackson.default-property-inclusion=non_null spring.jackson.default-property-inclusion=non_null
################# 数据库 ################## ################# ??? ##################
#请先填写下面的配置 #?????????
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url= spring.datasource.url=
spring.datasource.username= spring.datasource.username=
spring.datasource.password= spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.platform=mysql
# never / always / embedded
spring.datasource.initialization-mode=never
spring.datasource.sql-script-encoding=utf-8
spring.datasource.schema=classpath:sql/schema.sql
spring.datasource.data=classpath:sql/data.sql
################## mybatis ################## ################## mybatis ##################
@@ -42,7 +48,7 @@ pagehelper.params=count=countSql
################ email ############## ################ email ##############
#请先填写下面的配置,不然可能运行不起来 #???????????????????
spring.mail.host= spring.mail.host=
spring.mail.username= spring.mail.username=
spring.mail.password= spring.mail.password=
@@ -56,7 +62,7 @@ spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFact
spring.mail.properties.mail.smtp.socketFactory.fallback=false spring.mail.properties.mail.smtp.socketFactory.fallback=false
#### 用于nginx的代理 获取真实ip #### ??nginx??? ????ip
server.use-forward-headers = true server.use-forward-headers = true
server.tomcat.remote-ip-header = X-Real-IP server.tomcat.remote-ip-header = X-Real-IP
server.tomcat.protocol-header = X-Forwarded-Proto server.tomcat.protocol-header = X-Forwarded-Proto
@@ -64,21 +70,21 @@ server.tomcat.protocol-header = X-Forwarded-Proto
############### redis ############## ############### redis ##############
# REDIS (RedisProperties) # REDIS (RedisProperties)
# Redis数据库索引默认为0 # Redis?????????0?
spring.redis.database=0 spring.redis.database=0
# Redis服务器地址 # Redis?????
spring.redis.host= spring.redis.host=
# Redis服务器连接端口 # Redis???????
spring.redis.port=6379 spring.redis.port=6379
# Redis服务器连接密码(默认为空) # Redis?????????????
spring.redis.password= spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制) # ????????????????????
spring.redis.jedis.pool.max-active=-1 spring.redis.jedis.pool.max-active=-1
# 连接池最大阻塞等待时间(使用负值表示没有限制) # ???????????????????????
spring.redis.jedis.pool.max-wait=-1 spring.redis.jedis.pool.max-wait=-1
# 连接池中的最大空闲连接 # ???????????
spring.redis.jedis.pool.max-idle=8 spring.redis.jedis.pool.max-idle=8
# 连接池中的最小空闲连接 # ???????????
spring.redis.jedis.pool.min-idle=0 spring.redis.jedis.pool.min-idle=0
# 连接超时时间(毫秒) # ??????????
spring.redis.timeout=5000 spring.redis.timeout=5000

View File

@@ -0,0 +1,95 @@
server.port=8081
# ???????
qiniu.accessKey=
qiniu.secretKey=
qiniu.bucket=
# sitemap ????
sitemap.path=
# ??JWT?????
jwt.secret=sdaniod213k123123ipoeqowekqwe
##spring.jpa.show-sql=false
##spring.jpa.hibernate.ddl-auto=update
mybatis.type-handlers-package=cn.celess.blog.mapper.typehandler
logging.level.cn.celess.blog.mapper=debug
# ?????????
spring.servlet.multipart.max-file-size=10MB
# ????????
spring.servlet.multipart.max-request-size=10MB
spring.jackson.default-property-inclusion=non_null
################# ??? ##################
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#h2
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:testdb;mode=mysql;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.platform=h2
spring.datasource.sql-script-encoding=utf-8
spring.datasource.initialization-mode=ALWAYS
spring.datasource.schema=classpath:sql/schema_h2.sql
spring.datasource.data=classpath:sql/data.sql
################## mybatis ##################
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=cn.celess.blog.entity
pagehelper.helper-dialect=mysql
pagehelper.reasonable=true
pagehelper.support-methods-arguments=true
pagehelper.params=count=countSql
#### ??nginx??? ????ip
server.use-forward-headers = true
server.tomcat.remote-ip-header = X-Real-IP
server.tomcat.protocol-header = X-Forwarded-Proto
############### email ##############
spring.mail.host=smtp.163.com
spring.mail.username=
spring.mail.password=
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.default-encoding=UTF-8
spring.mail.port=465
spring.mail.properties.mail.smtp.socketFactory.port=465
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.smtp.socketFactory.fallback=false
############### redis ##############
# REDIS (RedisProperties)
# Redis?????????0?
spring.redis.database=1
# Redis?????
spring.redis.host=127.0.0.1
# Redis??????? ?????? ???????redis
spring.redis.port=6380
# Redis?????????????
spring.redis.password=
# ????????????????????
spring.redis.jedis.pool.max-active=-1
# ???????????????????????
spring.redis.jedis.pool.max-wait=-1
# ???????????
spring.redis.jedis.pool.max-idle=8
# ???????????
spring.redis.jedis.pool.min-idle=0
# ??????????
spring.redis.timeout=5000

View File

@@ -1,7 +1,7 @@
spring.profiles.active=prod spring.profiles.active=dev
####七牛的配置 #### ?????
####cn.celess.blog.service.serviceimpl.QiniuServiceImpl ####cn.celess.blog.service.serviceimpl.QiniuServiceImpl
logging.level.cn.celess.blog=debug logging.level.cn.celess.blog=debug
logging.level.cn.celess.blog.mapper=info logging.level.cn.celess.blog.mapper=info
## 修改openSource 添加-test 文件用于测试 -prod文件用于线上发布 ## ??openSource ??-test ?????? -prod????????

Binary file not shown.

View File

@@ -64,6 +64,14 @@
and article_tag.t_id = tag_category.t_id and article_tag.t_id = tag_category.t_id
</select> </select>
<select id="findTagByArticleId" resultMap="cn.celess.blog.mapper.TagMapper.tagResultMap">
select tag_category.*
from article_tag,
tag_category
where a_id = #{articleId}
and article_tag.t_id = tag_category.t_id
</select>
<select id="findOneById" resultMap="articleTagResultMap"> <select id="findOneById" resultMap="articleTagResultMap">
select * select *
from article_tag, from article_tag,

View File

@@ -37,8 +37,8 @@
<insert id="insert" useGeneratedKeys="true" keyProperty="id"> <insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into comment (co_page_path, co_content, co_date, co_pid, co_from_author_id, co_to_author_id, is_delete) insert into comment (co_page_path, co_content, co_date, co_pid, co_from_author_id, co_to_author_id, co_status)
VALUES (#{pagePath}, #{content}, now(), #{pid}, #{fromUser.id}, #{toUser.id}, false) VALUES (#{pagePath}, #{content}, now(), #{pid}, #{fromUser.id}, #{toUser.id}, 0)
</insert> </insert>
<update id="updateContent"> <update id="updateContent">
@@ -84,7 +84,6 @@
<select id="findAllByPagePath" resultMap="commentViewResultMap" parameterType="string"> <select id="findAllByPagePath" resultMap="commentViewResultMap" parameterType="string">
select * select *
from commentView from commentView
# 无奈之举
<if test="toString() != null "> <if test="toString() != null ">
where pagePath = #{pagePath} where pagePath = #{pagePath}
</if> </if>

View File

@@ -9,20 +9,26 @@
<result column="l_icon_path" property="iconPath"/> <result column="l_icon_path" property="iconPath"/>
<result column="l_desc" property="desc"/> <result column="l_desc" property="desc"/>
<result column="is_delete" property="delete"/> <result column="is_delete" property="delete"/>
<result column="l_email" property="email"/>
<result column="l_notification" property="notification"/>
</resultMap> </resultMap>
<insert id="insert" parameterType="cn.celess.blog.entity.PartnerSite" useGeneratedKeys="true" keyProperty="id"> <insert id="insert" parameterType="cn.celess.blog.entity.PartnerSite" useGeneratedKeys="true" keyProperty="id">
insert into links (l_name, l_is_open, l_url, l_icon_path, l_desc, is_delete) insert into links (l_name, l_is_open, l_url, l_icon_path, l_desc, l_email, l_notification, is_delete)
values (#{name}, #{open}, #{url}, #{iconPath}, #{desc}, false) values (#{name}, #{open}, #{url}, #{iconPath}, #{desc}, #{email}, #{notification}, false)
</insert> </insert>
<update id="update" parameterType="cn.celess.blog.entity.PartnerSite"> <update id="update" parameterType="cn.celess.blog.entity.PartnerSite">
update links set update links
<trim prefix="set" suffixOverrides=",">
<if test="open!=null">l_is_open=#{open},</if> <if test="open!=null">l_is_open=#{open},</if>
<if test="iconPath!=null">l_icon_path=#{iconPath},</if> <if test="iconPath!=null">l_icon_path=#{iconPath},</if>
<if test="desc!=null">l_desc=#{desc},</if> <if test="desc!=null">l_desc=#{desc},</if>
<if test="url!=null">l_url=#{url},</if> <if test="url!=null">l_url=#{url},</if>
<if test="name!=null">l_name=#{name}</if> <if test="name!=null">l_name=#{name},</if>
<if test="notification!=null">l_notification=#{notification},</if>
<if test="email!=null">l_email=#{email}</if>
</trim>
where l_id=#{id} where l_id=#{id}
</update> </update>
@@ -72,6 +78,9 @@
<select id="findAll" resultMap="partnerSiteResultMap"> <select id="findAll" resultMap="partnerSiteResultMap">
select * select *
from links from links
<if test="_parameter != null">
where is_delete=#{deleted}
</if>
</select> </select>

View File

@@ -130,5 +130,8 @@
<select id="findAll" resultMap="userResultMap"> <select id="findAll" resultMap="userResultMap">
select * select *
from user from user
<if test="_parameter != null">
where status=#{status}
</if>
</select> </select>
</mapper> </mapper>

View File

@@ -19,8 +19,10 @@
<association property="category" column="a_category_id" javaType="cn.celess.blog.entity.TagCategory" <association property="category" column="a_category_id" javaType="cn.celess.blog.entity.TagCategory"
resultMap="cn.celess.blog.mapper.CategoryMapper.categoryResultMap"> resultMap="cn.celess.blog.mapper.CategoryMapper.categoryResultMap">
</association> </association>
<collection property="tags" ofType="cn.celess.blog.entity.TagCategory" <collection property="tags" ofType="cn.celess.blog.entity.Tag"
resultMap="cn.celess.blog.mapper.CategoryMapper.categoryResultMap"> select="cn.celess.blog.mapper.ArticleTagMapper.findTagByArticleId" column="a_id">
<id column="tagId" property="id"/>
<result column="tagName" property="name"/>
</collection> </collection>
</resultMap> </resultMap>
@@ -49,7 +51,8 @@
<result column="userAvatar" property="avatarImgUrl"/> <result column="userAvatar" property="avatarImgUrl"/>
<result column="userDisplayName" property="displayName"/> <result column="userDisplayName" property="displayName"/>
</association> </association>
<collection property="tags" ofType="cn.celess.blog.entity.Tag"> <collection property="tags" ofType="cn.celess.blog.entity.Tag"
select="cn.celess.blog.mapper.ArticleTagMapper.findTagByArticleId" column="{articleId=articleId}">
<id column="tagId" property="id"/> <id column="tagId" property="id"/>
<result column="tagName" property="name"/> <result column="tagName" property="name"/>
</collection> </collection>
@@ -119,11 +122,37 @@
</select> </select>
<select id="findAllByOpen" resultMap="articleViewResultMap"> <select id="findAllByOpen" resultMap="articleViewResultMap">
select * select article.a_id as articleId,
from articleView article.a_title as title,
where isOpen = #{isOpen} article.a_summary as summary,
and isDelete = false article.a_md_content as mdContent,
order by articleId desc article.a_url as url,
article.a_is_original as isOriginal,
article.a_reading_number as readingCount,
article.a_like as likeCount,
article.a_dislike as dislikeCount,
article.a_publish_date as publishDate,
article.a_update_date as updateDate,
article.a_is_open as isOpen,
category.t_id as categoryId,
category.t_name as categoryName,
user.u_id as authorId,
user.u_email as userEmail,
user.u_avatar as userAvatar,
user.u_display_name as userDisplayName,
article.is_delete as isDelete
from article,
tag_category as category,
article_tag,
user
where article.a_is_open = #{isOpen}
and article.is_delete = false
and article.a_id = article_tag.a_id
and article.a_category_id = category.t_id
and category.is_category = true
and article.a_author_id = user.u_id
group by article.a_id
order by article.a_id desc
</select> </select>
@@ -152,9 +181,35 @@
<select id="findAll" resultMap="articleViewResultMap"> <select id="findAll" resultMap="articleViewResultMap">
select * select article.a_id as articleId,
from articleView article.a_title as title,
where isDelete = false article.a_summary as summary,
article.a_md_content as mdContent,
article.a_url as url,
article.a_is_original as isOriginal,
article.a_reading_number as readingCount,
article.a_like as likeCount,
article.a_dislike as dislikeCount,
article.a_publish_date as publishDate,
article.a_update_date as updateDate,
article.a_is_open as isOpen,
category.t_id as categoryId,
category.t_name as categoryName,
user.u_id as authorId,
user.u_email as userEmail,
user.u_avatar as userAvatar,
user.u_display_name as userDisplayName,
article.is_delete as isDelete
from article,
tag_category as category,
article_tag,
user
where article.a_id = article_tag.a_id
and article.a_category_id = category.t_id
and category.is_category = true
and article.a_author_id = user.u_id
group by article.a_id
order by article.a_id desc
</select> </select>
@@ -169,7 +224,8 @@
from articleView from articleView
where articleId = (select max(articleId) where articleId = (select max(articleId)
from articleView from articleView
where articleId &lt; #{id} where isOpen = true
and articleId &lt; #{id}
) )
</select> </select>
<select id="getNextArticle" resultMap="articleViewResultMap"> <select id="getNextArticle" resultMap="articleViewResultMap">
@@ -177,7 +233,8 @@
from articleView from articleView
where articleId = (select min(articleId) where articleId = (select min(articleId)
from articleView from articleView
where articleId &gt; #{id} where isOpen = true
and articleId &gt; #{id}
) )
</select> </select>

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,38 @@
CREATE DATABASE `t_blog`; drop view if exists articleView;
drop view if exists commentView;
drop table if exists article_tag;
drop table if exists comment;
drop table if exists article;
drop table if exists user;
drop table if exists tag_category;
drop table if exists links;
drop table if exists visitor;
drop table if exists web_update;
USE t_blog;
CREATE TABLE `user`
(
`u_id` int not null primary key auto_increment,
`u_email` varchar(50) not null,
`u_pwd` varchar(40) not null comment '密码',
`u_email_status` boolean default false comment '邮箱验证状态',
`u_avatar` varchar(255) default null comment '用户头像',
`u_desc` tinytext COLLATE utf8mb4_unicode_ci default null comment '用户的描述',
`u_recently_landed_time` datetime default null comment '最近的登录时间',
`u_display_name` varchar(30) COLLATE utf8mb4_unicode_ci default null comment '展示的昵称',
`u_role` varchar(40) not null default 'user' comment '权限组',
`status` tinyint(1) not null default 0 comment '账户状态',
unique key `uni_user_id` (`u_id`),
unique key `uni_user_email` (`u_email`)
) comment '用户表';
CREATE TABLE `tag_category`
(
`t_id` bigint(20) primary key auto_increment,
`t_name` varchar(255) not null,
`is_category` boolean not null default true,
`is_delete` boolean not null default false comment '该数据是否被删除'
) comment '标签和分类表';
CREATE TABLE `article` CREATE TABLE `article`
( (
@@ -14,11 +46,13 @@ CREATE TABLE `article`
`a_reading_number` int default 0 comment '文章阅读数', `a_reading_number` int default 0 comment '文章阅读数',
`a_like` int default 0 comment '文章点赞数', `a_like` int default 0 comment '文章点赞数',
`a_dislike` int default 0 comment '文章不喜欢数', `a_dislike` int default 0 comment '文章不喜欢数',
`a_category_id` int not null comment '文章分类id', `a_category_id` bigint not null comment '文章分类id',
`a_publish_date` datetime default CURRENT_TIMESTAMP comment '文章发布时间', `a_publish_date` datetime default CURRENT_TIMESTAMP comment '文章发布时间',
`a_update_date` datetime default null comment '文章的更新时间', `a_update_date` datetime default null comment '文章的更新时间',
`a_is_open` boolean default true comment '文章是否可见', `a_is_open` boolean default true comment '文章是否可见',
`is_delete` boolean not null default false comment '该数据是否被删除' `is_delete` boolean not null default false comment '该数据是否被删除',
foreign key (a_category_id) references tag_category (t_id),
foreign key (a_author_id) references user (u_id)
) DEFAULT CHARSET = utf8mb4 ) DEFAULT CHARSET = utf8mb4
COLLATE utf8mb4_general_ci,comment '文章表'; COLLATE utf8mb4_general_ci,comment '文章表';
@@ -27,17 +61,10 @@ CREATE TABLE `article_tag`
`at_id` bigint(20) primary key auto_increment, `at_id` bigint(20) primary key auto_increment,
`a_id` bigint(20) not null comment '文章id', `a_id` bigint(20) not null comment '文章id',
`t_id` bigint not null comment 'tag/category 的id', `t_id` bigint not null comment 'tag/category 的id',
`is_delete` boolean not null default false comment '该数据是否被删除' foreign key (a_id) references article (a_id),
foreign key (t_id) references tag_category (t_id)
) comment '文章标签表'; ) comment '文章标签表';
CREATE TABLE `tag_category`
(
`t_id` bigint(20) primary key auto_increment,
`t_name` varchar(255) not null,
`is_category` boolean not null default true,
`is_delete` boolean not null default false comment '该数据是否被删除'
) comment '标签和分类表';
CREATE TABLE `comment` CREATE TABLE `comment`
( (
`co_id` bigint(20) primary key auto_increment, `co_id` bigint(20) primary key auto_increment,
@@ -47,7 +74,9 @@ CREATE TABLE `comment`
`co_status` tinyint not null default 0 comment '评论的状态', `co_status` tinyint not null default 0 comment '评论的状态',
`co_pid` bigint not null default -1 comment '评论/留言的父id', `co_pid` bigint not null default -1 comment '评论/留言的父id',
`co_from_author_id` int not null comment '留言者id', `co_from_author_id` int not null comment '留言者id',
`co_to_author_id` int default null comment '父评论的作者id' `co_to_author_id` int default null comment '父评论的作者id',
foreign key (co_from_author_id) references user (u_id),
foreign key (co_to_author_id) references user (u_id)
) DEFAULT CHARSET = utf8mb4 ) DEFAULT CHARSET = utf8mb4
COLLATE utf8mb4_general_ci,comment '评论/留言表'; COLLATE utf8mb4_general_ci,comment '评论/留言表';
@@ -56,10 +85,12 @@ CREATE TABLE `links`
`l_id` bigint(20) primary key auto_increment, `l_id` bigint(20) primary key auto_increment,
`l_name` varchar(255) COLLATE utf8mb4_unicode_ci not null comment '友站名称', `l_name` varchar(255) COLLATE utf8mb4_unicode_ci not null comment '友站名称',
`l_is_open` boolean default true comment '是否公开', `l_is_open` boolean default true comment '是否公开',
`l_url` varchar(255) not null comment '首页地址', `l_url` varchar(255) unique not null comment '首页地址',
`l_icon_path` varchar(255) not null comment '友链的icon地址', `l_icon_path` varchar(255) not null comment '友链的icon地址',
`l_desc` varchar(255) COLLATE utf8mb4_unicode_ci not null comment '友链的说明描述', `l_desc` varchar(255) COLLATE utf8mb4_unicode_ci not null comment '友链的说明描述',
`is_delete` boolean not null default false comment '该数据是否被删除' `is_delete` boolean not null default false comment '该数据是否被删除',
`l_email` varchar(255) comment '网站管理员的邮箱',
`l_notification` boolean default false comment '是否通知了'
) comment '友站表'; ) comment '友站表';
CREATE TABLE `visitor` CREATE TABLE `visitor`
@@ -79,23 +110,6 @@ CREATE TABLE `web_update`
`is_delete` boolean not null default false comment '该数据是否被删除' `is_delete` boolean not null default false comment '该数据是否被删除'
) comment '更新内容表'; ) comment '更新内容表';
CREATE TABLE `user`
(
`u_id` int not null primary key auto_increment,
`u_email` varchar(50) not null,
`u_pwd` varchar(40) not null comment '密码',
`u_email_status` boolean default false comment '邮箱验证状态',
`u_avatar` varchar(255) default null comment '用户头像',
`u_desc` tinytext COLLATE utf8mb4_unicode_ci default null comment '用户的描述',
`u_recently_landed_time` datetime default null comment '最近的登录时间',
`u_display_name` varchar(30) COLLATE utf8mb4_unicode_ci default null comment '展示的昵称',
`u_role` varchar(40) not null default 'user' comment '权限组',
`status` tinyint(1) not null default 0 comment '账户状态',
unique key `uni_user_id` (`u_id`),
unique key `uni_user_email` (`u_email`)
) comment '用户表';
CREATE VIEW articleView CREATE VIEW articleView
(articleId, title, summary, mdContent, url, isOriginal, readingCount, likeCount, dislikeCount, (articleId, title, summary, mdContent, url, isOriginal, readingCount, likeCount, dislikeCount,
publishDate, updateDate, isOpen, publishDate, updateDate, isOpen,
@@ -139,7 +153,7 @@ where article.a_id = article_tag.a_id
CREATE VIEW commentView CREATE VIEW commentView
(commentId, pagePath, content, date, status, pid, toAuthorId, toAuthorEmail, toAuthorDisplayName, (commentId, pagePath, content, date, status, pid, toAuthorId, toAuthorEmail, toAuthorDisplayName,
toAuthorAvatar, fromAuthorId, fromAuthorEmail, fromAuthorDisplayName, toAuthorAvatar, fromAuthorId, fromAuthorEmail, fromAuthorDisplayName,
fromAuthorAvatar, isDelete) fromAuthorAvatar)
as as
select cuT.co_id as commentId, select cuT.co_id as commentId,
cuT.co_page_path as pagePath, cuT.co_page_path as pagePath,
@@ -154,8 +168,7 @@ select cuT.co_id as commentId,
userFrom.u_id as fromAuthorId, userFrom.u_id as fromAuthorId,
userFrom.u_email as fromAuthorEmail, userFrom.u_email as fromAuthorEmail,
userFrom.u_display_name as fromAuthorDisplayName, userFrom.u_display_name as fromAuthorDisplayName,
userFrom.u_avatar as fromAuthorAvatar, userFrom.u_avatar as fromAuthorAvatar
cuT.is_delete as isDelete
from (select comment.co_id, from (select comment.co_id,
comment.co_page_path, comment.co_page_path,
comment.co_content, comment.co_content,
@@ -166,8 +179,7 @@ from (select comment.co_id,
comment.co_to_author_id, comment.co_to_author_id,
userTo.u_email as toEmail, userTo.u_email as toEmail,
userTo.u_display_name as toDisplayName, userTo.u_display_name as toDisplayName,
userTo.u_avatar as toAvatar, userTo.u_avatar as toAvatar
comment.is_delete
from comment from comment
left join user userTo on (comment.co_to_author_id = userTo.u_id) left join user userTo on (comment.co_to_author_id = userTo.u_id)
) as cuT, ) as cuT,

View File

@@ -0,0 +1,193 @@
drop view if exists articleView;
drop view if exists commentView;
drop table if exists article_tag;
drop table if exists comment;
drop table if exists article;
drop table if exists user;
drop table if exists tag_category;
drop table if exists links;
drop table if exists visitor;
drop table if exists web_update;
-- 用户表
CREATE TABLE `user`
(
`u_id` int not null primary key auto_increment,
`u_email` varchar(50) not null,
`u_pwd` varchar(40) not null comment '密码',
`u_email_status` boolean default false comment '邮箱验证状态',
`u_avatar` varchar(255) default null comment '用户头像',
`u_desc` tinytext default null comment '用户的描述',
`u_recently_landed_time` datetime default null comment '最近的登录时间',
`u_display_name` varchar(30) default null comment '展示的昵称',
`u_role` varchar(40) not null default 'user' comment '权限组',
`status` tinyint(1) not null default 0 comment '账户状态',
unique key `uni_user_id` (`u_id`),
unique key `uni_user_email` (`u_email`)
);
-- 标签和分类表
CREATE TABLE `tag_category`
(
`t_id` bigint(20) primary key auto_increment,
`t_name` varchar(255) not null,
`is_category` boolean not null default true,
`is_delete` boolean not null default false comment '该数据是否被删除'
);
-- 文章表
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_url` tinytext default null comment '转载文章的原文链接',
`a_author_id` int not null comment '作者id',
`a_is_original` boolean default true comment '文章是否原创',
`a_reading_number` int default 0 comment '文章阅读数',
`a_like` int default 0 comment '文章点赞数',
`a_dislike` int default 0 comment '文章不喜欢数',
`a_category_id` bigint not null comment '文章分类id',
`a_publish_date` datetime default CURRENT_TIMESTAMP comment '文章发布时间',
`a_update_date` datetime default null comment '文章的更新时间',
`a_is_open` boolean default true comment '文章是否可见',
`is_delete` boolean not null default false comment '该数据是否被删除',
foreign key (a_category_id) references tag_category (t_id),
foreign key (a_author_id) references user (u_id)
);
-- 文章标签表
CREATE TABLE `article_tag`
(
`at_id` bigint(20) primary key auto_increment,
`a_id` bigint(20) not null comment '文章id',
`t_id` bigint not null comment 'tag/category 的id',
foreign key (a_id) references article (a_id),
foreign key (t_id) references tag_category (t_id)
);
-- 评论/留言表
CREATE TABLE `comment`
(
`co_id` bigint(20) primary key auto_increment,
`co_page_path` varchar(255) not null comment '评论/留言的页面',
`co_content` text not null comment '评论/留言内容',
`co_date` datetime not null comment '评论/留言的日期',
`co_status` tinyint not null default 0 comment '评论的状态',
`co_pid` bigint not null default -1 comment '评论/留言的父id',
`co_from_author_id` int not null comment '留言者id',
`co_to_author_id` int default null comment '父评论的作者id',
foreign key (co_from_author_id) references user (u_id),
foreign key (co_to_author_id) references user (u_id)
);
-- 友站表
CREATE TABLE `links`
(
`l_id` bigint(20) primary key auto_increment,
`l_name` varchar(255) not null comment '友站名称',
`l_is_open` boolean default true comment '是否公开',
`l_url` varchar(255) unique not null comment '首页地址',
`l_icon_path` varchar(255) not null comment '友链的icon地址',
`l_desc` varchar(255) not null comment '友链的说明描述',
`is_delete` boolean not null default false comment '该数据是否被删除',
`l_email` varchar(255) comment '网站管理员的邮箱',
`l_notification` boolean default false 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',
`is_delete` boolean not null default false comment '该数据是否被删除'
);
-- 更新内容表
CREATE TABLE `web_update`
(
`wu_id` int primary key auto_increment,
`wu_info` varchar(255) not null comment '更新内容',
`wu_time` datetime not null comment '更新时间',
`is_delete` boolean not null default false comment '该数据是否被删除'
);
CREATE VIEW articleView
(articleId, title, summary, mdContent, url, isOriginal, readingCount, likeCount, dislikeCount,
publishDate, updateDate, isOpen,
categoryId, categoryName, tagId, tagName,
authorId, userEmail, userAvatar, userDisplayName, isDelete)
as
select article.a_id as articleId,
article.a_title as title,
article.a_summary as summary,
article.a_md_content as mdContent,
article.a_url as url,
article.a_is_original as isOriginal,
article.a_reading_number as readingCount,
article.a_like as likeCount,
article.a_dislike as dislikeCount,
article.a_publish_date as publishDate,
article.a_update_date as updateDate,
article.a_is_open as isOpen,
category.t_id as categoryId,
category.t_name as categoryName,
tag.t_id as tagId,
tag.t_name as tagName,
user.u_id as authorId,
user.u_email as userEmail,
user.u_avatar as userAvatar,
user.u_display_name as userDisplayName,
article.is_delete as isDelete
from article,
tag_category as tag,
tag_category as category,
article_tag,
user
where article.a_id = article_tag.a_id
and article_tag.t_id = tag.t_id
and tag.is_category = false
and article.a_category_id = category.t_id
and category.is_category = true
and article.a_author_id = user.u_id;
CREATE VIEW commentView
(commentId, pagePath, content, date, status, pid, toAuthorId, toAuthorEmail, toAuthorDisplayName,
toAuthorAvatar, fromAuthorId, fromAuthorEmail, fromAuthorDisplayName,
fromAuthorAvatar)
as
select cuT.co_id as commentId,
cuT.co_page_path as pagePath,
cuT.co_content as content,
cuT.co_date as date,
cuT.co_status as status,
cuT.co_pid as pid,
cuT.co_to_author_id as toAuthorId,
cuT.toEmail as toAuthorEmail,
cuT.toDisplayName as toAuthorDisplayName,
cuT.toAvatar as toAuthorAvatar,
userFrom.u_id as fromAuthorId,
userFrom.u_email as fromAuthorEmail,
userFrom.u_display_name as fromAuthorDisplayName,
userFrom.u_avatar as fromAuthorAvatar
from (select comment.co_id,
comment.co_page_path,
comment.co_content,
comment.co_date,
comment.co_status,
comment.co_pid,
comment.co_from_author_id,
comment.co_to_author_id,
userTo.u_email as toEmail,
userTo.u_display_name as toDisplayName,
userTo.u_avatar as toAvatar
from comment
left join user userTo on (comment.co_to_author_id = userTo.u_id)
) as cuT,
user as userFrom
where cuT.co_from_author_id = userFrom.u_id;

View File

@@ -1,30 +1,50 @@
package cn.celess.blog; package cn.celess.blog;
import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.model.QiniuResponse;
import cn.celess.blog.entity.model.UserModel;
import cn.celess.blog.entity.request.LoginReq; import cn.celess.blog.entity.request.LoginReq;
import net.sf.json.JSONObject; import cn.celess.blog.service.MailService;
import cn.celess.blog.service.QiniuService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.qiniu.storage.model.FileInfo;
import lombok.extern.slf4j.Slf4j;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mock.web.MockHttpSession; import org.springframework.mock.web.MockHttpSession;
import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.ResultHandler; import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.WebApplicationContext;
import javax.servlet.http.Cookie; import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.util.Map;
import java.util.UUID; import java.util.UUID;
import static cn.celess.blog.enmu.ResponseEnum.SUCCESS;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
/** /**
* @Author: 小海 * @Author: 小海
@@ -37,9 +57,27 @@ import static org.junit.Assert.*;
@ActiveProfiles("test") @ActiveProfiles("test")
public class BaseTest { public class BaseTest {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
protected MockMvc mockMvc; protected MockMvc mockMvc;
protected final static String Code = "code"; protected final static String Code = "code";
protected final static String Result = "result"; protected final static String Result = "result";
protected final static String USERE_MAIL = "zh56462271@qq.com";
protected final static String ADMIN_EMAIL = "a@celess.cn";
/**
* jackson 序列化/反序列化Json
*/
protected final ObjectMapper mapper = new ObjectMapper();
protected static final TypeReference<?> BOOLEAN_TYPE = new TypeReference<Response<Boolean>>() {
};
protected static final TypeReference<?> STRING_TYPE = new TypeReference<Response<String>>() {
};
protected static final TypeReference<?> OBJECT_TYPE = new TypeReference<Response<Object>>() {
};
protected static final TypeReference<?> MAP_OBJECT_TYPE = new TypeReference<Response<Map<String, Object>>>() {
};
@Autowired @Autowired
private WebApplicationContext wac; private WebApplicationContext wac;
@@ -57,51 +95,253 @@ public class BaseTest {
System.out.println("==========> 测试结束 <========="); System.out.println("==========> 测试结束 <=========");
} }
/**
*  admin 权限用户登录
*
* @return token
*/
protected String adminLogin() { protected String adminLogin() {
try {
LoginReq req = new LoginReq(); LoginReq req = new LoginReq();
req.setEmail("a@celess.cn"); req.setEmail(ADMIN_EMAIL);
req.setPassword("123456789"); req.setPassword("123456789");
req.setIsRememberMe(false); req.setIsRememberMe(true);
JSONObject loginReq = JSONObject.fromObject(req); String token = login(req);
String str = mockMvc.perform(MockMvcRequestBuilders.post("/login").content(loginReq.toString()).contentType("application/json"))
// .andDo(MockMvcResultHandlers.print())
.andReturn().getResponse().getContentAsString();
String token = JSONObject.fromObject(str).getJSONObject(Result).getString("token");
assertNotNull(token); assertNotNull(token);
return token; return token;
} catch (Exception e) {
e.printStackTrace();
return null;
}
} }
/**
* user 权限用户登录
*
* @return token
*/
protected String userLogin() { protected String userLogin() {
try {
LoginReq req = new LoginReq(); LoginReq req = new LoginReq();
req.setEmail("zh56462271@qq.com"); req.setEmail(USERE_MAIL);
req.setPassword("123456789"); req.setPassword("123456789");
req.setIsRememberMe(false); req.setIsRememberMe(true);
JSONObject loginReq = JSONObject.fromObject(req); String token = login(req);
String str = mockMvc.perform(MockMvcRequestBuilders.post("/login").content(loginReq.toString()).contentType("application/json")) assertNotNull(token);
// .andDo(MockMvcResultHandlers.print()) return token;
}
/**
* 登录逻辑
*
* @param req 用户信息
* @return token | null
*/
protected String login(LoginReq req) {
String str = null;
try {
str = getMockData(post("/login"), null, req)
.andReturn().getResponse().getContentAsString(); .andReturn().getResponse().getContentAsString();
String token = JSONObject.fromObject(str).getJSONObject(Result).getString("token"); Response<UserModel> response = mapper.readValue(str, new TypeReference<Response<UserModel>>() {
});
assertEquals(SUCCESS.getCode(), response.getCode());
String token = response.getResult().getToken();
assertNotNull(token); assertNotNull(token);
return token; return token;
} catch (Exception e) { } catch (Exception e) {
logger.error("测试登录错误");
e.printStackTrace(); e.printStackTrace();
return null;
} }
assertNotNull(str);
return null;
} }
@Test @Test
public void test() { public void test() {
// 测试登录
assertNotNull(userLogin());
assertNotNull(adminLogin());
assertNotEquals(userLogin(), adminLogin());
try {
// 测试getMockData方法
assertNotNull(getMockData(get("/headerInfo")));
getMockData((get("/headerInfo"))).andDo(result -> assertNotNull(getResponse(result, OBJECT_TYPE)));
} catch (Exception e) {
e.printStackTrace();
}
} }
/**
* 产生指定长度的随机字符
*
* @param len len
* @return str
*/
protected String randomStr(int len) { protected String randomStr(int len) {
return UUID.randomUUID().toString().replaceAll("-", "").substring(0, len); return UUID.randomUUID().toString().replaceAll("-", "").substring(0, len);
} }
/**
* 产生指定长度的随机字符
*
* @return str
*/
protected String randomStr() {
return UUID.randomUUID().toString();
}
/**
* 抽离的mock请求方法
*
* @param builder MockHttpServletRequestBuilder get(...) post(...) ....
* @return 返回 ResultActions
* @throws Exception exc
*/
protected ResultActions getMockData(MockHttpServletRequestBuilder builder) throws Exception {
return getMockData(builder, null, null);
}
/**
* 抽离的mock请求方法 重载
*
* @param builder ..
* @param token 用户登录的token
* @return ..
* @throws Exception ..
*/
protected ResultActions getMockData(MockHttpServletRequestBuilder builder, String token) throws Exception {
return getMockData(builder, token, null);
}
/**
* 抽离的mock请求方法 重载
*
* @param builder ..
* @param token ..
* @param content http中发送的APPLICATION_JSON的json数据
* @return ..
* @throws Exception ..
*/
protected ResultActions getMockData(MockHttpServletRequestBuilder builder, String token, Object content) throws Exception {
// MockHttpServletRequestBuilder mockHttpServletRequestBuilder = get(url);
if (token != null) {
builder.header("Authorization", "Bearer "+token);
}
if (content != null) {
builder.content(mapper.writeValueAsString(content)).contentType(MediaType.APPLICATION_JSON);
logger.debug("param::json->{}", mapper.writeValueAsString(content));
}
return mockMvc.perform(builder).andExpect(status().isOk());
}
protected <T> Response<T> getResponse(String json) {
return getResponse(json, OBJECT_TYPE);
}
protected <T> Response<T> getResponse(MvcResult result) {
return getResponse(result, OBJECT_TYPE);
}
/**
* 根据json 信息反序列化成Response对象
*
* @param json json
* @param <T> 泛型
* @return Response对象
*/
protected <T> Response<T> getResponse(String json, TypeReference<?> responseType) {
Response<T> response = null;
try {
response = mapper.readValue(json, responseType);
} catch (IOException e) {
logger.error("解析json Response对象错误json:[{}]", json);
e.printStackTrace();
}
assertNotNull(response);
return response;
}
/**
* 根据json 信息反序列化成Response对象
*
* @param result MvcResult
* @param <T> 泛型
* @return Response对象
*/
protected <T> Response<T> getResponse(MvcResult result, TypeReference<?> responseType) {
try {
return getResponse(result.getResponse().getContentAsString(), responseType);
} catch (UnsupportedEncodingException e) {
logger.error("解析json Response对象错误result:[{}]", result);
e.printStackTrace();
}
return null;
}
/**
* 修改 mailService 的实现类
*
* @param service service 类
* @param mailFiledName service 中自动注入的mailService字段名
*/
protected void mockInjectInstance(Object service, String mailFiledName, Object impl) {
Field field;
try {
assertNotNull(service);
field = service.getClass().getDeclaredField(mailFiledName);
field.setAccessible(true);
field.set(service, impl);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
@Slf4j
public static class TestMailServiceImpl implements MailService {
@Override
public Boolean AsyncSend(SimpleMailMessage message) {
log.debug("异步邮件请求,SimpleMailMessage:[{}]", getJson(message));
return true;
}
@Override
public Boolean send(SimpleMailMessage message) {
log.debug("邮件请求,SimpleMailMessage:[{}]", getJson(message));
return true;
}
/**
* 转json
*
* @param o
* @return
*/
private String getJson(Object o) {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.writeValueAsString(o);
} catch (JsonProcessingException e) {
return null;
}
}
}
@Slf4j
public static class TestQiNiuServiceImpl implements QiniuService {
@Override
public QiniuResponse uploadFile(InputStream is, String fileName) {
QiniuResponse response = new QiniuResponse();
log.debug("上传文件请求,[fileName:{}]", fileName);
response.key = "key";
response.bucket = "bucket";
response.hash = "hash";
response.fsize = 1;
return response;
}
@Override
public FileInfo[] getFileList() {
log.debug("获取文件列表请求");
return new FileInfo[0];
}
}
} }

View File

@@ -0,0 +1,37 @@
package cn.celess.blog;
import org.springframework.stereotype.Component;
import redis.embedded.RedisServer;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.io.IOException;
/**
* @author : xiaohai
* @date : 2020/08/14 16:20
*/
@Component
public class RedisServerMock {
private RedisServer redisServer;
/**
* 构造方法之后执行.
*
* @throws IOException e
*/
@PostConstruct
public void startRedis() throws IOException {
redisServer = new RedisServer(6380);
redisServer.start();
}
/**
* 析构方法之后执行.
*/
@PreDestroy
public void stopRedis() {
redisServer.stop();
}
}

View File

@@ -8,28 +8,31 @@ import cn.celess.blog.entity.model.ArticleModel;
import cn.celess.blog.entity.model.PageData; import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.request.ArticleReq; import cn.celess.blog.entity.request.ArticleReq;
import cn.celess.blog.mapper.ArticleMapper; import cn.celess.blog.mapper.ArticleMapper;
import net.sf.json.JSONObject; import com.fasterxml.jackson.core.type.TypeReference;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import java.util.List;
import java.util.*; import static cn.celess.blog.enmu.ResponseEnum.*;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static cn.celess.blog.enmu.ResponseEnum.*;
public class ArticleControllerTest extends BaseTest { public class ArticleControllerTest extends BaseTest {
@Autowired @Autowired
ArticleMapper articleMapper; ArticleMapper articleMapper;
private static final TypeReference<?> ARTICLE_MODEL_TYPE = new TypeReference<Response<ArticleModel>>() {
};
private static final TypeReference<?> ARTICLE_MODEL_PAGE_TYPE = new TypeReference<Response<PageData<ArticleModel>>>() {
};
@Test @Test
public void create() { public void create() {
ArticleReq articleReq = new ArticleReq(); ArticleReq articleReq = new ArticleReq();
// 应该正常通过 // 应该正常通过
articleReq.setTitle("test-" + UUID.randomUUID().toString()); articleReq.setTitle("test-" + randomStr());
articleReq.setMdContent("# test title"); articleReq.setMdContent("# test title");
articleReq.setCategory("随笔"); articleReq.setCategory("随笔");
String[] tagList = {"tag", "category"}; String[] tagList = {"tag", "category"};
@@ -37,43 +40,14 @@ public class ArticleControllerTest extends BaseTest {
articleReq.setOpen(true); articleReq.setOpen(true);
articleReq.setType(true); articleReq.setType(true);
articleReq.setUrl("http://xxxx.com"); articleReq.setUrl("http://xxxx.com");
JSONObject jsonObject = JSONObject.fromObject(articleReq); MockHttpServletRequestBuilder post = post("/admin/article/create");
try { try {
// 未登录 getMockData(post, adminLogin(), articleReq).andDo(result -> {
mockMvc.perform(post("/admin/article/create") Response<ArticleModel> response = getResponse(result, ARTICLE_MODEL_TYPE);
.content(jsonObject.toString()) assertEquals(SUCCESS.getCode(), response.getCode());
.contentType("application/json")) assertNotNull(response.getResult());
.andExpect(status().isOk()) ArticleModel articleModel = response.getResult();
.andDo(result -> {
assertEquals(HAVE_NOT_LOG_IN.getCode(),
JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code)
);
});
// User权限
String token = userLogin();
mockMvc.perform(post("/admin/article/create")
.content(jsonObject.toString())
.contentType("application/json")
.header("Authorization", token))
.andExpect(status().isOk())
.andDo(result -> {
assertEquals(PERMISSION_ERROR.getCode(),
JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code)
);
});
// Admin权限
token = adminLogin();
mockMvc.perform(post("/admin/article/create")
.content(jsonObject.toString())
.contentType("application/json")
.header("Authorization", token))
.andExpect(status().isOk())
.andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(SUCCESS.getCode(), object.getInt(Code));
ArticleModel articleModel = (ArticleModel) JSONObject.toBean(object.getJSONObject(Result), ArticleModel.class);
assertNotNull(articleModel.getId()); assertNotNull(articleModel.getId());
assertNotNull(articleModel.getTitle()); assertNotNull(articleModel.getTitle());
assertNotNull(articleModel.getSummary()); assertNotNull(articleModel.getSummary());
@@ -96,32 +70,21 @@ public class ArticleControllerTest extends BaseTest {
@Test @Test
public void delete() { public void delete() {
Article article = articleMapper.getLastestArticle(); Article article;
do {
article = articleMapper.getLastestArticle();
create();
} while (article.isDeleted());
assertFalse(article.isDeleted());
MockHttpServletRequestBuilder delete = MockMvcRequestBuilders.delete("/admin/article/del?articleID=" + article.getId());
try { try {
// 未登录删除文章 Article finalArticle = article;
mockMvc.perform(MockMvcRequestBuilders.delete("/admin/article/del?articleID=" + article.getId()) getMockData(delete, adminLogin()).andDo(result -> {
).andDo(result -> { Response<Boolean> response = getResponse(result, BOOLEAN_TYPE);
assertEquals(HAVE_NOT_LOG_IN.getCode(), assertEquals(SUCCESS.getCode(), response.getCode());
JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code)
);
});
// user 权限删除文章
String token = userLogin();
mockMvc.perform(MockMvcRequestBuilders.delete("/admin/article/del?articleID=" + article.getId())
.header("Authorization", token))
.andDo(result -> assertEquals(PERMISSION_ERROR.getCode(),
JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code))
);
// admin 权限删除文章
token = adminLogin();
mockMvc.perform(MockMvcRequestBuilders.delete("/admin/article/del?articleID=" + article.getId())
.header("Authorization", token))
.andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(SUCCESS.getCode(), object.getInt(Code));
// 断言删除成功 // 断言删除成功
assertTrue(object.getBoolean(Result)); assertTrue(response.getResult());
assertTrue(articleMapper.isDeletedById(finalArticle.getId()));
}); });
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@@ -144,16 +107,10 @@ public class ArticleControllerTest extends BaseTest {
articleReq.setTags(tagList); articleReq.setTags(tagList);
articleReq.setTitle("test-" + article.getTitle()); articleReq.setTitle("test-" + article.getTitle());
try { try {
// Admin 权限 getMockData(put("/admin/article/update"), adminLogin(), articleReq).andDo(result -> {
mockMvc.perform(put("/admin/article/update") Response<ArticleModel> response = getResponse(result, ARTICLE_MODEL_TYPE);
.content(JSONObject.fromObject(articleReq).toString()) assertEquals(SUCCESS.getCode(), response.getCode());
.contentType("application/json") ArticleModel a = response.getResult();
.header("Authorization", adminLogin()))
.andExpect(status().isOk())
.andDo(result -> {
JSONObject jsonObject = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(SUCCESS.getCode(), jsonObject.getInt(Code));
ArticleModel a = (ArticleModel) JSONObject.toBean(jsonObject.getJSONObject(Result), ArticleModel.class);
assertEquals(articleReq.getCategory(), a.getCategory()); assertEquals(articleReq.getCategory(), a.getCategory());
assertEquals(articleReq.getUrl(), a.getUrl()); assertEquals(articleReq.getUrl(), a.getUrl());
assertEquals(articleReq.getMdContent(), a.getMdContent()); assertEquals(articleReq.getMdContent(), a.getMdContent());
@@ -174,29 +131,21 @@ public class ArticleControllerTest extends BaseTest {
public void retrieveOneById() { public void retrieveOneById() {
try { try {
long articleID = 3; long articleID = 3;
mockMvc.perform(MockMvcRequestBuilders.get("/article/articleID/" + articleID)) getMockData(MockMvcRequestBuilders.get("/article/articleID/" + articleID));
.andExpect(status().is(200)); getMockData(MockMvcRequestBuilders.get("/article/articleID/" + articleID + "?update=true"));
mockMvc.perform(MockMvcRequestBuilders.get("/article/articleID/" + articleID + "?update=true"))
.andExpect(status().is(200));
// 文章不存在 // 文章不存在
mockMvc.perform(MockMvcRequestBuilders.get("/article/articleID/-1")) getMockData(MockMvcRequestBuilders.get("/article/articleID/-1"))
.andExpect(status().is(200)) .andDo(result -> assertEquals(ARTICLE_NOT_EXIST.getCode(), getResponse(result, STRING_TYPE).getCode()));
.andDo(result -> {
JSONObject jsonObject = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(ARTICLE_NOT_EXIST.getCode(), jsonObject.getInt(Code));
});
// 正常情况 // 正常情况
mockMvc.perform(MockMvcRequestBuilders.get("/article/articleID/" + articleID + "?update=false")) getMockData(MockMvcRequestBuilders.get("/article/articleID/" + articleID + "?update=false")).andDo(result -> {
.andExpect(status().is(200)) Response<ArticleModel> response = getResponse(result, ARTICLE_MODEL_TYPE);
.andDo(result -> {
JSONObject articleJson = JSONObject.fromObject(result.getResponse().getContentAsString());
// 断言获取数据成功 // 断言获取数据成功
assertEquals(SUCCESS.getCode(), articleJson.getInt(Code)); assertEquals(SUCCESS.getCode(), response.getCode());
assertNotNull(articleJson.getJSONObject(Result)); assertNotNull(response.getResult());
ArticleModel a = (ArticleModel) JSONObject.toBean(articleJson.getJSONObject(Result), ArticleModel.class); ArticleModel a = response.getResult();
assertNotNull(a.getTitle()); assertNotNull(a.getTitle());
assertNotNull(a.getId()); assertNotNull(a.getId());
assertNotNull(a.getSummary()); assertNotNull(a.getSummary());
@@ -220,27 +169,20 @@ public class ArticleControllerTest extends BaseTest {
public void articles() { public void articles() {
try { try {
// 测试不带参数访问 // 测试不带参数访问
mockMvc.perform(MockMvcRequestBuilders.get("/articles")) getMockData(MockMvcRequestBuilders.get("/articles"));
.andExpect(status().is(200)); getMockData(MockMvcRequestBuilders.get("/articles?page=1&count=5")).andDo(result -> {
Response<PageData<ArticleModel>> response = getResponse(result, ARTICLE_MODEL_PAGE_TYPE);
mockMvc.perform(MockMvcRequestBuilders.get("/articles?page=1&count=5"))
.andExpect(status().is(200))
.andDo(result -> {
JSONObject articlesJSON = JSONObject.fromObject(result.getResponse().getContentAsString());
Response response = (Response) JSONObject.toBean(articlesJSON, Response.class);
// 断言获取数据成功 // 断言获取数据成功
assertEquals(SUCCESS.getCode(), response.getCode()); assertEquals(SUCCESS.getCode(), response.getCode());
// 结果集非空 // 结果集非空
assertNotNull(response.getResult()); assertNotNull(response.getResult());
// 判断pageInfo是否包装完全 // 判断pageInfo是否包装完全
JSONObject resultJson = JSONObject.fromObject(response.getResult()); PageData<ArticleModel> pageData = response.getResult();
PageData<ArticleModel> pageData = (PageData<ArticleModel>) JSONObject.toBean(resultJson, PageData.class);
assertNotEquals(0, pageData.getTotal()); assertNotEquals(0, pageData.getTotal());
assertEquals(1, pageData.getPageNum()); assertEquals(1, pageData.getPageNum());
assertEquals(5, pageData.getPageSize()); assertEquals(5, pageData.getPageSize());
// 内容完整 // 内容完整
for (Object arc : pageData.getList()) { for (ArticleModel a : pageData.getList()) {
ArticleModel a = (ArticleModel) JSONObject.toBean(JSONObject.fromObject(arc), ArticleModel.class);
assertNotNull(a.getTitle()); assertNotNull(a.getTitle());
assertNotNull(a.getId()); assertNotNull(a.getId());
assertNotNull(a.getSummary()); assertNotNull(a.getSummary());
@@ -260,44 +202,29 @@ public class ArticleControllerTest extends BaseTest {
@Test @Test
public void adminArticles() { public void adminArticles() {
String token;
try { try {
// 未登录 getMockData(get("/admin/articles?page=1&count=10")).andExpect(result ->
mockMvc.perform(get("/admin/articles?page=1&count=10")) assertEquals(HAVE_NOT_LOG_IN.getCode(), getResponse(result, STRING_TYPE).getCode())
.andExpect(status().isOk())
.andDo(result -> {
assertEquals(HAVE_NOT_LOG_IN.getCode(),
JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code)
); );
});
// User权限登陆 // User权限登陆
token = userLogin(); getMockData(get("/admin/articles?page=1&count=10"), userLogin()).andDo(result ->
mockMvc.perform(get("/admin/articles?page=1&count=10") assertEquals(PERMISSION_ERROR.getCode(), getResponse(result, STRING_TYPE).getCode())
.header("Authorization", token)) );
.andExpect(status().isOk()) for (int i = 0; i < 2; i++) {
.andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(PERMISSION_ERROR.getCode(), object.getInt(Code));
});
token = adminLogin();
// admin权限登陆 // admin权限登陆
mockMvc.perform(get("/admin/articles?page=1&count=10") int finalI = i;
.header("Authorization", token)) getMockData(get("/admin/articles?page=1&count=10&deleted=" + (i == 1)), adminLogin()).andDo(result -> {
.andExpect(status().isOk()) Response<PageData<ArticleModel>> response = getResponse(result, ARTICLE_MODEL_PAGE_TYPE);
.andDo(result -> { assertEquals(SUCCESS.getCode(), response.getCode());
JSONObject adminLogin = JSONObject.fromObject(result.getResponse().getContentAsString()); assertNotNull(response.getResult());
assertEquals(SUCCESS.getCode(), adminLogin.getInt(Code));
assertNotNull(adminLogin.getString(Result));
// 判断pageInfo是否包装完全 // 判断pageInfo是否包装完全
PageData<ArticleModel> pageData = (PageData<ArticleModel>) JSONObject.toBean(adminLogin.getJSONObject(Result), PageData.class); PageData<ArticleModel> pageData = response.getResult();
assertNotEquals(0, pageData.getTotal()); assertNotEquals(0, pageData.getTotal());
assertEquals(1, pageData.getPageNum()); assertEquals(1, pageData.getPageNum());
assertEquals(10, pageData.getPageSize()); assertEquals(10, pageData.getPageSize());
// 内容完整 // 内容完整
for (Object arc : pageData.getList()) { for (ArticleModel a : pageData.getList()) {
ArticleModel a = (ArticleModel) JSONObject.toBean(JSONObject.fromObject(arc), ArticleModel.class);
assertNotNull(a.getTitle()); assertNotNull(a.getTitle());
assertNotNull(a.getId()); assertNotNull(a.getId());
assertNotNull(a.getOriginal()); assertNotNull(a.getOriginal());
@@ -306,9 +233,11 @@ public class ArticleControllerTest extends BaseTest {
assertNotNull(a.getReadingNumber()); assertNotNull(a.getReadingNumber());
assertNotNull(a.getLikeCount()); assertNotNull(a.getLikeCount());
assertNotNull(a.getDislikeCount()); assertNotNull(a.getDislikeCount());
assertEquals((finalI == 1), a.isDeleted());
assertNull(a.getMdContent()); assertNull(a.getMdContent());
} }
}); });
}
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@@ -319,27 +248,22 @@ public class ArticleControllerTest extends BaseTest {
try { try {
// 分类不存在 // 分类不存在
String categoryName = "NoSuchCategory"; String categoryName = "NoSuchCategory";
mockMvc.perform(MockMvcRequestBuilders.get("/articles/category/" + categoryName + "?page=1&count=10")) getMockData(MockMvcRequestBuilders.get("/articles/category/" + categoryName + "?page=1&count=10"))
.andExpect(status().is(200)) .andDo(result -> assertEquals(CATEGORY_NOT_EXIST.getCode(), getResponse(result, STRING_TYPE).getCode()));
.andDo(result -> {
assertEquals(CATEGORY_NOT_EXIST.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code));
});
// 正常查询 // 正常查询
categoryName = "linux"; categoryName = "linux";
mockMvc.perform(MockMvcRequestBuilders.get("/articles/category/" + categoryName + "?page=1&count=10")) getMockData(MockMvcRequestBuilders.get("/articles/category/" + categoryName + "?page=1&count=10"))
.andExpect(status().is(200))
.andDo(result -> { .andDo(result -> {
JSONObject jsonObject = JSONObject.fromObject(result.getResponse().getContentAsString()); Response<PageData<ArticleModel>> response = getResponse(result, ARTICLE_MODEL_PAGE_TYPE);
assertEquals(SUCCESS.getCode(), jsonObject.getInt(Code)); assertEquals(SUCCESS.getCode(), response.getCode());
PageData<ArticleModel> pageData = (PageData<ArticleModel>) JSONObject.toBean(jsonObject.getJSONObject(Result), PageData.class); PageData<ArticleModel> pageData = response.getResult();
assertNotEquals(0, pageData.getTotal()); assertNotEquals(0, pageData.getTotal());
assertEquals(1, pageData.getPageNum()); assertEquals(1, pageData.getPageNum());
assertEquals(10, pageData.getPageSize()); assertEquals(10, pageData.getPageSize());
for (Object arc : pageData.getList()) { for (ArticleModel arc : pageData.getList()) {
JSONObject jsonObject1 = JSONObject.fromObject(arc); assertNotEquals(0, arc.getId().longValue());
assertNotEquals(0, jsonObject1.getInt("id")); assertNotNull(arc.getTitle());
assertNotNull(jsonObject1.getString("title")); assertNotNull(arc.getSummary());
assertNotNull(jsonObject1.getString("summary"));
} }
}); });
} catch (Exception e) { } catch (Exception e) {
@@ -352,28 +276,23 @@ public class ArticleControllerTest extends BaseTest {
try { try {
// 分类不存在 // 分类不存在
String tagName = "NoSuchTag"; String tagName = "NoSuchTag";
mockMvc.perform(MockMvcRequestBuilders.get("/articles/tag/" + tagName + "?page=1&count=10")) getMockData(MockMvcRequestBuilders.get("/articles/tag/" + tagName + "?page=1&count=10"))
.andExpect(status().is(200)) .andDo(result -> assertEquals(TAG_NOT_EXIST.getCode(), getResponse(result, STRING_TYPE).getCode()));
.andDo(result -> {
assertEquals(TAG_NOT_EXIST.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code));
});
// 正常查询 // 正常查询
tagName = "linux"; tagName = "linux";
mockMvc.perform(MockMvcRequestBuilders.get("/articles/tag/" + tagName + "?page=1&count=10")) getMockData(MockMvcRequestBuilders.get("/articles/tag/" + tagName + "?page=1&count=10"))
.andExpect(status().is(200))
.andDo(result -> { .andDo(result -> {
JSONObject jsonObject = JSONObject.fromObject(result.getResponse().getContentAsString()); Response<PageData<ArticleModel>> response = getResponse(result, ARTICLE_MODEL_PAGE_TYPE);
assertEquals(SUCCESS.getCode(), jsonObject.getInt(Code)); assertEquals(SUCCESS.getCode(), response.getCode());
PageData<ArticleModel> pageData = (PageData<ArticleModel>) JSONObject.toBean(jsonObject.getJSONObject(Result), PageData.class); PageData<ArticleModel> pageData = response.getResult();
assertNotEquals(0, pageData.getTotal()); assertNotEquals(0, pageData.getTotal());
assertEquals(1, pageData.getPageNum()); assertEquals(1, pageData.getPageNum());
assertEquals(10, pageData.getPageSize()); assertEquals(10, pageData.getPageSize());
for (Object arc : pageData.getList()) { for (ArticleModel arc : pageData.getList()) {
JSONObject jsonObject1 = JSONObject.fromObject(arc); assertNotEquals(0, arc.getId().longValue());
assertNotEquals(0, jsonObject1.getInt("id")); assertNotNull(arc.getTitle());
assertNotNull(jsonObject1.getString("title")); assertNotNull(arc.getSummary());
assertNotNull(jsonObject1.getString("summary"));
} }
}); });
} catch (Exception e) { } catch (Exception e) {

View File

@@ -2,82 +2,47 @@ package cn.celess.blog.controller;
import cn.celess.blog.BaseTest; import cn.celess.blog.BaseTest;
import cn.celess.blog.entity.Category; import cn.celess.blog.entity.Category;
import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.model.CategoryModel; import cn.celess.blog.entity.model.CategoryModel;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.mapper.CategoryMapper; import cn.celess.blog.mapper.CategoryMapper;
import net.sf.json.JSONArray; import com.fasterxml.jackson.core.type.TypeReference;
import net.sf.json.JSONObject;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import java.util.UUID; import static cn.celess.blog.enmu.ResponseEnum.SUCCESS;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static cn.celess.blog.enmu.ResponseEnum.*;
public class CategoryControllerTest extends BaseTest { public class CategoryControllerTest extends BaseTest {
@Autowired @Autowired
CategoryMapper categoryMapper; CategoryMapper categoryMapper;
private static final TypeReference<?> CATEGORY_MODEL_TYPE = new TypeReference<Response<CategoryModel>>() {
};
private static final TypeReference<?> CATEGORY_MODEL_PAGE_TYPE = new TypeReference<Response<PageData<CategoryModel>>>() {
};
@Test @Test
public void addOne() throws Exception { public void addOne() throws Exception {
String categoryName = randomStr(4); String categoryName = randomStr(4);
System.out.println("categoryName: ==> " + categoryName); getMockData(post("/admin/category/create?name=" + categoryName), adminLogin()).andDo(result -> {
// 未登录 Response<CategoryModel> response = getResponse(result, CATEGORY_MODEL_TYPE);
mockMvc.perform(post("/admin/category/create?name=" + categoryName)).andExpect(status().isOk()) assertEquals(SUCCESS.getCode(), response.getCode());
.andDo(result -> { CategoryModel category = response.getResult();
assertEquals(HAVE_NOT_LOG_IN.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code));
});
// User权限
String token = userLogin();
mockMvc.perform(post("/admin/category/create?name=" + categoryName)
.header("Authorization", token))
.andExpect(status().isOk())
.andDo(result -> {
assertEquals(PERMISSION_ERROR.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code));
});
// Admin权限
token = adminLogin();
mockMvc.perform(post("/admin/category/create?name=" + categoryName)
.header("Authorization", token))
.andExpect(status().isOk())
.andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(SUCCESS.getCode(), object.getInt(Code));
CategoryModel category = (CategoryModel) JSONObject.toBean(object.getJSONObject(Result), CategoryModel.class);
assertEquals(categoryName, category.getName()); assertEquals(categoryName, category.getName());
assertNotNull(category.getId()); assertNotNull(category.getId());
assertNotEquals(0, category.getArticles()); assertNull(category.getArticles());
}); });
} }
@Test @Test
public void deleteOne() throws Exception { public void deleteOne() throws Exception {
Category category = categoryMapper.getLastestCategory(); Category category = categoryMapper.getLastestCategory();
// 未登录 getMockData(delete("/admin/category/del?id=" + category.getId()), adminLogin()).andDo(result -> {
mockMvc.perform(delete("/admin/category/del?id=" + category.getId())).andExpect(status().isOk()) Response<Boolean> response = getResponse(result, BOOLEAN_TYPE);
.andDo(result -> { assertEquals(SUCCESS.getCode(), response.getCode());
assertEquals(HAVE_NOT_LOG_IN.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code)); assertTrue(response.getResult());
});
// User权限
String token = userLogin();
mockMvc.perform(delete("/admin/category/del?id=" + category.getId())
.header("Authorization", token))
.andExpect(status().isOk())
.andDo(result -> {
assertEquals(PERMISSION_ERROR.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code));
});
// Admin权限
token = adminLogin();
mockMvc.perform(delete("/admin/category/del?id=" + category.getId())
.header("Authorization", token))
.andExpect(status().isOk())
.andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(SUCCESS.getCode(), object.getInt(Code));
assertTrue(object.getBoolean(Result));
}); });
} }
@@ -85,47 +50,27 @@ public class CategoryControllerTest extends BaseTest {
public void updateOne() throws Exception { public void updateOne() throws Exception {
Category category = categoryMapper.getLastestCategory(); Category category = categoryMapper.getLastestCategory();
String name = randomStr(4); String name = randomStr(4);
// 未登录 getMockData(put("/admin/category/update?id=" + category.getId() + "&name=" + name), adminLogin()).andDo(result -> {
mockMvc.perform(put("/admin/category/update?id=" + category.getId() + "&name=" + name)).andExpect(status().isOk()) // Response<CategoryModel> response = mapper.readValue(result.getResponse().getContentAsString(), new ResponseType<Response<CategoryModel>>());
.andDo(result -> { Response<CategoryModel> response = getResponse(result, CATEGORY_MODEL_TYPE);
assertEquals(HAVE_NOT_LOG_IN.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code)); assertEquals(SUCCESS.getCode(), response.getCode());
}); CategoryModel c = response.getResult();
// User权限
String token = userLogin();
mockMvc.perform(put("/admin/category/update?id=" + category.getId() + "&name=" + name)
.header("Authorization", token))
.andExpect(status().isOk())
.andDo(result -> {
assertEquals(PERMISSION_ERROR.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code));
});
// Admin权限
token = adminLogin();
mockMvc.perform(put("/admin/category/update?id=" + category.getId() + "&name=" + name)
.header("Authorization", token))
.andExpect(status().isOk())
.andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(SUCCESS.getCode(), object.getInt(Code));
CategoryModel c = (CategoryModel) JSONObject.toBean(object.getJSONObject(Result), CategoryModel.class);
assertEquals(name, c.getName()); assertEquals(name, c.getName());
assertNotEquals(0, c.getArticles()); assertNull(c.getArticles());
assertNotNull(c.getId()); assertNotNull(c.getId());
}); });
} }
@Test @Test
public void getPage() throws Exception { public void getPage() throws Exception {
mockMvc.perform(get("/categories")).andExpect(status().isOk()) getMockData(get("/categories")).andDo(result -> {
.andDo(result -> { Response<PageData<CategoryModel>> response = getResponse(result, CATEGORY_MODEL_PAGE_TYPE);
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); assertEquals(SUCCESS.getCode(), response.getCode());
assertEquals(SUCCESS.getCode(), object.getInt(Code)); assertNotNull(response.getResult());
JSONArray jsonArray = object.getJSONObject(Result).getJSONArray("list"); response.getResult().getList().forEach(c -> {
assertNotNull(jsonArray);
jsonArray.forEach(o -> {
CategoryModel c = (CategoryModel) JSONObject.toBean(JSONObject.fromObject(o), CategoryModel.class);
assertNotNull(c.getName()); assertNotNull(c.getName());
assertNotNull(c.getId()); assertNotNull(c.getId());
assertNotEquals(0, c.getArticles()); assertNotNull(c.getArticles());
}); });
}); });

View File

@@ -3,21 +3,22 @@ package cn.celess.blog.controller;
import cn.celess.blog.BaseTest; import cn.celess.blog.BaseTest;
import cn.celess.blog.entity.Article; import cn.celess.blog.entity.Article;
import cn.celess.blog.entity.Comment; import cn.celess.blog.entity.Comment;
import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.User; import cn.celess.blog.entity.User;
import cn.celess.blog.entity.model.CommentModel; import cn.celess.blog.entity.model.CommentModel;
import cn.celess.blog.entity.request.CommentReq; import cn.celess.blog.entity.request.CommentReq;
import cn.celess.blog.mapper.ArticleMapper; import cn.celess.blog.mapper.ArticleMapper;
import cn.celess.blog.mapper.CommentMapper; import cn.celess.blog.mapper.CommentMapper;
import cn.celess.blog.mapper.UserMapper; import cn.celess.blog.mapper.UserMapper;
import net.sf.json.JSONObject; import com.fasterxml.jackson.core.type.TypeReference;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import java.util.UUID; import java.util.List;
import static cn.celess.blog.enmu.ResponseEnum.DATA_IS_DELETED;
import static cn.celess.blog.enmu.ResponseEnum.SUCCESS;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import static cn.celess.blog.enmu.ResponseEnum.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
public class CommentControllerTest extends BaseTest { public class CommentControllerTest extends BaseTest {
@@ -27,46 +28,40 @@ public class CommentControllerTest extends BaseTest {
UserMapper userMapper; UserMapper userMapper;
@Autowired @Autowired
CommentMapper commentMapper; CommentMapper commentMapper;
private static final TypeReference<?> COMMENT_MODEL_TYPE = new TypeReference<Response<CommentModel>>() {
};
@Test @Test
public void addOne() throws Exception { public void addOne() throws Exception {
Article article = articleMapper.getLastestArticle(); Article article = articleMapper.getLastestArticle();
CommentReq commentReq = new CommentReq(); CommentReq commentReq = new CommentReq();
commentReq.setPagePath("/article/" + article.getId()); commentReq.setPagePath("/article/" + article.getId());
commentReq.setContent(UUID.randomUUID().toString()); commentReq.setContent(randomStr());
commentReq.setPid(-1L); List<User> all = userMapper.findAll();
commentReq.setToUserId(-1L); commentReq.setPid(1L);
String token = userLogin(); commentReq.setToUserId(2l);
mockMvc.perform(post("/user/comment/create") getMockData(post("/user/comment/create"), userLogin(), commentReq).andDo(result -> {
.contentType(MediaType.APPLICATION_JSON_UTF8) Response<CommentModel> response = getResponse(result, COMMENT_MODEL_TYPE);
.content(JSONObject.fromObject(commentReq).toString()) assertEquals(SUCCESS.getCode(), response.getCode());
.header("Authorization", token) CommentModel model = response.getResult();
).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(SUCCESS.getCode(), object.getInt(Code));
CommentModel model = (CommentModel) JSONObject.toBean(object.getJSONObject(Result), CommentModel.class);
assertNotEquals(0, model.getId()); assertNotEquals(0, model.getId());
assertEquals(commentReq.getPid(), model.getPid().longValue()); assertEquals(commentReq.getPid(), model.getPid().longValue());
assertEquals(-1, model.getPid().longValue()); assertEquals(1, model.getPid().longValue());
assertEquals(commentReq.getContent(), model.getContent()); assertEquals(commentReq.getContent(), model.getContent());
assertNotNull(model.getDate()); assertNotNull(model.getDate());
assertNotNull(model.getFromUser()); assertNotNull(model.getFromUser());
assertNull(model.getToUser()); assertNotNull(model.getToUser());
}); });
commentReq.setPagePath("/article/" + article.getId()); commentReq.setPagePath("/article/" + article.getId());
commentReq.setContent(UUID.randomUUID().toString()); commentReq.setContent(randomStr());
commentReq.setPid(-1L); commentReq.setPid(-1L);
commentReq.setToUserId(2); commentReq.setToUserId(2);
mockMvc.perform(post("/user/comment/create") getMockData(post("/user/comment/create"), userLogin(), commentReq).andDo(result -> {
.contentType(MediaType.APPLICATION_JSON_UTF8) Response<CommentModel> response = getResponse(result, COMMENT_MODEL_TYPE);
.content(JSONObject.fromObject(commentReq).toString()) assertEquals(SUCCESS.getCode(), response.getCode());
.header("Authorization", token) CommentModel model = response.getResult();
).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(SUCCESS.getCode(), object.getInt(Code));
CommentModel model = (CommentModel) JSONObject.toBean(object.getJSONObject(Result), CommentModel.class);
// 响应数据的完整性 // 响应数据的完整性
assertNotEquals(0, model.getId()); assertNotEquals(0, model.getId());
assertEquals(commentReq.getPid(), model.getPid().longValue()); assertEquals(commentReq.getPid(), model.getPid().longValue());
@@ -79,20 +74,16 @@ public class CommentControllerTest extends BaseTest {
}); });
// 测试二级回复 // 测试二级回复
Comment lastestComment = commentMapper.getLastestComment(); Comment latestComment = commentMapper.getLastestComment();
commentReq.setPagePath("/article/" + article.getId()); commentReq.setPagePath("/article/" + article.getId());
commentReq.setContent(UUID.randomUUID().toString()); commentReq.setContent(randomStr());
commentReq.setPid(lastestComment.getId()); commentReq.setPid(latestComment.getId());
mockMvc.perform(post("/user/comment/create") getMockData(post("/user/comment/create"), userLogin(), commentReq).andDo(result -> {
.contentType(MediaType.APPLICATION_JSON_UTF8) Response<CommentModel> response = getResponse(result, COMMENT_MODEL_TYPE);
.content(JSONObject.fromObject(commentReq).toString()) assertEquals(SUCCESS.getCode(), response.getCode());
.header("Authorization", token) CommentModel model = response.getResult();
).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(SUCCESS.getCode(), object.getInt(Code));
CommentModel model = (CommentModel) JSONObject.toBean(object.getJSONObject(Result), CommentModel.class);
// 重新获取父评论信息 // 重新获取父评论信息
Comment pCommon = commentMapper.findCommentById(lastestComment.getId()); Comment pCommon = commentMapper.findCommentById(latestComment.getId());
assertEquals(pCommon.getId(), model.getPid()); assertEquals(pCommon.getId(), model.getPid());
}); });
} }
@@ -116,16 +107,13 @@ public class CommentControllerTest extends BaseTest {
// 接口测试 // 接口测试
long id = comment.getId(); long id = comment.getId();
assertNotEquals(0, id); assertNotEquals(0, id);
String token = userLogin(); getMockData(delete("/user/comment/del?id=" + id), userLogin()).andDo(result -> {
mockMvc.perform(delete("/user/comment/del?id=" + id).header("Authorization", token)).andDo(result -> { Response<Boolean> response = getResponse(result, BOOLEAN_TYPE);
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); assertEquals(SUCCESS.getCode(), response.getCode());
assertEquals(SUCCESS.getCode(), object.getInt(Code)); assertTrue(response.getResult());
assertTrue(object.getBoolean(Result));
});
mockMvc.perform(delete("/user/comment/del?id=" + id).header("Authorization", token)).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(DATA_IS_DELETED.getCode(), object.getInt(Code));
}); });
getMockData(delete("/user/comment/del?id=" + id), userLogin())
.andDo(result -> assertEquals(DATA_IS_DELETED.getCode(), getResponse(result, COMMENT_MODEL_TYPE).getCode()));
} }
@Test @Test
@@ -133,16 +121,12 @@ public class CommentControllerTest extends BaseTest {
Comment comment = commentMapper.getLastestComment(); Comment comment = commentMapper.getLastestComment();
CommentReq commentReq = new CommentReq(); CommentReq commentReq = new CommentReq();
commentReq.setId(comment.getId()); commentReq.setId(comment.getId());
commentReq.setContent(UUID.randomUUID().toString()); commentReq.setContent(randomStr());
// 不合法数据 setResponseId // 不合法数据 setResponseId
mockMvc.perform(put("/user/comment/update") getMockData(put("/user/comment/update"), userLogin(), commentReq).andDo(result -> {
.content(JSONObject.fromObject(commentReq).toString()) Response<CommentModel> response = getResponse(result, COMMENT_MODEL_TYPE);
.contentType(MediaType.APPLICATION_JSON_UTF8) assertEquals(SUCCESS.getCode(), response.getCode());
.header("Authorization", userLogin()) CommentModel c = response.getResult();
).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(SUCCESS.getCode(), object.getInt(Code));
CommentModel c = (CommentModel) JSONObject.toBean(object.getJSONObject(Result), CommentModel.class);
assertEquals(commentReq.getContent(), c.getContent()); assertEquals(commentReq.getContent(), c.getContent());
}); });
} }

View File

@@ -2,42 +2,49 @@ package cn.celess.blog.controller;
import cn.celess.blog.BaseTest; import cn.celess.blog.BaseTest;
import cn.celess.blog.entity.PartnerSite; import cn.celess.blog.entity.PartnerSite;
import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.model.PageData; 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.entity.request.LinkReq;
import cn.celess.blog.exception.MyException;
import cn.celess.blog.mapper.PartnerMapper; import cn.celess.blog.mapper.PartnerMapper;
import com.github.pagehelper.PageInfo; import cn.celess.blog.service.PartnerSiteService;
import net.sf.json.JSONObject; import com.fasterxml.jackson.core.type.TypeReference;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import java.util.UUID; import java.util.List;
import static cn.celess.blog.enmu.ResponseEnum.*; import static cn.celess.blog.enmu.ResponseEnum.*;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
@Slf4j
public class LinksControllerTest extends BaseTest { public class LinksControllerTest extends BaseTest {
@Autowired @Autowired
PartnerMapper mapper; PartnerMapper mapper;
private static final TypeReference<?> LINK_MODEL_TYPE = new TypeReference<Response<PartnerSite>>() {
};
private static final TypeReference<?> LINK_MODEL_LIST_TYPE = new TypeReference<Response<List<PartnerSite>>>() {
};
private static final TypeReference<?> LINK_MODEL_PAGE_TYPE = new TypeReference<Response<PageData<PartnerSite>>>() {
};
@Autowired
PartnerSiteService partnerSiteService;
@Test @Test
public void create() throws Exception { public void create() throws Exception {
LinkReq linkReq = new LinkReq(); LinkReq linkReq = new LinkReq();
linkReq.setName(UUID.randomUUID().toString().substring(0, 4)); linkReq.setName(randomStr(4));
linkReq.setOpen(false); linkReq.setOpen(false);
linkReq.setUrl("https://example.com"); linkReq.setUrl("https://" + randomStr(4) + "example.com");
String token = adminLogin(); getMockData(post("/admin/links/create"), adminLogin(), linkReq).andDo(result -> {
mockMvc.perform( Response<PartnerSite> response = getResponse(result, LINK_MODEL_TYPE);
post("/admin/links/create") assertEquals(SUCCESS.getCode(), response.getCode());
.content(JSONObject.fromObject(linkReq).toString()) PartnerSite site = response.getResult();
.header("Authorization", token)
.contentType(MediaType.APPLICATION_JSON)
).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(SUCCESS.getCode(), object.getInt(Code));
PartnerSite site = (PartnerSite) JSONObject.toBean(object.getJSONObject(Result), PartnerSite.class);
assertNotNull(site.getId()); assertNotNull(site.getId());
assertEquals(linkReq.getName(), site.getName()); assertEquals(linkReq.getName(), site.getName());
assertEquals(linkReq.getUrl(), site.getUrl()); assertEquals(linkReq.getUrl(), site.getUrl());
@@ -45,54 +52,45 @@ public class LinksControllerTest extends BaseTest {
}); });
// https/http // https/http
linkReq.setName(UUID.randomUUID().toString().substring(0, 4)); linkReq.setName(randomStr(4));
linkReq.setOpen(false); linkReq.setOpen(false);
linkReq.setUrl("example.com"); linkReq.setUrl(randomStr(4) + ".example.com");
mockMvc.perform( getMockData(post("/admin/links/create"), adminLogin(), linkReq).andDo(result -> {
post("/admin/links/create") Response<PartnerSite> response = getResponse(result, LINK_MODEL_TYPE);
.content(JSONObject.fromObject(linkReq).toString()) assertEquals(SUCCESS.getCode(), response.getCode());
.header("Authorization", token) PartnerSite site = response.getResult();
.contentType("application/json") assertEquals("http://" + linkReq.getUrl(), site.getUrl());
).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(SUCCESS.getCode(), object.getInt(Code));
PartnerSite site = (PartnerSite) JSONObject.toBean(object.getJSONObject(Result), PartnerSite.class);
assertEquals("http://example.com", site.getUrl());
}); });
// 测试已存在的数据 // 测试已存在的数据
mockMvc.perform( getMockData(post("/admin/links/create"), adminLogin(), linkReq).andDo(result ->
post("/admin/links/create") assertEquals(DATA_HAS_EXIST.getCode(), getResponse(result, STRING_TYPE).getCode())
.content(JSONObject.fromObject(linkReq).toString()) );
.header("Authorization", token)
.contentType("application/json")
).andDo(result -> assertEquals(DATA_HAS_EXIST.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code)));
} }
@Test @Test
public void del() throws Exception { public void del() throws Exception {
PartnerSite partnerSite = new PartnerSite(); PartnerSite partnerSite = new PartnerSite();
partnerSite.setName(UUID.randomUUID().toString().substring(0, 4)); partnerSite.setName(randomStr(4));
partnerSite.setOpen(true); partnerSite.setOpen(true);
partnerSite.setDesc(""); partnerSite.setDesc("");
partnerSite.setIconPath(""); partnerSite.setIconPath("");
partnerSite.setUrl("https://www.celess.cn"); partnerSite.setUrl("https://" + randomStr(4) + ".celess.cn");
mapper.insert(partnerSite); mapper.insert(partnerSite);
PartnerSite lastest = mapper.getLastest(); PartnerSite latest = mapper.getLastest();
assertNotNull(lastest.getId()); assertNotNull(latest.getId());
String token = adminLogin(); getMockData(delete("/admin/links/del/" + latest.getId()), adminLogin()).andDo(result -> {
mockMvc.perform(delete("/admin/links/del/" + lastest.getId()).header("Authorization", token)).andDo(result -> { Response<Boolean> response = getResponse(result, BOOLEAN_TYPE);
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); assertEquals(SUCCESS.getCode(), response.getCode());
assertEquals(SUCCESS.getCode(), object.getInt(Code)); assertTrue(response.getResult());
assertTrue(object.getBoolean(Result));
}); });
long id = lastest.getId(); long id = latest.getId();
do { do {
id += 1; id += 1;
} while (mapper.existsById(id)); } while (mapper.existsById(id));
System.out.println("删除ID=" + id + "的数据"); System.out.println("删除ID=" + id + "的数据");
mockMvc.perform(delete("/admin/links/del/" + id).header("Authorization", token)).andDo(result -> getMockData(delete("/admin/links/del/" + id), adminLogin()).andDo(result ->
assertEquals(DATA_NOT_EXIST.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code)) assertEquals(DATA_NOT_EXIST.getCode(), getResponse(result, STRING_TYPE).getCode())
); );
} }
@@ -100,32 +98,27 @@ public class LinksControllerTest extends BaseTest {
public void update() throws Exception { public void update() throws Exception {
// 增数据 // 增数据
PartnerSite partnerSite = new PartnerSite(); PartnerSite partnerSite = new PartnerSite();
partnerSite.setName(UUID.randomUUID().toString().substring(0, 4)); partnerSite.setName(randomStr(4));
partnerSite.setOpen(true); partnerSite.setOpen(true);
partnerSite.setDesc(""); partnerSite.setDesc("");
partnerSite.setIconPath(""); partnerSite.setIconPath("");
partnerSite.setDelete(false); partnerSite.setDelete(false);
partnerSite.setUrl("https://www.celess.cn"); partnerSite.setUrl("https://" + randomStr(5) + ".celess.cn");
mapper.insert(partnerSite); mapper.insert(partnerSite);
// 查数据 // 查数据
PartnerSite lastest = mapper.getLastest(); PartnerSite latest = mapper.getLastest();
assertNotNull(lastest.getId()); assertNotNull(latest.getId());
String token = adminLogin();
// 构建请求 // 构建请求
LinkReq linkReq = new LinkReq(); LinkReq linkReq = new LinkReq();
linkReq.setUrl(lastest.getUrl()); linkReq.setUrl(latest.getUrl());
linkReq.setOpen(!lastest.getOpen()); linkReq.setOpen(!latest.getOpen());
linkReq.setName(UUID.randomUUID().toString().substring(0, 4)); linkReq.setName(randomStr(4));
linkReq.setId(lastest.getId()); linkReq.setId(latest.getId());
mockMvc.perform(
put("/admin/links/update") getMockData(put("/admin/links/update"), adminLogin(), linkReq).andDo(result -> {
.content(JSONObject.fromObject(linkReq).toString()) Response<PartnerSite> response = getResponse(result, LINK_MODEL_TYPE);
.contentType(MediaType.APPLICATION_JSON) assertEquals(SUCCESS.getCode(), response.getCode());
.header("Authorization", token) PartnerSite site = response.getResult();
).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(SUCCESS.getCode(), object.getInt(Code));
PartnerSite site = (PartnerSite) JSONObject.toBean(object.getJSONObject(Result), PartnerSite.class);
assertNotNull(site.getId()); assertNotNull(site.getId());
assertEquals(linkReq.getId(), site.getId().longValue()); assertEquals(linkReq.getId(), site.getId().longValue());
assertEquals(linkReq.getUrl(), site.getUrl()); assertEquals(linkReq.getUrl(), site.getUrl());
@@ -136,11 +129,10 @@ public class LinksControllerTest extends BaseTest {
@Test @Test
public void allForOpen() throws Exception { public void allForOpen() throws Exception {
mockMvc.perform(get("/links")).andDo(result -> { getMockData(get("/links")).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); Response<List<PartnerSite>> response = getResponse(result, LINK_MODEL_LIST_TYPE);
assertEquals(SUCCESS.getCode(), object.getInt(Code)); assertEquals(SUCCESS.getCode(), response.getCode());
object.getJSONArray(Result).forEach(o -> { response.getResult().forEach(site -> {
PartnerSite site = (PartnerSite) JSONObject.toBean(JSONObject.fromObject(o), PartnerSite.class);
assertNotNull(site.getUrl()); assertNotNull(site.getUrl());
assertNull(site.getOpen()); assertNull(site.getOpen());
assertNotNull(site.getName()); assertNotNull(site.getName());
@@ -150,14 +142,13 @@ public class LinksControllerTest extends BaseTest {
@Test @Test
public void all() throws Exception { public void all() throws Exception {
mockMvc.perform(get("/admin/links?page=1&count=10").header("Authorization", adminLogin())).andDo(result -> { getMockData(get("/admin/links?page=1&count=10"), adminLogin()).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); Response<PageData<PartnerSite>> response = getResponse(result, LINK_MODEL_PAGE_TYPE);
assertEquals(SUCCESS.getCode(), object.getInt(Code)); assertEquals(SUCCESS.getCode(), response.getCode());
PageData<PartnerSite> pageData = (PageData<PartnerSite>) JSONObject.toBean(object.getJSONObject(Result), PageData.class); PageData<PartnerSite> pageData = response.getResult();
assertEquals(1, pageData.getPageNum()); assertEquals(1, pageData.getPageNum());
assertEquals(10, pageData.getPageSize()); assertEquals(10, pageData.getPageSize());
for (Object o : pageData.getList()) { for (PartnerSite site : pageData.getList()) {
PartnerSite site = (PartnerSite) JSONObject.toBean(JSONObject.fromObject(o), PartnerSite.class);
assertNotNull(site.getUrl()); assertNotNull(site.getUrl());
assertNotNull(site.getName()); assertNotNull(site.getName());
assertNotNull(site.getOpen()); assertNotNull(site.getOpen());
@@ -165,19 +156,83 @@ public class LinksControllerTest extends BaseTest {
}); });
} }
// 手动测试 @Test
// @Test public void apply() {
public void apply() throws Exception { // 做service 层的测试
long l = System.currentTimeMillis(); // mockEmailServiceInstance(partnerSiteService, "mailService");
String url = "https://www.example.com"; mockInjectInstance(partnerSiteService, "mailService", new TestMailServiceImpl());
mockMvc.perform(post("/apply?name=小海博客Api测试请忽略&url=" + url)).andDo(result -> { LinkApplyReq req = new LinkApplyReq();
assertEquals(SUCCESS.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code)); req.setName(randomStr(4));
}); req.setUrl("https://" + randomStr(4) + ".celess.cn");
System.out.println("耗时:" + (System.currentTimeMillis() - l) / 1000 + "s"); req.setIconPath("https://www.celess.cn/example.png");
url = "xxxxxxxxxm"; req.setDesc("desc :" + randomStr());
mockMvc.perform(post("/apply?name=小海博客Api测试请忽略&url=" + url)).andDo(result -> { req.setEmail(randomStr(4) + "@celess.cn");
assertEquals(PARAMETERS_URL_ERROR.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code)); req.setLinkUrl(req.getUrl() + "/links");
}); try {
// 抓取不到数据的链接
partnerSiteService.apply(req);
} catch (MyException e) {
log.debug("测试抓取不到数据");
assertEquals(CANNOT_GET_DATA.getCode(), e.getCode());
}
req.setLinkUrl("https://bing.com");
req.setUrl(req.getLinkUrl());
try {
partnerSiteService.apply(req);
} catch (MyException e) {
log.debug("测试未添加本站链接的友链申请");
assertEquals(APPLY_LINK_NO_ADD_THIS_SITE.getCode(), e.getCode());
assertNotNull(e.getResult());
try {
// 测试uuid一致性
log.debug("测试uuid一致性");
partnerSiteService.apply(req);
} catch (MyException e2) {
assertEquals(e.getResult(), e2.getResult());
}
}
log.debug("测试正常申请");
req.setLinkUrl("https://www.celess.cn");
req.setUrl(req.getLinkUrl());
PartnerSite apply = partnerSiteService.apply(req);
assertNotNull(apply);
assertNotNull(apply.getId());
}
@Test
public void reapply() {
//mockEmailServiceInstance(partnerSiteService, "mailService");
try {
partnerSiteService.reapply(randomStr());
throw new AssertionError();
} catch (MyException e) {
assertEquals(DATA_EXPIRED.getCode(), e.getCode());
}
LinkApplyReq req = new LinkApplyReq();
req.setName(randomStr(4));
req.setIconPath("https://www.celess.cn/example.png");
req.setDesc("desc :" + randomStr());
req.setEmail(randomStr(4) + "@celess.cn");
req.setLinkUrl("https://bing.com");
req.setUrl(req.getLinkUrl());
String uuid;
try {
partnerSiteService.apply(req);
// err here
throw new AssertionError();
} catch (MyException e) {
uuid = (String) e.getResult();
String reapply = partnerSiteService.reapply(uuid);
assertEquals(reapply, "success");
}
try {
partnerSiteService.reapply(uuid);
throw new AssertionError();
} catch (MyException e) {
assertEquals(DATA_EXPIRED.getCode(), e.getCode());
}
} }
} }

View File

@@ -1,36 +1,42 @@
package cn.celess.blog.controller; package cn.celess.blog.controller;
import cn.celess.blog.BaseTest; import cn.celess.blog.BaseTest;
import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.Tag; import cn.celess.blog.entity.Tag;
import cn.celess.blog.entity.model.PageData; import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.model.TagModel; import cn.celess.blog.entity.model.TagModel;
import cn.celess.blog.mapper.TagMapper; import cn.celess.blog.mapper.TagMapper;
import net.sf.json.JSONArray; import com.fasterxml.jackson.core.type.TypeReference;
import net.sf.json.JSONObject;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import java.util.UUID; import java.util.List;
import java.util.Map;
import static cn.celess.blog.enmu.ResponseEnum.*;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static cn.celess.blog.enmu.ResponseEnum.*;
public class TagControllerTest extends BaseTest { public class TagControllerTest extends BaseTest {
@Autowired @Autowired
TagMapper tagMapper; TagMapper tagMapper;
private static final TypeReference<?> TAG_MODEL_TYPE = new TypeReference<Response<TagModel>>() {
};
private static final TypeReference<?> TAG_MODEL_PAGE_TYPE = new TypeReference<Response<PageData<TagModel>>>() {
};
private static final TypeReference<?> TAG_NAC_LIST_TYPE = new TypeReference<Response<List<Map<String, Object>>>>() {
};
@Test @Test
public void addOne() throws Exception { public void addOne() throws Exception {
String name = randomStr(4); String name = randomStr(4);
mockMvc.perform(post("/admin/tag/create?name=" + name)).andDo(result -> assertEquals(HAVE_NOT_LOG_IN.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code))); getMockData(post("/admin/tag/create?name=" + name)).andDo(result -> assertEquals(HAVE_NOT_LOG_IN.getCode(), getResponse(result, STRING_TYPE).getCode()));
mockMvc.perform(post("/admin/tag/create?name=" + name).header("authorization", userLogin())).andDo(result -> assertEquals(PERMISSION_ERROR.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code))); getMockData(post("/admin/tag/create?name=" + name), userLogin()).andDo(result -> assertEquals(PERMISSION_ERROR.getCode(), getResponse(result, STRING_TYPE).getCode()));
mockMvc.perform(post("/admin/tag/create?name=" + name).header("authorization", adminLogin())).andDo(result -> { getMockData(post("/admin/tag/create?name=" + name), adminLogin()).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); Response<TagModel> response = getResponse(result, TAG_MODEL_TYPE);
assertEquals(SUCCESS.getCode(), object.getInt(Code)); assertEquals(SUCCESS.getCode(), response.getCode());
JSONObject resJson = object.getJSONObject(Result); TagModel tag = response.getResult();
TagModel tag = (TagModel) JSONObject.toBean(resJson, TagModel.class);
assertNotNull(tag.getId()); assertNotNull(tag.getId());
assertEquals(name, tag.getName()); assertEquals(name, tag.getName());
}); });
@@ -42,16 +48,14 @@ public class TagControllerTest extends BaseTest {
public void delOne() throws Exception { public void delOne() throws Exception {
Tag lastestTag = tagMapper.getLastestTag(); Tag lastestTag = tagMapper.getLastestTag();
assertNotNull(lastestTag.getId()); assertNotNull(lastestTag.getId());
String token = adminLogin(); getMockData(delete("/admin/tag/del?id=" + lastestTag.getId()), adminLogin()).andDo(result -> {
mockMvc.perform(delete("/admin/tag/del?id=" + lastestTag.getId()).header("Authorization", token)).andDo(result -> { Response<Boolean> response = getResponse(result, BOOLEAN_TYPE);
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); assertEquals(SUCCESS.getCode(), response.getCode());
assertEquals(SUCCESS.getCode(), object.getInt(Code)); assertTrue(response.getResult());
assertTrue(object.getBoolean(Result));
}); });
long id = lastestTag.getId() * 2; long id = lastestTag.getId() * 2;
mockMvc.perform(delete("/admin/tag/del?id=" + id).header("Authorization", token)).andDo(result -> getMockData(delete("/admin/tag/del?id=" + id), adminLogin())
assertEquals(TAG_NOT_EXIST.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code)) .andDo(result -> assertEquals(TAG_NOT_EXIST.getCode(), getResponse(result, STRING_TYPE).getCode()));
);
} }
@@ -59,12 +63,12 @@ public class TagControllerTest extends BaseTest {
public void updateOne() throws Exception { public void updateOne() throws Exception {
Tag tag = tagMapper.getLastestTag(); Tag tag = tagMapper.getLastestTag();
assertNotNull(tag.getId()); assertNotNull(tag.getId());
String name = UUID.randomUUID().toString().substring(0, 4); String name = randomStr(4);
mockMvc.perform(put("/admin/tag/update?id=" + tag.getId() + "&name=" + name).header("Authorization", adminLogin())).andDo(result -> { getMockData(put("/admin/tag/update?id=" + tag.getId() + "&name=" + name), adminLogin()).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); Response<TagModel> response = getResponse(result, TAG_MODEL_TYPE);
assertEquals(SUCCESS.getCode(), object.getInt(Code)); assertEquals(SUCCESS.getCode(), response.getCode());
assertNotNull(object.getJSONObject(Result)); assertNotNull(response.getResult());
TagModel t = (TagModel) JSONObject.toBean(object.getJSONObject(Result), TagModel.class); TagModel t = response.getResult();
assertEquals(name, t.getName()); assertEquals(name, t.getName());
assertEquals(tag.getId(), t.getId()); assertEquals(tag.getId(), t.getId());
}); });
@@ -73,23 +77,18 @@ public class TagControllerTest extends BaseTest {
@Test @Test
public void getPage() throws Exception { public void getPage() throws Exception {
mockMvc.perform(get("/tags?page=1&count=5")) getMockData(get("/tags?page=1&count=5")).andDo(result -> {
.andExpect(status().is(200)) Response<PageData<TagModel>> response = getResponse(result, TAG_MODEL_PAGE_TYPE);
.andDo(result -> { assertEquals(SUCCESS.getCode(), response.getCode());
JSONObject articlesJSON = JSONObject.fromObject(result.getResponse().getContentAsString());
// 断言获取数据成功
assertEquals(SUCCESS.getCode(), articlesJSON.getInt(Code));
// 结果集非空 // 结果集非空
assertNotNull(articlesJSON.getJSONObject(Result)); assertNotNull(response.getResult());
// 判断pageInfo是否包装完全 // 判断pageInfo是否包装完全
JSONObject resultJson = JSONObject.fromObject(articlesJSON.getJSONObject(Result)); PageData<TagModel> pageData = response.getResult();
PageData<TagModel> pageData = (PageData<TagModel>) JSONObject.toBean(resultJson, PageData.class);
assertNotEquals(0, pageData.getTotal()); assertNotEquals(0, pageData.getTotal());
assertEquals(1, pageData.getPageNum()); assertEquals(1, pageData.getPageNum());
assertEquals(5, pageData.getPageSize()); assertEquals(5, pageData.getPageSize());
// 内容完整 // 内容完整
for (Object tag : pageData.getList()) { for (TagModel t : pageData.getList()) {
TagModel t = (TagModel) JSONObject.toBean(JSONObject.fromObject(tag), TagModel.class);
assertNotNull(t.getId()); assertNotNull(t.getId());
assertNotNull(t.getName()); assertNotNull(t.getName());
} }
@@ -98,15 +97,13 @@ public class TagControllerTest extends BaseTest {
@Test @Test
public void getTagNameAndCount() throws Exception { public void getTagNameAndCount() throws Exception {
mockMvc.perform(get("/tags/nac")).andDo(result -> { getMockData(get("/tags/nac")).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); Response<List<Map<String, Object>>> response = getResponse(result, TAG_NAC_LIST_TYPE);
assertEquals(SUCCESS.getCode(), object.getInt(Code)); assertEquals(SUCCESS.getCode(), response.getCode());
JSONArray jsonArray = object.getJSONArray(Result); assertNotNull(response.getResult());
assertNotNull(jsonArray); response.getResult().forEach(o -> {
jsonArray.forEach(o -> { assertNotNull(o.get("name"));
JSONObject json = JSONObject.fromObject(o); assertNotNull(o.get("size"));
assertTrue(json.containsKey("size"));
assertTrue(json.containsKey("name"));
}); });
}); });
} }

View File

@@ -1,36 +1,56 @@
package cn.celess.blog.controller; package cn.celess.blog.controller;
import cn.celess.blog.BaseTest; import cn.celess.blog.BaseTest;
import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.User; import cn.celess.blog.entity.User;
import cn.celess.blog.entity.model.PageData; import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.model.UserModel; import cn.celess.blog.entity.model.UserModel;
import cn.celess.blog.entity.request.LoginReq; import cn.celess.blog.entity.request.LoginReq;
import cn.celess.blog.entity.request.UserReq; import cn.celess.blog.entity.request.UserReq;
import cn.celess.blog.mapper.UserMapper; import cn.celess.blog.mapper.UserMapper;
import cn.celess.blog.service.UserService;
import cn.celess.blog.util.MD5Util; import cn.celess.blog.util.MD5Util;
import net.sf.json.JSONArray; import cn.celess.blog.util.RedisUtil;
import net.sf.json.JSONObject; import com.fasterxml.jackson.core.type.TypeReference;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.mock.web.MockMultipartFile; import org.springframework.mock.web.MockMultipartFile;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap; import org.springframework.util.MultiValueMap;
import java.io.InputStream; import java.io.InputStream;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.URL; import java.net.URL;
import java.util.*; import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static cn.celess.blog.enmu.ResponseEnum.*;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static cn.celess.blog.enmu.ResponseEnum.*;
public class UserControllerTest extends BaseTest { public class UserControllerTest extends BaseTest {
@Autowired @Autowired
UserMapper userMapper; UserMapper userMapper;
@Autowired
RedisUtil redisUtil;
private static final TypeReference<?> USER_MODEL_TYPE = new TypeReference<Response<UserModel>>() {
};
private static final TypeReference<?> USER_MODEL_PAGE_TYPE = new TypeReference<Response<PageData<UserModel>>>() {
};
private static final TypeReference<?> USER_MODEL_LIST_TYPE = new TypeReference<Response<List<Map<String, Object>>>>() {
};
@Autowired
UserService userService;
@Test @Test
public void login() throws Exception { public void login() throws Exception {
@@ -41,11 +61,7 @@ public class UserControllerTest extends BaseTest {
req.setEmail("zh@celess.cn"); req.setEmail("zh@celess.cn");
req.setPassword("123456789"); req.setPassword("123456789");
req.setIsRememberMe(false); req.setIsRememberMe(false);
JSONObject loginReq = JSONObject.fromObject(req); getMockData(post("/login"), null, req).andDo(result -> assertEquals(USER_NOT_EXIST.getCode(), getResponse(result, STRING_TYPE).getCode()));
mockMvc.perform(post("/login").content(loginReq.toString()).contentType("application/json"))
.andDo(result ->
assertEquals(USER_NOT_EXIST.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code))
);
} }
@Test @Test
@@ -55,19 +71,18 @@ public class UserControllerTest extends BaseTest {
@Test @Test
public void logout() throws Exception { public void logout() throws Exception {
mockMvc.perform(get("/logout")).andDo(result -> assertEquals(SUCCESS.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code))); getMockData(get("/logout")).andDo(result -> assertEquals(SUCCESS.getCode(), getResponse(result, STRING_TYPE).getCode()));
mockMvc.perform(get("/logout").header("Authorization", userLogin())).andDo(result -> assertEquals(SUCCESS.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code))); getMockData(get("/logout"), adminLogin()).andDo(result -> assertEquals(SUCCESS.getCode(), getResponse(result).getCode()));
} }
@Test @Test
public void updateInfo() throws Exception { public void updateInfo() throws Exception {
String desc = UUID.randomUUID().toString().substring(0, 4); String desc = randomStr(4);
String disPlayName = UUID.randomUUID().toString().substring(0, 4); String disPlayName = randomStr(4);
mockMvc.perform(put("/user/userInfo/update?desc=" + desc + "&displayName=" + disPlayName).header("Authorization", userLogin())) getMockData(put("/user/userInfo/update?desc=" + desc + "&displayName=" + disPlayName), userLogin()).andDo(result -> {
.andDo(result -> { Response<UserModel> response = getResponse(result, USER_MODEL_TYPE);
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); assertEquals(SUCCESS.getCode(), response.getCode());
assertEquals(SUCCESS.getCode(), object.getInt(Code)); UserModel u = response.getResult();
UserModel u = (UserModel) JSONObject.toBean(object.getJSONObject(Result), UserModel.class);
assertEquals(desc, u.getDesc()); assertEquals(desc, u.getDesc());
assertEquals(disPlayName, u.getDisplayName()); assertEquals(disPlayName, u.getDisplayName());
assertNotNull(u.getId()); assertNotNull(u.getId());
@@ -76,11 +91,10 @@ public class UserControllerTest extends BaseTest {
@Test @Test
public void getUserInfo() throws Exception { public void getUserInfo() throws Exception {
mockMvc.perform(get("/user/userInfo").header("Authorization", userLogin())) getMockData(get("/user/userInfo"), adminLogin()).andDo(result -> {
.andDo(result -> { Response<UserModel> response = getResponse(result, USER_MODEL_TYPE);
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); assertEquals(SUCCESS.getCode(), response.getCode());
assertEquals(SUCCESS.getCode(), object.getInt(Code)); UserModel u = response.getResult();
UserModel u = (UserModel) JSONObject.toBean(object.getJSONObject(Result), UserModel.class);
assertNotNull(u.getId()); assertNotNull(u.getId());
assertNotNull(u.getEmail()); assertNotNull(u.getEmail());
assertNotNull(u.getDisplayName()); assertNotNull(u.getDisplayName());
@@ -99,12 +113,15 @@ public class UserControllerTest extends BaseTest {
connection.setRequestMethod("GET"); connection.setRequestMethod("GET");
InputStream inputStream = connection.getInputStream(); InputStream inputStream = connection.getInputStream();
assertNotNull(inputStream); assertNotNull(inputStream);
// mock 实现类
mockInjectInstance(userService, "qiniuService", new TestQiNiuServiceImpl());
MockMultipartFile file = new MockMultipartFile("file", "logo.png", MediaType.IMAGE_PNG_VALUE, inputStream); MockMultipartFile file = new MockMultipartFile("file", "logo.png", MediaType.IMAGE_PNG_VALUE, inputStream);
mockMvc.perform(multipart("/user/imgUpload").file(file)).andDo(result -> assertEquals(HAVE_NOT_LOG_IN.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code))); getMockData(multipart("/user/imgUpload").file(file), userLogin()).andDo(result -> {
mockMvc.perform(multipart("/user/imgUpload").file(file).header("Authorization", userLogin())).andDo(result -> { Response<Object> response = getResponse(result, OBJECT_TYPE);
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); assertEquals(SUCCESS.getCode(), response.getCode());
assertEquals(SUCCESS.getCode(), object.getInt(Code)); assertNotNull(response.getResult());
assertNotNull(object.getString(Result));
}); });
} }
@@ -119,20 +136,41 @@ public class UserControllerTest extends BaseTest {
} }
@Test @Test
public void emailVerify() { public void emailVerify() throws Exception {
// ignore String email = randomStr(4) + "@celess.cn";
String pwd = MD5Util.getMD5("123456789");
userMapper.addUser(new User(email, pwd));
String verifyId = randomStr();
LoginReq req = new LoginReq(email, "123456789", true);
redisUtil.setEx(email + "-verify", verifyId, 2, TimeUnit.DAYS);
getMockData(post("/emailVerify").param("verifyId", verifyId).param("email", email), login(req)).andDo(result ->
assertEquals(SUCCESS.getCode(), getResponse(result, OBJECT_TYPE).getCode())
);
} }
@Test @Test
public void resetPwd() { public void resetPwd() throws Exception {
// ignore String email = randomStr(4) + "@celess.cn";
String pwd = MD5Util.getMD5("1234567890");
userMapper.addUser(new User(email, pwd));
LoginReq req = new LoginReq(email, "1234567890", true);
String verifyId = randomStr();
// 设置验证id
redisUtil.setEx(email + "-resetPwd", verifyId, 2, TimeUnit.DAYS);
MockHttpServletRequestBuilder resetPwd = post("/resetPwd").param("verifyId", verifyId).param("email", email).param("pwd", "123456789");
// 未验证
getMockData(resetPwd, login(req)).andDo(result -> assertEquals(USEREMAIL_NOT_VERIFY.getCode(), getResponse(result, OBJECT_TYPE).getCode()));
// 设置未验证
userMapper.updateEmailStatus(email, true);
// 正常
getMockData(resetPwd, login(req)).andDo(result -> assertEquals(SUCCESS.getCode(), getResponse(result, OBJECT_TYPE).getCode()));
} }
@Test @Test
public void multipleDelete() throws Exception { public void multipleDelete() throws Exception {
List<User> userList = new ArrayList<>(); List<User> userList = new ArrayList<>();
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
String s = UUID.randomUUID().toString(); String s = randomStr();
String email = s.substring(s.length() - 4) + "@celess.cn"; String email = s.substring(s.length() - 4) + "@celess.cn";
String pwd = MD5Util.getMD5("123456789"); String pwd = MD5Util.getMD5("123456789");
User user = new User(email, pwd); User user = new User(email, pwd);
@@ -146,25 +184,16 @@ public class UserControllerTest extends BaseTest {
userMapper.setUserRole(userMapper.findByEmail(email).getId(), "admin"); userMapper.setUserRole(userMapper.findByEmail(email).getId(), "admin");
} }
} }
List<Long> idList = new ArrayList<>(); List<Integer> idList = userList.stream().map(user -> user.getId().intValue()).collect(Collectors.toList());
userList.forEach(user -> idList.add(user.getId())); getMockData(delete("/admin/user/delete"), adminLogin(), idList).andDo(result -> {
System.out.println("id :: == > " + idList.toString()); Response<List<Map<String, Object>>> response = getResponse(result, USER_MODEL_LIST_TYPE);
mockMvc.perform(delete("/admin/user/delete").content(idList.toString()).contentType("application/json")) assertEquals(SUCCESS.getCode(), response.getCode());
.andDo(result -> assertEquals(HAVE_NOT_LOG_IN.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code))); response.getResult().forEach(o -> {
mockMvc.perform(delete("/admin/user/delete").content(idList.toString()).contentType("application/json").header("Authorization", userLogin()))
.andDo(result -> assertEquals(PERMISSION_ERROR.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code)));
mockMvc.perform(delete("/admin/user/delete").content(idList.toString()).contentType("application/json").header("Authorization", adminLogin()))
.andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(SUCCESS.getCode(), object.getInt(Code));
JSONArray jsonArray = object.getJSONArray(Result);
jsonArray.forEach(o -> {
JSONObject json = JSONObject.fromObject(o);
// 判断响应数据中是否包含输入的id // 判断响应数据中是否包含输入的id
assertTrue(idList.contains((long) json.getInt("id"))); assertTrue(idList.contains((int) o.get("id")));
// 判断处理状态 // 判断处理状态
boolean status = json.getBoolean("status"); boolean status = (boolean) o.get("status");
if (json.containsKey("msg")) if (o.containsKey("msg"))
assertFalse(status); assertFalse(status);
else else
assertTrue(status); assertTrue(status);
@@ -176,26 +205,21 @@ public class UserControllerTest extends BaseTest {
@Test @Test
public void updateInfoByAdmin() throws Exception { public void updateInfoByAdmin() throws Exception {
UserReq userReq = new UserReq(); UserReq userReq = new UserReq();
String email = UUID.randomUUID().toString().substring(0, 4) + "@celess.cn"; String email = randomStr(4) + "@celess.cn";
User user = new User(email, MD5Util.getMD5("123456789")); User user = new User(email, MD5Util.getMD5("123456789"));
userMapper.addUser(user); userMapper.addUser(user);
User userByDb = userMapper.findByEmail(email); User userByDb = userMapper.findByEmail(email);
userReq.setId(userByDb.getId()); userReq.setId(userByDb.getId());
userReq.setPwd(UUID.randomUUID().toString().replaceAll("-", "").substring(0, 10)); userReq.setPwd(randomStr().substring(0, 10));
userReq.setDesc(UUID.randomUUID().toString()); userReq.setDesc(randomStr());
userReq.setEmailStatus(new Random().nextBoolean()); userReq.setEmailStatus(new Random().nextBoolean());
userReq.setRole("admin"); userReq.setRole("admin");
userReq.setDisplayName(UUID.randomUUID().toString().substring(0, 4)); userReq.setDisplayName(randomStr(4));
userReq.setEmail(UUID.randomUUID().toString().substring(0, 5) + "@celess.cn"); userReq.setEmail(randomStr(5) + "@celess.cn");
mockMvc.perform(put("/admin/user").contentType("application/json").content(JSONObject.fromObject(userReq).toString())) getMockData(put("/admin/user"), adminLogin(), userReq).andDo(result -> {
.andDo(result -> assertEquals(HAVE_NOT_LOG_IN.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code))); Response<UserModel> response = getResponse(result, USER_MODEL_TYPE);
mockMvc.perform(put("/admin/user").contentType("application/json").header("Authorization", userLogin()).content(JSONObject.fromObject(userReq).toString())) assertEquals(SUCCESS.getCode(), response.getCode());
.andDo(result -> assertEquals(PERMISSION_ERROR.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code))); UserModel userModel = response.getResult();
mockMvc.perform(put("/admin/user").contentType("application/json").header("Authorization", adminLogin()).content(JSONObject.fromObject(userReq).toString()))
.andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(SUCCESS.getCode(), object.getInt(Code));
UserModel userModel = (UserModel) JSONObject.toBean(object.getJSONObject(Result), UserModel.class);
assertEquals(userReq.getId(), userModel.getId()); assertEquals(userReq.getId(), userModel.getId());
assertEquals(userReq.getRole(), userModel.getRole()); assertEquals(userReq.getRole(), userModel.getRole());
assertEquals(userReq.getEmail(), userModel.getEmail()); assertEquals(userReq.getEmail(), userModel.getEmail());
@@ -206,25 +230,18 @@ public class UserControllerTest extends BaseTest {
@Test @Test
public void getAllUser() throws Exception { public void getAllUser() throws Exception {
mockMvc.perform(get("/admin/users?page=1&count=10")) getMockData(get("/admin/users?page=1&count=10"), adminLogin()).andDo(result -> {
.andDo(result -> assertEquals(HAVE_NOT_LOG_IN.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code))); Response<PageData<UserModel>> response = getResponse(result, USER_MODEL_PAGE_TYPE);
mockMvc.perform(get("/admin/users?page=1&count=10").header("authorization", userLogin())) assertEquals(SUCCESS.getCode(), response.getCode());
.andDo(result -> assertEquals(PERMISSION_ERROR.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code)));
mockMvc.perform(get("/admin/users?page=1&count=10").header("Authorization", adminLogin()))
.andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(SUCCESS.getCode(), object.getInt(Code));
// 结果集非空 // 结果集非空
assertNotNull(object.getJSONObject(Result)); assertNotNull(response.getResult());
// 判断pageInfo是否包装完全 // 判断pageInfo是否包装完全
JSONObject resultJson = JSONObject.fromObject(object.getJSONObject(Result)); PageData<UserModel> pageData = response.getResult();
PageData<UserModel> pageData = (PageData<UserModel>) JSONObject.toBean(resultJson, PageData.class);
assertNotEquals(0, pageData.getTotal()); assertNotEquals(0, pageData.getTotal());
assertEquals(1, pageData.getPageNum()); assertEquals(1, pageData.getPageNum());
assertEquals(10, pageData.getPageSize()); assertEquals(10, pageData.getPageSize());
// 内容完整 // 内容完整
for (Object user : pageData.getList()) { for (UserModel u : pageData.getList()) {
UserModel u = (UserModel) JSONObject.toBean(JSONObject.fromObject(user), UserModel.class);
assertNotNull(u.getId()); assertNotNull(u.getId());
assertNotNull(u.getEmail()); assertNotNull(u.getEmail());
assertNotNull(u.getRole()); assertNotNull(u.getRole());
@@ -236,40 +253,24 @@ public class UserControllerTest extends BaseTest {
@Test @Test
public void getEmailStatus() throws Exception { public void getEmailStatus() throws Exception {
String email = UUID.randomUUID().toString().substring(0, 4) + "@celess.cn"; String email = randomStr(4) + "@celess.cn";
mockMvc.perform(get("/emailStatus/" + email)).andDo(result -> { getMockData(get("/emailStatus/" + email)).andDo(result -> assertFalse((Boolean) getResponse(result, BOOLEAN_TYPE).getResult()));
String content = result.getResponse().getContentAsString(); getMockData(get("/emailStatus/" + ADMIN_EMAIL)).andDo(result -> assertTrue((Boolean) getResponse(result, BOOLEAN_TYPE).getResult()));
assertEquals(SUCCESS.getCode(), JSONObject.fromObject(content).getInt(Code));
assertFalse(JSONObject.fromObject(content).getBoolean(Result));
});
email = "a@celess.cn";
mockMvc.perform(get("/emailStatus/" + email)).andDo(result -> {
String content = result.getResponse().getContentAsString();
assertEquals(SUCCESS.getCode(), JSONObject.fromObject(content).getInt(Code));
assertTrue(JSONObject.fromObject(content).getBoolean(Result));
});
} }
@Test @Test
public void setPwd() throws Exception { public void setPwd() throws Exception {
String email = UUID.randomUUID().toString().substring(0, 4) + "@celess.cn"; String email = randomStr(4) + "@celess.cn";
assertEquals(1, userMapper.addUser(new User(email, MD5Util.getMD5("1234567890")))); assertEquals(1, userMapper.addUser(new User(email, MD5Util.getMD5("1234567890"))));
LoginReq req = new LoginReq(); LoginReq req = new LoginReq(email, "1234567890", false);
req.setEmail(email); String token = login(req);
req.setPassword("1234567890");
req.setIsRememberMe(false);
JSONObject loginReq = JSONObject.fromObject(req);
String contentAsString = mockMvc.perform(post("/login").content(loginReq.toString()).contentType("application/json")).andReturn().getResponse().getContentAsString();
assertNotNull(contentAsString);
String token = JSONObject.fromObject(contentAsString).getJSONObject(Result).getString("token");
assertNotNull(token); assertNotNull(token);
MultiValueMap<String, String> param = new LinkedMultiValueMap<String, String>(); MultiValueMap<String, String> param = new LinkedMultiValueMap<String, String>();
param.add("pwd", "1234567890"); param.add("pwd", "1234567890");
param.add("newPwd", "aaabbbccc"); param.add("newPwd", "aaabbbccc");
param.add("confirmPwd", "aaabbbccc"); param.add("confirmPwd", "aaabbbccc");
mockMvc.perform(post("/user/setPwd").header("Authorization", token).params(param)).andDo(result -> { getMockData(post("/user/setPwd").params(param), token).andDo(result -> {
String content = result.getResponse().getContentAsString(); assertEquals(SUCCESS.getCode(), getResponse(result).getCode());
assertEquals(SUCCESS.getCode(), JSONObject.fromObject(content).getInt(Code));
assertEquals(MD5Util.getMD5("aaabbbccc"), userMapper.getPwd(email)); assertEquals(MD5Util.getMD5("aaabbbccc"), userMapper.getPwd(email));
}); });
} }

View File

@@ -1,25 +1,29 @@
package cn.celess.blog.controller; package cn.celess.blog.controller;
import cn.celess.blog.BaseTest; import cn.celess.blog.BaseTest;
import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.model.PageData; import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.model.VisitorModel; import cn.celess.blog.entity.model.VisitorModel;
import com.github.pagehelper.PageInfo; import com.fasterxml.jackson.core.type.TypeReference;
import net.sf.json.JSONObject;
import org.junit.Test; import org.junit.Test;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import static cn.celess.blog.enmu.ResponseEnum.SUCCESS;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static cn.celess.blog.enmu.ResponseEnum.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
public class VisitorControllerTest extends BaseTest { public class VisitorControllerTest extends BaseTest {
private final TypeReference<?> VISITOR_PAGE_TYPE = new TypeReference<Response<PageData<VisitorModel>>>() {
};
private final TypeReference<?> VISITOR_TYPE = new TypeReference<Response<VisitorModel>>() {
};
@Test @Test
public void getVisitorCount() throws Exception { public void getVisitorCount() throws Exception {
mockMvc.perform(get("/visitor/count")).andDo(result -> { getMockData(get("/visitor/count")).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); Response<Object> response = getResponse(result);
assertEquals(SUCCESS.getCode(), object.getInt(Code)); assertEquals(SUCCESS.getCode(), response.getCode());
assertTrue(object.containsKey(Result)); assertNotNull(response.getResult());
}); });
} }
@@ -27,29 +31,28 @@ public class VisitorControllerTest extends BaseTest {
public void page() throws Exception { public void page() throws Exception {
int count = 10; int count = 10;
int page = 1; int page = 1;
mockMvc.perform(get("/admin/visitor/page?count=" + count + "&page=" + page).header("Authorization", adminLogin())) // 默认显示location
.andDo(result -> { getMockData(get("/admin/visitor/page?count=" + count + "&page=" + page), adminLogin()).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); Response<PageData<VisitorModel>> response = getResponse(result, VISITOR_PAGE_TYPE);
assertEquals(SUCCESS.getCode(), object.getInt(Code)); assertEquals(SUCCESS.getCode(), response.getCode());
JSONObject resultJson = JSONObject.fromObject(object.getJSONObject(Result)); PageData<VisitorModel> pageData = response.getResult();
PageData<VisitorModel> pageData = (PageData<VisitorModel>) JSONObject.toBean(resultJson, PageData.class);
assertNotEquals(0, pageData.getTotal()); assertNotEquals(0, pageData.getTotal());
assertEquals(1, pageData.getPageNum()); assertEquals(1, pageData.getPageNum());
assertEquals(10, pageData.getPageSize()); assertEquals(10, pageData.getPageSize());
for (Object ver : pageData.getList()) { for (VisitorModel v : pageData.getList()) {
VisitorModel v = (VisitorModel) JSONObject.toBean(JSONObject.fromObject(ver), VisitorModel.class);
assertNotEquals(0, v.getId()); assertNotEquals(0, v.getId());
assertNotNull(v.getDate()); assertNotNull(v.getDate());
assertNotNull(v.getLocation());
} }
}); });
} }
@Test @Test
public void add() throws Exception { public void add() throws Exception {
mockMvc.perform(post("/visit")).andDo(MockMvcResultHandlers.print()).andDo(result -> { getMockData(post("/visit")).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); Response<VisitorModel> response = getResponse(result, VISITOR_TYPE);
assertEquals(SUCCESS.getCode(), object.getInt(Code)); assertEquals(SUCCESS.getCode(), response.getCode());
VisitorModel visitorModel = (VisitorModel) JSONObject.toBean(object.getJSONObject(Result), VisitorModel.class); VisitorModel visitorModel = response.getResult();
assertNotEquals(0, visitorModel.getId()); assertNotEquals(0, visitorModel.getId());
assertNotNull(visitorModel.getIp()); assertNotNull(visitorModel.getIp());
}); });
@@ -57,26 +60,26 @@ public class VisitorControllerTest extends BaseTest {
@Test @Test
public void dayVisitCount() throws Exception { public void dayVisitCount() throws Exception {
mockMvc.perform(get("/dayVisitCount")).andDo(MockMvcResultHandlers.print()).andDo(result -> getMockData(get("/dayVisitCount")).andDo(result -> assertEquals(SUCCESS.getCode(), getResponse(result).getCode()));
assertEquals(SUCCESS.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code))
);
} }
// 手动测试 // 手动测试
// @Test // @Test
public void ipLocation() throws Exception { public void ipLocation() throws Exception {
String ip = "127.0.0.1"; String ip = "127.0.0.1";
mockMvc.perform(get("/ip/" + ip)).andDo(MockMvcResultHandlers.print()).andDo(result -> { getMockData(get("/ip/" + ip)).andDo(result -> {
assertEquals(SUCCESS.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code)); Response<Object> response = getResponse(result);
assertTrue(JSONObject.fromObject(result.getResponse().getContentAsString()).containsKey(Result)); assertEquals(SUCCESS.getCode(), response.getCode());
assertNotNull(response.getResult());
}); });
} }
@Test @Test
public void getIp() throws Exception { public void getIp() throws Exception {
mockMvc.perform(get("/ip")).andDo(MockMvcResultHandlers.print()).andDo(result -> { getMockData(get("/ip")).andDo(result -> {
assertEquals(SUCCESS.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code)); Response<String> response = getResponse(result, STRING_TYPE);
assertEquals("127.0.0.1", JSONObject.fromObject(result.getResponse().getContentAsString()).getString(Result)); assertEquals(SUCCESS.getCode(), response.getCode());
assertEquals("127.0.0.1", response.getResult());
}); });
} }
} }

View File

@@ -1,35 +1,46 @@
package cn.celess.blog.controller; package cn.celess.blog.controller;
import cn.celess.blog.BaseTest; import cn.celess.blog.BaseTest;
import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.WebUpdate; import cn.celess.blog.entity.WebUpdate;
import cn.celess.blog.entity.model.PageData; import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.model.WebUpdateModel; import cn.celess.blog.entity.model.WebUpdateModel;
import cn.celess.blog.mapper.WebUpdateInfoMapper; import cn.celess.blog.mapper.WebUpdateInfoMapper;
import net.sf.json.JSONArray; import com.fasterxml.jackson.core.type.TypeReference;
import net.sf.json.JSONObject; import lombok.extern.slf4j.Slf4j;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.UUID;
import static cn.celess.blog.enmu.ResponseEnum.*; import static cn.celess.blog.enmu.ResponseEnum.DATA_NOT_EXIST;
import static cn.celess.blog.enmu.ResponseEnum.SUCCESS;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
@Slf4j
public class WebUpdateInfoControllerTest extends BaseTest { public class WebUpdateInfoControllerTest extends BaseTest {
private final TypeReference<?> MODAL_TYPE = new TypeReference<Response<WebUpdateModel>>() {
};
private final TypeReference<?> MODAL_LIST_TYPE = new TypeReference<Response<List<WebUpdateModel>>>() {
};
private final TypeReference<?> MODAL_PAGE_TYPE = new TypeReference<Response<PageData<WebUpdateModel>>>() {
};
@Autowired @Autowired
WebUpdateInfoMapper mapper; WebUpdateInfoMapper mapper;
@Test @Test
public void create() throws Exception { public void create() throws Exception {
String info = UUID.randomUUID().toString(); String info = randomStr();
mockMvc.perform(post("/admin/webUpdate/create?info=" + info).header("Authorization", adminLogin())).andDo(result -> { getMockData(post("/admin/webUpdate/create?info=" + info), adminLogin()).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); Response<WebUpdateModel> response = getResponse(result, MODAL_TYPE);
assertEquals(SUCCESS.getCode(), object.getInt(Code)); assertEquals(SUCCESS.getCode(), response.getCode());
assertTrue(object.containsKey(Result)); assertNotNull(response.getResult());
WebUpdateModel webUpdateModel = (WebUpdateModel) JSONObject.toBean(object.getJSONObject(Result), WebUpdateModel.class); WebUpdateModel webUpdateModel = response.getResult();
assertEquals(info, webUpdateModel.getInfo()); assertEquals(info, webUpdateModel.getInfo());
assertNotNull(webUpdateModel.getTime()); assertNotNull(webUpdateModel.getTime());
assertNotEquals(0, webUpdateModel.getId()); assertNotEquals(0, webUpdateModel.getId());
@@ -40,7 +51,7 @@ public class WebUpdateInfoControllerTest extends BaseTest {
public void del() throws Exception { public void del() throws Exception {
// 新增数据 // 新增数据
WebUpdate webUpdate = new WebUpdate(); WebUpdate webUpdate = new WebUpdate();
webUpdate.setUpdateInfo(UUID.randomUUID().toString()); webUpdate.setUpdateInfo(randomStr());
webUpdate.setUpdateTime(new Date()); webUpdate.setUpdateTime(new Date());
mapper.insert(webUpdate); mapper.insert(webUpdate);
// 接口测试 // 接口测试
@@ -49,32 +60,31 @@ public class WebUpdateInfoControllerTest extends BaseTest {
assertNotEquals(0, update.getId()); assertNotEquals(0, update.getId());
long id = update.getId(); long id = update.getId();
mockMvc.perform(delete("/admin/webUpdate/del/" + id).header("Authorization", adminLogin())).andDo(result -> { getMockData(delete("/admin/webUpdate/del/" + id), adminLogin()).andDo(result -> {
assertEquals(SUCCESS.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code)); Response<Object> response = getResponse(result);
assertTrue(JSONObject.fromObject(result.getResponse().getContentAsString()).getBoolean(Result)); assertEquals(SUCCESS.getCode(), response.getCode());
assertNotNull(response.getResult());
}); });
do { do {
id += 2; id += 2;
} while (mapper.existsById(id)); } while (mapper.existsById(id));
System.out.println("准备删除ID=" + id + "的不存在记录"); log.debug("准备删除ID={}的不存在记录", id);
mockMvc.perform(delete("/admin/webUpdate/del/" + id).header("Authorization", adminLogin())).andDo(result -> getMockData(delete("/admin/webUpdate/del/" + id), adminLogin()).andDo(result -> assertEquals(DATA_NOT_EXIST.getCode(), getResponse(result).getCode()));
assertEquals(DATA_NOT_EXIST.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code))
);
} }
@Test @Test
public void update() throws Exception { public void update() throws Exception {
// 新增数据 // 新增数据
WebUpdate webUpdate = new WebUpdate(); WebUpdate webUpdate = new WebUpdate();
webUpdate.setUpdateInfo(UUID.randomUUID().toString()); webUpdate.setUpdateInfo(randomStr());
webUpdate.setUpdateTime(new Date()); webUpdate.setUpdateTime(new Date());
mapper.insert(webUpdate); mapper.insert(webUpdate);
List<WebUpdate> all = mapper.findAll(); List<WebUpdate> all = mapper.findAll();
WebUpdate update = all.get(all.size() - 1); WebUpdate update = all.get(all.size() - 1);
assertNotEquals(0, update.getId()); assertNotEquals(0, update.getId());
assertNotNull(update.getUpdateInfo()); assertNotNull(update.getUpdateInfo());
String info = UUID.randomUUID().toString(); String info = randomStr();
mockMvc.perform(put("/admin/webUpdate/update?id=" + update.getId() + "&info=" + info).header("Authorization", adminLogin())).andDo(result -> { getMockData(put("/admin/webUpdate/update?id=" + update.getId() + "&info=" + info), adminLogin()).andDo(result -> {
List<WebUpdate> list = mapper.findAll(); List<WebUpdate> list = mapper.findAll();
WebUpdate up = list.get(list.size() - 1); WebUpdate up = list.get(list.size() - 1);
assertEquals(update.getId(), up.getId()); assertEquals(update.getId(), up.getId());
@@ -85,12 +95,12 @@ public class WebUpdateInfoControllerTest extends BaseTest {
@Test @Test
public void findAll() throws Exception { public void findAll() throws Exception {
mockMvc.perform(get("/webUpdate")).andDo(result -> { getMockData(get("/webUpdate")).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); Response<List<WebUpdateModel>> response = getResponse(result, MODAL_LIST_TYPE);
assertEquals(SUCCESS.getCode(), object.getInt(Code)); assertEquals(SUCCESS.getCode(), response.getCode());
JSONArray jsonArray = object.getJSONArray(Result); assertNotNull(response.getResult());
jsonArray.forEach(o -> { assertNotEquals(0, response.getResult());
WebUpdateModel webUpdate = (WebUpdateModel) JSONObject.toBean(JSONObject.fromObject(o), WebUpdateModel.class); response.getResult().forEach(webUpdate -> {
assertNotEquals(0, webUpdate.getId()); assertNotEquals(0, webUpdate.getId());
assertNotNull(webUpdate.getTime()); assertNotNull(webUpdate.getTime());
assertNotNull(webUpdate.getInfo()); assertNotNull(webUpdate.getInfo());
@@ -100,15 +110,14 @@ public class WebUpdateInfoControllerTest extends BaseTest {
@Test @Test
public void page() throws Exception { public void page() throws Exception {
mockMvc.perform(get("/webUpdate/pages?page=1&count=10")).andDo(result -> { getMockData(get("/webUpdate/pages?page=1&count=10")).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); Response<PageData<WebUpdateModel>> response = getResponse(result, MODAL_PAGE_TYPE);
assertEquals(SUCCESS.getCode(), object.getInt(Code)); assertEquals(SUCCESS.getCode(), response.getCode());
assertNotNull(object.getJSONObject(Result)); assertNotNull(response.getResult());
PageData<WebUpdateModel> pageData = (PageData<WebUpdateModel>) JSONObject.toBean(object.getJSONObject(Result), PageData.class); PageData<WebUpdateModel> pageData = response.getResult();
assertEquals(1, pageData.getPageNum()); assertEquals(1, pageData.getPageNum());
assertEquals(10, pageData.getPageSize()); assertEquals(10, pageData.getPageSize());
for (Object o : pageData.getList()) { for (WebUpdateModel model : pageData.getList()) {
WebUpdateModel model = (WebUpdateModel) JSONObject.toBean(JSONObject.fromObject(o), WebUpdateModel.class);
assertNotEquals(0, model.getId()); assertNotEquals(0, model.getId());
assertNotNull(model.getTime()); assertNotNull(model.getTime());
assertNotNull(model.getInfo()); assertNotNull(model.getInfo());
@@ -118,7 +127,6 @@ public class WebUpdateInfoControllerTest extends BaseTest {
@Test @Test
public void lastestUpdateTime() throws Exception { public void lastestUpdateTime() throws Exception {
mockMvc.perform(get("/lastestUpdate")).andDo(result -> getMockData(get("/lastestUpdate")).andDo(result -> assertEquals(SUCCESS.getCode(), getResponse(result).getCode()));
assertEquals(SUCCESS.getCode(), JSONObject.fromObject(result.getResponse().getContentAsString()).getInt(Code)));
} }
} }

View File

@@ -0,0 +1,36 @@
package cn.celess.blog.enmu;
import cn.celess.blog.BaseTest;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;
import java.io.IOException;
import static org.junit.Assert.*;
public class UserAccountStatusEnumTest extends BaseTest {
@Test
public void get() {
assertEquals(UserAccountStatusEnum.NORMAL, UserAccountStatusEnum.get(0));
assertEquals(UserAccountStatusEnum.LOCKED, UserAccountStatusEnum.get(1));
assertEquals(UserAccountStatusEnum.DELETED, UserAccountStatusEnum.get(2));
}
@Test
public void toJson() throws JsonProcessingException {
// 序列化
ObjectMapper objectMapper = new ObjectMapper();
assertEquals("{\"code\":0,\"desc\":\"正常\"}", objectMapper.writeValueAsString(UserAccountStatusEnum.NORMAL));
}
@Test
public void testGet() throws IOException {
// 反序列化
ObjectMapper mapper = new ObjectMapper();
UserAccountStatusEnum userAccountStatusEnum = mapper.readValue(mapper.writeValueAsString(UserAccountStatusEnum.NORMAL), UserAccountStatusEnum.class);
assertEquals(UserAccountStatusEnum.NORMAL.getCode(), userAccountStatusEnum.getCode());
assertEquals(UserAccountStatusEnum.NORMAL.getDesc(), userAccountStatusEnum.getDesc());
}
}

View File

@@ -1,12 +1,12 @@
package cn.celess.blog.filter; package cn.celess.blog.filter;
import cn.celess.blog.BaseTest; import cn.celess.blog.BaseTest;
import net.sf.json.JSONObject; import cn.celess.blog.entity.Response;
import org.junit.Test; import org.junit.Test;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.junit.Assert.*;
import static cn.celess.blog.enmu.ResponseEnum.*; import static cn.celess.blog.enmu.ResponseEnum.*;
import static org.junit.Assert.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
/** /**
* @Author: 小海 * @Author: 小海
@@ -17,60 +17,37 @@ public class AuthorizationFilter extends BaseTest {
@Test @Test
public void UserAccess() throws Exception { public void UserAccess() throws Exception {
String token = "";
// 未登录 // 未登录
mockMvc.perform(get("/user/userInfo").header("Authorization", token)).andDo(result -> { getMockData(get("/user/userInfo")).andDo(result -> assertEquals(HAVE_NOT_LOG_IN.getCode(), getResponse(result).getCode()));
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); // user权限登录
assertEquals(HAVE_NOT_LOG_IN.getCode(), object.getInt(Code)); getMockData(get("/user/userInfo"), userLogin()).andDo(result -> assertEquals(SUCCESS.getCode(), getResponse(result).getCode()));
});
token = userLogin();
mockMvc.perform(get("/user/userInfo").header("Authorization", token)).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(SUCCESS.getCode(), object.getInt(Code));
});
} }
@Test @Test
public void AdminAccess() throws Exception { public void AdminAccess() throws Exception {
String token = "";
// 未登录 // 未登录
mockMvc.perform(get("/admin/articles?page=1&count=1").header("Authorization", token)).andDo(result -> { getMockData(get("/admin/articles?page=1&count=1")).andDo(result -> assertEquals(HAVE_NOT_LOG_IN.getCode(), getResponse(result).getCode()));
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); // user权限
assertEquals(HAVE_NOT_LOG_IN.getCode(), object.getInt(Code)); getMockData(get("/admin/articles?page=1&count=1"), userLogin()).andDo(result -> assertEquals(PERMISSION_ERROR.getCode(), getResponse(result).getCode()));
}); // admin 权限
token = userLogin(); getMockData(get("/admin/articles?page=1&count=1"), adminLogin()).andDo(result -> assertEquals(SUCCESS.getCode(), getResponse(result).getCode()));
mockMvc.perform(get("/admin/articles?page=1&count=1").header("Authorization", token)).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(PERMISSION_ERROR.getCode(), object.getInt(Code));
});
token = adminLogin();
mockMvc.perform(get("/admin/articles?page=1&count=1").header("Authorization", token)).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(SUCCESS.getCode(), object.getInt(Code));
});
} }
@Test @Test
public void VisitorAccess() throws Exception { public void VisitorAccess() throws Exception {
mockMvc.perform(get("/user/userInfo")).andDo(result -> { getMockData(get("/user/userInfo")).andDo(result -> assertEquals(HAVE_NOT_LOG_IN.getCode(), getResponse(result).getCode()));
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); getMockData(get("/admin/articles?page=1&count=1")).andDo(result -> assertEquals(HAVE_NOT_LOG_IN.getCode(), getResponse(result).getCode()));
assertEquals(HAVE_NOT_LOG_IN.getCode(), object.getInt(Code));
});
mockMvc.perform(get("/admin/articles?page=1&count=1")).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString());
assertEquals(HAVE_NOT_LOG_IN.getCode(), object.getInt(Code));
});
} }
@Test @Test
public void authorizationTest() throws Exception { public void authorizationTest() throws Exception {
// 测试response中有无Authorization字段 // 测试response中有无Authorization字段
String s = userLogin(); String token = userLogin();
mockMvc.perform(get("/user/userInfo").header("Authorization", s)).andDo(result -> { getMockData(get("/user/userInfo"), token).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); Response<Object> response = getResponse(result);
assertEquals(SUCCESS.getCode(), object.getInt(Code)); assertEquals(SUCCESS.getCode(), response.getCode());
assertNotNull(result.getResponse().getHeader("Authorization")); assertNotNull(result.getResponse().getHeader("Authorization"));
assertNotEquals(s, result.getResponse().getHeader("Authorization")); assertNotEquals(token, result.getResponse().getHeader("Authorization"));
}); });
} }
} }

View File

@@ -2,16 +2,11 @@ package cn.celess.blog.filter;
import cn.celess.blog.BaseTest; import cn.celess.blog.BaseTest;
import cn.celess.blog.enmu.ResponseEnum; import cn.celess.blog.enmu.ResponseEnum;
import net.sf.json.JSONObject; import cn.celess.blog.entity.Response;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.mock.web.MockHttpSession; import org.springframework.mock.web.MockHttpSession;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import javax.servlet.http.Cookie;
/** /**
* @Author: 小海 * @Author: 小海
@@ -31,11 +26,11 @@ public class MultipleSubmitFilter extends BaseTest {
private void sendRequest(ResponseEnum expectResponse, String... msg) throws Exception { private void sendRequest(ResponseEnum expectResponse, String... msg) throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/counts").session(session)).andDo(result -> { getMockData(MockMvcRequestBuilders.get("/counts").session(session)).andDo(result -> {
JSONObject object = JSONObject.fromObject(result.getResponse().getContentAsString()); Response<Object> response = getResponse(result);
Assert.assertEquals(expectResponse.getCode(), object.getInt(Code)); Assert.assertEquals(expectResponse.getCode(), response.getCode());
if (msg.length != 0) { if (msg.length != 0) {
Assert.assertEquals(msg[0], object.getString("msg")); Assert.assertEquals(msg[0], response.getMsg());
} }
}); });
} }

View File

@@ -6,7 +6,6 @@ import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import java.util.List; import java.util.List;
import java.util.UUID;
import static org.junit.Assert.*; import static org.junit.Assert.*;
@@ -37,7 +36,7 @@ public class ArticleMapperTest extends BaseTest {
@Test @Test
public void update() { public void update() {
Article article = generateArticle().getArticle(); Article article = generateArticle().getArticle();
String randomText = UUID.randomUUID().toString(); String randomText = randomStr();
// 此字段不会通过insert被写入数据库而是使用插入数据的默认值 数据库中该字段默认为true // 此字段不会通过insert被写入数据库而是使用插入数据的默认值 数据库中该字段默认为true
article.setOpen(true); article.setOpen(true);
@@ -117,7 +116,7 @@ public class ArticleMapperTest extends BaseTest {
public void existsByTitle() { public void existsByTitle() {
Article article = generateArticle().getArticle(); Article article = generateArticle().getArticle();
assertTrue(articleMapper.existsByTitle(article.getTitle())); assertTrue(articleMapper.existsByTitle(article.getTitle()));
assertFalse(articleMapper.existsByTitle(UUID.randomUUID().toString())); assertFalse(articleMapper.existsByTitle(randomStr()));
} }
@Test @Test
@@ -196,7 +195,7 @@ public class ArticleMapperTest extends BaseTest {
} }
private ArticleTag generateArticle() { private ArticleTag generateArticle() {
String randomText = UUID.randomUUID().toString(); String randomText = randomStr();
Article article = new Article(); Article article = new Article();
Category category = new Category(); Category category = new Category();

View File

@@ -5,9 +5,7 @@ import cn.celess.blog.entity.*;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.UUID;
import static org.junit.Assert.*; import static org.junit.Assert.*;
@@ -75,10 +73,8 @@ public class ArticleTagMapperTest extends BaseTest {
@Test @Test
public void deleteMultiById() { public void deleteMultiById() {
ArticleTag articleTag = new ArticleTag(); ArticleTag articleTag = new ArticleTag();
Article article = new Article(); Article article = articleMapper.getLastestArticle();
article.setId(-1L); Tag tag = tagMapper.getLastestTag();
Tag tag = new Tag();
tag.setId(1L);
articleTag.setArticle(article); articleTag.setArticle(article);
articleTag.setTag(tag); articleTag.setTag(tag);
@@ -89,7 +85,7 @@ public class ArticleTagMapperTest extends BaseTest {
articleTagMapper.insert(articleTag); articleTagMapper.insert(articleTag);
articleTagMapper.insert(articleTag); articleTagMapper.insert(articleTag);
List<ArticleTag> allByArticleId = articleTagMapper.findAllByArticleId(-1L); List<ArticleTag> allByArticleId = articleTagMapper.findAllByArticleId(article.getId());
assertTrue(allByArticleId.size() >= 6); assertTrue(allByArticleId.size() >= 6);
int lines = articleTagMapper.deleteMultiById(allByArticleId); int lines = articleTagMapper.deleteMultiById(allByArticleId);
assertTrue(lines >= 6); assertTrue(lines >= 6);
@@ -113,7 +109,7 @@ public class ArticleTagMapperTest extends BaseTest {
} }
private ArticleTag generateArticle() { private ArticleTag generateArticle() {
String randomText = UUID.randomUUID().toString(); String randomText = randomStr();
Article article = new Article(); Article article = new Article();
Category category = new Category(); Category category = new Category();
@@ -138,4 +134,13 @@ public class ArticleTagMapperTest extends BaseTest {
return articleTag; return articleTag;
} }
@Test
public void findTagByArticleId() {
Article article = articleMapper.findAll().get(0);
assertNotNull(article);
List<Tag> tagByArticleId = articleTagMapper.findTagByArticleId(article.getId());
assertNotEquals(0, tagByArticleId.size());
}
} }

View File

@@ -5,7 +5,6 @@ import cn.celess.blog.entity.Category;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;

View File

@@ -35,7 +35,7 @@ public class PartnerMapperTest extends BaseTest {
partnerSite.setIconPath(randomStr(5)); partnerSite.setIconPath(randomStr(5));
partnerSite.setDesc(randomStr(5)); partnerSite.setDesc(randomStr(5));
partnerSite.setOpen(false); partnerSite.setOpen(false);
partnerSite.setUrl("www.celess.cn?random=" + randomStr(4)); partnerSite.setUrl("www.celess.cn/?random=" + randomStr(4));
assertEquals(1, partnerMapper.update(partnerSite)); assertEquals(1, partnerMapper.update(partnerSite));
} }

View File

@@ -7,7 +7,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import java.util.Date; import java.util.Date;
import static org.junit.Assert.*; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
public class VisitorMapperTest extends BaseTest { public class VisitorMapperTest extends BaseTest {

View File

@@ -0,0 +1,52 @@
package cn.celess.blog.service;
import cn.celess.blog.BaseTest;
import cn.celess.blog.entity.model.ArticleModel;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.mapper.ArticleMapper;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import static org.junit.Assert.*;
public class ArticleServiceTest extends BaseTest {
@Autowired
ArticleService articleService;
@Autowired
ArticleMapper articleMapper;
@Test
public void adminArticles() {
// 测deleted参数传值
PageData<ArticleModel> pageData = articleService.adminArticles(10, 1, true);
assertTrue(pageData.getList().stream().allMatch(ArticleModel::isDeleted));
pageData = articleService.adminArticles(10, 1, false);
assertFalse(pageData.getList().stream().allMatch(ArticleModel::isDeleted));
pageData = articleService.adminArticles(10, 1, null);
assertTrue(pageData.getList().stream().anyMatch(ArticleModel::isDeleted));
assertTrue(pageData.getList().stream().anyMatch(articleModel -> !articleModel.isDeleted()));
}
@Test
public void retrievePageForOpen() {
PageData<ArticleModel> articleModelPageData = articleService.retrievePageForOpen(10, 1);
assertEquals(10, articleModelPageData.getPageSize());
assertEquals(1, articleModelPageData.getPageNum());
assertEquals(10, articleModelPageData.getList().size());
articleModelPageData.getList().forEach(Assert::assertNotNull);
// 测试open字段
articleModelPageData.getList().forEach(articleModel -> {
// 当前文章
assertTrue(articleMapper.findArticleById(articleModel.getId()).getOpen());
if (articleModel.getPreArticle() != null) {
assertTrue(articleMapper.findArticleById(articleModel.getPreArticle().getId()).getOpen());
}
if (articleModel.getNextArticle() != null) {
assertTrue(articleMapper.findArticleById(articleModel.getNextArticle().getId()).getOpen());
}
});
}
}

View File

@@ -0,0 +1,32 @@
package cn.celess.blog.service;
import cn.celess.blog.BaseTest;
import cn.celess.blog.entity.PartnerSite;
import cn.celess.blog.entity.model.PageData;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
import java.util.stream.Stream;
import static org.junit.Assert.*;
public class PartnerSiteServiceTest extends BaseTest {
@Autowired
PartnerSiteService partnerSiteService;
@Test
public void partnerSitePages() {
// 测试deleted 参数
PageData<PartnerSite> pageData = partnerSiteService.partnerSitePages(1, 10, true);
assertTrue(pageData.getList().stream().allMatch(PartnerSite::getDelete));
pageData = partnerSiteService.partnerSitePages(1, 10, false);
assertTrue(pageData.getList().stream().noneMatch(PartnerSite::getDelete));
pageData = partnerSiteService.partnerSitePages(1, 10, null);
List<PartnerSite> list = pageData.getList();
assertNotEquals(0, list.stream().filter(PartnerSite::getDelete).count());
assertNotEquals(0, list.stream().filter(partnerSite -> !partnerSite.getDelete()).count());
}
}

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