From 346726133d71b9eba6af260c0579b947b92d324a Mon Sep 17 00:00:00 2001 From: tx <15413105+tx3800@user.noreply.gitee.com> Date: Thu, 27 Feb 2025 10:43:06 +0800 Subject: [PATCH] 1 --- .gitignore | 38 ++++ .idea/.gitignore | 8 + .idea/dataSources.xml | 17 ++ .idea/encodings.xml | 13 ++ .idea/misc.xml | 14 ++ .idea/uiDesigner.xml | 124 ++++++++++ .idea/vcs.xml | 6 + common/pom.xml | 88 ++++++++ .../java/net/carbon/bean/PageRequest.java | 24 ++ .../java/net/carbon/bean/PageResponse.java | 58 +++++ .../carbon/config/MybatisPlusPageConfig.java | 31 +++ .../java/net/carbon/config/SwaggerConfig.java | 35 +++ .../carbon/config/SwaggerConfiguration.java | 118 ++++++++++ .../carbon/config/SwaggerOpenApiConfig.java | 39 ++++ .../java/net/carbon/enums/BizCodeEnum.java | 62 +++++ .../net/carbon/exception/BizException.java | 25 ++ .../carbon/handler/CustomExceptionHandle.java | 30 +++ .../carbon/interceptor/LoginInterceptor.java | 64 ++++++ .../main/java/net/carbon/model/LoginUser.java | 21 ++ .../main/java/net/carbon/result/Result.java | 39 ++++ .../main/java/net/carbon/utils/CheckUtil.java | 83 +++++++ .../java/net/carbon/utils/CommonUtil.java | 165 ++++++++++++++ .../main/java/net/carbon/utils/JWTUtil.java | 76 +++++++ .../main/java/net/carbon/utils/JsonData.java | 90 ++++++++ pom.xml | 213 ++++++++++++++++++ server/pom.xml | 101 +++++++++ .../java/net/carbon/ServerApplication.java | 18 ++ .../net/carbon/config/InterceptorConfig.java | 24 ++ .../controller/CarbonEmissionController.java | 48 ++++ .../controller/EconomicsController.java | 118 ++++++++++ .../carbon/controller/LabelController.java | 71 ++++++ .../controller/TimelyWarningController.java | 45 ++++ .../net/carbon/controller/UserController.java | 60 +++++ .../carbon/mapper/CarbonEmissionMapper.java | 18 ++ .../net/carbon/mapper/EconomicsMapper.java | 20 ++ .../java/net/carbon/mapper/LabelMapper.java | 18 ++ .../carbon/mapper/TimelyWarningMapper.java | 13 ++ .../java/net/carbon/mapper/UserMapper.java | 19 ++ .../net/carbon/model/CarbonEmissionDO.java | 61 +++++ .../main/java/net/carbon/model/UserDO.java | 31 +++ .../net/carbon/model/po/CarbonEmissionDO.java | 61 +++++ .../java/net/carbon/model/po/EconomicsDO.java | 65 ++++++ .../java/net/carbon/model/po/LabelDO.java | 66 ++++++ .../net/carbon/model/po/TimelyWarningDO.java | 31 +++ .../main/java/net/carbon/model/po/UserDO.java | 88 ++++++++ .../model/request/EconomicsUpdateRequest.java | 18 ++ .../model/request/LabelUpdateRequest.java | 37 +++ .../model/request/TimelyWarningRequest.java | 17 ++ .../model/request/UserLoginRequest.java | 20 ++ .../model/request/UserRegisterRequest.java | 14 ++ .../java/net/carbon/model/vo/EconomicsVO.java | 35 +++ .../java/net/carbon/model/vo/LabelVO.java | 39 ++++ .../net/carbon/model/vo/TimelyWarningVO.java | 22 ++ .../main/java/net/carbon/model/vo/UserVO.java | 45 ++++ .../net/carbon/request/UserLoginRequest.java | 20 ++ .../carbon/request/UserRegisterRequest.java | 17 ++ .../carbon/service/CarbonEmissionService.java | 23 ++ .../net/carbon/service/EconomicsService.java | 24 ++ .../java/net/carbon/service/LabelService.java | 28 +++ .../carbon/service/TimelyWarningService.java | 16 ++ .../java/net/carbon/service/UserService.java | 39 ++++ .../impl/CarbonEmissionServiceImpl.java | 68 ++++++ .../service/impl/EconomicsServiceImpl.java | 74 ++++++ .../carbon/service/impl/LabelServiceImpl.java | 76 +++++++ .../impl/TimelyWarningServiceImpl.java | 67 ++++++ .../carbon/service/impl/UserServiceImpl.java | 139 ++++++++++++ .../net/carbon/vo/CarbonTimelyAlertVO.java | 50 ++++ .../src/main/java/net/carbon/vo/CarbonVO.java | 42 ++++ server/src/main/resources/application.yml | 34 +++ .../resources/mapper/CarbonEmissionMapper.xml | 30 +++ .../main/resources/mapper/EconomicsMapper.xml | 6 + .../src/main/resources/mapper/LabelMapper.xml | 7 + .../resources/mapper/TimelyWarningMapper.xml | 7 + .../src/main/resources/mapper/UserMapper.xml | 27 +++ .../test/java/biz/MyBatisPlusGenerator.java | 122 ++++++++++ 75 files changed, 3620 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/dataSources.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 .idea/vcs.xml create mode 100644 common/pom.xml create mode 100644 common/src/main/java/net/carbon/bean/PageRequest.java create mode 100644 common/src/main/java/net/carbon/bean/PageResponse.java create mode 100644 common/src/main/java/net/carbon/config/MybatisPlusPageConfig.java create mode 100644 common/src/main/java/net/carbon/config/SwaggerConfig.java create mode 100644 common/src/main/java/net/carbon/config/SwaggerConfiguration.java create mode 100644 common/src/main/java/net/carbon/config/SwaggerOpenApiConfig.java create mode 100644 common/src/main/java/net/carbon/enums/BizCodeEnum.java create mode 100644 common/src/main/java/net/carbon/exception/BizException.java create mode 100644 common/src/main/java/net/carbon/handler/CustomExceptionHandle.java create mode 100644 common/src/main/java/net/carbon/interceptor/LoginInterceptor.java create mode 100644 common/src/main/java/net/carbon/model/LoginUser.java create mode 100644 common/src/main/java/net/carbon/result/Result.java create mode 100644 common/src/main/java/net/carbon/utils/CheckUtil.java create mode 100644 common/src/main/java/net/carbon/utils/CommonUtil.java create mode 100644 common/src/main/java/net/carbon/utils/JWTUtil.java create mode 100644 common/src/main/java/net/carbon/utils/JsonData.java create mode 100644 pom.xml create mode 100644 server/pom.xml create mode 100644 server/src/main/java/net/carbon/ServerApplication.java create mode 100644 server/src/main/java/net/carbon/config/InterceptorConfig.java create mode 100644 server/src/main/java/net/carbon/controller/CarbonEmissionController.java create mode 100644 server/src/main/java/net/carbon/controller/EconomicsController.java create mode 100644 server/src/main/java/net/carbon/controller/LabelController.java create mode 100644 server/src/main/java/net/carbon/controller/TimelyWarningController.java create mode 100644 server/src/main/java/net/carbon/controller/UserController.java create mode 100644 server/src/main/java/net/carbon/mapper/CarbonEmissionMapper.java create mode 100644 server/src/main/java/net/carbon/mapper/EconomicsMapper.java create mode 100644 server/src/main/java/net/carbon/mapper/LabelMapper.java create mode 100644 server/src/main/java/net/carbon/mapper/TimelyWarningMapper.java create mode 100644 server/src/main/java/net/carbon/mapper/UserMapper.java create mode 100644 server/src/main/java/net/carbon/model/CarbonEmissionDO.java create mode 100644 server/src/main/java/net/carbon/model/UserDO.java create mode 100644 server/src/main/java/net/carbon/model/po/CarbonEmissionDO.java create mode 100644 server/src/main/java/net/carbon/model/po/EconomicsDO.java create mode 100644 server/src/main/java/net/carbon/model/po/LabelDO.java create mode 100644 server/src/main/java/net/carbon/model/po/TimelyWarningDO.java create mode 100644 server/src/main/java/net/carbon/model/po/UserDO.java create mode 100644 server/src/main/java/net/carbon/model/request/EconomicsUpdateRequest.java create mode 100644 server/src/main/java/net/carbon/model/request/LabelUpdateRequest.java create mode 100644 server/src/main/java/net/carbon/model/request/TimelyWarningRequest.java create mode 100644 server/src/main/java/net/carbon/model/request/UserLoginRequest.java create mode 100644 server/src/main/java/net/carbon/model/request/UserRegisterRequest.java create mode 100644 server/src/main/java/net/carbon/model/vo/EconomicsVO.java create mode 100644 server/src/main/java/net/carbon/model/vo/LabelVO.java create mode 100644 server/src/main/java/net/carbon/model/vo/TimelyWarningVO.java create mode 100644 server/src/main/java/net/carbon/model/vo/UserVO.java create mode 100644 server/src/main/java/net/carbon/request/UserLoginRequest.java create mode 100644 server/src/main/java/net/carbon/request/UserRegisterRequest.java create mode 100644 server/src/main/java/net/carbon/service/CarbonEmissionService.java create mode 100644 server/src/main/java/net/carbon/service/EconomicsService.java create mode 100644 server/src/main/java/net/carbon/service/LabelService.java create mode 100644 server/src/main/java/net/carbon/service/TimelyWarningService.java create mode 100644 server/src/main/java/net/carbon/service/UserService.java create mode 100644 server/src/main/java/net/carbon/service/impl/CarbonEmissionServiceImpl.java create mode 100644 server/src/main/java/net/carbon/service/impl/EconomicsServiceImpl.java create mode 100644 server/src/main/java/net/carbon/service/impl/LabelServiceImpl.java create mode 100644 server/src/main/java/net/carbon/service/impl/TimelyWarningServiceImpl.java create mode 100644 server/src/main/java/net/carbon/service/impl/UserServiceImpl.java create mode 100644 server/src/main/java/net/carbon/vo/CarbonTimelyAlertVO.java create mode 100644 server/src/main/java/net/carbon/vo/CarbonVO.java create mode 100644 server/src/main/resources/application.yml create mode 100644 server/src/main/resources/mapper/CarbonEmissionMapper.xml create mode 100644 server/src/main/resources/mapper/EconomicsMapper.xml create mode 100644 server/src/main/resources/mapper/LabelMapper.xml create mode 100644 server/src/main/resources/mapper/TimelyWarningMapper.xml create mode 100644 server/src/main/resources/mapper/UserMapper.xml create mode 100644 server/src/test/java/biz/MyBatisPlusGenerator.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 0000000..08dae01 --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,17 @@ + + + + + mysql.8 + true + com.mysql.cj.jdbc.Driver + jdbc:mysql://106.52.88.120:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai + + + + + + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..e2ccb78 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..99cf25c --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/common/pom.xml b/common/pom.xml new file mode 100644 index 0000000..fbbcb36 --- /dev/null +++ b/common/pom.xml @@ -0,0 +1,88 @@ + + + 4.0.0 + + net.carbon + CarbonNeutrality + 1.0-SNAPSHOT + + + common + 1.0-SNAPSHOT + + + org.projectlombok + lombok + + + + com.github.xiaoymin + knife4j-openapi3-jakarta-spring-boot-starter + + + + + org.springframework.boot + spring-boot-starter-web + + + + com.baomidou + mybatis-plus-spring-boot3-starter + + + + + + org.apache.commons + commons-lang3 + + + + + commons-codec + commons-codec + + + + + io.jsonwebtoken + jjwt + + + + org.testng + testng + RELEASE + compile + + + + com.alibaba + fastjson + + + + com.baomidou + mybatis-plus-jsqlparser + + + + javax.xml.bind + jaxb-api + + + org.glassfish.jaxb + jaxb-runtime + + + + + + 17 + 17 + UTF-8 + + + \ No newline at end of file diff --git a/common/src/main/java/net/carbon/bean/PageRequest.java b/common/src/main/java/net/carbon/bean/PageRequest.java new file mode 100644 index 0000000..9c01324 --- /dev/null +++ b/common/src/main/java/net/carbon/bean/PageRequest.java @@ -0,0 +1,24 @@ +package net.carbon.bean; + +import lombok.Data; +import lombok.Setter; + +@Setter +public class PageRequest { + private Long pageNo = 1L; + private Long pageSize = 10L; + + public Long getPageNo() { + if (pageNo == null || pageNo < 1) { + return 1L; + } + return pageNo; + } + + public Long getPageSize() { + if (pageSize == null || pageSize < 1 || pageSize > Long.MAX_VALUE) { + return 10L; + } + return pageSize; + } +} diff --git a/common/src/main/java/net/carbon/bean/PageResponse.java b/common/src/main/java/net/carbon/bean/PageResponse.java new file mode 100644 index 0000000..1c1b860 --- /dev/null +++ b/common/src/main/java/net/carbon/bean/PageResponse.java @@ -0,0 +1,58 @@ +package net.carbon.bean; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Getter; +import lombok.Setter; + +import java.util.Collections; +import java.util.List; + +@Setter +@Getter +@JsonFormat +public class PageResponse { + private Long pageNo = 1L; + private Long pageSize = 10L; + private Long total = 0L; + private Long totalPages = 0L; + private List records = Collections.emptyList(); + private Long start = 0L; + private Long end = 0L; + + public PageResponse() { + } + + public void setRecords(List records) { + this.records = records; + if (records != null && records.size() > 0 && this.total == 0) { + setTotal(Long.valueOf(records.size())); + } + } + + public void setCurrent(Long pageNo) { + if (pageNo != null && pageNo > 0) { + this.pageNo = pageNo; + } + } + + public void setPageSize(Long pageSize) { + if (pageSize != null && pageSize > 0) { + this.pageSize = pageSize; + } + } + + public void setTotal(Long total) { + this.total = total; + if (total == -1) { + this.pageNo = 1L; + return; + } + if (total > 0) { + this.totalPages = (total / pageSize) + (total % pageSize == 0 ? 0 : 1); + } else { + this.totalPages = 0L; + } + this.start = (this.pageNo > 0) ? (this.pageNo - 1) * this.pageSize : 0; + this.end = (this.start - 1 + this.pageSize * (this.pageNo > 0 ? 1 : 0)); + } +} diff --git a/common/src/main/java/net/carbon/config/MybatisPlusPageConfig.java b/common/src/main/java/net/carbon/config/MybatisPlusPageConfig.java new file mode 100644 index 0000000..68e0a13 --- /dev/null +++ b/common/src/main/java/net/carbon/config/MybatisPlusPageConfig.java @@ -0,0 +1,31 @@ +package net.carbon.config; + + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class MybatisPlusPageConfig { + + /* 旧版本配置 + @Bean + public PaginationInterceptor paginationInterceptor(){ + return new PaginationInterceptor(); + }*/ + + /** + * 新的分页插件,一缓和二缓遵循mybatis的规则, + * 需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题 + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return interceptor; + } + + +} \ No newline at end of file diff --git a/common/src/main/java/net/carbon/config/SwaggerConfig.java b/common/src/main/java/net/carbon/config/SwaggerConfig.java new file mode 100644 index 0000000..06e496e --- /dev/null +++ b/common/src/main/java/net/carbon/config/SwaggerConfig.java @@ -0,0 +1,35 @@ +package net.carbon.config; + +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.ExternalDocumentation; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.License; +import io.swagger.v3.oas.models.media.StringSchema; +import io.swagger.v3.oas.models.parameters.HeaderParameter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class SwaggerConfig implements WebMvcConfigurer { + + @Value("${spring.application.name}") + private String applicationName; + + @Bean + public OpenAPI springShopOpenAPI() { + return new OpenAPI() + .components(new Components() + .addParameters("token", new HeaderParameter().description("请填写Token").schema(new StringSchema())) + .addParameters("adminID", new HeaderParameter().description("请填写用户ID").schema(new StringSchema()))) + .info(new Info().title(applicationName) + .description("Knife4j增强文档") + .version("v2.0") + .license(new License().name("Apache 2.0").url("http://springdoc.org"))) + .externalDocs(new ExternalDocumentation() + .description("二饭快速开发框架") + .url("https://gitee.com/StandFast")); + } +} \ No newline at end of file diff --git a/common/src/main/java/net/carbon/config/SwaggerConfiguration.java b/common/src/main/java/net/carbon/config/SwaggerConfiguration.java new file mode 100644 index 0000000..3647f8a --- /dev/null +++ b/common/src/main/java/net/carbon/config/SwaggerConfiguration.java @@ -0,0 +1,118 @@ +package net.carbon.config; + + +import lombok.Data; +import org.springframework.context.annotation.Bean; +import org.springframework.http.HttpMethod; +import org.springframework.stereotype.Component; +import springfox.documentation.builders.*; +import springfox.documentation.oas.annotations.EnableOpenApi; +import springfox.documentation.schema.ScalarType; +import springfox.documentation.service.*; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; + +import java.util.ArrayList; +import java.util.List; + +@Component +@EnableOpenApi +@Data +public class SwaggerConfiguration { + + + /** + * C端文档 + * @return + */ + @Bean + public Docket webApiDoc() { + + + return new Docket(DocumentationType.OAS_30) + .groupName("用户端接口文档") + .pathMapping("/") + // 定义是否开启swagger,false为关闭,可以通过变量控制,线上关闭 + .enable(true) + //配置api文档元信息 + .apiInfo(apiInfo()) + // 选择哪些接口作为swagger的doc发布 + .select() + .apis(RequestHandlerSelectors.basePackage("net.carbon")) + //正则匹配请求路径,并分配至当前分组 + .paths(PathSelectors.ant("/api/**")) + .build() + //新版swagger3.0配置 + .globalRequestParameters(getGlobalRequestParameters()) + .globalResponses(HttpMethod.GET, getGlobalResponseMessage()) + .globalResponses(HttpMethod.POST, getGlobalResponseMessage()); + } + + + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("碳中和") + .description("接口文档") + .contact(new Contact("jieyuu", "https://106.52.88.120", "645634619@qq.com")) + .version("12") + .build(); + } + + /** + * 管理端文档 + * @return + */ + @Bean + public Docket adminApiDoc() { + return new Docket(DocumentationType.OAS_30) + .groupName("管理端接口文档") + .pathMapping("/") + // 定义是否开启swagger,false为关闭,可以通过变量控制,线上关闭 + .enable(true) + //配置api文档元信息 + .apiInfo(apiInfo()) + // 选择哪些接口作为swagger的doc发布 + .select() + .apis(RequestHandlerSelectors.basePackage("net.jieyuu")) + //正则匹配请求路径,并分配至当前分组 + .paths(PathSelectors.ant("/admin/**")) + .build(); + } + + /** + * 生成全局通用参数, 支持配置多个响应参数 + * @return + */ + private List getGlobalRequestParameters() { + List parameters = new ArrayList<>(); + parameters.add(new RequestParameterBuilder() + .name("token") + .description("登录令牌") + .in(ParameterType.HEADER) + .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING))) + .required(false) + .build()); + +// parameters.add(new RequestParameterBuilder() +// .name("version") +// .description("版本号") +// .required(true) +// .in(ParameterType.HEADER) +// .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING))) +// .required(false) +// .build()); + return parameters; + } + + /** + * 生成通用响应信息 + * + * @return + */ + private List getGlobalResponseMessage() { + List responseList = new ArrayList<>(); + responseList.add(new ResponseBuilder().code("4xx").description("请求错误,根据code和msg检查").build()); + return responseList; + } + +} \ No newline at end of file diff --git a/common/src/main/java/net/carbon/config/SwaggerOpenApiConfig.java b/common/src/main/java/net/carbon/config/SwaggerOpenApiConfig.java new file mode 100644 index 0000000..22f3cca --- /dev/null +++ b/common/src/main/java/net/carbon/config/SwaggerOpenApiConfig.java @@ -0,0 +1,39 @@ +package net.carbon.config; + +import io.swagger.v3.oas.annotations.ExternalDocumentation; +import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.annotations.info.Contact; +import io.swagger.v3.oas.annotations.info.Info; +import io.swagger.v3.oas.annotations.info.License; +import io.swagger.v3.oas.annotations.servers.Server; +import org.springframework.boot.SpringBootConfiguration; + +/** + * @author jieyuu + **/ +//@SpringBootConfiguration +//@OpenAPIDefinition( +// // ## API的基本信息,包括标题、版本号、描述、联系人等 +// info = @Info( +// title = "双碳项目接口文档", // Api接口文档标题(必填) +// description = "用于双碳项目接口开发文档", // Api接口文档描述 +// version = "1.0", // Api接口版本 +// termsOfService = "https://example.com/", // Api接口的服务条款地址 +// contact = @Contact( +// name = "蚂蚁小哥", // 作者名称 +// email = "xiaofeng@qq.com", // 作者邮箱 +// url = "https://www.cnblogs.com/antLaddie/" // 介绍作者的URL地址 +// ), +// license = @License( // 设置联系人信息 +// name = "Apache 2.0", // 授权名称 +// url = "https://www.apache.org/licenses/LICENSE-2.0.html" // 授权信息 +// ) +// ), +// // ## 表示服务器地址或者URL模板列表,多个服务地址随时切换(只不过是有多台IP有当前的服务API) +// servers = { +// @Server(url = "http://192.168.2.235/demo/", description = "本地服务器一服务"), +// @Server(url = "http://192.168.2.236/demo/", description = "本地服务器二服务"), +// }, +// externalDocs = @ExternalDocumentation(description = "更多内容请查看该链接", url = "xxx")) +//public class SwaggerOpenApiConfig { +//} \ No newline at end of file diff --git a/common/src/main/java/net/carbon/enums/BizCodeEnum.java b/common/src/main/java/net/carbon/enums/BizCodeEnum.java new file mode 100644 index 0000000..dead2cf --- /dev/null +++ b/common/src/main/java/net/carbon/enums/BizCodeEnum.java @@ -0,0 +1,62 @@ +package net.carbon.enums; + +import lombok.Getter; + +/** + * @Description 状态码定义约束,共6位数,前三位代表服务,后4位代表接口 + * 比如 商品服务210,购物车是220、用户服务230,403代表权限 + **/ +public enum BizCodeEnum { + + + /** + * 通用操作码 + */ + OPS_REPEAT(110001, "重复操作"), + + /** + * 验证码 + */ + CODE_TO_ERROR(240001, "接收号码不合规"), + + CODE_LIMITED(240002, "验证码发送过快"), + + CODE_ERROR(240003, "验证码错误"), + + CODE_CAPTCHA(240101, "图形验证码错误"), + + /** + * 账号 + */ + ACCOUNT_REPEAT(250001, "账号已经存在"), + + ACCOUNT_UNREGISTER(250002, "账号不存在"), + + ACCOUNT_PWD_ERROR(250003, "账号或者密码错误"), + + ACCOUNT_UNLOGIN(250004, "账号未登录"), + + ILLEGAL_ARGUMENT(250005, "参数非法"), + + + /** + * 流控操作 + */ + + CONTROL_FLOW(500101, "限流控制"), + + CONTROL_DEGRADE(500201, "降级控制"), + + CONTROL_AUTH(500301, "认证控制"); + + @Getter + private int code; + + @Getter + private String message; + + private BizCodeEnum(int code, String message) { + this.code = code; + this.message = message; + } +} \ No newline at end of file diff --git a/common/src/main/java/net/carbon/exception/BizException.java b/common/src/main/java/net/carbon/exception/BizException.java new file mode 100644 index 0000000..1f79ff9 --- /dev/null +++ b/common/src/main/java/net/carbon/exception/BizException.java @@ -0,0 +1,25 @@ +package net.carbon.exception; + + +import lombok.Data; +import net.carbon.enums.BizCodeEnum; + +@Data +public class BizException extends RuntimeException { + + private Integer code; + private String msg; + + public BizException(Integer code, String message) { + super(message); + this.code = code; + this.msg = message; + } + + public BizException(BizCodeEnum bizCodeEnum) { + super(bizCodeEnum.getMessage()); + this.code = bizCodeEnum.getCode(); + this.msg = bizCodeEnum.getMessage(); + } + +} \ No newline at end of file diff --git a/common/src/main/java/net/carbon/handler/CustomExceptionHandle.java b/common/src/main/java/net/carbon/handler/CustomExceptionHandle.java new file mode 100644 index 0000000..ff9599a --- /dev/null +++ b/common/src/main/java/net/carbon/handler/CustomExceptionHandle.java @@ -0,0 +1,30 @@ +package net.carbon.handler; + +import lombok.extern.slf4j.Slf4j; +import net.carbon.exception.BizException; + +import net.carbon.utils.JsonData; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +@ControllerAdvice +@Slf4j +public class CustomExceptionHandle { + + @ExceptionHandler(value = Exception.class) + @ResponseBody + public JsonData Handle(Exception e) { + + if (e instanceof BizException) { + BizException bizException = (BizException) e; + log.info("[业务异常]{}", e); + return JsonData.buildCodeAndMsg(bizException.getCode(), bizException.getMsg()); + + } else { + log.info("[系统异常]{}", e); + return JsonData.buildError("全局异常,未知错误"); + } + + } +} \ No newline at end of file diff --git a/common/src/main/java/net/carbon/interceptor/LoginInterceptor.java b/common/src/main/java/net/carbon/interceptor/LoginInterceptor.java new file mode 100644 index 0000000..846902c --- /dev/null +++ b/common/src/main/java/net/carbon/interceptor/LoginInterceptor.java @@ -0,0 +1,64 @@ +package net.carbon.interceptor; + +import io.jsonwebtoken.Claims; +import lombok.extern.slf4j.Slf4j; + +import net.carbon.enums.BizCodeEnum; +import net.carbon.model.LoginUser; +import net.carbon.utils.CommonUtil; +import net.carbon.utils.JWTUtil; +import net.carbon.utils.JsonData; +import org.apache.commons.lang3.StringUtils; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + + +@Slf4j +public class LoginInterceptor implements HandlerInterceptor { + + public static ThreadLocal threadLocal = new ThreadLocal<>(); + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + String accessToken = request.getHeader("token"); + + if (accessToken == null) { + accessToken = request.getParameter("token"); + } + + //不为空 + if (StringUtils.isNotBlank(accessToken)) { + Claims claims = JWTUtil.checkJWT(accessToken); + if (claims == null) { + //未登录 + CommonUtil.sendJsonMessage(response, JsonData.buildResult(BizCodeEnum.ACCOUNT_UNLOGIN)); + return false; + } + long userId = Long.valueOf(claims.get("id").toString()); + String name = (String) claims.get("username"); + + LoginUser loginUser = LoginUser.builder() + .id(userId) + .username(name) + .build(); + + //通过threadlocal传递用户信息 + threadLocal.set(loginUser); + return true; + } + //未登录 + CommonUtil.sendJsonMessage(response, JsonData.buildResult(BizCodeEnum.ACCOUNT_UNLOGIN)); + return false; + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + } +} diff --git a/common/src/main/java/net/carbon/model/LoginUser.java b/common/src/main/java/net/carbon/model/LoginUser.java new file mode 100644 index 0000000..c5f48e7 --- /dev/null +++ b/common/src/main/java/net/carbon/model/LoginUser.java @@ -0,0 +1,21 @@ +package net.carbon.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class LoginUser { + private Long id; + + private String username; +} diff --git a/common/src/main/java/net/carbon/result/Result.java b/common/src/main/java/net/carbon/result/Result.java new file mode 100644 index 0000000..4113008 --- /dev/null +++ b/common/src/main/java/net/carbon/result/Result.java @@ -0,0 +1,39 @@ +package net.carbon.result; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 后端统一返回结果 + * + * @param + */ +@Data +public class Result implements Serializable { + + private Integer code; // 编码:1成功,0和其它数字为失败 + private String msg; // 错误信息 + private T data; // 数据 + + public static Result success() { + Result result = new Result(); + result.code = 1; + return result; + } + + public static Result success(T object) { + Result result = new Result(); + result.data = object; + result.code = 1; + return result; + } + + public static Result error(String msg) { + Result result = new Result<>(); + result.msg = msg; + result.code = 0; + return result; + } + +} diff --git a/common/src/main/java/net/carbon/utils/CheckUtil.java b/common/src/main/java/net/carbon/utils/CheckUtil.java new file mode 100644 index 0000000..01e8ec7 --- /dev/null +++ b/common/src/main/java/net/carbon/utils/CheckUtil.java @@ -0,0 +1,83 @@ +package net.carbon.utils; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class CheckUtil { + + /** + * 邮箱正则 + */ + private static final Pattern MAIL_PATTERN = Pattern.compile("^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$"); + + /** + * 手机号正则,暂时未用 + */ + private static final Pattern PHONE_PATTERN = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$"); + + /** + * 密码正则 + * 只能包含字母(大小写)和数字。 + * 长度必须在6到16个字符之间。 + */ + private static final Pattern PASSWORD_PATTERN = Pattern.compile("^[a-zA-Z0-9]{6,16}$"); + + /** + * 用户名正则 + * 用户名只能包含字母(大小写)和数字。 + * 用户名长度必须在6到16个字符之间。 + */ + private static final Pattern USERNAME_PATTERN = Pattern.compile("^[a-zA-Z0-9]{6,16}$"); + /** + * @param email + * @return + */ + public static boolean isEmail(String email) { + if (null == email || "".equals(email)) { + return false; + } + Matcher m = MAIL_PATTERN.matcher(email); + return m.matches(); + } + + /** + * 手机号验证 + * @param phone + * @return + */ + public static boolean isPhone(String phone) { + if (null == phone || "".equals(phone)) { + return false; + } + Matcher m = PHONE_PATTERN.matcher(phone); + return m.matches(); + + } + + /** + * 密码验证 + * @param password + * @return + */ + public static boolean isPassword(String password) { + if (null == password || "".equals(password)) { + return false; + } + Matcher m = PASSWORD_PATTERN.matcher(password); + return m.matches(); + } + + /** + * 用户名验证 + * @param username + * @return + */ + public static boolean isUsername(String username) { + if (null == username || "".equals(username)) { + return false; + } + Matcher m = USERNAME_PATTERN.matcher(username); + return m.matches(); + } + +} \ No newline at end of file diff --git a/common/src/main/java/net/carbon/utils/CommonUtil.java b/common/src/main/java/net/carbon/utils/CommonUtil.java new file mode 100644 index 0000000..0f7e160 --- /dev/null +++ b/common/src/main/java/net/carbon/utils/CommonUtil.java @@ -0,0 +1,165 @@ +package net.carbon.utils; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.security.MessageDigest; +import java.util.Random; +import java.util.UUID; + +@Slf4j +public class CommonUtil { + + /** + * 获取ip + * + * @param request + * @return + */ + public static String getIpAddr(HttpServletRequest request) { + String ipAddress = null; + try { + ipAddress = request.getHeader("x-forwarded-for"); + if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("Proxy-Client-IP"); + } + if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("WL-Proxy-Client-IP"); + } + if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getRemoteAddr(); + if (ipAddress.equals("127.0.0.1")) { + // 根据网卡取本机配置的IP + InetAddress inet = null; + try { + inet = InetAddress.getLocalHost(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + ipAddress = inet.getHostAddress(); + } + } + // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割 + if (ipAddress != null && ipAddress.length() > 15) { + // "***.***.***.***".length() + // = 15 + if (ipAddress.indexOf(",") > 0) { + ipAddress = ipAddress.substring(0, ipAddress.indexOf(",")); + } + } + } catch (Exception e) { + ipAddress = ""; + } + return ipAddress; + } + + + /** + * MD5加密 + * + * @param data + * @return + */ + public static String MD5(String data) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] array = md.digest(data.getBytes("UTF-8")); + StringBuilder sb = new StringBuilder(); + for (byte item : array) { + sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3)); + } + + return sb.toString().toUpperCase(); + } catch (Exception exception) { + } + return null; + + } + + /** + * 生成随机数 + * + * @param length + * @return + */ + + public static String getRandomCode(int length) { + String sources = "0123456789"; + Random random = new Random(); + StringBuilder stringBuilder = new StringBuilder(); + for (int i = 0; i < length; i++) { + stringBuilder.append(sources.charAt(random.nextInt(9))); + } + return stringBuilder.toString(); + + } + + /** + * 生成UUID + * + * @return + */ + public static String generateUUID() { + return UUID.randomUUID().toString() + //删除- + .replaceAll("-", "") + //截取前32位 + .substring(0, 32); + } + + /** + * 获取当前时间戳 + * + * @return + */ + public static long getCurrentTimestamp() { + return System.currentTimeMillis(); + } + + /** + * 生成指定长度随机串 + * + * @param length + * @return + */ + private static final String ALL_CHAR_NUM = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + + public static String getStringNumRandom(int length) { + //生成随机数字和字母, + Random random = new Random(); + StringBuilder saltString = new StringBuilder(length); + for (int i = 1; i <= length; ++i) { + saltString.append(ALL_CHAR_NUM.charAt(random.nextInt(ALL_CHAR_NUM.length()))); + } + return saltString.toString(); + } + + /** + * 响应json数据给前端 + * @param response + * @param obj + */ + public static void sendJsonMessage(HttpServletResponse response, Object obj) { + ObjectMapper objectMapper = new ObjectMapper(); + + response.setContentType("application/json; charset=utf-8"); + + try(PrintWriter writer=response.getWriter()){ + writer.print(objectMapper.writeValueAsString(obj)); + writer.close(); + + response.flushBuffer(); + + }catch(IOException e){ + log.warn("响应json数据给前端异常:{}",e); + } + + } + +} diff --git a/common/src/main/java/net/carbon/utils/JWTUtil.java b/common/src/main/java/net/carbon/utils/JWTUtil.java new file mode 100644 index 0000000..0965adf --- /dev/null +++ b/common/src/main/java/net/carbon/utils/JWTUtil.java @@ -0,0 +1,76 @@ +package net.carbon.utils; + + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import lombok.extern.slf4j.Slf4j; +import net.carbon.model.LoginUser; + +import java.util.Date; + + +@Slf4j +public class JWTUtil { + + /** + * 过期时间 + * 1000毫秒 * 60秒 * 60分钟 * 24小时 * 7天 * 10 + */ + private static final long EXPIRE = 1000 * 60 * 60 * 24 * 7 * 10; + + /** + * 加密密钥 + */ + private static final String SECRET = "net.carbon"; + /** + * 令牌前缀 + */ + private static final String TOKEN_PREFIX = "carbon"; + + /** + * 令牌前缀 + */ + private static final String SUBJECT = "carbonemission"; + + /** + * 根据用户信息,生成令牌 + * + * @param user + * @return + */ + public static String geneJsonWebToken(LoginUser user) { + Long userId = user.getId(); + String token = Jwts.builder().setSubject(SUBJECT) + .claim("id", userId) + .claim("username", user.getUsername()) + .setIssuedAt(new Date()) + .setExpiration(new Date(System.currentTimeMillis() + EXPIRE)) + .signWith(SignatureAlgorithm.HS256, SECRET).compact(); + + token = TOKEN_PREFIX + token; + return token; + } + + + /** + * 校验token的方法 + * + * @param token + * @return + */ + public static Claims checkJWT(String token) { + try { + final Claims claims = Jwts.parser() + .setSigningKey(SECRET) + .parseClaimsJws(token.replace(TOKEN_PREFIX, "")) + .getBody(); + + return claims; + + } catch (Exception e) { + log.info("jwt token解密失败"); + return null; + } + } +} diff --git a/common/src/main/java/net/carbon/utils/JsonData.java b/common/src/main/java/net/carbon/utils/JsonData.java new file mode 100644 index 0000000..67b4255 --- /dev/null +++ b/common/src/main/java/net/carbon/utils/JsonData.java @@ -0,0 +1,90 @@ +package net.carbon.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import net.carbon.enums.BizCodeEnum; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class JsonData { + + /** + * 状态码 0 表示成功,1表示处理中,-1表示失败 + */ + private Integer code; + + /** + * 数据 + */ + private Object data; + + /** + * 描述 + */ + private String msg; + + + /** + * 获取远程调用数据对象 + * 注意 支持多单词下划线转驼峰(序列化和反序列化) + * 空对象不序列化 + */ + public T getData(TypeReference typeReference) { + return JSON.parseObject(JSON.toJSONString(data), typeReference); + } + + /** + * 成功,传入数据 + * + * @return + */ + public static JsonData buildSuccess() { + return new JsonData(0, null, null); + } + + /** + * 成功,传入数据 + * + * @param data + * @return + */ + public static JsonData buildSuccess(Object data) { + return new JsonData(0, data, null); + } + + /** + * 失败,传入描述信息 + * + * @param msg + * @return + */ + public static JsonData buildError(String msg) { + return new JsonData(-1, null, msg); + } + + + /** + * 自定义状态码和错误信息 + * + * @param code + * @param msg + * @return + */ + public static JsonData buildCodeAndMsg(int code, String msg) { + return new JsonData(code, null, msg); + } + + /** + * 传入枚举,返回信息 + * + * @param codeEnum + * @return + */ + public static JsonData buildResult(BizCodeEnum codeEnum) { + return JsonData.buildCodeAndMsg(codeEnum.getCode(), codeEnum.getMessage()); + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..11993f8 --- /dev/null +++ b/pom.xml @@ -0,0 +1,213 @@ + + + 4.0.0 + + net.carbon + CarbonNeutrality + 1.0-SNAPSHOT + pom + + + common + server + + + + 17 + 17 + 17 + UTF-8 + + 3.3.0 + 3.5.10.1 + 1.18.24 + 3.9 + 1.15 + 3.0.0 + 0.7.0 + 2.0 + 1.2.62 + 8.0.33 + 6.0.0 + 2.3.1 + + + true + + + + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring.boot.version} + pom + import + + + + + + com.baomidou + mybatis-plus-spring-boot3-starter + ${mybatisplus.boot3.starter.version} + + + + com.baomidou + mybatis-plus-jsqlparser + ${mybatisplus.boot3.starter.version} + + + + com.baomidou + mybatis-plus-generator + ${mybatisplus.boot3.starter.version} + + + + + + + org.projectlombok + lombok + ${lombok.version} + + + + + + org.apache.commons + commons-lang3 + ${commons.lang3.version} + + + + + + commons-codec + commons-codec + ${commons.codec.version} + + + + + + + + + + + io.jsonwebtoken + jjwt + ${jjwt.version} + + + + + org.springframework.boot + spring-boot-starter-test + ${spring.boot.version} + + + + + org.apache.velocity + velocity-engine-core + ${velocity-engine-core.version} + + + + com.alibaba + fastjson + ${fastjson.version} + + + + com.github.xiaoymin + knife4j-openapi3-jakarta-spring-boot-starter + 4.1.0 + + + + mysql + mysql-connector-java + ${mysql.connection.version} + + + + jakarta.servlet + jakarta.servlet-api + ${jakarta.servlet.version} + + + + javax.xml.bind + jaxb-api + ${jaxb.version} + + + org.glassfish.jaxb + jaxb-runtime + ${jaxb.version} + + + + + + + + + maven-ali + http://maven.aliyun.com/nexus/content/groups/public/ + + true + + + true + always + fail + + + + + + + + + + public + aliyun nexus + http://maven.aliyun.com/nexus/content/groups/public/ + + true + + + false + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/server/pom.xml b/server/pom.xml new file mode 100644 index 0000000..b46c191 --- /dev/null +++ b/server/pom.xml @@ -0,0 +1,101 @@ + + + 4.0.0 + + net.carbon + CarbonNeutrality + 1.0-SNAPSHOT + + + server + jar + + + 17 + 17 + UTF-8 + + + + + + net.carbon + common + 1.0-SNAPSHOT + + + + + + org.springframework.boot + spring-boot-starter-test + + + + + com.baomidou + mybatis-plus-generator + + + + com.baomidou + mybatis-plus-jsqlparser + + + + + org.apache.velocity + velocity-engine-core + + + + mysql + mysql-connector-java + + + + com.github.xiaoymin + knife4j-openapi3-jakarta-spring-boot-starter + + + + org.freemarker + freemarker + 2.3.31 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.6.0 + + net.carbon.ServerApplication + app + + + + repackage + + repackage + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + + + \ No newline at end of file diff --git a/server/src/main/java/net/carbon/ServerApplication.java b/server/src/main/java/net/carbon/ServerApplication.java new file mode 100644 index 0000000..883f6d1 --- /dev/null +++ b/server/src/main/java/net/carbon/ServerApplication.java @@ -0,0 +1,18 @@ +package net.carbon; + + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.transaction.annotation.EnableTransactionManagement; + + +@SpringBootApplication +@EnableTransactionManagement +@MapperScan("net.carbon.mapper") +public class ServerApplication { + + public static void main(String[] args) { + SpringApplication.run(ServerApplication.class, args); + } +} diff --git a/server/src/main/java/net/carbon/config/InterceptorConfig.java b/server/src/main/java/net/carbon/config/InterceptorConfig.java new file mode 100644 index 0000000..828eacd --- /dev/null +++ b/server/src/main/java/net/carbon/config/InterceptorConfig.java @@ -0,0 +1,24 @@ +package net.carbon.config; + +import lombok.extern.slf4j.Slf4j; +import net.carbon.interceptor.LoginInterceptor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@Slf4j +public class InterceptorConfig implements WebMvcConfigurer { + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry + .addInterceptor(new LoginInterceptor()) + //拦截的路径 + .addPathPatterns("/api/user/*/**", "/api/carbon/*/**") + //放行的路径 + .excludePathPatterns("/api/user/*/register", "/api/user/*/login", "api/label/*/**"); + + WebMvcConfigurer.super.addInterceptors(registry); + } +} diff --git a/server/src/main/java/net/carbon/controller/CarbonEmissionController.java b/server/src/main/java/net/carbon/controller/CarbonEmissionController.java new file mode 100644 index 0000000..f6a967c --- /dev/null +++ b/server/src/main/java/net/carbon/controller/CarbonEmissionController.java @@ -0,0 +1,48 @@ +package net.carbon.controller; + + +import net.carbon.service.CarbonEmissionService; +import net.carbon.utils.JsonData; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 前端控制器 + *

+ * + * @author jieyuu + * @since 2024-12-29 + */ +@RestController +@RequestMapping("/api/carbon/v1") +public class CarbonEmissionController { + + @Autowired + private CarbonEmissionService carbonEmissionService; + + /** + * 及时预警接口 + * + * @param city + * @return + */ + @GetMapping("timelyAlert") + public JsonData timelyAlert(@RequestBody String city) { + return JsonData.buildSuccess(carbonEmissionService.timelyAlert(city)); + } + + /** + * 获取数据 + * + * @param city + * @return + */ + @GetMapping("getCarbonEmissionData") + public JsonData getCarbonEmissionData(@RequestBody String city) { + return JsonData.buildSuccess(carbonEmissionService.getCarbonEmissionData(city)); + } + + +} + diff --git a/server/src/main/java/net/carbon/controller/EconomicsController.java b/server/src/main/java/net/carbon/controller/EconomicsController.java new file mode 100644 index 0000000..b35c319 --- /dev/null +++ b/server/src/main/java/net/carbon/controller/EconomicsController.java @@ -0,0 +1,118 @@ +package net.carbon.controller; + +import net.carbon.bean.PageResponse; +import net.carbon.model.request.EconomicsUpdateRequest; +import net.carbon.model.vo.EconomicsVO; +import net.carbon.result.Result; +import net.carbon.service.EconomicsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * (Economics)表控制层 + * + * @author makejava + * @since 2025-02-21 13:44:09 + */ +@RestController +@RequestMapping("/api/economics/v1/") +public class EconomicsController { + + /** + * 分页查询所有数据 + * + * @param page 分页对象 + * @param economics 查询实体 + * @return 所有数据 + */ +// @GetMapping +// public Result selectAll(Page page, Economics economics) { +// return success(this.economicsService.page(page, new QueryWrapper<>(economics))); +// } + + /** + * 通过主键查询单条数据 + * + * @param id 主键 + * @return 单条数据 + */ +// @GetMapping("{id}") +// public R selectOne(@PathVariable Serializable id) { +// return success(this.economicsService.getById(id)); +// } + + /** + * 新增数据 + * + * @param economics 实体对象 + * @return 新增结果 + */ +// @PostMapping +// public R insert(@RequestBody Economics economics) { +// return success(this.economicsService.save(economics)); +// } + + /** + * 修改数据 + * + * @param economics 实体对象 + * @return 修改结果 + */ +// @PutMapping +// public R update(@RequestBody Economics economics) { +// return success(this.economicsService.updateById(economics)); +// } + + /** + * 删除数据 + * + * @param idList 主键结合 + * @return 删除结果 + */ +// @DeleteMapping +// public R delete(@RequestParam("idList") List idList) { +// return success(this.economicsService.removeByIds(idList)); +// } + + + @Autowired + private EconomicsService economicsService; + + // 获取所有指标 + @GetMapping("/list") + public Result> getAllIndicators(@RequestParam("pageSize") Long pageSize, @RequestParam("current") Long current) { + return Result.success(economicsService.getPage(pageSize, current)); + } + + // 新增指标 +// @PostMapping("/create") +// public Result createIndicator(@RequestBody EconomicsRequest economicsRequest) { +// +// boolean save = economicsService.save(economicsRequest); +// if (save) { +// return Result.success(); +// } +// return Result.error("创建失败"); +// } + + // 生成编辑接口 + @PostMapping("/update") + public Result updateIndicator(@RequestBody EconomicsUpdateRequest economicsUpdateReq) { + int row = economicsService.updateById(economicsUpdateReq); + if (row > 0) { + return Result.success(); + } + return Result.error("编辑失败"); + } + + // 剔除指标 + @DeleteMapping("/delete/{id}") + public Result delete(@PathVariable("id") Long id) { + int row = economicsService.delete(id); + if (row > 0) { + return Result.success(); + } + return Result.error("删除失败"); + } +} + diff --git a/server/src/main/java/net/carbon/controller/LabelController.java b/server/src/main/java/net/carbon/controller/LabelController.java new file mode 100644 index 0000000..9776aae --- /dev/null +++ b/server/src/main/java/net/carbon/controller/LabelController.java @@ -0,0 +1,71 @@ +package net.carbon.controller; + + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import net.carbon.bean.PageResponse; +import net.carbon.model.po.LabelDO; +import net.carbon.model.request.LabelUpdateRequest; +import net.carbon.model.vo.LabelVO; +import net.carbon.result.Result; +import net.carbon.service.LabelService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + *

+ * 碳排放-城市高质量发展指标体系-标签表 前端控制器 + *

+ * + * @author jieyuu + * @since 2025-02-19 + */ +@RestController +@RequestMapping("/api/label/v1") +public class LabelController { + @Autowired + private LabelService labelService; + + // 获取所有指标 + @GetMapping("/list") + public Result> getAllIndicators(@RequestParam("pageSize") Long pageSize, @RequestParam("current") Long current) { + return Result.success(labelService.getList(pageSize, current)); + } + +// // 新增指标 +// @PostMapping("/create") +// public Result createIndicator(@RequestBody LabelDO label) { +// boolean save = labelService.save(label); +// if (save) { +// return Result.success(); +// } +// return Result.error("创建失败"); +// } + + // 生成编辑接口 + @PostMapping("/update") + public Result update(@RequestBody LabelUpdateRequest labelUpdateReq) { + int row = labelService.updateById(labelUpdateReq); + if (row > 0) { + return Result.success(); + } + return Result.error("修改失败"); + } + + // 剔除指标 + @DeleteMapping("/delete/{id}") + public Result delete(@PathVariable("id") Long id) { + int row = labelService.delete(id); + if (row > 0) { + return Result.success(); + } + return Result.error("删除失败"); + } + +} + diff --git a/server/src/main/java/net/carbon/controller/TimelyWarningController.java b/server/src/main/java/net/carbon/controller/TimelyWarningController.java new file mode 100644 index 0000000..d901376 --- /dev/null +++ b/server/src/main/java/net/carbon/controller/TimelyWarningController.java @@ -0,0 +1,45 @@ +package net.carbon.controller; + +import net.carbon.bean.PageResponse; +import net.carbon.model.request.LabelUpdateRequest; +import net.carbon.model.request.TimelyWarningRequest; +import net.carbon.model.vo.LabelVO; +import net.carbon.model.vo.TimelyWarningVO; +import net.carbon.result.Result; +import net.carbon.service.TimelyWarningService; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api") +public class TimelyWarningController { + private TimelyWarningService timelyWarningService; + + @GetMapping("/TimelyWarning") + public Result> get(@RequestParam("pageSize") Long pageSize, @RequestParam("page") Long page) { + return Result.success(timelyWarningService.getList(pageSize, page)); + } + + @DeleteMapping("warn/delete") + public Result delete(@RequestParam("id") Long id) { + int row = timelyWarningService.delete(id); + if (row > 0) { + return Result.success(); + } + return Result.error("删除失败"); + } + + @PostMapping("warn/edit") + public Result update(@RequestBody TimelyWarningRequest timelyWarningRequest) { + int row = timelyWarningService.updateById(timelyWarningRequest); + if (row > 0) { + return Result.success(); + } + return Result.error("修改失败"); + } + + @PostMapping("warn/add") + public Result add(@RequestBody TimelyWarningRequest timelyWarningRequest) { + timelyWarningService.add(timelyWarningRequest); + return Result.success(); + } +} diff --git a/server/src/main/java/net/carbon/controller/UserController.java b/server/src/main/java/net/carbon/controller/UserController.java new file mode 100644 index 0000000..08246f9 --- /dev/null +++ b/server/src/main/java/net/carbon/controller/UserController.java @@ -0,0 +1,60 @@ +package net.carbon.controller; + +//import io.swagger.annotations.ApiParam; + +import net.carbon.model.vo.UserVO; +import net.carbon.model.request.UserRegisterRequest; +import net.carbon.model.request.UserLoginRequest; +import net.carbon.service.UserService; +import net.carbon.utils.JsonData; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/user/v1") +public class UserController { + + @Autowired + private UserService userService; + + /** + * 用户注册 + * + * @param registerRequest + * @return + */ + @PostMapping(value = "register") + public JsonData register(@RequestBody UserRegisterRequest registerRequest) { + JsonData jsonData = userService.register(registerRequest); + + return jsonData; + } + + /** + * 用户登录 + * + * @param loginRequest + * @return + */ + +// @ApiOperation("用户登录") + @PostMapping("login") + public JsonData userLogin(@RequestBody UserLoginRequest loginRequest) { + + JsonData jsonData = userService.login(loginRequest); + return jsonData; + } + + @PostMapping("logout") + public JsonData logout() { + // todo jwt退出登录 + return JsonData.buildSuccess("退出成功"); + } + + @GetMapping("userinfo") + public JsonData getUserInfo() { + UserVO userinfo = userService.userinfo(); + return JsonData.buildSuccess(userinfo); + } + +} \ No newline at end of file diff --git a/server/src/main/java/net/carbon/mapper/CarbonEmissionMapper.java b/server/src/main/java/net/carbon/mapper/CarbonEmissionMapper.java new file mode 100644 index 0000000..01e67b2 --- /dev/null +++ b/server/src/main/java/net/carbon/mapper/CarbonEmissionMapper.java @@ -0,0 +1,18 @@ +package net.carbon.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.carbon.model.po.CarbonEmissionDO; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author jieyuu + * @since 2024-12-29 + */ +@Mapper +public interface CarbonEmissionMapper extends BaseMapper { + +} diff --git a/server/src/main/java/net/carbon/mapper/EconomicsMapper.java b/server/src/main/java/net/carbon/mapper/EconomicsMapper.java new file mode 100644 index 0000000..79eb0c0 --- /dev/null +++ b/server/src/main/java/net/carbon/mapper/EconomicsMapper.java @@ -0,0 +1,20 @@ +package net.carbon.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.carbon.model.po.EconomicsDO; +import org.apache.ibatis.annotations.Mapper; + + +/** + *

+ * Mapper 接口 + *

+ * + * @author jieyuu + * @since 2025-02-21 + */ +@Mapper +public interface EconomicsMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/server/src/main/java/net/carbon/mapper/LabelMapper.java b/server/src/main/java/net/carbon/mapper/LabelMapper.java new file mode 100644 index 0000000..84d2c53 --- /dev/null +++ b/server/src/main/java/net/carbon/mapper/LabelMapper.java @@ -0,0 +1,18 @@ +package net.carbon.mapper; + +import net.carbon.model.po.LabelDO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 碳排放-城市高质量发展指标体系-标签表 Mapper 接口 + *

+ * + * @author jieyuu + * @since 2025-02-19 + */ +@Mapper +public interface LabelMapper extends BaseMapper { + +} diff --git a/server/src/main/java/net/carbon/mapper/TimelyWarningMapper.java b/server/src/main/java/net/carbon/mapper/TimelyWarningMapper.java new file mode 100644 index 0000000..dcb2b33 --- /dev/null +++ b/server/src/main/java/net/carbon/mapper/TimelyWarningMapper.java @@ -0,0 +1,13 @@ +package net.carbon.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.carbon.model.po.EconomicsDO; +import net.carbon.model.po.TimelyWarningDO; +import org.apache.ibatis.annotations.Mapper; + + +@Mapper +public interface TimelyWarningMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/server/src/main/java/net/carbon/mapper/UserMapper.java b/server/src/main/java/net/carbon/mapper/UserMapper.java new file mode 100644 index 0000000..b2c31f5 --- /dev/null +++ b/server/src/main/java/net/carbon/mapper/UserMapper.java @@ -0,0 +1,19 @@ +package net.carbon.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.carbon.model.po.UserDO; +import org.apache.ibatis.annotations.Mapper; + + +/** + *

+ * Mapper 接口 + *

+ * + * @author jieyuu + * @since 2024-11-23 + */ +@Mapper +public interface UserMapper extends BaseMapper { + +} diff --git a/server/src/main/java/net/carbon/model/CarbonEmissionDO.java b/server/src/main/java/net/carbon/model/CarbonEmissionDO.java new file mode 100644 index 0000000..0d9e62c --- /dev/null +++ b/server/src/main/java/net/carbon/model/CarbonEmissionDO.java @@ -0,0 +1,61 @@ +package net.carbon.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + *

+ * + *

+ * + * @author jieyuu + * @since 2024-12-29 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("carbon_emission") +public class CarbonEmissionDO implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private String city; + + private BigDecimal wastewaterDischargeTotal; + + private BigDecimal airQualityAchievementRate; + + private BigDecimal gdpElectricityConsumption; + + private BigDecimal wasteResourceIndustryValue; + + private BigDecimal forestCoverageRate; + + private BigDecimal ecologicalIndex; + + private BigDecimal importExportTotal; + + private Integer foreignInvestmentEnterprises; + + private BigDecimal tourismIncome; + + private Integer overnightTourists; + + private BigDecimal publicManagementDensity; + + private BigDecimal perCapitaServiceFunds; + + private BigDecimal averageAnnualSalary; + + private BigDecimal urbanPerCapitaIncome; + + +} diff --git a/server/src/main/java/net/carbon/model/UserDO.java b/server/src/main/java/net/carbon/model/UserDO.java new file mode 100644 index 0000000..310a22b --- /dev/null +++ b/server/src/main/java/net/carbon/model/UserDO.java @@ -0,0 +1,31 @@ +package net.carbon.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + *

+ * + *

+ * + * @author jieyuu + * @since 2024-11-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("user") +public class UserDO implements Serializable { + + private static final long serialVersionUID = 1L; + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private String username; + + private String password; +} diff --git a/server/src/main/java/net/carbon/model/po/CarbonEmissionDO.java b/server/src/main/java/net/carbon/model/po/CarbonEmissionDO.java new file mode 100644 index 0000000..342dae7 --- /dev/null +++ b/server/src/main/java/net/carbon/model/po/CarbonEmissionDO.java @@ -0,0 +1,61 @@ +package net.carbon.model.po; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + *

+ * + *

+ * + * @author jieyuu + * @since 2024-12-29 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("carbon_emission") +public class CarbonEmissionDO implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private String city; + + private BigDecimal wastewaterDischargeTotal; + + private BigDecimal airQualityAchievementRate; + + private BigDecimal gdpElectricityConsumption; + + private BigDecimal wasteResourceIndustryValue; + + private BigDecimal forestCoverageRate; + + private BigDecimal ecologicalIndex; + + private BigDecimal importExportTotal; + + private Integer foreignInvestmentEnterprises; + + private BigDecimal tourismIncome; + + private Integer overnightTourists; + + private BigDecimal publicManagementDensity; + + private BigDecimal perCapitaServiceFunds; + + private BigDecimal averageAnnualSalary; + + private BigDecimal urbanPerCapitaIncome; + + +} diff --git a/server/src/main/java/net/carbon/model/po/EconomicsDO.java b/server/src/main/java/net/carbon/model/po/EconomicsDO.java new file mode 100644 index 0000000..3c9b609 --- /dev/null +++ b/server/src/main/java/net/carbon/model/po/EconomicsDO.java @@ -0,0 +1,65 @@ +package net.carbon.model.po; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.io.Serializable; + +/** + *

+ * + *

+ * + * @author jieyuu + * @since 2025-02-21 + */ +@Getter +@Setter +@ToString +@TableName("economics") +public class EconomicsDO implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableField("id") + private Long id; + + /** + * 项目名称 + */ + @TableField("name") + private String name; + + /** + * 指标单位 + */ + @TableField("unit") + private String unit; + + /** + * 数据 + */ + @TableField("data") + private Double data; + + /** + * 指标属性 + */ + @TableField("attribute") + private String attribute; + + /** + * 0代表是系统数据不能删除,1代表是其他数据,可以删除 + */ + @TableField("is_system_date") + private Integer isSystemDate; + + /** + * 逻辑删除标记(默认0,删除1) + */ + @TableField("is_delete") + private Byte isDelete; +} diff --git a/server/src/main/java/net/carbon/model/po/LabelDO.java b/server/src/main/java/net/carbon/model/po/LabelDO.java new file mode 100644 index 0000000..8357d8b --- /dev/null +++ b/server/src/main/java/net/carbon/model/po/LabelDO.java @@ -0,0 +1,66 @@ +package net.carbon.model.po; + +import java.math.BigDecimal; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serializable; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 碳排放-城市高质量发展指标体系-标签表 + *

+ * + * @author jieyuu + * @since 2025-02-19 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("label") +public class LabelDO implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 指标名称 + */ + @TableField("name") + private String name; + + /** + * 单位 + */ + @TableField("unit") + private String unit; + + /** + * 数据值 + */ + @TableField("data_value") + private BigDecimal dataValue; + + /** + * 指数属性 + */ + @TableField("attribute") + private String attribute; + + /** + * 是否剔除(0-是系统数据不能删除,1-不是系统数据,可以删除) + */ + @TableField("is_system_date") + private Integer isSystemDate; + + /** + * 逻辑删除标记 + */ + @TableField("is_delete") + @TableLogic(value = "0", delval = "1") + private Integer isDeleted; +} diff --git a/server/src/main/java/net/carbon/model/po/TimelyWarningDO.java b/server/src/main/java/net/carbon/model/po/TimelyWarningDO.java new file mode 100644 index 0000000..b4d8a31 --- /dev/null +++ b/server/src/main/java/net/carbon/model/po/TimelyWarningDO.java @@ -0,0 +1,31 @@ +package net.carbon.model.po; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.io.Serializable; + + +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("timely_warning") +public class TimelyWarningDO implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableField("id") + private Long id; + + @TableField("name") + private String name; + + @TableField("unit") + private String unit; + + @TableField("data") + private Double data; + + @TableField("direction") + private String direction; +} diff --git a/server/src/main/java/net/carbon/model/po/UserDO.java b/server/src/main/java/net/carbon/model/po/UserDO.java new file mode 100644 index 0000000..88d5679 --- /dev/null +++ b/server/src/main/java/net/carbon/model/po/UserDO.java @@ -0,0 +1,88 @@ +package net.carbon.model.po; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author jieyuu + * @since 2024-11-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("user") +public class UserDO implements Serializable { + + private static final long serialVersionUID = 1L; + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("username") + private String username; + + @TableField("password") + private String password; + + /** + * 用户照片 + */ + @TableField("avatar") + private String avatar; + + /** + * 用户角色,1代表管理员,2代表普通用户 + */ + @TableField("role") + private Integer role; + + /** + * 描述 + */ + @TableField("description") + private String description; + + /** + * 用户的名字 + */ + @TableField("name") + private String name; + + /** + * 用户的电话号码 + */ + @TableField("phone") + private String phone; + + /** + * 用户地址 + */ + @TableField("address") + private String address; + + /** + * 用户创建时间 + */ + @TableField("creationTime") + private LocalDateTime creationTime; + + /** + * 用户更新时间 + */ + @TableField("updateTime") + private LocalDateTime updateTime; + + /** + * 逻辑删除标记 + */ + @TableField("is_delete") + @TableLogic(value = "0", delval = "1") + private Byte isDelete; +} diff --git a/server/src/main/java/net/carbon/model/request/EconomicsUpdateRequest.java b/server/src/main/java/net/carbon/model/request/EconomicsUpdateRequest.java new file mode 100644 index 0000000..df8941e --- /dev/null +++ b/server/src/main/java/net/carbon/model/request/EconomicsUpdateRequest.java @@ -0,0 +1,18 @@ +package net.carbon.model.request; + + +import lombok.Data; + +@Data +public class EconomicsUpdateRequest { + private Long id; + private String name; + + private String unit; + + private Double data; + + private String attribute; + + private Integer isSystemDate; +} diff --git a/server/src/main/java/net/carbon/model/request/LabelUpdateRequest.java b/server/src/main/java/net/carbon/model/request/LabelUpdateRequest.java new file mode 100644 index 0000000..f133d43 --- /dev/null +++ b/server/src/main/java/net/carbon/model/request/LabelUpdateRequest.java @@ -0,0 +1,37 @@ +package net.carbon.model.request; + +import lombok.Data; + +import java.math.BigDecimal; + + +@Data +public class LabelUpdateRequest { + + private Long id; + /** + * 指标名称 + */ + private String name; + + /** + * 单位 + */ + private String unit; + + /** + * 数据值 + */ + private BigDecimal dataValue; + + /** + * 指数属性 + */ + private String attribute; + + /** + * 是否剔除(0-是系统数据不能删除,1-不是系统数据,可以删除) + */ + private Integer isSystemDate; + +} diff --git a/server/src/main/java/net/carbon/model/request/TimelyWarningRequest.java b/server/src/main/java/net/carbon/model/request/TimelyWarningRequest.java new file mode 100644 index 0000000..395c576 --- /dev/null +++ b/server/src/main/java/net/carbon/model/request/TimelyWarningRequest.java @@ -0,0 +1,17 @@ +package net.carbon.model.request; + +import lombok.Data; + +@Data +public class TimelyWarningRequest { + + private Long id; + + private String name; + + private String unit; + + private Double data; + + private String direction; +} diff --git a/server/src/main/java/net/carbon/model/request/UserLoginRequest.java b/server/src/main/java/net/carbon/model/request/UserLoginRequest.java new file mode 100644 index 0000000..ab4c1ef --- /dev/null +++ b/server/src/main/java/net/carbon/model/request/UserLoginRequest.java @@ -0,0 +1,20 @@ +package net.carbon.model.request; + +//import io.swagger.annotations.ApiModel; +//import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +//@ApiModel(value = "登录对象", description = "用户登录请求对象") +@AllArgsConstructor +@NoArgsConstructor +public class UserLoginRequest { + +// @ApiModelProperty(value = "用户名", example = "jieyuu") + private String username; + +// @ApiModelProperty(value = "密码", example = "123456") + private String password; +} diff --git a/server/src/main/java/net/carbon/model/request/UserRegisterRequest.java b/server/src/main/java/net/carbon/model/request/UserRegisterRequest.java new file mode 100644 index 0000000..5d721f2 --- /dev/null +++ b/server/src/main/java/net/carbon/model/request/UserRegisterRequest.java @@ -0,0 +1,14 @@ +package net.carbon.model.request; + +//import io.swagger.annotations.ApiModel; +//import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class UserRegisterRequest { + + private String username; + + private String password; + +} diff --git a/server/src/main/java/net/carbon/model/vo/EconomicsVO.java b/server/src/main/java/net/carbon/model/vo/EconomicsVO.java new file mode 100644 index 0000000..a384ead --- /dev/null +++ b/server/src/main/java/net/carbon/model/vo/EconomicsVO.java @@ -0,0 +1,35 @@ +package net.carbon.model.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.io.Serializable; + +/** + *

+ * + *

+ * + * @author jieyuu + * @since 2025-02-21 + */ +@Getter +@Setter +public class EconomicsVO implements Serializable { + private Long id; + + private String name; + + private String unit; + + private Double data; + + private String attribute; + + private Integer isSystemDate; + + private Byte isDelete; +} diff --git a/server/src/main/java/net/carbon/model/vo/LabelVO.java b/server/src/main/java/net/carbon/model/vo/LabelVO.java new file mode 100644 index 0000000..2954328 --- /dev/null +++ b/server/src/main/java/net/carbon/model/vo/LabelVO.java @@ -0,0 +1,39 @@ +package net.carbon.model.vo; + + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class LabelVO { + private Long id; + + /** + * 指标名称 + */ + private String name; + + /** + * 单位 + */ + private String unit; + + /** + * 数据值 + */ + private BigDecimal dataValue; + + /** + * 指数属性 + */ + private String attribute; + + /** + * 是否剔除(0-是系统数据不能删除,1-不是系统数据,可以删除) + */ + private Integer isSystemDate; +} diff --git a/server/src/main/java/net/carbon/model/vo/TimelyWarningVO.java b/server/src/main/java/net/carbon/model/vo/TimelyWarningVO.java new file mode 100644 index 0000000..6da975d --- /dev/null +++ b/server/src/main/java/net/carbon/model/vo/TimelyWarningVO.java @@ -0,0 +1,22 @@ +package net.carbon.model.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +@Data +public class TimelyWarningVO { + + private Long id; + + private String name; + + private String unit; + + private Double data; + + private String direction; +} diff --git a/server/src/main/java/net/carbon/model/vo/UserVO.java b/server/src/main/java/net/carbon/model/vo/UserVO.java new file mode 100644 index 0000000..272db3a --- /dev/null +++ b/server/src/main/java/net/carbon/model/vo/UserVO.java @@ -0,0 +1,45 @@ +package net.carbon.model.vo; + + +import lombok.Data; + +@Data +public class UserVO { + private Long id; + + + private String username; + + + private String password; + + /** + * 用户照片 + */ + private String avatar; + + /** + * 用户角色,1代表管理员,2代表普通用户 + */ + private Integer role; + + /** + * 描述 + */ + private String description; + + /** + * 用户的名字 + */ + private String name; + + /** + * 用户的电话号码 + */ + private String phone; + + /** + * 用户地址 + */ + private String address; +} diff --git a/server/src/main/java/net/carbon/request/UserLoginRequest.java b/server/src/main/java/net/carbon/request/UserLoginRequest.java new file mode 100644 index 0000000..1da367b --- /dev/null +++ b/server/src/main/java/net/carbon/request/UserLoginRequest.java @@ -0,0 +1,20 @@ +package net.carbon.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@ApiModel(value = "登录对象", description = "用户登录请求对象") +@AllArgsConstructor +@NoArgsConstructor +public class UserLoginRequest { + + @ApiModelProperty(value = "用户名", example = "jieyuu") + private String username; + + @ApiModelProperty(value = "密码", example = "123456") + private String password; +} diff --git a/server/src/main/java/net/carbon/request/UserRegisterRequest.java b/server/src/main/java/net/carbon/request/UserRegisterRequest.java new file mode 100644 index 0000000..d285996 --- /dev/null +++ b/server/src/main/java/net/carbon/request/UserRegisterRequest.java @@ -0,0 +1,17 @@ +package net.carbon.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "用户注册实体类") +public class UserRegisterRequest { + + @ApiModelProperty(value = "用户名", example = "123456") + private String username; + + @ApiModelProperty(value = "密码", example = "123456") + private String password; + +} diff --git a/server/src/main/java/net/carbon/service/CarbonEmissionService.java b/server/src/main/java/net/carbon/service/CarbonEmissionService.java new file mode 100644 index 0000000..9a54b37 --- /dev/null +++ b/server/src/main/java/net/carbon/service/CarbonEmissionService.java @@ -0,0 +1,23 @@ +package net.carbon.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import net.carbon.model.po.CarbonEmissionDO; +import net.carbon.vo.CarbonTimelyAlertVO; +import net.carbon.vo.CarbonVO; + + +/** + *

+ * 服务类 + *

+ * + * @author jieyuu + * @since 2024-12-29 + */ +public interface CarbonEmissionService extends IService { + + CarbonTimelyAlertVO timelyAlert(String city); + + + CarbonVO getCarbonEmissionData(String city); +} diff --git a/server/src/main/java/net/carbon/service/EconomicsService.java b/server/src/main/java/net/carbon/service/EconomicsService.java new file mode 100644 index 0000000..ec18d8f --- /dev/null +++ b/server/src/main/java/net/carbon/service/EconomicsService.java @@ -0,0 +1,24 @@ +package net.carbon.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import net.carbon.bean.PageResponse; +import net.carbon.model.po.EconomicsDO; +import net.carbon.model.request.EconomicsUpdateRequest; +import net.carbon.model.vo.EconomicsVO; + +/** + * (Economics)表服务接口 + * + * @author jieyuu + * @since 2025-02-21 13:37:17 + */ +public interface EconomicsService extends IService { + + PageResponse getPage(Long pageSize, Long current); + + Integer delete(Long id); + + Integer updateById(EconomicsUpdateRequest economicsUpdateReq); + +} + diff --git a/server/src/main/java/net/carbon/service/LabelService.java b/server/src/main/java/net/carbon/service/LabelService.java new file mode 100644 index 0000000..6791d59 --- /dev/null +++ b/server/src/main/java/net/carbon/service/LabelService.java @@ -0,0 +1,28 @@ +package net.carbon.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import net.carbon.bean.PageResponse; +import net.carbon.model.po.LabelDO; +import net.carbon.model.request.LabelUpdateRequest; +import net.carbon.model.vo.LabelVO; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 碳排放-城市高质量发展指标体系-标签表 服务类 + *

+ * + * @author jieyuu + * @since 2025-02-19 + */ +public interface LabelService extends IService { + + PageResponse getList(Long pageSize, Long current); + + int delete(Long id); + + int updateById(LabelUpdateRequest labelUpdateReq); + +} diff --git a/server/src/main/java/net/carbon/service/TimelyWarningService.java b/server/src/main/java/net/carbon/service/TimelyWarningService.java new file mode 100644 index 0000000..c2184f9 --- /dev/null +++ b/server/src/main/java/net/carbon/service/TimelyWarningService.java @@ -0,0 +1,16 @@ +package net.carbon.service; + +import net.carbon.bean.PageResponse; +import net.carbon.model.request.TimelyWarningRequest; +import net.carbon.model.vo.LabelVO; +import net.carbon.model.vo.TimelyWarningVO; + +public interface TimelyWarningService { + PageResponse getList(Long pageSize, Long page); + + int delete(Long id); + + int updateById(TimelyWarningRequest timelyWarningRequest); + + void add(TimelyWarningRequest timelyWarningRequest); +} diff --git a/server/src/main/java/net/carbon/service/UserService.java b/server/src/main/java/net/carbon/service/UserService.java new file mode 100644 index 0000000..43ad3fd --- /dev/null +++ b/server/src/main/java/net/carbon/service/UserService.java @@ -0,0 +1,39 @@ +package net.carbon.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import net.carbon.model.po.UserDO; + +import net.carbon.model.vo.UserVO; +import net.carbon.model.request.UserRegisterRequest; +import net.carbon.model.request.UserLoginRequest; +import net.carbon.utils.JsonData; + + +/** + *

+ * 服务类 + *

+ * + * @author jieyuu + * @since 2024-11-23 + */ +public interface UserService extends IService { + + /** + * 用户注册 + * + * @param userRegisterRequest + * @return + */ + JsonData register(UserRegisterRequest userRegisterRequest); + + /** + * 用户登录 + * + * @param loginRequest + * @return + */ + JsonData login(UserLoginRequest loginRequest); + + UserVO userinfo(); +} diff --git a/server/src/main/java/net/carbon/service/impl/CarbonEmissionServiceImpl.java b/server/src/main/java/net/carbon/service/impl/CarbonEmissionServiceImpl.java new file mode 100644 index 0000000..875dfb2 --- /dev/null +++ b/server/src/main/java/net/carbon/service/impl/CarbonEmissionServiceImpl.java @@ -0,0 +1,68 @@ +package net.carbon.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import net.carbon.mapper.CarbonEmissionMapper; +import net.carbon.model.po.CarbonEmissionDO; +import net.carbon.service.CarbonEmissionService; + + +import net.carbon.vo.CarbonTimelyAlertVO; +import net.carbon.vo.CarbonVO; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author jieyuu + * @since 2024-12-29 + */ +@Service +public class CarbonEmissionServiceImpl extends ServiceImpl implements CarbonEmissionService { + + @Autowired + private CarbonEmissionMapper carbonEmissionMapper; + + @Override + public CarbonTimelyAlertVO timelyAlert(String city) { + if (city == null || StringUtils.isBlank(city)) { + return null; + } + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.like("city", city); + + CarbonEmissionDO carbonEmissionDO = carbonEmissionMapper.selectOne(queryWrapper); + + CarbonTimelyAlertVO result = new CarbonTimelyAlertVO(); + if (carbonEmissionDO == null) { + return null; + } + BeanUtils.copyProperties(carbonEmissionDO, result); + + return result; + } + + @Override + public CarbonVO getCarbonEmissionData(String city) { + if (city == null || StringUtils.isBlank(city)) { + return null; + } + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.like("city", city); + + CarbonEmissionDO carbonEmissionDO = carbonEmissionMapper.selectOne(queryWrapper); + + CarbonVO result = new CarbonVO(); + if (carbonEmissionDO == null) { + return null; + } + BeanUtils.copyProperties(carbonEmissionDO, result); + + return result; + } +} diff --git a/server/src/main/java/net/carbon/service/impl/EconomicsServiceImpl.java b/server/src/main/java/net/carbon/service/impl/EconomicsServiceImpl.java new file mode 100644 index 0000000..349a8c7 --- /dev/null +++ b/server/src/main/java/net/carbon/service/impl/EconomicsServiceImpl.java @@ -0,0 +1,74 @@ +package net.carbon.service.impl; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import net.carbon.bean.PageResponse; +import net.carbon.mapper.EconomicsMapper; +import net.carbon.model.po.EconomicsDO; +import net.carbon.model.po.LabelDO; +import net.carbon.model.request.EconomicsUpdateRequest; +import net.carbon.model.vo.EconomicsVO; +import net.carbon.model.vo.LabelVO; +import net.carbon.service.EconomicsService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * (Economics)表服务实现类 + * + * @author jieyuu + * @since 2025-02-21 13:37:20 + */ +@Service +public class EconomicsServiceImpl extends ServiceImpl implements EconomicsService { + + @Autowired + private EconomicsMapper economicsMapper; + + @Override + public PageResponse getPage(Long pageSize, Long current) { + + Page pageInfo = new Page<>(current, pageSize); + IPage economicsDOPage = economicsMapper.selectPage(pageInfo, new LambdaQueryWrapper()); + + PageResponse pageResponse = new PageResponse<>(); + + List economicsVOS = economicsDOPage.getRecords().stream().map(obj -> { + EconomicsVO economicsVO = new EconomicsVO(); + BeanUtils.copyProperties(obj, economicsVO); + return economicsVO; + }).collect(Collectors.toList()); + + pageResponse.setPageSize(economicsDOPage.getSize()); + pageResponse.setCurrent(economicsDOPage.getCurrent()); + pageResponse.setTotal(economicsDOPage.getTotal()); + pageResponse.setRecords(economicsVOS); + return pageResponse; + } + + @Override + public Integer delete(Long id) { + + int row = economicsMapper.deleteById(id); + return row; + } + + @Override + public Integer updateById(EconomicsUpdateRequest economicsUpdateReq) { + EconomicsDO economicsDO = new EconomicsDO(); + BeanUtils.copyProperties(economicsUpdateReq, economicsDO); + // 设置为0 + economicsDO.setIsDelete((byte) 0); + int row = economicsMapper.updateById(economicsDO); + return row; + } +} + diff --git a/server/src/main/java/net/carbon/service/impl/LabelServiceImpl.java b/server/src/main/java/net/carbon/service/impl/LabelServiceImpl.java new file mode 100644 index 0000000..b0dafcd --- /dev/null +++ b/server/src/main/java/net/carbon/service/impl/LabelServiceImpl.java @@ -0,0 +1,76 @@ +package net.carbon.service.impl; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import jakarta.annotation.Resource; +import net.carbon.bean.PageResponse; +import net.carbon.mapper.LabelMapper; +import net.carbon.model.po.LabelDO; +import net.carbon.model.request.LabelUpdateRequest; +import net.carbon.model.vo.LabelVO; +import net.carbon.service.LabelService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + *

+ * 碳排放-城市高质量发展指标体系-标签表 服务实现类 + *

+ * + * @author jieyuu + * @since 2025-02-19 + */ +@Service +public class LabelServiceImpl extends ServiceImpl implements LabelService { + + @Autowired + private LabelMapper labelMapper; + + @Override + public PageResponse getList(Long pageSize, Long current) { + + Page pageInfo = new Page<>(current, pageSize); + IPage labelDOPage = labelMapper.selectPage(pageInfo, new LambdaQueryWrapper()); + + PageResponse pageResponse = new PageResponse<>(); + + List labelVOS = labelDOPage.getRecords().stream().map(obj -> { + LabelVO labelVO = new LabelVO(); + BeanUtils.copyProperties(obj, labelVO); + return labelVO; + }).collect(Collectors.toList()); + + pageResponse.setPageSize(labelDOPage.getSize()); + pageResponse.setCurrent(labelDOPage.getCurrent()); + pageResponse.setTotal(labelDOPage.getTotal()); + pageResponse.setRecords(labelVOS); + return pageResponse; + } + + @Override + public int delete(Long id) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(LabelDO::getId, id); + return labelMapper.delete(queryWrapper); + } + + @Override + public int updateById(LabelUpdateRequest labelUpdateReq) { + LabelDO labelDO = new LabelDO(); + + BeanUtils.copyProperties(labelUpdateReq, labelDO); + labelDO.setIsDeleted(0); + + int row = labelMapper.updateById(labelDO); + return row; + } +} diff --git a/server/src/main/java/net/carbon/service/impl/TimelyWarningServiceImpl.java b/server/src/main/java/net/carbon/service/impl/TimelyWarningServiceImpl.java new file mode 100644 index 0000000..b33a8a6 --- /dev/null +++ b/server/src/main/java/net/carbon/service/impl/TimelyWarningServiceImpl.java @@ -0,0 +1,67 @@ +package net.carbon.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import net.carbon.bean.PageResponse; +import net.carbon.mapper.TimelyWarningMapper; +import net.carbon.model.po.LabelDO; +import net.carbon.model.po.TimelyWarningDO; +import net.carbon.model.request.TimelyWarningRequest; +import net.carbon.model.vo.LabelVO; +import net.carbon.model.vo.TimelyWarningVO; +import net.carbon.service.TimelyWarningService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class TimelyWarningServiceImpl implements TimelyWarningService { + + @Autowired + private TimelyWarningMapper timelyWarningMapper; + @Override + public PageResponse getList(Long pageSize, Long page) { + Page pageInfo = new Page<>(page, pageSize); + IPage TimelyWarningDOPage = timelyWarningMapper.selectPage(pageInfo, new LambdaQueryWrapper()); + + PageResponse pageResponse = new PageResponse<>(); + + List TimelyWarningVOS = TimelyWarningDOPage.getRecords().stream().map(obj -> { + TimelyWarningVO timelyWarningVO = new TimelyWarningVO(); + BeanUtils.copyProperties(obj, timelyWarningVO); + return timelyWarningVO; + }).collect(Collectors.toList()); + + pageResponse.setPageSize(TimelyWarningDOPage.getSize()); + pageResponse.setCurrent(TimelyWarningDOPage.getCurrent()); + pageResponse.setTotal(TimelyWarningDOPage.getTotal()); + pageResponse.setRecords(TimelyWarningVOS); + return pageResponse; + } + + @Override + public int delete(Long id) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(TimelyWarningDO::getId, id); + return timelyWarningMapper.delete(queryWrapper); + } + + @Override + public int updateById(TimelyWarningRequest timelyWarningRequest) { + TimelyWarningDO timelyWarningDO = new TimelyWarningDO(); + BeanUtils.copyProperties(timelyWarningRequest, timelyWarningDO); + int row = timelyWarningMapper.updateById(timelyWarningDO); + return row; + } + + @Override + public void add(TimelyWarningRequest timelyWarningRequest) { + TimelyWarningDO timelyWarningDO = new TimelyWarningDO(); + BeanUtils.copyProperties(timelyWarningRequest, timelyWarningDO); + timelyWarningMapper.insert(timelyWarningDO); + } +} diff --git a/server/src/main/java/net/carbon/service/impl/UserServiceImpl.java b/server/src/main/java/net/carbon/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..a81c26e --- /dev/null +++ b/server/src/main/java/net/carbon/service/impl/UserServiceImpl.java @@ -0,0 +1,139 @@ +package net.carbon.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import lombok.extern.slf4j.Slf4j; +import net.carbon.enums.BizCodeEnum; +import net.carbon.interceptor.LoginInterceptor; +import net.carbon.mapper.UserMapper; +import net.carbon.model.LoginUser; +import net.carbon.model.po.UserDO; + +import net.carbon.model.vo.UserVO; +import net.carbon.model.request.UserRegisterRequest; +import net.carbon.model.request.UserLoginRequest; +import net.carbon.service.UserService; +import net.carbon.utils.CheckUtil; +import net.carbon.utils.CommonUtil; +import net.carbon.utils.JWTUtil; +import net.carbon.utils.JsonData; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author jieyuu + * @since 2024-11-23 + */ +@Service +@Slf4j +public class UserServiceImpl extends ServiceImpl implements UserService { + + @Autowired + private UserMapper userMapper; + + @Override + @Transactional(rollbackFor = RuntimeException.class, propagation = Propagation.REQUIRED) + public JsonData register(UserRegisterRequest registerRequest) { + UserDO userDO = new UserDO(); + + BeanUtils.copyProperties(registerRequest, userDO); + String cryptPwd = CommonUtil.MD5(userDO.getPassword()); + userDO.setPassword(cryptPwd); + + if (CheckUtil.isUsername(registerRequest.getUsername()) || + CheckUtil.isPassword(registerRequest.getPassword())) { + + //账号唯一性检查 + if (checkUnique(userDO.getUsername())) { + //插入数据库 + int rows = userMapper.insert(userDO); + log.info("rows:{},注册成功{}", rows, userDO.toString()); + + return JsonData.buildSuccess(); + } else { + return JsonData.buildResult(BizCodeEnum.ACCOUNT_REPEAT); + } + } else { + return JsonData.buildResult(BizCodeEnum.ILLEGAL_ARGUMENT); + } + } + + + /** + * 校验用户账号唯一 + * + * @param username + * @return + */ + private boolean checkUnique(String username) { + QueryWrapper queryWrapper = new QueryWrapper().eq("username", username); + + List list = userMapper.selectList(queryWrapper); + + return list.size() > 0 ? false : true; + } + + /** + * 用户登陆注册 + *

+ * 判断用户注册情况 + * + * @param loginRequest + * @return + */ + @Override + public JsonData login(UserLoginRequest loginRequest) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(UserDO::getUsername, loginRequest.getUsername()); + + UserDO userDO = userMapper.selectOne(queryWrapper); + + if (userDO != null) { + String cryptPwd = CommonUtil.MD5(loginRequest.getPassword()); + if (cryptPwd.equals(userDO.getPassword())) { + //登陆成功 + //生成token令牌并且返回 + LoginUser loginUser = LoginUser.builder().build(); + BeanUtils.copyProperties(userDO, loginUser); + //accessToken + String accessToken = JWTUtil.geneJsonWebToken(loginUser); + // accessToken过期时间 + //UUID生成一个token + return JsonData.buildSuccess(accessToken); + } else { + return JsonData.buildResult(BizCodeEnum.ACCOUNT_PWD_ERROR); + } + + } else { + //未注册 + //这里选择 账号或密码错误,防止被爆破 + return JsonData.buildResult(BizCodeEnum.ACCOUNT_PWD_ERROR); + } + } + + @Override + public UserVO userinfo() { + + LoginUser loginUser = LoginInterceptor.threadLocal.get(); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(UserDO::getId, loginUser.getId()); + + UserDO userDO = userMapper.selectOne(queryWrapper); + UserVO userVO = new UserVO(); + BeanUtils.copyProperties(userDO, userVO); + + return userVO; + } +} diff --git a/server/src/main/java/net/carbon/vo/CarbonTimelyAlertVO.java b/server/src/main/java/net/carbon/vo/CarbonTimelyAlertVO.java new file mode 100644 index 0000000..6130840 --- /dev/null +++ b/server/src/main/java/net/carbon/vo/CarbonTimelyAlertVO.java @@ -0,0 +1,50 @@ +package net.carbon.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +/** + *

+ * + *

+ * + * @author jieyuu + * @since 2024-12-29 + */ + +@Data +@EqualsAndHashCode(callSuper = false) +public class CarbonTimelyAlertVO { + private String city; + + private BigDecimal wastewaterDischargeTotal; + + private BigDecimal airQualityAchievementRate; + + private BigDecimal gdpElectricityConsumption; + + private BigDecimal wasteResourceIndustryValue; + + private BigDecimal forestCoverageRate; + + private BigDecimal ecologicalIndex; + + private BigDecimal importExportTotal; + + private Integer foreignInvestmentEnterprises; + + private BigDecimal tourismIncome; + + private Integer overnightTourists; + + private BigDecimal publicManagementDensity; + + private BigDecimal perCapitaServiceFunds; + + private BigDecimal averageAnnualSalary; + + private BigDecimal urbanPerCapitaIncome; + +} diff --git a/server/src/main/java/net/carbon/vo/CarbonVO.java b/server/src/main/java/net/carbon/vo/CarbonVO.java new file mode 100644 index 0000000..b87bccb --- /dev/null +++ b/server/src/main/java/net/carbon/vo/CarbonVO.java @@ -0,0 +1,42 @@ +package net.carbon.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + *

+ * + *

+ * + * @author jieyuu + * @since 2024-12-29 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class CarbonVO { + + private String city; + + private BigDecimal wastewaterDischargeTotal; + + private BigDecimal airQualityAchievementRate; + + private BigDecimal gdpElectricityConsumption; + + private BigDecimal wasteResourceIndustryValue; + + private BigDecimal forestCoverageRate; + + private BigDecimal ecologicalIndex; + + private BigDecimal importExportTotal; + + private Integer foreignInvestmentEnterprises; + +} diff --git a/server/src/main/resources/application.yml b/server/src/main/resources/application.yml new file mode 100644 index 0000000..ba0216b --- /dev/null +++ b/server/src/main/resources/application.yml @@ -0,0 +1,34 @@ +server: + port: 8089 + +spring: + application: + name: 双碳 + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://106.52.88.120:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai + username: root + password: 59ae8683c59fead903132a8d440bd7d9fd4936529d1d6f45f9d41111d7537bdd + +#配置plus打印sql日志 +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +#设置日志级别,ERROR/WARN/INFO/DEBUG,默认是INFO以上才显示 +logging: + level: + root: INFO + + +knife4j: + enable: true + setting: + language: zh_cn +springdoc: + api-docs: + path: /v3/api-docs + group-configs: + - group: 'default' + paths-to-match: '/**' + packages-to-scan: net.carbon \ No newline at end of file diff --git a/server/src/main/resources/mapper/CarbonEmissionMapper.xml b/server/src/main/resources/mapper/CarbonEmissionMapper.xml new file mode 100644 index 0000000..2bac339 --- /dev/null +++ b/server/src/main/resources/mapper/CarbonEmissionMapper.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + id, city, wastewater_discharge_total, air_quality_achievement_rate, gdp_electricity_consumption, waste_resource_industry_value, forest_coverage_rate, ecological_index, import_export_total, foreign_investment_enterprises, tourism_income, overnight_tourists, public_management_density, per_capita_service_funds, average_annual_salary, urban_per_capita_income + + + diff --git a/server/src/main/resources/mapper/EconomicsMapper.xml b/server/src/main/resources/mapper/EconomicsMapper.xml new file mode 100644 index 0000000..0916d9e --- /dev/null +++ b/server/src/main/resources/mapper/EconomicsMapper.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/server/src/main/resources/mapper/LabelMapper.xml b/server/src/main/resources/mapper/LabelMapper.xml new file mode 100644 index 0000000..5f30117 --- /dev/null +++ b/server/src/main/resources/mapper/LabelMapper.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/server/src/main/resources/mapper/TimelyWarningMapper.xml b/server/src/main/resources/mapper/TimelyWarningMapper.xml new file mode 100644 index 0000000..c73d726 --- /dev/null +++ b/server/src/main/resources/mapper/TimelyWarningMapper.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/server/src/main/resources/mapper/UserMapper.xml b/server/src/main/resources/mapper/UserMapper.xml new file mode 100644 index 0000000..9f79a86 --- /dev/null +++ b/server/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + id + , username, password, avatar, role, description, name, phone, address, creationTime, updateTime, is_delete + + + diff --git a/server/src/test/java/biz/MyBatisPlusGenerator.java b/server/src/test/java/biz/MyBatisPlusGenerator.java new file mode 100644 index 0000000..d016bea --- /dev/null +++ b/server/src/test/java/biz/MyBatisPlusGenerator.java @@ -0,0 +1,122 @@ +package biz; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.generator.AutoGenerator; +import com.baomidou.mybatisplus.generator.FastAutoGenerator; +import com.baomidou.mybatisplus.generator.config.*; +import com.baomidou.mybatisplus.generator.config.rules.DateType; +import com.baomidou.mybatisplus.generator.config.rules.DbColumnType; +import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; +import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; + +import java.nio.file.Paths; +import java.sql.Types; +import java.util.Collections; + +public class MyBatisPlusGenerator { + + public static void main(String[] args) { +// //1. 全局配置 +// GlobalConfig config = new GlobalConfig(); +// // 是否支持AR模式 +// config.setActiveRecord(true) +// // 作者 +// .setAuthor("jieyuu") +// // 生成路径,最好使用绝对路径,window路径是不一样的 +// .setOutputDir("D:\\workspace\\project\\CarbonNeutrality\\server\\src\\test\\temp") +// // 文件覆盖 +// .setFileOverride(true) +// // 主键策略 +// .setIdType(IdType.AUTO) +// +// .setDateType(DateType.ONLY_DATE) +// // 设置生成的service接口的名字的首字母是否为I,默认Service是以I开头的 +// .setServiceName("%sService") +// +// //实体类结尾名称 +// .setEntityName("%sDO") +// +// //生成基本的resultMap +// .setBaseResultMap(true) +// +// //不使用AR模式 +// .setActiveRecord(false) +// +// //生成基本的SQL片段 +// .setBaseColumnList(true); +// +// //2. 数据源配置 +// DataSourceConfig dsConfig = new DataSourceConfig(); +// // 设置数据库类型 +// dsConfig.setDbType(DbType.MYSQL) +// .setDriverName("com.mysql.cj.jdbc.Driver") +// .setUrl("jdbc:mysql://106.52.88.120:3306/demo?useSSL=false") +// .setUsername("root") +// .setPassword("59ae8683c59fead903132a8d440bd7d9fd4936529d1d6f45f9d41111d7537bdd"); +// +// //3. 策略配置globalConfiguration中 +// StrategyConfig stConfig = new StrategyConfig(); +// +// //全局大写命名 +// stConfig.setCapitalMode(true) +// // 数据库表映射到实体的命名策略 +// .setNaming(NamingStrategy.underline_to_camel) +// +// //使用lombok +// .setEntityLombokModel(true) +// +// //使用restcontroller注解 +// .setRestControllerStyle(true) +// +// // 生成的表, 支持多表一起生成,以数组形式填写 +// .setInclude("label"); +// +// //4. 包名策略配置 +// PackageConfig pkConfig = new PackageConfig(); +// pkConfig.setParent("net.carbon") +// .setMapper("mapper") +// .setService("service") +// .setController("controller") +// .setEntity("model") +// .setXml("mapper"); +// +// //5. 整合配置 +// AutoGenerator ag = new AutoGenerator(); +// ag.setGlobalConfig(config) +// .setDataSource(dsConfig) +// .setStrategy(stConfig) +// .setPackageInfo(pkConfig); +// +// //6. 执行操作 +// ag.execute(); + + // 使用 FastAutoGenerator 快速配置代码生成器 + FastAutoGenerator.create("jdbc:mysql://106.52.88.120:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai", "root", "59ae8683c59fead903132a8d440bd7d9fd4936529d1d6f45f9d41111d7537bdd") + .globalConfig(builder -> { + builder.author("jieyuu") // 设置作者 + .outputDir("D:\\workspace\\project\\CarbonNeutrality\\server\\src\\test\\java"); // 输出目录 + }) + .packageConfig(builder -> { + builder.parent("net.carbon") // 设置父包名 + .entity("model") // 设置实体类包名 + .controller("controller") + .mapper("mapper") // 设置 Mapper 接口包名 + .service("service") // 设置 Service 接口包名 + .serviceImpl("service.impl") // 设置 Service 实现类包名 + .xml("mappers"); // 设置 Mapper XML 文件包名 + }) + .strategyConfig(builder -> { + builder.addInclude("user", "label" , "economics") // 设置需要生成的表名 + .entityBuilder() + .enableLombok() // 启用 Lombok + .enableTableFieldAnnotation() // 启用字段注解 + .controllerBuilder() + .enableRestStyle(); // 启用 REST 风格 + }) + .templateEngine(new FreemarkerTemplateEngine()) // 使用 Freemarker 模板引擎 + .execute(); // 执行生成 + + System.out.println("======= Done 相关代码生成完毕 ========"); + } +} \ No newline at end of file