a7TE$BljC?cbk
z$n7QMWpF_)f{cN67(WGmx)#4c;yF3Y&qKOpXDdxZ4=Mo7P#i76Ud+dAV|
zW8)mEbY5%gjN_1vbA6@rh^;e@Q8vyEmChS%opJoKaSm5HkJ>up*oM7dxg{GboyTpQ
zRciSJ#>TPFhNP*Iv?+v6Eu3~#*|`gTE_}|T
zFerc7p0ci1N>!jVr70=zwx@K~N~ublrd%Z{@3E(J)k>*~qNZFUDetwXbk|C$%BiMY
zD=GKbQ+jHpRE1bmUM(p(O}SoDe%hYWS1Y9|{+e=wr2LFMrN356b!^a-
z*GbCH(tUQJ9;lU49XK@QMoIZA_LRX|Db-O$Q;ti@z4nx$S}D~bM^j!eDet$Ztgn?)
z9gj5S4U+N!`c=DU*-$H`I#_AS2}!xno-$l3r8<&n%59SJLHZok$u!I7!eVl3WXd|K
zJU3M*H$Kb>dI)HBrgGzWcQbnQARopcDjh$J&PVJAYpQiHJ`a`;b}L0ogWXyj?DOc{
zU##_6YDAl8Zs9wE$NSu3lVyxcYGo;2M09B1Dx1
z#CodSSUgqYJAsM-=MV662(KagmMs1vxtvFqe2s?oldJB?lCRRx_)_q`Pd1@6Z(0gr
zI+uN&0*3Q7YCKHAWrp(vT~WL3BpPBD&s^cX#kP1Nf6
z1U-S5CI>|vDLRP0I$G?A(;;Y1y4Ep9Ux4PKamNPwHE3>1I4+|np?N6n=%-(Y=A{Q5
z4*DWAA3ZGIqQlVqbV7WWo`M#j)8bq78_3udJ)v*0`~RU9^8aH<$xi-isuCf-uHf%PaF;I5fE;=b
zOO27CN2e)=P5
ze)>MWNq-D2KtDn%_!DSB(T45+r_e%T1>`qz)r&Di{GUN<5Yw35pF<0aJMo?EThJQC
zWB7RW7torJ(Aw!Qp*8bncTLj3JLqs?vkQR@jz6P%2U9P#9o*4Mt^%Ndah7*!nA-v?
zAuD?|*i#NJ;cX1s#arc4^0K#SN1vTz$@g8&+TH&y?j?o`Av8(g-APJ3?*YGdN;)0OrSLXcL{H9fv;`+FrErn*-tbUyRoKZvX%Q
literal 0
HcmV?d00001
diff --git a/newland-blog/newland-blog-api/target/classes/com/newland/blog/entities/Category.class b/newland-blog/newland-blog-api/target/classes/com/newland/blog/entities/Category.class
new file mode 100644
index 0000000000000000000000000000000000000000..265b0d359f7a783e532bee228afc86d665024aa4
GIT binary patch
literal 6120
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
literal 0
HcmV?d00001
diff --git a/newland-blog/newland-blog-api/target/classes/com/newland/blog/entities/Replay.class b/newland-blog/newland-blog-api/target/classes/com/newland/blog/entities/Replay.class
new file mode 100644
index 0000000000000000000000000000000000000000..398e9ea958ef20df3d4d463d047b608315316aee
GIT binary patch
literal 7209
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
VCH#Rtp!Z3o-(Va9^tZSU{s#fI)K&lh
literal 0
HcmV?d00001
diff --git a/newland-blog/newland-blog-article/pom.xml b/newland-blog/newland-blog-article/pom.xml
new file mode 100644
index 0000000..37e9efd
--- /dev/null
+++ b/newland-blog/newland-blog-article/pom.xml
@@ -0,0 +1,61 @@
+
+
+
+ newland-blog
+ com.newland
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ newland-blog-article
+
+
+
+
+ com.newland
+ newland-blog-api
+ 1.0-SNAPSHOT
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ org.springframework.boot
+ spring-boot-devtools
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
\ No newline at end of file
diff --git a/newland-blog/newland-blog-article/src/main/java/com/newland/blog/ArticleApplication.java b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/ArticleApplication.java
new file mode 100644
index 0000000..b66cd03
--- /dev/null
+++ b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/ArticleApplication.java
@@ -0,0 +1,16 @@
+package com.newland.blog;
+
+import com.spring4all.swagger.EnableSwagger2Doc;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+
+@EnableDiscoveryClient
+@EnableSwagger2Doc
+@SpringBootApplication
+public class ArticleApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ArticleApplication.class, args);
+ }
+}
diff --git a/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/api/ApiAdvertController.java b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/api/ApiAdvertController.java
new file mode 100644
index 0000000..f86ecf5
--- /dev/null
+++ b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/api/ApiAdvertController.java
@@ -0,0 +1,29 @@
+package com.newland.blog.article.api;
+
+import com.newland.blog.article.service.IAdvertService;
+import com.newland.blog.util.base.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Api(value = "广告管理API接口", description = "广告管理API接口,不需要通过身份认证就可以访问下面的接口")
+@RestController
+@RequestMapping("/api/advert")
+public class ApiAdvertController {
+
+ @Autowired
+ private IAdvertService advertService;
+
+ @ApiImplicitParam(name = "position", value = "广告位置编号", required = true)
+ @ApiOperation("查询指定广告查询的所有广告信息(状态为正常的)")
+ @GetMapping("/show/{position}")
+ public Result show(@PathVariable("position") int position) {
+ return advertService.findByPosition(position);
+ }
+
+}
diff --git a/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/api/ApiArticleController.java b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/api/ApiArticleController.java
new file mode 100644
index 0000000..841a45f
--- /dev/null
+++ b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/api/ApiArticleController.java
@@ -0,0 +1,39 @@
+package com.newland.blog.article.api;
+
+import com.newland.blog.article.req.ArticleListREQ;
+import com.newland.blog.article.service.IArticleService;
+import com.newland.blog.util.base.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@Api(value = "文章管理API接口", description = "文章管理API接口,不需要通过身份认证就可以访问下面的接口")
+@RestController
+@RequestMapping("/api/article")
+public class ApiArticleController {
+
+ @Autowired
+ private IArticleService articleService;
+
+ @ApiOperation("查询文章详情接口")
+ @ApiImplicitParam(name = "id", value = "文章ID", required = true)
+ @GetMapping("/{id}") // localhost:8001/article/api/article/xxx
+ public Result view(@PathVariable String id) {
+ return articleService.findArticleAndLabelById(id);
+ }
+
+ @ApiImplicitParam(name = "id", value = "文章ID", required = true)
+ @ApiOperation("更新文章浏览次数")
+ @PutMapping("/viewCount/{id}") // /api/article/viewCount/{id}
+ public Result updateViewCount(@PathVariable("id") String id) {
+ return articleService.updateViewCount(id);
+ }
+
+ @ApiOperation("公开且已审核的文章列表接口")
+ @PostMapping("/list") // /api/article/list
+ public Result list(@RequestBody ArticleListREQ req) {
+ return articleService.findListByLabelIdOrCategoryId(req);
+ }
+}
diff --git a/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/api/ApiCategoryController.java b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/api/ApiCategoryController.java
new file mode 100644
index 0000000..d69f4d5
--- /dev/null
+++ b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/api/ApiCategoryController.java
@@ -0,0 +1,36 @@
+package com.newland.blog.article.api;
+
+import com.newland.blog.article.service.ICategoryService;
+import com.newland.blog.util.base.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 此控制层接口,不需要通过身份认证就可以调用到
+ */
+@Api(value = "分类管理API接口", description = "分类管理API接口,不需要通过身份认证就可以直接访问")
+@RestController
+@RequestMapping("/api/category")
+public class ApiCategoryController {
+
+ @Autowired
+ private ICategoryService categoryService;
+
+ @ApiOperation("获取所有正常状态的分类-公开API接口")
+ @GetMapping("/list") // 请求 localhost:8001/article/api/category/list
+ public Result list() {
+ return categoryService.findAllNormal();
+ }
+
+ @ApiOperation("查询正常状态的分类及分类下的所有标签-公开API接口")
+ @GetMapping("/label/list") // localhost:8001/article/api/category/label/list
+ public Result findCategoryAndLabel() {
+ return categoryService.findCategoryAndLabel();
+ }
+
+
+}
diff --git a/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/api/ApiCommentController.java b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/api/ApiCommentController.java
new file mode 100644
index 0000000..1a7278b
--- /dev/null
+++ b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/api/ApiCommentController.java
@@ -0,0 +1,29 @@
+package com.newland.blog.article.api;
+
+import com.newland.blog.article.service.ICommentService;
+import com.newland.blog.util.base.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Api(value = "评论管理API接口", description = "评论管理API接口,不需要通过身份认证就可以访问下面的接口")
+@RestController
+@RequestMapping("/api/comment")
+public class ApiCommentController {
+
+ @Autowired
+ private ICommentService commentService;
+
+ @ApiOperation("通过文章ID递归查询所有评论")
+ @ApiImplicitParam(name = "articleId", value = "文章ID", required = true)
+ @GetMapping("/list/{articleId}") // get 方式 /article/api/comment/list/1
+ public Result findByArticleId(@PathVariable("articleId") String articleId) {
+ return commentService.findByArticleId(articleId);
+ }
+
+}
diff --git a/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/config/MyBatisPlusConfig.java b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/config/MyBatisPlusConfig.java
new file mode 100644
index 0000000..48be83d
--- /dev/null
+++ b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/config/MyBatisPlusConfig.java
@@ -0,0 +1,23 @@
+package com.newland.blog.article.config;
+
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@EnableTransactionManagement // 开启事务管理
+@MapperScan("com.newland.blog.article.mapper") // 扫描mapper接口
+@Configuration
+public class MyBatisPlusConfig {
+
+ /**
+ * 分页插件
+ * @return
+ */
+ @Bean
+ public PaginationInterceptor paginationInterceptor() {
+ return new PaginationInterceptor();
+ }
+
+}
diff --git a/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/controller/AdvertController.java b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/controller/AdvertController.java
new file mode 100644
index 0000000..b1557f1
--- /dev/null
+++ b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/controller/AdvertController.java
@@ -0,0 +1,66 @@
+package com.newland.blog.article.controller;
+
+
+import com.newland.blog.article.req.AdvertREQ;
+import com.newland.blog.article.service.IAdvertService;
+import com.newland.blog.entities.Advert;
+import com.newland.blog.util.base.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+
+/**
+ *
+ * 广告信息表 前端控制器
+ *
+ */
+@Api(value = "广告管理接口", description = "广告管理接口,提供广告的增、删、改、查")
+@RestController
+@RequestMapping("/advert")
+public class AdvertController {
+
+ @Autowired
+ private IAdvertService advertService;
+
+
+ @ApiOperation("根据广告标题与状态查询广告分页列表接口")
+ @PostMapping("/search") // /article/advert/search
+ public Result search(@RequestBody AdvertREQ req) {
+ return advertService.queryPage(req);
+ }
+
+ @ApiImplicitParam(name = "id", value = "广告ID", required = true)
+ @ApiOperation("删除广告接口")
+ @DeleteMapping("/{id}")
+ public Result delete(@PathVariable("id") String id) {
+ return advertService.deleteById(id);
+ }
+
+ @ApiImplicitParam(name = "id", value = "广告ID", required = true)
+ @ApiOperation("查询广告详情接口")
+ @GetMapping("/{id}")
+ public Result view(@PathVariable("id") String id) {
+ return Result.ok( advertService.getById(id) );
+ }
+
+ @ApiOperation("修改广告信息接口")
+ @PutMapping
+ public Result update(@RequestBody Advert advert) {
+ advert.setUpdateDate(new Date());
+ advertService.updateById(advert);
+ return Result.ok();
+ }
+
+ @ApiOperation("新增广告信息接口")
+ @PostMapping
+ public Result save(@RequestBody Advert advert) {
+ advertService.save(advert);
+ return Result.ok();
+ }
+
+
+}
diff --git a/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/controller/ArticleController.java b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/controller/ArticleController.java
new file mode 100644
index 0000000..90a1475
--- /dev/null
+++ b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/controller/ArticleController.java
@@ -0,0 +1,114 @@
+package com.newland.blog.article.controller;
+
+
+import com.newland.blog.article.req.ArticleREQ;
+import com.newland.blog.article.req.ArticleUserREQ;
+import com.newland.blog.article.service.IArticleService;
+import com.newland.blog.entities.Article;
+import com.newland.blog.util.base.Result;
+import com.newland.blog.util.enums.ArticleStatusEnum;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ *
+ * 文章信息表 前端控制器
+ *
+ */
+@Api(value = "文章管理接口", description = "文章管理接口, 提供文章的增删改查")
+@RestController
+@RequestMapping("/article")
+public class ArticleController {
+
+ @Autowired
+ private IArticleService articleService;
+
+ @ApiOperation("根据文章标题和状态查询文章分页列表接口")
+ @PostMapping("/search") // localhost:8001/article/article/search
+ public Result search(@RequestBody ArticleREQ req) {
+ return articleService.queryPage(req);
+ }
+
+ @ApiOperation("查询文章详情接口")
+ @ApiImplicitParam(name = "id", value = "文章ID", required = true)
+ @GetMapping("/{id}")
+ public Result view(@PathVariable String id) {
+ return articleService.findArticleAndLabelById(id);
+ }
+
+
+ @ApiOperation("修改文章信息接口")
+ @PutMapping // put 请求 localhost:8001/article/article
+ public Result update(@RequestBody Article article) {
+ return articleService.updateOrSave(article);
+ }
+
+ @ApiOperation("新增文章信息接口")
+ @PostMapping
+ public Result save(@RequestBody Article article) {
+ return articleService.updateOrSave(article);
+ }
+
+ @ApiImplicitParam(name = "id", value = "文章ID", required = true)
+ @ApiOperation("删除文章接口")
+ @DeleteMapping("/{id}")
+ public Result delete(@PathVariable("id") String id) {
+ // 假删除,只是将状态更新
+ return articleService.updateStatus(id, ArticleStatusEnum.DELETE);
+ }
+
+ @ApiImplicitParam(name = "id", value = "文章ID", required = true)
+ @ApiOperation("审核通过接口")
+ @GetMapping("/audit/success/{id}")
+ public Result success(@PathVariable("id") String id) {
+ // 审核通过
+ return articleService.updateStatus(id, ArticleStatusEnum.SUCCESS);
+ }
+
+ @ApiImplicitParam(name = "id", value = "文章ID", required = true)
+ @ApiOperation("审核不通过接口")
+ @GetMapping("/audit/fail/{id}")
+ public Result fail(@PathVariable("id") String id) {
+ // 审核不通过
+ return articleService.updateStatus(id, ArticleStatusEnum.FAIL);
+ }
+
+ @ApiOperation("根据用户ID查询公开或未公开的文章列表接口")
+ @PostMapping("/user") // /article/user
+ public Result findListByUserId(@RequestBody ArticleUserREQ req) {
+ return articleService.findListByUserId(req);
+ }
+
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "id", value = "文章ID", required = true),
+ @ApiImplicitParam(name = "count", value = "点赞数", required = true)
+ })
+ @ApiOperation("更新点赞数")
+ @PutMapping("/thumb/{id}/{count}")
+ public Result updataThumhup(@PathVariable("id") String id,
+ @PathVariable("count") int count) {
+ return articleService.updateThumhup(id, count);
+ }
+
+ @ApiOperation("统计审核通过且公开的文章总记录数")
+ @GetMapping("/total")
+ public Result getArticleTotal() {
+ return articleService.getArticleTotal();
+ }
+
+ @ApiOperation("统计各分类下的文章数")
+ @GetMapping("/category/total")
+ public Result categoryTotal() {
+ return articleService.selectCategoryTotal();
+ }
+
+ @ApiOperation("统计近6个月发布的文章数")
+ @GetMapping("/month/total")
+ public Result monthArticleTotal() {
+ return articleService.selectMonthArticleTotal();
+ }
+}
diff --git a/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/controller/CategoryController.java b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/controller/CategoryController.java
new file mode 100644
index 0000000..e3ec179
--- /dev/null
+++ b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/controller/CategoryController.java
@@ -0,0 +1,78 @@
+package com.newland.blog.article.controller;
+
+import com.newland.blog.article.req.CategoryREQ;
+import com.newland.blog.article.service.ICategoryService;
+import com.newland.blog.entities.Category;
+import com.newland.blog.util.base.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 文章分类表-前端控制器
+ */
+@Api(value="分类管理接口", description = "分类管理接口,提供分类的增、删、改、查")
+@RestController // 所有方法都会返回json字符串进行响应
+@RequestMapping("/category")
+public class CategoryController {
+
+ @Autowired
+ private ICategoryService categoryService;
+
+ /**
+ * 分页条件查询分类信息 ,
+ * @param req
+ * @return 会将对象转成json
+ */
+ @ApiOperation("根据分类名称与状态查询分类列表接口")
+ @PostMapping("/search") // 请求路径: localhost:8001/article/category/search
+ public Result search(@RequestBody CategoryREQ req) {
+ return categoryService.queryPage(req);
+ }
+
+
+ @ApiOperation("查询类别详情接口")
+ @ApiImplicitParam(name = "id", value="类别ID", required = true)
+ @GetMapping("/{id}") // localhost:8001/article/category/{id}
+ public Result view(@PathVariable("id") String id) {
+ Category catetory = categoryService.getById(id);
+ return Result.ok(catetory);
+ }
+
+ @ApiOperation("修改类别信息接口")
+ @PutMapping // put 方式调用接口 /category
+ public Result update(@RequestBody Category category) {
+ categoryService.updateById(category);
+ return Result.ok();
+ }
+
+ @ApiOperation("新增类别信息接口")
+ @PostMapping // post 方式调用接口 /category
+ public Result save(@RequestBody Category category) {
+ categoryService.save(category);
+ return Result.ok();
+ }
+
+ @ApiImplicitParam(name = "id", value="类别ID", required = true)
+ @ApiOperation("删除类别接口")
+ @DeleteMapping("/{id}") // /category/{id}
+ public Result delete(@PathVariable("id") String id) {
+ categoryService.removeById(id);
+ return Result.ok();
+ }
+
+ @ApiOperation("获取所有正常状态的分类接口")
+ @GetMapping("/list") // 请求 localhost:8001/article/category/list
+ public Result list() {
+ return categoryService.findAllNormal();
+ }
+
+ @ApiOperation("查询正常状态的分类及分类下的所有标签接口")
+ @GetMapping("/label/list") // localhost:8001/article/category/label/list
+ public Result findCategoryAndLabel() {
+ return categoryService.findCategoryAndLabel();
+ }
+
+}
diff --git a/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/controller/CommentController.java b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/controller/CommentController.java
new file mode 100644
index 0000000..4221b92
--- /dev/null
+++ b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/controller/CommentController.java
@@ -0,0 +1,43 @@
+package com.newland.blog.article.controller;
+
+
+import com.newland.blog.article.service.ICommentService;
+import com.newland.blog.entities.Comment;
+import com.newland.blog.util.base.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ *
+ * 评论信息表 前端控制器
+ *
+ */
+@Api(value = "评论管理接口", description = "评论管理接口,提供评论的增删改查")
+@RestController
+@RequestMapping("/comment")
+public class CommentController {
+
+ @Autowired
+ private ICommentService commentService;
+
+
+
+ @ApiImplicitParam(name = "id", value = "评论ID", required = true)
+ @ApiOperation("删除评论接口")
+ @DeleteMapping("/{id}")
+ public Result delete( @PathVariable("id") String id) {
+ return commentService.deleteById(id);
+ }
+
+ @ApiOperation("新增评论信息接口")
+ @PostMapping
+ public Result save(@RequestBody Comment comment) {
+ commentService.save(comment);
+ return Result.ok();
+ }
+
+
+}
diff --git a/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/controller/ConfigController.java b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/controller/ConfigController.java
new file mode 100644
index 0000000..cfc98f8
--- /dev/null
+++ b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/controller/ConfigController.java
@@ -0,0 +1,24 @@
+//
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.cloud.context.config.annotation.RefreshScope;
+//import org.springframework.web.bind.annotation.GetMapping;
+//import org.springframework.web.bind.annotation.RestController;
+//
+//@RefreshScope //动态的获取Nacos上的数据
+//@RestController
+//public class ConfigController {
+//
+// @Value("${user.name}")
+// private String name;
+//
+// @Value("${user.age}")
+// private Integer age;
+//
+// @GetMapping("/config") // localhost:8001/article/config
+// public String getConfig() {
+// String content = "name: " + name + ",age: " + age;
+// System.out.println(content);
+// return content;
+// }
+//
+//}
diff --git a/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/controller/FileController.java b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/controller/FileController.java
new file mode 100644
index 0000000..d604c46
--- /dev/null
+++ b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/controller/FileController.java
@@ -0,0 +1,44 @@
+package com.newland.blog.article.controller;
+
+import com.newland.blog.util.aliyun.AliyunUtil;
+import com.newland.blog.util.base.Result;
+import com.newland.blog.util.enums.PlatformEnum;
+import com.newland.blog.util.properties.AliyunProperties;
+import com.newland.blog.util.properties.BlogProperties;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 文件控制器
+ */
+@Api(value = "文件管理接口", description = "文件管理接口,上传或删除图片文件")
+@RequestMapping("/file")
+@RestController
+public class FileController {
+
+ @Autowired
+ private BlogProperties blogProperties;
+
+ @ApiOperation("上传文件到OSS服务器")
+ @PostMapping("/upload") // /article/file/upload
+ public Result upload(@RequestParam("file") MultipartFile file ) {
+ // 获取阿里云 OSS 相关配置信息
+ AliyunProperties aliyun = blogProperties.getAliyun();
+
+ return AliyunUtil.uploadFileToOss(PlatformEnum.ARTICLE, file, aliyun);
+ }
+
+ @ApiImplicitParam(name = "fileUrl", value = "要删除的文件URL", required = true)
+ @ApiOperation("根据文件URL删除在OSS服务器中对应文件")
+ @DeleteMapping("/delete") // /article/file/delete
+ public Result delete(@RequestParam(value = "fileUrl", required = true)
+ String fileUrl) {
+ return AliyunUtil.delete(fileUrl, blogProperties.getAliyun());
+ }
+
+
+}
diff --git a/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/controller/LabelController.java b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/controller/LabelController.java
new file mode 100644
index 0000000..e3aa14c
--- /dev/null
+++ b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/controller/LabelController.java
@@ -0,0 +1,64 @@
+package com.newland.blog.article.controller;
+
+
+import com.newland.blog.article.req.LabelREQ;
+import com.newland.blog.article.service.ILabelService;
+import com.newland.blog.entities.Label;
+import com.newland.blog.util.base.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ *
+ * 标签表 前端控制器
+ *
+ */
+@Api(value = "标签管理接口", description = "标签管理接口,提供标签的增、删、改、查")
+@RestController
+@RequestMapping("/label")
+public class LabelController {
+
+ @Autowired
+ private ILabelService labelService;
+
+ @ApiOperation("根据标签名称与分类id查询页面分页列表接口")
+ @PostMapping("/search") // post方式请求 /label/search
+ public Result search(@RequestBody LabelREQ req) {
+ return labelService.queryPage(req);
+ }
+
+ @ApiImplicitParam(name = "id", value = "标签ID", required = true)
+ @ApiOperation("查询标签详情接口")
+ @GetMapping("/{id}")
+ public Result view(@PathVariable String id) {
+ Label label = labelService.getById(id);
+ return Result.ok(label);
+ }
+
+ @ApiOperation("修改标签信息接口")
+ @PutMapping // put 请求 /label
+ public Result update(@RequestBody Label label) {
+ labelService.updateById(label);
+ return Result.ok();
+ }
+
+ @ApiOperation("新增标签信息接口")
+ @PostMapping // post 请求 /label
+ public Result save(@RequestBody Label label) {
+ labelService.save(label);
+ return Result.ok();
+ }
+
+ @ApiImplicitParam(name = "id", value = "标签ID", required = true)
+ @ApiOperation("删除标签接口")
+ @DeleteMapping("/{id}")
+ public Result delete(@PathVariable("id") String id) {
+ labelService.removeById(id);
+ return Result.ok();
+ }
+
+
+}
diff --git a/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/mapper/AdvertMapper.java b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/mapper/AdvertMapper.java
new file mode 100644
index 0000000..ae743db
--- /dev/null
+++ b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/mapper/AdvertMapper.java
@@ -0,0 +1,13 @@
+package com.newland.blog.article.mapper;
+
+import com.newland.blog.entities.Advert;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ *
+ * 广告信息表 Mapper 接口
+ *
+ */
+public interface AdvertMapper extends BaseMapper {
+
+}
diff --git a/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/mapper/ArticleMapper.java b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/mapper/ArticleMapper.java
new file mode 100644
index 0000000..c44fd9f
--- /dev/null
+++ b/newland-blog/newland-blog-article/src/main/java/com/newland/blog/article/mapper/ArticleMapper.java
@@ -0,0 +1,62 @@
+package com.newland.blog.article.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.newland.blog.article.req.ArticleListREQ;
+import com.newland.blog.entities.Article;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * 文章信息表 Mapper 接口
+ *
+ */
+public interface ArticleMapper extends BaseMapper {
+
+ /**
+ * 通过文章id查询文章详情及标签
+ * @param id
+ * @return
+ */
+ Article findArticleAndLabelById(String id);
+
+ /**
+ * 通过文章id删除文章标签表数据
+ * @param articleId
+ * @return
+ */
+ boolean deleteArticleLabel(@Param("articleId") String articleId);
+
+ /**
+ * 新增文章标签中间表数据
+ * @param articleId 文章id
+ * @param labelIds 标签id集合
+ * @return
+ */
+ boolean saveArticleLabel(@Param("articleId") String articleId,
+ @Param("labelIds") List labelIds);
+
+ /**
+ * 通过分类id或标签id查询公开且已审核通过的文章列表
+ * @param page 分页对象
+ * @param req 条件
+ * @return
+ */
+ IPage findListByLabelIdOrCategoryId(IPage page,
+ @Param("req") ArticleListREQ req);
+
+ /**
+ * 统计每个分类下的文章数(调用视图)
+ * @return
+ */
+ List