├── README.assets ├── admin-article-list.png ├── admin-article-save.png ├── admin-home.png ├── article1.jpg ├── article2.png ├── chat.png ├── home.png └── talk.png ├── README.md ├── m-blog-admin ├── .editorconfig ├── .env.development ├── .env.production ├── .env.staging ├── .eslintignore ├── .eslintrc.js ├── .github │ ├── FUNDING.yml │ └── ISSUE_TEMPLATE │ │ ├── bug_report.md │ │ ├── feature_request.md │ │ └── question.md ├── .gitignore ├── .travis.yml ├── LICENSE ├── README.es.md ├── README.ja.md ├── README.md ├── README.zh-CN.md ├── babel.config.js ├── build │ └── index.js ├── jest.config.js ├── jsconfig.json ├── package.json ├── plop-templates │ ├── component │ │ ├── index.hbs │ │ └── prompt.js │ ├── store │ │ ├── index.hbs │ │ └── prompt.js │ ├── utils.js │ └── view │ │ ├── index.hbs │ │ └── prompt.js ├── plopfile.js ├── postcss.config.js ├── public │ ├── favicon.ico │ └── index.html ├── src │ ├── App.vue │ ├── api │ │ ├── article.js │ │ ├── category.js │ │ ├── friendLink.js │ │ ├── log.js │ │ ├── message.js │ │ ├── qiniu.js │ │ ├── remote-search.js │ │ ├── role.js │ │ ├── tag.js │ │ ├── talk.js │ │ ├── user.js │ │ └── website.js │ ├── assets │ │ ├── 401_images │ │ │ └── 401.gif │ │ ├── 404_images │ │ │ ├── 404.png │ │ │ └── 404_cloud.png │ │ ├── css │ │ │ ├── iconfont.css │ │ │ ├── iconfont.eot │ │ │ ├── iconfont.svg │ │ │ ├── iconfont.ttf │ │ │ ├── iconfont.woff │ │ │ ├── iconfont.woff2 │ │ │ └── index.css │ │ ├── custom-theme │ │ │ ├── fonts │ │ │ │ ├── element-icons.ttf │ │ │ │ └── element-icons.woff │ │ │ └── index.css │ │ └── js │ │ │ ├── china.js │ │ │ ├── emoji.js │ │ │ ├── global.js │ │ │ └── tag-cloud.js │ ├── components │ │ ├── BackToTop │ │ │ └── index.vue │ │ ├── Breadcrumb │ │ │ └── index.vue │ │ ├── Charts │ │ │ ├── Keyboard.vue │ │ │ ├── LineMarker.vue │ │ │ ├── MixChart.vue │ │ │ └── mixins │ │ │ │ └── resize.js │ │ ├── DndList │ │ │ └── index.vue │ │ ├── DragSelect │ │ │ └── index.vue │ │ ├── Dropzone │ │ │ └── index.vue │ │ ├── Editor.vue │ │ ├── ErrorLog │ │ │ └── index.vue │ │ ├── GithubCorner │ │ │ └── index.vue │ │ ├── Hamburger │ │ │ └── index.vue │ │ ├── HeaderSearch │ │ │ └── index.vue │ │ ├── ImageCropper │ │ │ ├── index.vue │ │ │ └── utils │ │ │ │ ├── data2blob.js │ │ │ │ ├── effectRipple.js │ │ │ │ ├── language.js │ │ │ │ └── mimes.js │ │ ├── JsonEditor │ │ │ └── index.vue │ │ ├── Kanban │ │ │ └── index.vue │ │ ├── MDinput │ │ │ └── index.vue │ │ ├── MarkdownEditor │ │ │ ├── default-options.js │ │ │ └── index.vue │ │ ├── Pagination │ │ │ └── index.vue │ │ ├── PanThumb │ │ │ └── index.vue │ │ ├── RightPanel │ │ │ └── index.vue │ │ ├── Screenfull │ │ │ └── index.vue │ │ ├── Share │ │ │ └── DropdownMenu.vue │ │ ├── SizeSelect │ │ │ └── index.vue │ │ ├── Sticky │ │ │ └── index.vue │ │ ├── SvgIcon │ │ │ └── index.vue │ │ ├── TextHoverEffect │ │ │ └── Mallki.vue │ │ ├── ThemePicker │ │ │ └── index.vue │ │ ├── Tinymce │ │ │ ├── components │ │ │ │ └── EditorImage.vue │ │ │ ├── dynamicLoadScript.js │ │ │ ├── index.vue │ │ │ ├── plugins.js │ │ │ └── toolbar.js │ │ ├── Upload │ │ │ ├── SingleImage.vue │ │ │ ├── SingleImage2.vue │ │ │ └── SingleImage3.vue │ │ └── UploadExcel │ │ │ └── index.vue │ ├── directive │ │ ├── clipboard │ │ │ ├── clipboard.js │ │ │ └── index.js │ │ ├── el-drag-dialog │ │ │ ├── drag.js │ │ │ └── index.js │ │ ├── el-table │ │ │ ├── adaptive.js │ │ │ └── index.js │ │ ├── permission │ │ │ ├── index.js │ │ │ └── permission.js │ │ ├── sticky.js │ │ └── waves │ │ │ ├── index.js │ │ │ ├── waves.css │ │ │ └── waves.js │ ├── filters │ │ └── index.js │ ├── icons │ │ ├── index.js │ │ ├── svg │ │ │ ├── 404.svg │ │ │ ├── bug.svg │ │ │ ├── chart.svg │ │ │ ├── clipboard.svg │ │ │ ├── component.svg │ │ │ ├── dashboard.svg │ │ │ ├── documentation.svg │ │ │ ├── drag.svg │ │ │ ├── edit.svg │ │ │ ├── education.svg │ │ │ ├── email.svg │ │ │ ├── example.svg │ │ │ ├── excel.svg │ │ │ ├── exit-fullscreen.svg │ │ │ ├── eye-open.svg │ │ │ ├── eye.svg │ │ │ ├── form.svg │ │ │ ├── friend-link.svg │ │ │ ├── fullscreen.svg │ │ │ ├── guide.svg │ │ │ ├── icon.svg │ │ │ ├── international.svg │ │ │ ├── language.svg │ │ │ ├── link.svg │ │ │ ├── list.svg │ │ │ ├── lock.svg │ │ │ ├── message.svg │ │ │ ├── money.svg │ │ │ ├── nested.svg │ │ │ ├── password.svg │ │ │ ├── pdf.svg │ │ │ ├── people.svg │ │ │ ├── peoples.svg │ │ │ ├── qq.svg │ │ │ ├── search.svg │ │ │ ├── setup.svg │ │ │ ├── shopping.svg │ │ │ ├── size.svg │ │ │ ├── skill.svg │ │ │ ├── star.svg │ │ │ ├── tab.svg │ │ │ ├── table.svg │ │ │ ├── theme.svg │ │ │ ├── tree-table.svg │ │ │ ├── tree.svg │ │ │ ├── user.svg │ │ │ ├── website.svg │ │ │ ├── wechat.svg │ │ │ └── zip.svg │ │ └── svgo.yml │ ├── layout │ │ ├── components │ │ │ ├── AppMain.vue │ │ │ ├── Navbar.vue │ │ │ ├── Settings │ │ │ │ └── index.vue │ │ │ ├── Sidebar │ │ │ │ ├── FixiOSBug.js │ │ │ │ ├── Item.vue │ │ │ │ ├── Link.vue │ │ │ │ ├── Logo.vue │ │ │ │ ├── SidebarItem.vue │ │ │ │ └── index.vue │ │ │ ├── TagsView │ │ │ │ ├── ScrollPane.vue │ │ │ │ └── index.vue │ │ │ └── index.js │ │ ├── index.vue │ │ └── mixin │ │ │ └── ResizeHandler.js │ ├── main.js │ ├── permission.js │ ├── plugins │ │ └── vuetify.js │ ├── router │ │ ├── index.js │ │ └── modules │ │ │ ├── article.js │ │ │ ├── charts.js │ │ │ ├── components.js │ │ │ ├── friendLink.js │ │ │ ├── log.js │ │ │ ├── message.js │ │ │ ├── nested.js │ │ │ ├── table.js │ │ │ ├── talk.js │ │ │ ├── users.js │ │ │ └── website.js │ ├── settings.js │ ├── store │ │ ├── getters.js │ │ ├── index.js │ │ └── modules │ │ │ ├── app.js │ │ │ ├── article.js │ │ │ ├── category.js │ │ │ ├── errorLog.js │ │ │ ├── friendLink.js │ │ │ ├── log.js │ │ │ ├── message.js │ │ │ ├── permission.js │ │ │ ├── settings.js │ │ │ ├── tag.js │ │ │ ├── tagsView.js │ │ │ ├── talk.js │ │ │ ├── user.js │ │ │ └── website.js │ ├── styles │ │ ├── btn.scss │ │ ├── element-ui.scss │ │ ├── element-variables.scss │ │ ├── index.scss │ │ ├── mixin.scss │ │ ├── sidebar.scss │ │ ├── transition.scss │ │ └── variables.scss │ ├── utils │ │ ├── auth.js │ │ ├── clipboard.js │ │ ├── error-log.js │ │ ├── get-page-title.js │ │ ├── index.js │ │ ├── open-window.js │ │ ├── permission.js │ │ ├── request.js │ │ ├── scroll-to.js │ │ └── validate.js │ ├── vendor │ │ ├── Export2Excel.js │ │ └── Export2Zip.js │ └── views │ │ ├── article │ │ ├── AddArticle.vue │ │ ├── ArticleList.vue │ │ ├── CateGory.vue │ │ └── Tag.vue │ │ ├── charts │ │ ├── keyboard.vue │ │ ├── line.vue │ │ └── mix-chart.vue │ │ ├── components-demo │ │ ├── avatar-upload.vue │ │ ├── back-to-top.vue │ │ ├── count-to.vue │ │ ├── dnd-list.vue │ │ ├── drag-dialog.vue │ │ ├── drag-kanban.vue │ │ ├── drag-select.vue │ │ ├── dropzone.vue │ │ ├── json-editor.vue │ │ ├── markdown.vue │ │ ├── mixin.vue │ │ ├── split-pane.vue │ │ ├── sticky.vue │ │ └── tinymce.vue │ │ ├── error-log │ │ ├── components │ │ │ ├── ErrorTestA.vue │ │ │ └── ErrorTestB.vue │ │ └── index.vue │ │ ├── error-page │ │ ├── 401.vue │ │ └── 404.vue │ │ ├── friendLink │ │ └── FriendLink.vue │ │ ├── home │ │ └── Home.vue │ │ ├── log │ │ └── Operation.vue │ │ ├── login │ │ ├── auth-redirect.vue │ │ ├── components │ │ │ └── SocialSignin.vue │ │ └── index.vue │ │ ├── message │ │ ├── Comment.vue │ │ └── Message.vue │ │ ├── nested │ │ ├── menu1 │ │ │ ├── index.vue │ │ │ ├── menu1-1 │ │ │ │ └── index.vue │ │ │ ├── menu1-2 │ │ │ │ ├── index.vue │ │ │ │ ├── menu1-2-1 │ │ │ │ │ └── index.vue │ │ │ │ └── menu1-2-2 │ │ │ │ │ └── index.vue │ │ │ └── menu1-3 │ │ │ │ └── index.vue │ │ └── menu2 │ │ │ └── index.vue │ │ ├── redirect │ │ └── index.vue │ │ ├── table │ │ ├── complex-table.vue │ │ ├── drag-table.vue │ │ ├── dynamic-table │ │ │ ├── components │ │ │ │ ├── FixedThead.vue │ │ │ │ └── UnfixedThead.vue │ │ │ └── index.vue │ │ └── inline-edit-table.vue │ │ ├── talk │ │ ├── Talk.vue │ │ └── TalkList.vue │ │ ├── users │ │ ├── Online.vue │ │ ├── UserList.vue │ │ └── personalCenter.vue │ │ └── website │ │ ├── Page.vue │ │ └── Website.vue ├── tests │ └── unit │ │ ├── .eslintrc.js │ │ ├── components │ │ ├── Hamburger.spec.js │ │ └── SvgIcon.spec.js │ │ └── utils │ │ ├── formatTime.spec.js │ │ ├── param2Obj.spec.js │ │ ├── parseTime.spec.js │ │ └── validate.spec.js └── vue.config.js ├── m-blog-springboot ├── .gitignore ├── .mvn │ └── wrapper │ │ ├── MavenWrapperDownloader.java │ │ ├── maven-wrapper.jar │ │ └── maven-wrapper.properties ├── Dockerfile ├── README.md ├── mvnw ├── mvnw.cmd ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── ming │ │ │ └── m_blog │ │ │ ├── MBlogSpringbootApplication.java │ │ │ ├── annotation │ │ │ ├── AccessLimit.java │ │ │ └── OptLog.java │ │ │ ├── aspect │ │ │ └── OptLogAspect.java │ │ │ ├── config │ │ │ ├── GithubConfigProperties.java │ │ │ ├── Knife4jConfiguration.java │ │ │ ├── MybatisPlusConfig.java │ │ │ ├── QQConfigProperties.java │ │ │ ├── QiniuConfigProperties.java │ │ │ ├── QiniuFileConfig.java │ │ │ ├── RabbitMQConfig.java │ │ │ ├── RedisConfig.java │ │ │ ├── WebMvcConfig.java │ │ │ ├── WebSecurityConfig.java │ │ │ └── WebSocketConfig.java │ │ │ ├── constant │ │ │ ├── AuthorityInfoConst.java │ │ │ ├── CommonConst.java │ │ │ ├── DatabaseTableConst.java │ │ │ ├── MQPrefixConst.java │ │ │ ├── OptTypeConstant.java │ │ │ ├── PowerConst.java │ │ │ ├── RedisPrefixConst.java │ │ │ └── SocialLoginConst.java │ │ │ ├── consumer │ │ │ ├── EmailConsumer.java │ │ │ └── MaxwellConsumer.java │ │ │ ├── controller │ │ │ ├── ArticleController.java │ │ │ ├── BlogInfoController.java │ │ │ ├── CategoryController.java │ │ │ ├── ChatGptController.java │ │ │ ├── ChatRecordController.java │ │ │ ├── CommentController.java │ │ │ ├── FriendLinkController.java │ │ │ ├── InArticleTagController.java │ │ │ ├── InRolePowerController.java │ │ │ ├── InUserRoleController.java │ │ │ ├── LogController.java │ │ │ ├── MessageController.java │ │ │ ├── PageController.java │ │ │ ├── PowerController.java │ │ │ ├── RoleController.java │ │ │ ├── TagController.java │ │ │ ├── TalkController.java │ │ │ ├── UniqueViewController.java │ │ │ ├── UserAuthController.java │ │ │ └── UserInfoController.java │ │ │ ├── dto │ │ │ ├── EmailSendDTO.java │ │ │ ├── MaxwellDataDTO.java │ │ │ ├── article │ │ │ │ ├── ArchiveDTO.java │ │ │ │ ├── ArticleDTO.java │ │ │ │ ├── ArticleListInfoDTO.java │ │ │ │ ├── ArticlePaginationDTO.java │ │ │ │ ├── ArticlePreviewDTO.java │ │ │ │ ├── ArticlePreviewListDTO.java │ │ │ │ ├── ArticleRankDTO.java │ │ │ │ ├── ArticleRecommendDTO.java │ │ │ │ ├── ArticleStatisticsDTO.java │ │ │ │ └── HomeArticleDTO.java │ │ │ ├── blogInfo │ │ │ │ ├── BlogBackStatisticsDTO.java │ │ │ │ ├── BlogInfoDTO.java │ │ │ │ └── UniqueViewDTO.java │ │ │ ├── category │ │ │ │ ├── CategoryDTO.java │ │ │ │ ├── CategoryListDTO.java │ │ │ │ └── CategorySimpleDTO.java │ │ │ ├── chatGpt │ │ │ │ └── ReMessageDTO.java │ │ │ ├── chatRecord │ │ │ │ ├── ChatMessageDTO.java │ │ │ │ ├── ChatRecordDTO.java │ │ │ │ └── RecallMessageDTO.java │ │ │ ├── comment │ │ │ │ ├── CommentCountDTO.java │ │ │ │ ├── CommentDTO.java │ │ │ │ ├── CommentListDTO.java │ │ │ │ ├── ReplyCountDTO.java │ │ │ │ └── ReplyDTO.java │ │ │ ├── friendLink │ │ │ │ ├── FriendLinkBackDTO.java │ │ │ │ └── FriendLinkDTO.java │ │ │ ├── log │ │ │ │ └── OperationLogDTO.java │ │ │ ├── message │ │ │ │ ├── MessageBackDTO.java │ │ │ │ └── MessageDTO.java │ │ │ ├── oauth │ │ │ │ ├── GithubGetTokenRequest.java │ │ │ │ ├── GithubGetTokenResponse.java │ │ │ │ ├── GithubUserResponse.java │ │ │ │ ├── QQTokenDTO.java │ │ │ │ ├── QQUserInfoDTO.java │ │ │ │ ├── SocialTokenDTO.java │ │ │ │ └── SocialUserInfoDTO.java │ │ │ ├── search │ │ │ │ ├── ArticleSearchDTO.java │ │ │ │ ├── CategorySearchDTO.java │ │ │ │ ├── SearchPictureDTO.java │ │ │ │ └── TagSearchDTO.java │ │ │ ├── tag │ │ │ │ └── TagSimpleDTO.java │ │ │ ├── talk │ │ │ │ ├── TagListDTO.java │ │ │ │ ├── TalkBackDTO.java │ │ │ │ └── TalkDTO.java │ │ │ └── user │ │ │ │ ├── UserAreaDTO.java │ │ │ │ ├── UserDetailDTO.java │ │ │ │ ├── UserInfoDTO.java │ │ │ │ ├── UserListDTO.java │ │ │ │ └── UserOnlineDTO.java │ │ │ ├── enums │ │ │ ├── ArticleStatusEnum.java │ │ │ ├── ChatTypeEnum.java │ │ │ ├── CommentTypeEnum.java │ │ │ ├── DefaultImgEnum.java │ │ │ ├── FilePathEnum.java │ │ │ ├── LoginTypeEnum.java │ │ │ ├── RoleEnum.java │ │ │ ├── SearchModelEnum.java │ │ │ ├── SearchTypeEnum.java │ │ │ ├── StatusCodeEnum.java │ │ │ ├── TalkStatusEnum.java │ │ │ ├── UploadFileModelEnum.java │ │ │ └── UserTypeEnum.java │ │ │ ├── exception │ │ │ └── ReRuntimeException.java │ │ │ ├── hander │ │ │ ├── AccessDeniedHandlerImpl.java │ │ │ ├── AuthenticationEntryPointImpl.java │ │ │ ├── AuthenticationFailHandlerImpl.java │ │ │ ├── AuthenticationSuccessHandlerImpl.java │ │ │ ├── ControllerAdviceHandler.java │ │ │ ├── LogoutSuccessHandlerImpl.java │ │ │ ├── LogoutTokenHandlerImpl.java │ │ │ ├── MybatisPlusFillingHandler.java │ │ │ └── SessionInformationExpiredStrategyImpl.java │ │ │ ├── interceptor │ │ │ ├── AccessLimitInterceptor.java │ │ │ └── PageableHandlerInterceptor.java │ │ │ ├── mapper │ │ │ ├── ArticleMapper.java │ │ │ ├── CategoryMapper.java │ │ │ ├── ChatRecordMapper.java │ │ │ ├── CommentMapper.java │ │ │ ├── FriendLinkMapper.java │ │ │ ├── InArticleTagMapper.java │ │ │ ├── InRolePowerMapper.java │ │ │ ├── InUserRoleMapper.java │ │ │ ├── MessageMapper.java │ │ │ ├── OperationLogMapper.java │ │ │ ├── PageMapper.java │ │ │ ├── PowerMapper.java │ │ │ ├── RoleMapper.java │ │ │ ├── TagMapper.java │ │ │ ├── TalkMapper.java │ │ │ ├── UniqueViewMapper.java │ │ │ ├── UserAuthMapper.java │ │ │ ├── UserInfoMapper.java │ │ │ ├── WebsiteConfigMapper.java │ │ │ └── elasticSearch │ │ │ │ ├── ArticleEsMapper.java │ │ │ │ ├── CategoryEsMapper.java │ │ │ │ └── TagEsMapper.java │ │ │ ├── pojo │ │ │ ├── Article.java │ │ │ ├── Category.java │ │ │ ├── ChatRecord.java │ │ │ ├── Comment.java │ │ │ ├── FriendLink.java │ │ │ ├── InArticleTag.java │ │ │ ├── InRolePower.java │ │ │ ├── InUserRole.java │ │ │ ├── Message.java │ │ │ ├── OperationLog.java │ │ │ ├── Page.java │ │ │ ├── Power.java │ │ │ ├── Role.java │ │ │ ├── Tag.java │ │ │ ├── Talk.java │ │ │ ├── UniqueView.java │ │ │ ├── UserAuth.java │ │ │ ├── UserInfo.java │ │ │ └── WebsiteConfig.java │ │ │ ├── service │ │ │ ├── ArticleService.java │ │ │ ├── BlogService.java │ │ │ ├── CategoryService.java │ │ │ ├── ChatRecordService.java │ │ │ ├── CommentService.java │ │ │ ├── FileService.java │ │ │ ├── FriendLinkService.java │ │ │ ├── InArticleTagService.java │ │ │ ├── InRolePowerService.java │ │ │ ├── InUserRoleService.java │ │ │ ├── MessageService.java │ │ │ ├── OperationLogService.java │ │ │ ├── PageService.java │ │ │ ├── PowerService.java │ │ │ ├── RedisService.java │ │ │ ├── RoleService.java │ │ │ ├── TagService.java │ │ │ ├── TalkService.java │ │ │ ├── UniqueViewService.java │ │ │ ├── UserAuthService.java │ │ │ ├── UserInfoService.java │ │ │ ├── WebsiteConfigService.java │ │ │ └── impl │ │ │ │ ├── ArticleServiceImpl.java │ │ │ │ ├── BlogServiceImpl.java │ │ │ │ ├── CategoryServiceImpl.java │ │ │ │ ├── ChatRecordServiceImpl.java │ │ │ │ ├── CommentServiceImpl.java │ │ │ │ ├── FileServiceImpl.java │ │ │ │ ├── FriendLinkServiceImpl.java │ │ │ │ ├── InArticleTagServiceImpl.java │ │ │ │ ├── InRolePowerServiceImpl.java │ │ │ │ ├── InUserRoleServiceImpl.java │ │ │ │ ├── MessageServiceImpl.java │ │ │ │ ├── OperationLogServiceImpl.java │ │ │ │ ├── PageServiceImpl.java │ │ │ │ ├── PowerServiceImpl.java │ │ │ │ ├── RedisServiceImpl.java │ │ │ │ ├── RoleServiceImpl.java │ │ │ │ ├── TagServiceImpl.java │ │ │ │ ├── TalkServiceImpl.java │ │ │ │ ├── UniqueViewServiceImpl.java │ │ │ │ ├── UserAuthServiceImpl.java │ │ │ │ ├── UserDetailsServiceImpl.java │ │ │ │ ├── UserInfoServiceImpl.java │ │ │ │ ├── WebsiteConfigServiceImpl.java │ │ │ │ └── websocket │ │ │ │ └── ChatRoomSocketImpl.java │ │ │ ├── strategy │ │ │ ├── LoginStrategy.java │ │ │ ├── SearchStrategy.java │ │ │ ├── UploadStrategy.java │ │ │ ├── context │ │ │ │ ├── SearchStrategyContext.java │ │ │ │ ├── SocialLoginStrategyContext.java │ │ │ │ └── UploadFileContext.java │ │ │ └── impl │ │ │ │ ├── AbstractLoginStrategyImpl.java │ │ │ │ ├── AbstractSearchStrategy.java │ │ │ │ ├── AbstractUploadStrategyImpl.java │ │ │ │ ├── EsArticleSearchImpl.java │ │ │ │ ├── EsCategorySearchImpl.java │ │ │ │ ├── EsSearchStrategyImpl.java │ │ │ │ ├── EsTagSearchImpl.java │ │ │ │ ├── GithubLoginStrategyImpl.java │ │ │ │ ├── LocalUploadStrategyImpl.java │ │ │ │ ├── MysqlArticleSearchImpl.java │ │ │ │ ├── MysqlCategorySearchImpl.java │ │ │ │ ├── MysqlSearchStrategyImpl.java │ │ │ │ ├── MysqlTagSearchImpl.java │ │ │ │ ├── QQLoginStrategyImpl.java │ │ │ │ ├── QiNiuUploadStrategyImpl.java │ │ │ │ └── SearchPictureStrategyImpl.java │ │ │ ├── utils │ │ │ ├── BeanCopyUtils.java │ │ │ ├── CommonUtils.java │ │ │ ├── FileUtils.java │ │ │ ├── HTMLUtils.java │ │ │ ├── HashUtils.java │ │ │ ├── IpUtils.java │ │ │ ├── JwtUtil.java │ │ │ ├── PageUtils.java │ │ │ ├── RedisUtil.java │ │ │ ├── UUIDUtils.java │ │ │ ├── UserUtils.java │ │ │ └── WebUtils.java │ │ │ └── vo │ │ │ ├── AdminArticlesVO.java │ │ │ ├── AdminCommentsVO.java │ │ │ ├── ArticleAddVO.java │ │ │ ├── ArticleListConditionVO.java │ │ │ ├── ChangeArticleTopVO.java │ │ │ ├── ChangeUserInfoVO.java │ │ │ ├── CommentsVO.java │ │ │ ├── FriendLinkVO.java │ │ │ ├── GithubLoginVO.java │ │ │ ├── LoginUserVO.java │ │ │ ├── MessageVO.java │ │ │ ├── PageResult.java │ │ │ ├── PageVO.java │ │ │ ├── PasswordVO.java │ │ │ ├── QQLoginVO.java │ │ │ ├── QueryInfoVO.java │ │ │ ├── RegisterVO.java │ │ │ ├── ResponseResult.java │ │ │ ├── ReviewVO.java │ │ │ ├── SearchVO.java │ │ │ ├── TalkVO.java │ │ │ ├── UpdateUserDeleteVO.java │ │ │ ├── UserEmailVO.java │ │ │ ├── UserSimpInfoVO.java │ │ │ └── WebsiteConfigVO.java │ └── resources │ │ ├── application-dev.yml │ │ ├── application-prod.yml │ │ ├── application.yml │ │ └── mapper │ │ ├── ArticleMapper.xml │ │ ├── CategoryMapper.xml │ │ ├── ChatRecordMapper.xml │ │ ├── CommentMapper.xml │ │ ├── FriendLinkMapper.xml │ │ ├── InArticleTagMapper.xml │ │ ├── InRolePowerMapper.xml │ │ ├── InUserRoleMapper.xml │ │ ├── MessageMapper.xml │ │ ├── OperationLogMapper.xml │ │ ├── PageMapper.xml │ │ ├── PowerMapper.xml │ │ ├── RoleMapper.xml │ │ ├── TagMapper.xml │ │ ├── TalkMapper.xml │ │ ├── UniqueViewMapper.xml │ │ ├── UserAuthMapper.xml │ │ ├── UserInfoMapper.xml │ │ └── WebsiteConfigMapper.xml │ └── test │ └── java │ └── com │ └── ming │ └── m_blog │ ├── ArticleTest.java │ ├── BlogTest.java │ ├── CategoryTest.java │ ├── CommentTest.java │ ├── MBlogSpringbootApplicationTests.java │ ├── TagTest.java │ ├── UserTest.java │ └── mybaitsPlusCodeAuth │ └── CodeAutogenerate.java ├── m-blog ├── .gitignore ├── README.md ├── babel.config.js ├── jsconfig.json ├── package-lock.json ├── package.json ├── public │ ├── favicon.ico │ └── index.html ├── src │ ├── App.vue │ ├── assets │ │ ├── css │ │ │ ├── iconfont.css │ │ │ ├── iconfont.eot │ │ │ ├── iconfont.svg │ │ │ ├── iconfont.ttf │ │ │ ├── iconfont.woff │ │ │ ├── iconfont.woff2 │ │ │ ├── iconfont_github.ttf │ │ │ ├── index.css │ │ │ ├── markdown.css │ │ │ └── vue-social-share │ │ │ │ ├── client.css │ │ │ │ └── static │ │ │ │ ├── iconfont.eot │ │ │ │ ├── iconfont.svg │ │ │ │ ├── iconfont.ttf │ │ │ │ └── iconfont.woff │ │ ├── js │ │ │ ├── config.js │ │ │ ├── emoji.js │ │ │ └── global.js │ │ ├── logo.png │ │ └── logo.svg │ ├── components │ │ ├── BackTop.vue │ │ ├── ChatGpt.vue │ │ ├── ChatRoom.vue │ │ ├── Comment.vue │ │ ├── Emoji.vue │ │ ├── OauthLogin.vue │ │ ├── Paging.vue │ │ ├── Reply.vue │ │ ├── Swiper.vue │ │ ├── TalkComment.vue │ │ ├── layout │ │ │ ├── Footer.vue │ │ │ ├── SideNavBar.vue │ │ │ └── TopNavBar.vue │ │ ├── model │ │ │ ├── EmailModel.vue │ │ │ ├── ForgetModel.vue │ │ │ ├── LoginModel.vue │ │ │ ├── RegisterModel.vue │ │ │ └── SearchModel.vue │ │ └── toast │ │ │ ├── Toast.vue │ │ │ └── index.js │ ├── main.js │ ├── plugins │ │ └── vuetify.js │ ├── router │ │ └── index.js │ ├── store │ │ └── index.js │ └── views │ │ ├── archive │ │ └── Archive.vue │ │ ├── article │ │ ├── Article.vue │ │ └── ArticleList.vue │ │ ├── category │ │ └── Category.vue │ │ ├── friendLink │ │ └── Link.vue │ │ ├── home │ │ └── Home.vue │ │ ├── message │ │ └── Message.vue │ │ ├── tag │ │ └── Tag.vue │ │ ├── talk │ │ ├── Talk.vue │ │ └── TalkInfo.vue │ │ └── user │ │ └── User.vue └── vue.config.js └── sql └── blog.sql /README.assets/admin-article-list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/README.assets/admin-article-list.png -------------------------------------------------------------------------------- /README.assets/admin-article-save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/README.assets/admin-article-save.png -------------------------------------------------------------------------------- /README.assets/admin-home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/README.assets/admin-home.png -------------------------------------------------------------------------------- /README.assets/article1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/README.assets/article1.jpg -------------------------------------------------------------------------------- /README.assets/article2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/README.assets/article2.png -------------------------------------------------------------------------------- /README.assets/chat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/README.assets/chat.png -------------------------------------------------------------------------------- /README.assets/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/README.assets/home.png -------------------------------------------------------------------------------- /README.assets/talk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/README.assets/talk.png -------------------------------------------------------------------------------- /m-blog-admin/.editorconfig: -------------------------------------------------------------------------------- 1 | # https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | end_of_line = lf 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | 12 | [*.md] 13 | insert_final_newline = false 14 | trim_trailing_whitespace = false 15 | -------------------------------------------------------------------------------- /m-blog-admin/.env.development: -------------------------------------------------------------------------------- 1 | # just a flag 2 | ENV = 'development' 3 | 4 | # base api 5 | VUE_APP_BASE_API = '/dev-api' 6 | -------------------------------------------------------------------------------- /m-blog-admin/.env.production: -------------------------------------------------------------------------------- 1 | # just a flag 2 | ENV = 'production' 3 | 4 | # base api 5 | VUE_APP_BASE_API = '/prod-api' 6 | 7 | -------------------------------------------------------------------------------- /m-blog-admin/.env.staging: -------------------------------------------------------------------------------- 1 | NODE_ENV = production 2 | 3 | # just a flag 4 | ENV = 'staging' 5 | 6 | # base api 7 | VUE_APP_BASE_API = '/stage-api' 8 | 9 | -------------------------------------------------------------------------------- /m-blog-admin/.eslintignore: -------------------------------------------------------------------------------- 1 | build/*.js 2 | src/assets 3 | public 4 | dist 5 | -------------------------------------------------------------------------------- /m-blog-admin/.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | patreon: panjiachen 4 | custom: https://panjiachen.github.io/vue-element-admin-site/donate 5 | -------------------------------------------------------------------------------- /m-blog-admin/.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report(报告问题) 3 | about: Create a report to help us improve 4 | --- 5 | 10 | 11 | 12 | ## Bug report(问题描述) 13 | 14 | #### Steps to reproduce(问题复现步骤) 15 | 20 | 21 | #### Screenshot or Gif(截图或动态图) 22 | 23 | 24 | #### Link to minimal reproduction(最小可在线还原demo) 25 | 26 | 29 | 30 | #### Other relevant information(格外信息) 31 | - Your OS: 32 | - Node.js version: 33 | - vue-element-admin version: 34 | -------------------------------------------------------------------------------- /m-blog-admin/.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature Request(新功能建议) 3 | about: Suggest an idea for this project 4 | --- 5 | 6 | ## Feature request(新功能建议) 7 | 8 | -------------------------------------------------------------------------------- /m-blog-admin/.github/ISSUE_TEMPLATE/question.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Question(提问) 3 | about: Asking questions about use 4 | --- 5 | 6 | ## Question(提问) 7 | 8 | 15 | 16 | #### Steps to reproduce(问题复现步骤) 17 | 22 | 23 | #### Screenshot or Gif(截图或动态图) 24 | 25 | 26 | #### Link to minimal reproduction(最小可在线还原demo) 27 | 28 | 31 | 32 | #### Other relevant information(格外信息) 33 | - Your OS: 34 | - Node.js version: 35 | - vue-element-admin version: 36 | -------------------------------------------------------------------------------- /m-blog-admin/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | **/*.log 8 | 9 | tests/**/coverage/ 10 | tests/e2e/reports 11 | selenium-debug.log 12 | 13 | # Editor directories and files 14 | .idea 15 | .vscode 16 | *.suo 17 | *.ntvs* 18 | *.njsproj 19 | *.sln 20 | *.local 21 | 22 | package-lock.json 23 | yarn.lock 24 | -------------------------------------------------------------------------------- /m-blog-admin/.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 10 3 | script: npm run test 4 | notifications: 5 | email: false 6 | -------------------------------------------------------------------------------- /m-blog-admin/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017-present PanJiaChen 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 | -------------------------------------------------------------------------------- /m-blog-admin/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | // https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app 4 | '@vue/cli-plugin-babel/preset' 5 | ], 6 | 'env': { 7 | 'development': { 8 | // babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require(). 9 | // This plugin can significantly increase the speed of hot updates, when you have a large number of pages. 10 | // https://panjiachen.github.io/vue-element-admin-site/guide/advanced/lazy-loading.html 11 | 'plugins': ['dynamic-import-node'] 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /m-blog-admin/build/index.js: -------------------------------------------------------------------------------- 1 | const { run } = require('runjs') 2 | const chalk = require('chalk') 3 | const config = require('../vue.config.js') 4 | const rawArgv = process.argv.slice(2) 5 | const args = rawArgv.join(' ') 6 | 7 | if (process.env.npm_config_preview || rawArgv.includes('--preview')) { 8 | const report = rawArgv.includes('--report') 9 | 10 | run(`vue-cli-service build ${args}`) 11 | 12 | const port = 9526 13 | const publicPath = config.publicPath 14 | 15 | var connect = require('connect') 16 | var serveStatic = require('serve-static') 17 | const app = connect() 18 | 19 | app.use( 20 | publicPath, 21 | serveStatic('./dist', { 22 | index: ['index.html', '/'] 23 | }) 24 | ) 25 | 26 | app.listen(port, function () { 27 | console.log(chalk.green(`> Preview at http://localhost:${port}${publicPath}`)) 28 | if (report) { 29 | console.log(chalk.green(`> Report at http://localhost:${port}${publicPath}report.html`)) 30 | } 31 | 32 | }) 33 | } else { 34 | run(`vue-cli-service build ${args}`) 35 | } 36 | -------------------------------------------------------------------------------- /m-blog-admin/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | moduleFileExtensions: ['js', 'jsx', 'json', 'vue'], 3 | transform: { 4 | '^.+\\.vue$': 'vue-jest', 5 | '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 6 | 'jest-transform-stub', 7 | '^.+\\.jsx?$': 'babel-jest' 8 | }, 9 | moduleNameMapper: { 10 | '^@/(.*)$': '/src/$1' 11 | }, 12 | snapshotSerializers: ['jest-serializer-vue'], 13 | testMatch: [ 14 | '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)' 15 | ], 16 | collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'], 17 | coverageDirectory: '/tests/unit/coverage', 18 | // 'collectCoverage': true, 19 | 'coverageReporters': [ 20 | 'lcov', 21 | 'text-summary' 22 | ], 23 | testURL: 'http://localhost/' 24 | } 25 | -------------------------------------------------------------------------------- /m-blog-admin/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": "./", 4 | "paths": { 5 | "@/*": ["src/*"] 6 | } 7 | }, 8 | "exclude": ["node_modules", "dist"] 9 | } -------------------------------------------------------------------------------- /m-blog-admin/plop-templates/component/index.hbs: -------------------------------------------------------------------------------- 1 | {{#if template}} 2 | 5 | {{/if}} 6 | 7 | {{#if script}} 8 | 20 | {{/if}} 21 | 22 | {{#if style}} 23 | 26 | {{/if}} 27 | -------------------------------------------------------------------------------- /m-blog-admin/plop-templates/store/index.hbs: -------------------------------------------------------------------------------- 1 | {{#if state}} 2 | const state = {} 3 | {{/if}} 4 | 5 | {{#if mutations}} 6 | const mutations = {} 7 | {{/if}} 8 | 9 | {{#if actions}} 10 | const actions = {} 11 | {{/if}} 12 | 13 | export default { 14 | namespaced: true, 15 | {{options}} 16 | } 17 | -------------------------------------------------------------------------------- /m-blog-admin/plop-templates/utils.js: -------------------------------------------------------------------------------- 1 | exports.notEmpty = name => v => 2 | !v || v.trim() === '' ? `${name} is required` : true 3 | -------------------------------------------------------------------------------- /m-blog-admin/plop-templates/view/index.hbs: -------------------------------------------------------------------------------- 1 | {{#if template}} 2 | 5 | {{/if}} 6 | 7 | {{#if script}} 8 | 20 | {{/if}} 21 | 22 | {{#if style}} 23 | 26 | {{/if}} 27 | -------------------------------------------------------------------------------- /m-blog-admin/plopfile.js: -------------------------------------------------------------------------------- 1 | const viewGenerator = require('./plop-templates/view/prompt') 2 | const componentGenerator = require('./plop-templates/component/prompt') 3 | const storeGenerator = require('./plop-templates/store/prompt.js') 4 | 5 | module.exports = function(plop) { 6 | plop.setGenerator('view', viewGenerator) 7 | plop.setGenerator('component', componentGenerator) 8 | plop.setGenerator('store', storeGenerator) 9 | } 10 | -------------------------------------------------------------------------------- /m-blog-admin/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {} 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /m-blog-admin/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/m-blog-admin/public/favicon.ico -------------------------------------------------------------------------------- /m-blog-admin/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <%= webpackConfig.name %> 10 | 11 | 12 |
13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /m-blog-admin/src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /m-blog-admin/src/api/category.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 分页查询分类数据 4 | export function selectCateList(queryInfo){ 5 | return request({ 6 | url: '/api/getCateList', 7 | methods: 'get', 8 | params: { 9 | pageNum: queryInfo.pageNum, 10 | pageSize: queryInfo.pageSize, 11 | keywords: queryInfo.keywords 12 | } 13 | }) 14 | } 15 | 16 | // 查询分类信息 17 | export function selectCateSearch(keywords){ 18 | return request({ 19 | url: '/api/searchCateList', 20 | method: 'get', 21 | params:{ 22 | keywords: keywords 23 | } 24 | }) 25 | } 26 | 27 | // 查询所有分类信息 28 | export function selectAllCate(){ 29 | return request({ 30 | url: '/api/getAllCateList', 31 | method: 'get' 32 | }) 33 | } 34 | 35 | // 添加一个分类信息 36 | export function addCategory(cateName) { 37 | return request({ 38 | url: `/api/addCategory/${cateName}`, 39 | method: 'post' 40 | }) 41 | } 42 | 43 | // 批量删除分类信息 44 | export function deleteCate(cateIdList){ 45 | return request({ 46 | url: '/api/deleteCate', 47 | method: 'post', 48 | data: cateIdList 49 | }) 50 | } 51 | -------------------------------------------------------------------------------- /m-blog-admin/src/api/friendLink.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询友链列表 4 | export function getLinkList(queryInfo){ 5 | return request({ 6 | url: '/api/admin/links', 7 | method: 'get', 8 | params: queryInfo 9 | }) 10 | } 11 | 12 | // 添加或修改友链 13 | export function saveOrUpdateLink(link){ 14 | return request({ 15 | url: '/api/admin/links', 16 | method: 'post', 17 | data: link 18 | }) 19 | } 20 | 21 | // 删除友链 22 | export function deleteLink(linkIdList){ 23 | console.log(linkIdList); 24 | return request({ 25 | url: '/api/admin/links', 26 | method: 'delete', 27 | data: linkIdList 28 | }) 29 | } 30 | 31 | -------------------------------------------------------------------------------- /m-blog-admin/src/api/log.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询日志列表 4 | export function logList(queryInfo) { 5 | return request({ 6 | url: '/api/admin/logs', 7 | method: 'get', 8 | params: queryInfo 9 | }) 10 | } 11 | 12 | // 删除日志列表 13 | export function delLogList(logIdList){ 14 | return request({ 15 | url: '/api/admin/logs', 16 | method: 'delete', 17 | data: logIdList 18 | }) 19 | } 20 | -------------------------------------------------------------------------------- /m-blog-admin/src/api/qiniu.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function getToken() { 4 | return request({ 5 | url: '/qiniu/upload/token', // 假地址 自行替换 6 | method: 'get' 7 | }) 8 | } 9 | -------------------------------------------------------------------------------- /m-blog-admin/src/api/remote-search.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function searchUser(name) { 4 | return request({ 5 | url: '/vue-element-admin/search/user', 6 | method: 'get', 7 | params: { name } 8 | }) 9 | } 10 | 11 | export function transactionList(query) { 12 | return request({ 13 | url: '/vue-element-admin/transaction/list', 14 | method: 'get', 15 | params: query 16 | }) 17 | } 18 | -------------------------------------------------------------------------------- /m-blog-admin/src/api/role.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function getRoutes() { 4 | return request({ 5 | url: '/vue-element-admin/routes', 6 | method: 'get' 7 | }) 8 | } 9 | 10 | export function getRoles() { 11 | return request({ 12 | url: '/vue-element-admin/roles', 13 | method: 'get' 14 | }) 15 | } 16 | 17 | export function addRole(data) { 18 | return request({ 19 | url: '/vue-element-admin/role', 20 | method: 'post', 21 | data 22 | }) 23 | } 24 | 25 | export function updateRole(id, data) { 26 | return request({ 27 | url: `/vue-element-admin/role/${id}`, 28 | method: 'put', 29 | data 30 | }) 31 | } 32 | 33 | export function deleteRole(id) { 34 | return request({ 35 | url: `/vue-element-admin/role/${id}`, 36 | method: 'delete' 37 | }) 38 | } 39 | -------------------------------------------------------------------------------- /m-blog-admin/src/api/talk.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | /** 4 | * 保存或者修改说说 5 | */ 6 | export function saveOrUpdateTalk(talk) { 7 | return request({ 8 | url: '/api/saveOrUpdate', 9 | method: 'post', 10 | data: talk 11 | }) 12 | } 13 | 14 | /** 15 | * 查询后台说说列表 16 | */ 17 | export function talkList(queryInfo){ 18 | return request({ 19 | url: '/api/admin/talks', 20 | method: 'get', 21 | params: queryInfo 22 | }) 23 | } 24 | 25 | /** 26 | * 通过id查询后台说说 27 | */ 28 | export function getTalkById(talkId){ 29 | return request({ 30 | url: `/api/admin/talks/${talkId}`, 31 | method: 'get' 32 | }) 33 | } 34 | 35 | /** 36 | * 删除说说 37 | */ 38 | export function delTalks(talkIdList){ 39 | return request({ 40 | url: '/api/admin/talks', 41 | method: 'delete', 42 | data: talkIdList 43 | }) 44 | } 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /m-blog-admin/src/assets/401_images/401.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/m-blog-admin/src/assets/401_images/401.gif -------------------------------------------------------------------------------- /m-blog-admin/src/assets/404_images/404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/m-blog-admin/src/assets/404_images/404.png -------------------------------------------------------------------------------- /m-blog-admin/src/assets/404_images/404_cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/m-blog-admin/src/assets/404_images/404_cloud.png -------------------------------------------------------------------------------- /m-blog-admin/src/assets/css/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/m-blog-admin/src/assets/css/iconfont.eot -------------------------------------------------------------------------------- /m-blog-admin/src/assets/css/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/m-blog-admin/src/assets/css/iconfont.ttf -------------------------------------------------------------------------------- /m-blog-admin/src/assets/css/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/m-blog-admin/src/assets/css/iconfont.woff -------------------------------------------------------------------------------- /m-blog-admin/src/assets/css/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/m-blog-admin/src/assets/css/iconfont.woff2 -------------------------------------------------------------------------------- /m-blog-admin/src/assets/custom-theme/fonts/element-icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/m-blog-admin/src/assets/custom-theme/fonts/element-icons.ttf -------------------------------------------------------------------------------- /m-blog-admin/src/assets/custom-theme/fonts/element-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/m-blog-admin/src/assets/custom-theme/fonts/element-icons.woff -------------------------------------------------------------------------------- /m-blog-admin/src/assets/js/global.js: -------------------------------------------------------------------------------- 1 | import moment from "moment"; 2 | 3 | export default{ 4 | UPLOAD_FILE_MAX_SIZE: 1, // 上传文件最大大小,单位MB 5 | UPLOAD_FILE_SIZE: 200, // 压缩文件之后的大小,单位KB 6 | // 小文件(图标大小) 7 | UPLOAD_SMALL_FILE_SIZE: 50, // 压缩更小的格式 8 | // 默认头像路径 9 | DEFAULT_AVATAR_URL: 'http://www.static.mingzib.xyz/blogGetDefaultFile/defaultAvatar.jpg', 10 | // 默认文章封面路径 11 | DEFAULT_COVER_URL: 'http://www.static.mingzib.xyz/blogGetDefaultFile/deafaultArticleCover.png', 12 | 13 | // 前台路径 14 | // RECEPTION_URL: 'http://localhost:8081/', 15 | RECEPTION_URL: 'http://www.mingzib.xyz/', 16 | 17 | // 时间格式化 18 | dateFormat(row, column) { 19 | var date = row[column.property]; 20 | if (date === undefined) { 21 | return ""; 22 | } 23 | //修改时间格式 我要修改的是"YYYY-MM-DD" 24 | return moment(date).format("YYYY-MM-DD HH:mm"); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /m-blog-admin/src/components/ImageCropper/utils/data2blob.js: -------------------------------------------------------------------------------- 1 | /** 2 | * database64文件格式转换为2进制 3 | * 4 | * @param {[String]} data dataURL 的格式为 “data:image/png;base64,****”,逗号之前都是一些说明性的文字,我们只需要逗号之后的就行了 5 | * @param {[String]} mime [description] 6 | * @return {[blob]} [description] 7 | */ 8 | export default function(data, mime) { 9 | data = data.split(',')[1] 10 | data = window.atob(data) 11 | var ia = new Uint8Array(data.length) 12 | for (var i = 0; i < data.length; i++) { 13 | ia[i] = data.charCodeAt(i) 14 | } 15 | // canvas.toDataURL 返回的默认格式就是 image/png 16 | return new Blob([ia], { 17 | type: mime 18 | }) 19 | } 20 | -------------------------------------------------------------------------------- /m-blog-admin/src/components/ImageCropper/utils/mimes.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'jpg': 'image/jpeg', 3 | 'png': 'image/png', 4 | 'gif': 'image/gif', 5 | 'svg': 'image/svg+xml', 6 | 'psd': 'image/photoshop' 7 | } 8 | -------------------------------------------------------------------------------- /m-blog-admin/src/components/MarkdownEditor/default-options.js: -------------------------------------------------------------------------------- 1 | // doc: https://nhnent.github.io/tui.editor/api/latest/ToastUIEditor.html#ToastUIEditor 2 | export default { 3 | minHeight: '200px', 4 | previewStyle: 'vertical', 5 | useCommandShortcut: true, 6 | useDefaultHTMLSanitizer: true, 7 | usageStatistics: false, 8 | hideModeSwitch: false, 9 | toolbarItems: [ 10 | 'heading', 11 | 'bold', 12 | 'italic', 13 | 'strike', 14 | 'divider', 15 | 'hr', 16 | 'quote', 17 | 'divider', 18 | 'ul', 19 | 'ol', 20 | 'task', 21 | 'indent', 22 | 'outdent', 23 | 'divider', 24 | 'table', 25 | 'image', 26 | 'link', 27 | 'divider', 28 | 'code', 29 | 'codeblock' 30 | ] 31 | } 32 | -------------------------------------------------------------------------------- /m-blog-admin/src/components/Tinymce/plugins.js: -------------------------------------------------------------------------------- 1 | // Any plugins you want to use has to be imported 2 | // Detail plugins list see https://www.tinymce.com/docs/plugins/ 3 | // Custom builds see https://www.tinymce.com/download/custom-builds/ 4 | 5 | const plugins = ['advlist anchor autolink autosave code codesample colorpicker colorpicker contextmenu directionality emoticons fullscreen hr image imagetools insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textcolor textpattern visualblocks visualchars wordcount'] 6 | 7 | export default plugins 8 | -------------------------------------------------------------------------------- /m-blog-admin/src/components/Tinymce/toolbar.js: -------------------------------------------------------------------------------- 1 | // Here is a list of the toolbar 2 | // Detail list see https://www.tinymce.com/docs/advanced/editor-control-identifiers/#toolbarcontrols 3 | 4 | const toolbar = ['searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent blockquote undo redo removeformat subscript superscript code codesample', 'hr bullist numlist link image charmap preview anchor pagebreak insertdatetime media table emoticons forecolor backcolor fullscreen'] 5 | 6 | export default toolbar 7 | -------------------------------------------------------------------------------- /m-blog-admin/src/directive/clipboard/index.js: -------------------------------------------------------------------------------- 1 | import Clipboard from './clipboard' 2 | 3 | const install = function(Vue) { 4 | Vue.directive('Clipboard', Clipboard) 5 | } 6 | 7 | if (window.Vue) { 8 | window.clipboard = Clipboard 9 | Vue.use(install); // eslint-disable-line 10 | } 11 | 12 | Clipboard.install = install 13 | export default Clipboard 14 | -------------------------------------------------------------------------------- /m-blog-admin/src/directive/el-drag-dialog/index.js: -------------------------------------------------------------------------------- 1 | import drag from './drag' 2 | 3 | const install = function(Vue) { 4 | Vue.directive('el-drag-dialog', drag) 5 | } 6 | 7 | if (window.Vue) { 8 | window['el-drag-dialog'] = drag 9 | Vue.use(install); // eslint-disable-line 10 | } 11 | 12 | drag.install = install 13 | export default drag 14 | -------------------------------------------------------------------------------- /m-blog-admin/src/directive/el-table/index.js: -------------------------------------------------------------------------------- 1 | import adaptive from './adaptive' 2 | 3 | const install = function(Vue) { 4 | Vue.directive('el-height-adaptive-table', adaptive) 5 | } 6 | 7 | if (window.Vue) { 8 | window['el-height-adaptive-table'] = adaptive 9 | Vue.use(install); // eslint-disable-line 10 | } 11 | 12 | adaptive.install = install 13 | export default adaptive 14 | -------------------------------------------------------------------------------- /m-blog-admin/src/directive/permission/index.js: -------------------------------------------------------------------------------- 1 | import permission from './permission' 2 | 3 | const install = function(Vue) { 4 | Vue.directive('permission', permission) 5 | } 6 | 7 | if (window.Vue) { 8 | window['permission'] = permission 9 | Vue.use(install); // eslint-disable-line 10 | } 11 | 12 | permission.install = install 13 | export default permission 14 | -------------------------------------------------------------------------------- /m-blog-admin/src/directive/permission/permission.js: -------------------------------------------------------------------------------- 1 | import store from '@/store' 2 | 3 | function checkPermission(el, binding) { 4 | const { value } = binding 5 | const roles = store.getters && store.getters.roles 6 | 7 | if (value && value instanceof Array) { 8 | if (value.length > 0) { 9 | const permissionRoles = value 10 | 11 | const hasPermission = roles.some(role => { 12 | return permissionRoles.includes(role) 13 | }) 14 | 15 | if (!hasPermission) { 16 | el.parentNode && el.parentNode.removeChild(el) 17 | } 18 | } 19 | } else { 20 | throw new Error(`need roles! Like v-permission="['admin','editor']"`) 21 | } 22 | } 23 | 24 | export default { 25 | inserted(el, binding) { 26 | checkPermission(el, binding) 27 | }, 28 | update(el, binding) { 29 | checkPermission(el, binding) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /m-blog-admin/src/directive/waves/index.js: -------------------------------------------------------------------------------- 1 | import waves from './waves' 2 | 3 | const install = function(Vue) { 4 | Vue.directive('waves', waves) 5 | } 6 | 7 | if (window.Vue) { 8 | window.waves = waves 9 | Vue.use(install); // eslint-disable-line 10 | } 11 | 12 | waves.install = install 13 | export default waves 14 | -------------------------------------------------------------------------------- /m-blog-admin/src/directive/waves/waves.css: -------------------------------------------------------------------------------- 1 | .waves-ripple { 2 | position: absolute; 3 | border-radius: 100%; 4 | background-color: rgba(0, 0, 0, 0.15); 5 | background-clip: padding-box; 6 | pointer-events: none; 7 | -webkit-user-select: none; 8 | -moz-user-select: none; 9 | -ms-user-select: none; 10 | user-select: none; 11 | -webkit-transform: scale(0); 12 | -ms-transform: scale(0); 13 | transform: scale(0); 14 | opacity: 1; 15 | } 16 | 17 | .waves-ripple.z-active { 18 | opacity: 0; 19 | -webkit-transform: scale(2); 20 | -ms-transform: scale(2); 21 | transform: scale(2); 22 | -webkit-transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out; 23 | transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out; 24 | transition: opacity 1.2s ease-out, transform 0.6s ease-out; 25 | transition: opacity 1.2s ease-out, transform 0.6s ease-out, -webkit-transform 0.6s ease-out; 26 | } -------------------------------------------------------------------------------- /m-blog-admin/src/icons/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import SvgIcon from '@/components/SvgIcon'// svg component 3 | 4 | // register globally 5 | Vue.component('svg-icon', SvgIcon) 6 | 7 | const req = require.context('./svg', false, /\.svg$/) 8 | const requireAll = requireContext => requireContext.keys().map(requireContext) 9 | requireAll(req) 10 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/chart.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/clipboard.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/component.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/documentation.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/drag.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/edit.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/education.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/email.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/example.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/excel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/eye.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/fullscreen.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/guide.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/international.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/link.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/list.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/lock.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/message.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/money.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/nested.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/password.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/peoples.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/search.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/setup.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/size.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/star.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/tab.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/table.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/theme.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/tree-table.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svg/user.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m-blog-admin/src/icons/svgo.yml: -------------------------------------------------------------------------------- 1 | # replace default config 2 | 3 | # multipass: true 4 | # full: true 5 | 6 | plugins: 7 | 8 | # - name 9 | # 10 | # or: 11 | # - name: false 12 | # - name: true 13 | # 14 | # or: 15 | # - name: 16 | # param1: 1 17 | # param2: 2 18 | 19 | - removeAttrs: 20 | attrs: 21 | - 'fill' 22 | - 'fill-rule' 23 | -------------------------------------------------------------------------------- /m-blog-admin/src/layout/components/Sidebar/FixiOSBug.js: -------------------------------------------------------------------------------- 1 | export default { 2 | computed: { 3 | device() { 4 | return this.$store.state.app.device 5 | } 6 | }, 7 | mounted() { 8 | // In order to fix the click on menu on the ios device will trigger the mouseleave bug 9 | // https://github.com/PanJiaChen/vue-element-admin/issues/1135 10 | this.fixBugIniOS() 11 | }, 12 | methods: { 13 | fixBugIniOS() { 14 | const $subMenu = this.$refs.subMenu 15 | if ($subMenu) { 16 | const handleMouseleave = $subMenu.handleMouseleave 17 | $subMenu.handleMouseleave = (e) => { 18 | if (this.device === 'mobile') { 19 | return 20 | } 21 | handleMouseleave(e) 22 | } 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /m-blog-admin/src/layout/components/Sidebar/Item.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | 42 | -------------------------------------------------------------------------------- /m-blog-admin/src/layout/components/Sidebar/Link.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 44 | -------------------------------------------------------------------------------- /m-blog-admin/src/layout/components/index.js: -------------------------------------------------------------------------------- 1 | export { default as AppMain } from './AppMain' 2 | export { default as Navbar } from './Navbar' 3 | export { default as Settings } from './Settings' 4 | export { default as Sidebar } from './Sidebar/index.vue' 5 | export { default as TagsView } from './TagsView/index.vue' 6 | -------------------------------------------------------------------------------- /m-blog-admin/src/plugins/vuetify.js: -------------------------------------------------------------------------------- 1 | // src/plugins/vuetify.js 2 | 3 | import Vue from 'vue' 4 | import Vuetify from 'vuetify' 5 | import 'vuetify/dist/vuetify.min.css' 6 | 7 | Vue.use(Vuetify) 8 | 9 | const opts = {} 10 | 11 | export default new Vuetify(opts) 12 | -------------------------------------------------------------------------------- /m-blog-admin/src/router/modules/article.js: -------------------------------------------------------------------------------- 1 | import Layout from '@/layout' 2 | 3 | const articleRouter = { 4 | path: '/article', 5 | component: Layout, 6 | name: 'article', 7 | meta:{ 8 | title:'文章管理', 9 | icon:'form' 10 | }, 11 | children:[ 12 | // 发布文章 13 | { 14 | path: 'addArticle', 15 | component: () => import('@/views/article/AddArticle'), 16 | name: 'addArticle', 17 | meta: { 18 | title: '发布文章' 19 | } 20 | }, 21 | // 文章管理 22 | { 23 | path: 'articles', 24 | component: () => import('@/views/article/ArticleList'), 25 | name: 'articles', 26 | meta: { 27 | title: '文章管理' 28 | } 29 | }, 30 | // 分类管理 31 | { 32 | path: 'category', 33 | component: () => import('@/views/article/CateGory'), 34 | name: 'category', 35 | meta: { 36 | title: '分类管理' 37 | } 38 | }, 39 | // 标签管理 40 | { 41 | path: 'tag', 42 | component: () => import('@/views/article/Tag'), 43 | name: 'tag', 44 | meta: { 45 | title: '标签管理' 46 | } 47 | } 48 | ] 49 | } 50 | 51 | export default articleRouter 52 | -------------------------------------------------------------------------------- /m-blog-admin/src/router/modules/charts.js: -------------------------------------------------------------------------------- 1 | /** When your routing table is too long, you can split it into small modules**/ 2 | 3 | import Layout from '@/layout' 4 | 5 | const chartsRouter = { 6 | path: '/charts', 7 | component: Layout, 8 | redirect: 'noRedirect', 9 | name: 'Charts', 10 | meta: { 11 | title: '图表', 12 | icon: 'chart' 13 | }, 14 | children: [ 15 | { 16 | path: 'keyboard', 17 | component: () => import('@/views/charts/keyboard'), 18 | name: 'KeyboardChart', 19 | meta: { title: '键盘图表', noCache: true } 20 | }, 21 | { 22 | path: 'line', 23 | component: () => import('@/views/charts/line'), 24 | name: 'LineChart', 25 | meta: { title: '折线图', noCache: true } 26 | }, 27 | { 28 | path: 'mix-chart', 29 | component: () => import('@/views/charts/mix-chart'), 30 | name: 'MixChart', 31 | meta: { title: '混合图表', noCache: true } 32 | } 33 | ] 34 | } 35 | 36 | export default chartsRouter 37 | -------------------------------------------------------------------------------- /m-blog-admin/src/router/modules/friendLink.js: -------------------------------------------------------------------------------- 1 | import Layout from '@/layout' 2 | 3 | const articleRouter = { 4 | path: '/friendLink', 5 | component: Layout, 6 | name: 'friendLink', 7 | meta:{ 8 | title:'友链管理', 9 | icon:'friend-link' 10 | }, 11 | children:[ 12 | // 友链管理 13 | { 14 | path: '', 15 | component: () => import('@/views/friendLink/FriendLink'), 16 | name: 'friendLink', 17 | meta: { 18 | title: '友链管理' 19 | } 20 | } 21 | ] 22 | } 23 | 24 | export default articleRouter 25 | -------------------------------------------------------------------------------- /m-blog-admin/src/router/modules/log.js: -------------------------------------------------------------------------------- 1 | import Layout from '@/layout' 2 | 3 | const logRouter = { 4 | path: '/log', 5 | name: 'Log', 6 | component: Layout, 7 | meta:{ 8 | title: '日志管理', 9 | icon: 'message' 10 | }, 11 | children:[ 12 | { 13 | path: "log", 14 | component: () => import('@/views/log/Operation'), 15 | name: '日志管理', 16 | meta: { 17 | title: '日志管理' 18 | } 19 | } 20 | ] 21 | 22 | } 23 | 24 | export default logRouter 25 | -------------------------------------------------------------------------------- /m-blog-admin/src/router/modules/message.js: -------------------------------------------------------------------------------- 1 | import Layout from '@/layout' 2 | 3 | const messageRouter = { 4 | path: '/message', 5 | name: 'Message', 6 | component: Layout, 7 | meta:{ 8 | title: '消息管理', 9 | icon: 'message' 10 | }, 11 | children:[ 12 | { 13 | path: "comment", 14 | component: () => import('@/views/message/Comment'), 15 | name: 'comment', 16 | meta: { 17 | title: '评论管理' 18 | } 19 | }, 20 | { 21 | path: "message", 22 | component:() => import('@/views/message/Message'), 23 | name: 'message', 24 | meta: { 25 | title: '留言管理' 26 | } 27 | } 28 | ] 29 | 30 | } 31 | 32 | export default messageRouter 33 | -------------------------------------------------------------------------------- /m-blog-admin/src/router/modules/talk.js: -------------------------------------------------------------------------------- 1 | import Layout from '@/layout' 2 | 3 | const talkRouter = { 4 | path: '/talk', 5 | component: Layout, 6 | name: 'Talk', 7 | meta:{ 8 | title:'说说管理', 9 | icon:'edit' 10 | }, 11 | children:[ 12 | { 13 | path: 'talkList', 14 | component: ()=> import('@/views/talk/TalkList'), 15 | name: 'talkList', 16 | meta:{ 17 | title:'说说列表' 18 | } 19 | }, 20 | { 21 | path: '', 22 | component: ()=> import('@/views/talk/Talk'), 23 | name: 'talk', 24 | meta: { 25 | title: '写说说' 26 | } 27 | } 28 | ] 29 | } 30 | 31 | export default talkRouter 32 | -------------------------------------------------------------------------------- /m-blog-admin/src/router/modules/users.js: -------------------------------------------------------------------------------- 1 | import Layout from '@/layout' 2 | 3 | const userRouter = { 4 | path: '/users', 5 | component: Layout, 6 | name: 'Users', 7 | meta:{ 8 | title:'用户管理', 9 | icon:'user' 10 | }, 11 | children:[ 12 | { 13 | path: 'userList', 14 | component: ()=> import('@/views/users/UserList'), 15 | name: 'userList', 16 | meta:{ 17 | title:'用户列表' 18 | } 19 | }, 20 | { 21 | path: 'onLine', 22 | component: ()=> import('@/views/users/Online'), 23 | name: 'onLine', 24 | meta: { 25 | title: '在线用户' 26 | } 27 | } 28 | ] 29 | } 30 | 31 | export default userRouter 32 | -------------------------------------------------------------------------------- /m-blog-admin/src/router/modules/website.js: -------------------------------------------------------------------------------- 1 | import Layout from '@/layout' 2 | 3 | const userRouter = { 4 | path: '/website', 5 | component: Layout, 6 | name: 'Website', 7 | meta:{ 8 | title:'系统管理', 9 | icon:'setup' 10 | }, 11 | children:[ 12 | { 13 | path: '/websiteManage', 14 | component: ()=> import('@/views/website/Website'), 15 | name: 'website', 16 | meta:{ 17 | title:'网站管理', 18 | icon: 'website' 19 | } 20 | }, 21 | { 22 | path: '/page', 23 | component: ()=> import('@/views/website/Page'), 24 | name: 'page', 25 | meta: { 26 | title: '页面管理', 27 | icon: 'website' 28 | } 29 | } 30 | ] 31 | } 32 | 33 | export default userRouter 34 | -------------------------------------------------------------------------------- /m-blog-admin/src/settings.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | title: 'Vue Element Admin', 3 | 4 | /** 5 | * @type {boolean} true | false 6 | * @description Whether show the settings right-panel 7 | */ 8 | showSettings: true, 9 | 10 | /** 11 | * @type {boolean} true | false 12 | * @description Whether need tagsView 13 | */ 14 | tagsView: true, 15 | 16 | /** 17 | * @type {boolean} true | false 18 | * @description Whether fix the header 19 | */ 20 | fixedHeader: false, 21 | 22 | /** 23 | * @type {boolean} true | false 24 | * @description Whether show the logo in sidebar 25 | */ 26 | sidebarLogo: false, 27 | 28 | /** 29 | * @type {string | array} 'production' | ['production', 'development'] 30 | * @description Need show err logs component. 31 | * The default is only used in the production env 32 | * If you want to also use it in dev, you can pass ['production', 'development'] 33 | */ 34 | errorLog: 'production' 35 | } 36 | -------------------------------------------------------------------------------- /m-blog-admin/src/store/getters.js: -------------------------------------------------------------------------------- 1 | const getters = { 2 | sidebar: state => state.app.sidebar, 3 | size: state => state.app.size, 4 | device: state => state.app.device, 5 | visitedViews: state => state.tagsView.visitedViews, 6 | cachedViews: state => state.tagsView.cachedViews, 7 | token: state => state.user.token, 8 | avatar: state => state.user.avatar, 9 | name: state => state.user.name, 10 | introduction: state => state.user.introduction, 11 | roles: state => state.user.roles, 12 | permission_routes: state => state.permission.routes, 13 | errorLogs: state => state.errorLog.logs 14 | } 15 | export default getters 16 | -------------------------------------------------------------------------------- /m-blog-admin/src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import getters from './getters' 4 | 5 | Vue.use(Vuex) 6 | 7 | // https://webpack.js.org/guides/dependency-management/#requirecontext 8 | const modulesFiles = require.context('./modules', true, /\.js$/) 9 | 10 | // you do not need `import app from './modules/app'` 11 | // it will auto require all vuex module from modules file 12 | const modules = modulesFiles.keys().reduce((modules, modulePath) => { 13 | // set './app.js' => 'app' 14 | const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1') 15 | const value = modulesFiles(modulePath) 16 | modules[moduleName] = value.default 17 | return modules 18 | }, {}) 19 | 20 | const store = new Vuex.Store({ 21 | modules, 22 | getters 23 | }) 24 | 25 | export default store 26 | -------------------------------------------------------------------------------- /m-blog-admin/src/store/modules/errorLog.js: -------------------------------------------------------------------------------- 1 | const state = { 2 | logs: [] 3 | } 4 | 5 | const mutations = { 6 | ADD_ERROR_LOG: (state, log) => { 7 | state.logs.push(log) 8 | }, 9 | CLEAR_ERROR_LOG: (state) => { 10 | state.logs.splice(0) 11 | } 12 | } 13 | 14 | const actions = { 15 | addErrorLog({ commit }, log) { 16 | commit('ADD_ERROR_LOG', log) 17 | }, 18 | clearErrorLog({ commit }) { 19 | commit('CLEAR_ERROR_LOG') 20 | } 21 | } 22 | 23 | export default { 24 | namespaced: true, 25 | state, 26 | mutations, 27 | actions 28 | } 29 | -------------------------------------------------------------------------------- /m-blog-admin/src/store/modules/friendLink.js: -------------------------------------------------------------------------------- 1 | import { 2 | getLinkList, 3 | saveOrUpdateLink, 4 | deleteLink 5 | } from '@/api/friendLink' 6 | 7 | const state = { 8 | 9 | } 10 | const actions = { 11 | 12 | // 分页查询友链列表 13 | getLinkList(context,queryInfo){ 14 | return new Promise(resolve => { 15 | getLinkList(queryInfo) 16 | .then(res => { 17 | resolve(res); 18 | }) 19 | }) 20 | }, 21 | 22 | // 添加或删除友链 23 | saveOrUpdateLink(context, link){ 24 | return new Promise(resolve => { 25 | saveOrUpdateLink(link) 26 | .then(res => { 27 | resolve(res); 28 | }) 29 | }) 30 | }, 31 | 32 | // 删除友链 33 | deleteLink(context, linkIdList){ 34 | return new Promise(resolve => { 35 | deleteLink(linkIdList) 36 | .then(res => { 37 | resolve(res); 38 | }) 39 | }) 40 | } 41 | 42 | 43 | } 44 | 45 | export default { 46 | namespaced: true, 47 | state, 48 | actions 49 | } 50 | -------------------------------------------------------------------------------- /m-blog-admin/src/store/modules/log.js: -------------------------------------------------------------------------------- 1 | import { 2 | logList, 3 | delLogList 4 | } from "@/api/log"; 5 | 6 | 7 | const state = { 8 | 9 | } 10 | 11 | const actions = { 12 | // 查询日志列表 13 | logList(context,queryInfo){ 14 | return new Promise((resolve => { 15 | logList(queryInfo).then(res => { 16 | resolve(res); 17 | }) 18 | })) 19 | }, 20 | 21 | // 删除日志列表 22 | delLogList(context, logIdList){ 23 | return new Promise(resolve => { 24 | delLogList(logIdList) 25 | .then(res => { 26 | resolve(res); 27 | }) 28 | }) 29 | } 30 | } 31 | 32 | export default { 33 | namespaced: true, 34 | state, 35 | actions 36 | } 37 | -------------------------------------------------------------------------------- /m-blog-admin/src/store/modules/settings.js: -------------------------------------------------------------------------------- 1 | import variables from '@/styles/element-variables.scss' 2 | import defaultSettings from '@/settings' 3 | 4 | const { showSettings, tagsView, fixedHeader, sidebarLogo } = defaultSettings 5 | 6 | const state = { 7 | theme: variables.theme, 8 | showSettings: showSettings, 9 | tagsView: tagsView, 10 | fixedHeader: fixedHeader, 11 | sidebarLogo: sidebarLogo 12 | } 13 | 14 | const mutations = { 15 | CHANGE_SETTING: (state, { key, value }) => { 16 | // eslint-disable-next-line no-prototype-builtins 17 | if (state.hasOwnProperty(key)) { 18 | state[key] = value 19 | } 20 | } 21 | } 22 | 23 | const actions = { 24 | changeSetting({ commit }, data) { 25 | commit('CHANGE_SETTING', data) 26 | } 27 | } 28 | 29 | export default { 30 | namespaced: true, 31 | state, 32 | mutations, 33 | actions 34 | } 35 | 36 | -------------------------------------------------------------------------------- /m-blog-admin/src/store/modules/talk.js: -------------------------------------------------------------------------------- 1 | import { 2 | saveOrUpdateTalk, 3 | talkList, 4 | getTalkById, 5 | delTalks 6 | } from '@/api/talk' 7 | 8 | const state = { 9 | 10 | } 11 | const actions = { 12 | // 添加或修改说说 13 | saveOrUpdateTalk(context, talk) { 14 | return new Promise(resolve => { 15 | saveOrUpdateTalk(talk).then(res => { 16 | resolve(res); 17 | }) 18 | }) 19 | }, 20 | 21 | // 查询说说列表 22 | talkList(context, queryInfo){ 23 | return new Promise(resolve => { 24 | talkList(queryInfo).then(res => { 25 | resolve(res); 26 | }) 27 | }) 28 | }, 29 | 30 | // 通过id查询说说 31 | getTalkById(context, talkId){ 32 | return new Promise(resolve => { 33 | getTalkById(talkId).then(res => { 34 | resolve(res); 35 | }) 36 | }) 37 | }, 38 | 39 | // 删除说说 40 | // 通过id查询说说 41 | delTalks(context, talkIdList){ 42 | return new Promise(resolve => { 43 | delTalks(talkIdList).then(res => { 44 | resolve(res); 45 | }) 46 | }) 47 | }, 48 | 49 | } 50 | 51 | export default { 52 | namespaced: true, 53 | state, 54 | actions 55 | } 56 | -------------------------------------------------------------------------------- /m-blog-admin/src/styles/element-variables.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * 我认为元素element-ui的默认主题颜色对于长期使用来说太浅了。 3 | * 所以我修改了默认颜色,你可以根据自己的喜好修改它。 4 | **/ 5 | 6 | /* theme color */ 7 | $--color-primary: #1890ff; 8 | $--color-success: #13ce66; 9 | $--color-warning: #ffba00; 10 | $--color-danger: #ff4949; 11 | // $--color-info: #1E1E1E; 12 | 13 | $--button-font-weight: 400; 14 | 15 | // $--color-text-regular: #1f2d3d; 16 | 17 | $--border-color-light: #dfe4ed; 18 | $--border-color-lighter: #e6ebf5; 19 | 20 | $--table-border: 1px solid #dfe6ec; 21 | 22 | /* icon font path, required */ 23 | $--font-path: "~element-ui/lib/theme-chalk/fonts"; 24 | 25 | @import "~element-ui/packages/theme-chalk/src/index"; 26 | 27 | // the :export directive is the magic sauce for webpack 28 | // https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass 29 | :export { 30 | theme: $--color-primary; 31 | } 32 | -------------------------------------------------------------------------------- /m-blog-admin/src/styles/transition.scss: -------------------------------------------------------------------------------- 1 | // global transition css 2 | 3 | /* fade */ 4 | .fade-enter-active, 5 | .fade-leave-active { 6 | transition: opacity 0.28s; 7 | } 8 | 9 | .fade-enter, 10 | .fade-leave-active { 11 | opacity: 0; 12 | } 13 | 14 | /* fade-transform */ 15 | .fade-transform-leave-active, 16 | .fade-transform-enter-active { 17 | transition: all .5s; 18 | } 19 | 20 | .fade-transform-enter { 21 | opacity: 0; 22 | transform: translateX(-30px); 23 | } 24 | 25 | .fade-transform-leave-to { 26 | opacity: 0; 27 | transform: translateX(30px); 28 | } 29 | 30 | /* breadcrumb transition */ 31 | .breadcrumb-enter-active, 32 | .breadcrumb-leave-active { 33 | transition: all .5s; 34 | } 35 | 36 | .breadcrumb-enter, 37 | .breadcrumb-leave-active { 38 | opacity: 0; 39 | transform: translateX(20px); 40 | } 41 | 42 | .breadcrumb-move { 43 | transition: all .5s; 44 | } 45 | 46 | .breadcrumb-leave-active { 47 | position: absolute; 48 | } 49 | -------------------------------------------------------------------------------- /m-blog-admin/src/styles/variables.scss: -------------------------------------------------------------------------------- 1 | // base color 2 | $blue:#324157; 3 | $light-blue:#3A71A8; 4 | $red:#C03639; 5 | $pink: #E65D6E; 6 | $green: #30B08F; 7 | $tiffany: #4AB7BD; 8 | $yellow:#FEC171; 9 | $panGreen: #30B08F; 10 | 11 | // sidebar 12 | $menuText:#bfcbd9; 13 | $menuActiveText:#409EFF; 14 | $subMenuActiveText:#f4f4f5; // https://github.com/ElemeFE/element/issues/12951 15 | 16 | $menuBg:#304156; 17 | $menuHover:#263445; 18 | 19 | $subMenuBg:#1f2d3d; 20 | $subMenuHover:#001528; 21 | 22 | $sideBarWidth: 210px; 23 | 24 | // the :export directive is the magic sauce for webpack 25 | // https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass 26 | :export { 27 | menuText: $menuText; 28 | menuActiveText: $menuActiveText; 29 | subMenuActiveText: $subMenuActiveText; 30 | menuBg: $menuBg; 31 | menuHover: $menuHover; 32 | subMenuBg: $subMenuBg; 33 | subMenuHover: $subMenuHover; 34 | sideBarWidth: $sideBarWidth; 35 | } 36 | -------------------------------------------------------------------------------- /m-blog-admin/src/utils/auth.js: -------------------------------------------------------------------------------- 1 | import Cookies from 'js-cookie' 2 | 3 | const TokenKey = 'token' 4 | 5 | export function getToken() { 6 | return Cookies.get(TokenKey) 7 | } 8 | 9 | export function setToken(token) { 10 | return Cookies.set(TokenKey, token) 11 | } 12 | 13 | export function removeToken() { 14 | return Cookies.remove(TokenKey) 15 | } 16 | -------------------------------------------------------------------------------- /m-blog-admin/src/utils/clipboard.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Clipboard from 'clipboard' 3 | 4 | function clipboardSuccess() { 5 | Vue.prototype.$message({ 6 | message: 'Copy successfully', 7 | type: 'success', 8 | duration: 1500 9 | }) 10 | } 11 | 12 | function clipboardError() { 13 | Vue.prototype.$message({ 14 | message: 'Copy failed', 15 | type: 'error' 16 | }) 17 | } 18 | 19 | export default function handleClipboard(text, event) { 20 | const clipboard = new Clipboard(event.target, { 21 | text: () => text 22 | }) 23 | clipboard.on('success', () => { 24 | clipboardSuccess() 25 | clipboard.destroy() 26 | }) 27 | clipboard.on('error', () => { 28 | clipboardError() 29 | clipboard.destroy() 30 | }) 31 | clipboard.onClick(event) 32 | } 33 | -------------------------------------------------------------------------------- /m-blog-admin/src/utils/error-log.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import store from '@/store' 3 | import { isString, isArray } from '@/utils/validate' 4 | import settings from '@/settings' 5 | 6 | // you can set in settings.js 7 | // errorLog:'production' | ['production', 'development'] 8 | const { errorLog: needErrorLog } = settings 9 | 10 | function checkNeed() { 11 | const env = process.env.NODE_ENV 12 | if (isString(needErrorLog)) { 13 | return env === needErrorLog 14 | } 15 | if (isArray(needErrorLog)) { 16 | return needErrorLog.includes(env) 17 | } 18 | return false 19 | } 20 | 21 | if (checkNeed()) { 22 | Vue.config.errorHandler = function(err, vm, info, a) { 23 | // Don't ask me why I use Vue.nextTick, it just a hack. 24 | // detail see https://forum.vuejs.org/t/dispatch-in-vue-config-errorhandler-has-some-problem/23500 25 | Vue.nextTick(() => { 26 | store.dispatch('errorLog/addErrorLog', { 27 | err, 28 | vm, 29 | info, 30 | url: window.location.href 31 | }) 32 | console.error(err, info) 33 | }) 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /m-blog-admin/src/utils/get-page-title.js: -------------------------------------------------------------------------------- 1 | import defaultSettings from '@/settings' 2 | 3 | const title = defaultSettings.title || 'Vue Element Admin' 4 | 5 | export default function getPageTitle(pageTitle) { 6 | if (pageTitle) { 7 | return `${pageTitle} - ${title}` 8 | } 9 | return `${title}` 10 | } 11 | -------------------------------------------------------------------------------- /m-blog-admin/src/utils/permission.js: -------------------------------------------------------------------------------- 1 | import store from '@/store' 2 | 3 | /** 4 | * @param {Array} value 5 | * @returns {Boolean} 6 | * @example see @/views/permission/directive.vue 7 | */ 8 | export default function checkPermission(value) { 9 | if (value && value instanceof Array && value.length > 0) { 10 | const roles = store.getters && store.getters.roles 11 | const permissionRoles = value 12 | 13 | const hasPermission = roles.some(role => { 14 | return permissionRoles.includes(role) 15 | }) 16 | return hasPermission 17 | } else { 18 | console.error(`需要角色! 像 v-permission="['admin','editor']"`) 19 | return false 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /m-blog-admin/src/vendor/Export2Zip.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | import { saveAs } from 'file-saver' 3 | import JSZip from 'jszip' 4 | 5 | export function export_txt_to_zip(th, jsonData, txtName, zipName) { 6 | const zip = new JSZip() 7 | const txt_name = txtName || 'file' 8 | const zip_name = zipName || 'file' 9 | const data = jsonData 10 | let txtData = `${th}\r\n` 11 | data.forEach((row) => { 12 | let tempStr = '' 13 | tempStr = row.toString() 14 | txtData += `${tempStr}\r\n` 15 | }) 16 | zip.file(`${txt_name}.txt`, txtData) 17 | zip.generateAsync({ 18 | type: "blob" 19 | }).then((blob) => { 20 | saveAs(blob, `${zip_name}.zip`) 21 | }, (err) => { 22 | alert('导出失败') 23 | }) 24 | } 25 | -------------------------------------------------------------------------------- /m-blog-admin/src/views/charts/keyboard.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | 16 | 23 | 24 | -------------------------------------------------------------------------------- /m-blog-admin/src/views/charts/line.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | 16 | 23 | 24 | -------------------------------------------------------------------------------- /m-blog-admin/src/views/charts/mix-chart.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | 16 | 23 | 24 | -------------------------------------------------------------------------------- /m-blog-admin/src/views/components-demo/dnd-list.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 39 | 40 | -------------------------------------------------------------------------------- /m-blog-admin/src/views/components-demo/dropzone.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 31 | 32 | -------------------------------------------------------------------------------- /m-blog-admin/src/views/error-log/components/ErrorTestA.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /m-blog-admin/src/views/error-log/components/ErrorTestB.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | -------------------------------------------------------------------------------- /m-blog-admin/src/views/login/auth-redirect.vue: -------------------------------------------------------------------------------- 1 | 16 | -------------------------------------------------------------------------------- /m-blog-admin/src/views/nested/menu1/index.vue: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /m-blog-admin/src/views/nested/menu1/menu1-1/index.vue: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /m-blog-admin/src/views/nested/menu1/menu1-2/index.vue: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /m-blog-admin/src/views/nested/menu1/menu1-2/menu1-2-1/index.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /m-blog-admin/src/views/nested/menu1/menu1-2/menu1-2-2/index.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /m-blog-admin/src/views/nested/menu1/menu1-3/index.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /m-blog-admin/src/views/nested/menu2/index.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /m-blog-admin/src/views/redirect/index.vue: -------------------------------------------------------------------------------- 1 | 13 | -------------------------------------------------------------------------------- /m-blog-admin/src/views/table/dynamic-table/index.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 24 | 25 | -------------------------------------------------------------------------------- /m-blog-admin/tests/unit/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | jest: true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /m-blog-admin/tests/unit/components/Hamburger.spec.js: -------------------------------------------------------------------------------- 1 | import { shallowMount } from '@vue/test-utils' 2 | import Hamburger from '@/components/Hamburger/index.vue' 3 | describe('Hamburger.vue', () => { 4 | it('toggle click', () => { 5 | const wrapper = shallowMount(Hamburger) 6 | const mockFn = jest.fn() 7 | wrapper.vm.$on('toggleClick', mockFn) 8 | wrapper.find('.hamburger').trigger('click') 9 | expect(mockFn).toBeCalled() 10 | }) 11 | it('prop isActive', () => { 12 | const wrapper = shallowMount(Hamburger) 13 | wrapper.setProps({ isActive: true }) 14 | expect(wrapper.contains('.is-active')).toBe(true) 15 | wrapper.setProps({ isActive: false }) 16 | expect(wrapper.contains('.is-active')).toBe(false) 17 | }) 18 | }) 19 | -------------------------------------------------------------------------------- /m-blog-admin/tests/unit/components/SvgIcon.spec.js: -------------------------------------------------------------------------------- 1 | import { shallowMount } from '@vue/test-utils' 2 | import SvgIcon from '@/components/SvgIcon/index.vue' 3 | describe('SvgIcon.vue', () => { 4 | it('iconClass', () => { 5 | const wrapper = shallowMount(SvgIcon, { 6 | propsData: { 7 | iconClass: 'test' 8 | } 9 | }) 10 | expect(wrapper.find('use').attributes().href).toBe('#icon-test') 11 | }) 12 | it('className', () => { 13 | const wrapper = shallowMount(SvgIcon, { 14 | propsData: { 15 | iconClass: 'test' 16 | } 17 | }) 18 | expect(wrapper.classes().length).toBe(1) 19 | wrapper.setProps({ className: 'test' }) 20 | expect(wrapper.classes().includes('test')).toBe(true) 21 | }) 22 | }) 23 | -------------------------------------------------------------------------------- /m-blog-admin/tests/unit/utils/param2Obj.spec.js: -------------------------------------------------------------------------------- 1 | import { param2Obj } from '@/utils/index.js' 2 | describe('Utils:param2Obj', () => { 3 | const url = 'https://github.com/PanJiaChen/vue-element-admin?name=bill&age=29&sex=1&field=dGVzdA==&key=%E6%B5%8B%E8%AF%95' 4 | 5 | it('param2Obj test', () => { 6 | expect(param2Obj(url)).toEqual({ 7 | name: 'bill', 8 | age: '29', 9 | sex: '1', 10 | field: window.btoa('test'), 11 | key: '测试' 12 | }) 13 | }) 14 | }) 15 | -------------------------------------------------------------------------------- /m-blog-admin/vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | lintOnSave: false, 3 | productionSourceMap: false, 4 | devServer: { 5 | proxy: { 6 | "/api": { 7 | target: "http://localhost:8080", 8 | changeOrigin: true, 9 | pathRewrite: { 10 | "^/api": "" 11 | } 12 | } 13 | }, 14 | disableHostCheck: true 15 | }, 16 | // svg图标 17 | chainWebpack(config) { 18 | // set svg-sprite-loader 19 | config.module 20 | .rule('svg') 21 | .exclude.add(resolve('src/icons')) 22 | .end() 23 | config.module 24 | .rule('icons') 25 | .test(/\.svg$/) 26 | .include.add(resolve('src/icons')) 27 | .end() 28 | .use('svg-sprite-loader') 29 | .loader('svg-sprite-loader') 30 | .options({ 31 | symbolId: 'icon-[name]' 32 | }) 33 | .end() 34 | } 35 | 36 | }; 37 | 38 | const path = require("path"); 39 | function resolve(dir) { 40 | return path.join(__dirname, dir); 41 | } 42 | -------------------------------------------------------------------------------- /m-blog-springboot/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/** 5 | !**/src/test/** 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 | 30 | ### VS Code ### 31 | .vscode/ 32 | -------------------------------------------------------------------------------- /m-blog-springboot/.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/m-blog-springboot/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /m-blog-springboot/.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip 2 | wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar 3 | -------------------------------------------------------------------------------- /m-blog-springboot/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM java:8 2 | EXPOSE 8080 3 | 4 | CMD ["--server.port=8080"] 5 | 6 | ADD *.jar /app.jar 7 | 8 | ENTRYPOINT ["java","-jar","/app.jar"] 9 | -------------------------------------------------------------------------------- /m-blog-springboot/README.md: -------------------------------------------------------------------------------- 1 | # 工程简介 2 | 3 | # 延伸阅读 4 | 5 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/MBlogSpringbootApplication.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog; 2 | 3 | import org.mybatis.spring.annotation.MapperScan; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | import org.springframework.context.annotation.Bean; 7 | import org.springframework.scheduling.annotation.EnableAsync; 8 | import org.springframework.scheduling.annotation.EnableScheduling; 9 | import org.springframework.web.client.RestTemplate; 10 | 11 | @MapperScan("com.ming.m_blog.mapper") 12 | // @EnableAsync // 启用异步任务 13 | @EnableScheduling // 开启定时任务 14 | @SpringBootApplication 15 | public class MBlogSpringbootApplication { 16 | 17 | public static void main(String[] args) { 18 | SpringApplication.run(MBlogSpringbootApplication.class, args); 19 | } 20 | 21 | @Bean 22 | public RestTemplate getRestTemplate(){ 23 | return new RestTemplate(); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/annotation/AccessLimit.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target(ElementType.METHOD) 10 | public @interface AccessLimit { 11 | 12 | /** 13 | * 秒数 14 | */ 15 | int seconds(); 16 | 17 | /** 18 | * 指定秒数最大的访问次数 19 | */ 20 | int maxCount(); 21 | 22 | /** 23 | * 提示信息 24 | */ 25 | String message() default "请求过于频繁"; 26 | } 27 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/annotation/OptLog.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.annotation; 2 | 3 | import java.lang.annotation.*; 4 | 5 | /** 6 | * AOP注解实现日志 7 | */ 8 | @Target(ElementType.METHOD) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | @Documented 11 | public @interface OptLog { 12 | 13 | /** 14 | * 操作类型 15 | */ 16 | String optType() default ""; 17 | 18 | } 19 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/config/GithubConfigProperties.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.config; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | @Data 8 | @Configuration 9 | @ConfigurationProperties(prefix = "github") 10 | public class GithubConfigProperties { 11 | 12 | /** 13 | * 客户端id 14 | */ 15 | private String clientId; 16 | 17 | /** 18 | * 客户端密钥 19 | */ 20 | private String clientSecret; 21 | 22 | /** 23 | * 获取token的url 24 | */ 25 | private String getTokenUrl; 26 | 27 | /** 28 | * 获取用户信息的url 29 | */ 30 | private String getUserUrl; 31 | } 32 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/config/MybatisPlusConfig.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.config; 2 | 3 | import com.baomidou.mybatisplus.annotation.DbType; 4 | import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; 5 | import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; 6 | import org.springframework.context.annotation.Bean; 7 | import org.springframework.context.annotation.Configuration; 8 | import org.springframework.transaction.annotation.EnableTransactionManagement; 9 | 10 | /** 11 | * mybatisPlus配置类 12 | */ 13 | @EnableTransactionManagement // 启动事务管理 14 | @Configuration 15 | public class MybatisPlusConfig { 16 | 17 | // 注册分页插件 18 | @Bean 19 | public MybatisPlusInterceptor mybatisPlusInterceptor() { 20 | MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); 21 | interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); 22 | return interceptor; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/config/QQConfigProperties.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.config; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import org.springframework.boot.context.properties.ConfigurationProperties; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | @Data 9 | @Configuration 10 | @ConfigurationProperties(prefix = "qq") 11 | public class QQConfigProperties { 12 | 13 | /** 14 | * 应用APPId 15 | */ 16 | private String appId; 17 | 18 | /** 19 | * 检查token的api 20 | */ 21 | private String checkTokenUrl; 22 | 23 | /** 24 | * 获取登录用户信息的api 25 | */ 26 | private String userInfoUrl; 27 | } 28 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/config/QiniuConfigProperties.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.config; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | @Data 8 | @Configuration 9 | @ConfigurationProperties(prefix = "upload.qiniu") 10 | public class QiniuConfigProperties { 11 | 12 | 13 | /** 14 | * 公钥 15 | */ 16 | private String accessKey; 17 | 18 | /** 19 | * 私钥 20 | */ 21 | private String secretKey; 22 | 23 | /** 24 | * 空间 25 | */ 26 | private String bucket; 27 | 28 | /** 29 | * 域名前缀 30 | */ 31 | private String prefix; 32 | 33 | } 34 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/config/WebSocketConfig.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.web.socket.server.standard.ServerEndpointExporter; 6 | 7 | /** 8 | * websocket配置类 9 | * @author liuziming 10 | * @date 2022/10/15 11 | */ 12 | @Configuration 13 | public class WebSocketConfig { 14 | 15 | /** 16 | * 注入ServerEndpointExporter, 17 | * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint 18 | */ 19 | @Bean 20 | public ServerEndpointExporter serverEndpointExporter(){ 21 | return new ServerEndpointExporter(); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/constant/AuthorityInfoConst.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.constant; 2 | 3 | /** 4 | * 用户权限 5 | */ 6 | public class AuthorityInfoConst { 7 | 8 | /** 9 | * 管理员权限 10 | */ 11 | public static String ADMIN = "sys:admin"; 12 | 13 | /** 14 | * 用户权限 15 | */ 16 | public static String USER = "sys:user"; 17 | 18 | } 19 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/constant/DatabaseTableConst.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.constant; 2 | 3 | /** 4 | * 数据库表名常量 5 | */ 6 | public class DatabaseTableConst { 7 | 8 | /** 9 | * 文章表 10 | */ 11 | public static final String ARTICLE = "article"; 12 | 13 | /** 14 | * 分类表 15 | */ 16 | public static final String CATEGORY = "category"; 17 | 18 | /** 19 | * 标签表 20 | */ 21 | public static final String TAG = "tag"; 22 | 23 | } 24 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/constant/MQPrefixConst.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.constant; 2 | 3 | /** 4 | * mqprefix常量 5 | * mq常量 6 | * 7 | * @author ming 8 | * @date 2021/07/28 9 | */ 10 | public class MQPrefixConst { 11 | 12 | /** 13 | * 邮件交换机 14 | */ 15 | public static final String EMAIL_EXCHANGE = "email_exchange"; 16 | 17 | /** 18 | * 邮件队列 19 | */ 20 | public static final String EMAIL_QUEUE = "email_queue"; 21 | 22 | /** 23 | * maxwell交换机 24 | */ 25 | public static final String MAXWELL_EXCHANGE = "maxwell_exchange"; 26 | 27 | /** 28 | * maxwell通知队列 29 | */ 30 | public static final String MAXWELL_QUEUE = "maxwell_queue"; 31 | 32 | } 33 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/constant/OptTypeConstant.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.constant; 2 | 3 | /** 4 | * 日志类型常量 5 | */ 6 | public class OptTypeConstant { 7 | 8 | /** 9 | * 新增操作 10 | */ 11 | public static final String SAVE_OR_UPDATE = "新增或修改"; 12 | 13 | /** 14 | * 新增 15 | */ 16 | public static final String SAVE = "新增"; 17 | 18 | /** 19 | * 修改操作 20 | */ 21 | public static final String UPDATE = "修改"; 22 | 23 | /** 24 | * 删除操作 25 | */ 26 | public static final String REMOVE = "删除"; 27 | 28 | /** 29 | * 上传操作 30 | */ 31 | public static final String UPLOAD = "上传"; 32 | 33 | } 34 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/constant/PowerConst.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.constant; 2 | 3 | /** 4 | * 权限列表 5 | */ 6 | public class PowerConst { 7 | 8 | /** 9 | * 管理员 10 | */ 11 | public static final String ADMIN = "sys:admin"; 12 | 13 | /** 14 | * 普通用户 15 | */ 16 | public static final String USER = "sys:user"; 17 | 18 | } 19 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/constant/SocialLoginConst.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.constant; 2 | 3 | /** 4 | * 第三方登录常量 5 | */ 6 | public class SocialLoginConst { 7 | 8 | /** 9 | * QQ openId 10 | */ 11 | public static final String QQ_OPEN_ID = "openid"; 12 | 13 | /** 14 | * 访问令牌 15 | */ 16 | public static final String ACCESS_TOKEN = "access_token"; 17 | 18 | /** 19 | * QQ AppId 20 | */ 21 | public static final String OAUTH_CONSUMER_KEY = "oauth_consumer_key"; 22 | 23 | } 24 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/controller/ChatRecordController.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.controller; 2 | 3 | 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | 6 | import org.springframework.web.bind.annotation.RestController; 7 | 8 | /** 9 | *

10 | * 前端控制器 11 | *

12 | * 13 | * @author Ming 14 | * @since 2022-10-16 15 | */ 16 | @RestController 17 | @RequestMapping("/m_blog/chat-record") 18 | public class ChatRecordController { 19 | 20 | } 21 | 22 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/controller/InArticleTagController.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.controller; 2 | 3 | 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | 6 | import org.springframework.web.bind.annotation.RestController; 7 | 8 | /** 9 | *

10 | * 前端控制器 11 | *

12 | * 13 | * @author Ming 14 | * @since 2022-08-12 15 | */ 16 | @RestController 17 | @RequestMapping("/m_blog/in-article-tag") 18 | public class InArticleTagController { 19 | 20 | } 21 | 22 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/controller/InRolePowerController.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.controller; 2 | 3 | 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | 6 | import org.springframework.web.bind.annotation.RestController; 7 | 8 | /** 9 | *

10 | * 前端控制器 11 | *

12 | * 13 | * @author Ming 14 | * @since 2022-07-25 15 | */ 16 | @RestController 17 | @RequestMapping("/m_blog/in-role-power") 18 | public class InRolePowerController { 19 | 20 | } 21 | 22 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/controller/InUserRoleController.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.controller; 2 | 3 | 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | 6 | import org.springframework.web.bind.annotation.RestController; 7 | 8 | /** 9 | *

10 | * 前端控制器 11 | *

12 | * 13 | * @author Ming 14 | * @since 2022-07-25 15 | */ 16 | @RestController 17 | @RequestMapping("/m_blog/in-user-role") 18 | public class InUserRoleController { 19 | 20 | } 21 | 22 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/controller/PowerController.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.controller; 2 | 3 | 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | 6 | import org.springframework.web.bind.annotation.RestController; 7 | 8 | /** 9 | *

10 | * 前端控制器 11 | *

12 | * 13 | * @author Ming 14 | * @since 2022-07-25 15 | */ 16 | @RestController 17 | @RequestMapping("/m_blog/power") 18 | public class PowerController { 19 | 20 | } 21 | 22 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/controller/RoleController.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.controller; 2 | 3 | 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | 6 | import org.springframework.web.bind.annotation.RestController; 7 | 8 | /** 9 | *

10 | * 前端控制器 11 | *

12 | * 13 | * @author Ming 14 | * @since 2022-07-25 15 | */ 16 | @RestController 17 | public class RoleController { 18 | 19 | } 20 | 21 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/controller/UniqueViewController.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.controller; 2 | 3 | 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | 6 | import org.springframework.web.bind.annotation.RestController; 7 | 8 | /** 9 | *

10 | * 前端控制器 11 | *

12 | * 13 | * @author Ming 14 | * @since 2022-11-14 15 | */ 16 | @RestController 17 | @RequestMapping("/m_blog/unique-view") 18 | public class UniqueViewController { 19 | 20 | } 21 | 22 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/EmailSendDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.io.Serializable; 9 | 10 | /** 11 | * 发送邮件DTO 12 | */ 13 | @Data 14 | @Builder 15 | @NoArgsConstructor 16 | @AllArgsConstructor 17 | public class EmailSendDTO implements Serializable { 18 | 19 | /** 20 | * 要发送的email 21 | */ 22 | private String email; 23 | 24 | /** 25 | * 邮件主题 26 | */ 27 | private String subject; 28 | 29 | /** 30 | * 邮件内容 31 | */ 32 | private String content; 33 | 34 | } 35 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/MaxwellDataDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * maxwell监听数据 12 | * 13 | **/ 14 | @Data 15 | @AllArgsConstructor 16 | @NoArgsConstructor 17 | @Builder 18 | public class MaxwellDataDTO { 19 | 20 | /** 21 | * 数据库 22 | */ 23 | private String database; 24 | 25 | /** 26 | * xid 27 | */ 28 | private Integer xid; 29 | 30 | /** 31 | * 数据 32 | */ 33 | private Map data; 34 | 35 | /** 36 | * 是否提交 37 | */ 38 | private Boolean commit; 39 | 40 | /** 41 | * 类型 42 | */ 43 | private String type; 44 | 45 | /** 46 | * 表 47 | */ 48 | private String table; 49 | 50 | /** 51 | * ts 52 | */ 53 | private Integer ts; 54 | 55 | } 56 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/article/ArchiveDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.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 | * 查询文章归档列表 12 | */ 13 | @Data 14 | @Builder 15 | @AllArgsConstructor 16 | @NoArgsConstructor 17 | public class ArchiveDTO { 18 | 19 | /** 20 | * 文章id 21 | */ 22 | private Integer id; 23 | 24 | /** 25 | * 文章标题 26 | */ 27 | private String title; 28 | 29 | /** 30 | * 创建时间 31 | */ 32 | private Date createTime; 33 | 34 | } 35 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/article/ArticlePaginationDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.article; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * 文章上下篇 10 | */ 11 | @Data 12 | @AllArgsConstructor 13 | @NoArgsConstructor 14 | @Builder 15 | public class ArticlePaginationDTO { 16 | 17 | /** 18 | * id 19 | */ 20 | private Integer id; 21 | 22 | /** 23 | * 文章缩略图 24 | */ 25 | private String cover; 26 | 27 | /** 28 | * 标题 29 | */ 30 | private String title; 31 | 32 | } 33 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/article/ArticlePreviewDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.article; 2 | 3 | import com.ming.m_blog.dto.tag.TagSimpleDTO; 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 | * 预览文章信息 14 | */ 15 | @Data 16 | @AllArgsConstructor 17 | @NoArgsConstructor 18 | @Builder 19 | public class ArticlePreviewDTO { 20 | 21 | /** 22 | * 文章id 23 | */ 24 | private Integer id; 25 | 26 | /** 27 | * 文章缩略图 28 | */ 29 | private String cover; 30 | 31 | /** 32 | * 标题 33 | */ 34 | private String title; 35 | 36 | /** 37 | * 发表时间 38 | */ 39 | private Date updateTime; 40 | 41 | /** 42 | * 文章分类id 43 | */ 44 | private Integer categoryId; 45 | 46 | /** 47 | * 文章分类名 48 | */ 49 | private String categoryName; 50 | 51 | /** 52 | * 文章标签 53 | */ 54 | private List tagDTOList; 55 | 56 | } 57 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/article/ArticlePreviewListDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.article; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * 文章预览列表 12 | */ 13 | @Data 14 | @AllArgsConstructor 15 | @NoArgsConstructor 16 | @Builder 17 | public class ArticlePreviewListDTO { 18 | 19 | /** 20 | * 文章列表 21 | */ 22 | private List articlePreviewDTOList; 23 | 24 | /** 25 | * 条件名 26 | */ 27 | private String name; 28 | 29 | } 30 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/article/ArticleRankDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.article; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | 9 | /** 10 | * 文章排行 11 | * 12 | */ 13 | @Data 14 | @Builder 15 | @AllArgsConstructor 16 | @NoArgsConstructor 17 | public class ArticleRankDTO { 18 | 19 | /** 20 | * 标题 21 | */ 22 | private String articleTitle; 23 | 24 | /** 25 | * 浏览量 26 | */ 27 | private Integer viewsCount; 28 | 29 | 30 | } 31 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/article/ArticleRecommendDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.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 | * 推荐文章对象 12 | */ 13 | @Data 14 | @AllArgsConstructor 15 | @NoArgsConstructor 16 | @Builder 17 | public class ArticleRecommendDTO { 18 | 19 | /** 20 | * id 21 | */ 22 | private Integer id; 23 | 24 | /** 25 | * 文章缩略图 26 | */ 27 | private String cover; 28 | 29 | /** 30 | * 标题 31 | */ 32 | private String title; 33 | 34 | /** 35 | * 创建时间 36 | */ 37 | private Date updateTime; 38 | 39 | } 40 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/article/ArticleStatisticsDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.article; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * 文章统计 10 | * 11 | */ 12 | @Data 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | @Builder 16 | public class ArticleStatisticsDTO { 17 | 18 | /** 19 | * 日期 20 | */ 21 | private String date; 22 | 23 | /** 24 | * 数量 25 | */ 26 | private Integer count; 27 | 28 | } 29 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/blogInfo/BlogInfoDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.blogInfo; 2 | 3 | import com.ming.m_blog.pojo.Page; 4 | import com.ming.m_blog.vo.WebsiteConfigVO; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Data; 8 | import lombok.NoArgsConstructor; 9 | 10 | import java.util.List; 11 | 12 | /** 13 | * 博客信息 14 | */ 15 | @Data 16 | @Builder 17 | @AllArgsConstructor 18 | @NoArgsConstructor 19 | public class BlogInfoDTO { 20 | 21 | /** 22 | * 文章数量 23 | */ 24 | private Integer articleCount; 25 | 26 | /** 27 | * 分类数量 28 | */ 29 | private Integer categoryCount; 30 | 31 | /** 32 | * 标签数量 33 | */ 34 | private Integer tagCount; 35 | 36 | /** 37 | * 封面列表 38 | */ 39 | private List pageList; 40 | 41 | /** 42 | * 网站配置 43 | */ 44 | private WebsiteConfigVO websiteConfig; 45 | 46 | /** 47 | * 访问量 48 | */ 49 | private String viewsCount; 50 | 51 | } 52 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/blogInfo/UniqueViewDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.blogInfo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | 9 | /** 10 | * 访问量 11 | * 12 | */ 13 | @Data 14 | @AllArgsConstructor 15 | @NoArgsConstructor 16 | @Builder 17 | public class UniqueViewDTO { 18 | 19 | /** 20 | * 日期 21 | */ 22 | private String day; 23 | 24 | /** 25 | * 访问量 26 | */ 27 | private Integer viewsCount; 28 | 29 | } 30 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/category/CategoryDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.category; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | 9 | /** 10 | * 前台分类列表 11 | */ 12 | @Data 13 | @Builder 14 | @AllArgsConstructor 15 | @NoArgsConstructor 16 | public class CategoryDTO { 17 | 18 | /** 19 | * id 20 | */ 21 | private Integer id; 22 | 23 | /** 24 | * 分类名 25 | */ 26 | private String categoryName; 27 | 28 | /** 29 | * 分类下的文章数量 30 | */ 31 | private Integer articleCount; 32 | 33 | } 34 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/category/CategoryListDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.category; 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 | * 查询分类信息 12 | */ 13 | @Data 14 | @AllArgsConstructor 15 | @NoArgsConstructor 16 | @Builder 17 | public class CategoryListDTO { 18 | 19 | /** 20 | * 分类id 21 | */ 22 | private int categoryId; 23 | 24 | /** 25 | * 分类名称 26 | */ 27 | private String categoryName; 28 | 29 | /** 30 | * 发布的文章数量 31 | */ 32 | private int articleCount; 33 | 34 | /** 35 | * 更新时间 36 | */ 37 | private Date updateTime; 38 | } 39 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/category/CategorySimpleDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.category; 2 | 3 | import com.baomidou.mybatisplus.annotation.FieldFill; 4 | import com.baomidou.mybatisplus.annotation.IdType; 5 | import com.baomidou.mybatisplus.annotation.TableField; 6 | import com.baomidou.mybatisplus.annotation.TableId; 7 | import io.swagger.annotations.ApiModelProperty; 8 | import lombok.AllArgsConstructor; 9 | import lombok.Builder; 10 | import lombok.Data; 11 | import lombok.NoArgsConstructor; 12 | 13 | import java.util.Date; 14 | 15 | /** 16 | * 简单分类信息 17 | */ 18 | @Data 19 | @AllArgsConstructor 20 | @NoArgsConstructor 21 | @Builder 22 | public class CategorySimpleDTO { 23 | 24 | /** 25 | * 文章id 26 | */ 27 | private Integer id; 28 | 29 | /** 30 | * 文章名称 31 | */ 32 | private String categoryName; 33 | 34 | } 35 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/chatGpt/ReMessageDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.chatGpt; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * 返回给前端的数据对象 10 | */ 11 | @Data 12 | @Builder 13 | @NoArgsConstructor 14 | @AllArgsConstructor 15 | public class ReMessageDTO { 16 | 17 | /** 18 | * 角色 system、user或assistant 19 | */ 20 | private String role; 21 | 22 | /** 23 | * 消息内容 24 | */ 25 | private String content; 26 | 27 | /** 28 | * 姓名(可选) 29 | */ 30 | private String name; 31 | 32 | /** 33 | * 用户头像 34 | */ 35 | private String avatar; 36 | 37 | } 38 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/chatRecord/ChatMessageDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.chatRecord; 2 | 3 | import lombok.*; 4 | 5 | /** 6 | * 聊天消息类 7 | */ 8 | @Data 9 | @Getter 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | @Builder 13 | public class ChatMessageDTO { 14 | 15 | /** 16 | * 消息类型 17 | */ 18 | private Integer type; 19 | 20 | /** 21 | * 消息内容 22 | */ 23 | private Object data; 24 | 25 | } 26 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/chatRecord/ChatRecordDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.chatRecord; 2 | 3 | import com.ming.m_blog.pojo.ChatRecord; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.util.List; 10 | 11 | 12 | /** 13 | * 聊天记录 14 | * 15 | */ 16 | @Data 17 | @AllArgsConstructor 18 | @NoArgsConstructor 19 | @Builder 20 | public class ChatRecordDTO { 21 | 22 | /** 23 | * 聊天记录 24 | */ 25 | private List chatRecordList; 26 | 27 | /** 28 | * ip地址 29 | */ 30 | private String ipAddress; 31 | 32 | /** 33 | * ip来源 34 | */ 35 | private String ipSource; 36 | 37 | } 38 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/chatRecord/RecallMessageDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.chatRecord; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * 撤回消息dto 10 | * 11 | */ 12 | @Data 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | @Builder 16 | public class RecallMessageDTO { 17 | 18 | /** 19 | * 消息id 20 | */ 21 | private Integer id; 22 | 23 | /** 24 | * 是否为语音 25 | */ 26 | private Boolean isVoice; 27 | 28 | } 29 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/comment/CommentCountDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.comment; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * 评论数量dto 10 | * 11 | */ 12 | @Data 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | @Builder 16 | public class CommentCountDTO { 17 | 18 | /** 19 | * id 20 | */ 21 | private Integer id; 22 | 23 | /** 24 | * 评论数量 25 | */ 26 | private Integer commentCount; 27 | } 28 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/comment/ReplyCountDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.comment; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * 回复评论的数量 10 | */ 11 | @Data 12 | @Builder 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | public class ReplyCountDTO { 16 | /** 17 | * 评论id 18 | */ 19 | private Integer commentId; 20 | 21 | /** 22 | * 回复评论数量 23 | */ 24 | private Integer replyCount; 25 | 26 | } 27 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/friendLink/FriendLinkBackDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.friendLink; 2 | 3 | import com.fasterxml.jackson.annotation.JsonFormat; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.time.LocalDateTime; 10 | import java.util.Date; 11 | 12 | /** 13 | * 后台友情链接 14 | * 15 | */ 16 | @Data 17 | @Builder 18 | @AllArgsConstructor 19 | @NoArgsConstructor 20 | public class FriendLinkBackDTO { 21 | /** 22 | * id 23 | */ 24 | private Integer id; 25 | 26 | /** 27 | * 链接名 28 | */ 29 | private String linkName; 30 | 31 | /** 32 | * 链接头像 33 | */ 34 | private String linkAvatar; 35 | 36 | /** 37 | * 链接地址 38 | */ 39 | private String linkAddress; 40 | 41 | /** 42 | * 链接介绍 43 | */ 44 | private String linkIntro; 45 | 46 | /** 47 | * 创建时间 48 | */ 49 | @JsonFormat(pattern = "yyyy-MM-dd HH:mm") 50 | private Date createTime; 51 | 52 | } 53 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/friendLink/FriendLinkDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.friendLink; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | 9 | /** 10 | * 友情链接 11 | * 12 | */ 13 | @Data 14 | @Builder 15 | @AllArgsConstructor 16 | @NoArgsConstructor 17 | public class FriendLinkDTO { 18 | 19 | /** 20 | * id 21 | */ 22 | private Integer id; 23 | 24 | /** 25 | * 链接名 26 | */ 27 | private String linkName; 28 | 29 | /** 30 | * 链接头像 31 | */ 32 | private String linkAvatar; 33 | 34 | /** 35 | * 链接地址 36 | */ 37 | private String linkAddress; 38 | 39 | /** 40 | * 介绍 41 | */ 42 | private String linkIntro; 43 | 44 | } 45 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/message/MessageDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.message; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | 9 | /** 10 | * 留言列表 11 | * 12 | */ 13 | @Data 14 | @Builder 15 | @AllArgsConstructor 16 | @NoArgsConstructor 17 | public class MessageDTO { 18 | 19 | /** 20 | * 主键id 21 | */ 22 | private Integer id; 23 | 24 | /** 25 | * 昵称 26 | */ 27 | private String nickname; 28 | 29 | /** 30 | * 头像 31 | */ 32 | private String avatar; 33 | 34 | /** 35 | * 留言内容 36 | */ 37 | private String messageContent; 38 | 39 | /** 40 | * 弹幕速度 41 | */ 42 | private Integer time; 43 | 44 | } 45 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/oauth/GithubGetTokenRequest.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.oauth; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * GitHub获取token信息请求参数 10 | */ 11 | @Data 12 | @Builder 13 | @NoArgsConstructor 14 | @AllArgsConstructor 15 | public class GithubGetTokenRequest { 16 | 17 | /** 18 | * 客户端id 19 | */ 20 | private String client_id; 21 | 22 | /** 23 | * 客户点密钥 24 | */ 25 | private String client_secret; 26 | 27 | /** 28 | * 用户code 29 | */ 30 | private String code; 31 | 32 | } 33 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/oauth/GithubGetTokenResponse.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.oauth; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * GitHub获取token信息响应参数 10 | */ 11 | @Data 12 | @Builder 13 | @NoArgsConstructor 14 | @AllArgsConstructor 15 | public class GithubGetTokenResponse { 16 | 17 | /** 18 | * 获取到的token 19 | */ 20 | private String access_token; 21 | 22 | /** 23 | * token类型 24 | */ 25 | private String token_type; 26 | 27 | 28 | private String scope; 29 | 30 | } 31 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/oauth/GithubUserResponse.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.oauth; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * GitHub获取用户信息 7 | */ 8 | @Data 9 | public class GithubUserResponse { 10 | 11 | /** 12 | * 唯一id 13 | */ 14 | private String id; 15 | 16 | /** 17 | * 登录用户名 18 | */ 19 | private String login; 20 | 21 | /** 22 | * 头像路径 23 | */ 24 | private String avatar_url; 25 | 26 | 27 | } 28 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/oauth/QQTokenDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.oauth; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * qq token信息 10 | * 11 | **/ 12 | @Data 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | @Builder 16 | public class QQTokenDTO { 17 | 18 | /** 19 | * openId为对当前应用进行授权的QQ用户的身份识别码 20 | */ 21 | private String openid; 22 | 23 | /** 24 | * 客户端id 25 | */ 26 | private String client_id; 27 | 28 | } 29 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/oauth/QQUserInfoDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.oauth; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * qq用户信息dto 10 | * 11 | **/ 12 | @Data 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | @Builder 16 | public class QQUserInfoDTO { 17 | 18 | /** 19 | * 用户在QQ空间的昵称 20 | */ 21 | private String nickname; 22 | 23 | /** 24 | * 大小为40*40的qq头像 25 | */ 26 | private String figureurl_qq_1; 27 | 28 | 29 | } 30 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/oauth/SocialTokenDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.oauth; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * 社交登录token 10 | * 11 | */ 12 | @Data 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | @Builder 16 | public class SocialTokenDTO { 17 | 18 | /** 19 | * 开放id(用户唯一id) 20 | */ 21 | private String openId; 22 | 23 | /** 24 | * 访问令牌 25 | */ 26 | private String accessToken; 27 | 28 | /** 29 | * 登录类型 30 | */ 31 | private Integer loginType; 32 | 33 | } 34 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/oauth/SocialUserInfoDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.oauth; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * 社交账号用户信息 10 | * 11 | */ 12 | @Data 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | @Builder 16 | public class SocialUserInfoDTO { 17 | 18 | /** 19 | * id 20 | */ 21 | private String id; 22 | 23 | /** 24 | * 昵称 25 | */ 26 | private String nickname; 27 | 28 | /** 29 | * 头像 30 | */ 31 | private String avatar; 32 | } 33 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/search/CategorySearchDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.search; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | import org.springframework.data.annotation.Id; 8 | import org.springframework.data.elasticsearch.annotations.Document; 9 | import org.springframework.data.elasticsearch.annotations.Field; 10 | import org.springframework.data.elasticsearch.annotations.FieldType; 11 | 12 | @Data 13 | @Builder 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | @Document(indexName = "category") 17 | public class CategorySearchDTO { 18 | 19 | /** 20 | * 分类id 21 | */ 22 | @Id 23 | private Integer id; 24 | 25 | /** 26 | * 分类名称 27 | */ 28 | @Field(type = FieldType.Text, analyzer = "ik_max_word") 29 | private String categoryName; 30 | 31 | } 32 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/search/SearchPictureDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.search; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * 爬取到的图片 10 | */ 11 | @Data 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | @Builder 15 | public class SearchPictureDTO { 16 | 17 | /** 18 | * 图片标题 19 | */ 20 | private String title; 21 | 22 | /** 23 | * 图片访问url 24 | */ 25 | private String url; 26 | } 27 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/search/TagSearchDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.search; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | import org.springframework.data.annotation.Id; 8 | import org.springframework.data.elasticsearch.annotations.Document; 9 | import org.springframework.data.elasticsearch.annotations.Field; 10 | import org.springframework.data.elasticsearch.annotations.FieldType; 11 | 12 | /** 13 | * 搜索标签结果 14 | */ 15 | @Data 16 | @Builder 17 | @NoArgsConstructor 18 | @AllArgsConstructor 19 | @Document(indexName = "tag") 20 | public class TagSearchDTO { 21 | 22 | /** 23 | * 标签id 24 | */ 25 | @Id 26 | private Integer id; 27 | 28 | /** 29 | * 标签名称,这里标签不使用分词器 30 | */ 31 | @Field(type = FieldType.Text, analyzer = "keyword") 32 | private String tagName; 33 | 34 | } 35 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/tag/TagSimpleDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.tag; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * 简单标签信息 10 | */ 11 | @Data 12 | @AllArgsConstructor 13 | @NoArgsConstructor 14 | @Builder 15 | public class TagSimpleDTO { 16 | 17 | /** 18 | * 标签id 19 | */ 20 | private Integer id; 21 | 22 | /** 23 | * 标签名称 24 | */ 25 | private String tagName; 26 | 27 | } 28 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/talk/TagListDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.talk; 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 | * 查询标签信息数据 12 | */ 13 | @Data 14 | @AllArgsConstructor 15 | @NoArgsConstructor 16 | @Builder 17 | public class TagListDTO { 18 | 19 | /** 20 | * 标签id 21 | */ 22 | private int tagId; 23 | 24 | /** 25 | * 标签名称 26 | */ 27 | private String tagName; 28 | 29 | /** 30 | * 发布的文章数量 31 | */ 32 | private int articleCount; 33 | 34 | /** 35 | * 更新时间 36 | */ 37 | private Date updateTime; 38 | 39 | } 40 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/dto/user/UserAreaDTO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.dto.user; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * 用户地区DTO 10 | * 11 | */ 12 | @Data 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | @Builder 16 | public class UserAreaDTO { 17 | 18 | /** 19 | * 地区名 20 | */ 21 | private String name; 22 | 23 | /** 24 | * 数量 25 | */ 26 | private Long value; 27 | 28 | } 29 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/enums/ArticleStatusEnum.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | /** 7 | * 博客状态 8 | */ 9 | @Getter 10 | @AllArgsConstructor 11 | public enum ArticleStatusEnum { 12 | 13 | DRAFT(0, "草稿"), 14 | 15 | PUBLIC(1,"公开"), 16 | 17 | SECRET(2,"私密"); 18 | 19 | 20 | private final Integer status; 21 | 22 | private final String desc; 23 | 24 | // 通过status获取Enum 25 | public static ArticleStatusEnum getArticleStatus(Integer status){ 26 | for (ArticleStatusEnum articleStatusEnum : ArticleStatusEnum.values()) { 27 | if (articleStatusEnum.status.equals(status)){ 28 | return articleStatusEnum; 29 | } 30 | } 31 | return null; 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/enums/CommentTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | /** 7 | * 评论类型枚举 8 | */ 9 | @Getter 10 | @AllArgsConstructor 11 | public enum CommentTypeEnum { 12 | 13 | /** 14 | * 文章 15 | */ 16 | ARTICLE(1, "文章", "articles/"), 17 | /** 18 | * 友链 19 | */ 20 | FRIEND_LINK(2, "友链", "links/"), 21 | 22 | /** 23 | * 说说 24 | */ 25 | TALK(3, "说说", "talks/"); 26 | 27 | /** 28 | * 评论类型 29 | */ 30 | private final Integer type; 31 | 32 | 33 | /** 34 | * 策略 35 | */ 36 | private final String desc; 37 | 38 | /** 39 | * 评论路径 40 | */ 41 | private final String path; 42 | 43 | public static CommentTypeEnum getCommentTypeEnum(Integer type){ 44 | for (CommentTypeEnum commentTypeEnum : CommentTypeEnum.values()) { 45 | if (commentTypeEnum.type.equals(type)){ 46 | return commentTypeEnum; 47 | } 48 | } 49 | return null; 50 | } 51 | 52 | 53 | } 54 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/enums/DefaultImgEnum.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | /** 7 | * 默认图片枚举 8 | */ 9 | @Getter 10 | @AllArgsConstructor 11 | public enum DefaultImgEnum { 12 | 13 | /** 14 | * 默认文章封面 15 | */ 16 | DEFAULT_ARTICLE_COVER("http://www.static.mingzib.xyz/blogGetDefaultFile/deafaultArticleCover.png","默认文章封面"), 17 | 18 | /** 19 | * 默认网站头像 20 | */ 21 | DEFAULT_WEBSITE_AVATAR("http://www.static.mingzib.xyz/blogGetDefaultFile/defaultMyAvatar.jpg","默认网站头像"), 22 | 23 | /** 24 | * 游客头像 25 | */ 26 | DEFAULT_TOURIST_AVATAR("http://www.mingzib.xyz/blogGetDefaultFile/touristAvatar.jpg","游客头像"); 27 | 28 | private final String url; 29 | 30 | private final String desc; 31 | } 32 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/enums/FilePathEnum.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | /** 7 | * 文件路径枚举 8 | * 9 | * @author ming 10 | * @date 2021/08/04 11 | */ 12 | @Getter 13 | @AllArgsConstructor 14 | public enum FilePathEnum { 15 | /** 16 | * 头像路径 17 | */ 18 | AVATAR("avatar/", "头像路径"), 19 | /** 20 | * 文章图片路径 21 | */ 22 | ARTICLE("articles/", "文章图片路径"), 23 | /** 24 | * 配置网站配置信息路径 25 | */ 26 | ICON("configImage/","网站配置图片路径"), 27 | 28 | /** 29 | * 说说图片路径 30 | */ 31 | TALK("talk/", "说说图片路径"); 32 | 33 | /** 34 | * 路径 35 | */ 36 | private final String path; 37 | 38 | /** 39 | * 描述 40 | */ 41 | private final String desc; 42 | 43 | } 44 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/enums/LoginTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | /** 7 | * 登录方式枚举 8 | * 9 | * @date 2023-4-18 10 | */ 11 | @Getter 12 | @AllArgsConstructor 13 | public enum LoginTypeEnum { 14 | /** 15 | * 邮箱登录 16 | */ 17 | EMAIL(1, "邮箱或用户名登录", ""), 18 | /** 19 | * QQ登录 20 | */ 21 | QQ(2, "QQ登录", "qqLoginStrategyImpl"), 22 | 23 | /** 24 | * GitHub登录 25 | */ 26 | GIT_HUB(3, "GitHub登录", "githubLoginStrategyImpl"); 27 | // /** 28 | // * 微博登录 29 | // */ 30 | // WEIBO(3, "微博登录", "weiboLoginStrategyImpl"); 31 | 32 | /** 33 | * 登录方式 34 | */ 35 | private final Integer type; 36 | 37 | /** 38 | * 描述 39 | */ 40 | private final String desc; 41 | 42 | /** 43 | * 策略 44 | */ 45 | private final String strategy; 46 | 47 | 48 | } 49 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/enums/RoleEnum.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | /** 7 | * 角色枚举 8 | * 9 | */ 10 | @Getter 11 | @AllArgsConstructor 12 | public enum RoleEnum { 13 | /** 14 | * 管理员 15 | */ 16 | ADMIN(1, "管理员", "admin"), 17 | /** 18 | * 普通用户 19 | */ 20 | USER(2, "用户", "user"), 21 | /** 22 | * 测试账号 23 | */ 24 | TEST(3, "测试", "test"); 25 | 26 | /** 27 | * 角色id 28 | */ 29 | private final Integer roleId; 30 | 31 | /** 32 | * 描述 33 | */ 34 | private final String name; 35 | 36 | /** 37 | * 权限标签 38 | */ 39 | private final String label; 40 | 41 | } 42 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/enums/SearchModelEnum.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | /** 7 | * 搜索模式枚举 8 | */ 9 | @Getter 10 | @AllArgsConstructor 11 | public enum SearchModelEnum { 12 | 13 | /** 14 | * 本地MySQL搜索 15 | */ 16 | mysql("mysql","mysqlSearchStrategyImpl"), 17 | 18 | /** 19 | * elasticSearch模式搜索 20 | */ 21 | elasticSearch("elasticSearch","esSearchStrategyImpl"); 22 | 23 | private final String mode; 24 | 25 | private final String strategy; 26 | 27 | /** 28 | * 获取搜索策略 29 | * @param mode 当前使用的搜索模式 30 | * @return 使用的具体策略 31 | */ 32 | public static String getStrategy(String mode){ 33 | for (SearchModelEnum value : SearchModelEnum.values()) { 34 | if (value.getMode().equals(mode)){ 35 | return value.getStrategy(); 36 | } 37 | } 38 | return null; 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/enums/SearchTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | /** 7 | * 搜索类型枚举 8 | */ 9 | @Getter 10 | @AllArgsConstructor 11 | public enum SearchTypeEnum { 12 | 13 | ARTICLE(1, "文章","mysqlArticleSearchImpl"), 14 | 15 | CATEGORY(2,"分类","mysqlCategorySearchImpl"), 16 | 17 | TAG(3,"标签","mysqlTagSearchImpl"), 18 | 19 | PICTURE(4,"图片","searchPictureStrategyImpl"); 20 | 21 | 22 | private final Integer type; 23 | 24 | private final String desc; 25 | 26 | /** 27 | * 搜索此类型数据使用的方法 28 | */ 29 | private final String strategy; 30 | 31 | // 通过status获取Enum 32 | public static SearchTypeEnum getSearchTypeEnum(Integer type){ 33 | for (SearchTypeEnum articleStatusEnum : SearchTypeEnum.values()) { 34 | if (articleStatusEnum.type.equals(type)){ 35 | return articleStatusEnum; 36 | } 37 | } 38 | return null; 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/enums/TalkStatusEnum.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | /** 7 | * 说说状态枚举 8 | */ 9 | @Getter 10 | @AllArgsConstructor 11 | public enum TalkStatusEnum { 12 | 13 | /** 14 | * 公开 15 | */ 16 | PUBLIC(1, "公开"), 17 | /** 18 | * 私密 19 | */ 20 | SECRET(2, "私密"); 21 | 22 | /** 23 | * 状态 24 | */ 25 | private final Integer status; 26 | 27 | /** 28 | * 描述 29 | */ 30 | private final String desc; 31 | 32 | } 33 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/enums/UploadFileModelEnum.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | /** 7 | * 上传模式枚举 8 | */ 9 | @Getter 10 | @AllArgsConstructor 11 | public enum UploadFileModelEnum { 12 | 13 | /** 14 | * 本地上传 15 | */ 16 | LOCAL("local","localUploadStrategyImpl"), 17 | 18 | QINIU("qiniu","qiNiuUploadStrategyImpl"); 19 | 20 | private final String mode; 21 | 22 | private final String strategy; 23 | 24 | 25 | /** 26 | * 获取策略 27 | * @param mode 上传模式 28 | * @return 选择的策略模式 29 | */ 30 | public static String getStrategy(String mode){ 31 | for (UploadFileModelEnum value : UploadFileModelEnum.values()) { 32 | if (value.getMode().equals(mode)){ 33 | return value.getStrategy(); 34 | } 35 | } 36 | return null; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/enums/UserTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | /** 7 | * 用户类型 8 | */ 9 | @Getter 10 | @AllArgsConstructor 11 | public enum UserTypeEnum { 12 | 13 | USER(1,"用户"), 14 | 15 | VISITOR(2,"游客"); 16 | 17 | private final Integer type; 18 | 19 | private final String desc; 20 | 21 | // 获取enum 22 | public static UserTypeEnum getUserTypeEnum(Integer type){ 23 | for (UserTypeEnum userTypeEnum : UserTypeEnum.values()) { 24 | if (userTypeEnum.getType().equals(type)){ 25 | return userTypeEnum; 26 | } 27 | } 28 | return null; 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/exception/ReRuntimeException.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.exception; 2 | 3 | import com.ming.m_blog.enums.StatusCodeEnum; 4 | import lombok.*; 5 | 6 | @Getter 7 | @AllArgsConstructor 8 | public class ReRuntimeException extends RuntimeException{ 9 | 10 | // 错误码 11 | public int code = StatusCodeEnum.FAIL.getCode(); 12 | 13 | /** 14 | * 错误信息 15 | */ 16 | private final String message; 17 | 18 | public ReRuntimeException(String message){ 19 | this.message = message; 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/hander/AccessDeniedHandlerImpl.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.hander; 2 | 3 | import com.alibaba.fastjson.JSON; 4 | import com.ming.m_blog.constant.CommonConst; 5 | import com.ming.m_blog.vo.ResponseResult; 6 | import org.springframework.security.access.AccessDeniedException; 7 | import org.springframework.security.web.access.AccessDeniedHandler; 8 | import org.springframework.stereotype.Component; 9 | 10 | import javax.servlet.ServletException; 11 | import javax.servlet.http.HttpServletRequest; 12 | import javax.servlet.http.HttpServletResponse; 13 | import java.io.IOException; 14 | 15 | /** 16 | * 认证失败处理器 17 | */ 18 | @Component 19 | public class AccessDeniedHandlerImpl implements AccessDeniedHandler { 20 | @Override 21 | public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException { 22 | response.setContentType(CommonConst.APPLICATION_JSON); 23 | response.getWriter().write(JSON.toJSONString(ResponseResult.fail("权限不足"))); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/hander/MybatisPlusFillingHandler.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.hander; 2 | 3 | import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.apache.ibatis.reflection.MetaObject; 6 | import org.springframework.stereotype.Component; 7 | 8 | import java.util.Date; 9 | 10 | @Slf4j//日志 11 | @Component//丢到springboot里 一定不要忘记把处理器加到Ioc容器中! 12 | public class MybatisPlusFillingHandler implements MetaObjectHandler {//extends?? 13 | @Override//插入时的填充策略 14 | public void insertFill(MetaObject metaObject) { 15 | log.info("====插入填充策略======"); 16 | //setFieldValByName(java.lang.String fieldName, java.lang.Object fieldVal, org.apache.ibatis.reflection.MetaObject metaObject) 17 | this.setFieldValByName("createTime",new Date(),metaObject); 18 | this.setFieldValByName("updateTime",new Date(),metaObject); 19 | } 20 | @Override//更新时的填充策略 21 | public void updateFill(MetaObject metaObject) { 22 | log.info("=======更新填充策略======="); 23 | this.setFieldValByName("updateTime",new Date(),metaObject); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/hander/SessionInformationExpiredStrategyImpl.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.hander; 2 | 3 | import com.alibaba.fastjson.JSON; 4 | import com.ming.m_blog.constant.CommonConst; 5 | import com.ming.m_blog.vo.ResponseResult; 6 | import org.springframework.security.web.session.SessionInformationExpiredEvent; 7 | import org.springframework.security.web.session.SessionInformationExpiredStrategy; 8 | 9 | import javax.servlet.ServletException; 10 | import java.io.IOException; 11 | 12 | /** 13 | * session被消除处理 14 | */ 15 | public class SessionInformationExpiredStrategyImpl implements SessionInformationExpiredStrategy { 16 | @Override 17 | public void onExpiredSessionDetected(SessionInformationExpiredEvent event) throws IOException, ServletException { 18 | event.getResponse().setContentType(CommonConst.APPLICATION_JSON); 19 | event.getResponse().getWriter().write(JSON.toJSONString(ResponseResult.fail("Session过期,可能是被迫下线-.-"))); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/mapper/CategoryMapper.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.mapper; 2 | 3 | import com.ming.m_blog.dto.category.CategoryDTO; 4 | import com.ming.m_blog.dto.category.CategoryListDTO; 5 | import com.ming.m_blog.pojo.Category; 6 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 7 | import org.apache.ibatis.annotations.Param; 8 | import org.springframework.stereotype.Repository; 9 | 10 | import java.util.List; 11 | 12 | /** 13 | * Mapper 分类接口 14 | * 15 | * @author Ming 16 | * @since 2022-08-11 17 | */ 18 | @Repository 19 | public interface CategoryMapper extends BaseMapper { 20 | 21 | /** 22 | * 分页查询分类信息 23 | * @param pageNum 页码 24 | * @param pageSize 每页数量 25 | * @param keywords 查询信息 26 | * @return 查询结果 27 | */ 28 | List selectCategoryList(@Param("pageNum") int pageNum, @Param("pageSize") int pageSize, @Param("keywords") String keywords); 29 | 30 | /** 31 | * 前台查询分类列表 32 | * @return 33 | */ 34 | List listCategory(); 35 | 36 | } 37 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/mapper/ChatRecordMapper.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.mapper; 2 | 3 | import com.ming.m_blog.pojo.ChatRecord; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | *

9 | * Mapper 接口 10 | *

11 | * 12 | * @author Ming 13 | * @since 2022-10-16 14 | */ 15 | @Repository 16 | public interface ChatRecordMapper extends BaseMapper { 17 | 18 | } 19 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/mapper/FriendLinkMapper.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.mapper; 2 | 3 | import com.ming.m_blog.pojo.FriendLink; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | * @author 86135 9 | * @description 针对表【friend_link】的数据库操作Mapper 10 | * @createDate 2023-06-01 08:35:45 11 | * @Entity com.ming.m_blog.pojo.FriendLink 12 | */ 13 | @Repository 14 | public interface FriendLinkMapper extends BaseMapper { 15 | 16 | } 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/mapper/InArticleTagMapper.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.mapper; 2 | 3 | import com.ming.m_blog.pojo.InArticleTag; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | *

9 | * Mapper 接口 10 | *

11 | * 12 | * @author Ming 13 | * @since 2022-08-12 14 | */ 15 | @Repository 16 | public interface InArticleTagMapper extends BaseMapper { 17 | 18 | } 19 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/mapper/InRolePowerMapper.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.mapper; 2 | 3 | import com.ming.m_blog.pojo.InRolePower; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | *

9 | * Mapper 接口 10 | *

11 | * 12 | * @author Ming 13 | * @since 2022-07-25 14 | */ 15 | @Repository 16 | public interface InRolePowerMapper extends BaseMapper { 17 | 18 | } 19 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/mapper/InUserRoleMapper.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.mapper; 2 | 3 | import com.ming.m_blog.pojo.InUserRole; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.apache.ibatis.annotations.Mapper; 6 | import org.springframework.stereotype.Repository; 7 | 8 | /** 9 | *

10 | * Mapper 接口 11 | *

12 | * 13 | * @author Ming 14 | * @since 2022-07-25 15 | */ 16 | @Repository 17 | public interface InUserRoleMapper extends BaseMapper { 18 | 19 | } 20 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/mapper/MessageMapper.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.mapper; 2 | 3 | import com.ming.m_blog.pojo.Message; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | * @author Ming 9 | */ 10 | @Repository 11 | public interface MessageMapper extends BaseMapper { 12 | 13 | } 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/mapper/OperationLogMapper.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.mapper; 2 | 3 | import com.ming.m_blog.pojo.OperationLog; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | * 日志操作 9 | */ 10 | @Repository 11 | public interface OperationLogMapper extends BaseMapper { 12 | 13 | } 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/mapper/PageMapper.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.mapper; 2 | 3 | import com.ming.m_blog.pojo.Page; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | * 页面信息 9 | * 10 | * @author Ming 11 | * @since 2022-11-08 12 | */ 13 | @Repository 14 | public interface PageMapper extends BaseMapper { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/mapper/PowerMapper.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.mapper; 2 | 3 | import com.ming.m_blog.pojo.Power; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | *

9 | * Mapper 接口 10 | *

11 | * 12 | * @author Ming 13 | * @since 2022-07-25 14 | */ 15 | @Repository 16 | public interface PowerMapper extends BaseMapper { 17 | 18 | } 19 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/mapper/RoleMapper.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.mapper; 2 | 3 | import com.ming.m_blog.pojo.Role; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | *

9 | * Mapper 接口 10 | *

11 | * 12 | * @author Ming 13 | * @since 2022-07-25 14 | */ 15 | @Repository 16 | public interface RoleMapper extends BaseMapper { 17 | 18 | } 19 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/mapper/TagMapper.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.mapper; 2 | 3 | import com.ming.m_blog.dto.talk.TagListDTO; 4 | import com.ming.m_blog.pojo.Tag; 5 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 6 | import org.apache.ibatis.annotations.Param; 7 | import org.springframework.stereotype.Repository; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | *

13 | * Mapper 接口 14 | *

15 | * 16 | * @author Ming 17 | * @since 2022-08-12 18 | */ 19 | @Repository 20 | public interface TagMapper extends BaseMapper { 21 | 22 | 23 | /** 24 | * 分页查询标签信息 25 | * @param pageNum 页码 26 | * @param pageSize 每页数量 27 | * @param keywords 查询信息 28 | * @return 查询结果 29 | */ 30 | List getTagList(@Param("pageNum") int pageNum, @Param("pageSize") int pageSize, @Param("keywords") String keywords); 31 | 32 | 33 | /** 34 | * 通过文章id查询标签名称 35 | * @param articleId 文章id 36 | * @return 标签名称 37 | */ 38 | List getTagNameByArticleId(Integer articleId); 39 | } 40 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/mapper/UniqueViewMapper.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.mapper; 2 | 3 | import com.ming.m_blog.dto.blogInfo.UniqueViewDTO; 4 | import com.ming.m_blog.pojo.UniqueView; 5 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 6 | import org.apache.ibatis.annotations.Param; 7 | import org.springframework.stereotype.Repository; 8 | 9 | import java.util.Date; 10 | import java.util.List; 11 | 12 | /** 13 | *

14 | * Mapper 接口 15 | *

16 | * 17 | * @author Ming 18 | * @since 2022-11-14 19 | */ 20 | @Repository 21 | public interface UniqueViewMapper extends BaseMapper { 22 | 23 | /** 24 | * 获取最近七天的访问结果 25 | * @return 查询结果 26 | */ 27 | List getUniqueViewDTO(@Param("startDate") Date startDate,@Param("endDate") Date endDate); 28 | 29 | } 30 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/mapper/UserAuthMapper.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.mapper; 2 | 3 | import com.ming.m_blog.pojo.UserAuth; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.apache.ibatis.annotations.Mapper; 6 | import org.springframework.stereotype.Repository; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | *

12 | * Mapper 接口 13 | *

14 | * 15 | * @author Ming 16 | * @since 2022-07-25 17 | */ 18 | @Repository 19 | public interface UserAuthMapper extends BaseMapper { 20 | 21 | /** 22 | * 通过用户id获取用户的权限信息 23 | * @param userId 用户id 24 | * @return 用户的权限信息 25 | */ 26 | List selectPowerByUserId(String userId); 27 | 28 | } 29 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/mapper/WebsiteConfigMapper.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.mapper; 2 | 3 | import com.ming.m_blog.pojo.WebsiteConfig; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | *

9 | * Mapper 接口 10 | *

11 | * 12 | * @author Ming 13 | * @since 2022-10-26 14 | */ 15 | @Repository 16 | public interface WebsiteConfigMapper extends BaseMapper { 17 | 18 | } 19 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/mapper/elasticSearch/ArticleEsMapper.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.mapper.elasticSearch; 2 | 3 | import com.ming.m_blog.dto.search.ArticleSearchDTO; 4 | import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; 5 | 6 | /** 7 | * 文章es操作 8 | */ 9 | public interface ArticleEsMapper extends ElasticsearchRepository { 10 | 11 | 12 | 13 | } 14 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/mapper/elasticSearch/CategoryEsMapper.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.mapper.elasticSearch; 2 | 3 | 4 | import com.ming.m_blog.dto.search.CategorySearchDTO; 5 | import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; 6 | 7 | /** 8 | * 分类es操作 9 | */ 10 | public interface CategoryEsMapper extends ElasticsearchRepository { 11 | } 12 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/mapper/elasticSearch/TagEsMapper.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.mapper.elasticSearch; 2 | 3 | import com.ming.m_blog.dto.search.TagSearchDTO; 4 | import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; 5 | 6 | /** 7 | * 标签es操作 8 | */ 9 | public interface TagEsMapper extends ElasticsearchRepository { 10 | } 11 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/pojo/InRolePower.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.pojo; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.Version; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import java.io.Serializable; 7 | import io.swagger.annotations.ApiModel; 8 | import io.swagger.annotations.ApiModelProperty; 9 | import lombok.Data; 10 | import lombok.EqualsAndHashCode; 11 | import lombok.experimental.Accessors; 12 | 13 | /** 14 | *

15 | * 16 | *

17 | * 18 | * @author Ming 19 | * @since 2022-07-25 20 | */ 21 | @Data 22 | @EqualsAndHashCode(callSuper = false) 23 | @Accessors(chain = true) 24 | @ApiModel(value="InRolePower对象", description="") 25 | public class InRolePower implements Serializable { 26 | 27 | private static final long serialVersionUID=1L; 28 | 29 | @ApiModelProperty(value = "主键") 30 | @TableId(value = "id", type = IdType.AUTO) 31 | private Integer id; 32 | 33 | @ApiModelProperty(value = "角色id") 34 | private Integer roleId; 35 | 36 | @ApiModelProperty(value = "权限id") 37 | private Integer powerId; 38 | 39 | 40 | } 41 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/service/ChatRecordService.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.service; 2 | 3 | import com.ming.m_blog.pojo.ChatRecord; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | 6 | /** 7 | *

8 | * 服务类 9 | *

10 | * 11 | * @author Ming 12 | * @since 2022-10-16 13 | */ 14 | public interface ChatRecordService extends IService { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/service/FileService.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.service; 2 | 3 | import com.ming.m_blog.vo.ResponseResult; 4 | import org.springframework.web.multipart.MultipartFile; 5 | 6 | /** 7 | * 文件服务接口 8 | */ 9 | public interface FileService { 10 | 11 | /** 12 | * 头像文件上传服务 13 | * @param headFile 要上传的头像文件 14 | * @return 上传文件后的获取路径 15 | */ 16 | String avatarFileUpload(MultipartFile headFile); 17 | 18 | 19 | /** 20 | * 博客文章图片上传 21 | * @param articleFile 要上传的博客文章 22 | * @return 文章图片访问路径 23 | */ 24 | String articleFileUpload(MultipartFile articleFile); 25 | 26 | } 27 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/service/InArticleTagService.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.service; 2 | 3 | import com.ming.m_blog.pojo.InArticleTag; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | 6 | /** 7 | *

8 | * 服务类 9 | *

10 | * 11 | * @author Ming 12 | * @since 2022-08-12 13 | */ 14 | public interface InArticleTagService extends IService { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/service/InRolePowerService.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.service; 2 | 3 | import com.ming.m_blog.pojo.InRolePower; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | 6 | /** 7 | *

8 | * 服务类 9 | *

10 | * 11 | * @author Ming 12 | * @since 2022-07-25 13 | */ 14 | public interface InRolePowerService extends IService { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/service/InUserRoleService.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.service; 2 | 3 | import com.ming.m_blog.pojo.InUserRole; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | 6 | /** 7 | *

8 | * 服务类 9 | *

10 | * 11 | * @author Ming 12 | * @since 2022-07-25 13 | */ 14 | public interface InUserRoleService extends IService { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/service/OperationLogService.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.service; 2 | 3 | import com.ming.m_blog.dto.log.OperationLogDTO; 4 | import com.ming.m_blog.pojo.OperationLog; 5 | import com.baomidou.mybatisplus.extension.service.IService; 6 | import com.ming.m_blog.vo.PageResult; 7 | import com.ming.m_blog.vo.QueryInfoVO; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * @author 86135 13 | * @description 针对表【operation_log】的数据库操作Service 14 | * @createDate 2023-01-13 09:08:57 15 | */ 16 | public interface OperationLogService extends IService { 17 | 18 | /** 19 | * 后台查询日志列表 20 | * @param queryInfoVO 查询条件 21 | * @return 返回结果 22 | */ 23 | public PageResult logList(QueryInfoVO queryInfoVO); 24 | 25 | /** 26 | * 删除日志列表 27 | * @param logIdList 日志id列表 28 | * @return 影响行数 29 | */ 30 | public int delLogList(List logIdList); 31 | } 32 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/service/PageService.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.service; 2 | 3 | import com.ming.m_blog.pojo.Page; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | import com.ming.m_blog.vo.PageResult; 6 | import com.ming.m_blog.vo.PageVO; 7 | import org.springframework.web.multipart.MultipartFile; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * 网站页面服务类 13 | * 14 | * @author Ming 15 | * @since 2022-11-08 16 | */ 17 | public interface PageService extends IService { 18 | 19 | /** 20 | * 获取所有页面信息 21 | * @return 页面信息 22 | * @return 查询结果 23 | */ 24 | List getPageList(); 25 | 26 | /** 27 | * 修改页面信息 28 | * @param page 页面信息 29 | * @return 修改结果 30 | */ 31 | void saveOrUpdatePage(PageVO page); 32 | 33 | /** 34 | * 删除页面 35 | * @param pageId 页面id 36 | */ 37 | void deletePage(Integer pageId); 38 | } 39 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/service/PowerService.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.service; 2 | 3 | import com.ming.m_blog.pojo.Power; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | 6 | /** 7 | *

8 | * 服务类 9 | *

10 | * 11 | * @author Ming 12 | * @since 2022-07-25 13 | */ 14 | public interface PowerService extends IService { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/service/RoleService.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.service; 2 | 3 | import com.ming.m_blog.pojo.Role; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | 6 | /** 7 | *

8 | * 服务类 9 | *

10 | * 11 | * @author Ming 12 | * @since 2022-07-25 13 | */ 14 | public interface RoleService extends IService { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/service/UniqueViewService.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.service; 2 | 3 | import com.ming.m_blog.dto.blogInfo.UniqueViewDTO; 4 | import com.ming.m_blog.pojo.UniqueView; 5 | import com.baomidou.mybatisplus.extension.service.IService; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * 11 | * 用户访问服务 12 | * 13 | * @author Ming 14 | * @since 2022-11-14 15 | */ 16 | public interface UniqueViewService extends IService { 17 | 18 | /** 19 | * 获取最近七天用户访问量 20 | * @return 查询结果 21 | */ 22 | List listUniqueViewDTO(); 23 | 24 | 25 | } 26 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/service/WebsiteConfigService.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.service; 2 | 3 | import com.ming.m_blog.pojo.WebsiteConfig; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | 6 | /** 7 | *

8 | * 服务类 9 | *

10 | * 11 | * @author Ming 12 | * @since 2022-10-26 13 | */ 14 | public interface WebsiteConfigService extends IService { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/service/impl/ChatRecordServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.service.impl; 2 | 3 | import com.ming.m_blog.pojo.ChatRecord; 4 | import com.ming.m_blog.mapper.ChatRecordMapper; 5 | import com.ming.m_blog.service.ChatRecordService; 6 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 7 | import org.springframework.stereotype.Service; 8 | 9 | /** 10 | *

11 | * 服务实现类 12 | *

13 | * 14 | * @author Ming 15 | * @since 2022-10-16 16 | */ 17 | @Service 18 | public class ChatRecordServiceImpl extends ServiceImpl implements ChatRecordService { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/service/impl/InArticleTagServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.service.impl; 2 | 3 | import com.ming.m_blog.pojo.InArticleTag; 4 | import com.ming.m_blog.mapper.InArticleTagMapper; 5 | import com.ming.m_blog.service.InArticleTagService; 6 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 7 | import org.springframework.stereotype.Service; 8 | 9 | /** 10 | *

11 | * 服务实现类 12 | *

13 | * 14 | * @author Ming 15 | * @since 2022-08-12 16 | */ 17 | @Service 18 | public class InArticleTagServiceImpl extends ServiceImpl implements InArticleTagService { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/service/impl/InRolePowerServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.service.impl; 2 | 3 | import com.ming.m_blog.pojo.InRolePower; 4 | import com.ming.m_blog.mapper.InRolePowerMapper; 5 | import com.ming.m_blog.service.InRolePowerService; 6 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 7 | import org.springframework.stereotype.Service; 8 | 9 | /** 10 | *

11 | * 服务实现类 12 | *

13 | * 14 | * @author Ming 15 | * @since 2022-07-25 16 | */ 17 | @Service 18 | public class InRolePowerServiceImpl extends ServiceImpl implements InRolePowerService { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/service/impl/InUserRoleServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.service.impl; 2 | 3 | import com.ming.m_blog.pojo.InUserRole; 4 | import com.ming.m_blog.mapper.InUserRoleMapper; 5 | import com.ming.m_blog.service.InUserRoleService; 6 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 7 | import org.springframework.stereotype.Service; 8 | 9 | /** 10 | *

11 | * 服务实现类 12 | *

13 | * 14 | * @author Ming 15 | * @since 2022-07-25 16 | */ 17 | @Service 18 | public class InUserRoleServiceImpl extends ServiceImpl implements InUserRoleService { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/service/impl/PowerServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.service.impl; 2 | 3 | import com.ming.m_blog.pojo.Power; 4 | import com.ming.m_blog.mapper.PowerMapper; 5 | import com.ming.m_blog.service.PowerService; 6 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 7 | import org.springframework.stereotype.Service; 8 | 9 | /** 10 | *

11 | * 服务实现类 12 | *

13 | * 14 | * @author Ming 15 | * @since 2022-07-25 16 | */ 17 | @Service 18 | public class PowerServiceImpl extends ServiceImpl implements PowerService { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/service/impl/RoleServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.service.impl; 2 | 3 | import com.ming.m_blog.pojo.Role; 4 | import com.ming.m_blog.mapper.RoleMapper; 5 | import com.ming.m_blog.service.RoleService; 6 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 7 | import org.springframework.stereotype.Service; 8 | 9 | /** 10 | *

11 | * 服务实现类 12 | *

13 | * 14 | * @author Ming 15 | * @since 2022-07-25 16 | */ 17 | @Service 18 | public class RoleServiceImpl extends ServiceImpl implements RoleService { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/service/impl/WebsiteConfigServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.service.impl; 2 | 3 | import com.ming.m_blog.pojo.WebsiteConfig; 4 | import com.ming.m_blog.mapper.WebsiteConfigMapper; 5 | import com.ming.m_blog.service.WebsiteConfigService; 6 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 7 | import org.springframework.stereotype.Service; 8 | 9 | /** 10 | *

11 | * 服务实现类 12 | *

13 | * 14 | * @author Ming 15 | * @since 2022-10-26 16 | */ 17 | @Service 18 | public class WebsiteConfigServiceImpl extends ServiceImpl implements WebsiteConfigService { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/strategy/LoginStrategy.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.strategy; 2 | 3 | import com.ming.m_blog.dto.user.UserInfoDTO; 4 | 5 | /** 6 | * 第三方策略模式 7 | */ 8 | public interface LoginStrategy { 9 | 10 | public UserInfoDTO login(String data); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/strategy/SearchStrategy.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.strategy; 2 | 3 | import com.ming.m_blog.enums.SearchTypeEnum; 4 | import com.ming.m_blog.vo.SearchVO; 5 | 6 | /** 7 | * 搜索策略模式 8 | */ 9 | public interface SearchStrategy { 10 | 11 | /** 12 | * 搜索文章 13 | * @param keyword 搜索关键词 14 | * @param searchTypeEnum 搜索类型枚举 15 | * @return 查询到的文章结果 16 | */ 17 | public SearchVO search(String keyword, SearchTypeEnum searchTypeEnum); 18 | 19 | } 20 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/strategy/UploadStrategy.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.strategy; 2 | 3 | import org.springframework.web.multipart.MultipartFile; 4 | 5 | /** 6 | * 上传文件策略模式 7 | * @author liuziming 8 | * @date 2023-4-12 9 | */ 10 | public interface UploadStrategy { 11 | 12 | /** 13 | * 上传文件 14 | * @param multipartFile 要上传的文件 15 | * @param path 文件上传的相对路径 16 | * @return 请求文件路径 17 | */ 18 | String uploadFile(MultipartFile multipartFile, String path); 19 | 20 | 21 | } 22 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/strategy/context/SocialLoginStrategyContext.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.strategy.context; 2 | 3 | import com.ming.m_blog.dto.user.UserInfoDTO; 4 | import com.ming.m_blog.enums.LoginTypeEnum; 5 | import com.ming.m_blog.strategy.LoginStrategy; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.Map; 10 | 11 | 12 | /** 13 | * 第三方登录策略上下文 14 | * 15 | * @author ming 16 | * @date 2021/07/28 17 | */ 18 | @Service 19 | public class SocialLoginStrategyContext { 20 | 21 | @Autowired 22 | private Map loginStrategyMap; 23 | 24 | /** 25 | * 执行第三方登录策略 26 | *executeLoginStrategy 27 | * @param data 数据 28 | * @param loginTypeEnum 登录枚举类型 29 | * @return {@link UserInfoDTO} 用户信息 30 | */ 31 | public UserInfoDTO executeLoginStrategy(String data, LoginTypeEnum loginTypeEnum) { 32 | return loginStrategyMap.get(loginTypeEnum.getStrategy()).login(data); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/strategy/context/UploadFileContext.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.strategy.context; 2 | 3 | import com.ming.m_blog.enums.UploadFileModelEnum; 4 | import com.ming.m_blog.strategy.UploadStrategy; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.beans.factory.annotation.Value; 7 | import org.springframework.stereotype.Service; 8 | import org.springframework.web.multipart.MultipartFile; 9 | 10 | import java.util.Map; 11 | 12 | /** 13 | * 上传文件策略上下文 14 | * @author liuziming 15 | * @date 2023-4-12 16 | */ 17 | @Service 18 | public class UploadFileContext { 19 | 20 | @Value("${upload.mode}") 21 | private String mode; 22 | 23 | @Autowired 24 | private Map uploadStrategyMap; 25 | 26 | public String executeUploadStrategyMap(MultipartFile multipartFile,String relativePath){ 27 | return uploadStrategyMap.get(UploadFileModelEnum.getStrategy(mode)).uploadFile(multipartFile,relativePath); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/strategy/impl/AbstractSearchStrategy.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.strategy.impl; 2 | 3 | import com.ming.m_blog.vo.SearchVO; 4 | 5 | /** 6 | * 抽象搜索策略 7 | */ 8 | public abstract class AbstractSearchStrategy { 9 | 10 | /** 11 | * 搜索功能 12 | * @param keyword 搜索关键字 13 | * @return 搜索结果 14 | */ 15 | public abstract SearchVO search(String keyword); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/strategy/impl/MysqlSearchStrategyImpl.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.strategy.impl; 2 | 3 | import com.ming.m_blog.enums.SearchTypeEnum; 4 | import com.ming.m_blog.strategy.SearchStrategy; 5 | import com.ming.m_blog.vo.SearchVO; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.Map; 10 | 11 | /** 12 | * 本地MySQL搜索策略.注册器模式(使用map或者其他其他类型存储好后面要调用的对象) 13 | */ 14 | @Service("mysqlSearchStrategyImpl") 15 | public class MysqlSearchStrategyImpl implements SearchStrategy { 16 | 17 | /** 18 | * 搜索类型选择 19 | */ 20 | @Autowired 21 | private Map searchStrategyMap; 22 | 23 | public SearchVO search(String keyword, SearchTypeEnum searchTypeEnum) { 24 | return searchStrategyMap.get(searchTypeEnum.getStrategy()).search(keyword); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/utils/UUIDUtils.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.utils; 2 | 3 | import java.util.UUID; 4 | 5 | /** 6 | * UUID工具类 7 | */ 8 | public class UUIDUtils { 9 | 10 | 11 | public UUIDUtils() { 12 | } 13 | 14 | /** 15 | * 获得一个唯一性UUID 16 | * 17 | * @return String UUID 18 | */ 19 | public static String getUUID() { 20 | //去掉"-" 21 | return UUID.randomUUID().toString().replaceAll("-",""); 22 | 23 | //不去掉"-" 24 | // return UUID.randomUUID().toString(); 25 | } 26 | 27 | /** 28 | * 获得指定数目的UUID 29 | * 30 | * @param number int 需要获得的UUID数量 31 | * @return String[] UUID数组 32 | */ 33 | public static String[] getUUID(int number) { 34 | if (number < 1) { 35 | return null; 36 | } 37 | String[] ss = new String[number]; 38 | for (int i = 0; i < number; i++) { 39 | ss[i] = getUUID(); 40 | } 41 | return ss; 42 | } 43 | public static void main(String[] args){ 44 | String s = getUUID(); 45 | System.out.println(s); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/vo/ArticleListConditionVO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.vo; 2 | 3 | import lombok.Data; 4 | import lombok.Setter; 5 | 6 | /** 7 | * 查询文章列表参数 8 | */ 9 | @Data 10 | public class ArticleListConditionVO { 11 | 12 | /** 13 | * 分类id 14 | */ 15 | private Integer categoryId; 16 | 17 | /** 18 | * 标签id 19 | */ 20 | 21 | private Integer tagId; 22 | 23 | /** 24 | * 当前查询次数 25 | */ 26 | private Integer current; 27 | 28 | } 29 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/vo/ChangeArticleTopVO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.vo; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 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 | /** 12 | * 修改文章置顶状况VO 13 | */ 14 | @Data 15 | @Builder 16 | @NoArgsConstructor 17 | @AllArgsConstructor 18 | public class ChangeArticleTopVO { 19 | 20 | /** 21 | * 文章id 22 | */ 23 | @NotNull 24 | @ApiModelProperty(name = "articleId", value = "文章id", dataType = "Integer") 25 | private Integer articleId; 26 | 27 | /** 28 | * 要修改的指定情况 29 | */ 30 | @NotNull 31 | @ApiModelProperty(name = "isTop", value = "要修改的指定情况", dataType = "Integer") 32 | private Integer isTop; 33 | 34 | } 35 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/vo/ChangeUserInfoVO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.vo; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import javax.validation.constraints.NotNull; 9 | 10 | /** 11 | * 修改用户个人信息VO 12 | */ 13 | @Data 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | public class ChangeUserInfoVO { 17 | 18 | @NotNull 19 | @ApiModelProperty(name = "nickName",value = "用户昵称",required = true,dataType = "String") 20 | public String nickName; 21 | 22 | @NotNull 23 | @ApiModelProperty(name = "intro",value = "用户简介",required = true,dataType = "String") 24 | public String intro; 25 | 26 | } 27 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/vo/GithubLoginVO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.vo; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | @Data 10 | @AllArgsConstructor 11 | @NoArgsConstructor 12 | @Builder 13 | @ApiModel(description = "GitHub登录信息") 14 | public class GithubLoginVO { 15 | 16 | private String code; 17 | 18 | } 19 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/vo/LoginUserVO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.vo; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import javax.validation.constraints.Min; 9 | import javax.validation.constraints.NotNull; 10 | 11 | @Data 12 | @NotNull 13 | @NoArgsConstructor 14 | @AllArgsConstructor 15 | public class LoginUserVO { 16 | 17 | @NotNull 18 | @Min(value = 6,message = "用户名不能小于6位") 19 | @ApiModelProperty(name = "username",value = "用户名",required = true,dataType = "String") 20 | public String username; 21 | 22 | @NotNull 23 | @Min(value = 6,message = "密码不能小于6位") 24 | @ApiModelProperty(name = "password",value = "密码",required = true,dataType = "String") 25 | public String password; 26 | 27 | } 28 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/vo/PageResult.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.vo; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * 分页结果对象 12 | */ 13 | @Data 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | public class PageResult { 17 | 18 | @ApiModelProperty(name = "recordList",value = "分页对象",required = true,dataType = "String") 19 | private List recordList; 20 | 21 | @ApiModelProperty(name = "count",value = "所有数量",required = true,dataType = "Integer") 22 | private Integer count; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/vo/PasswordVO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.vo; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Data; 8 | import lombok.NoArgsConstructor; 9 | 10 | import javax.validation.constraints.NotBlank; 11 | import javax.validation.constraints.Size; 12 | 13 | /** 14 | * 后台修改密码 15 | * 16 | * @date 2023/02/19 17 | */ 18 | @Data 19 | @Builder 20 | @AllArgsConstructor 21 | @NoArgsConstructor 22 | @ApiModel(description = "密码") 23 | public class PasswordVO { 24 | 25 | /** 26 | * 旧密码 27 | */ 28 | @NotBlank(message = "旧密码不能为空") 29 | @ApiModelProperty(name = "oldPassword", value = "旧密码", required = true, dataType = "String") 30 | private String oldPassword; 31 | 32 | /** 33 | * 新密码 34 | */ 35 | @Size(min = 6, message = "新密码不能少于6位") 36 | @NotBlank(message = "新密码不能为空") 37 | @ApiModelProperty(name = "newPassword", value = "新密码", required = true, dataType = "String") 38 | private String newPassword; 39 | } 40 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/vo/QQLoginVO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.vo; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Data; 8 | import lombok.NoArgsConstructor; 9 | 10 | import javax.validation.constraints.NotBlank; 11 | 12 | /** 13 | * QQ登录VO 14 | * 15 | **/ 16 | @Data 17 | @AllArgsConstructor 18 | @NoArgsConstructor 19 | @Builder 20 | @ApiModel(description = "qq登录信息") 21 | public class QQLoginVO { 22 | 23 | /** 24 | * openid是此网站上唯一对应用户身份的标识 25 | */ 26 | @NotBlank(message = "openId不能为空") 27 | @ApiModelProperty(name = "openId", value = "qq openId", required = true, dataType = "String") 28 | private String openId; 29 | 30 | /** 31 | * accessToken:当前用户的口令 32 | */ 33 | @NotBlank(message = "accessToken不能为空") 34 | @ApiModelProperty(name = "accessToken", value = "qq accessToken", required = true, dataType = "String") 35 | private String accessToken; 36 | 37 | } 38 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/vo/RegisterVO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.vo; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | 6 | import javax.validation.constraints.Email; 7 | import javax.validation.constraints.NotBlank; 8 | import javax.validation.constraints.Size; 9 | 10 | /** 11 | * 用户注册VO 12 | */ 13 | @Data 14 | public class RegisterVO { 15 | 16 | /** 17 | * 用户邮箱 18 | */ 19 | @NotBlank(message = "邮箱不能为空") 20 | @Email(message = "邮箱格式不正确") 21 | @ApiModelProperty(name = "email",value = "用户邮箱",required = true,dataType = "String") 22 | private String email; 23 | 24 | /** 25 | * 用户密码 26 | */ 27 | @Size(min = 6,message = "密码不能小于6位") 28 | @NotBlank(message = "密码不能为空") 29 | @ApiModelProperty(name = "password",value = "用户密码",required = true,dataType = "String") 30 | private String password; 31 | 32 | /** 33 | * 邮箱验证码 34 | */ 35 | @NotBlank(message = "验证码不能为空") 36 | @ApiModelProperty(name = "code",value = "验证码",required = true,dataType = "String") 37 | private String code; 38 | 39 | } 40 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/vo/ReviewVO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.vo; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Data; 8 | import lombok.NoArgsConstructor; 9 | 10 | import javax.validation.constraints.NotNull; 11 | import java.util.List; 12 | 13 | /** 14 | * 修改留言审核状态对象 15 | * 16 | */ 17 | @Data 18 | @AllArgsConstructor 19 | @NoArgsConstructor 20 | @Builder 21 | @ApiModel(description = "审核") 22 | public class ReviewVO { 23 | 24 | /** 25 | * id列表 26 | */ 27 | @NotNull(message = "id不能为空") 28 | @ApiModelProperty(name = "idList", value = "id列表", required = true, dataType = "List") 29 | private List idList; 30 | 31 | /** 32 | * 状态值 33 | */ 34 | @NotNull(message = "状态值不能为空") 35 | @ApiModelProperty(name = "isDelete", value = "删除状态", required = true, dataType = "Integer") 36 | private Integer isReview; 37 | 38 | } 39 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/vo/SearchVO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.vo; 2 | 3 | import com.ming.m_blog.dto.search.SearchPictureDTO; 4 | import com.ming.m_blog.dto.search.ArticleSearchDTO; 5 | import com.ming.m_blog.dto.search.CategorySearchDTO; 6 | import com.ming.m_blog.dto.search.TagSearchDTO; 7 | import lombok.AllArgsConstructor; 8 | import lombok.Builder; 9 | import lombok.Data; 10 | import lombok.NoArgsConstructor; 11 | 12 | import java.util.List; 13 | 14 | @Data 15 | @NoArgsConstructor 16 | @AllArgsConstructor 17 | @Builder 18 | public class SearchVO { 19 | 20 | /** 21 | * 搜索的文章列表 22 | */ 23 | private List articleList; 24 | 25 | /** 26 | * 搜索分类列表 27 | */ 28 | private List categoryList; 29 | 30 | /** 31 | * 搜索标签列表 32 | */ 33 | private List tagList; 34 | 35 | 36 | /** 37 | * 搜索图片列表 38 | */ 39 | private List pictureList; 40 | } 41 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/vo/UpdateUserDeleteVO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.vo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * 修改用户封禁状态 9 | */ 10 | @Data 11 | @AllArgsConstructor 12 | @NoArgsConstructor 13 | public class UpdateUserDeleteVO { 14 | 15 | /** 16 | * 用户id 17 | */ 18 | private Integer userId; 19 | 20 | /** 21 | * 删除之前的isDelete标记 22 | */ 23 | private Integer isDelete; 24 | 25 | } 26 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/vo/UserEmailVO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.vo; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Data; 8 | import lombok.NoArgsConstructor; 9 | 10 | /** 11 | * 修改用户邮箱绑定 12 | */ 13 | @Data 14 | @Builder 15 | @NoArgsConstructor 16 | @AllArgsConstructor 17 | @ApiModel(description = "修改绑定邮箱对象") 18 | public class UserEmailVO { 19 | 20 | // 发送的验证码 21 | @ApiModelProperty(name = "code", value = "验证码", required = true, dataType = "String") 22 | private String code; 23 | 24 | // 修改后的邮箱 25 | @ApiModelProperty(name = "email", value = "修改后的邮箱", required = true, dataType = "String") 26 | private String email; 27 | 28 | } 29 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/java/com/ming/m_blog/vo/UserSimpInfoVO.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog.vo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * 登陆后获取用户基本信息 12 | */ 13 | @Data 14 | @Builder 15 | @NoArgsConstructor 16 | @AllArgsConstructor 17 | public class UserSimpInfoVO { 18 | 19 | // 角色 20 | private List roles; 21 | 22 | // 名称 23 | private String name; 24 | 25 | // 头像 26 | private String avatar; 27 | 28 | // 简介 29 | private String introduction; 30 | } 31 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8080 3 | servlet: 4 | session: 5 | # 设置session过期时间,6个小时 6 | timeout: 21600 7 | # tomcat: 8 | # connection-timeout: 18000000 9 | 10 | # 选择使用开发环境还是生产环境 11 | spring: 12 | profiles: 13 | active: prod 14 | 15 | chatgpt: 16 | api: 17 | proxy-port: 7890 18 | proxy-url: 127.0.0.1 19 | api-key: 你的chatGPT API 20 | chat-largest-context: 20 21 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/resources/mapper/ChatRecordMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/resources/mapper/InArticleTagMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/resources/mapper/InRolePowerMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/resources/mapper/InUserRoleMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/resources/mapper/PageMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/resources/mapper/PowerMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/resources/mapper/RoleMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/resources/mapper/UniqueViewMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 16 | 17 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/resources/mapper/UserAuthMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 14 | 15 | -------------------------------------------------------------------------------- /m-blog-springboot/src/main/resources/mapper/WebsiteConfigMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /m-blog-springboot/src/test/java/com/ming/m_blog/BlogTest.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog; 2 | 3 | import com.ming.m_blog.dto.BlogInfoDTO; 4 | import com.ming.m_blog.service.BlogService; 5 | import com.ming.m_blog.utils.IpUtils; 6 | import org.junit.jupiter.api.Test; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.boot.test.context.SpringBootTest; 9 | 10 | @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 11 | public class BlogTest { 12 | 13 | @Autowired 14 | private BlogService blogService; 15 | 16 | // 查询博客基本信息 17 | @Test 18 | public void selectBlogInfo(){ 19 | BlogInfoDTO blogInfo = blogService.getBlogInfo(); 20 | System.out.println(blogInfo); 21 | } 22 | 23 | // 测试ip地址 24 | @Test 25 | public void ipTest(){ 26 | String ipSource = IpUtils.getIpSource("192.168.1.105"); 27 | System.out.println(ipSource); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /m-blog-springboot/src/test/java/com/ming/m_blog/CategoryTest.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog; 2 | 3 | import com.ming.m_blog.dto.CategoryDTO; 4 | import com.ming.m_blog.service.CategoryService; 5 | import com.ming.m_blog.vo.PageResult; 6 | import org.junit.jupiter.api.Test; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.boot.test.context.SpringBootTest; 9 | 10 | import java.util.List; 11 | 12 | @SpringBootTest 13 | public class CategoryTest { 14 | 15 | @Autowired 16 | private CategoryService categoryService; 17 | 18 | @Test 19 | void addCategory(){ 20 | String categoryName = "测试分类"; 21 | int i = categoryService.addCateGory(categoryName); 22 | if (i>0){ 23 | System.out.println("添加分类成功"); 24 | }else { 25 | System.out.println("添加分类失败"); 26 | } 27 | } 28 | 29 | @Test 30 | void listCategory(){ 31 | PageResult categoryDTOPageResult = categoryService.listCategory(); 32 | categoryDTOPageResult.getRecordList().forEach(System.out::println); 33 | } 34 | 35 | 36 | } 37 | -------------------------------------------------------------------------------- /m-blog-springboot/src/test/java/com/ming/m_blog/TagTest.java: -------------------------------------------------------------------------------- 1 | package com.ming.m_blog; 2 | 3 | import com.ming.m_blog.dto.TagListDTO; 4 | import com.ming.m_blog.dto.TagSimpleDTO; 5 | import com.ming.m_blog.service.TagService; 6 | import com.ming.m_blog.vo.PageResult; 7 | import org.junit.jupiter.api.Test; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.boot.test.context.SpringBootTest; 10 | 11 | import java.util.List; 12 | 13 | @SpringBootTest 14 | public class TagTest { 15 | 16 | @Autowired 17 | private TagService tagService; 18 | 19 | @Test 20 | void getTagList(){ 21 | List tagList = tagService.getTagList(1, 2, ""); 22 | tagList.forEach(System.out::println); 23 | } 24 | 25 | @Test 26 | void tags(){ 27 | PageResult tags = tagService.getTags(); 28 | System.out.println(tags); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /m-blog/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # Editor directories and files 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /m-blog/README.md: -------------------------------------------------------------------------------- 1 | # m-blag 2 | 3 | ## Project setup 4 | ``` 5 | npm install 6 | ``` 7 | 8 | ### Compiles and hot-reloads for development 9 | ``` 10 | npm run serve 11 | ``` 12 | 13 | ### Compiles and minifies for production 14 | ``` 15 | npm run build 16 | ``` 17 | 18 | ### Lints and fixes files 19 | ``` 20 | npm run lint 21 | ``` 22 | 23 | ### Customize configuration 24 | See [Configuration Reference](https://cli.vuejs.org/config/). 25 | -------------------------------------------------------------------------------- /m-blog/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /m-blog/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "esnext", 5 | "baseUrl": "./", 6 | "moduleResolution": "node", 7 | "paths": { 8 | "@/*": [ 9 | "src/*" 10 | ] 11 | }, 12 | "lib": [ 13 | "esnext", 14 | "dom", 15 | "dom.iterable", 16 | "scripthost" 17 | ] 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /m-blog/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/m-blog/public/favicon.ico -------------------------------------------------------------------------------- /m-blog/src/assets/css/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/m-blog/src/assets/css/iconfont.eot -------------------------------------------------------------------------------- /m-blog/src/assets/css/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/m-blog/src/assets/css/iconfont.ttf -------------------------------------------------------------------------------- /m-blog/src/assets/css/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/m-blog/src/assets/css/iconfont.woff -------------------------------------------------------------------------------- /m-blog/src/assets/css/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/m-blog/src/assets/css/iconfont.woff2 -------------------------------------------------------------------------------- /m-blog/src/assets/css/iconfont_github.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/m-blog/src/assets/css/iconfont_github.ttf -------------------------------------------------------------------------------- /m-blog/src/assets/css/vue-social-share/static/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/m-blog/src/assets/css/vue-social-share/static/iconfont.eot -------------------------------------------------------------------------------- /m-blog/src/assets/css/vue-social-share/static/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/m-blog/src/assets/css/vue-social-share/static/iconfont.ttf -------------------------------------------------------------------------------- /m-blog/src/assets/css/vue-social-share/static/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/m-blog/src/assets/css/vue-social-share/static/iconfont.woff -------------------------------------------------------------------------------- /m-blog/src/assets/js/config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | QQ_APP_ID: "102045697", 3 | QQ_REDIRECT_URI: "http://www.mingzib.xyz/oauth/login/qq", 4 | // WEIBO_APP_ID: "4039197195", 5 | // WEIBO_REDIRECT_URI: "https://www.talkxj.com/oauth/login/weibo", 6 | GITHUB_CLIENT_ID: "f7c8010b220442b31d07", 7 | GITHUB_REDIRECT_URI: "http://localhost:8000/oauth/login/GitHub", 8 | TENCENT_CAPTCHA: "2088053498" 9 | }; 10 | -------------------------------------------------------------------------------- /m-blog/src/assets/js/global.js: -------------------------------------------------------------------------------- 1 | export default{ 2 | 3 | // ADMIN_URL : 'http://localhost:8082/' 4 | ADMIN_URL : 'http://www.admin.mingzib.xyz/', 5 | 6 | // 聊天室图片 7 | CHAT_ROOM : 'http://www.static.mingzib.xyz/blogUploadFile/configImage/chatRoomImg.png' 8 | 9 | } 10 | -------------------------------------------------------------------------------- /m-blog/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Myhare/Blog/3651cbe0908895cd080e424a238c357daeb77619/m-blog/src/assets/logo.png -------------------------------------------------------------------------------- /m-blog/src/assets/logo.svg: -------------------------------------------------------------------------------- 1 | Artboard 46 2 | -------------------------------------------------------------------------------- /m-blog/src/components/toast/Toast.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 37 | -------------------------------------------------------------------------------- /m-blog/src/components/toast/index.js: -------------------------------------------------------------------------------- 1 | import ToastComponent from "./Toast.vue"; // 引入先前写好的vue 2 | 3 | const Toast = {}; 4 | 5 | // 注册Toast 6 | Toast.install = function(Vue) { 7 | // 生成一个Vue的子类 8 | const ToastConstructor = Vue.extend(ToastComponent); 9 | // 生成一个该子类的实例 10 | const instance = new ToastConstructor(); 11 | 12 | // 将这个实例挂载在我创建的div上 13 | // 并将此div加入全局挂载点内部 14 | instance.$mount(document.createElement("div")); 15 | document.body.appendChild(instance.$el); 16 | 17 | // 通过Vue的原型注册一个方法 18 | // 让所有实例共享这个方法
// 其中的duration是持续时间 19 | Vue.prototype.$toast = (options, duration = 2000) => { 20 | instance.message = options.message; 21 | instance.type = options.type; 22 | instance.show = true; 23 | 24 | setTimeout(() => { 25 | instance.show = false; 26 | }, duration); 27 | }; 28 | }; 29 | 30 | export default Toast; 31 | -------------------------------------------------------------------------------- /m-blog/src/plugins/vuetify.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuetify from 'vuetify/lib/framework'; 3 | 4 | Vue.use(Vuetify); 5 | 6 | export default new Vuetify({ 7 | }); 8 | -------------------------------------------------------------------------------- /m-blog/vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transpileDependencies: [ 3 | 'vuetify' 4 | ], 5 | devServer: { 6 | port: 8000, 7 | compress:false, 8 | proxy: { 9 | "/api": { 10 | target: "http://localhost:8080", 11 | changeOrigin: true, 12 | pathRewrite: { 13 | "^/api": "" 14 | } 15 | } 16 | }, 17 | // disableHostCheck: true 18 | historyApiFallback: true, 19 | allowedHosts: 'all' 20 | }, 21 | lintOnSave: false, 22 | // 将websocket.config.js中的配置对象合并到Webpack配置中 23 | // fallback(回退)策略,即当Webpack无法解析一个模块路径时,会尝试使用fallback中指定的模块路径进行解析 24 | // 弹幕组件中需要使用timers-browserify,当Webpack无法解析timers模块路径时,会自动使用timers-browserify模块的路径进行解析,避免报错 25 | chainWebpack: config => { 26 | config.merge({ 27 | resolve: { 28 | fallback: { 29 | "timers": require.resolve("timers-browserify") 30 | } 31 | } 32 | }); 33 | } 34 | } 35 | --------------------------------------------------------------------------------