bigcat 2 лет назад
Сommit
239c27c285
83 измененных файлов с 3404 добавлено и 0 удалено
  1. 140 0
      pom.xml
  2. 19 0
      src/main/java/sqgxy/xxydz/SqgxyXxydzNewsApplication.java
  3. 36 0
      src/main/java/sqgxy/xxydz/config/CorsConfig.java
  4. 25 0
      src/main/java/sqgxy/xxydz/config/ModelMapperConfig.java
  5. 31 0
      src/main/java/sqgxy/xxydz/config/MyConfig.java
  6. 28 0
      src/main/java/sqgxy/xxydz/config/MybatisPlusConfig.java
  7. 48 0
      src/main/java/sqgxy/xxydz/config/SwaggerConfig.java
  8. 39 0
      src/main/java/sqgxy/xxydz/config/ZeusExceptionHandler.java
  9. 82 0
      src/main/java/sqgxy/xxydz/controller/AdminInformationController.java
  10. 123 0
      src/main/java/sqgxy/xxydz/controller/EchartsController.java
  11. 75 0
      src/main/java/sqgxy/xxydz/controller/InformationController.java
  12. 45 0
      src/main/java/sqgxy/xxydz/controller/LoginController.java
  13. 68 0
      src/main/java/sqgxy/xxydz/controller/NewsCategoryController.java
  14. 80 0
      src/main/java/sqgxy/xxydz/controller/NewsController.java
  15. 55 0
      src/main/java/sqgxy/xxydz/controller/NewsTypeController.java
  16. 31 0
      src/main/java/sqgxy/xxydz/controller/OperationController.java
  17. 107 0
      src/main/java/sqgxy/xxydz/controller/XdStarController.java
  18. 35 0
      src/main/java/sqgxy/xxydz/dto/AdminInformationDTO.java
  19. 25 0
      src/main/java/sqgxy/xxydz/dto/AdminInformationSaveDTO.java
  20. 24 0
      src/main/java/sqgxy/xxydz/dto/AdminInformationUpdateDTO.java
  21. 32 0
      src/main/java/sqgxy/xxydz/dto/NewsAddDTO.java
  22. 24 0
      src/main/java/sqgxy/xxydz/dto/NewsCategoryDTO.java
  23. 24 0
      src/main/java/sqgxy/xxydz/dto/NewsCategoryQueryAllDTO.java
  24. 22 0
      src/main/java/sqgxy/xxydz/dto/NewsCategorySaveDTO.java
  25. 50 0
      src/main/java/sqgxy/xxydz/dto/NewsPaging.java
  26. 29 0
      src/main/java/sqgxy/xxydz/dto/NewsQueryDTO.java
  27. 27 0
      src/main/java/sqgxy/xxydz/dto/NewsQueryListDTO.java
  28. 28 0
      src/main/java/sqgxy/xxydz/dto/NewsTypeDTO.java
  29. 35 0
      src/main/java/sqgxy/xxydz/dto/NewsUpdateDTO.java
  30. 26 0
      src/main/java/sqgxy/xxydz/dto/Principal.java
  31. 22 0
      src/main/java/sqgxy/xxydz/dto/XdstarPageDto.java
  32. 49 0
      src/main/java/sqgxy/xxydz/entity/AdminInformation.java
  33. 56 0
      src/main/java/sqgxy/xxydz/entity/Information.java
  34. 63 0
      src/main/java/sqgxy/xxydz/entity/News.java
  35. 49 0
      src/main/java/sqgxy/xxydz/entity/NewsCategory.java
  36. 40 0
      src/main/java/sqgxy/xxydz/entity/NewsType.java
  37. 55 0
      src/main/java/sqgxy/xxydz/entity/XdStar.java
  38. 27 0
      src/main/java/sqgxy/xxydz/enums/AdminRole.java
  39. 28 0
      src/main/java/sqgxy/xxydz/enums/DisplayContent.java
  40. 25 0
      src/main/java/sqgxy/xxydz/enums/ResultCode.java
  41. 16 0
      src/main/java/sqgxy/xxydz/exception/HintException.java
  42. 13 0
      src/main/java/sqgxy/xxydz/mapper/AdminInformationMapper.java
  43. 14 0
      src/main/java/sqgxy/xxydz/mapper/InformationMapper.java
  44. 13 0
      src/main/java/sqgxy/xxydz/mapper/NewsCategoryMapper.java
  45. 13 0
      src/main/java/sqgxy/xxydz/mapper/NewsMapper.java
  46. 13 0
      src/main/java/sqgxy/xxydz/mapper/NewsTypeMapper.java
  47. 15 0
      src/main/java/sqgxy/xxydz/mapper/XdStarMapper.java
  48. 63 0
      src/main/java/sqgxy/xxydz/module/HeaderImgUpload.java
  49. 13 0
      src/main/java/sqgxy/xxydz/permission/PermissionException.java
  50. 18 0
      src/main/java/sqgxy/xxydz/permission/annotation/GeneralAdmin.java
  51. 17 0
      src/main/java/sqgxy/xxydz/permission/annotation/Permission.java
  52. 21 0
      src/main/java/sqgxy/xxydz/permission/annotation/SuperAdmin.java
  53. 68 0
      src/main/java/sqgxy/xxydz/permission/aspect/AdminAspect.java
  54. 58 0
      src/main/java/sqgxy/xxydz/service/AdminInformationService.java
  55. 11 0
      src/main/java/sqgxy/xxydz/service/InformationService.java
  56. 53 0
      src/main/java/sqgxy/xxydz/service/NewsCategoryService.java
  57. 65 0
      src/main/java/sqgxy/xxydz/service/NewsService.java
  58. 42 0
      src/main/java/sqgxy/xxydz/service/NewsTypeService.java
  59. 19 0
      src/main/java/sqgxy/xxydz/service/XdStarService.java
  60. 86 0
      src/main/java/sqgxy/xxydz/service/impl/AdminInformationServiceImpl.java
  61. 16 0
      src/main/java/sqgxy/xxydz/service/impl/InformationServiceImpl.java
  62. 87 0
      src/main/java/sqgxy/xxydz/service/impl/NewsCategoryServiceImpl.java
  63. 132 0
      src/main/java/sqgxy/xxydz/service/impl/NewsServiceImpl.java
  64. 63 0
      src/main/java/sqgxy/xxydz/service/impl/NewsTypeServiceImpl.java
  65. 62 0
      src/main/java/sqgxy/xxydz/service/impl/XdStarServiceImpl.java
  66. 74 0
      src/main/java/sqgxy/xxydz/shiro/MyRealm.java
  67. 51 0
      src/main/java/sqgxy/xxydz/shiro/ShiroConfig.java
  68. 20 0
      src/main/java/sqgxy/xxydz/util/HashUtils.java
  69. 16 0
      src/main/java/sqgxy/xxydz/util/ShiroUtils.java
  70. 75 0
      src/main/java/sqgxy/xxydz/vo/Result.java
  71. 25 0
      src/main/java/sqgxy/xxydz/vo/admin/AdminInformationAddVO.java
  72. 28 0
      src/main/java/sqgxy/xxydz/vo/admin/AdminInformationUpdateVO.java
  73. 30 0
      src/main/java/sqgxy/xxydz/vo/admin/AdminInformationVO.java
  74. 28 0
      src/main/java/sqgxy/xxydz/vo/news/NewsAddVO.java
  75. 33 0
      src/main/java/sqgxy/xxydz/vo/news/NewsUpdateVO.java
  76. 30 0
      src/main/java/sqgxy/xxydz/vo/news/PagingFuzzyQueryListByTitleVO.java
  77. 27 0
      src/main/java/sqgxy/xxydz/vo/news/PagingQueryListByNewsCategoryIdVO.java
  78. 22 0
      src/main/java/sqgxy/xxydz/vo/news/category/NewsCategoryAddVO.java
  79. 22 0
      src/main/java/sqgxy/xxydz/vo/news/category/NewsCategoryListVO.java
  80. 24 0
      src/main/java/sqgxy/xxydz/vo/news/category/NewsCategoryUpdateVO.java
  81. 19 0
      src/main/java/sqgxy/xxydz/vo/news/type/NewsTypeVO.java
  82. 44 0
      src/main/resources/application.yml
  83. 18 0
      src/test/java/sqgxy/xxydz/SqgxyXxydzNewsApplicationTests.java

+ 140 - 0
pom.xml

@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.5.3</version>
+        <relativePath/>
+    </parent>
+
+    <groupId>sqgxy.xxydz</groupId>
+    <artifactId>sqgxy-xxydz-news</artifactId>
+    <version>1.0.2-SNAPSHOT</version>
+    <name>sqgxy-xxydz-news</name>
+    <description>商丘工学院-信电分院-新闻网</description>
+
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <!--热部署-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <scope>runtime</scope>
+            <optional>true</optional>
+        </dependency>
+
+        <!--yaml配置文件自动提示-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <!--lombok-->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <!--数据库驱动-->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>5.1.47</version>
+        </dependency>
+
+        <!--数据库连接池-->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>1.1.17</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.3.2</version>
+        </dependency>
+
+        <!--modelMapper-->
+        <dependency>
+            <groupId>org.modelmapper</groupId>
+            <artifactId>modelmapper</artifactId>
+            <version>2.3.0</version>
+        </dependency>
+
+        <!--swagger-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>2.9.2</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>2.9.2</version>
+        </dependency>
+
+        <!--整合shiro-->
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-spring</artifactId>
+            <version>1.7.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+
+        <!-- hutool  -->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.7.20</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>4.1.2</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok</artifactId>
+                        </exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 19 - 0
src/main/java/sqgxy/xxydz/SqgxyXxydzNewsApplication.java

@@ -0,0 +1,19 @@
+package sqgxy.xxydz;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@SpringBootApplication
+@MapperScan("sqgxy.xxydz.mapper")
+@EnableTransactionManagement
+@EnableAspectJAutoProxy
+public class SqgxyXxydzNewsApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(SqgxyXxydzNewsApplication.class, args);
+    }
+
+}

+ 36 - 0
src/main/java/sqgxy/xxydz/config/CorsConfig.java

@@ -0,0 +1,36 @@
+package sqgxy.xxydz.config;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 15:03
+ * Cors 跨域配置文件
+ */
+
+@Configuration
+@Slf4j
+public class CorsConfig  {
+
+    @Bean
+    public WebMvcConfigurer webMvcConfigurer()  {
+        return new WebMvcConfigurer() {
+            @Override
+            public void addCorsMappings(CorsRegistry registry) {
+                registry.addMapping("/**")	// 允许跨域访问的路径
+                        .allowCredentials(true) // 解决请求带上Cookie信息
+                        .allowedOriginPatterns("*")	// 允许跨域访问的源
+                        .allowedMethods("GET", "POST", "OPTIONS","PUT","DELETE")
+                        .maxAge(60)	// 预检间隔时间
+                        .allowedHeaders("authorization", "Content-Type") // 允许头部设置
+                        .exposedHeaders()
+                        .allowCredentials(Boolean.TRUE);	// 是否发送cookie
+            }
+        };
+    }
+
+}

+ 25 - 0
src/main/java/sqgxy/xxydz/config/ModelMapperConfig.java

@@ -0,0 +1,25 @@
+package sqgxy.xxydz.config;
+
+import org.modelmapper.ModelMapper;
+import org.modelmapper.convention.MatchingStrategies;
+import org.modelmapper.spi.MatchingStrategy;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 19:21
+ */
+@Configuration
+public class ModelMapperConfig {
+
+    @Bean
+    public ModelMapper modelMapper() {
+        ModelMapper modelMapper = new ModelMapper();
+        // 完全匹配模式
+        modelMapper.getConfiguration().setFullTypeMatchingRequired(true);
+        // 匹配策略使用严格模式
+        modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
+        return modelMapper;
+    }
+}

+ 31 - 0
src/main/java/sqgxy/xxydz/config/MyConfig.java

@@ -0,0 +1,31 @@
+package sqgxy.xxydz.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import java.io.File;
+
+/**
+ * @author xmp
+ * @date 2022-11-22 14:23
+ */
+
+//请求 放行  静态资源放行
+@Configuration
+public class MyConfig implements WebMvcConfigurer {
+
+    /**
+     * 重写静态资源访问处理路径
+     */
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        String property = System.getProperty("user.dir");
+        File file = new File(property, "static");
+        String path = "file:" + file + File.separator;
+        registry.addResourceHandler("/**").addResourceLocations("classpath:META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/", path);
+    }
+}
+
+
+

+ 28 - 0
src/main/java/sqgxy/xxydz/config/MybatisPlusConfig.java

@@ -0,0 +1,28 @@
+package sqgxy.xxydz.config;
+
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author xmp
+ * @date 2022-11-21 19:10
+ * MyBatis-Plus配置
+ */
+@Configuration
+public class MybatisPlusConfig {
+
+    // 旧版
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
+        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
+        // paginationInterceptor.setOverflow(false);
+        // 设置最大单页限制数量,默认 500 条,-1 不受限制
+        // paginationInterceptor.setLimit(500);
+        // 开启 count 的 join 优化,只针对部分 left join
+        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
+        return paginationInterceptor;
+    }
+}

+ 48 - 0
src/main/java/sqgxy/xxydz/config/SwaggerConfig.java

@@ -0,0 +1,48 @@
+package sqgxy.xxydz.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 21:23
+ * Swagger配置
+ */
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig {
+
+    @Bean
+    public Docket webApiConfig(ApiInfo apiInfo) {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo)
+                .groupName("xmp")
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("sqgxy.xxydz.controller"))
+                .paths(PathSelectors.any())
+                .build();
+    }
+
+    @Bean
+    public ApiInfo webAipInfo() {
+        return new ApiInfoBuilder()
+                .title("商丘工学院-信电分院-新闻网")
+                .description("本文档描述了后端接口API定义")
+                .version("1.0.3")
+                .contact(
+                        new Contact
+                                ("@xmp", "https://blog.csdn.net/qq_53463544?spm=1000.2115.3001.5343", "xmp0526@162.com")
+                )
+                .build();
+    }
+
+}
+

+ 39 - 0
src/main/java/sqgxy/xxydz/config/ZeusExceptionHandler.java

@@ -0,0 +1,39 @@
+package sqgxy.xxydz.config;
+
+import sqgxy.xxydz.exception.HintException;
+import sqgxy.xxydz.permission.PermissionException;
+import sqgxy.xxydz.vo.Result;
+import org.apache.shiro.authc.IncorrectCredentialsException;
+import org.apache.shiro.authc.UnknownAccountException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 15:07
+ * 异常处理
+ */
+@RestControllerAdvice
+public class ZeusExceptionHandler {
+
+    @ExceptionHandler(value = HintException.class)
+    public Result hintExceptionHandler(HintException e) {
+        return new Result().fail(e.getMessage());
+    }
+
+    @ExceptionHandler(value = Exception.class)
+    public Result exception(Exception e) {
+        return new Result().fail(e.getMessage());
+    }
+
+    @ExceptionHandler(value = {UnknownAccountException.class, IncorrectCredentialsException.class})
+    public Result UnknownAccountException(Exception e) {
+        return new Result().fail("用户名或密码错误");
+    }
+
+    @ExceptionHandler(value = PermissionException.class)
+    public Result PermissionException(Exception e) {
+        return new Result().insufficientPermissions(e.getMessage());
+    }
+
+}

+ 82 - 0
src/main/java/sqgxy/xxydz/controller/AdminInformationController.java

@@ -0,0 +1,82 @@
+package sqgxy.xxydz.controller;
+
+import org.springframework.web.bind.annotation.*;
+import sqgxy.xxydz.dto.AdminInformationSaveDTO;
+import sqgxy.xxydz.dto.AdminInformationUpdateDTO;
+import sqgxy.xxydz.entity.AdminInformation;
+import sqgxy.xxydz.permission.annotation.GeneralAdmin;
+import sqgxy.xxydz.permission.annotation.SuperAdmin;
+import sqgxy.xxydz.service.AdminInformationService;
+import sqgxy.xxydz.vo.Result;
+import sqgxy.xxydz.vo.admin.AdminInformationAddVO;
+import sqgxy.xxydz.vo.admin.AdminInformationUpdateVO;
+import sqgxy.xxydz.vo.admin.AdminInformationVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.modelmapper.ModelMapper;
+import org.modelmapper.TypeToken;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.List;
+
+/**
+ * @author xmp
+ * @date 2022-11-23 18:45
+ */
+@Api(tags = "管理员操作")
+@RestController
+@RequestMapping("/admin")
+public class AdminInformationController {
+
+    @Autowired
+    private AdminInformationService adminInformationService;
+
+    @Autowired
+    private ModelMapper modelMapper;
+
+    @SuperAdmin
+    @ApiOperation(value = "添加普通管理员")
+    @PostMapping("/add")
+    public Result addAdminInformation(AdminInformationAddVO vo) {
+        return new Result().ok().data(adminInformationService.saveAdminInformation(modelMapper.map(vo, AdminInformationSaveDTO.class)));
+    }
+
+    @SuperAdmin
+    @ApiOperation(value = "删除普通管理员")
+    @PostMapping("/delete")
+    public Result deleteAdminInformation(Integer id) {
+        return new Result().ok().data(adminInformationService.removeAdminInformationById(id));
+    }
+
+    @ApiOperation(value = "修改管理员密码")
+    @PostMapping("/updatePassword")
+    @GeneralAdmin
+    public Result updateAdminPassword(AdminInformationUpdateVO vo) {
+        // 校验密码
+        adminInformationService.checkPassword(vo.getUsername(), vo.getOldPassword());
+
+        return new Result().ok().data(adminInformationService.updateAdminInformation(modelMapper.map(vo, AdminInformationUpdateDTO.class)));
+    }
+
+    @ApiOperation(value = "获得普通管理员列表")
+    @GetMapping("/list")
+    @SuperAdmin
+    public Result getAdminInformationList() {
+        return new Result().ok().data(modelMapper.map(adminInformationService.getAdminInformationList(), new TypeToken<List<AdminInformationVO>>(){}.getType()));
+    }
+
+    @ApiOperation(value = "获得全部管理员列表")
+    @GetMapping("/all")
+    public Result getAll() {
+        List<AdminInformation> list = adminInformationService.list();
+       return new Result().ok().data(list);
+    }
+
+    @ApiOperation(value = "根据id查询管理员列表")
+    @GetMapping("/{id}")
+    public Result getOne(@PathVariable Integer id){
+        AdminInformation byId = adminInformationService.getById(id);
+        return new Result().ok().data(byId);
+    }
+
+}

+ 123 - 0
src/main/java/sqgxy/xxydz/controller/EchartsController.java

@@ -0,0 +1,123 @@
+package sqgxy.xxydz.controller;
+
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import sqgxy.xxydz.entity.News;
+import sqgxy.xxydz.service.AdminInformationService;
+import sqgxy.xxydz.service.NewsCategoryService;
+import sqgxy.xxydz.service.NewsService;
+import sqgxy.xxydz.service.NewsTypeService;
+import sqgxy.xxydz.vo.Result;
+
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * * @author ljz
+ * @date 2022-11-30 11:45
+ */
+
+@Api(tags = "Echarts图标操作")
+@RestController
+@RequestMapping("/echarts")
+public class EchartsController {
+
+    @Autowired
+    private AdminInformationService adminInformationService;
+
+    @Autowired
+    NewsService newsService;
+
+    @Autowired
+    NewsTypeService newsTypeService;
+
+    @Autowired
+    NewsCategoryService newsCategoryService;
+
+    /**
+     * 得到用户总数
+     *
+     * @return
+     */
+    @GetMapping("/usernums")
+    public Result getUserNums() {
+        int count = adminInformationService.count();
+        return new Result().ok().data(count);
+    }
+
+    /**
+     * 得到新闻总数
+     *
+     * @return
+     */
+    @GetMapping("/newsnums")
+    public Result getNewsNums() {
+        int count = newsService.count();
+        return new Result().ok().data(count);
+    }
+
+    /**
+     * 得到一级标题的数量
+     *
+     * @return
+     */
+    @GetMapping("/h1nums")
+    public Result getH1Nums() {
+        int count = newsTypeService.count();
+        return new Result().ok().data(count);
+    }
+
+    /**
+     * 得到二级标题的数量
+     *
+     * @return
+     */
+    @GetMapping("/h2nums")
+    public Result getH2Nums() {
+        int count = newsCategoryService.count();
+        return new Result().ok().data(count);
+    }
+
+    /**
+     * 折线图
+     * @return
+     */
+    @GetMapping("line")
+    public  Result getLine(){
+        List<News> list = newsService.list();
+        int MonNums=0;
+        int TusNums=0;
+        int WedNums=0;
+        int ThuNums=0;
+        int  FriNums=0;
+        int  SatNums=0;
+        int  SunNums=0;
+        for (News news : list) {
+            Date createTime = news.getCreateTime();
+            String s = createTime.toString().substring(0,3);
+            switch (s){
+                case "Mon": MonNums++;  break;
+                case "Tus": TusNums++;  break;
+                case "Wed": WedNums++;  break;
+                case "Thu": ThuNums++;  break;
+                case "Fri": FriNums++;  break;
+                case "Sat": SatNums++;  break;
+                case "Sun": SunNums++;  break;
+            }
+        }
+        int[] array =new int[7];
+        array[0]=MonNums;
+        array[1]=TusNums;
+        array[2]=WedNums;
+        array[3]=ThuNums;
+        array[4]=FriNums;
+        array[5]=SatNums;
+        array[6]=SunNums;
+        return new Result().ok().data(array);
+    }
+
+}

+ 75 - 0
src/main/java/sqgxy/xxydz/controller/InformationController.java

@@ -0,0 +1,75 @@
+package sqgxy.xxydz.controller;
+
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import sqgxy.xxydz.entity.Information;
+import sqgxy.xxydz.service.InformationService;
+import sqgxy.xxydz.vo.Result;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author xmp
+ * @date 2022-11-14 00:25
+ */
+
+@Api(tags = "学院联系方式")
+@RestController
+@RequestMapping("/Information")
+public class InformationController {
+
+    @Autowired
+    InformationService informationService;
+
+    @ApiOperation(value = "查询所有学院联系方式")
+    @GetMapping("/all")
+    public Result getAll(){
+        List<Information> list = informationService.list();
+        return new Result().ok().data(list);
+    }
+
+    @ApiOperation(value = "根据Id查询学院联系方式")
+    @GetMapping("/{id}")
+    public Result getOne(@PathVariable Integer id){
+        Information byId = informationService.getById(id);
+        return new Result().ok().data(byId);
+    }
+
+
+    @ApiOperation(value = "添加学院联系方式")
+    @PutMapping
+    public Result save(@RequestBody Information information ){
+        information.setCreateTime(new Date());
+        boolean issave = informationService.save(information);
+        if (issave){
+            return new Result().ok();
+        }
+        return new Result().fail("添加失败!");
+    }
+
+    @ApiOperation(value = "删除学院联系方式")
+    @DeleteMapping("/{id}")
+    public Result delete(@PathVariable Integer id){
+        boolean isremove = informationService.removeById(id);
+        if (isremove){
+            return new Result().ok();
+        }
+        return new Result().fail("删除失败!");
+    }
+
+    @ApiOperation(value = "修改学院联系方式")
+    @PostMapping
+    public Result updateById(@RequestBody Information information ){
+        information.setUpdateTime(new Date());
+        boolean b = informationService.updateById(information);
+        if (b){
+            return new Result().ok();
+        }
+        return  new Result().fail("修改失败!");
+    }
+
+}

+ 45 - 0
src/main/java/sqgxy/xxydz/controller/LoginController.java

@@ -0,0 +1,45 @@
+package sqgxy.xxydz.controller;
+
+import sqgxy.xxydz.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.apache.shiro.subject.Subject;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author xmp
+ * @date 2022-11-23 15:41
+ */
+@Api(tags = "登录")
+@RestController
+@Slf4j
+public class LoginController {
+
+    @ApiOperation(value = "登录")
+    @PostMapping("/login")
+    public Result login(String username, String password) {
+        System.out.println(username);
+        System.out.println(password);
+        Subject subject = SecurityUtils.getSubject();
+        // 登陆过先退出
+        if (subject.isAuthenticated()) {
+            subject.logout();
+        }
+        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
+        subject.login(token);
+        log.info("{}登录成功 sessionID:{}", subject.getPrincipal(), subject.getSession().getId());
+        return new Result().ok().data(subject.getPrincipal()).cookie(subject.getSession().getId().toString());
+    }
+
+    @ApiOperation(value = "注销")
+    @PostMapping("/logout")
+    public Result logout() {
+        Subject subject = SecurityUtils.getSubject();
+        subject.logout();
+        return new Result().ok().data(!subject.isAuthenticated());
+    }
+}

+ 68 - 0
src/main/java/sqgxy/xxydz/controller/NewsCategoryController.java

@@ -0,0 +1,68 @@
+package sqgxy.xxydz.controller;
+
+import sqgxy.xxydz.dto.NewsCategoryDTO;
+import sqgxy.xxydz.dto.NewsCategorySaveDTO;
+import sqgxy.xxydz.permission.annotation.SuperAdmin;
+import sqgxy.xxydz.service.NewsCategoryService;
+import sqgxy.xxydz.vo.Result;
+import sqgxy.xxydz.vo.news.category.NewsCategoryAddVO;
+import sqgxy.xxydz.vo.news.category.NewsCategoryListVO;
+import sqgxy.xxydz.vo.news.category.NewsCategoryUpdateVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.modelmapper.ModelMapper;
+import org.modelmapper.TypeToken;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 13:51
+ */
+@Api(tags = "新闻类别操作(二级标题)")
+@RestController
+@RequestMapping("/news_category")
+public class NewsCategoryController {
+
+    @Autowired
+    ModelMapper modelMapper;
+
+    @Autowired
+    NewsCategoryService newsCategoryService;
+
+    @SuperAdmin
+    @ApiOperation(value = "添加新闻类别")
+    @PostMapping("/add")
+    public Result addNewsCategory(NewsCategoryAddVO vo){
+        return new Result().ok().data(newsCategoryService.saveNewsCategory(modelMapper.map(vo, NewsCategorySaveDTO.class)));
+    }
+
+    @SuperAdmin
+    @ApiOperation(value = "删除新闻类别")
+    @PostMapping("/delete")
+    public Result deleteNewsCategory(Integer id) {
+        return new Result().ok().data(newsCategoryService.removeNewsCategoryById(id));
+    }
+
+    @SuperAdmin
+    @ApiOperation(value = "修改新闻类别")
+    @PostMapping("/update")
+    public Result updateNewsCategory(@RequestBody NewsCategoryUpdateVO vo) {
+        return new Result().ok().data(newsCategoryService.updateNewsCategoryById(modelMapper.map(vo, NewsCategoryDTO.class)));
+    }
+
+    @ApiOperation(value = "查询全部新闻类别")
+    @GetMapping("/all")
+    public Result queryAll() {
+        return new Result().ok().data(newsCategoryService.queryAll());
+    }
+
+    @ApiOperation(value = "查询新闻类别列表根据新闻类型id(大标题id)")
+    @GetMapping("/list/{typeId}")
+    public Result queryByNewsTypeId(@PathVariable("typeId") Integer id) {
+        List<NewsCategoryDTO> list = newsCategoryService.queryNewCategoryByNewsTypeDd(id);
+        return new Result().ok().data(modelMapper.map(list, new TypeToken<List<NewsCategoryListVO>>(){}.getType()));
+    }
+}

+ 80 - 0
src/main/java/sqgxy/xxydz/controller/NewsController.java

@@ -0,0 +1,80 @@
+package sqgxy.xxydz.controller;
+
+import sqgxy.xxydz.dto.NewsAddDTO;
+import sqgxy.xxydz.dto.NewsQueryDTO;
+import sqgxy.xxydz.dto.NewsUpdateDTO;
+import sqgxy.xxydz.permission.annotation.GeneralAdmin;
+import sqgxy.xxydz.service.NewsService;
+import sqgxy.xxydz.vo.Result;
+import sqgxy.xxydz.vo.news.NewsAddVO;
+import sqgxy.xxydz.vo.news.NewsUpdateVO;
+import sqgxy.xxydz.vo.news.PagingFuzzyQueryListByTitleVO;
+import sqgxy.xxydz.vo.news.PagingQueryListByNewsCategoryIdVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.modelmapper.ModelMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 14:32
+ */
+@Api(tags = "新闻操作")
+@RestController
+@RequestMapping("/news")
+public class NewsController {
+
+    @Autowired
+    ModelMapper modelMapper;
+
+    @Autowired
+    NewsService newsService;
+
+    @GeneralAdmin
+    @ApiOperation(value = "添加新闻")
+    @PostMapping(value = "/add")
+    public Result addNews(MultipartFile pictureFile, NewsAddVO vo) throws IOException {
+        NewsAddDTO newsAddDTO = modelMapper.map(vo, NewsAddDTO.class);
+        newsAddDTO.setPictureFile(pictureFile);
+        return new Result().ok().data(newsService.saveNews(newsAddDTO));
+    }
+
+    @GeneralAdmin
+    @ApiOperation(value = "删除新闻")
+    @PostMapping("/delete")
+    public Result deleteNews(Integer id) {
+        return new Result().ok().data(newsService.removeNews(id));
+    }
+
+    @GeneralAdmin
+    @ApiOperation(value = "修改新闻")
+    @PostMapping("/update")
+    public Result updateNews(MultipartFile pictureFile, NewsUpdateVO vo) throws IOException {
+        NewsUpdateDTO newsUpdateDTO = modelMapper.map(vo, NewsUpdateDTO.class);
+        newsUpdateDTO.setPictureFile(pictureFile);
+        return new Result().ok().data(newsService.updateNews(newsUpdateDTO));
+    }
+
+    @ApiOperation(value = "分页查询指定小标题下的新闻列表,可指定当前页和每页条数")
+    @PostMapping("/list")
+    public Result pagingQueryListByNewsCategoryId(PagingQueryListByNewsCategoryIdVO vo) {
+        return new Result().ok().data(newsService.getNewsListByNewsCategoryId(vo.getNewsCategoryId(), vo.getCurrent(), vo.getSize()));
+    }
+
+    @ApiOperation(value = "根据新闻标题模糊查询新闻列表,分页查新")
+    @PostMapping("/fuzzy")
+    public Result pagingFuzzyQueryListByTitle(PagingFuzzyQueryListByTitleVO vo) {
+        return new Result().ok().data(newsService.fuzzyQueryListByTitle(vo.getTitle(), vo.getCurrent(), vo.getSize()));
+    }
+
+    @ApiOperation("获取新闻主体根据id")
+    @GetMapping("/main/{id}")
+    public Result queryNewsById(@PathVariable("id") Integer id) {
+        NewsQueryDTO news = newsService.getNewsById(id);
+        return new Result().ok().data(news);
+    }
+}

+ 55 - 0
src/main/java/sqgxy/xxydz/controller/NewsTypeController.java

@@ -0,0 +1,55 @@
+package sqgxy.xxydz.controller;
+
+import sqgxy.xxydz.dto.NewsTypeDTO;
+import sqgxy.xxydz.permission.annotation.SuperAdmin;
+import sqgxy.xxydz.service.NewsTypeService;
+import sqgxy.xxydz.vo.Result;
+import sqgxy.xxydz.vo.news.type.NewsTypeVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.modelmapper.ModelMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 20:48
+ */
+@Api(tags = "新闻类型操作(一级标题)")
+@RestController
+@RequestMapping("/news_type")
+public class NewsTypeController {
+
+    @Autowired
+    ModelMapper modelMapper;
+
+    @Autowired
+    NewsTypeService newsTypeService;
+
+    @SuperAdmin
+    @ApiOperation(value = "添加新闻类型", notes = "新闻类型名重复时会添加失败,并提示:name已经存在")
+    @PostMapping("/add")
+    public Result addNewsType(String name) {
+        return new Result().ok().data(newsTypeService.saveNewsType(name));
+    }
+
+    @SuperAdmin
+    @ApiOperation(value = "删除新闻类型")
+    @PostMapping("/delete")
+    public Result deleteNewsType(Integer id) {
+        return new Result().ok().data(newsTypeService.removeNewsTypeById(id));
+    }
+
+    @SuperAdmin
+    @ApiOperation(value = "修改新闻类型")
+    @PostMapping("/update")
+    public Result updateNewsType(NewsTypeVO vo) {
+        return new Result().ok().data(newsTypeService.updateNewsType(modelMapper.map(vo, NewsTypeDTO.class)));
+    }
+
+    @ApiOperation(value = "查询全部新闻类型")
+    @GetMapping("/all")
+    public Result queryAll() {
+        return new Result().ok().data(newsTypeService.getNewsTypeList());
+    }
+}

+ 31 - 0
src/main/java/sqgxy/xxydz/controller/OperationController.java

@@ -0,0 +1,31 @@
+package sqgxy.xxydz.controller;
+
+import sqgxy.xxydz.module.HeaderImgUpload;
+import sqgxy.xxydz.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+/**
+ * @author xmp
+ * @date 2022-11-11 23:09
+ * 上传图片操作
+ */
+@Slf4j
+@Api(tags = "上传图片操作")
+@RestController
+public class OperationController {
+
+    @ApiOperation(value = "单文件上传")
+    @PostMapping("/uploading")
+    public Result filesUpload(MultipartFile file) throws IOException {
+        String s = HeaderImgUpload.headPortraitUpload(file);
+        return new Result().ok().data(s);
+    }
+
+}

+ 107 - 0
src/main/java/sqgxy/xxydz/controller/XdStarController.java

@@ -0,0 +1,107 @@
+package sqgxy.xxydz.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import sqgxy.xxydz.dto.XdstarPageDto;
+import sqgxy.xxydz.entity.XdStar;
+import sqgxy.xxydz.service.XdStarService;
+import sqgxy.xxydz.vo.Result;
+
+
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * @author lzj
+ * @date 2022-11-23 15:41
+ */
+
+@Api(tags = "信电之星")
+@RestController
+@RequestMapping("/XdStar")
+public class XdStarController {
+
+    @Autowired
+    XdStarService xdStarService;
+
+    @ApiOperation(value = "查询所有先进事例")
+    @GetMapping("/all")
+    public Result getAll(){
+        List<XdStar> list = xdStarService.list();
+        return new Result().ok().data(list);
+    }
+
+    @ApiOperation(value = "根据Id查询先进事例")
+    @GetMapping("/{id}")
+    public Result getOne(@PathVariable Integer id){
+        XdStar byId = xdStarService.getById(id);
+        return new Result().ok().data(byId);
+    }
+
+
+    @ApiOperation(value = "添加先进事例")
+    @PutMapping
+    public Result save(@RequestBody XdStar xdstar ){
+        xdstar.setCreateTime(new Date());
+        boolean issave = xdStarService.save(xdstar);
+        if (issave){
+            return new Result().ok();
+        }
+        return new Result().fail("添加失败!");
+    }
+
+    @ApiOperation(value = "删除先进事例")
+    @DeleteMapping("/{id}")
+    public Result delete(@PathVariable Integer id){
+        boolean isremove = xdStarService.removeById(id);
+        if (isremove){
+            return new Result().ok();
+        }
+        return new Result().fail("删除失败!");
+    }
+
+    @ApiOperation(value = "修改先进事例")
+    @PostMapping
+    public Result updateById(@RequestBody XdStar xdstar ){
+        xdstar.setUpdateTime(new Date());
+        boolean b = xdStarService.updateById(xdstar);
+        if (b){
+            return new Result().ok();
+        }
+        return  new Result().fail("修改失败!");
+    }
+
+
+    /**
+     * 分页
+     @ApiOperation(value = "分页查询)
+     */
+    @ApiOperation(value = "分页查询")
+    @GetMapping("/querypage")
+    public Result pageuser(@RequestParam int currentpage, @RequestParam int pagesize){
+        XdstarPageDto Xdstardto = xdStarService.querypage(currentpage, pagesize);
+        return new Result().ok().data(Xdstardto);
+    }
+
+    /**
+     * 模糊查询姓名
+     * @param name
+     * @return
+     */
+    @ApiOperation(value = "根据姓名模糊查询")
+    @GetMapping("/like")
+    public Result findLikeByName(@RequestParam  String name){
+        List<XdStar> xdstarlist = xdStarService.LikeByName(name);
+        if (xdstarlist==null){
+            return new Result().fail("查询失败");
+        }
+        return new Result().ok().data(xdstarlist);
+    }
+
+
+
+
+}

+ 35 - 0
src/main/java/sqgxy/xxydz/dto/AdminInformationDTO.java

@@ -0,0 +1,35 @@
+package sqgxy.xxydz.dto;
+
+import sqgxy.xxydz.enums.AdminRole;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author xmp
+ * @date 2022-11-18 16:22
+ * 管理员信息表
+ */
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class AdminInformationDTO {
+
+    private Integer id;
+
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 密码
+     */
+    private String password;
+
+    /**
+     * 角色
+     */
+    private AdminRole role;
+}

+ 25 - 0
src/main/java/sqgxy/xxydz/dto/AdminInformationSaveDTO.java

@@ -0,0 +1,25 @@
+package sqgxy.xxydz.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author xmp
+ * @date 2022-11-18 18:47
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class AdminInformationSaveDTO {
+
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 密码
+     */
+    private String password;
+}

+ 24 - 0
src/main/java/sqgxy/xxydz/dto/AdminInformationUpdateDTO.java

@@ -0,0 +1,24 @@
+package sqgxy.xxydz.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author xmp
+ * @date 2022-11-18 16:22
+ *
+ * 管理员修改密码
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class AdminInformationUpdateDTO {
+
+    private String username;
+
+    /**
+     * 密码
+     */
+    private String password;
+}

+ 32 - 0
src/main/java/sqgxy/xxydz/dto/NewsAddDTO.java

@@ -0,0 +1,32 @@
+package sqgxy.xxydz.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Date;
+
+/**
+ * @author xmp
+ * @date 2022-11-18 15:36
+ *
+ * 新闻主体
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NewsAddDTO {
+
+    private MultipartFile pictureFile;
+
+    private String picturePath;
+
+    private String title;
+
+    private Date releaseTime;
+
+    private String content;
+
+    private Integer newsCategoryId;
+}

+ 24 - 0
src/main/java/sqgxy/xxydz/dto/NewsCategoryDTO.java

@@ -0,0 +1,24 @@
+package sqgxy.xxydz.dto;
+
+import sqgxy.xxydz.enums.DisplayContent;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author xmp
+ * @date 2022-11-18 14:07
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NewsCategoryDTO {
+
+    private Integer id;
+
+    private String name;
+
+    private Integer newsTypeId;
+
+    private DisplayContent displayContent;
+}

+ 24 - 0
src/main/java/sqgxy/xxydz/dto/NewsCategoryQueryAllDTO.java

@@ -0,0 +1,24 @@
+package sqgxy.xxydz.dto;
+
+import sqgxy.xxydz.enums.DisplayContent;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author xmp
+ * @date 2022-11-18 14:07
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NewsCategoryQueryAllDTO {
+
+    private Integer id;
+
+    private String name;
+
+    private String newsTypeName;
+
+    private DisplayContent displayContent;
+}

+ 22 - 0
src/main/java/sqgxy/xxydz/dto/NewsCategorySaveDTO.java

@@ -0,0 +1,22 @@
+package sqgxy.xxydz.dto;
+
+import sqgxy.xxydz.enums.DisplayContent;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author xmp
+ * @date 2022-11-18 14:07
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NewsCategorySaveDTO {
+
+    private String name;
+
+    private Integer newsTypeId;
+
+    private DisplayContent displayContent;
+}

+ 50 - 0
src/main/java/sqgxy/xxydz/dto/NewsPaging.java

@@ -0,0 +1,50 @@
+package sqgxy.xxydz.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author xmp
+ * @date 2022-11-18 20:56
+ * <p>
+ * 新闻分页类
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NewsPaging {
+
+    /**
+     * 查询数据列表
+     */
+    List<Object> records = Collections.emptyList();
+
+    /**
+     * 总数
+     */
+    long total;
+
+    /**
+     * 每页显示条数,默认 10
+     */
+    long size;
+
+    /**
+     * 当前页
+     */
+    long current;
+
+    /**
+     * 是否存在上一页
+     */
+    boolean previous;
+
+    /**
+     * 是否存在下一页
+     */
+    boolean hasNext;
+}

+ 29 - 0
src/main/java/sqgxy/xxydz/dto/NewsQueryDTO.java

@@ -0,0 +1,29 @@
+package sqgxy.xxydz.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @author xmp
+ * @date 2022-11-18 15:36
+ *
+ * 查询新闻主体
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NewsQueryDTO {
+
+    private Integer id;
+
+    private String title;
+
+    private Date releaseTime;
+
+    private Integer hits;
+
+    private String content;
+}

+ 27 - 0
src/main/java/sqgxy/xxydz/dto/NewsQueryListDTO.java

@@ -0,0 +1,27 @@
+package sqgxy.xxydz.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @author xmp
+ * @date 2022-11-18 15:36
+ *
+ * 查询新闻列表时返回的实体
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NewsQueryListDTO {
+
+    private String picturePath;
+
+    private Integer id;
+
+    private String title;
+
+    private Date releaseTime;
+}

+ 28 - 0
src/main/java/sqgxy/xxydz/dto/NewsTypeDTO.java

@@ -0,0 +1,28 @@
+package sqgxy.xxydz.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @author xmp
+ * @date 2022-11-18 11:01
+ * 新闻类型(一级标题)
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NewsTypeDTO {
+
+    private Integer id;
+
+    /**
+     * 新闻类型名
+     */
+    private String name;
+}

+ 35 - 0
src/main/java/sqgxy/xxydz/dto/NewsUpdateDTO.java

@@ -0,0 +1,35 @@
+package sqgxy.xxydz.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Date;
+
+/**
+ * @author xmp
+ * @date 2022-11-18 15:18
+ * 新闻主体
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NewsUpdateDTO {
+
+    private MultipartFile pictureFile;
+
+    private String picturePath;
+
+    private Integer id;
+
+    private String title;
+
+    private Date releaseTime;
+
+    private Integer hits;
+
+    private String content;
+
+    private Integer newsCategoryId;
+}

+ 26 - 0
src/main/java/sqgxy/xxydz/dto/Principal.java

@@ -0,0 +1,26 @@
+package sqgxy.xxydz.dto;
+
+import sqgxy.xxydz.enums.AdminRole;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author xmp
+ * @date 2022-11-24 0:47
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Principal {
+
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 角色
+     */
+    private AdminRole role;
+}

+ 22 - 0
src/main/java/sqgxy/xxydz/dto/XdstarPageDto.java

@@ -0,0 +1,22 @@
+package sqgxy.xxydz.dto;
+
+import lombok.Data;
+import sqgxy.xxydz.entity.XdStar;
+
+import java.util.List;
+
+/**
+ * @Author : ljz
+ * @data : 2022-11-24 12:39
+ * 用于分页
+ */
+
+@Data
+public class XdstarPageDto extends XdStar {
+
+    private  int currentpage;
+    private  int pagesize;
+    private  long datalength;
+    private List<XdStar> XdstarList;
+
+}

+ 49 - 0
src/main/java/sqgxy/xxydz/entity/AdminInformation.java

@@ -0,0 +1,49 @@
+package sqgxy.xxydz.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import sqgxy.xxydz.enums.AdminRole;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 15:17
+ * 管理员信息表
+ */
+
+@TableName("admin_information")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class AdminInformation {
+
+    /**
+     * 主键自增
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 密码
+     */
+    private String password;
+
+    /**
+     * 角色
+     */
+    private AdminRole role;
+
+    private Date createTime;
+
+    private Date updateTime;
+}

+ 56 - 0
src/main/java/sqgxy/xxydz/entity/Information.java

@@ -0,0 +1,56 @@
+package sqgxy.xxydz.entity;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @author xmp
+ * @date 2022-11-23 23:03
+ * 领导联系方式
+ */
+
+@TableName("information")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class Information {
+
+    /**
+     * 主键,自增
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 职责
+     */
+    private String duty;
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 手机号
+     */
+    private String phone;
+
+    /**
+     * 邮箱
+     */
+    private String email;
+
+    private Date createTime;
+
+    private Date updateTime;
+
+}

+ 63 - 0
src/main/java/sqgxy/xxydz/entity/News.java

@@ -0,0 +1,63 @@
+package sqgxy.xxydz.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 15:19
+ * 新闻主体
+ */
+
+@TableName("news")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class News {
+
+    /**
+     * 主键自增
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 展示图片路径
+     */
+    private String picturePath;
+
+    /**
+     * 标题
+     */
+    private String title;
+
+    /**
+     * 发布时间
+     */
+    private Date releaseTime;
+
+    /**
+     * 点击率
+     */
+    private Integer hits;
+
+    /**
+     * 内容
+     */
+    private String content;
+
+    /**
+     * 文章所属类别id
+     */
+    private Integer newsCategoryId;
+
+    private Date createTime;
+
+    private Date updateTime;
+}

+ 49 - 0
src/main/java/sqgxy/xxydz/entity/NewsCategory.java

@@ -0,0 +1,49 @@
+package sqgxy.xxydz.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import sqgxy.xxydz.enums.DisplayContent;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 15:21
+ * 新闻类别(二级标题)
+ */
+
+@TableName("news_category")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NewsCategory {
+
+    /**
+     * 主键自增
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 新闻类别名
+     */
+    private String name;
+
+    /**
+     * 所属的新闻类型id
+     */
+    private Integer newsTypeId;
+
+    /**
+     * 展示的类型
+     */
+    private DisplayContent displayContent;
+
+    private Date createTime;
+
+    private Date updateTime;
+}

+ 40 - 0
src/main/java/sqgxy/xxydz/entity/NewsType.java

@@ -0,0 +1,40 @@
+package sqgxy.xxydz.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 15:24
+ * 新闻类型(一级标题)
+ */
+
+@TableName("news_type")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class NewsType {
+
+    /**
+     * 主键,自增
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 新闻类型名
+     */
+    private String name;
+
+    private Date createTime;
+
+    private Date updateTime;
+}

+ 55 - 0
src/main/java/sqgxy/xxydz/entity/XdStar.java

@@ -0,0 +1,55 @@
+package sqgxy.xxydz.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @author xmp
+ * @date 2022-11-22 19:03
+ * 新闻类型(一级标题)
+ */
+
+@TableName("xdstar")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class XdStar {
+
+    /**
+     * 主键,自增
+     */
+    @TableId(type = IdType.INPUT)
+    private Integer id;
+    /**
+     * 学号
+     */
+    private Integer xueno;
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 星星名字
+     */
+    private String starname;
+
+    /**
+     * 事例
+     */
+    private String example;
+
+    private Date createTime;
+
+    private Date updateTime;
+
+}

+ 27 - 0
src/main/java/sqgxy/xxydz/enums/AdminRole.java

@@ -0,0 +1,27 @@
+package sqgxy.xxydz.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author xmp
+ * @date 2022-11-20 16:26
+ * 枚举类型
+ */
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+public enum AdminRole {
+
+    GENERAL_ADMIN(0, "普通管理员"),
+    SUPER_ADMIN(1, "超级管理员");
+
+    @EnumValue
+    private Integer key;
+
+    @JsonValue
+    private String display;
+}

+ 28 - 0
src/main/java/sqgxy/xxydz/enums/DisplayContent.java

@@ -0,0 +1,28 @@
+package sqgxy.xxydz.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 15:24
+ * 二级标题下展示的类型
+ */
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+public enum DisplayContent {
+
+    NEWS_LIST(0, "新闻列表"),
+    NEWS(1, "新闻"),
+    LINK(2, "链接");
+
+    @EnumValue
+    private Integer key;
+
+    @JsonValue
+    private String display;
+}

+ 25 - 0
src/main/java/sqgxy/xxydz/enums/ResultCode.java

@@ -0,0 +1,25 @@
+package sqgxy.xxydz.enums;
+
+import lombok.*;
+import org.springframework.web.bind.annotation.GetMapping;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 17:28
+ */
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+public enum ResultCode {
+
+    OK(200, true, "ok"),
+    FAIL(500, false, "fail"),
+    NOTFOUND(404, false, "not found"),
+    PERMISSION(401, false, "insufficient permissions");
+
+    private Integer code;
+
+    private Boolean success;
+
+    private String msg;
+}

+ 16 - 0
src/main/java/sqgxy/xxydz/exception/HintException.java

@@ -0,0 +1,16 @@
+package sqgxy.xxydz.exception;
+
+/**
+ * @author xmp
+ * @date 2022-11-17 17:34
+ * 异常处理
+ */
+public class HintException extends RuntimeException {
+
+    public HintException() {
+    }
+
+    public HintException(String message) {
+        super(message);
+    }
+}

+ 13 - 0
src/main/java/sqgxy/xxydz/mapper/AdminInformationMapper.java

@@ -0,0 +1,13 @@
+package sqgxy.xxydz.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import sqgxy.xxydz.entity.AdminInformation;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 16:30
+ */
+@Repository
+public interface AdminInformationMapper extends BaseMapper<AdminInformation> {
+}

+ 14 - 0
src/main/java/sqgxy/xxydz/mapper/InformationMapper.java

@@ -0,0 +1,14 @@
+package sqgxy.xxydz.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import sqgxy.xxydz.entity.Information;
+import sqgxy.xxydz.entity.XdStar;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 16:30
+ */
+@Mapper
+public interface InformationMapper extends BaseMapper<Information> {
+}

+ 13 - 0
src/main/java/sqgxy/xxydz/mapper/NewsCategoryMapper.java

@@ -0,0 +1,13 @@
+package sqgxy.xxydz.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import sqgxy.xxydz.entity.NewsCategory;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 16:18
+ */
+@Repository
+public interface NewsCategoryMapper extends BaseMapper<NewsCategory> {
+}

+ 13 - 0
src/main/java/sqgxy/xxydz/mapper/NewsMapper.java

@@ -0,0 +1,13 @@
+package sqgxy.xxydz.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import sqgxy.xxydz.entity.News;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 16:19
+ */
+@Repository
+public interface NewsMapper extends BaseMapper<News> {
+}

+ 13 - 0
src/main/java/sqgxy/xxydz/mapper/NewsTypeMapper.java

@@ -0,0 +1,13 @@
+package sqgxy.xxydz.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import sqgxy.xxydz.entity.NewsType;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 18:30
+ */
+@Repository
+public interface NewsTypeMapper extends BaseMapper<NewsType> {
+}

+ 15 - 0
src/main/java/sqgxy/xxydz/mapper/XdStarMapper.java

@@ -0,0 +1,15 @@
+package sqgxy.xxydz.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import sqgxy.xxydz.entity.XdStar;
+
+
+/**
+ * @author lzj
+ * @date 2022-11-19 18:30
+ */
+@Mapper
+public interface XdStarMapper extends BaseMapper<XdStar> {
+
+}

+ 63 - 0
src/main/java/sqgxy/xxydz/module/HeaderImgUpload.java

@@ -0,0 +1,63 @@
+package sqgxy.xxydz.module;
+
+import sqgxy.xxydz.exception.HintException;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * @author xmp
+ * 用于照片上传,处理静态文件不用重启且被访问
+ */
+
+@Slf4j
+public class HeaderImgUpload {
+
+    //静态资源路径
+    private static final String FILE_PATH_PREFIX = "static/images";
+
+    private static final String FILE_PATH_PREFIX_READ = "images";
+
+    //文件路径后缀
+    private static final String FILE_PATH_SUFFIX = ".png";
+
+    // 默认的图片后缀
+    private static final List<String> FILE_TYPE = Arrays.asList("image/jpeg", "image/png");
+
+    public static String headPortraitUpload(MultipartFile file) throws IOException, HintException {
+
+        System.out.println(file.getContentType());
+        if (!FILE_TYPE.contains(file.getContentType())) {
+            throw new HintException("上传的文件类型只能是:" + FILE_TYPE.toString());
+        }
+
+        String path = System.getProperty("user.dir");
+        File upload = new File(path, FILE_PATH_PREFIX);
+
+        log.info("目录upload: " + upload.toString());
+        if (!upload.exists()) {
+            log.info("目录不存在,开始创建: " + upload.toString());
+            if (!upload.mkdirs()) {
+                throw new HintException("文件上传失败");
+            }
+        }
+
+        File file1;
+        UUID fileName = UUID.randomUUID();
+        if (!file.isEmpty()) {
+            log.info("开始保存");
+            //保存到文件服务器
+            file1 = new File(upload, fileName + FILE_PATH_SUFFIX);
+            file.transferTo(file1);
+        } else {
+            throw new NullPointerException("文件不能为空");
+        }
+        return FILE_PATH_PREFIX_READ + File.separator + fileName + FILE_PATH_SUFFIX;
+    }
+
+}

+ 13 - 0
src/main/java/sqgxy/xxydz/permission/PermissionException.java

@@ -0,0 +1,13 @@
+package sqgxy.xxydz.permission;
+
+/**
+ * @author xmp
+ * @date 2022-01-24 0:38
+ */
+
+public class PermissionException extends RuntimeException {
+
+    public PermissionException() {
+        super("权限不足");
+    }
+}

+ 18 - 0
src/main/java/sqgxy/xxydz/permission/annotation/GeneralAdmin.java

@@ -0,0 +1,18 @@
+package sqgxy.xxydz.permission.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * @author xmp
+ * @date 2022-11-21 22:28
+ * 普通管理员权限
+ */
+
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Permission
+
+public @interface GeneralAdmin {
+    int role() default 0;
+}

+ 17 - 0
src/main/java/sqgxy/xxydz/permission/annotation/Permission.java

@@ -0,0 +1,17 @@
+package sqgxy.xxydz.permission.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * @author xmp
+ * @date 2022-11-21 0:30
+ * 权限自定义注解
+ */
+
+@Target({ElementType.TYPE, ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface Permission {
+
+    int role() default 0;
+}

+ 21 - 0
src/main/java/sqgxy/xxydz/permission/annotation/SuperAdmin.java

@@ -0,0 +1,21 @@
+package sqgxy.xxydz.permission.annotation;
+
+import org.springframework.core.annotation.AliasFor;
+
+import java.lang.annotation.*;
+
+/**
+ * @author xmp
+ * @date 2022-11-21 22:16
+ * 超级管理员
+ */
+
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Permission
+public @interface SuperAdmin {
+
+    @AliasFor(annotation = Permission.class)
+    int role() default 1;
+}

+ 68 - 0
src/main/java/sqgxy/xxydz/permission/aspect/AdminAspect.java

@@ -0,0 +1,68 @@
+package sqgxy.xxydz.permission.aspect;
+
+import sqgxy.xxydz.dto.Principal;
+import sqgxy.xxydz.permission.PermissionException;
+import sqgxy.xxydz.permission.annotation.Permission;
+import sqgxy.xxydz.util.ShiroUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.Signature;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.core.annotation.AnnotatedElementUtils;
+import org.springframework.core.annotation.AnnotationAttributes;
+import org.springframework.lang.NonNull;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Method;
+import java.util.Objects;
+
+/**
+ * @author xmp
+ * @date 2022-01-21 22:32
+ * Shiro
+ */
+
+@Component
+@Aspect
+@Slf4j
+public class AdminAspect {
+
+    @Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping) || @annotation(org.springframework.web.bind.annotation.PostMapping) || @annotation(org.springframework.web.bind.annotation.RequestMapping)")
+    public void mappingPoint() {
+    }
+
+    @Pointcut("@annotation(sqgxy.xxydz.permission.annotation.GeneralAdmin) || @annotation(sqgxy.xxydz.permission.annotation.SuperAdmin)")
+
+    private void permissionPoint() {
+
+    }
+
+    private static final String ATTRIBUTE_NAME = "role";
+
+    @Before("permissionPoint() && mappingPoint()")
+    public void before(@NonNull JoinPoint joinPoint) {
+        Signature signature = joinPoint.getSignature();
+        if (!(signature instanceof MethodSignature)) {
+            log.info("仅支持方法级权限校验");
+            return;
+        }
+        MethodSignature methodSignature = (MethodSignature) signature;
+        Method method = methodSignature.getMethod();
+        // Spring 注解属性的隐式替换
+        AnnotationAttributes mergedAnnotationAttributes = AnnotatedElementUtils.findMergedAnnotationAttributes(method, Permission.class, false, true);
+
+        if(Objects.nonNull(mergedAnnotationAttributes)) {
+            Integer role = (Integer) mergedAnnotationAttributes.get(ATTRIBUTE_NAME);
+            Principal principal = ShiroUtils.getPrincipal();
+            log.info("{}访问:{}", principal, role);
+            if(Objects.nonNull(principal) && principal.getRole().getKey() >= role) {
+                return;
+            }
+        }
+
+        throw new PermissionException();
+    }
+}

+ 58 - 0
src/main/java/sqgxy/xxydz/service/AdminInformationService.java

@@ -0,0 +1,58 @@
+package sqgxy.xxydz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import sqgxy.xxydz.dto.AdminInformationDTO;
+import sqgxy.xxydz.dto.AdminInformationSaveDTO;
+import sqgxy.xxydz.dto.AdminInformationUpdateDTO;
+import sqgxy.xxydz.entity.AdminInformation;
+
+import java.util.List;
+
+/**
+ * @author xmp
+ * @date 2022-11-23 16:31
+ */
+public interface AdminInformationService extends IService<AdminInformation> {
+
+    String ID = "id";
+
+    String USERNAME = "username";
+
+    String PASSWORD = "password";
+
+    String ROLE = "role";
+
+    String CREATE_TIME = "create_time";
+
+    String UPDATE_TIME = "update_time";
+
+    /**
+     * 检验密码是否正确
+     */
+    void checkPassword(String username, String password);
+
+    /**
+     * 添加普通管理员信息
+     */
+    boolean saveAdminInformation(AdminInformationSaveDTO dto);
+
+    /**
+     * 删除管理员信息根据id
+     */
+    boolean removeAdminInformationById(Integer id);
+
+    /**
+     * 修改普通管理员密码
+     */
+    boolean updateAdminInformation(AdminInformationUpdateDTO dto);
+
+    /**
+     * 根据用户名查询管理员信息
+     */
+    AdminInformationDTO getAdminInformationByUsername(String username);
+
+    /**
+     * 查找普通管理员列表
+     */
+    List<AdminInformationDTO> getAdminInformationList();
+}

+ 11 - 0
src/main/java/sqgxy/xxydz/service/InformationService.java

@@ -0,0 +1,11 @@
+package sqgxy.xxydz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import sqgxy.xxydz.entity.Information;
+
+/**
+ * @author xmp
+ * @date 2022-11-24 09:59
+ */
+public interface InformationService extends IService<Information> {
+}

+ 53 - 0
src/main/java/sqgxy/xxydz/service/NewsCategoryService.java

@@ -0,0 +1,53 @@
+package sqgxy.xxydz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import sqgxy.xxydz.dto.NewsCategoryDTO;
+import sqgxy.xxydz.dto.NewsCategoryQueryAllDTO;
+import sqgxy.xxydz.dto.NewsCategorySaveDTO;
+import sqgxy.xxydz.entity.NewsCategory;
+
+import java.util.List;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 16:12
+ */
+public interface NewsCategoryService extends IService<NewsCategory> {
+
+    String ID = "id";
+
+    String NAME = "name";
+
+    String NEWS_TYPE_ID = "news_type_id";
+
+    String DISPLAY_CONTENT = "display_content";
+
+    String CREATE_TIME = "create_time";
+
+    String UPDATE_TIME = "update_time";
+
+    /**
+     * 添加新闻类别
+     */
+    boolean saveNewsCategory(NewsCategorySaveDTO dto);
+
+    /**
+     * 删除新闻类别
+     */
+    boolean removeNewsCategoryById(Integer id);
+
+    /**
+     * 修改新闻类别
+     */
+    boolean updateNewsCategoryById(NewsCategoryDTO dto);
+
+    /**
+     * 查询全部新闻类别
+     */
+    List<NewsCategoryQueryAllDTO> queryAll();
+
+    /**
+     * 按 NEWS_TYPE_ID 查找新闻类别
+     */
+    List<NewsCategoryDTO> queryNewCategoryByNewsTypeDd(Integer newsTypeId);
+}

+ 65 - 0
src/main/java/sqgxy/xxydz/service/NewsService.java

@@ -0,0 +1,65 @@
+package sqgxy.xxydz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import sqgxy.xxydz.dto.NewsAddDTO;
+import sqgxy.xxydz.dto.NewsPaging;
+import sqgxy.xxydz.dto.NewsQueryDTO;
+import sqgxy.xxydz.dto.NewsUpdateDTO;
+import sqgxy.xxydz.entity.News;
+
+import java.io.IOException;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 16:27
+ */
+public interface NewsService extends IService<News> {
+
+    String PICTURE_PATH = "picture_path";
+
+    String ID = "id";
+
+    String TITLE = "title";
+
+    String RELEASE_TIME = "release_time";
+
+    String HITS = "hits";
+
+    String CONTENT = "content";
+
+    String NEWS_CATEGORY_ID = "news_category_id";
+
+    String CREATE_TIME = "create_time";
+
+    String UPDATE_TIME = "update_time";
+
+    /**
+     * 添加新闻
+     */
+    boolean saveNews(NewsAddDTO dto) throws IOException;
+
+    /**
+     * 删除新闻根据id
+     */
+    boolean removeNews(Integer id);
+
+    /**
+     * 修改新闻
+     */
+    boolean updateNews(NewsUpdateDTO dto) throws IOException;
+
+    /**
+     * 根据 NEWS_CATEGORY_ID 获取 新闻展示列表
+     */
+    NewsPaging getNewsListByNewsCategoryId(Integer newsCategoryId, Integer current, Integer size);
+
+    /**
+     * 模糊查询新闻列表 根据 title
+     */
+    NewsPaging fuzzyQueryListByTitle(String title, Integer current, Integer size);
+
+    /**
+     * 获取新闻根据 id
+     */
+    NewsQueryDTO getNewsById(Integer id);
+}

+ 42 - 0
src/main/java/sqgxy/xxydz/service/NewsTypeService.java

@@ -0,0 +1,42 @@
+package sqgxy.xxydz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import sqgxy.xxydz.dto.NewsTypeDTO;
+import sqgxy.xxydz.entity.NewsType;
+
+import java.util.List;
+
+/**
+ * @author xmp
+ * @date 2022-01-09 15:59
+ */
+public interface NewsTypeService extends IService<NewsType> {
+
+    String ID = "id";
+
+    String NAME = "name";
+
+    String CREATE_TIME = "create_time";
+
+    String UPDATE_TIME = "update_time";
+
+    /**
+     * 添加新闻类型
+     */
+    boolean saveNewsType(String name);
+
+    /**
+     * 移除新闻类型根据id
+     */
+    boolean removeNewsTypeById(Integer id);
+
+    /**
+     * 修改新闻类型
+     */
+    boolean updateNewsType(NewsTypeDTO dto);
+
+    /**
+     * 查询全部新闻类型
+     */
+    List<NewsTypeDTO> getNewsTypeList();
+}

+ 19 - 0
src/main/java/sqgxy/xxydz/service/XdStarService.java

@@ -0,0 +1,19 @@
+package sqgxy.xxydz.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import sqgxy.xxydz.dto.XdstarPageDto;
+import sqgxy.xxydz.entity.XdStar;
+
+import java.util.List;
+
+/**
+ * @author lzj
+ * @date 2022-11-23 15:59
+ */
+public interface XdStarService extends IService<XdStar> {
+
+    XdstarPageDto querypage(int currentpage, int pagesize);
+    List<XdStar> LikeByName(String name);
+
+}

+ 86 - 0
src/main/java/sqgxy/xxydz/service/impl/AdminInformationServiceImpl.java

@@ -0,0 +1,86 @@
+package sqgxy.xxydz.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import sqgxy.xxydz.dto.AdminInformationDTO;
+import sqgxy.xxydz.dto.AdminInformationSaveDTO;
+import sqgxy.xxydz.dto.AdminInformationUpdateDTO;
+import sqgxy.xxydz.entity.AdminInformation;
+import sqgxy.xxydz.enums.AdminRole;
+import sqgxy.xxydz.exception.HintException;
+import sqgxy.xxydz.mapper.AdminInformationMapper;
+import sqgxy.xxydz.service.AdminInformationService;
+import sqgxy.xxydz.util.HashUtils;
+import org.modelmapper.ModelMapper;
+import org.modelmapper.TypeToken;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @author xmp
+ * @date 2022-11-23 16:32
+ */
+@Service
+public class AdminInformationServiceImpl extends ServiceImpl<AdminInformationMapper, AdminInformation> implements AdminInformationService {
+
+    @Autowired
+    private ModelMapper modelMapper;
+
+    @Override
+    public void checkPassword(String username, String password) {
+        int count = count(new QueryWrapper<AdminInformation>().eq(USERNAME, username).eq(PASSWORD, HashUtils.MD5(username, password)));
+        if (count < 1) {
+            throw new HintException("密码错误");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean saveAdminInformation(AdminInformationSaveDTO dto) {
+        int count = count(new QueryWrapper<AdminInformation>().eq(USERNAME, dto.getUsername()));
+        if (count > 0) {
+            throw new HintException("用户名已经存在");
+        }
+        dto.setPassword(HashUtils.MD5(dto.getUsername(), dto.getPassword()));
+        return save(modelMapper.map(dto, AdminInformation.class));
+    }
+
+    @Override
+    public boolean removeAdminInformationById(Integer id) {
+        int count = count(new QueryWrapper<AdminInformation>().eq(ID, id));
+        if (count < 1) {
+            throw new HintException("管理员不存在");
+        }
+        return removeById(id);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updateAdminInformation(AdminInformationUpdateDTO dto) {
+        int count = count(new QueryWrapper<AdminInformation>().eq(USERNAME, dto.getUsername()));
+        if (count < 1) {
+            throw new HintException("此用户名不存在");
+        }
+        String password = HashUtils.MD5(dto.getUsername(), dto.getPassword());
+        return update(new UpdateWrapper<AdminInformation>().set(PASSWORD, password).eq(USERNAME, dto.getUsername()));
+    }
+
+    @Override
+    public AdminInformationDTO getAdminInformationByUsername(String username) {
+        AdminInformation adminInformation = getOne(new QueryWrapper<AdminInformation>().eq(USERNAME, username));
+        if (adminInformation != null) {
+            return modelMapper.map(adminInformation, AdminInformationDTO.class);
+        }
+        return null;
+    }
+
+    @Override
+    public List<AdminInformationDTO> getAdminInformationList() {
+        List<AdminInformation> list = list(new QueryWrapper<AdminInformation>().select(ID, USERNAME).eq(ROLE, AdminRole.GENERAL_ADMIN));
+        return modelMapper.map(list, new TypeToken<List<AdminInformationDTO>>(){}.getType());
+    }
+}

+ 16 - 0
src/main/java/sqgxy/xxydz/service/impl/InformationServiceImpl.java

@@ -0,0 +1,16 @@
+package sqgxy.xxydz.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import sqgxy.xxydz.entity.Information;
+import sqgxy.xxydz.mapper.InformationMapper;
+import sqgxy.xxydz.service.InformationService;
+
+/**
+ * @author xmp
+ * @date 2022-11-22 16:32
+ */
+@Service
+public class InformationServiceImpl extends ServiceImpl<InformationMapper, Information> implements InformationService {
+
+}

+ 87 - 0
src/main/java/sqgxy/xxydz/service/impl/NewsCategoryServiceImpl.java

@@ -0,0 +1,87 @@
+package sqgxy.xxydz.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import sqgxy.xxydz.dto.NewsCategoryDTO;
+import sqgxy.xxydz.dto.NewsCategoryQueryAllDTO;
+import sqgxy.xxydz.dto.NewsCategorySaveDTO;
+import sqgxy.xxydz.entity.NewsCategory;
+import sqgxy.xxydz.entity.NewsType;
+import sqgxy.xxydz.exception.HintException;
+import sqgxy.xxydz.mapper.NewsCategoryMapper;
+import sqgxy.xxydz.mapper.NewsTypeMapper;
+import sqgxy.xxydz.service.NewsCategoryService;
+import sqgxy.xxydz.service.NewsTypeService;
+import org.modelmapper.ModelMapper;
+import org.modelmapper.TypeToken;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 16:32
+ */
+@Service
+public class NewsCategoryServiceImpl extends ServiceImpl<NewsCategoryMapper, NewsCategory> implements NewsCategoryService {
+
+    @Autowired
+    ModelMapper modelMapper;
+
+    @Autowired
+    NewsTypeMapper newsTypeMapper;
+
+    @Override
+    public boolean saveNewsCategory(NewsCategorySaveDTO dto) {
+        if (nonentityNewsType(dto.getNewsTypeId())) {
+            throw new HintException("此新闻类型不存在");
+        }
+        return save(modelMapper.map(dto, NewsCategory.class));
+    }
+
+    @Override
+    public boolean removeNewsCategoryById(Integer id) {
+        return removeById(id);
+    }
+
+    @Override
+    public boolean updateNewsCategoryById(NewsCategoryDTO dto) {
+        if (dto.getNewsTypeId() != null && nonentityNewsType(dto.getNewsTypeId())) {
+            throw new HintException("此新闻类型不存在");
+        }
+        return updateById(modelMapper.map(dto, NewsCategory.class));
+    }
+
+    @Override
+    public List<NewsCategoryQueryAllDTO> queryAll() {
+        List<NewsCategory> list = list(new QueryWrapper<NewsCategory>().select(ID, NAME, NEWS_TYPE_ID, DISPLAY_CONTENT));
+        return list.stream().map(this::newsTypeIdToString).collect(Collectors.toList());
+    }
+
+    @Override
+    public List<NewsCategoryDTO> queryNewCategoryByNewsTypeDd(Integer newsTypeId) {
+        List<NewsCategory> list = list(new QueryWrapper<NewsCategory>().select(ID, NAME, DISPLAY_CONTENT).eq(NEWS_TYPE_ID, newsTypeId));
+        return modelMapper.map(list, new TypeToken<List<NewsCategoryDTO>>(){}.getType());
+    }
+
+
+    /**
+     * 不存在 NewsType
+     */
+    private boolean nonentityNewsType(Integer newsTypeId) {
+        Integer count = newsTypeMapper.selectCount(new QueryWrapper<NewsType>().eq(NewsTypeService.ID, newsTypeId));
+        return count < 1;
+    }
+
+    /**
+     * 通过NewsType 的 ID 获取 Name
+     */
+    public NewsCategoryQueryAllDTO newsTypeIdToString(NewsCategory newsCategory) {
+        String name = newsTypeMapper.selectOne(new QueryWrapper<NewsType>().select(NewsTypeService.NAME).eq(NewsTypeService.ID, newsCategory.getNewsTypeId())).getName();
+        NewsCategoryQueryAllDTO map = modelMapper.map(newsCategory, NewsCategoryQueryAllDTO.class);
+        map.setNewsTypeName(name);
+        return map;
+    }
+}

+ 132 - 0
src/main/java/sqgxy/xxydz/service/impl/NewsServiceImpl.java

@@ -0,0 +1,132 @@
+package sqgxy.xxydz.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import sqgxy.xxydz.dto.*;
+import sqgxy.xxydz.entity.News;
+import sqgxy.xxydz.entity.NewsCategory;
+import sqgxy.xxydz.enums.DisplayContent;
+import sqgxy.xxydz.exception.HintException;
+import sqgxy.xxydz.mapper.NewsCategoryMapper;
+import sqgxy.xxydz.mapper.NewsMapper;
+import sqgxy.xxydz.module.HeaderImgUpload;
+import sqgxy.xxydz.service.NewsCategoryService;
+import sqgxy.xxydz.service.NewsService;
+import org.modelmapper.ModelMapper;
+import org.modelmapper.TypeToken;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 13:32
+ */
+@Service
+public class NewsServiceImpl extends ServiceImpl<NewsMapper, News> implements NewsService {
+
+    @Autowired
+    ModelMapper modelMapper;
+
+    @Autowired
+    NewsCategoryMapper newsCategoryMapper;
+
+    @Override
+    public boolean saveNews(NewsAddDTO dto) throws IOException {
+        if (nonentityNewsCategory(dto.getNewsCategoryId())) {
+            throw new HintException("此新闻类别不存在");
+        }
+        Integer newCategoryId = dto.getNewsCategoryId();
+        NewsCategory newsCategory = newsCategoryMapper.selectOne(new QueryWrapper<NewsCategory>().select(NewsCategoryService.DISPLAY_CONTENT).eq(NewsCategoryService.ID, newCategoryId));
+        // 小标题为新闻类型时,该标题下只能存储一篇新闻
+        if (newsCategory.getDisplayContent() == DisplayContent.NEWS) {
+            // 检查该标题下是否存在新闻
+            int count = count(new QueryWrapper<News>().eq(NEWS_CATEGORY_ID, newCategoryId));
+            if (count >= 10) {//todo
+                throw new HintException("该类别下只能存在一篇新闻");
+            }
+        }
+        // 判断图片是否为空
+        if (dto.getPictureFile() != null) {
+            String s = HeaderImgUpload.headPortraitUpload(dto.getPictureFile());
+            dto.setPicturePath(s);
+        }
+        return save(modelMapper.map(dto, News.class));
+    }
+
+    @Override
+    public boolean removeNews(Integer id) {
+        return removeById(id);
+    }
+
+    @Override
+    public boolean updateNews(NewsUpdateDTO dto) throws IOException {
+        // 查看新闻是否存在
+        int count1 = count(new QueryWrapper<News>().eq(ID, dto.getId()));
+        if (count1 < 1) {
+            throw new HintException("id为" + dto.getId() + "的新闻不存在");
+        }
+        if (dto.getNewsCategoryId() != null && nonentityNewsCategory(dto.getNewsCategoryId())) {
+            throw new HintException("此新闻类别不存在");
+        }
+        // dto.getNewsCategoryId() 不为null 说明新闻类别可能会更改,需要判断更改后的类别是否是只能存储一篇新闻的展示新闻类型
+        if (dto.getNewsCategoryId() != null) {
+            Integer newCategoryId = dto.getNewsCategoryId();
+            NewsCategory newsCategory = newsCategoryMapper.selectOne(new QueryWrapper<NewsCategory>().select(NewsCategoryService.DISPLAY_CONTENT).eq(NewsCategoryService.ID, newCategoryId));
+            if (newsCategory.getDisplayContent() == DisplayContent.NEWS) {
+                // 检查该标题下是否存在新闻
+                int count = count(new QueryWrapper<News>().eq(NEWS_CATEGORY_ID, newCategoryId));
+                if (count >= 1) {
+                    throw new HintException("该类别下只能存在一篇新闻");
+                }
+            }
+        }
+        // 需要修改图片
+        if (dto.getPictureFile() != null) {
+            String s = HeaderImgUpload.headPortraitUpload(dto.getPictureFile());
+            dto.setPicturePath(s);
+        }
+        return updateById(modelMapper.map(dto, News.class));
+    }
+
+    @Override
+    public NewsPaging getNewsListByNewsCategoryId(Integer newsCategoryId, Integer current, Integer size) {
+        Page<News> page = page(new Page<>(current, size), new QueryWrapper<News>().select(ID, TITLE, RELEASE_TIME, PICTURE_PATH).eq(NEWS_CATEGORY_ID, newsCategoryId).orderByDesc(RELEASE_TIME));
+        NewsPaging newsPaging = modelMapper.map(page, NewsPaging.class);
+        List<News> records = page.getRecords();
+        newsPaging.setRecords(modelMapper.map(records, new TypeToken<List<NewsQueryListDTO>>(){}.getType()));
+        return newsPaging;
+    }
+
+    @Override
+    public NewsQueryDTO getNewsById(Integer id) {
+        // 新闻点击率加一
+        News one = getOne(new QueryWrapper<News>().select(HITS).eq(ID, id));
+        if (one == null) {
+            return null;
+        }
+        update(new UpdateWrapper<News>().set(HITS, one.getHits() + 1).eq(ID, id));
+        return modelMapper.map(getById(id), NewsQueryDTO.class);
+    }
+
+    @Override
+    public NewsPaging fuzzyQueryListByTitle(String title, Integer current, Integer size) {
+        Page<News> page = page(new Page<>(current, size), new QueryWrapper<News>().select(ID, TITLE, RELEASE_TIME, PICTURE_PATH).like(TITLE, title).orderByDesc(RELEASE_TIME));
+        NewsPaging newsPaging = modelMapper.map(page, NewsPaging.class);
+        List<News> records = page.getRecords();
+        newsPaging.setRecords(modelMapper.map(records, new TypeToken<List<NewsQueryListDTO>>(){}.getType()));
+        return newsPaging;
+    }
+
+    /**
+     * 不存在 NewsCategory
+     */
+    private boolean nonentityNewsCategory(Integer newsCategoryId) {
+        Integer count = newsCategoryMapper.selectCount(new QueryWrapper<NewsCategory>().eq(NewsCategoryService.ID, newsCategoryId));
+        return count < 1;
+    }
+}

+ 63 - 0
src/main/java/sqgxy/xxydz/service/impl/NewsTypeServiceImpl.java

@@ -0,0 +1,63 @@
+package sqgxy.xxydz.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import sqgxy.xxydz.dto.NewsTypeDTO;
+import sqgxy.xxydz.entity.NewsType;
+import sqgxy.xxydz.exception.HintException;
+import sqgxy.xxydz.mapper.NewsTypeMapper;
+import sqgxy.xxydz.service.NewsTypeService;
+import org.modelmapper.ModelMapper;
+import org.modelmapper.TypeToken;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 16:48
+ */
+@Service
+public class NewsTypeServiceImpl extends ServiceImpl<NewsTypeMapper, NewsType> implements NewsTypeService {
+
+    @Autowired
+    ModelMapper modelMapper;
+
+    @Override
+    public boolean saveNewsType(String name) {
+        // 检验 name 唯一
+        isExistName(name);
+        return save(NewsType.builder().name(name).build());
+    }
+
+    @Override
+    public boolean removeNewsTypeById(Integer id) {
+        return removeById(id);
+    }
+
+    @Override
+    public boolean updateNewsType(NewsTypeDTO dto) {
+        // 检验 name 唯一
+        isExistName(dto.getName());
+        updateById(modelMapper.map(dto, NewsType.class));
+        return false;
+    }
+
+    @Override
+    public List<NewsTypeDTO> getNewsTypeList() {
+        List<NewsType> list = list(new QueryWrapper<NewsType>().select(ID, NAME));
+        return modelMapper.map(list, new TypeToken<List<NewsTypeDTO>>(){}.getType());
+    }
+
+    /**
+     * 检验 name 唯一性
+     */
+    private void isExistName(String name) {
+        int count = count(new QueryWrapper<NewsType>().eq(NAME, name));
+        if (count > 0) {
+            // name 已经存在
+            throw new HintException(name + "已经存在");
+        }
+    }
+}

+ 62 - 0
src/main/java/sqgxy/xxydz/service/impl/XdStarServiceImpl.java

@@ -0,0 +1,62 @@
+package sqgxy.xxydz.service.impl;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import sqgxy.xxydz.dto.XdstarPageDto;
+import sqgxy.xxydz.entity.XdStar;
+import sqgxy.xxydz.mapper.XdStarMapper;
+import sqgxy.xxydz.service.XdStarService;
+
+import java.util.List;
+
+/**
+ * @author ljz
+ * @date 2022-11-22 16:32
+ */
+@Service
+public class XdStarServiceImpl extends ServiceImpl<XdStarMapper, XdStar> implements XdStarService {
+
+
+    @Autowired
+    XdStarMapper xdstarMapper;
+
+    /**
+     * 分页
+     * @param currentpage
+     * @param pagesize
+     * @return
+     */
+    @Override
+    public XdstarPageDto querypage(int currentpage, int pagesize) {
+        XdstarPageDto dto = new XdstarPageDto();
+        IPage<XdStar> page = new Page<>(currentpage,pagesize);
+        //注意如果需要用 Lambda表达式传参的话 必须使用 LambdaQueryWrapper
+        LambdaQueryWrapper<XdStar> queryWrapper=new LambdaQueryWrapper<>();
+        IPage<XdStar> page1 = xdstarMapper.selectPage(page, queryWrapper);
+        dto.setCurrentpage(currentpage);
+        dto.setPagesize(pagesize);
+        dto.setXdstarList(page1.getRecords());
+        dto.setDatalength(page1.getTotal());
+        return dto ;
+    }
+
+    /**
+     * 模糊查询姓名
+     * @param name
+     * @return
+     */
+    @Override
+    public List<XdStar> LikeByName(String name){
+        QueryWrapper<XdStar> wrapper = new QueryWrapper<>();
+        wrapper.like("name",name);
+        wrapper.lambda().orderByAsc(XdStar::getId);
+        return xdstarMapper.selectList(wrapper);
+    }
+
+}

+ 74 - 0
src/main/java/sqgxy/xxydz/shiro/MyRealm.java

@@ -0,0 +1,74 @@
+package sqgxy.xxydz.shiro;
+
+import sqgxy.xxydz.dto.AdminInformationDTO;
+import sqgxy.xxydz.dto.Principal;
+import sqgxy.xxydz.service.AdminInformationService;
+import org.apache.shiro.authc.*;
+import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
+import org.apache.shiro.authz.AuthorizationInfo;
+import org.apache.shiro.realm.AuthorizingRealm;
+import org.apache.shiro.subject.PrincipalCollection;
+import org.apache.shiro.util.ByteSource;
+import org.modelmapper.ModelMapper;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author xmp
+ * @date 2022-11-21 16:43
+ */
+@Component
+public class MyRealm extends AuthorizingRealm {
+
+    private final AdminInformationService adminInformationService;
+
+    private final ModelMapper modelMapper;
+
+    public MyRealm(AdminInformationService adminInformationService, ModelMapper modelMapper) {
+        this.adminInformationService = adminInformationService;
+        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
+//        //使用MD5加密算法
+//        hashedCredentialsMatcher.setHashAlgorithmName("MD5");
+//        //加密的次数
+//        hashedCredentialsMatcher.setHashIterations(1024);
+//        this.setCredentialsMatcher(hashedCredentialsMatcher);
+        this.modelMapper = modelMapper;
+    }
+
+    /**
+     * 授权
+     */
+    @Override
+    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
+        return null;
+    }
+
+    /**
+     * 认证
+     */
+    @Override
+    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
+        //将AuthenticationToken强转为UsernamePasswordToken
+        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
+        //获取客户端传来的username
+        String username = usernamePasswordToken.getUsername();
+
+        //通过username查找数据库里
+        AdminInformationDTO adminInformation = adminInformationService.getAdminInformationByUsername(username);
+
+        //如果User为null则用户不存在
+        if(adminInformation == null){
+            throw new UnknownAccountException();
+        }
+
+        Principal principal = modelMapper.map(adminInformation, Principal.class);
+
+        /*
+            登录输入用户名和密码,输入的密码会在shiro比较的时候通过MD5加密,
+            然后再和SimpleAuthenticationInfo里传的数据库里的真实密码进行比较(且数据库里的真实密码是已经加密过的字符串)
+         */
+        //盐值:
+        ByteSource byteSource = ByteSource.Util.bytes(username);
+        //SimpleAuthenticationInfo(Object principal, Object hashedCredentials, ByteSource credentialsSalt, String realmName)
+        return new SimpleAuthenticationInfo(principal, adminInformation.getPassword(), byteSource, getName());
+    }
+}

+ 51 - 0
src/main/java/sqgxy/xxydz/shiro/ShiroConfig.java

@@ -0,0 +1,51 @@
+package sqgxy.xxydz.shiro;
+
+import org.apache.shiro.mgt.SecurityManager;
+import org.apache.shiro.realm.Realm;
+import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
+import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @author xmp
+ * @date 2022-11-21 22:15
+ */
+@Configuration
+public class ShiroConfig {
+
+    @Bean
+    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
+        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
+        shiroFilterFactoryBean.setSecurityManager(securityManager);
+
+        // 设置默认登录的 URL,身份认证失败会访问该 URL
+        shiroFilterFactoryBean.setLoginUrl("/login");
+
+        // 设置成功之后要跳转的链接
+        shiroFilterFactoryBean.setSuccessUrl("/");
+
+        // 设置未授权界面,权限认证失败会访问该 URL
+        shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized");
+
+        // LinkedHashMap 是有序的,进行顺序拦截器配置
+        Map<String, String> filterChainMap  = new LinkedHashMap<>();
+        /*
+               1). anon 可以被匿名访问
+               2). authc 必须认证(登录)后才可以访问
+               ......
+        */
+        filterChainMap.put("/**","anon");
+        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainMap);
+        return shiroFilterFactoryBean;
+    }
+
+    @Bean
+    public SecurityManager securityManager(Realm singleRealm){
+        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(singleRealm);
+        return securityManager;
+    }
+}

+ 20 - 0
src/main/java/sqgxy/xxydz/util/HashUtils.java

@@ -0,0 +1,20 @@
+package sqgxy.xxydz.util;
+
+import org.apache.shiro.crypto.hash.SimpleHash;
+import org.apache.shiro.util.ByteSource;
+
+/**
+ * @author xmp
+ * @date 2022-11-22 19:08
+ * 工具类
+ */
+public class HashUtils {
+
+    /**
+     * 对密码进行MD5加密
+     */
+    public static String MD5(String username, String password) {
+        SimpleHash simpleHash = new SimpleHash("MD5", password, ByteSource.Util.bytes(username), 1024);
+        return simpleHash.toString();
+    }
+}

+ 16 - 0
src/main/java/sqgxy/xxydz/util/ShiroUtils.java

@@ -0,0 +1,16 @@
+package sqgxy.xxydz.util;
+
+import sqgxy.xxydz.dto.Principal;
+import org.apache.shiro.SecurityUtils;
+
+/**
+ * @author xmp
+ * @date 2022-11-21 0:42
+ * Shiro
+ */
+public class ShiroUtils {
+
+    public static Principal getPrincipal() {
+        return (Principal) SecurityUtils.getSubject().getPrincipal();
+    }
+}

+ 75 - 0
src/main/java/sqgxy/xxydz/vo/Result.java

@@ -0,0 +1,75 @@
+package sqgxy.xxydz.vo;
+
+import sqgxy.xxydz.enums.ResultCode;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 12:21
+ * 封装接口返回数据的统一结构
+ */
+
+@Data
+public class Result implements Serializable {
+
+    private Integer code;
+
+    private boolean success;
+
+    private String msg;
+
+    private Object data;
+
+    private String cookie;
+
+    public Result() {
+    }
+
+    public Result ok() {
+        return field(this, ResultCode.OK);
+    }
+
+    public Result fail() {
+        return field(this, ResultCode.FAIL);
+    }
+
+    public Result fail(String msg) {
+        Result fail = fail();
+        fail.setMsg(msg);
+        return fail;
+    }
+
+    public Result insufficientPermissions() {
+        return field(this, ResultCode.PERMISSION);
+    }
+
+    public Result insufficientPermissions(String msg) {
+        Result insufficientPermissions = insufficientPermissions();
+        insufficientPermissions.setMsg(msg);
+        return insufficientPermissions;
+    }
+
+    public Result notFound() {
+        return field(this, ResultCode.NOTFOUND);
+    }
+
+    // 链式编程
+    public Result data(Object data) {
+        this.data = data;
+        return this;
+    }
+
+    public Result cookie(String cookie) {
+        this.cookie = cookie;
+        return this;
+    }
+
+    private Result field(Result result, ResultCode code) {
+        result.setCode(code.getCode());
+        result.setSuccess(code.getSuccess());
+        result.setMsg(code.getMsg());
+        return result;
+    }
+}

+ 25 - 0
src/main/java/sqgxy/xxydz/vo/admin/AdminInformationAddVO.java

@@ -0,0 +1,25 @@
+package sqgxy.xxydz.vo.admin;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author xmp
+ * @date 2022-11-23 18:47
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class AdminInformationAddVO {
+
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 密码
+     */
+    private String password;
+}

+ 28 - 0
src/main/java/sqgxy/xxydz/vo/admin/AdminInformationUpdateVO.java

@@ -0,0 +1,28 @@
+package sqgxy.xxydz.vo.admin;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author xmp
+ * @date 2022-11-23 16:22
+ * 管理员修改密码
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class AdminInformationUpdateVO {
+
+    private String username;
+
+    /**
+     * 原来的密码
+     */
+    private String oldPassword;
+
+    /**
+     * 新密码
+     */
+    private String Password;
+}

+ 30 - 0
src/main/java/sqgxy/xxydz/vo/admin/AdminInformationVO.java

@@ -0,0 +1,30 @@
+package sqgxy.xxydz.vo.admin;
+
+import sqgxy.xxydz.enums.AdminRole;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author xmp
+ * @date 2022-11-23 16:22
+ *
+ * 管理员信息表
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class AdminInformationVO {
+
+    private Integer id;
+
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 角色
+     */
+    private AdminRole role;
+}

+ 28 - 0
src/main/java/sqgxy/xxydz/vo/news/NewsAddVO.java

@@ -0,0 +1,28 @@
+package sqgxy.xxydz.vo.news;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 15:36
+ * 新闻主体
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NewsAddVO {
+
+    private String title;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date releaseTime;
+
+    private String content;
+
+    private Integer newsCategoryId;
+}

+ 33 - 0
src/main/java/sqgxy/xxydz/vo/news/NewsUpdateVO.java

@@ -0,0 +1,33 @@
+package sqgxy.xxydz.vo.news;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.format.annotation.DateTimeFormat;
+
+
+import java.util.Date;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 15:36
+ * 新闻主体
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NewsUpdateVO {
+
+    private Integer id;
+
+    private String title;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date releaseTime;
+
+    private Integer hits;
+
+    private String content;
+
+    private Integer newsCategoryId;
+}

+ 30 - 0
src/main/java/sqgxy/xxydz/vo/news/PagingFuzzyQueryListByTitleVO.java

@@ -0,0 +1,30 @@
+package sqgxy.xxydz.vo.news;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author xmp
+ * @date 2022-11-21 14:47
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PagingFuzzyQueryListByTitleVO {
+
+    /**
+     * 标题
+     */
+    private String title;
+
+    /**
+     * 当前页
+     */
+    private Integer current;
+
+    /**
+     * 大小
+     */
+    private Integer size;
+}

+ 27 - 0
src/main/java/sqgxy/xxydz/vo/news/PagingQueryListByNewsCategoryIdVO.java

@@ -0,0 +1,27 @@
+package sqgxy.xxydz.vo.news;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 14:47
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PagingQueryListByNewsCategoryIdVO {
+
+    private Integer newsCategoryId;
+
+    /**
+     * 当前页
+     */
+    private Integer current;
+
+    /**
+     * 大小
+     */
+    private Integer size;
+}

+ 22 - 0
src/main/java/sqgxy/xxydz/vo/news/category/NewsCategoryAddVO.java

@@ -0,0 +1,22 @@
+package sqgxy.xxydz.vo.news.category;
+
+import sqgxy.xxydz.enums.DisplayContent;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 13:54
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NewsCategoryAddVO {
+
+    private String name;
+
+    private Integer newsTypeId;
+
+    private DisplayContent displayContent;
+}

+ 22 - 0
src/main/java/sqgxy/xxydz/vo/news/category/NewsCategoryListVO.java

@@ -0,0 +1,22 @@
+package sqgxy.xxydz.vo.news.category;
+
+import sqgxy.xxydz.enums.DisplayContent;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 14:07
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NewsCategoryListVO {
+
+    private Integer id;
+
+    private String name;
+
+    private DisplayContent displayContent;
+}

+ 24 - 0
src/main/java/sqgxy/xxydz/vo/news/category/NewsCategoryUpdateVO.java

@@ -0,0 +1,24 @@
+package sqgxy.xxydz.vo.news.category;
+
+import sqgxy.xxydz.enums.DisplayContent;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 13:54
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NewsCategoryUpdateVO {
+
+    private Integer id;
+
+    private String name;
+
+    private Integer newsTypeId;
+
+    private DisplayContent displayContent;
+}

+ 19 - 0
src/main/java/sqgxy/xxydz/vo/news/type/NewsTypeVO.java

@@ -0,0 +1,19 @@
+package sqgxy.xxydz.vo.news.type;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author xmp
+ * @date 2022-11-19 21:14
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NewsTypeVO {
+
+    private Integer id;
+
+    private String name;
+}

+ 44 - 0
src/main/resources/application.yml

@@ -0,0 +1,44 @@
+server:
+  port: 10086
+  # 请求头最大大小 10MB
+  max-http-header-size: 10485760
+  servlet:
+    encoding:
+      charset: UTF-8
+
+spring:
+  #resources:
+    #指定静态资源路径,默认为classpath:[/META-INF/resources/,/resources/, /static/, /public/]以及context:/
+    #static-locations: {classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/images,classpath:/static/images/}
+  datasource:
+    driver-class-name: com.mysql.jdbc.Driver
+    #url: jdbc:mysql://180.76.56.118:3306/news_website?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC
+    url: jdbc:mysql://101.35.139.78:3306/sqgxy-xxydz-news?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC
+    #url: jdbc:mysql://180.76.56.118:3306/sqgxy-xxydz-new-localhost?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC
+    username: sqgxy-xxydz-news
+    password: prnte57F7eskjb3G
+
+  jackson:
+    # 使用24小时的时间格式
+    default-property-inclusion: NON_NULL
+    # 设置时区为东八区
+    time-zone: GMT+8
+    date-format: yyyy-MM-dd
+
+  http:
+  servlet:
+    multipart:
+      max-file-size: 10MB
+      max-request-size: 10MB
+
+mybatis-plus:
+  # 枚举类所在包
+  type-enums-package: sqgxy.xxydz.enums
+  configuration:
+    #打印日志sql
+    # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+    # 开启驼峰命名规则
+    map-underscore-to-camel-case: true
+    # 枚举映射
+    default-enum-type-handler: org.apache.ibatis.type.EnumOrdinalTypeHandler
+

+ 18 - 0
src/test/java/sqgxy/xxydz/SqgxyXxydzNewsApplicationTests.java

@@ -0,0 +1,18 @@
+package sqgxy.xxydz;
+
+import sqgxy.xxydz.service.NewsService;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class SqgxyXxydzNewsApplicationTests {
+
+    @Autowired
+    NewsService newsService;
+
+    @Test
+    void contextLoads() {
+    }
+
+}