├── .gitignore ├── LICENSE ├── README.md ├── sql ├── data.sql └── schema.sql ├── weblog-springboot ├── pom.xml ├── weblog-module-admin │ ├── .gitignore │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── com │ │ └── quanxiaoha │ │ ├── .DS_Store │ │ └── weblog │ │ └── admin │ │ ├── aspect │ │ └── package-info.java │ │ ├── async │ │ └── PVIncreaseAsyncTask.java │ │ ├── config │ │ ├── MinioConfig.java │ │ ├── MinioProperties.java │ │ ├── PasswordEncoderConfig.java │ │ ├── ThreadPoolConfig.java │ │ └── WebSecurityConfig.java │ │ ├── controller │ │ ├── AdminArticleController.java │ │ ├── AdminBlogSettingController.java │ │ ├── AdminCategoryController.java │ │ ├── AdminDashboardController.java │ │ ├── AdminFileController.java │ │ ├── AdminTagController.java │ │ └── AdminUserController.java │ │ ├── dao │ │ ├── AdminArticleCategoryRelDao.java │ │ ├── AdminArticleContentDao.java │ │ ├── AdminArticleDao.java │ │ ├── AdminArticleTagRelDao.java │ │ ├── AdminCategoryDao.java │ │ ├── AdminStatisticsArticlePVDao.java │ │ ├── AdminTagDao.java │ │ ├── AdminUserDao.java │ │ ├── AdminUserRoleDao.java │ │ └── impl │ │ │ ├── AdminArticleCategoryRelDaoImpl.java │ │ │ ├── AdminArticleContentDaoImpl.java │ │ │ ├── AdminArticleDaoImpl.java │ │ │ ├── AdminArticleTagRelDaoImpl.java │ │ │ ├── AdminCategoryDaoImpl.java │ │ │ ├── AdminStatisticsArticlePVDaoImpl.java │ │ │ ├── AdminTagDaoImpl.java │ │ │ ├── AdminUserDaoImpl.java │ │ │ └── AdminUserRoleDaoImpl.java │ │ ├── enums │ │ └── AdminResponseCodeEnum.java │ │ ├── eventbus │ │ └── AdminEventListener.java │ │ ├── model │ │ ├── package-info.java │ │ └── vo │ │ │ ├── article │ │ │ ├── DeleteArticleReqVO.java │ │ │ ├── PublishArticleReqVO.java │ │ │ ├── QueryArticleDetailReqVO.java │ │ │ ├── QueryArticleDetailRspVO.java │ │ │ ├── QueryArticlePageListReqVO.java │ │ │ └── UpdateArticleReqVO.java │ │ │ ├── blogsetting │ │ │ ├── QueryBlogSettingRspVO.java │ │ │ └── UpdateBlogSettingReqVO.java │ │ │ ├── category │ │ │ ├── AddCategoryReqVO.java │ │ │ ├── DeleteCategoryReqVO.java │ │ │ ├── QueryCategoryPageListReqVO.java │ │ │ └── QueryCategoryPageListRspVO.java │ │ │ ├── dashboard │ │ │ ├── QueryDashboardArticleStatisticsRspVO.java │ │ │ └── QueryDashboardPVStatisticsRspVO.java │ │ │ ├── file │ │ │ └── UploadFileRspVO.java │ │ │ ├── tag │ │ │ ├── AddTagReqVO.java │ │ │ ├── DeleteTagReqVO.java │ │ │ ├── QueryTagPageListReqVO.java │ │ │ └── SearchTagReqVO.java │ │ │ └── user │ │ │ ├── QueryUserDetailRspVO.java │ │ │ └── UpdateAdminPasswordReqVO.java │ │ ├── package-info.java │ │ ├── service │ │ ├── AdminArticleService.java │ │ ├── AdminBlogSettingService.java │ │ ├── AdminCategoryService.java │ │ ├── AdminDashboardService.java │ │ ├── AdminFileService.java │ │ ├── AdminTagService.java │ │ ├── AdminUserService.java │ │ └── impl │ │ │ ├── AdminArticleServiceImpl.java │ │ │ ├── AdminBlogSettingServiceImpl.java │ │ │ ├── AdminCategoryServiceImpl.java │ │ │ ├── AdminDashboardServiceImpl.java │ │ │ ├── AdminFileServiceImpl.java │ │ │ ├── AdminTagServiceImpl.java │ │ │ ├── AdminUserServiceImpl.java │ │ │ └── UserDetailServiceImpl.java │ │ └── utils │ │ └── MinioUtil.java ├── weblog-module-common │ ├── .gitignore │ ├── pom.xml │ └── src │ │ ├── main │ │ └── java │ │ │ └── com │ │ │ └── quanxiaoha │ │ │ └── weblog │ │ │ └── common │ │ │ ├── PageResponse.java │ │ │ ├── Response.java │ │ │ ├── aspect │ │ │ ├── ApiOperationLog.java │ │ │ └── ApiOperationLogAspect.java │ │ │ ├── config │ │ │ ├── EventBusConfig.java │ │ │ ├── InsertBatchSqlInjector.java │ │ │ ├── MyBaseMapper.java │ │ │ └── MybatisPlusConfig.java │ │ │ ├── constant │ │ │ └── Constants.java │ │ │ ├── domain │ │ │ ├── dos │ │ │ │ ├── ArticleCategoryRelDO.java │ │ │ │ ├── ArticleContentDO.java │ │ │ │ ├── ArticleCountDO.java │ │ │ │ ├── ArticleDO.java │ │ │ │ ├── ArticleTagRelDO.java │ │ │ │ ├── BlogSettingDO.java │ │ │ │ ├── CategoryDO.java │ │ │ │ ├── StatisticsArticlePVDO.java │ │ │ │ ├── TagDO.java │ │ │ │ ├── UserDO.java │ │ │ │ ├── UserRoleDO.java │ │ │ │ └── VisitorRecordDO.java │ │ │ └── mapper │ │ │ │ ├── ArticleCategoryRelMapper.java │ │ │ │ ├── ArticleContentMapper.java │ │ │ │ ├── ArticleMapper.java │ │ │ │ ├── ArticleTagRelMapper.java │ │ │ │ ├── BlogSettingMapper.java │ │ │ │ ├── CategoryMapper.java │ │ │ │ ├── StatisticsArticlePVMapper.java │ │ │ │ ├── TagMapper.java │ │ │ │ ├── UserMapper.java │ │ │ │ ├── UserRoleMapper.java │ │ │ │ └── VisitorMapper.java │ │ │ ├── enums │ │ │ ├── EventEnum.java │ │ │ └── ResponseCodeEnum.java │ │ │ ├── eventbus │ │ │ ├── ArticleEvent.java │ │ │ └── EventListener.java │ │ │ ├── exception │ │ │ ├── BaseExceptionInterface.java │ │ │ ├── BizException.java │ │ │ ├── GlobalExceptionHandler.java │ │ │ ├── NotAuthorizedException.java │ │ │ └── ResourceNotFoundException.java │ │ │ ├── model │ │ │ └── vo │ │ │ │ └── QuerySelectListRspVO.java │ │ │ └── utils │ │ │ └── AgentRegionUtils.java │ │ └── test │ │ └── java │ │ └── com │ │ └── quanxiaoha │ │ └── weblog │ │ └── common │ │ └── WeblogCommonApplicationTests.java ├── weblog-module-jwt │ ├── .gitignore │ ├── pom.xml │ └── src │ │ ├── main │ │ └── java │ │ │ └── com │ │ │ └── quanxiaoha │ │ │ └── weblog │ │ │ └── jwt │ │ │ ├── JwtAuthenticationLoginFilter.java │ │ │ ├── JwtAuthenticationSecurityConfig.java │ │ │ ├── JwtTokenHelper.java │ │ │ ├── LoginAuthenticationFailureHandler.java │ │ │ ├── LoginAuthenticationSuccessHandler.java │ │ │ ├── RestAccessDeniedHandler.java │ │ │ ├── RestAuthenticationEntryPoint.java │ │ │ ├── TokenAuthenticationFilter.java │ │ │ ├── model │ │ │ ├── CreateTokenReqVO.java │ │ │ └── CreateTokenRspVO.java │ │ │ └── utils │ │ │ └── ResultUtil.java │ │ └── test │ │ └── java │ │ └── com │ │ └── example │ │ └── weblogmodule │ │ └── jwt │ │ └── WeblogModuleJwtApplicationTests.java └── weblog-web │ ├── .gitignore │ ├── pom.xml │ └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── quanxiaoha │ │ │ └── weblog │ │ │ └── web │ │ │ ├── WeblogWebApplication.java │ │ │ ├── config │ │ │ └── CrosConfig.java │ │ │ ├── controller │ │ │ ├── ArchiveController.java │ │ │ ├── ArticleController.java │ │ │ ├── BlogSettingController.java │ │ │ ├── CategoryController.java │ │ │ ├── IndexController.java │ │ │ └── TagController.java │ │ │ ├── convert │ │ │ ├── ArticleConvert.java │ │ │ └── BlogSettingConvert.java │ │ │ ├── dao │ │ │ ├── ArticleCategoryRelDao.java │ │ │ ├── ArticleContentDao.java │ │ │ ├── ArticleDao.java │ │ │ ├── ArticleTagRelDao.java │ │ │ ├── CategoryDao.java │ │ │ ├── TagDao.java │ │ │ └── impl │ │ │ │ ├── ArticleCategoryRelDaoImpl.java │ │ │ │ ├── ArticleContentDaoImpl.java │ │ │ │ ├── ArticleDaoImpl.java │ │ │ │ ├── ArticleTagRelDaoImpl.java │ │ │ │ ├── CategoryDaoImpl.java │ │ │ │ └── TagDaoImpl.java │ │ │ ├── model │ │ │ ├── package-info.java │ │ │ └── vo │ │ │ │ ├── archive │ │ │ │ ├── QueryArchiveItemRspVO.java │ │ │ │ ├── QueryArchivePageListReqVO.java │ │ │ │ └── QueryArchivePageListRspVO.java │ │ │ │ ├── article │ │ │ │ ├── QueryArticleDetailReqVO.java │ │ │ │ ├── QueryArticleDetailRspVO.java │ │ │ │ ├── QueryArticleLinkRspVO.java │ │ │ │ ├── QueryCategoryArticlePageListReqVO.java │ │ │ │ ├── QueryIndexArticlePageItemRspVO.java │ │ │ │ ├── QueryIndexArticlePageListReqVO.java │ │ │ │ └── QueryTagArticlePageListReqVO.java │ │ │ │ ├── blogsetting │ │ │ │ └── QueryBlogSettingRspVO.java │ │ │ │ ├── category │ │ │ │ └── QueryCategoryListItemRspVO.java │ │ │ │ ├── package-info.java │ │ │ │ └── tag │ │ │ │ └── QueryTagListItemRspVO.java │ │ │ ├── service │ │ │ ├── ArchiveService.java │ │ │ ├── ArticleService.java │ │ │ ├── BlogSettingService.java │ │ │ ├── CategoryService.java │ │ │ ├── IndexService.java │ │ │ ├── TagService.java │ │ │ └── impl │ │ │ │ ├── ArchiveServiceImpl.java │ │ │ │ ├── ArticleServiceImpl.java │ │ │ │ ├── BlogSettingServiceImpl.java │ │ │ │ ├── CategoryServiceImpl.java │ │ │ │ ├── IndexServiceImpl.java │ │ │ │ └── TagServiceImpl.java │ │ │ └── utils │ │ │ └── MarkdownUtil.java │ └── resources │ │ ├── application-dev.yaml │ │ ├── application-prod.yaml │ │ ├── application.yaml │ │ ├── ip2region.xdb │ │ ├── logback-weblog.xml │ │ └── spy.properties │ └── test │ └── java │ └── com │ └── quanxiaoha │ └── weblog │ └── web │ └── WeblogWebApplicationTests.java └── weblog-vue3 ├── .env.development ├── .env.production ├── .gitignore ├── .vscode └── extensions.json ├── README.md ├── index.html ├── package-lock.json ├── package.json ├── postcss.config.js ├── public └── favicon.ico ├── src ├── App.vue ├── api │ ├── admin │ │ ├── article.js │ │ ├── blogsetting.js │ │ ├── category.js │ │ ├── dashboard.js │ │ ├── file.js │ │ ├── tag.js │ │ └── user.js │ └── frontend │ │ ├── archive.js │ │ ├── article.js │ │ ├── blogsetting.js │ │ ├── category.js │ │ ├── index.js │ │ └── tag.js ├── assets │ ├── base.css │ ├── developer.png │ ├── login-logo.png │ ├── logo.svg │ ├── main.css │ ├── weblog-logo-mini.png │ └── weblog-logo.png ├── axios.js ├── components │ ├── ArticlePublishChart.vue │ ├── CountTo.vue │ ├── FormDrawer.vue │ ├── MDEditor.vue │ ├── PVChart.vue │ └── UserInfoCard.vue ├── composables │ ├── auth.js │ └── util.js ├── layouts │ ├── admin.vue │ └── components │ │ ├── AdminFooter.vue │ │ ├── AdminHeader.vue │ │ ├── AdminMenu.vue │ │ ├── AdminTagList.vue │ │ ├── Footer.vue │ │ ├── Header.vue │ │ └── Header2.vue ├── main.js ├── pages │ ├── 404.vue │ ├── about.vue │ ├── admin │ │ ├── article-list.vue │ │ ├── blog-setting.vue │ │ ├── category-list.vue │ │ ├── index.vue │ │ ├── login.vue │ │ └── tag-list.vue │ └── frontend │ │ ├── archive-list.vue │ │ ├── article-detail.vue │ │ ├── category-article-list.vue │ │ ├── category-list.vue │ │ ├── index.vue │ │ ├── tag-article-list.vue │ │ └── tag-list.vue ├── permission.js ├── router │ └── index.js └── store │ └── index.js ├── tailwind.config.js └── vite.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | /weblog-springboot/.idea/ 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 犬小哈教程 www.quanxiaoha.com 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /sql/data.sql: -------------------------------------------------------------------------------- 1 | -- 管理员 (登录账号/密码 : admin/admin) 2 | INSERT INTO `weblog`.`t_user` (`id`, `username`, `password`, `create_time`, `update_time`, `is_deleted`) VALUES (1, 'admin', '$2a$10$aGGgbab8HdmfxixuTwIYnOZxPH9hzrQuq1oRfLa91mVzSaRfgmtcu', '2023-07-03 11:57:18', '2023-07-08 08:24:36', 0); 3 | -- 游客 (登录账号/密码 : test/test) 4 | INSERT INTO `weblog`.`t_user` (`id`, `username`, `password`, `create_time`, `update_time`, `is_deleted`) VALUES (2, 'test', '$2a$10$L6ce4rQsyJ1k7ZCOfN6X4e5dHLyvg2X0t9JFEZBezDq0lds79Pxja', '2023-07-07 01:22:05', '2023-07-07 01:22:05', 0); 5 | 6 | -- 博客基础设置信息(部署完成后,可自行登录管理后台更改) 7 | INSERT INTO `weblog`.`t_blog_setting` (`blog_name`, `author`, `introduction`, `avatar`, `github_home`, `csdn_home`, `gitee_home`, `zhihu_home`) VALUES ('Weblog', '犬小哈', '平安喜乐', 'https://img.quanxiaoha.com/quanxiaoha/2a5509abf8fe42118c17d6d18fb36a13.jpg', 'https://www.quanxiaoha.com', 'https://www.quanxiaoha.com', 'https://www.quanxiaoha.com', 'https://www.quanxiaoha.com'); 8 | 9 | -- 管理员角色 10 | INSERT INTO `weblog`.`t_user_role` (`id`, `username`, `role`, `create_time`) VALUES (1, 'admin', 'ROLE_ADMIN', '2023-07-07 01:21:15'); 11 | -- 游客角色 12 | INSERT INTO `weblog`.`t_user_role` (`id`, `username`, `role`, `create_time`) VALUES (2, 'test', 'ROLE_VISITOR', '2023-07-07 01:23:33'); 13 | 14 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/**/target/ 5 | !**/src/test/**/target/ 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | !**/src/main/**/build/ 30 | !**/src/test/**/build/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | /.mvn/ 35 | /.mvn/ 36 | /mvnw 37 | /mvnw.cmd 38 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | com.quanxiaoha 7 | weblog-springboot 8 | ${revision} 9 | 10 | com.quanxiaoha 11 | weblog-module-admin 12 | weblog-module-admin 13 | weblog-module-admin 14 | 15 | 16 | 17 | 18 | com.quanxiaoha 19 | weblog-module-common 20 | 21 | 22 | 23 | com.quanxiaoha 24 | weblog-module-jwt 25 | 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-security 30 | 31 | 32 | 33 | 34 | io.jsonwebtoken 35 | jjwt-api 36 | 37 | 38 | io.jsonwebtoken 39 | jjwt-impl 40 | 41 | 42 | io.jsonwebtoken 43 | jjwt-jackson 44 | 45 | 46 | org.projectlombok 47 | lombok 48 | 49 | 50 | 51 | io.minio 52 | minio 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/weiwosuoai/WeBlog/6c6d9b50bd0aae7f9485617e4effb049b8bbe9eb/weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/.DS_Store -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/aspect/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author: 犬小哈 3 | * @url: www.quanxiaoha.com 4 | * @date: 2023-04-18 8:23 5 | * @description: TODO 6 | **/ 7 | package com.quanxiaoha.weblog.admin.aspect; -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/async/PVIncreaseAsyncTask.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.async; 2 | 3 | import com.quanxiaoha.weblog.admin.dao.AdminArticleDao; 4 | import com.quanxiaoha.weblog.admin.dao.AdminStatisticsArticlePVDao; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.scheduling.annotation.Async; 8 | import org.springframework.stereotype.Service; 9 | 10 | import java.util.Date; 11 | 12 | /** 13 | * @author: 犬小哈 14 | * @url: www.quanxiaoha.com 15 | * @date: 2023-07-02 9:31 16 | * @description: TODO 17 | **/ 18 | @Service 19 | @Slf4j 20 | public class PVIncreaseAsyncTask { 21 | 22 | @Autowired 23 | private AdminArticleDao articleDao; 24 | @Autowired 25 | private AdminStatisticsArticlePVDao statisticsArticlePVDao; 26 | 27 | @Async 28 | public void handle(Long articleId) { 29 | log.info("## 文章被阅读量异步 +1, articleId: {}", articleId); 30 | articleDao.readNumIncrease(articleId); 31 | 32 | Date currDate = new Date(); 33 | log.info("## 文章 PV 异步 +1, currDate: {}", currDate); 34 | statisticsArticlePVDao.pvIncrease(currDate); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/config/MinioConfig.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.config; 2 | 3 | import io.minio.MinioClient; 4 | import lombok.Getter; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.boot.context.properties.ConfigurationProperties; 7 | import org.springframework.context.annotation.Bean; 8 | import org.springframework.context.annotation.Configuration; 9 | import org.springframework.stereotype.Component; 10 | 11 | /** 12 | * @author: 犬小哈 13 | * @url: www.quanxiaoha.com 14 | * @date: 2023-05-11 8:49 15 | * @description: TODO 16 | **/ 17 | @Configuration 18 | public class MinioConfig { 19 | @Autowired 20 | private MinioProperties minioProperties; 21 | 22 | @Bean 23 | public MinioClient minioClient() { 24 | return MinioClient.builder() 25 | .endpoint(minioProperties.getEndpoint()) 26 | .credentials(minioProperties.getAccessKey(), minioProperties.getSecretKey()) 27 | .build(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/config/MinioProperties.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.config; 2 | 3 | import lombok.Data; 4 | import lombok.Getter; 5 | import org.springframework.boot.context.properties.ConfigurationProperties; 6 | import org.springframework.stereotype.Component; 7 | 8 | /** 9 | * @author: 犬小哈 10 | * @url: www.quanxiaoha.com 11 | * @date: 2023-05-11 8:49 12 | * @description: TODO 13 | **/ 14 | @ConfigurationProperties(prefix = "minio") 15 | @Component 16 | @Data 17 | public class MinioProperties { 18 | private String endpoint; 19 | private String accessKey; 20 | private String secretKey; 21 | private String bucketName; 22 | } 23 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/config/PasswordEncoderConfig.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 5 | import org.springframework.security.crypto.password.PasswordEncoder; 6 | import org.springframework.stereotype.Component; 7 | 8 | /** 9 | * @author: 犬小哈 10 | * @url: www.quanxiaoha.com 11 | * @date: 2023-04-19 17:31 12 | * @description: 密码加密 13 | **/ 14 | @Component 15 | public class PasswordEncoderConfig { 16 | 17 | @Bean 18 | public PasswordEncoder passwordEncoder(){ 19 | return new BCryptPasswordEncoder(); 20 | } 21 | 22 | public static void main(String[] args) { 23 | BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); 24 | System.out.println(encoder.encode("test"));; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/config/ThreadPoolConfig.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; 6 | 7 | /** 8 | * @author: 犬小哈 9 | * @url: www.quanxiaoha.com 10 | * @date: 2023-07-01 21:03 11 | * @description: 线程池 12 | **/ 13 | @Configuration 14 | public class ThreadPoolConfig { 15 | 16 | @Bean 17 | public ThreadPoolTaskExecutor threadPoolTaskExecutor() { 18 | ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 19 | executor.setCorePoolSize(10); // 核心线程数 20 | executor.setMaxPoolSize(20); // 最大线程数 21 | executor.setQueueCapacity(100); // 队列容量 22 | executor.setThreadNamePrefix("WeblogThreadPool-"); // 线程名前缀 23 | executor.initialize(); 24 | return executor; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/controller/AdminBlogSettingController.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.controller; 2 | 3 | import com.quanxiaoha.weblog.admin.model.vo.article.*; 4 | import com.quanxiaoha.weblog.admin.model.vo.blogsetting.UpdateBlogSettingReqVO; 5 | import com.quanxiaoha.weblog.admin.service.AdminArticleService; 6 | import com.quanxiaoha.weblog.admin.service.AdminBlogSettingService; 7 | import com.quanxiaoha.weblog.common.Response; 8 | import com.quanxiaoha.weblog.common.aspect.ApiOperationLog; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.security.access.prepost.PreAuthorize; 11 | import org.springframework.validation.annotation.Validated; 12 | import org.springframework.web.bind.annotation.PostMapping; 13 | import org.springframework.web.bind.annotation.RequestBody; 14 | import org.springframework.web.bind.annotation.RequestMapping; 15 | import org.springframework.web.bind.annotation.RestController; 16 | 17 | /** 18 | * @author: 犬小哈 19 | * @url: www.quanxiaoha.com 20 | * @date: 2023-04-19 16:06 21 | * @description: TODO 22 | **/ 23 | @RestController 24 | @RequestMapping("/admin/blog/setting") 25 | public class AdminBlogSettingController { 26 | 27 | @Autowired 28 | private AdminBlogSettingService blogSettingService; 29 | 30 | @PostMapping("/update") 31 | @ApiOperationLog(description = "更新博客设置信息") 32 | @PreAuthorize("hasRole('ROLE_ADMIN')") 33 | public Response updateBlogSetting(@RequestBody @Validated UpdateBlogSettingReqVO updateBlogSettingReqVO) { 34 | return blogSettingService.updateBlogSetting(updateBlogSettingReqVO); 35 | } 36 | 37 | @PostMapping("/detail") 38 | @ApiOperationLog(description = "获取博客设置详情信息") 39 | public Response queryBlogSettingDetail() { 40 | return blogSettingService.queryBlogSettingDetail(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/controller/AdminCategoryController.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.controller; 2 | 3 | import com.quanxiaoha.weblog.admin.model.vo.category.AddCategoryReqVO; 4 | import com.quanxiaoha.weblog.admin.model.vo.category.DeleteCategoryReqVO; 5 | import com.quanxiaoha.weblog.admin.model.vo.category.QueryCategoryPageListReqVO; 6 | import com.quanxiaoha.weblog.admin.service.AdminCategoryService; 7 | import com.quanxiaoha.weblog.common.PageResponse; 8 | import com.quanxiaoha.weblog.common.Response; 9 | import com.quanxiaoha.weblog.common.aspect.ApiOperationLog; 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.security.access.prepost.PreAuthorize; 12 | import org.springframework.validation.annotation.Validated; 13 | import org.springframework.web.bind.annotation.PostMapping; 14 | import org.springframework.web.bind.annotation.RequestBody; 15 | import org.springframework.web.bind.annotation.RequestMapping; 16 | import org.springframework.web.bind.annotation.RestController; 17 | 18 | /** 19 | * @author: 犬小哈 20 | * @url: www.quanxiaoha.com 21 | * @date: 2023-04-19 16:06 22 | * @description: TODO 23 | **/ 24 | @RestController 25 | @RequestMapping("/admin/category") 26 | public class AdminCategoryController { 27 | 28 | @Autowired 29 | private AdminCategoryService categoryService; 30 | 31 | @PostMapping("/add") 32 | @ApiOperationLog(description = "新增分类") 33 | @PreAuthorize("hasRole('ROLE_ADMIN')") 34 | public Response addCategory(@RequestBody @Validated AddCategoryReqVO addCategoryReqVO) { 35 | return categoryService.addCategory(addCategoryReqVO); 36 | } 37 | 38 | @PostMapping("/list") 39 | @ApiOperationLog(description = "获取分类列表分页数据") 40 | public PageResponse queryCategoryPageList(@RequestBody QueryCategoryPageListReqVO queryCategoryPageListReqVO) { 41 | return categoryService.queryCategoryPageList(queryCategoryPageListReqVO); 42 | } 43 | 44 | @PostMapping("/delete") 45 | @ApiOperationLog(description = "删除分类") 46 | @PreAuthorize("hasRole('ROLE_ADMIN')") 47 | public Response deleteCategory(@RequestBody @Validated DeleteCategoryReqVO deleteCategoryReqVO) { 48 | return categoryService.deleteCategory(deleteCategoryReqVO); 49 | } 50 | 51 | @PostMapping("/select/list") 52 | @ApiOperationLog(description = "获取所有分类下拉框数据") 53 | public Response queryCategorySelectList() { 54 | return categoryService.queryCategorySelectList(); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/controller/AdminDashboardController.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.controller; 2 | 3 | import com.quanxiaoha.weblog.admin.model.vo.blogsetting.UpdateBlogSettingReqVO; 4 | import com.quanxiaoha.weblog.admin.service.AdminBlogSettingService; 5 | import com.quanxiaoha.weblog.admin.service.AdminDashboardService; 6 | import com.quanxiaoha.weblog.common.Response; 7 | import com.quanxiaoha.weblog.common.aspect.ApiOperationLog; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.validation.annotation.Validated; 10 | import org.springframework.web.bind.annotation.PostMapping; 11 | import org.springframework.web.bind.annotation.RequestBody; 12 | import org.springframework.web.bind.annotation.RequestMapping; 13 | import org.springframework.web.bind.annotation.RestController; 14 | 15 | /** 16 | * @author: 犬小哈 17 | * @url: www.quanxiaoha.com 18 | * @date: 2023-04-19 16:06 19 | * @description: 后台首页 - 仪表盘 20 | **/ 21 | @RestController 22 | @RequestMapping("/admin/dashboard") 23 | public class AdminDashboardController { 24 | 25 | @Autowired 26 | private AdminDashboardService dashboardService; 27 | 28 | @PostMapping("/article/statistics") 29 | @ApiOperationLog(description = "获取后台仪表盘文章统计信息") 30 | public Response queryDashboardArticleStatisticsInfo() { 31 | return dashboardService.queryDashboardArticleStatisticsInfo(); 32 | } 33 | 34 | @PostMapping("/publishArticle/statistics") 35 | @ApiOperationLog(description = "获取后台仪表盘文章发布 echat 统计信息") 36 | public Response queryDashboardPublishArticleStatisticsInfo() { 37 | return dashboardService.queryDashboardPublishArticleStatisticsInfo(); 38 | } 39 | 40 | @PostMapping("/pv/statistics") 41 | @ApiOperationLog(description = "获取后台仪表盘 PV echat 统计信息") 42 | public Response queryDashboardPVStatisticsInfo() { 43 | return dashboardService.queryDashboardPVStatisticsInfo(); 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/controller/AdminFileController.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.controller; 2 | 3 | import com.quanxiaoha.weblog.admin.service.AdminFileService; 4 | import com.quanxiaoha.weblog.common.Response; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.security.access.prepost.PreAuthorize; 8 | import org.springframework.web.bind.annotation.PostMapping; 9 | import org.springframework.web.bind.annotation.RequestMapping; 10 | import org.springframework.web.bind.annotation.RequestParam; 11 | import org.springframework.web.bind.annotation.RestController; 12 | import org.springframework.web.multipart.MultipartFile; 13 | 14 | /** 15 | * @author: 犬小哈 16 | * @url: www.quanxiaoha.com 17 | * @date: 2023-04-19 16:06 18 | * @description: TODO 19 | **/ 20 | @RestController 21 | @RequestMapping("/admin") 22 | @Slf4j 23 | public class AdminFileController { 24 | 25 | @Autowired 26 | private AdminFileService fileService; 27 | 28 | @PostMapping("/file/upload") 29 | @PreAuthorize("hasRole('ROLE_ADMIN')") 30 | public Response uploadFile(@RequestParam MultipartFile file) { 31 | return fileService.uploadFile(file); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/controller/AdminTagController.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.controller; 2 | 3 | import com.quanxiaoha.weblog.admin.model.vo.tag.AddTagReqVO; 4 | import com.quanxiaoha.weblog.admin.model.vo.tag.DeleteTagReqVO; 5 | import com.quanxiaoha.weblog.admin.model.vo.tag.QueryTagPageListReqVO; 6 | import com.quanxiaoha.weblog.admin.model.vo.tag.SearchTagReqVO; 7 | import com.quanxiaoha.weblog.admin.service.AdminTagService; 8 | import com.quanxiaoha.weblog.common.Response; 9 | import com.quanxiaoha.weblog.common.aspect.ApiOperationLog; 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.security.access.prepost.PreAuthorize; 12 | import org.springframework.validation.annotation.Validated; 13 | import org.springframework.web.bind.annotation.PostMapping; 14 | import org.springframework.web.bind.annotation.RequestBody; 15 | import org.springframework.web.bind.annotation.RequestMapping; 16 | import org.springframework.web.bind.annotation.RestController; 17 | 18 | /** 19 | * @author: 犬小哈 20 | * @url: www.quanxiaoha.com 21 | * @date: 2023-04-19 16:06 22 | * @description: TODO 23 | **/ 24 | @RestController 25 | @RequestMapping("/admin/tag") 26 | public class AdminTagController { 27 | 28 | @Autowired 29 | private AdminTagService tagService; 30 | 31 | @PostMapping("/add") 32 | @ApiOperationLog(description = "新增标签") 33 | @PreAuthorize("hasRole('ROLE_ADMIN')") 34 | public Response addTag(@RequestBody @Validated AddTagReqVO addTagReqVO) { 35 | return tagService.addTags(addTagReqVO); 36 | } 37 | 38 | @PostMapping("/list") 39 | @ApiOperationLog(description = "获取标签列表分页数据") 40 | public Response queryTagPageList(@RequestBody QueryTagPageListReqVO queryTagPageListReqVO) { 41 | return tagService.queryTagPageList(queryTagPageListReqVO); 42 | } 43 | 44 | @PostMapping("/delete") 45 | @ApiOperationLog(description = "删除标签") 46 | @PreAuthorize("hasRole('ROLE_ADMIN')") 47 | public Response deleteTag(@RequestBody @Validated DeleteTagReqVO deleteTagReqVO) { 48 | return tagService.deleteTag(deleteTagReqVO); 49 | } 50 | 51 | @PostMapping("/search") 52 | @ApiOperationLog(description = "标签模糊查询") 53 | public Response searchTag(@RequestBody @Validated SearchTagReqVO searchTagReqVO) { 54 | return tagService.searchTags(searchTagReqVO); 55 | } 56 | 57 | @PostMapping("/select/list") 58 | @ApiOperationLog(description = "获取所有标签下拉框数据") 59 | public Response queryTagSelectList() { 60 | return tagService.queryTagSelectList(); 61 | } 62 | 63 | } 64 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/controller/AdminUserController.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.controller; 2 | 3 | import com.quanxiaoha.weblog.admin.model.vo.user.QueryUserDetailRspVO; 4 | import com.quanxiaoha.weblog.admin.model.vo.user.UpdateAdminPasswordReqVO; 5 | import com.quanxiaoha.weblog.admin.service.AdminBlogSettingService; 6 | import com.quanxiaoha.weblog.admin.service.AdminUserService; 7 | import com.quanxiaoha.weblog.common.Response; 8 | import com.quanxiaoha.weblog.common.aspect.ApiOperationLog; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.security.access.prepost.PreAuthorize; 11 | import org.springframework.validation.annotation.Validated; 12 | import org.springframework.web.bind.annotation.PostMapping; 13 | import org.springframework.web.bind.annotation.RequestBody; 14 | import org.springframework.web.bind.annotation.RequestMapping; 15 | import org.springframework.web.bind.annotation.RestController; 16 | 17 | /** 18 | * @author: 犬小哈 19 | * @url: www.quanxiaoha.com 20 | * @date: 2023-04-19 16:06 21 | * @description: TODO 22 | **/ 23 | @RestController 24 | @RequestMapping("/admin") 25 | public class AdminUserController { 26 | 27 | @Autowired 28 | private AdminBlogSettingService blogSettingService; 29 | @Autowired 30 | private AdminUserService userService; 31 | 32 | @PostMapping("/password/update") 33 | @ApiOperationLog(description = "修改用户密码") 34 | @PreAuthorize("hasRole('ROLE_ADMIN')") 35 | public Response updateAdminPassword(@RequestBody @Validated UpdateAdminPasswordReqVO updateAdminPasswordReqVO) { 36 | return userService.updateAdminPassword(updateAdminPasswordReqVO); 37 | } 38 | 39 | @PostMapping("/detail") 40 | @ApiOperationLog(description = "获取登录用户信息") 41 | public Response queryAdminDetail() { 42 | return blogSettingService.queryNicknameAndAvatar(); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/dao/AdminArticleCategoryRelDao.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.dao; 2 | 3 | import com.quanxiaoha.weblog.common.domain.dos.ArticleCategoryRelDO; 4 | 5 | public interface AdminArticleCategoryRelDao { 6 | int insert(ArticleCategoryRelDO articleCategoryRelDO); 7 | 8 | ArticleCategoryRelDO selectByArticleId(Long articleId); 9 | 10 | int deleteByArticleId(Long articleId); 11 | } 12 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/dao/AdminArticleContentDao.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.dao; 2 | 3 | import com.quanxiaoha.weblog.common.domain.dos.ArticleContentDO; 4 | 5 | public interface AdminArticleContentDao { 6 | int insertArticleContent(ArticleContentDO articleContentDO); 7 | 8 | ArticleContentDO queryByArticleId(Long articleId); 9 | 10 | int deleteByArticleId(Long articleId); 11 | 12 | int updateByArticleId(ArticleContentDO articleContentDO); 13 | } 14 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/dao/AdminArticleDao.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.dao; 2 | 3 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 4 | import com.quanxiaoha.weblog.common.domain.dos.ArticleCountDO; 5 | import com.quanxiaoha.weblog.common.domain.dos.ArticleDO; 6 | 7 | import java.util.Date; 8 | import java.util.List; 9 | 10 | public interface AdminArticleDao { 11 | int insertArticle(ArticleDO articleDO); 12 | 13 | ArticleDO queryByArticleId(Long articleId); 14 | 15 | Page queryArticlePageList(Long current, Long size, Date startDate, Date endDate, String searchTitle); 16 | 17 | int deleteById(Long articleId); 18 | 19 | int updateById(ArticleDO articleDO); 20 | 21 | Long selectTotalCount(); 22 | 23 | List selectArticleCount(String startDate, String endDate); 24 | 25 | int readNumIncrease(Long articleId); 26 | } 27 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/dao/AdminArticleTagRelDao.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.dao; 2 | 3 | import com.quanxiaoha.weblog.common.domain.dos.ArticleTagRelDO; 4 | 5 | import java.util.List; 6 | 7 | public interface AdminArticleTagRelDao { 8 | void insertBatch(List articleTagRelDOS); 9 | 10 | List selectByArticleId(Long articleId); 11 | 12 | int deleteByArticleId(Long articleId); 13 | } 14 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/dao/AdminCategoryDao.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.dao; 2 | 3 | import com.quanxiaoha.weblog.common.domain.dos.CategoryDO; 4 | 5 | import java.util.List; 6 | 7 | public interface AdminCategoryDao { 8 | List selectAllCategory(); 9 | 10 | Long selectTotalCount(); 11 | } 12 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/dao/AdminStatisticsArticlePVDao.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.dao; 2 | 3 | import com.quanxiaoha.weblog.common.domain.dos.StatisticsArticlePVDO; 4 | 5 | import java.util.Date; 6 | import java.util.List; 7 | 8 | public interface AdminStatisticsArticlePVDao { 9 | void pvIncrease(Date currDate); 10 | 11 | List selectLatestWeekRecords(); 12 | 13 | List selectAllPVCount(); 14 | } 15 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/dao/AdminTagDao.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.dao; 2 | 3 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 4 | import com.quanxiaoha.weblog.common.domain.dos.TagDO; 5 | 6 | import java.util.Date; 7 | import java.util.List; 8 | 9 | public interface AdminTagDao { 10 | Page queryTagPageList(Long current, Long size, Date startDate, Date endDate, String tagName); 11 | 12 | List searchTags(String key); 13 | 14 | List selectAll(); 15 | 16 | int insert(TagDO tagDO); 17 | 18 | Long selectTotalCount(); 19 | } 20 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/dao/AdminUserDao.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.dao; 2 | 3 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 4 | import com.quanxiaoha.weblog.common.Response; 5 | import com.quanxiaoha.weblog.common.domain.dos.TagDO; 6 | import com.quanxiaoha.weblog.common.domain.dos.UserDO; 7 | 8 | import java.util.List; 9 | 10 | public interface AdminUserDao { 11 | UserDO selectByUsername(String username); 12 | 13 | int updateAdminPassword(UserDO userDO); 14 | } 15 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/dao/AdminUserRoleDao.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.dao; 2 | 3 | 4 | import com.quanxiaoha.weblog.common.domain.dos.UserRoleDO; 5 | 6 | import java.util.List; 7 | 8 | public interface AdminUserRoleDao { 9 | List selectByUsername(String username); 10 | } 11 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/dao/impl/AdminArticleCategoryRelDaoImpl.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.dao.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.quanxiaoha.weblog.admin.dao.AdminArticleCategoryRelDao; 5 | import com.quanxiaoha.weblog.common.domain.mapper.ArticleCategoryRelMapper; 6 | import com.quanxiaoha.weblog.common.domain.dos.ArticleCategoryRelDO; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | /** 12 | * @author: 犬小哈 13 | * @url: www.quanxiaoha.com 14 | * @date: 2023-04-17 12:08 15 | * @description: TODO 16 | **/ 17 | @Service 18 | @Slf4j 19 | public class AdminArticleCategoryRelDaoImpl implements AdminArticleCategoryRelDao { 20 | @Autowired 21 | private ArticleCategoryRelMapper articleCategoryRelMapper; 22 | 23 | @Override 24 | public int insert(ArticleCategoryRelDO articleCategoryRelDO) { 25 | return articleCategoryRelMapper.insert(articleCategoryRelDO); 26 | } 27 | 28 | @Override 29 | public ArticleCategoryRelDO selectByArticleId(Long articleId) { 30 | QueryWrapper wrapper = new QueryWrapper<>(); 31 | wrapper.lambda().eq(ArticleCategoryRelDO::getArticleId, articleId); 32 | return articleCategoryRelMapper.selectOne(wrapper); 33 | } 34 | 35 | @Override 36 | public int deleteByArticleId(Long articleId) { 37 | QueryWrapper wrapper = new QueryWrapper<>(); 38 | wrapper.lambda().eq(ArticleCategoryRelDO::getArticleId, articleId); 39 | return articleCategoryRelMapper.delete(wrapper); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/dao/impl/AdminArticleContentDaoImpl.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.dao.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; 5 | import com.quanxiaoha.weblog.admin.dao.AdminArticleContentDao; 6 | import com.quanxiaoha.weblog.common.domain.mapper.ArticleContentMapper; 7 | import com.quanxiaoha.weblog.common.domain.dos.ArticleContentDO; 8 | import lombok.extern.slf4j.Slf4j; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.stereotype.Service; 11 | 12 | /** 13 | * @author: 犬小哈 14 | * @url: www.quanxiaoha.com 15 | * @date: 2023-04-17 12:08 16 | * @description: TODO 17 | **/ 18 | @Service 19 | @Slf4j 20 | public class AdminArticleContentDaoImpl implements AdminArticleContentDao { 21 | @Autowired 22 | private ArticleContentMapper articleContentMapper; 23 | 24 | @Override 25 | public int insertArticleContent(ArticleContentDO articleContentDO) { 26 | return articleContentMapper.insert(articleContentDO); 27 | } 28 | 29 | @Override 30 | public ArticleContentDO queryByArticleId(Long articleId) { 31 | QueryWrapper wrapper = new QueryWrapper<>(); 32 | wrapper.lambda().eq(ArticleContentDO::getArticleId, articleId); 33 | return articleContentMapper.selectOne(wrapper); 34 | } 35 | 36 | @Override 37 | public int deleteByArticleId(Long articleId) { 38 | QueryWrapper wrapper = new QueryWrapper<>(); 39 | wrapper.lambda().eq(ArticleContentDO::getArticleId, articleId); 40 | return articleContentMapper.delete(wrapper); 41 | } 42 | 43 | @Override 44 | public int updateByArticleId(ArticleContentDO articleContentDO) { 45 | UpdateWrapper wrapper = new UpdateWrapper<>(); 46 | wrapper.lambda().eq(ArticleContentDO::getArticleId, articleContentDO.getArticleId()); 47 | return articleContentMapper.update(articleContentDO, wrapper); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/dao/impl/AdminArticleTagRelDaoImpl.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.dao.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.quanxiaoha.weblog.admin.dao.AdminArticleTagRelDao; 5 | import com.quanxiaoha.weblog.common.domain.mapper.ArticleTagRelMapper; 6 | import com.quanxiaoha.weblog.common.domain.dos.ArticleTagRelDO; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.List; 12 | 13 | /** 14 | * @author: 犬小哈 15 | * @url: www.quanxiaoha.com 16 | * @date: 2023-04-17 12:08 17 | * @description: TODO 18 | **/ 19 | @Service 20 | @Slf4j 21 | public class AdminArticleTagRelDaoImpl implements AdminArticleTagRelDao { 22 | @Autowired 23 | private ArticleTagRelMapper articleTagRelMapper; 24 | 25 | @Override 26 | public void insertBatch(List articleTagRelDOS) { 27 | articleTagRelMapper.insertBatchSomeColumn(articleTagRelDOS); 28 | } 29 | 30 | @Override 31 | public List selectByArticleId(Long articleId) { 32 | QueryWrapper wrapper = new QueryWrapper<>(); 33 | wrapper.lambda().eq(ArticleTagRelDO::getArticleId, articleId); 34 | return articleTagRelMapper.selectList(wrapper); 35 | } 36 | 37 | @Override 38 | public int deleteByArticleId(Long articleId) { 39 | QueryWrapper wrapper = new QueryWrapper<>(); 40 | wrapper.lambda().eq(ArticleTagRelDO::getArticleId, articleId); 41 | return articleTagRelMapper.delete(wrapper); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/dao/impl/AdminCategoryDaoImpl.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.dao.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.quanxiaoha.weblog.admin.dao.AdminCategoryDao; 5 | import com.quanxiaoha.weblog.common.domain.mapper.CategoryMapper; 6 | import com.quanxiaoha.weblog.common.domain.dos.CategoryDO; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.List; 12 | 13 | /** 14 | * @author: 犬小哈 15 | * @url: www.quanxiaoha.com 16 | * @date: 2023-04-17 12:08 17 | * @description: TODO 18 | **/ 19 | @Service 20 | @Slf4j 21 | public class AdminCategoryDaoImpl implements AdminCategoryDao { 22 | @Autowired 23 | private CategoryMapper categoryMapper; 24 | 25 | @Override 26 | public List selectAllCategory() { 27 | return categoryMapper.selectList(null); 28 | } 29 | 30 | @Override 31 | public Long selectTotalCount() { 32 | QueryWrapper wrapper = new QueryWrapper<>(); 33 | wrapper.select("1").lambda().eq(CategoryDO::getIsDeleted, 0); 34 | return categoryMapper.selectCount(wrapper); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/dao/impl/AdminUserDaoImpl.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.dao.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; 5 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 6 | import com.quanxiaoha.weblog.admin.dao.AdminTagDao; 7 | import com.quanxiaoha.weblog.admin.dao.AdminUserDao; 8 | import com.quanxiaoha.weblog.common.Response; 9 | import com.quanxiaoha.weblog.common.domain.dos.TagDO; 10 | import com.quanxiaoha.weblog.common.domain.dos.UserDO; 11 | import com.quanxiaoha.weblog.common.domain.mapper.TagMapper; 12 | import com.quanxiaoha.weblog.common.domain.mapper.UserMapper; 13 | import lombok.extern.slf4j.Slf4j; 14 | import org.springframework.beans.factory.annotation.Autowired; 15 | import org.springframework.stereotype.Service; 16 | 17 | import java.util.List; 18 | 19 | /** 20 | * @author: 犬小哈 21 | * @url: www.quanxiaoha.com 22 | * @date: 2023-04-17 12:08 23 | * @description: TODO 24 | **/ 25 | @Service 26 | @Slf4j 27 | public class AdminUserDaoImpl implements AdminUserDao { 28 | @Autowired 29 | private UserMapper userMapper; 30 | 31 | @Override 32 | public UserDO selectByUsername(String username) { 33 | QueryWrapper wrapper = new QueryWrapper<>(); 34 | wrapper.lambda().eq(UserDO::getUsername, username); 35 | return userMapper.selectOne(wrapper); 36 | } 37 | 38 | @Override 39 | public int updateAdminPassword(UserDO userDO) { 40 | UpdateWrapper wrapper = new UpdateWrapper<>(); 41 | wrapper.lambda().eq(UserDO::getUsername, "admin"); 42 | return userMapper.update(userDO, wrapper); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/dao/impl/AdminUserRoleDaoImpl.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.dao.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.quanxiaoha.weblog.admin.dao.AdminUserRoleDao; 5 | import com.quanxiaoha.weblog.common.domain.dos.UserRoleDO; 6 | import com.quanxiaoha.weblog.common.domain.mapper.UserRoleMapper; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.List; 12 | 13 | /** 14 | * @author: 犬小哈 15 | * @url: www.quanxiaoha.com 16 | * @date: 2023-04-17 12:08 17 | * @description: TODO 18 | **/ 19 | @Service 20 | @Slf4j 21 | public class AdminUserRoleDaoImpl implements AdminUserRoleDao { 22 | 23 | @Autowired 24 | private UserRoleMapper userRoleMapper; 25 | 26 | @Override 27 | public List selectByUsername(String username) { 28 | QueryWrapper wrapper = new QueryWrapper<>(); 29 | wrapper.lambda().eq(UserRoleDO::getUsername, username); 30 | return userRoleMapper.selectList(wrapper); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/enums/AdminResponseCodeEnum.java: -------------------------------------------------------------------------------- 1 | // package com.quanxiaoha.weblog.admin.enums; 2 | // 3 | // import com.quanxiaoha.weblog.common.exception.BaseExceptionInterface; 4 | // import lombok.AllArgsConstructor; 5 | // import lombok.Getter; 6 | // 7 | // /** 8 | // * @author: 犬小哈 9 | // * @url: www.quanxiaoha.com 10 | // * @date: 2023-04-18 8:14 11 | // * @description: 响应枚举 12 | // **/ 13 | // @Getter 14 | // @AllArgsConstructor 15 | // public enum AdminResponseCodeEnum implements BaseExceptionInterface { 16 | // 17 | // // SYSTEM_ERROR("10000", "出错啦,后台小哥正在努力修复中"); 18 | // 19 | // private String errorCode; 20 | // private String errorMessage; 21 | // 22 | // } 23 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/eventbus/AdminEventListener.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.eventbus; 2 | 3 | import com.google.common.eventbus.Subscribe; 4 | import com.quanxiaoha.weblog.admin.async.PVIncreaseAsyncTask; 5 | import com.quanxiaoha.weblog.common.eventbus.EventListener; 6 | import com.quanxiaoha.weblog.common.eventbus.ArticleEvent; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Component; 10 | 11 | /** 12 | * @author: 犬小哈 13 | * @url: www.quanxiaoha.com 14 | * @date: 2023-07-01 21:35 15 | * @description: 事件监听 16 | **/ 17 | @Component 18 | @Slf4j 19 | public class AdminEventListener implements EventListener { 20 | 21 | @Autowired 22 | private PVIncreaseAsyncTask pvIncreaseAsyncTask; 23 | 24 | @Subscribe 25 | @Override 26 | public void handleEvent(ArticleEvent event) { 27 | Long articleId = event.getArticleId(); 28 | String message = event.getMessage(); 29 | // 处理事件 30 | log.info("==> Received event: {}", message); 31 | pvIncreaseAsyncTask.handle(articleId); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/model/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author: 犬小哈 3 | * @from: 公众号:小哈学Java, 网站:www.quanxiaoha.com 4 | * @date: 2023-04-16 14:31 5 | * @version: v1.0.0 6 | * @description: TODO 7 | **/ 8 | package com.quanxiaoha.weblog.admin.model; -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/model/vo/article/DeleteArticleReqVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.model.vo.article; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import javax.validation.constraints.NotNull; 10 | 11 | @Data 12 | @Builder 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | public class DeleteArticleReqVO { 16 | @NotNull(message = "文章 ID 不能为空") 17 | private Long articleId; 18 | } 19 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/model/vo/article/PublishArticleReqVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.model.vo.article; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | import org.hibernate.validator.constraints.Length; 9 | 10 | import javax.validation.constraints.NotBlank; 11 | import javax.validation.constraints.NotEmpty; 12 | import javax.validation.constraints.NotNull; 13 | import java.util.List; 14 | 15 | @Data 16 | @Builder 17 | @AllArgsConstructor 18 | @NoArgsConstructor 19 | public class PublishArticleReqVO { 20 | 21 | @NotBlank(message = "文章标题不能为空") 22 | @Length(min = 1, max = 40, message = "文章标题字数需大于 1 小于 40") 23 | private String title; 24 | 25 | @NotBlank(message = "文章内容不能为空") 26 | private String content; 27 | 28 | @NotBlank(message = "文章头图不能为空") 29 | private String titleImage; 30 | 31 | @NotBlank(message = "文章摘要不能为空") 32 | private String description; 33 | 34 | @NotNull(message = "文章分类不能为空") 35 | private Long categoryId; 36 | 37 | @NotEmpty(message = "文章标签不能为空") 38 | private List tags; 39 | } 40 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/model/vo/article/QueryArticleDetailReqVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.model.vo.article; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | @Data 10 | @Builder 11 | @AllArgsConstructor 12 | @NoArgsConstructor 13 | public class QueryArticleDetailReqVO { 14 | private Long articleId; 15 | } 16 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/model/vo/article/QueryArticleDetailRspVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.model.vo.article; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.util.List; 10 | 11 | @Data 12 | @Builder 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | public class QueryArticleDetailRspVO { 16 | private Long id; 17 | private String title; 18 | private String titleImage; 19 | private String content; 20 | private String description; 21 | private Long categoryId; 22 | private List tagIds; 23 | } 24 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/model/vo/article/QueryArticlePageListReqVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.model.vo.article; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.util.Date; 10 | 11 | @Data 12 | @Builder 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | public class QueryArticlePageListReqVO { 16 | private Long current = 1L; 17 | private Long size = 10L; 18 | private Date startDate; 19 | private Date endDate; 20 | private String searchTitle; 21 | } 22 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/model/vo/article/UpdateArticleReqVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.model.vo.article; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | import org.hibernate.validator.constraints.Length; 9 | 10 | import javax.validation.constraints.NotBlank; 11 | import javax.validation.constraints.NotEmpty; 12 | import javax.validation.constraints.NotNull; 13 | import java.util.List; 14 | 15 | @Data 16 | @Builder 17 | @AllArgsConstructor 18 | @NoArgsConstructor 19 | public class UpdateArticleReqVO { 20 | 21 | @NotNull(message = "文章 ID 不能为空") 22 | private Long id; 23 | 24 | @NotBlank(message = "文章标题不能为空") 25 | @Length(min = 1, max = 40, message = "文章标题字数需大于 1 小于 40") 26 | private String title; 27 | 28 | @NotBlank(message = "文章内容不能为空") 29 | private String content; 30 | 31 | @NotBlank(message = "文章头图不能为空") 32 | private String titleImage; 33 | 34 | @NotBlank(message = "文章摘要不能为空") 35 | private String description; 36 | 37 | @NotNull(message = "文章分类不能为空") 38 | private Long categoryId; 39 | 40 | @NotEmpty(message = "文章标签不能为空") 41 | private List tags; 42 | } 43 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/model/vo/blogsetting/QueryBlogSettingRspVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.model.vo.blogsetting; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import javax.validation.constraints.NotBlank; 9 | 10 | /** 11 | * @author: 犬小哈 12 | * @url: www.quanxiaoha.com 13 | * @date: 2023-04-19 16:06 14 | * @description: TODO 15 | **/ 16 | @Data 17 | @AllArgsConstructor 18 | @NoArgsConstructor 19 | @Builder 20 | public class QueryBlogSettingRspVO { 21 | private Long id; 22 | private String blogName; 23 | private String author; 24 | private String avatar; 25 | private String introduction; 26 | private String githubHome; 27 | private String csdnHome; 28 | private String giteeHome; 29 | private String zhihuHome; 30 | } 31 | 32 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/model/vo/blogsetting/UpdateBlogSettingReqVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.model.vo.blogsetting; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import javax.validation.constraints.NotBlank; 9 | 10 | /** 11 | * @author: 犬小哈 12 | * @url: www.quanxiaoha.com 13 | * @date: 2023-04-19 16:06 14 | * @description: TODO 15 | **/ 16 | @Data 17 | @AllArgsConstructor 18 | @NoArgsConstructor 19 | @Builder 20 | public class UpdateBlogSettingReqVO { 21 | private Long id; 22 | @NotBlank(message = "博客名称不能为空") 23 | private String blogName; 24 | @NotBlank(message = "博客作者不能为空") 25 | private String author; 26 | @NotBlank(message = "作者头像不能为空") 27 | private String avatar; 28 | private String introduction; 29 | private String githubHome; 30 | private String csdnHome; 31 | private String giteeHome; 32 | private String zhihuHome; 33 | } 34 | 35 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/model/vo/category/AddCategoryReqVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.model.vo.category; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | import org.hibernate.validator.constraints.Length; 9 | 10 | import javax.validation.constraints.NotBlank; 11 | import javax.validation.constraints.NotEmpty; 12 | import java.util.List; 13 | 14 | @Data 15 | @Builder 16 | @AllArgsConstructor 17 | @NoArgsConstructor 18 | public class AddCategoryReqVO { 19 | 20 | @NotBlank(message = "分类名称不能为空") 21 | @Length(min = 1, max = 10, message = "分类名称字数限制 1 ~ 10 之间") 22 | private String name; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/model/vo/category/DeleteCategoryReqVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.model.vo.category; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import javax.validation.constraints.NotNull; 10 | 11 | @Data 12 | @Builder 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | public class DeleteCategoryReqVO { 16 | 17 | @NotNull(message = "分类 ID 不能为空") 18 | private Long categoryId; 19 | 20 | } 21 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/model/vo/category/QueryCategoryPageListReqVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.model.vo.category; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.util.Date; 10 | 11 | @Data 12 | @Builder 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | public class QueryCategoryPageListReqVO { 16 | private Long current = 1L; 17 | private Long size = 10L; 18 | private Date startDate; 19 | private Date endDate; 20 | private String categoryName; 21 | } 22 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/model/vo/category/QueryCategoryPageListRspVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.model.vo.category; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.util.Date; 10 | 11 | @Data 12 | @Builder 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | public class QueryCategoryPageListRspVO { 16 | private Long id; 17 | private String name; 18 | private Date createTime; 19 | } 20 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/model/vo/dashboard/QueryDashboardArticleStatisticsRspVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.model.vo.dashboard; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | @Data 10 | @Builder 11 | @AllArgsConstructor 12 | @NoArgsConstructor 13 | public class QueryDashboardArticleStatisticsRspVO { 14 | private Long articleTotalCount; 15 | private Long categoryTotalCount; 16 | private Long tagTotalCount; 17 | private Long pvTotalCount; 18 | } 19 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/model/vo/dashboard/QueryDashboardPVStatisticsRspVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.model.vo.dashboard; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.util.List; 10 | 11 | @Data 12 | @Builder 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | public class QueryDashboardPVStatisticsRspVO { 16 | private List pvDates; 17 | private List pvCounts; 18 | } 19 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/model/vo/file/UploadFileRspVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.model.vo.file; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | @Data 10 | @Builder 11 | @AllArgsConstructor 12 | @NoArgsConstructor 13 | public class UploadFileRspVO { 14 | private String url; 15 | } 16 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/model/vo/tag/AddTagReqVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.model.vo.tag; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | import org.hibernate.validator.constraints.Length; 9 | 10 | import javax.validation.constraints.NotBlank; 11 | import javax.validation.constraints.NotEmpty; 12 | import java.util.List; 13 | 14 | @Data 15 | @Builder 16 | @AllArgsConstructor 17 | @NoArgsConstructor 18 | public class AddTagReqVO { 19 | 20 | @NotEmpty(message = "标签名称不能为空") 21 | private List tags; 22 | 23 | } 24 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/model/vo/tag/DeleteTagReqVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.model.vo.tag; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import javax.validation.constraints.NotEmpty; 10 | import javax.validation.constraints.NotNull; 11 | import java.util.List; 12 | 13 | @Data 14 | @Builder 15 | @AllArgsConstructor 16 | @NoArgsConstructor 17 | public class DeleteTagReqVO { 18 | 19 | @NotNull(message = "标签 ID 不能为空") 20 | private Long tagId; 21 | 22 | } 23 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/model/vo/tag/QueryTagPageListReqVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.model.vo.tag; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.util.Date; 10 | 11 | @Data 12 | @Builder 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | public class QueryTagPageListReqVO { 16 | private Long current = 1L; 17 | private Long size = 10L; 18 | private Date startDate; 19 | private Date endDate; 20 | private String tagName; 21 | } 22 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/model/vo/tag/SearchTagReqVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.model.vo.tag; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import javax.validation.constraints.NotBlank; 10 | import javax.validation.constraints.NotNull; 11 | 12 | @Data 13 | @Builder 14 | @AllArgsConstructor 15 | @NoArgsConstructor 16 | public class SearchTagReqVO { 17 | 18 | @NotBlank(message = "标签查询关键字不能为空") 19 | private String key; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/model/vo/user/QueryUserDetailRspVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.model.vo.user; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * @author: 犬小哈 10 | * @url: www.quanxiaoha.com 11 | * @date: 2023-04-19 16:06 12 | * @description: TODO 13 | **/ 14 | @Data 15 | @AllArgsConstructor 16 | @NoArgsConstructor 17 | @Builder 18 | public class QueryUserDetailRspVO { 19 | private String username; 20 | private String avatar; 21 | } 22 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/model/vo/user/UpdateAdminPasswordReqVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.model.vo.user; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import javax.validation.constraints.NotBlank; 9 | 10 | /** 11 | * @author: 犬小哈 12 | * @url: www.quanxiaoha.com 13 | * @date: 2023-04-19 16:06 14 | * @description: TODO 15 | **/ 16 | @Data 17 | @AllArgsConstructor 18 | @NoArgsConstructor 19 | @Builder 20 | public class UpdateAdminPasswordReqVO { 21 | @NotBlank(message = "用户名不能为空") 22 | private String username; 23 | @NotBlank(message = "密码不能为空") 24 | private String newPassword; 25 | } 26 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author: 犬小哈 3 | * @from: 公众号:小哈学Java, 网站:www.quanxiaoha.com 4 | * @date: 2023-04-15 14:17 5 | * @version: v1.0.0 6 | * @description: TODO 7 | **/ 8 | package com.quanxiaoha.weblog.admin; -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/service/AdminArticleService.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.service; 2 | 3 | import com.quanxiaoha.weblog.admin.model.vo.article.*; 4 | import com.quanxiaoha.weblog.common.Response; 5 | 6 | import java.util.List; 7 | 8 | public interface AdminArticleService { 9 | Response publishArticle(PublishArticleReqVO publishArticleReqVO); 10 | 11 | Response queryArticleDetail(QueryArticleDetailReqVO queryArticleDetailReqVO); 12 | 13 | Response queryArticlePageList(QueryArticlePageListReqVO queryArticlePageListReqVO); 14 | 15 | Response deleteArticle(DeleteArticleReqVO deleteArticleReqVO); 16 | 17 | Response updateArticle(UpdateArticleReqVO updateArticleReqVO); 18 | 19 | } 20 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/service/AdminBlogSettingService.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.quanxiaoha.weblog.admin.model.vo.blogsetting.UpdateBlogSettingReqVO; 5 | import com.quanxiaoha.weblog.admin.model.vo.user.QueryUserDetailRspVO; 6 | import com.quanxiaoha.weblog.common.Response; 7 | import com.quanxiaoha.weblog.common.domain.dos.BlogSettingDO; 8 | 9 | 10 | public interface AdminBlogSettingService extends IService { 11 | 12 | Response updateBlogSetting(UpdateBlogSettingReqVO updateBlogSettingReqVO); 13 | 14 | Response queryBlogSettingDetail(); 15 | 16 | Response queryNicknameAndAvatar(); 17 | } 18 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/service/AdminCategoryService.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.quanxiaoha.weblog.common.domain.dos.CategoryDO; 5 | import com.quanxiaoha.weblog.admin.model.vo.category.AddCategoryReqVO; 6 | import com.quanxiaoha.weblog.admin.model.vo.category.DeleteCategoryReqVO; 7 | import com.quanxiaoha.weblog.admin.model.vo.category.QueryCategoryPageListReqVO; 8 | import com.quanxiaoha.weblog.common.PageResponse; 9 | import com.quanxiaoha.weblog.common.Response; 10 | 11 | 12 | public interface AdminCategoryService extends IService { 13 | Response addCategory(AddCategoryReqVO addCategoryReqVO); 14 | 15 | PageResponse queryCategoryPageList(QueryCategoryPageListReqVO queryCategoryPageListReqVO); 16 | 17 | Response deleteCategory(DeleteCategoryReqVO deleteCategoryReqVO); 18 | 19 | Response queryCategorySelectList(); 20 | } 21 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/service/AdminDashboardService.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.service; 2 | 3 | 4 | import com.quanxiaoha.weblog.common.Response; 5 | 6 | public interface AdminDashboardService { 7 | 8 | Response queryDashboardArticleStatisticsInfo(); 9 | 10 | Response queryDashboardPublishArticleStatisticsInfo(); 11 | 12 | Response queryDashboardPVStatisticsInfo(); 13 | } 14 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/service/AdminFileService.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.service; 2 | 3 | import com.quanxiaoha.weblog.common.Response; 4 | import org.springframework.web.multipart.MultipartFile; 5 | 6 | public interface AdminFileService { 7 | Response uploadFile(MultipartFile file); 8 | } 9 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/service/AdminTagService.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.quanxiaoha.weblog.admin.model.vo.tag.SearchTagReqVO; 5 | import com.quanxiaoha.weblog.common.domain.dos.TagDO; 6 | import com.quanxiaoha.weblog.admin.model.vo.tag.AddTagReqVO; 7 | import com.quanxiaoha.weblog.admin.model.vo.tag.DeleteTagReqVO; 8 | import com.quanxiaoha.weblog.admin.model.vo.tag.QueryTagPageListReqVO; 9 | import com.quanxiaoha.weblog.common.Response; 10 | 11 | 12 | public interface AdminTagService extends IService { 13 | Response addTags(AddTagReqVO addTagReqVO); 14 | 15 | Response queryTagPageList(QueryTagPageListReqVO queryTagPageListReqVO); 16 | 17 | Response deleteTag(DeleteTagReqVO deleteTagReqVO); 18 | 19 | Response searchTags(SearchTagReqVO searchTagReqVO); 20 | 21 | Response queryTagSelectList(); 22 | } 23 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/service/AdminUserService.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.quanxiaoha.weblog.admin.model.vo.tag.AddTagReqVO; 5 | import com.quanxiaoha.weblog.admin.model.vo.tag.DeleteTagReqVO; 6 | import com.quanxiaoha.weblog.admin.model.vo.tag.QueryTagPageListReqVO; 7 | import com.quanxiaoha.weblog.admin.model.vo.tag.SearchTagReqVO; 8 | import com.quanxiaoha.weblog.admin.model.vo.user.UpdateAdminPasswordReqVO; 9 | import com.quanxiaoha.weblog.common.Response; 10 | import com.quanxiaoha.weblog.common.domain.dos.TagDO; 11 | import com.quanxiaoha.weblog.common.domain.dos.UserDO; 12 | 13 | 14 | public interface AdminUserService extends IService { 15 | Response updateAdminPassword(UpdateAdminPasswordReqVO updateAdminPasswordReqVO); 16 | } 17 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/service/impl/AdminFileServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.service.impl; 2 | 3 | import com.quanxiaoha.weblog.admin.model.vo.file.UploadFileRspVO; 4 | import com.quanxiaoha.weblog.admin.service.AdminFileService; 5 | import com.quanxiaoha.weblog.admin.utils.MinioUtil; 6 | import com.quanxiaoha.weblog.common.Response; 7 | import com.quanxiaoha.weblog.common.enums.ResponseCodeEnum; 8 | import com.quanxiaoha.weblog.common.exception.BizException; 9 | import lombok.extern.slf4j.Slf4j; 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.stereotype.Service; 12 | import org.springframework.web.multipart.MultipartFile; 13 | 14 | /** 15 | * @author: 犬小哈 16 | * @url: www.quanxiaoha.com 17 | * @date: 2023-04-17 12:08 18 | * @description: TODO 19 | **/ 20 | @Service 21 | @Slf4j 22 | public class AdminFileServiceImpl implements AdminFileService { 23 | 24 | @Autowired 25 | private MinioUtil minioUtil; 26 | 27 | @Override 28 | public Response uploadFile(MultipartFile file) { 29 | try { 30 | String url = minioUtil.uploadFile(file); 31 | return Response.success(UploadFileRspVO.builder().url(url).build()); 32 | } catch (Exception e) { 33 | log.error("==> 上传文件异常: ", e); 34 | throw new BizException(ResponseCodeEnum.UPLOAD_FILE_ERROR); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/service/impl/AdminUserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.service.impl; 2 | 3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 4 | import com.quanxiaoha.weblog.admin.dao.AdminUserDao; 5 | import com.quanxiaoha.weblog.admin.model.vo.user.UpdateAdminPasswordReqVO; 6 | import com.quanxiaoha.weblog.admin.service.AdminUserService; 7 | import com.quanxiaoha.weblog.common.Response; 8 | import com.quanxiaoha.weblog.common.domain.dos.UserDO; 9 | import com.quanxiaoha.weblog.common.domain.mapper.UserMapper; 10 | import lombok.extern.slf4j.Slf4j; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.security.crypto.password.PasswordEncoder; 13 | import org.springframework.stereotype.Service; 14 | 15 | import java.util.Date; 16 | 17 | /** 18 | * @author: 犬小哈 19 | * @url: www.quanxiaoha.com 20 | * @date: 2023-04-17 12:08 21 | * @description: TODO 22 | **/ 23 | @Service 24 | @Slf4j 25 | public class AdminUserServiceImpl extends ServiceImpl implements AdminUserService { 26 | 27 | @Autowired 28 | private PasswordEncoder passwordEncoder; 29 | @Autowired 30 | private AdminUserDao userDao; 31 | 32 | @Override 33 | public Response updateAdminPassword(UpdateAdminPasswordReqVO updateAdminPasswordReqVO) { 34 | UserDO userDO = UserDO.builder() 35 | .password(passwordEncoder.encode(updateAdminPasswordReqVO.getNewPassword())) 36 | .updateTime(new Date()) 37 | .build(); 38 | userDao.updateAdminPassword(userDO); 39 | return Response.success(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/service/impl/UserDetailServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.service.impl; 2 | 3 | import com.quanxiaoha.weblog.admin.dao.AdminUserDao; 4 | import com.quanxiaoha.weblog.admin.dao.AdminUserRoleDao; 5 | import com.quanxiaoha.weblog.common.domain.dos.UserDO; 6 | import com.quanxiaoha.weblog.common.domain.dos.UserRoleDO; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.beans.factory.annotation.Value; 10 | import org.springframework.security.core.userdetails.User; 11 | import org.springframework.security.core.userdetails.User.UserBuilder; 12 | import org.springframework.security.core.userdetails.UserDetails; 13 | import org.springframework.security.core.userdetails.UserDetailsService; 14 | import org.springframework.security.core.userdetails.UsernameNotFoundException; 15 | import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 16 | import org.springframework.security.crypto.password.PasswordEncoder; 17 | import org.springframework.stereotype.Service; 18 | import org.springframework.util.CollectionUtils; 19 | 20 | import java.util.List; 21 | import java.util.Objects; 22 | import java.util.stream.Collectors; 23 | 24 | /** 25 | * @author: 犬小哈 26 | * @url: www.quanxiaoha.com 27 | * @date: 2023-04-17 12:08 28 | * @description: TODO 29 | **/ 30 | @Service 31 | @Slf4j 32 | public class UserDetailServiceImpl implements UserDetailsService { 33 | 34 | @Autowired 35 | private AdminUserDao userDao; 36 | @Autowired 37 | private AdminUserRoleDao userRoleDao; 38 | 39 | @Override 40 | public UserDetails loadUserByUsername(String username) { 41 | UserDO userDO = userDao.selectByUsername(username); 42 | 43 | if (userDO == null) { 44 | throw new UsernameNotFoundException("该用户不存在"); 45 | } 46 | 47 | // 用户角色 48 | List roleDOS = userRoleDao.selectByUsername(username); 49 | 50 | String[] roleArr = null; 51 | 52 | if (!CollectionUtils.isEmpty(roleDOS)) { 53 | List roles = roleDOS.stream().map(p -> p.getRole()).collect(Collectors.toList()); 54 | roleArr = roles.toArray(new String[roles.size()]); 55 | } 56 | 57 | return User.withUsername(userDO.getUsername()) 58 | .password(userDO.getPassword()) 59 | .authorities(roleArr) 60 | .build(); 61 | } 62 | 63 | } 64 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-admin/src/main/java/com/quanxiaoha/weblog/admin/utils/MinioUtil.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.admin.utils; 2 | 3 | import com.quanxiaoha.weblog.admin.config.MinioProperties; 4 | import com.quanxiaoha.weblog.common.exception.BizException; 5 | import io.minio.MinioClient; 6 | import io.minio.PutObjectArgs; 7 | import io.minio.errors.*; 8 | import lombok.extern.slf4j.Slf4j; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.stereotype.Component; 11 | import org.springframework.web.multipart.MultipartFile; 12 | 13 | import java.io.IOException; 14 | import java.security.InvalidKeyException; 15 | import java.security.NoSuchAlgorithmException; 16 | import java.util.UUID; 17 | 18 | /** 19 | * @author: 犬小哈 20 | * @url: www.quanxiaoha.com 21 | * @date: 2023-05-11 9:02 22 | * @description: TODO 23 | **/ 24 | @Component 25 | @Slf4j 26 | public class MinioUtil { 27 | 28 | @Autowired 29 | private MinioProperties minioProperties; 30 | 31 | @Autowired 32 | private MinioClient minioClient; 33 | 34 | public String uploadFile(MultipartFile file) throws Exception { 35 | if (file == null || file.getSize() == 0) { 36 | log.error("==> 上传文件异常:文件大小为空 ..."); 37 | throw new RuntimeException("文件大小不能为空"); 38 | } 39 | 40 | String originalFileName = file.getOriginalFilename(); 41 | String contentType = file.getContentType(); 42 | 43 | String key = UUID.randomUUID().toString().replace("-", ""); 44 | String suffix = originalFileName.substring(originalFileName.lastIndexOf(".")); 45 | 46 | String objectName = String.format("%s%s", key, suffix); 47 | 48 | log.info("==> 开始上传文件至 Minio, ObjectName: {}", objectName); 49 | minioClient.putObject(PutObjectArgs.builder() 50 | .bucket(minioProperties.getBucketName()) 51 | .object(objectName) 52 | .stream(file.getInputStream(), file.getSize(), -1) 53 | .contentType(contentType) 54 | .build()); 55 | 56 | String url = String.format("%s/%s/%s", minioProperties.getEndpoint(), minioProperties.getBucketName(), objectName); 57 | log.info("==> 上传文件至 Minio 成功,访问路径: {}", url); 58 | return url; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/**/target/ 5 | !**/src/test/**/target/ 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | !**/src/main/**/build/ 30 | !**/src/test/**/build/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | /.mvn/ 35 | /mvnw 36 | /mvnw.cmd 37 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/PageResponse.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common; 2 | 3 | import com.baomidou.mybatisplus.core.metadata.IPage; 4 | import com.quanxiaoha.weblog.common.exception.BaseExceptionInterface; 5 | import com.quanxiaoha.weblog.common.exception.BizException; 6 | import lombok.Data; 7 | 8 | import java.io.Serializable; 9 | import java.util.List; 10 | import java.util.Objects; 11 | 12 | /** 13 | * @author: 犬小哈 14 | * @from: 公众号:小哈学Java, 网站:www.quanxiaoha.com 15 | * @date: 2023-04-16 10:50 16 | * @version: v1.0.0 17 | * @description: 分页数据响应类 18 | **/ 19 | @Data 20 | public class PageResponse extends Response> { 21 | 22 | // 总记录数 23 | private long total = 0L; 24 | // 每页显示的记录数 25 | private long size = 10L; 26 | // 当前页码 27 | private long current; 28 | // 总页数 29 | private long pages = 0L; 30 | 31 | public static PageResponse success(IPage page, List data) { 32 | PageResponse response = new PageResponse<>(); 33 | response.setSuccess(true); 34 | response.setCurrent(Objects.isNull(page) ? 0 : page.getCurrent()); 35 | response.setTotal(Objects.isNull(page) ? 0 : page.getTotal()); 36 | response.setSize(Objects.isNull(page) ? 0 : page.getSize()); 37 | response.setPages(Objects.isNull(page) ? 0 : page.getPages()); 38 | response.setData(data); 39 | return response; 40 | } 41 | 42 | 43 | } 44 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/Response.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common; 2 | 3 | import com.quanxiaoha.weblog.common.exception.BaseExceptionInterface; 4 | import com.quanxiaoha.weblog.common.exception.BizException; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | 8 | import java.io.Serializable; 9 | 10 | /** 11 | * @author: 犬小哈 12 | * @from: 公众号:小哈学Java, 网站:www.quanxiaoha.com 13 | * @date: 2023-04-16 10:50 14 | * @version: v1.0.0 15 | * @description: 响应类 16 | **/ 17 | @Data 18 | public class Response implements Serializable { 19 | 20 | private boolean success = true; 21 | private String errorCode; 22 | private String message; 23 | private T data; 24 | 25 | public static Response fail() { 26 | Response response = new Response<>(); 27 | response.setSuccess(false); 28 | return response; 29 | } 30 | 31 | public static Response fail(String errorMessage) { 32 | Response response = new Response<>(); 33 | response.setSuccess(false); 34 | response.setMessage(errorMessage); 35 | return response; 36 | } 37 | 38 | public static Response fail(String errorCode, String errorMessage) { 39 | Response response = new Response<>(); 40 | response.setSuccess(false); 41 | response.setErrorCode(errorCode); 42 | response.setMessage(errorMessage); 43 | return response; 44 | } 45 | 46 | public static Response fail(BaseExceptionInterface baseExceptionInterface) { 47 | Response response = new Response<>(); 48 | response.setSuccess(false); 49 | response.setErrorCode(baseExceptionInterface.getErrorCode()); 50 | response.setMessage(baseExceptionInterface.getErrorMessage()); 51 | return response; 52 | } 53 | 54 | public static Response fail(BizException bizException) { 55 | Response response = new Response<>(); 56 | response.setSuccess(false); 57 | response.setErrorCode(bizException.getErrorCode()); 58 | response.setMessage(bizException.getErrorMessage()); 59 | return response; 60 | } 61 | 62 | public static Response success(T data) { 63 | Response response = new Response<>(); 64 | response.setData(data); 65 | return response; 66 | } 67 | 68 | public static Response success() { 69 | Response response = new Response<>(); 70 | return response; 71 | } 72 | 73 | } 74 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/aspect/ApiOperationLog.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.aspect; 2 | 3 | import java.lang.annotation.*; 4 | 5 | @Retention(RetentionPolicy.RUNTIME) 6 | @Target({ElementType.METHOD}) 7 | @Documented 8 | public @interface ApiOperationLog { 9 | /** 10 | * 日志方法描述 11 | * 12 | * @return 13 | */ 14 | String description() default ""; 15 | 16 | } 17 | 18 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/config/EventBusConfig.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.config; 2 | 3 | import com.google.common.eventbus.EventBus; 4 | import com.quanxiaoha.weblog.common.eventbus.EventListener; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.context.annotation.Bean; 7 | import org.springframework.context.annotation.Configuration; 8 | 9 | /** 10 | * @author: 犬小哈 11 | * @url: www.quanxiaoha.com 12 | * @date: 2023-07-01 21:42 13 | * @description: TODO 14 | **/ 15 | @Configuration 16 | public class EventBusConfig { 17 | 18 | @Autowired 19 | private EventListener eventListener; 20 | 21 | @Bean 22 | public EventBus eventBus() { 23 | EventBus eventBus = new EventBus(); 24 | eventBus.register(eventListener); 25 | return eventBus; 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/config/InsertBatchSqlInjector.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.config; 2 | 3 | import com.baomidou.mybatisplus.core.injector.AbstractMethod; 4 | import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; 5 | import com.baomidou.mybatisplus.core.metadata.TableInfo; 6 | import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * @author: 犬小哈 12 | * @url: www.quanxiaoha.com 13 | * @date: 2023-06-13 22:46 14 | * @description: TODO 15 | **/ 16 | public class InsertBatchSqlInjector extends DefaultSqlInjector { 17 | 18 | @Override 19 | public List getMethodList(Class mapperClass, TableInfo tableInfo) { 20 | // super.getMethodList() 保留 Mybatis Plus 自带的方法 21 | List methodList = super.getMethodList(mapperClass, tableInfo); 22 | // 添加自定义方法:批量插入,方法名为 insertBatchSomeColumn 23 | methodList.add(new InsertBatchSomeColumn()); 24 | return methodList; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/config/MyBaseMapper.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.config; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import org.apache.ibatis.annotations.Param; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * @author: 犬小哈 10 | * @url: www.quanxiaoha.com 11 | * @date: 2023-06-13 22:50 12 | * @description: TODO 13 | **/ 14 | public interface MyBaseMapper extends BaseMapper { 15 | 16 | // 批量插入 17 | int insertBatchSomeColumn(@Param("list") List batchList); 18 | 19 | } 20 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/config/MybatisPlusConfig.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.config; 2 | 3 | import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; 4 | import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; 5 | import org.mybatis.spring.annotation.MapperScan; 6 | import org.springframework.context.annotation.Bean; 7 | import org.springframework.context.annotation.Configuration; 8 | 9 | @Configuration 10 | @MapperScan("com.quanxiaoha.weblog.common.domain.mapper") 11 | public class MybatisPlusConfig { 12 | 13 | /** 14 | * 分页插件 15 | * @return 16 | */ 17 | @Bean 18 | public MybatisPlusInterceptor mybatisPlusInterceptor(){ 19 | MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); 20 | interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 21 | return interceptor; 22 | } 23 | 24 | /** 25 | * 自定义批量插入 SQL 注入器 26 | */ 27 | @Bean 28 | public InsertBatchSqlInjector insertBatchSqlInjector() { 29 | return new InsertBatchSqlInjector(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/constant/Constants.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.constant; 2 | 3 | import java.text.DateFormat; 4 | import java.text.SimpleDateFormat; 5 | import java.time.format.DateTimeFormatter; 6 | 7 | /** 8 | * @author: 犬小哈 9 | * @url: www.quanxiaoha.com 10 | * @date: 2023-07-01 16:37 11 | * @description: 全局静态变量 12 | **/ 13 | public interface Constants { 14 | 15 | DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); 16 | 17 | DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); 18 | 19 | DateFormat MONTH_FORMAT = new SimpleDateFormat("yyyy-MM"); 20 | } 21 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/dos/ArticleCategoryRelDO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.dos; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.Builder; 7 | import lombok.Data; 8 | 9 | import java.util.Date; 10 | 11 | @Data 12 | @Builder 13 | @TableName("t_article_category_rel") 14 | public class ArticleCategoryRelDO { 15 | @TableId(type = IdType.AUTO) 16 | private Long id; 17 | private Long articleId; 18 | private Long categoryId; 19 | } 20 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/dos/ArticleContentDO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.dos; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.Builder; 7 | import lombok.Data; 8 | 9 | import java.time.LocalDateTime; 10 | 11 | @Data 12 | @Builder 13 | @TableName("t_article_content") 14 | public class ArticleContentDO { 15 | @TableId(type = IdType.AUTO) 16 | private Long id; 17 | private Long articleId; 18 | private String content; 19 | } 20 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/dos/ArticleCountDO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.dos; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.Builder; 7 | import lombok.Data; 8 | 9 | import java.util.Date; 10 | 11 | @Data 12 | @Builder 13 | public class ArticleCountDO { 14 | private String date; 15 | private Long count; 16 | } 17 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/dos/ArticleDO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.dos; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.Builder; 7 | import lombok.Data; 8 | 9 | import java.time.LocalDateTime; 10 | import java.util.Date; 11 | 12 | @Data 13 | @Builder 14 | @TableName("t_article") 15 | public class ArticleDO { 16 | @TableId(type = IdType.AUTO) 17 | private Long id; 18 | private String title; 19 | private String titleImage; 20 | private String description; 21 | private Date createTime; 22 | private Date updateTime; 23 | private Boolean isDeleted; 24 | private Long readNum; 25 | } 26 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/dos/ArticleTagRelDO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.dos; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.Builder; 7 | import lombok.Data; 8 | 9 | @Data 10 | @Builder 11 | @TableName("t_article_tag_rel") 12 | public class ArticleTagRelDO { 13 | @TableId(type = IdType.AUTO) 14 | private Long id; 15 | private Long articleId; 16 | private Long tagId; 17 | } 18 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/dos/BlogSettingDO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.dos; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.Builder; 7 | import lombok.Data; 8 | 9 | import java.util.Date; 10 | 11 | @Data 12 | @Builder 13 | @TableName("t_blog_setting") 14 | public class BlogSettingDO { 15 | @TableId(type = IdType.AUTO) 16 | private Long id; 17 | private String blogName; 18 | private String author; 19 | private String avatar; 20 | private String introduction; 21 | private String githubHome; 22 | private String csdnHome; 23 | private String giteeHome; 24 | private String zhihuHome; 25 | } 26 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/dos/CategoryDO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.dos; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.Builder; 7 | import lombok.Data; 8 | 9 | import java.util.Date; 10 | 11 | @Data 12 | @Builder 13 | @TableName("t_category") 14 | public class CategoryDO { 15 | @TableId(type = IdType.AUTO) 16 | private Long id; 17 | private String name; 18 | private Date createTime; 19 | private Date updateTime; 20 | private Boolean isDeleted; 21 | } 22 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/dos/StatisticsArticlePVDO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.dos; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.Builder; 7 | import lombok.Data; 8 | 9 | import java.util.Date; 10 | 11 | @Data 12 | @Builder 13 | @TableName("t_statistics_article_pv") 14 | public class StatisticsArticlePVDO { 15 | @TableId(type = IdType.AUTO) 16 | private Long id; 17 | private Date pvDate; 18 | private Long pvCount; 19 | private Date createTime; 20 | } 21 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/dos/TagDO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.dos; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.Builder; 7 | import lombok.Data; 8 | 9 | import java.util.Date; 10 | 11 | @Data 12 | @Builder 13 | @TableName("t_tag") 14 | public class TagDO { 15 | @TableId(type = IdType.AUTO) 16 | private Long id; 17 | private String name; 18 | private Date createTime; 19 | private Date updateTime; 20 | private Boolean isDeleted; 21 | } 22 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/dos/UserDO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.dos; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.Builder; 7 | import lombok.Data; 8 | 9 | import java.util.Date; 10 | 11 | @Data 12 | @Builder 13 | @TableName("t_user") 14 | public class UserDO { 15 | @TableId(type = IdType.AUTO) 16 | private Long id; 17 | private String username; 18 | private String password; 19 | private Date createTime; 20 | private Date updateTime; 21 | private Boolean isDeleted; 22 | } 23 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/dos/UserRoleDO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.dos; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.Builder; 7 | import lombok.Data; 8 | 9 | import java.util.Date; 10 | 11 | @Data 12 | @Builder 13 | @TableName("t_user_role") 14 | public class UserRoleDO { 15 | @TableId(type = IdType.AUTO) 16 | private Long id; 17 | private String username; 18 | private String role; 19 | private Date createTime; 20 | } 21 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/dos/VisitorRecordDO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.dos; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Data; 9 | import lombok.NoArgsConstructor; 10 | 11 | import java.util.Date; 12 | 13 | /** 14 | * @author yjf 15 | * @description 访客记录表 16 | */ 17 | @Data 18 | @Builder 19 | @TableName("t_visitor_record") 20 | @AllArgsConstructor 21 | @NoArgsConstructor 22 | public class VisitorRecordDO { 23 | 24 | @TableId(type = IdType.AUTO) 25 | private Long id; 26 | private String visitor; 27 | private String ipAddress; 28 | private String ipRegion; 29 | private Date visitTime; 30 | private Integer isNotify; 31 | } 32 | 33 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/mapper/ArticleCategoryRelMapper.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.quanxiaoha.weblog.common.domain.dos.ArticleCategoryRelDO; 5 | 6 | public interface ArticleCategoryRelMapper extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/mapper/ArticleContentMapper.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.quanxiaoha.weblog.common.domain.dos.ArticleContentDO; 5 | 6 | public interface ArticleContentMapper extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/mapper/ArticleMapper.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.quanxiaoha.weblog.common.domain.dos.ArticleCountDO; 5 | import com.quanxiaoha.weblog.common.domain.dos.ArticleDO; 6 | import org.apache.ibatis.annotations.Param; 7 | import org.apache.ibatis.annotations.Select; 8 | 9 | import java.util.List; 10 | 11 | public interface ArticleMapper extends BaseMapper { 12 | 13 | @Select("SELECT DATE(create_time) AS date, COUNT(*) AS count\n" + 14 | "FROM t_article\n" + 15 | "WHERE create_time >= #{startDate} AND create_time <= #{endDate}\n" + 16 | "GROUP BY DATE(create_time)\n" + 17 | "ORDER BY DATE(create_time)") 18 | List selectArticleCount(@Param("startDate") String startDate, @Param("endDate") String endDate); 19 | } 20 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/mapper/ArticleTagRelMapper.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.mapper; 2 | 3 | import com.quanxiaoha.weblog.common.config.MyBaseMapper; 4 | import com.quanxiaoha.weblog.common.domain.dos.ArticleTagRelDO; 5 | 6 | public interface ArticleTagRelMapper extends MyBaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/mapper/BlogSettingMapper.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.quanxiaoha.weblog.common.domain.dos.BlogSettingDO; 5 | 6 | public interface BlogSettingMapper extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/mapper/CategoryMapper.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.quanxiaoha.weblog.common.domain.dos.CategoryDO; 5 | 6 | public interface CategoryMapper extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/mapper/StatisticsArticlePVMapper.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.quanxiaoha.weblog.common.domain.dos.ArticleCountDO; 5 | import com.quanxiaoha.weblog.common.domain.dos.ArticleDO; 6 | import com.quanxiaoha.weblog.common.domain.dos.StatisticsArticlePVDO; 7 | import org.apache.ibatis.annotations.Param; 8 | import org.apache.ibatis.annotations.Select; 9 | 10 | import java.util.List; 11 | 12 | public interface StatisticsArticlePVMapper extends BaseMapper { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/mapper/TagMapper.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.quanxiaoha.weblog.common.domain.dos.TagDO; 5 | 6 | public interface TagMapper extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/mapper/UserMapper.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.quanxiaoha.weblog.common.domain.dos.TagDO; 5 | import com.quanxiaoha.weblog.common.domain.dos.UserDO; 6 | 7 | public interface UserMapper extends BaseMapper { 8 | } 9 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/mapper/UserRoleMapper.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.quanxiaoha.weblog.common.domain.dos.UserDO; 5 | import com.quanxiaoha.weblog.common.domain.dos.UserRoleDO; 6 | 7 | public interface UserRoleMapper extends BaseMapper { 8 | } 9 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/domain/mapper/VisitorMapper.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.domain.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.quanxiaoha.weblog.common.domain.dos.VisitorRecordDO; 5 | 6 | /** 7 | * @author yjf 8 | * @description 访客记录 9 | */ 10 | public interface VisitorMapper extends BaseMapper { 11 | 12 | } -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/enums/EventEnum.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.enums; 2 | 3 | import com.quanxiaoha.weblog.common.exception.BaseExceptionInterface; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | 7 | /** 8 | * @author: 犬小哈 9 | * @url: www.quanxiaoha.com 10 | * @date: 2023-04-18 8:14 11 | * @description: 响应枚举 12 | **/ 13 | @Getter 14 | @AllArgsConstructor 15 | public enum EventEnum { 16 | 17 | // PV 加 1 18 | PV_INCREASE("PV INCREASE"), 19 | ; 20 | 21 | private String message; 22 | 23 | } 24 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/enums/ResponseCodeEnum.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.enums; 2 | 3 | import com.quanxiaoha.weblog.common.exception.BaseExceptionInterface; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | 7 | /** 8 | * @author: 犬小哈 9 | * @url: www.quanxiaoha.com 10 | * @date: 2023-04-18 8:14 11 | * @description: 响应枚举 12 | **/ 13 | @Getter 14 | @AllArgsConstructor 15 | public enum ResponseCodeEnum implements BaseExceptionInterface { 16 | 17 | // ----------- 通用异常状态码 ----------- 18 | SYSTEM_ERROR("10000", "出错啦,后台小哥正在努力修复中"), 19 | PARAM_ERROR("10001", "参数错误"), 20 | 21 | // ----------- 业务异常状态码 ----------- 22 | UNAUTHORIZED("10002", "无访问权限,请先登录!"), 23 | FORBIDDEN("10003", "演示账号仅支持查询操作!"), 24 | NO_TOKEN_OR_TOKEN_INVALID("10004", "Token 丢失或 Token 不可用!"), 25 | LOGIN_FAIL("10005", "登录失败"), 26 | USERNAME_OR_PWD_ERROR("10006", "用户名或密码错误"), 27 | UPLOAD_FILE_ERROR("10007", "文件上传失败"), 28 | DUPLICATE_TAG_ERROR("10008", "提交的部分标签已被创建"), 29 | DUPLICATE_CATEGORY_ERROR("10009", "该分类已被创建"), 30 | TOKEN_EXPIRED("10010", "Token 已过期"), 31 | 32 | /** 33 | * code: 20001
34 | * info: 访客IP归属地查询失败 35 | */ 36 | AGENT_REGION_SEARCH_ERROR("20001", "访客IP归属地查询失败"), 37 | ; 38 | 39 | private String errorCode; 40 | private String errorMessage; 41 | 42 | } 43 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/eventbus/ArticleEvent.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.eventbus; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | 7 | /** 8 | * @author: 犬小哈 9 | * @url: www.quanxiaoha.com 10 | * @date: 2023-07-01 21:39 11 | * @description: TODO 12 | **/ 13 | @Getter 14 | @Builder 15 | public class ArticleEvent { 16 | private Long articleId; 17 | private String message; 18 | } 19 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/eventbus/EventListener.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.eventbus; 2 | 3 | /** 4 | * @author: 犬小哈 5 | * @url: www.quanxiaoha.com 6 | * @date: 2023-07-02 9:20 7 | * @description: TODO 8 | **/ 9 | public interface EventListener { 10 | void handleEvent(ArticleEvent weblogEvent); 11 | } 12 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/exception/BaseExceptionInterface.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.exception; 2 | 3 | /** 4 | * @author: 犬小哈 5 | * @url: www.quanxiaoha.com 6 | * @date: 2023-04-18 8:06 7 | * @description: TODO 8 | **/ 9 | public interface BaseExceptionInterface { 10 | 11 | String getErrorCode(); 12 | 13 | String getErrorMessage(); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/exception/BizException.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.exception; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | /** 7 | * @author: 犬小哈 8 | * @url: www.quanxiaoha.com 9 | * @date: 2023-04-18 8:03 10 | * @description: 业务异常 11 | **/ 12 | @Getter 13 | @Setter 14 | public class BizException extends RuntimeException { 15 | // 错误码 16 | private String errorCode; 17 | // 错误信息 18 | private String errorMessage; 19 | 20 | public BizException(BaseExceptionInterface exception) { 21 | this.errorCode = exception.getErrorCode(); 22 | this.errorMessage = exception.getErrorMessage(); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/exception/NotAuthorizedException.java: -------------------------------------------------------------------------------- 1 | // package com.quanxiaoha.weblog.common.exception; 2 | // 3 | // import org.springframework.http.HttpStatus; 4 | // import org.springframework.web.bind.annotation.ResponseStatus; 5 | // 6 | // /** 7 | // * @author: 犬小哈 8 | // * @url: www.quanxiaoha.com 9 | // * @date: 2023-04-18 8:49 10 | // * @description: TODO 11 | // **/ 12 | // @ResponseStatus(HttpStatus.UNAUTHORIZED) 13 | // public class NotAuthorizedException extends RuntimeException { 14 | // public NotAuthorizedException() { 15 | // super("401 Unauthorized"); 16 | // } 17 | // } 18 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/exception/ResourceNotFoundException.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.exception; 2 | 3 | import org.springframework.http.HttpStatus; 4 | import org.springframework.web.bind.annotation.ResponseStatus; 5 | 6 | /** 7 | * @author: 犬小哈 8 | * @url: www.quanxiaoha.com 9 | * @date: 2023-04-18 8:24 10 | * @description: 资源不存在 11 | **/ 12 | @ResponseStatus(HttpStatus.NOT_FOUND) 13 | public class ResourceNotFoundException extends RuntimeException { 14 | 15 | public ResourceNotFoundException() { 16 | super("The resource not found."); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/main/java/com/quanxiaoha/weblog/common/model/vo/QuerySelectListRspVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common.model.vo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * @author: 犬小哈 10 | * @url: www.quanxiaoha.com 11 | * @date: 2023-04-19 16:06 12 | * @description: TODO 13 | **/ 14 | @Data 15 | @AllArgsConstructor 16 | @NoArgsConstructor 17 | @Builder 18 | public class QuerySelectListRspVO { 19 | private String label; 20 | private Long value; 21 | } 22 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-common/src/test/java/com/quanxiaoha/weblog/common/WeblogCommonApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.common; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class WeblogCommonApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-jwt/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/**/target/ 5 | !**/src/test/**/target/ 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | !**/src/main/**/build/ 30 | !**/src/test/**/build/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | /.mvn/ 35 | /mvnw 36 | /mvnw.cmd 37 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-jwt/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | com.quanxiaoha 7 | weblog-springboot 8 | ${revision} 9 | 10 | com.quanxiaoha 11 | weblog-module-jwt 12 | weblog-module-jwt 13 | weblog-module-jwt 14 | 15 | 16 | 17 | com.quanxiaoha 18 | weblog-module-common 19 | 20 | 21 | 22 | org.springframework.boot 23 | spring-boot-starter-web 24 | 25 | 26 | 27 | org.springframework.boot 28 | spring-boot-starter-test 29 | test 30 | 31 | 32 | 33 | org.springframework.boot 34 | spring-boot-starter-security 35 | 36 | 37 | 38 | 39 | io.jsonwebtoken 40 | jjwt-api 41 | 42 | 43 | io.jsonwebtoken 44 | jjwt-impl 45 | 46 | 47 | io.jsonwebtoken 48 | jjwt-jackson 49 | 50 | 51 | 52 | org.projectlombok 53 | lombok 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-jwt/src/main/java/com/quanxiaoha/weblog/jwt/JwtAuthenticationLoginFilter.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.jwt; 2 | 3 | import com.fasterxml.jackson.databind.JsonNode; 4 | import com.fasterxml.jackson.databind.ObjectMapper; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; 7 | import org.springframework.security.core.Authentication; 8 | import org.springframework.security.core.AuthenticationException; 9 | import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter; 10 | import org.springframework.security.web.util.matcher.AntPathRequestMatcher; 11 | 12 | import javax.servlet.ServletException; 13 | import javax.servlet.http.HttpServletRequest; 14 | import javax.servlet.http.HttpServletResponse; 15 | import java.io.IOException; 16 | 17 | /** 18 | * @author: 犬小哈 19 | * @url: www.quanxiaoha.com 20 | * @date: 2023-04-18 16:21 21 | * @description: 登录认证过滤器 22 | **/ 23 | @Slf4j 24 | public class JwtAuthenticationLoginFilter extends AbstractAuthenticationProcessingFilter { 25 | 26 | /** 27 | * 设置登录认证的访问地址 28 | */ 29 | public JwtAuthenticationLoginFilter() { 30 | super(new AntPathRequestMatcher("/login", "POST")); 31 | } 32 | 33 | @Override 34 | public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException { 35 | ObjectMapper mapper = new ObjectMapper(); 36 | JsonNode jsonNode = mapper.readTree(request.getInputStream()); 37 | String username = jsonNode.get("username").textValue(); 38 | String password = jsonNode.get("password").textValue(); 39 | 40 | log.info("==> 用户尝试登录认证,username: {}, password: {}", username, password); 41 | 42 | // 将用户名、密码封装到 Token 中 43 | UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken 44 | = new UsernamePasswordAuthenticationToken(username, password); 45 | return getAuthenticationManager().authenticate(usernamePasswordAuthenticationToken); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-jwt/src/main/java/com/quanxiaoha/weblog/jwt/LoginAuthenticationFailureHandler.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.jwt; 2 | 3 | import com.quanxiaoha.weblog.common.Response; 4 | import com.quanxiaoha.weblog.common.enums.ResponseCodeEnum; 5 | import com.quanxiaoha.weblog.jwt.utils.ResultUtil; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.security.authentication.BadCredentialsException; 8 | import org.springframework.security.authentication.InternalAuthenticationServiceException; 9 | import org.springframework.security.core.AuthenticationException; 10 | import org.springframework.security.web.authentication.AuthenticationFailureHandler; 11 | import org.springframework.stereotype.Component; 12 | 13 | import javax.servlet.ServletException; 14 | import javax.servlet.http.HttpServletRequest; 15 | import javax.servlet.http.HttpServletResponse; 16 | import java.io.IOException; 17 | 18 | /** 19 | * @author: 犬小哈 20 | * @url: www.quanxiaoha.com 21 | * @date: 2023-04-18 16:30 22 | * @description: 登录认证失败后处理 23 | **/ 24 | @Component 25 | @Slf4j 26 | public class LoginAuthenticationFailureHandler implements AuthenticationFailureHandler { 27 | 28 | @Override 29 | public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { 30 | log.warn("AuthenticationException: ", exception); 31 | if (exception instanceof BadCredentialsException || exception instanceof InternalAuthenticationServiceException) { 32 | // 用户名或密码错误 33 | ResultUtil.ok(response, Response.fail(ResponseCodeEnum.USERNAME_OR_PWD_ERROR)); 34 | } 35 | 36 | // 登录失败 37 | ResultUtil.ok(response, Response.fail(ResponseCodeEnum.LOGIN_FAIL)); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-jwt/src/main/java/com/quanxiaoha/weblog/jwt/LoginAuthenticationSuccessHandler.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.jwt; 2 | 3 | import com.quanxiaoha.weblog.common.Response; 4 | import com.quanxiaoha.weblog.jwt.model.CreateTokenRspVO; 5 | import com.quanxiaoha.weblog.jwt.utils.ResultUtil; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.security.core.Authentication; 9 | import org.springframework.security.core.userdetails.UserDetails; 10 | import org.springframework.security.web.authentication.AuthenticationSuccessHandler; 11 | import org.springframework.stereotype.Component; 12 | 13 | import javax.servlet.ServletException; 14 | import javax.servlet.http.HttpServletRequest; 15 | import javax.servlet.http.HttpServletResponse; 16 | import java.io.IOException; 17 | 18 | /** 19 | * @author: 犬小哈 20 | * @url: www.quanxiaoha.com 21 | * @date: 2023-04-18 16:30 22 | * @description: 登录认证成功后处理 23 | **/ 24 | @Component 25 | @Slf4j 26 | public class LoginAuthenticationSuccessHandler implements AuthenticationSuccessHandler { 27 | @Autowired 28 | private JwtTokenHelper jwtTokenHelper; 29 | 30 | @Override 31 | public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { 32 | UserDetails userDetails = (UserDetails) authentication.getPrincipal(); 33 | 34 | // 生成 token 35 | String username = userDetails.getUsername(); 36 | String token = jwtTokenHelper.generateToken(username); 37 | 38 | // 返回结果 39 | CreateTokenRspVO tokenRspDTO = CreateTokenRspVO.builder() 40 | .token(token) 41 | .build(); 42 | 43 | log.info("==> 用户认证成功, username: {}, token: {}", username, token); 44 | 45 | ResultUtil.ok(response, Response.success(tokenRspDTO)); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-jwt/src/main/java/com/quanxiaoha/weblog/jwt/RestAccessDeniedHandler.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.jwt; 2 | 3 | import com.quanxiaoha.weblog.common.Response; 4 | import com.quanxiaoha.weblog.common.enums.ResponseCodeEnum; 5 | import com.quanxiaoha.weblog.jwt.utils.ResultUtil; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.security.access.AccessDeniedException; 8 | import org.springframework.security.web.access.AccessDeniedHandler; 9 | import org.springframework.stereotype.Component; 10 | 11 | import javax.servlet.ServletException; 12 | import javax.servlet.http.HttpServletRequest; 13 | import javax.servlet.http.HttpServletResponse; 14 | import java.io.IOException; 15 | 16 | /** 17 | * @author: 犬小哈 18 | * @url: www.quanxiaoha.com 19 | * @date: 2023-04-18 9:23 20 | * @description: 登录成功后访问受保护的资源,但是权限不够 21 | **/ 22 | @Component 23 | @Slf4j 24 | public class RestAccessDeniedHandler implements AccessDeniedHandler { 25 | 26 | @Override 27 | public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException { 28 | log.warn("", accessDeniedException); 29 | ResultUtil.ok(response, Response.fail(ResponseCodeEnum.FORBIDDEN)); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-jwt/src/main/java/com/quanxiaoha/weblog/jwt/RestAuthenticationEntryPoint.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.jwt; 2 | 3 | import com.quanxiaoha.weblog.common.Response; 4 | import com.quanxiaoha.weblog.common.enums.ResponseCodeEnum; 5 | import com.quanxiaoha.weblog.jwt.utils.ResultUtil; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.http.HttpStatus; 8 | import org.springframework.security.authentication.InsufficientAuthenticationException; 9 | import org.springframework.security.core.AuthenticationException; 10 | import org.springframework.security.web.AuthenticationEntryPoint; 11 | import org.springframework.stereotype.Component; 12 | 13 | import javax.servlet.http.HttpServletRequest; 14 | import javax.servlet.http.HttpServletResponse; 15 | import java.io.IOException; 16 | 17 | /** 18 | * @author: 犬小哈 19 | * @url: www.quanxiaoha.com 20 | * @date: 2023-04-18 9:23 21 | * @description: 用户未登录访问受保护的资源 22 | **/ 23 | @Component 24 | @Slf4j 25 | public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint { 26 | 27 | @Override 28 | public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) 29 | throws IOException { 30 | log.warn("", authException); 31 | if (authException instanceof InsufficientAuthenticationException) { 32 | ResultUtil.fail(response, HttpStatus.UNAUTHORIZED.value(), Response.fail(ResponseCodeEnum.NO_TOKEN_OR_TOKEN_INVALID)); 33 | // ResultUtil.ok(response, Response.fail(ResponseCodeEnum.NO_TOKEN_OR_TOKEN_INVALID)); 34 | } 35 | ResultUtil.fail(response, HttpStatus.UNAUTHORIZED.value(), Response.fail(ResponseCodeEnum.UNAUTHORIZED)); 36 | // ResultUtil.ok(response, Response.fail(ResponseCodeEnum.UNAUTHORIZED)); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-jwt/src/main/java/com/quanxiaoha/weblog/jwt/model/CreateTokenReqVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.jwt.model; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * @author: 犬小哈 10 | * @url: www.quanxiaoha.com 11 | * @date: 2023-04-19 16:06 12 | * @description: TODO 13 | **/ 14 | @Data 15 | @AllArgsConstructor 16 | @NoArgsConstructor 17 | @Builder 18 | public class CreateTokenReqVO { 19 | private String username; 20 | private String password; 21 | } 22 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-jwt/src/main/java/com/quanxiaoha/weblog/jwt/model/CreateTokenRspVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.jwt.model; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * @author: 犬小哈 10 | * @url: www.quanxiaoha.com 11 | * @date: 2023-04-19 16:06 12 | * @description: TODO 13 | **/ 14 | @Data 15 | @AllArgsConstructor 16 | @NoArgsConstructor 17 | @Builder 18 | public class CreateTokenRspVO { 19 | private String token; 20 | } 21 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-jwt/src/main/java/com/quanxiaoha/weblog/jwt/utils/ResultUtil.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.jwt.utils; 2 | 3 | import com.fasterxml.jackson.databind.ObjectMapper; 4 | import com.quanxiaoha.weblog.common.Response; 5 | import org.springframework.http.HttpStatus; 6 | 7 | import javax.servlet.http.HttpServletResponse; 8 | import java.io.IOException; 9 | import java.io.PrintWriter; 10 | 11 | /** 12 | * @author: 犬小哈 13 | * @url: www.quanxiaoha.com 14 | * @date: 2023-04-18 15:05 15 | * @description: TODO 16 | **/ 17 | public class ResultUtil { 18 | 19 | public static void ok(HttpServletResponse response, Response result) throws IOException { 20 | response.setCharacterEncoding("UTF-8"); 21 | response.setStatus(HttpStatus.OK.value()); 22 | response.setContentType("application/json"); 23 | PrintWriter writer = response.getWriter(); 24 | 25 | ObjectMapper mapper = new ObjectMapper(); 26 | writer.write(mapper.writeValueAsString(result)); 27 | writer.flush(); 28 | writer.close(); 29 | } 30 | 31 | public static void fail(HttpServletResponse response, int status, Response result) throws IOException { 32 | response.setCharacterEncoding("UTF-8"); 33 | response.setStatus(status); 34 | response.setContentType("application/json"); 35 | PrintWriter writer = response.getWriter(); 36 | 37 | ObjectMapper mapper = new ObjectMapper(); 38 | writer.write(mapper.writeValueAsString(result)); 39 | writer.flush(); 40 | writer.close(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-module-jwt/src/test/java/com/example/weblogmodule/jwt/WeblogModuleJwtApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.weblogmodule.jwt; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class WeblogModuleJwtApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/**/target/ 5 | !**/src/test/**/target/ 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | !**/src/main/**/build/ 30 | !**/src/test/**/build/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | /.mvn/ 35 | /mvnw 36 | /mvnw.cmd 37 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | com.quanxiaoha 7 | weblog-springboot 8 | ${revision} 9 | 10 | 11 | com.quanxiaoha 12 | weblog-web 13 | weblog-web 14 | weblog-web 15 | 16 | 17 | 18 | com.quanxiaoha 19 | weblog-module-common 20 | 21 | 22 | 23 | com.quanxiaoha 24 | weblog-module-admin 25 | 26 | 27 | 28 | com.quanxiaoha 29 | weblog-module-jwt 30 | 31 | 32 | 33 | org.springframework.boot 34 | spring-boot-starter-web 35 | 36 | 37 | 38 | 39 | com.vladsch.flexmark 40 | flexmark-all 41 | 42 | 43 | 44 | 45 | 46 | 47 | org.springframework.boot 48 | spring-boot-maven-plugin 49 | 50 | 51 | org.apache.maven.plugins 52 | maven-compiler-plugin 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/WeblogWebApplication.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.context.annotation.ComponentScan; 6 | import org.springframework.scheduling.annotation.EnableScheduling; 7 | 8 | @SpringBootApplication 9 | @ComponentScan({"com.quanxiaoha.weblog.*"}) 10 | @EnableScheduling 11 | public class WeblogWebApplication { 12 | 13 | public static void main(String[] args) { 14 | SpringApplication.run(WeblogWebApplication.class, args); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/config/CrosConfig.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.config; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | import org.springframework.web.servlet.config.annotation.CorsRegistry; 5 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 6 | 7 | /** 8 | * @author: 犬小哈 9 | * @url: www.quanxiaoha.com 10 | * @date: 2023-07-12 9:08 11 | * @description: 跨域访问配置 12 | **/ 13 | @Configuration 14 | public class CrosConfig implements WebMvcConfigurer { 15 | 16 | @Override 17 | public void addCorsMappings(CorsRegistry registry) { 18 | registry.addMapping("/**") // 设置允许跨域的路径 19 | .allowedOriginPatterns("*") // 设置允许跨域请求的源 20 | .allowedMethods("GET", "POST", "PUT", "DELETE") // 设置允许的请求方法 21 | .allowedHeaders("*") // 设置允许的请求头 22 | .maxAge(3600) 23 | .allowCredentials(true); // 设置是否允许发送Cookie 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/controller/ArchiveController.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.controller; 2 | 3 | import com.quanxiaoha.weblog.common.PageResponse; 4 | import com.quanxiaoha.weblog.common.Response; 5 | import com.quanxiaoha.weblog.common.aspect.ApiOperationLog; 6 | import com.quanxiaoha.weblog.web.model.vo.archive.QueryArchivePageListReqVO; 7 | import com.quanxiaoha.weblog.web.model.vo.article.QueryIndexArticlePageListReqVO; 8 | import com.quanxiaoha.weblog.web.model.vo.article.QueryTagArticlePageListReqVO; 9 | import com.quanxiaoha.weblog.web.service.ArchiveService; 10 | import com.quanxiaoha.weblog.web.service.ArticleService; 11 | import com.quanxiaoha.weblog.web.service.TagService; 12 | import org.springframework.beans.factory.annotation.Autowired; 13 | import org.springframework.validation.annotation.Validated; 14 | import org.springframework.web.bind.annotation.PostMapping; 15 | import org.springframework.web.bind.annotation.RequestBody; 16 | import org.springframework.web.bind.annotation.RequestMapping; 17 | import org.springframework.web.bind.annotation.RestController; 18 | 19 | /** 20 | * @author: 犬小哈 21 | * @url: www.quanxiaoha.com 22 | * @date: 2023-04-18 8:14 23 | * @description: 归档 24 | **/ 25 | @RestController 26 | @RequestMapping("/archive") 27 | public class ArchiveController { 28 | 29 | @Autowired 30 | private ArchiveService archiveService; 31 | 32 | @PostMapping("/list") 33 | @ApiOperationLog(description = "获取文章归档列表") 34 | public Response queryArchive(@RequestBody QueryArchivePageListReqVO queryArchivePageListReqVO) { 35 | return archiveService.queryArchive(queryArchivePageListReqVO); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/controller/ArticleController.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.controller; 2 | 3 | import com.quanxiaoha.weblog.common.Response; 4 | import com.quanxiaoha.weblog.common.aspect.ApiOperationLog; 5 | import com.quanxiaoha.weblog.web.model.vo.article.QueryArticleDetailReqVO; 6 | import com.quanxiaoha.weblog.web.service.ArticleService; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.validation.annotation.Validated; 9 | import org.springframework.web.bind.annotation.PostMapping; 10 | import org.springframework.web.bind.annotation.RequestBody; 11 | import org.springframework.web.bind.annotation.RequestMapping; 12 | import org.springframework.web.bind.annotation.RestController; 13 | 14 | /** 15 | * @author: 犬小哈 16 | * @url: www.quanxiaoha.com 17 | * @date: 2023-04-18 8:14 18 | * @description: 文章 19 | **/ 20 | @RestController 21 | @RequestMapping("/article") 22 | public class ArticleController { 23 | 24 | @Autowired 25 | private ArticleService articleService; 26 | 27 | @PostMapping("/detail") 28 | @ApiOperationLog(description = "获取文章详情信息") 29 | public Response queryArticleDetail(@RequestBody @Validated QueryArticleDetailReqVO queryArticleDetailReqVO) { 30 | return articleService.queryArticleDetail(queryArticleDetailReqVO); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/controller/BlogSettingController.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.controller; 2 | 3 | import com.quanxiaoha.weblog.common.Response; 4 | import com.quanxiaoha.weblog.common.aspect.ApiOperationLog; 5 | import com.quanxiaoha.weblog.admin.model.vo.blogsetting.UpdateBlogSettingReqVO; 6 | import com.quanxiaoha.weblog.web.service.BlogSettingService; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.validation.annotation.Validated; 9 | import org.springframework.web.bind.annotation.PostMapping; 10 | import org.springframework.web.bind.annotation.RequestBody; 11 | import org.springframework.web.bind.annotation.RequestMapping; 12 | import org.springframework.web.bind.annotation.RestController; 13 | 14 | /** 15 | * @author: 犬小哈 16 | * @url: www.quanxiaoha.com 17 | * @date: 2023-04-18 8:14 18 | * @description: 博客设置 19 | **/ 20 | @RestController 21 | @RequestMapping("/blog/setting") 22 | public class BlogSettingController { 23 | 24 | @Autowired 25 | private BlogSettingService blogSettingService; 26 | 27 | @PostMapping("/detail") 28 | @ApiOperationLog(description = "获取右边栏博客详情信息") 29 | public Response queryBlogSettingDetail() { 30 | return blogSettingService.queryBlogSettingDetail(); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/controller/CategoryController.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.controller; 2 | 3 | import com.quanxiaoha.weblog.common.PageResponse; 4 | import com.quanxiaoha.weblog.common.Response; 5 | import com.quanxiaoha.weblog.common.aspect.ApiOperationLog; 6 | import com.quanxiaoha.weblog.web.model.vo.article.QueryCategoryArticlePageListReqVO; 7 | import com.quanxiaoha.weblog.web.service.ArticleService; 8 | import com.quanxiaoha.weblog.web.service.CategoryService; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.validation.annotation.Validated; 11 | import org.springframework.web.bind.annotation.PostMapping; 12 | import org.springframework.web.bind.annotation.RequestBody; 13 | import org.springframework.web.bind.annotation.RequestMapping; 14 | import org.springframework.web.bind.annotation.RestController; 15 | 16 | /** 17 | * @author: 犬小哈 18 | * @url: www.quanxiaoha.com 19 | * @date: 2023-04-18 8:14 20 | * @description: 分类 21 | **/ 22 | @RestController 23 | @RequestMapping("/category") 24 | public class CategoryController { 25 | 26 | @Autowired 27 | private CategoryService categoryService; 28 | @Autowired 29 | private ArticleService articleService; 30 | 31 | @PostMapping("/list") 32 | @ApiOperationLog(description = "获取所有分类数据") 33 | public Response queryCategoryList() { 34 | return categoryService.queryCategoryList(); 35 | } 36 | 37 | @PostMapping("/article/list") 38 | @ApiOperationLog(description = "获取所属分类的文章分页数据") 39 | public PageResponse queryArticlePageList(@RequestBody @Validated QueryCategoryArticlePageListReqVO queryCategoryArticlePageListReqVO) { 40 | return articleService.queryCategoryArticlePageList(queryCategoryArticlePageListReqVO); 41 | } 42 | 43 | 44 | } 45 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/controller/IndexController.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.controller; 2 | 3 | import com.quanxiaoha.weblog.common.PageResponse; 4 | import com.quanxiaoha.weblog.common.aspect.ApiOperationLog; 5 | import com.quanxiaoha.weblog.web.model.vo.article.QueryIndexArticlePageListReqVO; 6 | import com.quanxiaoha.weblog.web.service.ArticleService; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.web.bind.annotation.*; 9 | 10 | /** 11 | * @author: 犬小哈 12 | * @url: www.quanxiaoha.com 13 | * @date: 2023-04-18 8:14 14 | * @description: 首页 15 | **/ 16 | @RestController 17 | @RequestMapping("/index") 18 | public class IndexController { 19 | 20 | @Autowired 21 | private ArticleService articleService; 22 | 23 | /** 24 | * 适配当前端打包 /dist 到 Spring Boot 项目中,能够访问到首页 25 | * @return 26 | */ 27 | @GetMapping("/") 28 | public String home() { 29 | return "index.html"; 30 | } 31 | 32 | @PostMapping("/article/list") 33 | @ApiOperationLog(description = "获取首页文章分页数据") 34 | public PageResponse queryArticlePageList(@RequestBody QueryIndexArticlePageListReqVO queryArticlePageListReqVO) { 35 | return articleService.queryIndexArticlePageList(queryArticlePageListReqVO); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/controller/TagController.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.controller; 2 | 3 | import com.quanxiaoha.weblog.common.PageResponse; 4 | import com.quanxiaoha.weblog.common.Response; 5 | import com.quanxiaoha.weblog.common.aspect.ApiOperationLog; 6 | import com.quanxiaoha.weblog.web.model.vo.article.QueryTagArticlePageListReqVO; 7 | import com.quanxiaoha.weblog.web.service.ArticleService; 8 | import com.quanxiaoha.weblog.web.service.TagService; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.validation.annotation.Validated; 11 | import org.springframework.web.bind.annotation.PostMapping; 12 | import org.springframework.web.bind.annotation.RequestBody; 13 | import org.springframework.web.bind.annotation.RequestMapping; 14 | import org.springframework.web.bind.annotation.RestController; 15 | 16 | /** 17 | * @author: 犬小哈 18 | * @url: www.quanxiaoha.com 19 | * @date: 2023-04-18 8:14 20 | * @description: 标签 21 | **/ 22 | @RestController 23 | @RequestMapping("/tag") 24 | public class TagController { 25 | 26 | @Autowired 27 | private TagService tagService; 28 | @Autowired 29 | private ArticleService articleService; 30 | 31 | @PostMapping("/list") 32 | @ApiOperationLog(description = "获取所有标签数据") 33 | public Response queryTagList() { 34 | return tagService.queryTagList(); 35 | } 36 | 37 | @PostMapping("/article/list") 38 | @ApiOperationLog(description = "获取所属标签的文章分页数据") 39 | public PageResponse queryArticlePageList(@RequestBody @Validated QueryTagArticlePageListReqVO queryTagArticlePageListReqVO) { 40 | return articleService.queryTagArticlePageList(queryTagArticlePageListReqVO); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/convert/ArticleConvert.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.convert; 2 | 3 | import com.quanxiaoha.weblog.common.constant.Constants; 4 | import com.quanxiaoha.weblog.common.domain.dos.ArticleDO; 5 | import com.quanxiaoha.weblog.web.model.vo.archive.QueryArchiveItemRspVO; 6 | import com.quanxiaoha.weblog.web.model.vo.article.QueryIndexArticlePageItemRspVO; 7 | import org.mapstruct.Mapper; 8 | import org.mapstruct.Mapping; 9 | import org.mapstruct.factory.Mappers; 10 | 11 | import java.util.Date; 12 | import java.util.Objects; 13 | 14 | /** 15 | * @author: 犬小哈 16 | * @url: www.quanxiaoha.com 17 | * @date: 2023-07-30 8:55 18 | * @description: TODO 19 | **/ 20 | @Mapper(componentModel = "spring") 21 | public interface ArticleConvert { 22 | ArticleConvert INSTANCE = Mappers.getMapper(ArticleConvert.class); 23 | 24 | @Mapping(target = "createTime", expression = "java(formatDate(bean.getCreateTime()))") 25 | QueryIndexArticlePageItemRspVO convert(ArticleDO bean); 26 | 27 | @Mapping(target = "createTime", expression = "java(formatDate(bean.getCreateTime()))") 28 | @Mapping(target = "createMonth", expression = "java(formatMonth(bean.getCreateTime()))") 29 | QueryArchiveItemRspVO convert2Archive(ArticleDO bean); 30 | 31 | default String formatDate(Date date) { 32 | if (Objects.isNull(date)) 33 | return null; 34 | return Constants.DATE_FORMAT.format(date); 35 | } 36 | 37 | default String formatMonth(Date date) { 38 | if (Objects.isNull(date)) 39 | return null; 40 | return Constants.MONTH_FORMAT.format(date); 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/convert/BlogSettingConvert.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.convert; 2 | 3 | import com.quanxiaoha.weblog.common.constant.Constants; 4 | import com.quanxiaoha.weblog.common.domain.dos.ArticleDO; 5 | import com.quanxiaoha.weblog.common.domain.dos.BlogSettingDO; 6 | import com.quanxiaoha.weblog.web.model.vo.article.QueryIndexArticlePageItemRspVO; 7 | import com.quanxiaoha.weblog.web.model.vo.blogsetting.QueryBlogSettingRspVO; 8 | import org.mapstruct.Mapper; 9 | import org.mapstruct.Mapping; 10 | import org.mapstruct.factory.Mappers; 11 | 12 | import java.util.Date; 13 | import java.util.Objects; 14 | 15 | /** 16 | * @author: 犬小哈 17 | * @url: www.quanxiaoha.com 18 | * @date: 2023-07-30 8:55 19 | * @description: TODO 20 | **/ 21 | @Mapper(componentModel = "spring") 22 | public interface BlogSettingConvert { 23 | BlogSettingConvert INSTANCE = Mappers.getMapper(BlogSettingConvert.class); 24 | 25 | QueryBlogSettingRspVO convert(BlogSettingDO bean); 26 | 27 | 28 | } 29 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/dao/ArticleCategoryRelDao.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.dao; 2 | 3 | import com.quanxiaoha.weblog.common.domain.dos.ArticleCategoryRelDO; 4 | 5 | import java.util.List; 6 | 7 | public interface ArticleCategoryRelDao { 8 | 9 | List selectByArticleIds(List articleIds); 10 | 11 | List selectByCategoryId(Long categoryId); 12 | 13 | ArticleCategoryRelDO selectByArticleId(Long articleId); 14 | } 15 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/dao/ArticleContentDao.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.dao; 2 | 3 | import com.quanxiaoha.weblog.common.domain.dos.ArticleContentDO; 4 | 5 | public interface ArticleContentDao { 6 | ArticleContentDO selectArticleContentByArticleId(Long articleId); 7 | } 8 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/dao/ArticleDao.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.dao; 2 | 3 | import com.baomidou.mybatisplus.core.metadata.IPage; 4 | import com.quanxiaoha.weblog.common.domain.dos.ArticleDO; 5 | 6 | import java.util.List; 7 | 8 | public interface ArticleDao { 9 | IPage queryArticlePageList(long current, long size); 10 | 11 | ArticleDO selectArticleById(Long articleId); 12 | 13 | ArticleDO selectPreArticle(Long articleId); 14 | 15 | ArticleDO selectNextArticle(Long articleId); 16 | 17 | IPage queryArticlePageListByArticleIds(Long current, Long size, List articleIds); 18 | } 19 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/dao/ArticleTagRelDao.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.dao; 2 | 3 | import com.quanxiaoha.weblog.common.domain.dos.ArticleTagRelDO; 4 | 5 | import java.util.List; 6 | 7 | public interface ArticleTagRelDao { 8 | 9 | List selectByArticleIds(List articleIds); 10 | 11 | List selectByTagId(Long queryTagId); 12 | 13 | List selectByArticleId(Long articleId); 14 | } 15 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/dao/CategoryDao.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.dao; 2 | 3 | import com.quanxiaoha.weblog.common.domain.dos.CategoryDO; 4 | 5 | import java.util.List; 6 | 7 | public interface CategoryDao { 8 | List selectAllCategory(); 9 | 10 | CategoryDO selectByCategoryId(Long categoryId); 11 | } 12 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/dao/TagDao.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.dao; 2 | 3 | import com.quanxiaoha.weblog.common.domain.dos.TagDO; 4 | 5 | import java.util.List; 6 | 7 | public interface TagDao { 8 | List selectAllTag(); 9 | 10 | List selectByTagIds(List tagIds); 11 | } 12 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/dao/impl/ArticleCategoryRelDaoImpl.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.dao.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.quanxiaoha.weblog.common.domain.mapper.ArticleCategoryRelMapper; 5 | import com.quanxiaoha.weblog.common.domain.dos.ArticleCategoryRelDO; 6 | import com.quanxiaoha.weblog.web.dao.ArticleCategoryRelDao; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.List; 12 | 13 | /** 14 | * @author: 犬小哈 15 | * @url: www.quanxiaoha.com 16 | * @date: 2023-04-17 12:08 17 | * @description: TODO 18 | **/ 19 | @Service 20 | @Slf4j 21 | public class ArticleCategoryRelDaoImpl implements ArticleCategoryRelDao { 22 | 23 | @Autowired 24 | private ArticleCategoryRelMapper articleCategoryRelMapper; 25 | 26 | @Override 27 | public List selectByArticleIds(List articleIds) { 28 | QueryWrapper wrapper = new QueryWrapper<>(); 29 | wrapper.lambda().in(ArticleCategoryRelDO::getArticleId, articleIds); 30 | return articleCategoryRelMapper.selectList(wrapper); 31 | } 32 | 33 | @Override 34 | public List selectByCategoryId(Long categoryId) { 35 | QueryWrapper wrapper = new QueryWrapper<>(); 36 | wrapper.lambda().in(ArticleCategoryRelDO::getCategoryId, categoryId); 37 | return articleCategoryRelMapper.selectList(wrapper); 38 | } 39 | 40 | @Override 41 | public ArticleCategoryRelDO selectByArticleId(Long articleId) { 42 | QueryWrapper wrapper = new QueryWrapper<>(); 43 | wrapper.lambda().eq(ArticleCategoryRelDO::getArticleId, articleId); 44 | return articleCategoryRelMapper.selectOne(wrapper); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/dao/impl/ArticleContentDaoImpl.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.dao.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.quanxiaoha.weblog.common.domain.mapper.ArticleContentMapper; 5 | import com.quanxiaoha.weblog.common.domain.dos.ArticleContentDO; 6 | import com.quanxiaoha.weblog.web.dao.ArticleContentDao; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | /** 12 | * @author: 犬小哈 13 | * @url: www.quanxiaoha.com 14 | * @date: 2023-04-17 12:08 15 | * @description: TODO 16 | **/ 17 | @Service 18 | @Slf4j 19 | public class ArticleContentDaoImpl implements ArticleContentDao { 20 | @Autowired 21 | private ArticleContentMapper articleContentMapper; 22 | 23 | @Override 24 | public ArticleContentDO selectArticleContentByArticleId(Long articleId) { 25 | QueryWrapper wrapper = new QueryWrapper<>(); 26 | wrapper.lambda().eq(ArticleContentDO::getArticleId, articleId); 27 | return articleContentMapper.selectOne(wrapper); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/dao/impl/ArticleDaoImpl.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.dao.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.baomidou.mybatisplus.core.metadata.IPage; 5 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 6 | import com.quanxiaoha.weblog.common.domain.mapper.ArticleMapper; 7 | import com.quanxiaoha.weblog.common.domain.dos.ArticleDO; 8 | import com.quanxiaoha.weblog.web.dao.ArticleDao; 9 | import lombok.extern.slf4j.Slf4j; 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.stereotype.Service; 12 | 13 | import java.util.List; 14 | 15 | /** 16 | * @author: 犬小哈 17 | * @url: www.quanxiaoha.com 18 | * @date: 2023-04-17 12:08 19 | * @description: TODO 20 | **/ 21 | @Service 22 | @Slf4j 23 | public class ArticleDaoImpl implements ArticleDao { 24 | @Autowired 25 | private ArticleMapper articleMapper; 26 | 27 | @Override 28 | public IPage queryArticlePageList(long current, long size) { 29 | Page page = new Page<>(current, size); 30 | QueryWrapper wrapper = new QueryWrapper<>(); 31 | wrapper.lambda().orderByDesc(ArticleDO::getCreateTime); 32 | return articleMapper.selectPage(page, wrapper); 33 | } 34 | 35 | @Override 36 | public ArticleDO selectArticleById(Long articleId) { 37 | return articleMapper.selectById(articleId); 38 | } 39 | 40 | @Override 41 | public ArticleDO selectPreArticle(Long articleId) { 42 | QueryWrapper wrapper = new QueryWrapper<>(); 43 | wrapper.lambda().orderByAsc(ArticleDO::getId).gt(ArticleDO::getId, articleId).last("limit 1"); 44 | return articleMapper.selectOne(wrapper); 45 | } 46 | 47 | @Override 48 | public ArticleDO selectNextArticle(Long articleId) { 49 | QueryWrapper wrapper = new QueryWrapper<>(); 50 | wrapper.lambda().orderByDesc(ArticleDO::getId).lt(ArticleDO::getId, articleId).last("limit 1"); 51 | return articleMapper.selectOne(wrapper); 52 | } 53 | 54 | @Override 55 | public IPage queryArticlePageListByArticleIds(Long current, Long size, List articleIds) { 56 | Page page = new Page<>(current, size); 57 | QueryWrapper wrapper = new QueryWrapper<>(); 58 | wrapper.lambda().in(ArticleDO::getId, articleIds).orderByDesc(ArticleDO::getCreateTime); 59 | return articleMapper.selectPage(page, wrapper); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/dao/impl/ArticleTagRelDaoImpl.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.dao.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.quanxiaoha.weblog.common.domain.mapper.ArticleTagRelMapper; 5 | import com.quanxiaoha.weblog.common.domain.dos.ArticleTagRelDO; 6 | import com.quanxiaoha.weblog.web.dao.ArticleTagRelDao; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.List; 12 | 13 | /** 14 | * @author: 犬小哈 15 | * @url: www.quanxiaoha.com 16 | * @date: 2023-04-17 12:08 17 | * @description: TODO 18 | **/ 19 | @Service 20 | @Slf4j 21 | public class ArticleTagRelDaoImpl implements ArticleTagRelDao { 22 | 23 | @Autowired 24 | private ArticleTagRelMapper articleTagRelMapper; 25 | 26 | @Override 27 | public List selectByArticleIds(List articleIds) { 28 | QueryWrapper wrapper = new QueryWrapper<>(); 29 | wrapper.lambda().in(ArticleTagRelDO::getArticleId, articleIds); 30 | return articleTagRelMapper.selectList(wrapper); 31 | } 32 | 33 | @Override 34 | public List selectByTagId(Long queryTagId) { 35 | QueryWrapper wrapper = new QueryWrapper<>(); 36 | wrapper.lambda().in(ArticleTagRelDO::getTagId, queryTagId); 37 | return articleTagRelMapper.selectList(wrapper); 38 | } 39 | 40 | @Override 41 | public List selectByArticleId(Long articleId) { 42 | QueryWrapper wrapper = new QueryWrapper<>(); 43 | wrapper.lambda().eq(ArticleTagRelDO::getArticleId, articleId); 44 | return articleTagRelMapper.selectList(wrapper); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/dao/impl/CategoryDaoImpl.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.dao.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.quanxiaoha.weblog.common.domain.mapper.CategoryMapper; 5 | import com.quanxiaoha.weblog.common.domain.dos.CategoryDO; 6 | import com.quanxiaoha.weblog.web.dao.CategoryDao; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.List; 12 | 13 | /** 14 | * @author: 犬小哈 15 | * @url: www.quanxiaoha.com 16 | * @date: 2023-04-17 12:08 17 | * @description: TODO 18 | **/ 19 | @Service 20 | @Slf4j 21 | public class CategoryDaoImpl implements CategoryDao { 22 | 23 | @Autowired 24 | private CategoryMapper categoryMapper; 25 | 26 | @Override 27 | public List selectAllCategory() { 28 | return categoryMapper.selectList(null); 29 | } 30 | 31 | @Override 32 | public CategoryDO selectByCategoryId(Long categoryId) { 33 | QueryWrapper wrapper = new QueryWrapper<>(); 34 | wrapper.lambda().eq(CategoryDO::getId, categoryId); 35 | return categoryMapper.selectOne(wrapper); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/dao/impl/TagDaoImpl.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.dao.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.quanxiaoha.weblog.common.domain.mapper.TagMapper; 5 | import com.quanxiaoha.weblog.common.domain.dos.TagDO; 6 | import com.quanxiaoha.weblog.web.dao.TagDao; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.List; 12 | 13 | /** 14 | * @author: 犬小哈 15 | * @url: www.quanxiaoha.com 16 | * @date: 2023-04-17 12:08 17 | * @description: TODO 18 | **/ 19 | @Service 20 | @Slf4j 21 | public class TagDaoImpl implements TagDao { 22 | 23 | @Autowired 24 | private TagMapper tagMapper; 25 | 26 | @Override 27 | public List selectAllTag() { 28 | return tagMapper.selectList(null); 29 | } 30 | 31 | @Override 32 | public List selectByTagIds(List tagIds) { 33 | QueryWrapper wrapper = new QueryWrapper<>(); 34 | wrapper.lambda().in(TagDO::getId, tagIds); 35 | return tagMapper.selectList(wrapper); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/model/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author: 犬小哈 3 | * @url: www.quanxiaoha.com 4 | * @date: 2023-04-26 15:50 5 | * @description: TODO 6 | **/ 7 | package com.quanxiaoha.weblog.web.model; -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/model/vo/archive/QueryArchiveItemRspVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.model.vo.archive; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | @Data 10 | @Builder 11 | @AllArgsConstructor 12 | @NoArgsConstructor 13 | public class QueryArchiveItemRspVO { 14 | private Long id; 15 | private String titleImage; 16 | private String title; 17 | private String createMonth; 18 | private String createTime; 19 | } 20 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/model/vo/archive/QueryArchivePageListReqVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.model.vo.archive; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | @Data 10 | @Builder 11 | @AllArgsConstructor 12 | @NoArgsConstructor 13 | public class QueryArchivePageListReqVO { 14 | private Long current = 1L; 15 | private Long size = 10L; 16 | } 17 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/model/vo/archive/QueryArchivePageListRspVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.model.vo.archive; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.util.List; 10 | 11 | @Data 12 | @Builder 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | public class QueryArchivePageListRspVO { 16 | private String month; 17 | private List articles; 18 | } 19 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/model/vo/article/QueryArticleDetailReqVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.model.vo.article; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * @author: 犬小哈 10 | * @url: www.quanxiaoha.com 11 | * @date: 2023-04-19 16:06 12 | * @description: TODO 13 | **/ 14 | @Data 15 | @AllArgsConstructor 16 | @NoArgsConstructor 17 | @Builder 18 | public class QueryArticleDetailReqVO { 19 | private Long articleId; 20 | } 21 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/model/vo/article/QueryArticleDetailRspVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.model.vo.article; 2 | 3 | import com.quanxiaoha.weblog.web.model.vo.tag.QueryTagListItemRspVO; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.util.Date; 10 | import java.util.List; 11 | 12 | /** 13 | * @author: 犬小哈 14 | * @url: www.quanxiaoha.com 15 | * @date: 2023-04-19 16:06 16 | * @description: TODO 17 | **/ 18 | @Data 19 | @AllArgsConstructor 20 | @NoArgsConstructor 21 | @Builder 22 | public class QueryArticleDetailRspVO { 23 | private String title; 24 | private String content; 25 | private Date updateTime; 26 | private Long categoryId; 27 | private String categoryName; 28 | private Long readNum; 29 | private List tags; 30 | private QueryArticleLinkRspVO preArticle; 31 | private QueryArticleLinkRspVO nextArticle; 32 | } 33 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/model/vo/article/QueryArticleLinkRspVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.model.vo.article; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.util.Date; 9 | 10 | /** 11 | * @author: 犬小哈 12 | * @url: www.quanxiaoha.com 13 | * @date: 2023-04-19 16:06 14 | * @description: TODO 15 | **/ 16 | @Data 17 | @AllArgsConstructor 18 | @NoArgsConstructor 19 | @Builder 20 | public class QueryArticleLinkRspVO { 21 | private String title; 22 | private Long id; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/model/vo/article/QueryCategoryArticlePageListReqVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.model.vo.article; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import javax.validation.constraints.NotNull; 10 | 11 | @Data 12 | @Builder 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | public class QueryCategoryArticlePageListReqVO { 16 | private Long current = 1L; 17 | private Long size = 10L; 18 | // 分类 19 | @NotNull(message = "分类 ID 不能为空") 20 | private Long categoryId; 21 | } 22 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/model/vo/article/QueryIndexArticlePageItemRspVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.model.vo.article; 2 | 3 | 4 | import com.quanxiaoha.weblog.web.model.vo.category.QueryCategoryListItemRspVO; 5 | import com.quanxiaoha.weblog.web.model.vo.tag.QueryTagListItemRspVO; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Data; 9 | import lombok.NoArgsConstructor; 10 | 11 | import java.util.List; 12 | 13 | @Data 14 | @Builder 15 | @AllArgsConstructor 16 | @NoArgsConstructor 17 | public class QueryIndexArticlePageItemRspVO { 18 | private Long id; 19 | private String titleImage; 20 | private String title; 21 | private String createTime; 22 | private String description; 23 | private QueryCategoryListItemRspVO category; 24 | private List tags; 25 | } 26 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/model/vo/article/QueryIndexArticlePageListReqVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.model.vo.article; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | @Data 10 | @Builder 11 | @AllArgsConstructor 12 | @NoArgsConstructor 13 | public class QueryIndexArticlePageListReqVO { 14 | private Long current = 1L; 15 | private Long size = 10L; 16 | } 17 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/model/vo/article/QueryTagArticlePageListReqVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.model.vo.article; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import javax.validation.constraints.NotNull; 10 | 11 | @Data 12 | @Builder 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | public class QueryTagArticlePageListReqVO { 16 | private Long current = 1L; 17 | private Long size = 10L; 18 | 19 | @NotNull(message = "所属标签 ID 不能为空") 20 | private Long tagId; 21 | } 22 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/model/vo/blogsetting/QueryBlogSettingRspVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.model.vo.blogsetting; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * @author: 犬小哈 10 | * @url: www.quanxiaoha.com 11 | * @date: 2023-04-19 16:06 12 | * @description: TODO 13 | **/ 14 | @Data 15 | @AllArgsConstructor 16 | @NoArgsConstructor 17 | @Builder 18 | public class QueryBlogSettingRspVO { 19 | private String blogName; 20 | private String author; 21 | private String avatar; 22 | private String introduction; 23 | private String githubHome; 24 | private String csdnHome; 25 | private String giteeHome; 26 | private String zhihuHome; 27 | } 28 | 29 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/model/vo/category/QueryCategoryListItemRspVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.model.vo.category; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * @author: 犬小哈 10 | * @url: www.quanxiaoha.com 11 | * @date: 2023-04-19 16:06 12 | * @description: TODO 13 | **/ 14 | @Data 15 | @AllArgsConstructor 16 | @NoArgsConstructor 17 | @Builder 18 | public class QueryCategoryListItemRspVO { 19 | private Long id; 20 | private String name; 21 | } 22 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/model/vo/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author: 犬小哈 3 | * @url: www.quanxiaoha.com 4 | * @date: 2023-04-26 15:52 5 | * @description: TODO 6 | **/ 7 | package com.quanxiaoha.weblog.web.model.vo; -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/model/vo/tag/QueryTagListItemRspVO.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.model.vo.tag; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * @author: 犬小哈 10 | * @url: www.quanxiaoha.com 11 | * @date: 2023-04-19 16:06 12 | * @description: TODO 13 | **/ 14 | @Data 15 | @AllArgsConstructor 16 | @NoArgsConstructor 17 | @Builder 18 | public class QueryTagListItemRspVO { 19 | private Long id; 20 | private String name; 21 | } 22 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/service/ArchiveService.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.quanxiaoha.weblog.common.Response; 5 | import com.quanxiaoha.weblog.common.domain.dos.ArticleDO; 6 | import com.quanxiaoha.weblog.common.domain.dos.TagDO; 7 | import com.quanxiaoha.weblog.web.model.vo.archive.QueryArchivePageListReqVO; 8 | 9 | 10 | public interface ArchiveService extends IService { 11 | 12 | Response queryArchive(QueryArchivePageListReqVO queryArchivePageListReqVO); 13 | } 14 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/service/ArticleService.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.service; 2 | 3 | import com.quanxiaoha.weblog.common.PageResponse; 4 | import com.quanxiaoha.weblog.common.Response; 5 | import com.quanxiaoha.weblog.web.model.vo.archive.QueryArchivePageListReqVO; 6 | import com.quanxiaoha.weblog.web.model.vo.article.QueryArticleDetailReqVO; 7 | import com.quanxiaoha.weblog.web.model.vo.article.QueryCategoryArticlePageListReqVO; 8 | import com.quanxiaoha.weblog.web.model.vo.article.QueryIndexArticlePageListReqVO; 9 | import com.quanxiaoha.weblog.web.model.vo.article.QueryTagArticlePageListReqVO; 10 | 11 | 12 | public interface ArticleService { 13 | 14 | PageResponse queryIndexArticlePageList(QueryIndexArticlePageListReqVO queryIndexArticlePageListReqVO); 15 | 16 | PageResponse queryCategoryArticlePageList(QueryCategoryArticlePageListReqVO queryCategoryArticlePageListReqVO); 17 | 18 | Response queryArticleDetail(QueryArticleDetailReqVO queryArticleDetailReqVO); 19 | 20 | PageResponse queryTagArticlePageList(QueryTagArticlePageListReqVO queryTagArticlePageListReqVO); 21 | 22 | } 23 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/service/BlogSettingService.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.quanxiaoha.weblog.common.Response; 5 | import com.quanxiaoha.weblog.common.domain.dos.BlogSettingDO; 6 | 7 | 8 | public interface BlogSettingService extends IService { 9 | 10 | Response queryBlogSettingDetail(); 11 | } 12 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/service/CategoryService.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.quanxiaoha.weblog.common.Response; 5 | import com.quanxiaoha.weblog.common.domain.dos.CategoryDO; 6 | 7 | 8 | public interface CategoryService extends IService { 9 | Response queryCategoryList(); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/service/IndexService.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.service; 2 | 3 | 4 | public interface IndexService { 5 | 6 | } 7 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/service/TagService.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.quanxiaoha.weblog.common.Response; 5 | import com.quanxiaoha.weblog.common.domain.dos.TagDO; 6 | 7 | 8 | public interface TagService extends IService { 9 | Response queryTagList(); 10 | } 11 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/service/impl/BlogSettingServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.service.impl; 2 | 3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 4 | import com.quanxiaoha.weblog.common.Response; 5 | import com.quanxiaoha.weblog.common.domain.mapper.BlogSettingMapper; 6 | import com.quanxiaoha.weblog.common.domain.dos.BlogSettingDO; 7 | import com.quanxiaoha.weblog.web.convert.BlogSettingConvert; 8 | import com.quanxiaoha.weblog.web.model.vo.blogsetting.QueryBlogSettingRspVO; 9 | import com.quanxiaoha.weblog.web.service.BlogSettingService; 10 | import lombok.extern.slf4j.Slf4j; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.stereotype.Service; 13 | 14 | import java.util.Objects; 15 | 16 | /** 17 | * @author: 犬小哈 18 | * @url: www.quanxiaoha.com 19 | * @date: 2023-04-17 12:08 20 | * @description: TODO 21 | **/ 22 | @Service 23 | @Slf4j 24 | public class BlogSettingServiceImpl extends ServiceImpl implements BlogSettingService { 25 | 26 | @Autowired 27 | private BlogSettingConvert blogSettingConvert; 28 | 29 | @Override 30 | public Response queryBlogSettingDetail() { 31 | BlogSettingDO blogSettingDO = getOne(null); 32 | return Response.success(blogSettingConvert.convert(blogSettingDO)); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/service/impl/CategoryServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.service.impl; 2 | 3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 4 | import com.quanxiaoha.weblog.common.Response; 5 | import com.quanxiaoha.weblog.common.domain.mapper.CategoryMapper; 6 | import com.quanxiaoha.weblog.common.domain.dos.CategoryDO; 7 | import com.quanxiaoha.weblog.web.dao.CategoryDao; 8 | import com.quanxiaoha.weblog.web.model.vo.category.QueryCategoryListItemRspVO; 9 | import com.quanxiaoha.weblog.web.service.CategoryService; 10 | import lombok.extern.slf4j.Slf4j; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.stereotype.Service; 13 | import org.springframework.util.CollectionUtils; 14 | 15 | import java.util.List; 16 | import java.util.stream.Collectors; 17 | 18 | /** 19 | * @author: 犬小哈 20 | * @url: www.quanxiaoha.com 21 | * @date: 2023-04-17 12:08 22 | * @description: TODO 23 | **/ 24 | @Service 25 | @Slf4j 26 | public class CategoryServiceImpl extends ServiceImpl implements CategoryService { 27 | 28 | @Autowired 29 | private CategoryDao categoryDao; 30 | 31 | @Override 32 | public Response queryCategoryList() { 33 | List categoryDOList = categoryDao.selectAllCategory(); 34 | List list = null; 35 | if (!CollectionUtils.isEmpty(categoryDOList)) { 36 | list = categoryDOList.stream() 37 | .map(p -> QueryCategoryListItemRspVO.builder() 38 | .id(p.getId()) 39 | .name(p.getName()) 40 | .build()) 41 | .collect(Collectors.toList()); 42 | } 43 | return Response.success(list); 44 | } 45 | 46 | 47 | } 48 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/service/impl/IndexServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.service.impl; 2 | 3 | import com.quanxiaoha.weblog.web.service.IndexService; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.springframework.stereotype.Service; 6 | 7 | /** 8 | * @author: 犬小哈 9 | * @url: www.quanxiaoha.com 10 | * @date: 2023-04-17 12:08 11 | * @description: TODO 12 | **/ 13 | @Service 14 | @Slf4j 15 | public class IndexServiceImpl implements IndexService { 16 | 17 | 18 | 19 | 20 | } 21 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/java/com/quanxiaoha/weblog/web/service/impl/TagServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.quanxiaoha.weblog.web.service.impl; 2 | 3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 4 | import com.quanxiaoha.weblog.common.Response; 5 | import com.quanxiaoha.weblog.common.domain.mapper.TagMapper; 6 | import com.quanxiaoha.weblog.common.domain.dos.TagDO; 7 | import com.quanxiaoha.weblog.web.dao.TagDao; 8 | import com.quanxiaoha.weblog.web.model.vo.tag.QueryTagListItemRspVO; 9 | import com.quanxiaoha.weblog.web.service.TagService; 10 | import lombok.extern.slf4j.Slf4j; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.stereotype.Service; 13 | import org.springframework.util.CollectionUtils; 14 | 15 | import java.util.List; 16 | import java.util.stream.Collectors; 17 | 18 | /** 19 | * @author: 犬小哈 20 | * @url: www.quanxiaoha.com 21 | * @date: 2023-04-17 12:08 22 | * @description: TODO 23 | **/ 24 | @Service 25 | @Slf4j 26 | public class TagServiceImpl extends ServiceImpl implements TagService { 27 | 28 | @Autowired 29 | private TagDao tagDao; 30 | 31 | @Override 32 | public Response queryTagList() { 33 | List tagDOS = tagDao.selectAllTag(); 34 | List list = null; 35 | 36 | if (!CollectionUtils.isEmpty(tagDOS)) { 37 | list = tagDOS.stream() 38 | .map(p -> QueryTagListItemRspVO.builder() 39 | .id(p.getId()) 40 | .name(p.getName()) 41 | .build()) 42 | .collect(Collectors.toList()); 43 | } 44 | 45 | return Response.success(list); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/resources/application-dev.yaml: -------------------------------------------------------------------------------- 1 | spring: 2 | datasource: 3 | driver-class-name: com.p6spy.engine.spy.P6SpyDriver 4 | url: jdbc:p6spy:mysql://127.0.0.1:3306/weblog?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull 5 | username: root 6 | password: 123456 7 | hikari: 8 | minimum-idle: 5 9 | maximum-pool-size: 9 10 | auto-commit: true 11 | idle-timeout: 30000 12 | pool-name: Weblog-HikariCP 13 | max-lifetime: 1800000 14 | connection-timeout: 30000 15 | connection-test-query: SELECT 1 16 | 17 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/resources/application-prod.yaml: -------------------------------------------------------------------------------- 1 | spring: 2 | datasource: 3 | driver-class-name: com.mysql.cj.jdbc.Driver 4 | url: jdbc:mysql://172.17.0.1:3306/weblog?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull 5 | username: root 6 | password: qwe123 7 | hikari: 8 | minimum-idle: 5 9 | maximum-pool-size: 9 10 | auto-commit: true 11 | idle-timeout: 30000 12 | pool-name: Weblog-HikariCP 13 | max-lifetime: 1800000 14 | connection-timeout: 30000 15 | connection-test-query: SELECT 1 16 | 17 | #================================================================= 18 | # log 19 | #================================================================= 20 | logging: 21 | config: classpath:logback-weblog.xml -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/resources/application.yaml: -------------------------------------------------------------------------------- 1 | server: 2 | # 端口号 3 | port: 8081 4 | 5 | spring: 6 | profiles: 7 | active: dev 8 | jackson: 9 | # 设置后台返参,若字段值为 null, 是否返回 10 | # default-property-inclusion: non_null 11 | date-format: yyyy-MM-dd HH:mm:ss 12 | servlet: 13 | multipart: 14 | # 限制上传文件大小 15 | max-file-size: 10MB 16 | 17 | jwt: 18 | # 签发人 19 | issuer: quanxiaoha 20 | # 秘钥 21 | secret: gR6cytlUlgMfVh08nLFZf8hMk4mdJDX5rWBVlsCbKvRlWcLwNRU6+rIPcLx21x191kJgP8udtoZuHt5yUDWtgg== 22 | # token 过期时间(单位:分钟) 24*60 23 | tokenExpireTime: 1440 24 | # token Header 中的 key 值 25 | tokenHeaderKey: Authorization 26 | # token Header 中的 value 值前缀 27 | tokenPrefix: Bearer 28 | 29 | 30 | #================================================================= 31 | # minio (上传图片需要,需配置成自己的地址) 32 | #================================================================= 33 | minio: 34 | endpoint: https://img.xxx.com 35 | accessKey: xxx 36 | secretKey: xxx 37 | bucketName: xxx 38 | 39 | #================================================================= 40 | # IP归属地信息库文件路径 ip2region.xdb 41 | #================================================================= 42 | xdb: 43 | profile: xxx -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/resources/ip2region.xdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/weiwosuoai/WeBlog/6c6d9b50bd0aae7f9485617e4effb049b8bbe9eb/weblog-springboot/weblog-web/src/main/resources/ip2region.xdb -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/resources/logback-weblog.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | ${LOG_FILE}-%i.log 16 | 17 | 30 18 | 19 | 20 | 10MB 21 | 22 | 23 | 24 | 25 | ${FILE_LOG_PATTERN} 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/main/resources/spy.properties: -------------------------------------------------------------------------------- 1 | #3.2.1???? 2 | modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory 3 | #3.2.1????????? 4 | #modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory 5 | # ??????? 6 | logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger 7 | #???????? 8 | appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger 9 | # ???????? sql 10 | #appender=com.p6spy.engine.spy.appender.Slf4JLogger 11 | # ?? p6spy driver ?? 12 | deregisterdrivers=true 13 | # ??JDBC URL?? 14 | useprefix=true 15 | # ???? Log ??,????????error,info,batch,debug,statement,commit,rollback,result,resultset. 16 | excludecategories=info,debug,result,commit,resultset 17 | # ???? 18 | dateformat=yyyy-MM-dd HH:mm:ss 19 | # ??????? 20 | #driverlist=org.h2.Driver 21 | # ?????SQL?? 22 | outagedetection=true 23 | # ?SQL???? 2 ? 24 | outagedetectioninterval=2 -------------------------------------------------------------------------------- /weblog-springboot/weblog-web/src/test/java/com/quanxiaoha/weblog/web/WeblogWebApplicationTests.java: -------------------------------------------------------------------------------- 1 | // package com.quanxiaoha.weblog.web; 2 | // 3 | // import org.springframework.boot.test.context.SpringBootTest; 4 | // 5 | // @SpringBootTest 6 | // class WeblogWebApplicationTests { 7 | // 8 | // @Test 9 | // void contextLoads() { 10 | // } 11 | // 12 | // } 13 | -------------------------------------------------------------------------------- /weblog-vue3/.env.development: -------------------------------------------------------------------------------- 1 | VITE_APP_BASE_API='/api' -------------------------------------------------------------------------------- /weblog-vue3/.env.production: -------------------------------------------------------------------------------- 1 | VITE_APP_BASE_API='/api' -------------------------------------------------------------------------------- /weblog-vue3/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | .DS_Store 12 | dist 13 | dist-ssr 14 | coverage 15 | *.local 16 | 17 | /cypress/videos/ 18 | /cypress/screenshots/ 19 | 20 | # Editor directories and files 21 | .vscode/* 22 | !.vscode/extensions.json 23 | .idea 24 | *.suo 25 | *.ntvs* 26 | *.njsproj 27 | *.sln 28 | *.sw? 29 | -------------------------------------------------------------------------------- /weblog-vue3/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] 3 | } 4 | -------------------------------------------------------------------------------- /weblog-vue3/README.md: -------------------------------------------------------------------------------- 1 | # weblog 2 | 3 | This template should help get you started developing with Vue 3 in Vite. 4 | 5 | ## Recommended IDE Setup 6 | 7 | [VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin). 8 | 9 | ## Customize configuration 10 | 11 | See [Vite Configuration Reference](https://vitejs.dev/config/). 12 | 13 | ## Project Setup 14 | 15 | ```sh 16 | npm install 17 | ``` 18 | 19 | ### Compile and Hot-Reload for Development 20 | 21 | ```sh 22 | npm run dev 23 | ``` 24 | 25 | ### Compile and Minify for Production 26 | 27 | ```sh 28 | npm run build 29 | ``` 30 | -------------------------------------------------------------------------------- /weblog-vue3/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Weblog 首页 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /weblog-vue3/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "weblog", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "vite build", 8 | "preview": "vite preview" 9 | }, 10 | "dependencies": { 11 | "@element-plus/icons-vue": "^2.1.0", 12 | "@headlessui/vue": "^1.7.14", 13 | "@heroicons/vue": "^2.0.18", 14 | "@vueuse/core": "^10.0.2", 15 | "@vueuse/integrations": "^10.0.2", 16 | "animate.css": "^4.1.1", 17 | "axios": "^1.3.5", 18 | "echarts": "^5.4.2", 19 | "editor.md": "^1.5.0", 20 | "element-plus": "^2.3.3", 21 | "flowbite": "^1.7.0", 22 | "gasp": "^0.0.2", 23 | "gsap": "^3.11.5", 24 | "highlight.js": "^11.8.0", 25 | "mavon-editor": "^3.0.1", 26 | "md-editor-v3": "^3.0.1", 27 | "moment": "^2.29.4", 28 | "nprogress": "^0.2.0", 29 | "universal-cookie": "^4.0.4", 30 | "v-viewer": "^3.0.11", 31 | "vue": "^3.2.47", 32 | "vue-highlightjs": "^1.3.3", 33 | "vue-router": "^4.1.6", 34 | "vue3-highlightjs": "^1.0.5", 35 | "vuex": "^4.0.2" 36 | }, 37 | "devDependencies": { 38 | "@vicons/ionicons5": "^0.12.0", 39 | "@vitejs/plugin-vue": "^4.0.0", 40 | "autoprefixer": "^10.4.14", 41 | "naive-ui": "^2.34.3", 42 | "postcss": "^8.4.25", 43 | "postcss-import": "^15.1.0", 44 | "tailwindcss": "^3.3.2", 45 | "unplugin-auto-import": "^0.16.6", 46 | "unplugin-vue-components": "^0.25.1", 47 | "vfonts": "^0.0.3", 48 | "vite": "^4.1.4", 49 | "vite-plugin-windicss": "^1.8.10", 50 | "windicss": "^3.5.6" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /weblog-vue3/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /weblog-vue3/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/weiwosuoai/WeBlog/6c6d9b50bd0aae7f9485617e4effb049b8bbe9eb/weblog-vue3/public/favicon.ico -------------------------------------------------------------------------------- /weblog-vue3/src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | 15 | 28 | -------------------------------------------------------------------------------- /weblog-vue3/src/api/admin/article.js: -------------------------------------------------------------------------------- 1 | import axios from "@/axios" 2 | 3 | export function getArticleDetail(articleId) { 4 | return axios.post("/admin/article/detail", {articleId}) 5 | } 6 | 7 | export function publishArticle(data) { 8 | return axios.post("/admin/article/publish", data) 9 | } 10 | 11 | export function getArticlePageList(data) { 12 | return axios.post("/admin/article/list", data) 13 | } 14 | 15 | export function deleteArticle(articleId) { 16 | return axios.post("/admin/article/delete", {articleId}) 17 | } 18 | 19 | export function updateArticle(data) { 20 | return axios.post("/admin/article/update", data) 21 | } 22 | -------------------------------------------------------------------------------- /weblog-vue3/src/api/admin/blogsetting.js: -------------------------------------------------------------------------------- 1 | import axios from "@/axios" 2 | 3 | export function getBlogSettingDetail() { 4 | return axios.post("/admin/blog/setting/detail") 5 | } 6 | 7 | export function updateBlogSetting(data) { 8 | return axios.post("/admin/blog/setting/update", data) 9 | } 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /weblog-vue3/src/api/admin/category.js: -------------------------------------------------------------------------------- 1 | import axios from "@/axios" 2 | 3 | export function addCategory(data) { 4 | return axios.post("/admin/category/add", data) 5 | } 6 | 7 | export function getCategoryPageList(data) { 8 | return axios.post("/admin/category/list", data) 9 | } 10 | 11 | 12 | export function deleteCategory(categoryId) { 13 | return axios.post("/admin/category/delete", {categoryId}) 14 | } 15 | 16 | export function getCategorySelect() { 17 | return axios.post("/admin/category/select/list") 18 | } 19 | 20 | -------------------------------------------------------------------------------- /weblog-vue3/src/api/admin/dashboard.js: -------------------------------------------------------------------------------- 1 | import axios from "@/axios" 2 | 3 | export function getDashboardArticleStatisticsInfo() { 4 | return axios.post("/admin/dashboard/article/statistics") 5 | } 6 | 7 | export function getDashboardPublishArticleStatisticsInfo() { 8 | return axios.post("/admin/dashboard/publishArticle/statistics") 9 | } 10 | 11 | export function getDashboardPVStatisticsInfo() { 12 | return axios.post("/admin/dashboard/pv/statistics") 13 | } 14 | 15 | 16 | -------------------------------------------------------------------------------- /weblog-vue3/src/api/admin/file.js: -------------------------------------------------------------------------------- 1 | import axios from "@/axios" 2 | 3 | export function uploadFile(file) { 4 | return axios.post("/admin/file/upload", file) 5 | } 6 | 7 | -------------------------------------------------------------------------------- /weblog-vue3/src/api/admin/tag.js: -------------------------------------------------------------------------------- 1 | import axios from "@/axios" 2 | 3 | export function addTags(data) { 4 | return axios.post("/admin/tag/add", data) 5 | } 6 | 7 | export function getTagPageList(data) { 8 | return axios.post("/admin/tag/list", data) 9 | } 10 | 11 | export function deleteTag(tagId) { 12 | return axios.post("/admin/tag/delete", {tagId}) 13 | } 14 | 15 | export function selectTags(key) { 16 | return axios.post("/admin/tag/search", {key}) 17 | } 18 | 19 | export function getTagSelect() { 20 | return axios.post("/admin/tag/select/list") 21 | } 22 | 23 | 24 | -------------------------------------------------------------------------------- /weblog-vue3/src/api/admin/user.js: -------------------------------------------------------------------------------- 1 | import axios from "@/axios" 2 | 3 | export function login(username, password) { 4 | return axios.post("/login", {username, password}) 5 | } 6 | 7 | export function getAdminInfo() { 8 | return axios.post("/admin/detail") 9 | } 10 | 11 | export function updateAdminPassword(data) { 12 | return axios.post("/admin/password/update", data) 13 | } -------------------------------------------------------------------------------- /weblog-vue3/src/api/frontend/archive.js: -------------------------------------------------------------------------------- 1 | import axios from "@/axios" 2 | 3 | 4 | export function getArchives(data) { 5 | return axios.post("/archive/list", data) 6 | } 7 | -------------------------------------------------------------------------------- /weblog-vue3/src/api/frontend/article.js: -------------------------------------------------------------------------------- 1 | import axios from "@/axios" 2 | 3 | export function getArticleDetail(articleId) { 4 | return axios.post("/article/detail", {articleId}) 5 | } 6 | 7 | 8 | -------------------------------------------------------------------------------- /weblog-vue3/src/api/frontend/blogsetting.js: -------------------------------------------------------------------------------- 1 | import axios from "@/axios" 2 | 3 | export function getBlogSettingDetail() { 4 | return axios.post("/blog/setting/detail") 5 | } 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /weblog-vue3/src/api/frontend/category.js: -------------------------------------------------------------------------------- 1 | import axios from "@/axios" 2 | 3 | export function getCategories() { 4 | return axios.post("/category/list") 5 | } 6 | 7 | export function getCategoryArticles(data) { 8 | return axios.post("/category/article/list", data) 9 | } 10 | 11 | 12 | -------------------------------------------------------------------------------- /weblog-vue3/src/api/frontend/index.js: -------------------------------------------------------------------------------- 1 | import axios from "@/axios" 2 | 3 | export function getIndexArticles(data) { 4 | return axios.post("/index/article/list", data) 5 | } 6 | 7 | 8 | -------------------------------------------------------------------------------- /weblog-vue3/src/api/frontend/tag.js: -------------------------------------------------------------------------------- 1 | import axios from "@/axios" 2 | 3 | export function getTags() { 4 | return axios.post("/tag/list") 5 | } 6 | 7 | export function getTagArticles(data) { 8 | return axios.post("/tag/article/list", data) 9 | } 10 | -------------------------------------------------------------------------------- /weblog-vue3/src/assets/base.css: -------------------------------------------------------------------------------- 1 | /* color palette from */ 2 | :root { 3 | --vt-c-white: #ffffff; 4 | --vt-c-white-soft: #f8f8f8; 5 | --vt-c-white-mute: #f2f2f2; 6 | 7 | --vt-c-black: #181818; 8 | --vt-c-black-soft: #222222; 9 | --vt-c-black-mute: #282828; 10 | 11 | --vt-c-indigo: #2c3e50; 12 | 13 | --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); 14 | --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); 15 | --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); 16 | --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); 17 | 18 | --vt-c-text-light-1: var(--vt-c-indigo); 19 | --vt-c-text-light-2: rgba(60, 60, 60, 0.66); 20 | --vt-c-text-dark-1: var(--vt-c-white); 21 | --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); 22 | } 23 | 24 | /* semantic color variables for this project */ 25 | :root { 26 | --color-background: var(--vt-c-white); 27 | --color-background-soft: var(--vt-c-white-soft); 28 | --color-background-mute: var(--vt-c-white-mute); 29 | 30 | --color-border: var(--vt-c-divider-light-2); 31 | --color-border-hover: var(--vt-c-divider-light-1); 32 | 33 | --color-heading: var(--vt-c-text-light-1); 34 | --color-text: var(--vt-c-text-light-1); 35 | 36 | --section-gap: 160px; 37 | } 38 | 39 | @media (prefers-color-scheme: dark) { 40 | :root { 41 | --color-background: var(--vt-c-black); 42 | --color-background-soft: var(--vt-c-black-soft); 43 | --color-background-mute: var(--vt-c-black-mute); 44 | 45 | --color-border: var(--vt-c-divider-dark-2); 46 | --color-border-hover: var(--vt-c-divider-dark-1); 47 | 48 | --color-heading: var(--vt-c-text-dark-1); 49 | --color-text: var(--vt-c-text-dark-2); 50 | } 51 | } 52 | 53 | *, 54 | *::before, 55 | *::after { 56 | box-sizing: border-box; 57 | margin: 0; 58 | position: relative; 59 | font-weight: normal; 60 | } 61 | 62 | body { 63 | min-height: 100vh; 64 | color: var(--color-text); 65 | background: var(--color-background); 66 | transition: color 0.5s, background-color 0.5s; 67 | line-height: 1.6; 68 | font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, 69 | Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; 70 | font-size: 15px; 71 | text-rendering: optimizeLegibility; 72 | -webkit-font-smoothing: antialiased; 73 | -moz-osx-font-smoothing: grayscale; 74 | } 75 | -------------------------------------------------------------------------------- /weblog-vue3/src/assets/developer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/weiwosuoai/WeBlog/6c6d9b50bd0aae7f9485617e4effb049b8bbe9eb/weblog-vue3/src/assets/developer.png -------------------------------------------------------------------------------- /weblog-vue3/src/assets/login-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/weiwosuoai/WeBlog/6c6d9b50bd0aae7f9485617e4effb049b8bbe9eb/weblog-vue3/src/assets/login-logo.png -------------------------------------------------------------------------------- /weblog-vue3/src/assets/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /weblog-vue3/src/assets/main.css: -------------------------------------------------------------------------------- 1 | /* @import './base.css'; 2 | 3 | #app { 4 | max-width: 1280px; 5 | margin: 0 auto; 6 | padding: 2rem; 7 | 8 | font-weight: normal; 9 | } 10 | 11 | a, 12 | .green { 13 | text-decoration: none; 14 | color: hsla(160, 100%, 37%, 1); 15 | transition: 0.4s; 16 | } 17 | 18 | @media (hover: hover) { 19 | a:hover { 20 | background-color: hsla(160, 100%, 37%, 0.2); 21 | } 22 | } 23 | */ 24 | 25 | @tailwind base; 26 | @tailwind components; 27 | @tailwind utilities; 28 | 29 | 30 | 31 | 32 | [type='text']:focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus { 33 | box-shadow: 0 0 0 1px transparent inset!important; 34 | } -------------------------------------------------------------------------------- /weblog-vue3/src/assets/weblog-logo-mini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/weiwosuoai/WeBlog/6c6d9b50bd0aae7f9485617e4effb049b8bbe9eb/weblog-vue3/src/assets/weblog-logo-mini.png -------------------------------------------------------------------------------- /weblog-vue3/src/assets/weblog-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/weiwosuoai/WeBlog/6c6d9b50bd0aae7f9485617e4effb049b8bbe9eb/weblog-vue3/src/assets/weblog-logo.png -------------------------------------------------------------------------------- /weblog-vue3/src/axios.js: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | import { notification, showMessage } from '@/composables/util' 3 | import { getToken } from '@/composables/auth' 4 | import store from "@/store"; 5 | import { Console } from "windicss/utils"; 6 | 7 | const instance = axios.create({ 8 | baseURL: import.meta.env.VITE_APP_BASE_API, 9 | // baseURL: '/', 10 | timeout: 7000 11 | }); 12 | 13 | // 添加请求拦截器 14 | instance.interceptors.request.use(function (config) { 15 | // 在发送请求之前做些什么 16 | const token = getToken() 17 | console.log('统一添加 token: ' + token) 18 | 19 | // 统一添加请求头 Token 20 | if (token) { 21 | config.headers['Authorization'] = 'Bearer ' + token 22 | } 23 | 24 | return config; 25 | }, function (error) { 26 | // 对请求错误做些什么 27 | return Promise.reject(error); 28 | }); 29 | 30 | // 添加响应拦截器 31 | instance.interceptors.response.use(function (response) { 32 | // 对响应数据做点什么 33 | return response.data; 34 | }, function (error) { 35 | // 对响应错误做点什么 36 | let status = error.response.status 37 | console.log('错误响应==========》' + status) 38 | if (status == 401 || status == 402) { 39 | console.log('401-------------') 40 | store.dispatch('logout').finally(() => location.reload()) 41 | } 42 | 43 | let isSuccess = error.response.data.success 44 | console.log('错误响应==========》' + isSuccess) 45 | if (!isSuccess) { 46 | console.log('error: ' + error.response.data.message) 47 | let message = error.response.data.message || '请求失败' 48 | 49 | // todo 失效的情况 50 | // notification(message, 'error') 51 | showMessage(messsage, 'error') 52 | } 53 | 54 | return Promise.reject(error); 55 | }); 56 | 57 | // 暴露 58 | export default instance -------------------------------------------------------------------------------- /weblog-vue3/src/components/ArticlePublishChart.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 80 | -------------------------------------------------------------------------------- /weblog-vue3/src/components/CountTo.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /weblog-vue3/src/components/FormDrawer.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 60 | 61 | -------------------------------------------------------------------------------- /weblog-vue3/src/components/MDEditor.vue: -------------------------------------------------------------------------------- 1 | 6 | 37 | -------------------------------------------------------------------------------- /weblog-vue3/src/components/PVChart.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 55 | -------------------------------------------------------------------------------- /weblog-vue3/src/composables/auth.js: -------------------------------------------------------------------------------- 1 | import { useCookies } from '@vueuse/integrations/useCookies' 2 | 3 | const TOKEN_KEY = 'Authorization' 4 | const cookie = useCookies() 5 | 6 | // 获取 Token 7 | export function getToken() { 8 | return cookie.get(TOKEN_KEY) 9 | } 10 | 11 | // 设置 Token 12 | export function setToken(token) { 13 | return cookie.set(TOKEN_KEY, token) 14 | } 15 | 16 | // 删除 Token 17 | export function removeToken() { 18 | return cookie.remove(TOKEN_KEY) 19 | } -------------------------------------------------------------------------------- /weblog-vue3/src/composables/util.js: -------------------------------------------------------------------------------- 1 | // import { ElNotification, ElMessageBox, ElMessage } from 'element-plus' 2 | import nprogress from "nprogress" 3 | 4 | export function notification(message, type = 'success', dangerouslyUseHTMLString = false) { 5 | ElNotification({ 6 | message, 7 | type, 8 | dangerouslyUseHTMLString, 9 | duration: 3000 10 | }) 11 | } 12 | 13 | export function showModel(content = '提示内容', type = 'warning', title = '') { 14 | return ElMessageBox.confirm( 15 | content, 16 | title, 17 | { 18 | confirmButtonText: '确定', 19 | cancelButtonText: '取消', 20 | type, 21 | } 22 | ) 23 | } 24 | 25 | export function showMessage(message = '提示内容', type = 'success', customClass = '') { 26 | return ElMessage({ 27 | type: type, 28 | message, 29 | customClass, 30 | }) 31 | } 32 | 33 | export function showPageLoading() { 34 | nprogress.start() 35 | } 36 | 37 | export function hidePageLoading() { 38 | nprogress.done() 39 | } -------------------------------------------------------------------------------- /weblog-vue3/src/layouts/admin.vue: -------------------------------------------------------------------------------- 1 | 29 | 30 | 36 | 37 | -------------------------------------------------------------------------------- /weblog-vue3/src/layouts/components/AdminFooter.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /weblog-vue3/src/layouts/components/Footer.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | -------------------------------------------------------------------------------- /weblog-vue3/src/main.js: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import 'virtual:windi.css' 3 | 4 | import '@/assets/main.css' 5 | import 'animate.css'; 6 | import 'nprogress/nprogress.css' 7 | import App from './App.vue' 8 | import router from './router' 9 | import * as ElementPlusIconsVue from '@element-plus/icons-vue' 10 | import store from './store' 11 | import "@/permission" 12 | 13 | // import zhCn from 'element-plus/dist/locale/zh-cn.mjs' 14 | // 代码高亮 15 | import hljs from 'highlight.js' 16 | import 'highlight.js/styles/tokyo-night-dark.css' 17 | 18 | // 富文本图片点击预览 19 | import "viewerjs/dist/viewer.css"; 20 | import Viewer from "v-viewer"; 21 | 22 | const app = createApp(App) 23 | 24 | app.use(store) 25 | app.use(router) 26 | 27 | app.directive('highlight',function (el) { 28 | let highlight = el.querySelectorAll('pre code'); 29 | highlight.forEach((block)=>{ 30 | hljs.highlightBlock(block) 31 | }) 32 | }); 33 | 34 | // 引入图标 35 | for (const [key, component] of Object.entries(ElementPlusIconsVue)) { 36 | app.component(key, component) 37 | } 38 | 39 | app.use(Viewer, { 40 | defaultOptions: { 41 | inline: false, // 默认值:false。启用内联模式。 42 | button: true, // 在查看器的右上角显示按钮。 43 | navbar: true, // 指定导航栏的可见性。 44 | title: true, // 指定标题的可见性和内容。 45 | toolbar: true, // 指定工具栏及其按钮的可见性和布局。 46 | tooltip: true, // 放大或缩小时显示带有图像比率(百分比)的工具提示。 47 | movable: true, // 启用以移动图像。 48 | zoomable: true, // 启用以缩放图像 49 | rotatable: true, // 启用以旋转图像 50 | scalable: true, // 启用以缩放图像。 51 | transition: true, // 为某些特殊元素启用CSS3转换。 52 | fullscreen: true, // 启用以在播放时请求全屏。 53 | keyboard: true, // 启用键盘支持。 54 | // url: 'src', //默认值:'src'。定义获取原始图像URL以供查看的位置。 55 | }, 56 | }); 57 | 58 | app.mount('#app') 59 | -------------------------------------------------------------------------------- /weblog-vue3/src/pages/about.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /weblog-vue3/src/pages/frontend/tag-list.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | -------------------------------------------------------------------------------- /weblog-vue3/src/permission.js: -------------------------------------------------------------------------------- 1 | import router from '@/router/index' 2 | import { getToken } from '@/composables/auth' 3 | import { notification, showMessage } from '@/composables/util' 4 | import store from '@/store' 5 | import { showPageLoading, hidePageLoading } from '@/composables/util' 6 | 7 | 8 | // 全局前置守卫 9 | router.beforeEach(async (to, from, next) => { 10 | console.log('全局前置守卫 >>>>') 11 | showPageLoading() 12 | // if (to.name !== 'Login' && !isAuthenticated) next({ name: 'Login' }) 13 | // else next() 14 | 15 | 16 | 17 | const token = getToken() 18 | 19 | // 如果用户已登录,则自动获取用户信息,并使用全局状态管理 20 | if (token) { 21 | console.log('获取登录用户信息。。。。') 22 | await store.dispatch('getAdminInfo') 23 | } 24 | 25 | // 前台请求逻辑处理 26 | if (!to.path.startsWith('/admin')) { 27 | await store.dispatch('getBlogSetting') 28 | next() 29 | return 30 | } 31 | 32 | 33 | // 后台请求逻辑处理 34 | // 未登录,强制跳转登录页 35 | if (!token && to.path.startsWith('/admin')) { 36 | showMessage('请先登录', 'warning') 37 | next({ path: '/login'}) 38 | return 39 | } 40 | 41 | // 防止重复登录 42 | // if (token && to.path == '/login') { 43 | // notification('请勿重复登录', 'error') 44 | // next({ path: from.path ? from.path : '/' }) 45 | // } 46 | 47 | next() 48 | }) 49 | 50 | router.afterEach((to, from) => { 51 | // 设置页面标题 52 | let title = (to.meta.title ? to.meta.title : '') + ' - WeBlog' 53 | document.title = title 54 | 55 | hidePageLoading() 56 | }) 57 | -------------------------------------------------------------------------------- /weblog-vue3/src/store/index.js: -------------------------------------------------------------------------------- 1 | import { createStore } from 'vuex' 2 | import { getAdminInfo } from '@/api/admin/user' 3 | import { getBlogSettingDetail } from '@/api/frontend/blogsetting' 4 | import { removeToken } from '@/composables/auth' 5 | import { useRouter } from 'vue-router' 6 | 7 | const router = useRouter() 8 | 9 | // 创建一个新的 store 实例 10 | const store = createStore({ 11 | state() { 12 | return { 13 | // 用户信息 14 | user: {}, 15 | setting: {}, 16 | menuWidth: "250px" 17 | } 18 | }, 19 | mutations: { 20 | // 设置全局用户信息 21 | SET_USERINFO(state, user) { 22 | state.user = user 23 | }, 24 | // 设置博客设置信息 25 | SET_BLOG_SETTING(state, setting) { 26 | state.setting = setting 27 | }, 28 | // 展开或缩起侧边栏 29 | HANDLE_MENU_WIDTH(state) { 30 | state.menuWidth = state.menuWidth == "250px" ? "64px" : "250px" 31 | } 32 | 33 | }, 34 | actions: { 35 | // 获取用户登录信息 36 | // 入参 commit 相当于 store.commit 37 | getAdminInfo({ commit }) { 38 | return new Promise((resolve, reject) => { 39 | getAdminInfo().then(res => { 40 | commit('SET_USERINFO', res.data) 41 | // 固定使用格式 42 | resolve(res.data) 43 | }).catch(err => { 44 | console.log('获取用户信息失败') 45 | reject(err) 46 | }) 47 | }) 48 | }, 49 | getBlogSetting({ commit }) { 50 | return new Promise((resolve, reject) => { 51 | getBlogSettingDetail().then(res => { 52 | commit('SET_BLOG_SETTING', res.data) 53 | // 固定使用格式 54 | resolve(res.data) 55 | }).catch(err => { 56 | console.log('获取博客设置信息失败') 57 | reject(err) 58 | }) 59 | }) 60 | }, 61 | logout({ commit }) { 62 | removeToken() 63 | // 删除当前全局的 user 状态 64 | commit('SET_USERINFO', {}) 65 | } 66 | } 67 | }) 68 | 69 | // 暴露 70 | export default store -------------------------------------------------------------------------------- /weblog-vue3/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: [ 4 | "./index.html", 5 | "./src/**/*.{vue,js,ts,jsx,tsx}", 6 | "./node_modules/flowbite/**/*.js" 7 | ], 8 | theme: { 9 | extend: {}, 10 | }, 11 | plugins: [ 12 | require('flowbite/plugin'), 13 | ], 14 | corePlugins: { 15 | // 取消 tailwindcss 的默认样式 16 | preflight: false 17 | } 18 | } 19 | 20 | -------------------------------------------------------------------------------- /weblog-vue3/vite.config.js: -------------------------------------------------------------------------------- 1 | import { fileURLToPath, URL } from 'node:url' 2 | 3 | import { defineConfig } from 'vite' 4 | import vue from '@vitejs/plugin-vue' 5 | import WindiCSS from 'vite-plugin-windicss' 6 | import path from 'node:path' 7 | import AutoImport from 'unplugin-auto-import/vite' 8 | import Components from 'unplugin-vue-components/vite' 9 | import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' 10 | 11 | // https://vitejs.dev/config/ 12 | export default defineConfig({ 13 | server: { 14 | proxy: { 15 | '/api': { 16 | target: 'http://localhost:8081', 17 | changeOrigin: true, 18 | rewrite: (path) => path.replace(/^\/api/, ''), 19 | }, 20 | } 21 | }, 22 | plugins: [ 23 | vue(), 24 | WindiCSS(), 25 | AutoImport({ 26 | resolvers: [ElementPlusResolver()], 27 | }), 28 | Components({ 29 | resolvers: [ElementPlusResolver()], 30 | }), 31 | ], 32 | resolve: { 33 | alias: { 34 | '@': fileURLToPath(new URL('./src', import.meta.url)), 35 | // 指定 src 文件夹别名,以便快速定位到此文件夹 36 | // "~": path.resolve(__dirname, "src") 37 | } 38 | } 39 | }) 40 | --------------------------------------------------------------------------------