Commit 2deea867 authored by lixinglin's avatar lixinglin

first-commit

parent 7866ccf2
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--parent指明继承关系-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.15</version>
</parent>
<groupId>com.lyy</groupId>
<artifactId>cfld-regional-outline</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cfld-region-outline</name>
<description>cfld-region-outline</description>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
<pagehelper.boot.version>1.4.6</pagehelper.boot.version>
<mybatis.plus.version>3.5.2</mybatis.plus.version>
<druid.version>1.2.16</druid.version>
<hutool.version>5.8.20</hutool.version>
<lombook.version>1.18.28</lombook.version>
<swagger.version>3.0.0</swagger.version>
<swagger-models.version>1.6.2</swagger-models.version>
<knife4j.version>3.0.3</knife4j.version>
<commons.io.version>2.11.0</commons.io.version>
</properties>
<dependencies>
<!--mysql连接驱动-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 阿里数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- pagehelper分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.boot.version}</version>
</dependency>
<!-- mybatis增强器依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.plus.version}</version>
</dependency>
<!-- mybatis-plus代码生成器依赖 -->
<!-- <dependency>-->
<!-- <groupId>com.baomidou</groupId>-->
<!-- <artifactId>mybatis-plus-generator</artifactId>-->
<!-- <version>${mybatis.plus.version}</version>-->
<!-- </dependency>-->
<!-- hutool工具包 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombook.version}</version>
</dependency>
<!-- Swagger3依赖 -->
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-boot-starter</artifactId>-->
<!-- <version>${swagger.version}</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<!-- SpringBoot 拦截器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!--常用工具类 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<!-- io常用工具类 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons.io.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- #解决swagger报错 Failed to start bean ‘documentationPluginsBootstrapper’-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-spring-webmvc</artifactId>
<version>3.0.0</version>
</dependency>
<!--华为obs依赖 -->
<dependency>
<groupId>com.huaweicloud</groupId>
<artifactId>esdk-obs-java</artifactId>
<version>3.21.8</version>
</dependency>
<dependency>
<groupId>org.web3j</groupId>
<artifactId>core</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.3.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
</configuration>
</plugin>
</plugins>
</build>
</project>
package com.lyy.admin.DTO;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
@Data
public class TreeInfoDTO implements Serializable {
/**
*
*/
@TableId(type = IdType.AUTO)
private Integer id;
/**
*
*/
private String name;
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.lyy.admin;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class LyyAdminApplication {
public static void main(String[] args) {
SpringApplication.run(LyyAdminApplication.class, args);
}
}
package com.lyy.admin;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(LyyAdminApplication.class);
}
}
package com.lyy.admin.VO;
import com.lyy.admin.domain.carrierinfo.CarrierElevatorInfo;
import com.lyy.admin.domain.carrierinfo.CarrierFloorInfo;
import com.lyy.admin.domain.carrierinfo.CarrierOperateInfo;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
*
* @TableName carrier_info
*/
@Data
public class CarrierInfoAllVO implements Serializable {
private CarrierInfoVO CarrierInfoVO;
private List<CarrierElevatorInfo> carrierElevatorInfo;
private List<CarrierOperateInfo> carrierOperateInfo;
private List<CarrierFloorInfo> carrierFloorInfo;
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.lyy.admin.VO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
*
* @TableName carrier_info
*/
@Data
@ApiModel(value = "载体列表信息", description = "载体列表信息")
public class CarrierInfoListVO implements Serializable {
/**
*
*/
@ApiModelProperty(value = "主键id")
private Integer id;
/**
* 创建时间
*/
@ApiModelProperty(value = "创建时间")
private Date createTime;
/**
* 更新时间
*/
@ApiModelProperty(value = "更新时间")
private Date updateTime;
/**
* 所属集团id
*/
@ApiModelProperty(value = "所属集团id")
private Integer groupId;
/**
* 所属集团
*/
@ApiModelProperty(value = "所属集团")
private String groupName;
/**
* 所属片区
*/
@ApiModelProperty(value = "所属片区id")
private Integer zoneId;
/**
* 所属片区
*/
@ApiModelProperty(value = "所属片区")
private String zoneName;
/**
* 所属园区名称
*/
@ApiModelProperty(value = "所属园区名称")
private String parkName;
/**
* 所属园区id
*/
@ApiModelProperty(value = "所属园区id")
private Integer parkId;
/**
* 楼号
*/
@ApiModelProperty(value = "楼号")
private String buildingNumber;
/**
* 结构形式
*/
@ApiModelProperty(value = "结构形式")
private String structure;
/**
* 产品类型
*/
@ApiModelProperty(value = "产品类型")
private String type;
/**
* 面积
*/
@ApiModelProperty(value = "面积")
private BigDecimal area;
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.lyy.admin.VO;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
*
* @TableName carrier_info
*/
@TableName(value ="carrier_info")
@Data
@ApiModel(value = "载体信息", description = "载体信息")
public class CarrierInfoVO implements Serializable {
/**
*
*/
@ApiModelProperty(value = "主键id")
@TableId(type = IdType.AUTO)
private Integer id;
/**
* 创建时间
*/
@ApiModelProperty(value = "创建时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新时间
*/
@ApiModelProperty(value = "更新时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 所属集团id
*/
@ApiModelProperty(value = "所属集团id")
private Integer groupId;
/**
* 所属集团
*/
@ApiModelProperty(value = "所属集团")
private String groupName;
/**
* 所属片区id
*/
@ApiModelProperty(value = "所属片区id")
private Integer zoneId;
/**
* 所属片区
*/
@ApiModelProperty(value = "所属片区")
private String zoneName;
/**
* 所属园区名称
*/
@ApiModelProperty(value = "所属园区名称")
private String parkName;
/**
* 所属园区id
*/
@ApiModelProperty(value = "所属园区id")
private Integer parkId;
/**
* 楼号
*/
@ApiModelProperty(value = "楼号")
private String buildingNumber;
/**
* 结构形式
*/
@ApiModelProperty(value = "结构形式")
private String structure;
/**
* 产品类型
*/
@ApiModelProperty(value = "产品类型")
private String type;
/**
* 面积
*/
@ApiModelProperty(value = "面积")
private BigDecimal area;
/**
* 消防等级
*/
@ApiModelProperty(value = "消防等级")
private String fireProtectionLevel;
/**
* 是否安装天车(0-未安装 1-已安装)
*/
@ApiModelProperty(value = "是否安装天车(0-未安装 1-已安装)")
private Integer hasCrownBlock;
/**
* 供水参数
*/
@ApiModelProperty(value = "供水参数")
private String water;
/**
* 供电参数
*/
@ApiModelProperty(value = "供电参数")
private String electricity;
/**
* 供气参数(0-无 1-有)
*/
@ApiModelProperty(value = "供气参数(0-无 1-有)")
private Integer gas;
/**
* 供暖参数(0-无 1-有)
*/
@ApiModelProperty(value = "供暖参数(0-无 1-有)")
private Integer heating;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.lyy.admin.VO;
import cn.hutool.json.JSONArray;
import com.lyy.admin.domain.developmentinfo.*;
import com.lyy.admin.domain.system.SysCarouselInfo;
import lombok.Data;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Data
public class DevelopmentInfoAllVO {
private List<SysCarouselInfo> sysCarouselInfos = new ArrayList<>();
private DevelopmentInfoVO developmentInfoVO = new DevelopmentInfoVO();
private List<ParkInfoListVO> ParkInfoListVO = new ArrayList<>();
// private List<DevelopmentTrafficInfo> developmentTrafficInfoList = new ArrayList<>();
private JSONArray developmentTrafficInfoList = new JSONArray();
private JSONArray developmentPrimaryEnterpriseInfoList = new JSONArray();
private List<DevelopmentIndustryPolicyInfo> developmentIndustryPolicyInfoList = new ArrayList<>();
private List<DevelopmentIndustryFundInfo> developmentIndustryFundInfoList = new ArrayList<>();
private List<DevelopmentIndustrialLandInfo> developmentIndustrialLandInfoList = new ArrayList<>();
private List<DevelopmentInvestmentDirectionInfo> developmentInvestmentDirectionInfoList = new ArrayList<>();
}
package com.lyy.admin.VO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Data
@ApiModel(value = "开发区基本信息", description = "开发区基本信息")
public class DevelopmentInfoListVO implements Serializable {
@ApiModelProperty(value = "主键id")
private Integer id;
/**
* 所属都市圈id
*/
@ApiModelProperty(value = "所属都市圈id")
private Integer megalopolisId;
/**
* 所属都市圈名称
*/
@ApiModelProperty(value = "所属都市圈名称")
private String megalopolisName;
/**
* 省份code
*/
@ApiModelProperty(value = "省份code")
private String provinceCode;
/**
* 省份
*/
@ApiModelProperty(value = "省份")
private String provinceName;
/**
* 城市code
*/
@ApiModelProperty(value = "城市code")
private String cityCode;
/**
* 城市
*/
@ApiModelProperty(value = "城市")
private String cityName;
/**
* 区/县code
*/
@ApiModelProperty(value = "区/县code")
private String regionCode;
/**
* 区/县
*/
@ApiModelProperty(value = "区/县")
private String regionName;
/**
* 开发区名称
*/
@ApiModelProperty(value = "开发区名称")
private String name;
/**
* 开发区简介
*/
@ApiModelProperty(value = "开发区简介")
private String description;
/**
* 区域面积(核准面积)(单位:㎡)
*/
@ApiModelProperty(value = "区域面积(核准面积)(单位:㎡)")
private BigDecimal planArea;
/**
* 主导产业
*/
@ApiModelProperty(value = "主导产业")
private String primaryIndustry;
/**
* 开发区级别
*/
@ApiModelProperty(value = "开发区级别")
private String levelCode;
/**
* 开发区级别名称
*/
@ApiModelProperty(value = "开发区级别名称")
private String levelName;
@ApiModelProperty(value = "图片链接")
private String imgUrl;
@ApiModelProperty(value = "收藏时间")
private Date createTime;
@ApiModelProperty(value = "是否收藏(1-收藏)")
private Integer isCollection;
@ApiModelProperty(value = "开发区类型")
private String type;
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
This diff is collapsed.
package com.lyy.admin.VO;
import com.lyy.admin.domain.system.SysCarouselInfo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class HomePageVO {
@ApiModelProperty(value = "园区总数")
private Long parkInfoCount = 0l;
@ApiModelProperty(value = "开发区总数")
private Long developmentInfoCount = 0l;
@ApiModelProperty(value = "都市圈总数")
private Long megalopolisInfoCount = 0l;
@ApiModelProperty(value = "都市圈名称")
private String megalopolisInfoName = "";
// @ApiModelProperty(value = "城市覆盖总数")
// private Long coverCityCount;
@ApiModelProperty(value = "轮播图列表")
private List<SysCarouselInfo> sysCarouselInfolist = new ArrayList<>();
@ApiModelProperty(value = "热点园区")
private List<ParkInfoListVO> parkInfoListVO =new ArrayList<>();
}
package com.lyy.admin.VO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel(value = "首页园区列表信息")
public class HomeParkInfoListVO implements Serializable {
/**
* 主键id
*/
@ApiModelProperty(value = "主键id")
private Integer id;
/**
* 园区名称
*/
@ApiModelProperty(value = "园区名称")
private String name;
/**
* 图片链接
*/
@ApiModelProperty(value = "图片链接")
private String imgUrl;
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.lyy.admin.VO;
import com.lyy.admin.domain.MegalopolisCoreCityInfo;
import com.lyy.admin.domain.MegalopolisIndustryInfo;
import com.lyy.admin.domain.megalopolisinfo.MegalopolisCityInfo;
import com.lyy.admin.domain.megalopolisinfo.MegalopolisEnterpriseInfo;
import com.lyy.admin.domain.system.SysCarouselInfo;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@Data
public class MegalopolisInfoAllVO implements Serializable {
private List<SysCarouselInfo> sysCarouselInfos = new ArrayList<>();
private MegalopolisInfoVO megalopolisInfoVO = new MegalopolisInfoVO();
private List<MegalopolisEnterpriseInfo> megalopolisEnterpriseInfo = new ArrayList<>();
private List<MegalopolisCityInfo> megalopolisCityInfo = new ArrayList<>();
private List<MegalopolisCoreCityInfo> megalopolisCoreCityInfo = new ArrayList<>();
private List<DevelopmentInfoListVO> developmentInfoVO = new ArrayList<>();
}
\ No newline at end of file
package com.lyy.admin.VO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Data
@ApiModel(value = "都市圈列表信息", description = "都市圈列表信息")
public class MegalopolisInfoListVO implements Serializable {
/**
* 主键id
*/
@ApiModelProperty(value = "主键id")
private Integer id;
/**
* 都市圈名称
*/
@ApiModelProperty(value = "都市圈名称")
private String name;
/**
* 省code
*/
@ApiModelProperty(value = "省code")
private String provinceCode;
/**
* 省
*/
@ApiModelProperty(value = "省")
private String provinceName;
/**
* 城市code
*/
@ApiModelProperty(value = "城市code")
private String cityCode;
/**
* 城市
*/
@ApiModelProperty(value = "城市")
private String cityName;
/**
* 核心城市定位
*/
@ApiModelProperty(value = "核心城市定位")
private String coreCityPositioning;
/**
* 辐射圈面积
*/
@ApiModelProperty(value = "辐射圈面积")
private BigDecimal radiationArea;
/**
* 辐射圈GDP
*/
@ApiModelProperty(value = "辐射圈GDP")
private BigDecimal radiationGdp;
/**
* 辐射圈人口
*/
@ApiModelProperty(value = "辐射圈人口")
private BigDecimal radiationPopulation;
@ApiModelProperty(value = "图片链接")
private String imgUrl;
@ApiModelProperty(value = "收藏时间")
private Date createTime;
@ApiModelProperty(value = "是否收藏(1-收藏)")
private Integer isCollection;
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.lyy.admin.VO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@ApiModel(value = "都市圈列表信息")
public class MegalopolisInfoVO implements Serializable {
/**
* 图片链接
*/
private String imgUrl;
/**
* 主键id
*/
@ApiModelProperty(value = "主键id")
private Integer id;
/**
* 都市圈名称
*/
@ApiModelProperty(value = "都市圈名称")
private String name;
/**
* 省code
*/
@ApiModelProperty(value = "省code")
private String provinceCode;
/**
* 省
*/
@ApiModelProperty(value = "省")
private String provinceName;
/**
* 城市code
*/
@ApiModelProperty(value = "城市code")
private String cityCode;
/**
* 城市
*/
@ApiModelProperty(value = "城市")
private String cityName;
/**
* 区/县code
*/
@ApiModelProperty(value = "区/县code")
private String regionCode;
/**
* 区/县
*/
@ApiModelProperty(value = "区/县")
private String regionName;
/**
* 核心城市定位
*/
@ApiModelProperty(value = "核心城市定位")
private String coreCityPositioning;
/**
* 核心圈面积
*/
@ApiModelProperty(value = "核心圈面积")
private BigDecimal coreArea;
/**
* 核心圈GDP
*/
@ApiModelProperty(value = "核心圈GDP")
private BigDecimal coreGdp;
/**
* 核心圈人口
*/
@ApiModelProperty(value = "核心圈人口")
private BigDecimal corePopulation;
/**
* 城市圈面积
*/
@ApiModelProperty(value = "城市圈面积")
private BigDecimal cityArea;
/**
* 城市圈GDP
*/
@ApiModelProperty(value = "城市圈GDP")
private BigDecimal cityGdp;
/**
* 城市圈人口
*/
@ApiModelProperty(value = "城市圈人口")
private BigDecimal cityPopulation;
/**
* 辐射圈面积
*/
@ApiModelProperty(value = "辐射圈面积")
private BigDecimal radiationArea;
/**
* 辐射圈GDP
*/
@ApiModelProperty(value = "辐射圈GDP")
private BigDecimal radiationGdp;
/**
* 辐射圈人口
*/
@ApiModelProperty(value = "辐射圈人口")
private BigDecimal radiationPopulation;
/**
* 主导产业
*/
@ApiModelProperty(value = "主导产业")
private String primaryIndustry;
@ApiModelProperty(value = "图片详情链接")
private String imgCoreUrl;
@ApiModelProperty(value = "是否收藏(1-收藏)")
private Integer isCollection;
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.lyy.admin.VO;
import com.lyy.admin.domain.parkinfo.*;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class ParkInfoAllSaveVO implements Serializable {
private ParkInfoVO parkInfoVO;
private List<ParkTrafficInfo> parkTrafficInfos;
private List<ParkCarrierInfo> parkCarrierInfos;
private List<ParkResourcesInfo> parkResourcesInfos;
private List<ParkSewageInfo> parkSewageInfos;
private List<ParkInvestmentDirectionInfo> parkInvestmentDirectionInfos;
private List<CarrierInfoAllVO> carrierInfoAllVOs;
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.lyy.admin.VO;
import cn.hutool.json.JSONArray;
import com.lyy.admin.domain.parkinfo.ParkInvestmentDirectionInfo;
import com.lyy.admin.domain.parkinfo.ParkSewageInfo;
import com.lyy.admin.domain.parkinfo.ParkTrafficInfo;
import com.lyy.admin.domain.system.SysCarouselInfo;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Data
public class ParkInfoAllVO implements Serializable {
private ParkInfoVO parkInfoVO = new ParkInfoVO();
private List<ParkTrafficInfo> parkTrafficInfo =new ArrayList<>();
private JSONArray parkTrafficInfoVOs =new JSONArray();
// private List<ParkSewageInfo> parkSewageInfo;
private List<SysCarouselInfo> sysCarouselInfos = new ArrayList<>();
private List<CarrierInfoListVO> carrierInfoVO = new ArrayList<>();
private List<ParkInvestmentDirectionInfo> parkInvestmentDirectionInfos = new ArrayList<>();
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.lyy.admin.VO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
@ApiModel(value = "园区列表信息", description = "园区列表信息")
public class ParkInfoListVO implements Serializable {
/**
* 主键id
*/
@ApiModelProperty(value = "主键id")
private Integer id;
/**
* 园区名称
*/
@ApiModelProperty(value = "园区名称")
private String name;
/**
* 所属集团id
*/
@ApiModelProperty(value = "所属集团id")
private Integer groupId;
/**
* 所属集团
*/
@ApiModelProperty(value = "所属集团")
private String groupName;
/**
* 所属片区id
*/
@ApiModelProperty(value = "所属片区id")
private Integer zoneId;
/**
* 所属片区
*/
@ApiModelProperty(value = "所属片区")
private String zoneName;
/**
* 园区级别
*/
@ApiModelProperty(value = "园区级别")
private String levelCode;
@ApiModelProperty(value = "园区级别名称")
private String levelName;
/**
* 园区简介
*/
@ApiModelProperty(value = "园区简介")
private String description;
/**
* 省份code
*/
@ApiModelProperty(value = "省份code")
private String provinceCode;
/**
* 省份
*/
@ApiModelProperty(value = "省份")
private String provinceName;
/**
* 城市code
*/
@ApiModelProperty(value = "城市code")
private String cityCode;
/**
* 城市
*/
@ApiModelProperty(value = "城市")
private String cityName;
/**
* 区/县code
*/
@ApiModelProperty(value = "区/县code")
private String regionCode;
/**
* 区/县
*/
@ApiModelProperty(value = "区/县")
private String regionName;
/**
* 详细地址
*/
@ApiModelProperty(value = "详细地址")
private String address;
/**
* 认证状态(1-未认证;2-认证中;3-已认证;4-已拒绝)
*/
@ApiModelProperty(value = "认证状态(1-未认证;2-认证中;3-已认证;4-已拒绝)")
private Integer status;
/**
* 占地面积(单位:亩)
*/
@ApiModelProperty(value = "占地面积(单位:亩)")
private Double coverArea;
/**
* 主导产业
*/
@ApiModelProperty(value = "主导产业")
private String primaryIndustry;
/**
* 是否热点园区(0-否;1-是;)
*/
@ApiModelProperty(value = "是否热点园区(0-否;1-是;)")
private Integer isHotPark;
@ApiModelProperty(value = "列表展示图片")
private String imgUrl;
@ApiModelProperty(value = "收藏时间")
private Date createTime;
@ApiModelProperty(value = "是否收藏")
private Integer isCollection;
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
This diff is collapsed.
package com.lyy.admin.VO;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
*
* @TableName sys_carousel_info
*/
@TableName(value ="sys_carousel_info")
@Data
@ApiModel(value = "轮播图信息")
public class SysCarouselInfoVO implements Serializable {
/**
* 主键id
*/
@TableId
@ApiModelProperty(value = "填写主键id为更新,不填写为新增")
private Integer id;
/**
*
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
*
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 图片地址链接
*/
@ApiModelProperty(value = "图片地址链接")
private String imgUrl;
/**
* 图片描述
*/
@ApiModelProperty(value = "图片描述")
private String description;
/**
* 图片状态(0-禁用;1-可用)
*/
@ApiModelProperty(value = "图片状态(0-禁用;1-可用),不传的话默认为1")
private Integer status;
/**
* 类型(0 -都市圈、1-开发区、2-园区、3-首页)
*/
@ApiModelProperty(value = "类型(0 -都市圈、1-开发区、2-园区、3-首页)")
private Integer type;
/**
* 排序
*/
@ApiModelProperty(value = "排序")
private Integer orderNumber;
/**
* 关联id
*/
@ApiModelProperty(value = "关联id")
private Integer associationId;
/**
* 关联名称
*/
@ApiModelProperty(value = "关联名称")
private String associationName;
/**
* 跳转链接
*/
@ApiModelProperty(value = "跳转链接")
private String linkUrl;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.lyy.admin.VO;
import lombok.Data;
import java.util.List;
@Data
public class SysCollectionListVO {
private List<ParkInfoListVO> parkInfoListVOs;
private Long parkInfoListVOsCount;
private List<DevelopmentInfoListVO> developmentInfoListVOs;
private Long developmentInfoListVOsCount;
private List<MegalopolisInfoListVO> megalopolisInfosListVOs;
private Long megalopolisInfosListVOsCount;
}
package com.lyy.admin.VO;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
@ApiModel(value = "个人信息", description = "个人信息")
public class SysUserInfoVO implements Serializable {
/**
* 用户ID
*/
@ApiModelProperty(value = "用户ID")
private Integer userId;
/**
* 用户昵称
*/
@ApiModelProperty(value = "用户昵称")
private String nickName;
/**
* 用户邮箱
*/
@ApiModelProperty(value = "用户邮箱")
private String email;
/**
* 手机号码
*/
@ApiModelProperty(value = "手机号码")
private String phonenumber;
/**
* 用户性别(0男 1女 2未知)
*/
// @ApiModelProperty(value = "用户性别(0男 1女 2未知)")
// private String sex;
/**
* 头像路径
*/
@ApiModelProperty(value = "头像路径")
private String avatar;
/**
* 是否为会员
*/
@ApiModelProperty(value = "是否为会员")
private Boolean isMembership;
/**
* 会员到期时间
*/
@ApiModelProperty(value = "会员到期时间")
private Date endDate;
/**
* token
*/
@ApiModelProperty(value = "token")
private String token;
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.lyy.admin.common;
public enum CarouselTypeEnum {
DUSHIQUAN(0,"都市圈"),
KAIFAQU(1,"开发区"),
YUANQU(2,"园区"),
SHOUYE(3,"首页");
private Integer type;
private String typeName;
CarouselTypeEnum(Integer typeId, String typeName) {
this.type = typeId;
this.typeName = typeName;
}
public Integer getType() {
return type;
}
}
package com.lyy.admin.common;
public enum FilterCategoryEnum {
LEVEL("级别"),
INDUSTRY("行业"),
AREA("面积");
FilterCategoryEnum(String owner) {
this.category = owner;
}
private String category;
public String getCategory() {
return category;
}
}
package com.lyy.admin.common;
public enum StatusEnum {
DISABLE(0,"禁用"),
ENABLE(1,"可用");
private Integer code;
private String name;
StatusEnum(Integer typeId, String name) {
this.code = typeId;
this.name = name;
}
public Integer getCode() {
return code;
}
}
package com.lyy.admin.common.config;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
/**
* @author yaobaizheng
*/
@Configuration
// 表示通过aop框架暴露该代理对象,AopContext能够访问
@EnableAspectJAutoProxy(exposeProxy = true)
// 指定要扫描的Mapper类的包的路径
@MapperScan("com.lyy.admin.mapper.**")
public class ApplicationConfig
{
}
package com.lyy.admin.common.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 全局配置类
*
* @author ruoyi
*/
@Data
@Component
@ConfigurationProperties(prefix = "lyy")
public class LyyConfig
{
private String profile;
private String obsPath;
private String passwordSalt;
private Integer tokenExpireTimeDays;
private Boolean enableUrlFilter;
}
package com.lyy.admin.common.config;
import com.lyy.admin.common.constant.Constants;
import com.lyy.admin.common.interceptor.LoginInterceptor;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.CacheControl;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.concurrent.TimeUnit;
/**
* @author yaobaizheng
* @desc 解决跨域问题
*/
@Configuration
public class ResourceConfig implements WebMvcConfigurer {
@Autowired
LoginInterceptor loginInterceptor;
@Autowired
LyyConfig lyyConfig;
// @Override
// public void addResourceHandlers(ResourceHandlerRegistry registry)
// {
// /** 本地文件上传路径 */
//// registry.addResourceHandler( "/**")
//// .addResourceLocations("file:" + lyyConfig.getProfile() + "/");
//
// /** swagger配置 */
// registry.addResourceHandler("/swagger-ui/**")
// .addResourceLocations("classpath:/META-INF/resources/webjars/doc.html")
// .setCacheControl(CacheControl.maxAge(5, TimeUnit.HOURS).cachePublic());;
// }
/**
* 自定义拦截规则
*/
@Override
public void addInterceptors(InterceptorRegistry registry)
{
if(lyyConfig.getEnableUrlFilter()){
String[] excludeSwagger = new String[]{"/swagger-resources/**",
"/webjars/**", "/v2/**","/v3/**", "/swagger-ui.html/**",
"/api", "/api-docs", "/api-docs/**", "/doc.html/**"};
String[] excludeUrl = new String[]{"/demo/login","/login/login","/weixin/login",
"/parkInfo/list",
"/developmentInfo/list","/megalopolisInfo/list",
"/treeInfo/**","/homePage/**"};
String[] excludePatterns = (String[]) ArrayUtils.addAll(excludeSwagger, excludeUrl);
System.out.println("自定义拦截器#############################################");
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**")
.excludePathPatterns(excludePatterns);
}
}
/**
* 跨域配置
*/
@Bean
public CorsFilter corsFilter()
{
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
// 设置访问源地址
config.addAllowedOriginPattern("*");
// 设置访问源请求头
config.addAllowedHeader("*");
// 设置访问源请求方法
config.addAllowedMethod("*");
// 有效期 3600秒
config.setMaxAge(3600L);
// 添加映射路径,拦截一切请求
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
// 返回新的CorsFilter
return new CorsFilter(source);
}
}
package com.lyy.admin.common.config;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import com.lyy.admin.common.exception.APIExceptionEnum;
import com.lyy.admin.common.utils.AjaxResult;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.util.ReflectionUtils;
import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.builders.ResponseBuilder;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.Response;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider;
import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import static org.springframework.http.HttpMethod.*;
/**
* Swagger3的接口配置,使用的是knife4j,Swagger3的增强
* @author 姚百政
*/
@Configuration
public class SwaggerConfig
{
/** 是否开启swagger */
@Value("${swagger.enabled}")
private boolean enabled;
/**
* 创建API
*/
@Bean
public Docket createRestApi()
{
/** 更改默认返回码 */
List<Response> responseList = new ArrayList<>();
Arrays.stream(AjaxResult.ErrorCodeEum.values()).forEach(resultCode -> {
responseList.add(
new ResponseBuilder().code(String.valueOf( resultCode.code())).description(resultCode.message()).build()
);
});
return new Docket(DocumentationType.OAS_30)
.globalResponses(GET, responseList)
.globalResponses(POST, responseList)
.globalResponses(PUT, responseList)
.globalResponses(DELETE, responseList)
// .globalResponses(HEAD, responseList)
// .globalResponses(PATCH, responseList)
// .globalResponses(OPTIONS, responseList)
// .globalResponses(TRACE, responseList)
// 是否启用Swagger
.enable(enabled)
//分组设置
.groupName("区域大纲基本接口")
// 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
.apiInfo(apiInfo())
// 设置哪些接口暴露给Swagger展示
.select()
// 扫描所有有注解的api,用这种方式更灵活
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
// 扫描指定包中的swagger注解
// .apis(RequestHandlerSelectors.basePackage("com.lyy.admin.controller"))
// 扫描所有
// .apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build();
}
/**
* 添加摘要信息
*/
private ApiInfo apiInfo()
{
// 用ApiInfoBuilder进行定制
return new ApiInfoBuilder()
// 设置标题
.title("标题:区域大纲_接口文档")
// 描述
.description("描述:区域大纲后端接口")
// 作者信息
.contact(new Contact("LYY", null, null))
// 版本
.version("版本号:0.0.1" )
.build();
}
/**
* 创建API
*/
// @Bean
// public Docket createRestApi1()
// {
// /** 更改默认返回码 */
// List<Response> responseList = new ArrayList<>();
// Arrays.stream(AjaxResult.Type.values()).forEach(resultCode -> {
// responseList.add(
// new ResponseBuilder().code(String.valueOf(resultCode.value())).description(resultCode.message()).build()
// );
// });
//
// return new Docket(DocumentationType.OAS_30)
// .globalResponses(GET, responseList)
// .globalResponses(POST, responseList)
// .globalResponses(PUT, responseList)
// .globalResponses(DELETE, responseList)
//// .globalResponses(HEAD, responseList)
//// .globalResponses(PATCH, responseList)
//// .globalResponses(OPTIONS, responseList)
//// .globalResponses(TRACE, responseList)
// // 是否启用Swagger
// .enable(enabled)
// //分组设置
// .groupName("区域大纲系统接口")
// // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
// .apiInfo(apiInfo())
// // 设置哪些接口暴露给Swagger展示
// .select()
// // 扫描所有有注解的api,用这种方式更灵活
//// .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
// // 扫描指定包中的swagger注解
// .apis(RequestHandlerSelectors.basePackage("com.lyy.system.controller"))
// // 扫描所有 .apis(RequestHandlerSelectors.any())
// .paths(PathSelectors.any())
// .build();
// }
//
// /**
// * 添加摘要信息
// */
// private ApiInfo apiInfo1()
// {
// // 用ApiInfoBuilder进行定制
// return new ApiInfoBuilder()
// // 设置标题
// .title("标题:区域大纲_接口文档")
// // 描述
// .description("描述:区域大纲后端接口")
// // 作者信息
// .contact(new Contact("LYY", null, null))
// // 版本
// .version("版本号:0.0.1" )
// .build();
// }
}
package com.lyy.admin.common.constant;
/**
* 通用常量信息
* @author yaobaizheng
*/
public class Constants {
/**
* UTF-8 字符集
*/
public static final String UTF8 = "UTF-8";
/**
* GBK 字符集
*/
public static final String GBK = "GBK";
/**
* http请求
*/
public static final String HTTP = "http://";
/**
* https请求
*/
public static final String HTTPS = "https://";
/**
* 通用成功标识
*/
public static final String SUCCESS = "0";
/**
* 通用失败标识
*/
public static final String FAIL = "1";
/**
* 登录成功
*/
public static final String LOGIN_SUCCESS = "Success";
/**
* 注销
*/
public static final String LOGOUT = "Logout";
/**
* 注册
*/
public static final String REGISTER = "Register";
/**
* 登录失败
*/
public static final String LOGIN_FAIL = "Error";
/**
* 系统用户授权缓存
*/
public static final String SYS_AUTH_CACHE = "sys-authCache";
/**
* 参数管理 cache name
*/
public static final String SYS_CONFIG_CACHE = "sys-config";
/**
* 参数管理 cache key
*/
public static final String SYS_CONFIG_KEY = "sys_config:";
/**
* 字典管理 cache name
*/
public static final String SYS_DICT_CACHE = "sys-dict";
/**
* 字典管理 cache key
*/
public static final String SYS_DICT_KEY = "sys_dict:";
/**
* 资源映射路径 前缀
*/
public static final String RESOURCE_PREFIX = "/profile";
/**
* RMI 远程方法调用
*/
public static final String LOOKUP_RMI = "rmi:";
/**
* LDAP 远程方法调用
*/
public static final String LOOKUP_LDAP = "ldap:";
/**
* LDAPS 远程方法调用
*/
public static final String LOOKUP_LDAPS = "ldaps:";
/**
* 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加)
*/
public static final String[] JOB_WHITELIST_STR = { "com.ruoyi" };
/**
* 定时任务违规的字符
*/
public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
"org.springframework", "org.apache", "com.ruoyi.common.utils.file", "com.ruoyi.common.config" };
}
\ No newline at end of file
package com.lyy.admin.common.exception;
import com.lyy.admin.common.utils.AjaxResult;
import lombok.Data;
@Data
public class APIException extends RuntimeException {
private int code;
private String message;
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
public APIException(int code, String message) {
this.code = code;
this.message = message;
}
public APIException(APIExceptionEnum apiExceptionEnum) {
this.code = apiExceptionEnum.getCode();
this.message = apiExceptionEnum.getMessage();
}
}
package com.lyy.admin.common.exception;
import lombok.Getter;
@Getter
public enum APIExceptionEnum {
//用户
USER_NOTEXISTS(4001, "当前用户不存在"),
USER_PASSWORD_ERROR(4002, "当前用户密码输入错误"),
USER_TOKEN_EXPIRE(4003, "当前会话失效,请重新登录"),
//会员
MEMBERSHIP_NOTEXISTS(4101, "会员码不存在,请确认"),
MEMBERSHIP_USED(4102, "会员码已激活,请勿重复使用"),
NOTEXISTS_EXCEPTION(4500, "数据不存在,请确认!"),
//
WX_GETPHONENUMBER_ERROR(40029, "微信获取手机号code码无效,或着微信异常,请重试!");
private int code;
private String message;
APIExceptionEnum(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMsg() {
return message;
}
}
package com.lyy.admin.common.exception;
/**
* 工具类异常
* @author yaobaizheng
*/
public class UtilException extends RuntimeException
{
private static final long serialVersionUID = 8247610319171014183L;
public UtilException(Throwable e)
{
super(e.getMessage(), e);
}
public UtilException(String message)
{
super(message);
}
public UtilException(String message, Throwable throwable)
{
super(message, throwable);
}
}
package com.lyy.admin.common.exception.base;
import com.lyy.admin.common.utils.MessageUtils;
import com.lyy.admin.common.utils.StringUtils;
/**
* 基础异常
*
* @author ruoyi
*/
public class BaseException extends RuntimeException
{
private static final long serialVersionUID = 1L;
/**
* 所属模块
*/
private String module;
/**
* 错误码
*/
private String code;
/**
* 错误码对应的参数
*/
private Object[] args;
/**
* 错误消息
*/
private String defaultMessage;
public BaseException(String module, String code, Object[] args, String defaultMessage)
{
this.module = module;
this.code = code;
this.args = args;
this.defaultMessage = defaultMessage;
}
public BaseException(String module, String code, Object[] args)
{
this(module, code, args, null);
}
public BaseException(String module, String defaultMessage)
{
this(module, null, null, defaultMessage);
}
public BaseException(String code, Object[] args)
{
this(null, code, args, null);
}
public BaseException(String defaultMessage)
{
this(null, null, null, defaultMessage);
}
@Override
public String getMessage()
{
String message = null;
if (!StringUtils.isEmpty(code))
{
message = MessageUtils.message(code, args);
}
if (message == null)
{
message = defaultMessage;
}
return message;
}
public String getModule()
{
return module;
}
public String getCode()
{
return code;
}
public Object[] getArgs()
{
return args;
}
public String getDefaultMessage()
{
return defaultMessage;
}
}
package com.lyy.admin.common.interceptor;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.lyy.admin.common.exception.APIException;
import com.lyy.admin.common.exception.APIExceptionEnum;
import com.lyy.admin.domain.SysUserToken;
import com.lyy.admin.mapper.SysUserInfoMapper;
import com.lyy.admin.mapper.SysUserTokenMapper;
import com.lyy.admin.mapper.system.SysMembershipInfoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Autowired
SysUserTokenMapper sysUserTokenMapper;
@Autowired
SysMembershipInfoMapper sysMembershipInfoMapper;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("token");// 从 http 请求头中取出 token
if(token == null || "".equals(token) ){
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@"+token);
throw new APIException(APIExceptionEnum.USER_TOKEN_EXPIRE);
}
//判断token是否在有效期内
QueryWrapper<SysUserToken> sysUserTokenQW = new QueryWrapper<>();
sysUserTokenQW.eq("token",token);
SysUserToken sysUserToken = sysUserTokenMapper.selectOne(sysUserTokenQW);
if(sysUserToken == null){
throw new APIException(APIExceptionEnum.USER_TOKEN_EXPIRE);
}
Date expireTime = sysUserToken.getExpireTime();
DateTime expireTimeNew = DateUtil.dateNew(expireTime);
DateTime currentTime = DateUtil.date();
if(!expireTimeNew.isAfter(currentTime)){
throw new APIException(APIExceptionEnum.USER_TOKEN_EXPIRE);
}
return true;
}
}
package com.lyy.admin.common;
public enum ownerShipEnum {
PARK("产业园"),
DEVELOPMENT("开发区");
ownerShipEnum(String owner) {
this.owner = owner;
}
private String owner;
public String getOwner() {
return owner;
}
}
package com.lyy.admin.common.page;
import com.lyy.admin.common.utils.StringUtils;
/**
* 分页数据
* @author yaobaizheng
*/
public class PageDomain {
/** 当前记录起始索引 */
private Integer pageNum;
/** 每页显示记录数 */
private Integer pageSize;
/** 排序列 */
private String orderByColumn;
/** 排序的方向desc或者asc */
private String isAsc = "asc";
/** 分页参数合理化 */
private Boolean reasonable = true;
public String getOrderBy()
{
if (StringUtils.isEmpty(orderByColumn))
{
return "";
}
return StringUtils.toUnderScoreCase(orderByColumn) + " " + isAsc;
}
public Integer getPageNum()
{
return pageNum;
}
public void setPageNum(Integer pageNum)
{
this.pageNum = pageNum;
}
public Integer getPageSize()
{
return pageSize;
}
public void setPageSize(Integer pageSize)
{
this.pageSize = pageSize;
}
public String getOrderByColumn()
{
return orderByColumn;
}
public void setOrderByColumn(String orderByColumn)
{
this.orderByColumn = orderByColumn;
}
public String getIsAsc()
{
return isAsc;
}
public void setIsAsc(String isAsc)
{
this.isAsc = isAsc;
}
public Boolean getReasonable()
{
if (StringUtils.isNull(reasonable))
{
return Boolean.TRUE;
}
return reasonable;
}
public void setReasonable(Boolean reasonable)
{
this.reasonable = reasonable;
}
}
package com.lyy.admin.common.page;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* 表格分页数据对象
* @author yaobaizheng
*/
public class TableDataInfo implements Serializable
{
private static final long serialVersionUID = 1L;
/** 总记录数 */
private long total;
/** 列表数据 */
private List<?> rows = new ArrayList<>();
/** 消息状态码 */
// private int code;
//
// /** 消息内容 */
// private String msg;
/**
* 表格数据对象
*/
public TableDataInfo()
{
}
/**
* 分页
*
* @param list 列表数据
* @param total 总记录数
*/
public TableDataInfo(List<?> list, long total)
{
this.rows = list;
this.total = total;
}
public long getTotal()
{
return total;
}
public void setTotal(long total)
{
this.total = total;
}
public List<?> getRows()
{
return rows;
}
public void setRows(List<?> rows)
{
this.rows = rows;
}
// public int getCode()
// {
// return code;
// }
//
// public void setCode(int code)
// {
// this.code = code;
// }
//
// public String getMsg()
// {
// return msg;
// }
//
// public void setMsg(String msg)
// {
// this.msg = msg;
// }
}
\ No newline at end of file
package com.lyy.admin.common.page;
import com.lyy.admin.common.text.Convert;
import com.lyy.admin.common.utils.ServletUtils;
/**
* 表格数据处理
* @author yaobaizheng
*/
public class TableSupport
{
/**
* 当前记录起始索引
*/
public static final String PAGE_NUM = "pageNum";
/**
* 每页显示记录数
*/
public static final String PAGE_SIZE = "pageSize";
/**
* 排序列
*/
public static final String ORDER_BY_COLUMN = "orderByColumn";
/**
* 排序的方向 "desc" 或者 "asc".
*/
public static final String IS_ASC = "isAsc";
/**
* 分页参数合理化
*/
public static final String REASONABLE = "reasonable";
/**
* 封装分页对象
*/
public static PageDomain getPageDomain()
{
PageDomain pageDomain = new PageDomain();
pageDomain.setPageNum(Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1));
pageDomain.setPageSize(Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10));
pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN));
pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC));
pageDomain.setReasonable(ServletUtils.getParameterToBool(REASONABLE));
return pageDomain;
}
public static PageDomain buildPageRequest()
{
return getPageDomain();
}
}
package com.lyy.admin.common.text;
import com.lyy.admin.common.utils.StringUtils;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
/**
* 字符集工具类
* @author yaobaizheng
*/
public class CharsetKit
{
/** ISO-8859-1 */
public static final String ISO_8859_1 = "ISO-8859-1";
/** UTF-8 */
public static final String UTF_8 = "UTF-8";
/** GBK */
public static final String GBK = "GBK";
/** ISO-8859-1 */
public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1);
/** UTF-8 */
public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8);
/** GBK */
public static final Charset CHARSET_GBK = Charset.forName(GBK);
/**
* 转换为Charset对象
*
* @param charset 字符集,为空则返回默认字符集
* @return Charset
*/
public static Charset charset(String charset)
{
return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset);
}
/**
* 转换字符串的字符集编码
*
* @param source 字符串
* @param srcCharset 源字符集,默认ISO-8859-1
* @param destCharset 目标字符集,默认UTF-8
* @return 转换后的字符集
*/
public static String convert(String source, String srcCharset, String destCharset)
{
return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset));
}
/**
* 转换字符串的字符集编码
*
* @param source 字符串
* @param srcCharset 源字符集,默认ISO-8859-1
* @param destCharset 目标字符集,默认UTF-8
* @return 转换后的字符集
*/
public static String convert(String source, Charset srcCharset, Charset destCharset)
{
if (null == srcCharset)
{
srcCharset = StandardCharsets.ISO_8859_1;
}
if (null == destCharset)
{
destCharset = StandardCharsets.UTF_8;
}
if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset))
{
return source;
}
return new String(source.getBytes(srcCharset), destCharset);
}
/**
* @return 系统字符集编码
*/
public static String systemCharset()
{
return Charset.defaultCharset().name();
}
}
This diff is collapsed.
package com.lyy.admin.common.text;
import com.lyy.admin.common.utils.StringUtils;
/**
* 字符串格式化
* @author yaobaizehng
*/
public class StrFormatter {
public static final String EMPTY_JSON = "{}";
public static final char C_BACKSLASH = '\\';
public static final char C_DELIM_START = '{';
public static final char C_DELIM_END = '}';
/**
* 格式化字符串<br>
* 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
* 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
* 例:<br>
* 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
* 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
* 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
*
* @param strPattern 字符串模板
* @param argArray 参数列表
* @return 结果
*/
public static String format(final String strPattern, final Object... argArray)
{
if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray))
{
return strPattern;
}
final int strPatternLength = strPattern.length();
// 初始化定义好的长度以获得更好的性能
StringBuilder sbuf = new StringBuilder(strPatternLength + 50);
int handledPosition = 0;
int delimIndex;// 占位符所在位置
for (int argIndex = 0; argIndex < argArray.length; argIndex++)
{
delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition);
if (delimIndex == -1)
{
if (handledPosition == 0)
{
return strPattern;
}
else
{ // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果
sbuf.append(strPattern, handledPosition, strPatternLength);
return sbuf.toString();
}
}
else
{
if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH)
{
if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH)
{
// 转义符之前还有一个转义符,占位符依旧有效
sbuf.append(strPattern, handledPosition, delimIndex - 1);
sbuf.append(Convert.utf8Str(argArray[argIndex]));
handledPosition = delimIndex + 2;
}
else
{
// 占位符被转义
argIndex--;
sbuf.append(strPattern, handledPosition, delimIndex - 1);
sbuf.append(C_DELIM_START);
handledPosition = delimIndex + 1;
}
}
else
{
// 正常占位符
sbuf.append(strPattern, handledPosition, delimIndex);
sbuf.append(Convert.utf8Str(argArray[argIndex]));
handledPosition = delimIndex + 2;
}
}
}
// 加入最后一个占位符后所有的字符
sbuf.append(strPattern, handledPosition, strPattern.length());
return sbuf.toString();
}
}
package com.lyy.admin.common.utils;
import java.util.HashMap;
import java.util.Objects;
/**
* 操作消息提醒
* @author yaobaizheng
*/
public class AjaxResult extends HashMap<String, Object>
{
private static final long serialVersionUID = 1L;
/** 状态码 */
public static final String CODE_TAG = "code";
/** 返回内容 */
public static final String MSG_TAG = "msg";
/** 数据对象 */
public static final String DATA_TAG = "data";
/**
* 状态类型
*/
public enum ErrorCodeEum {
/**
* 成功
*/
SUCCESS(200, "成功"),
/**
* 警告
*/
WARN(300, "警告"),
/**
* 错误
*/
ERROR(500, "错误");
private final int code;
private String message;
ErrorCodeEum(int code, String message) {
this.code = code;
this.message = message;
}
public int code() {
return this.code;
}
public String message() {
return this.message;
}
}
/**
* 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。
*/
public AjaxResult()
{
}
/**
* 初始化一个新创建的 AjaxResult 对象
*
* @param errorCodeEum 状态类型
* @param msg 返回内容
*/
public AjaxResult(ErrorCodeEum errorCodeEum, String msg)
{
super.put(CODE_TAG, errorCodeEum.code());
super.put(MSG_TAG, msg);
}
/**
* 初始化一个新创建的 AjaxResult 对象
*
* @param code 状态类型
* @param msg 返回内容
* @param data 数据对象
*/
public AjaxResult(int code, String msg, Object data)
{
super.put(CODE_TAG, code);
super.put(MSG_TAG, msg);
if (StringUtils.isNotNull(data))
{
super.put(DATA_TAG, data);
}
}
/**
* 返回成功消息
*
* @return 成功消息
*/
public static AjaxResult success()
{
return AjaxResult.success("操作成功");
}
/**
* 返回成功数据
*
* @return 成功消息
*/
public static AjaxResult success(Object data)
{
return AjaxResult.success("操作成功", data);
}
/**
* 返回成功消息
*
* @param msg 返回内容
* @return 成功消息
*/
public static AjaxResult success(String msg)
{
return AjaxResult.success(msg, null);
}
/**
* 返回成功消息
*
* @param msg 返回内容
* @param data 数据对象
* @return 成功消息
*/
public static AjaxResult success(String msg, Object data)
{
return new AjaxResult(ErrorCodeEum.SUCCESS.code(), msg, data);
}
/**
* 返回警告消息
*
* @param msg 返回内容
* @return 警告消息
*/
public static AjaxResult warn(String msg)
{
return AjaxResult.warn(msg, null);
}
/**
* 返回警告消息
*
* @param msg 返回内容
* @param data 数据对象
* @return 警告消息
*/
public static AjaxResult warn(String msg, Object data)
{
return new AjaxResult(ErrorCodeEum.WARN.code(), msg, data);
}
/**
* 返回错误消息
*
* @return
*/
public static AjaxResult error()
{
return AjaxResult.error("操作失败");
}
/**
* 返回错误消息
*
* @param msg 返回内容
* @return 警告消息
*/
public static AjaxResult error(String msg)
{
return AjaxResult.error(msg, null);
}
public static AjaxResult error(int code,String msg)
{
return new AjaxResult(ErrorCodeEum.ERROR.code(), msg, null);
}
/**
* 返回错误消息
*
* @param msg 返回内容
* @param data 数据对象
* @return 警告消息
*/
public static AjaxResult error(String msg, Object data)
{
return new AjaxResult(ErrorCodeEum.ERROR.code(), msg, data);
}
/**
* 是否为成功消息
*
* @return 结果
*/
public boolean isSuccess()
{
return Objects.equals(ErrorCodeEum.SUCCESS.code(), this.get(CODE_TAG));
}
/**
* 是否为警告消息
*
* @return 结果
*/
public boolean isWarn()
{
return Objects.equals(ErrorCodeEum.WARN.code(), this.get(CODE_TAG));
}
/**
* 是否为错误消息
*
* @return 结果
*/
public boolean isError()
{
return Objects.equals(ErrorCodeEum.ERROR.code(), this.get(CODE_TAG));
}
/**
* 方便链式调用
*
* @param key 键
* @param value 值
* @return 数据对象
*/
@Override
public AjaxResult put(String key, Object value)
{
super.put(key, value);
return this;
}
}
package com.lyy.admin.common.utils;
import org.apache.commons.lang3.time.DateFormatUtils;
import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.util.Date;
/**
* 时间工具类
*
* @author ruoyi
*/
public class DateUtils extends org.apache.commons.lang3.time.DateUtils
{
public static String YYYY = "yyyy";
public static String YYYY_MM = "yyyy-MM";
public static String YYYY_MM_DD = "yyyy-MM-dd";
public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
private static String[] parsePatterns = {
"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
"yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
/**
* 获取当前Date型日期
*
* @return Date() 当前日期
*/
public static Date getNowDate()
{
return new Date();
}
/**
* 获取当前日期, 默认格式为yyyy-MM-dd
*
* @return String
*/
public static String getDate()
{
return dateTimeNow(YYYY_MM_DD);
}
public static final String getTime()
{
return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
}
public static final String dateTimeNow()
{
return dateTimeNow(YYYYMMDDHHMMSS);
}
public static final String dateTimeNow(final String format)
{
return parseDateToStr(format, new Date());
}
public static final String dateTime(final Date date)
{
return parseDateToStr(YYYY_MM_DD, date);
}
public static final String parseDateToStr(final String format, final Date date)
{
return new SimpleDateFormat(format).format(date);
}
public static final Date dateTime(final String format, final String ts)
{
try
{
return new SimpleDateFormat(format).parse(ts);
}
catch (ParseException e)
{
throw new RuntimeException(e);
}
}
/**
* 日期路径 即年/月/日 如2018/08/08
*/
public static final String datePath()
{
Date now = new Date();
return DateFormatUtils.format(now, "yyyy/MM/dd");
}
/**
* 日期路径 即年/月/日 如20180808
*/
public static final String dateTime()
{
Date now = new Date();
return DateFormatUtils.format(now, "yyyyMMdd");
}
/**
* 日期型字符串转化为日期 格式
*/
public static Date parseDate(Object str)
{
if (str == null)
{
return null;
}
try
{
return parseDate(str.toString(), parsePatterns);
}
catch (ParseException e)
{
return null;
}
}
/**
* 获取服务器启动时间
*/
public static Date getServerStartDate()
{
long time = ManagementFactory.getRuntimeMXBean().getStartTime();
return new Date(time);
}
/**
* 计算相差天数
*/
public static int differentDaysByMillisecond(Date date1, Date date2)
{
return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)));
}
/**
* 计算时间差
*
* @param endDate 最后时间
* @param startTime 开始时间
* @return 时间差(天/小时/分钟)
*/
public static String timeDistance(Date endDate, Date startTime)
{
long nd = 1000 * 24 * 60 * 60;
long nh = 1000 * 60 * 60;
long nm = 1000 * 60;
// long ns = 1000;
// 获得两个时间的毫秒时间差异
long diff = endDate.getTime() - startTime.getTime();
// 计算差多少天
long day = diff / nd;
// 计算差多少小时
long hour = diff % nd / nh;
// 计算差多少分钟
long min = diff % nd % nh / nm;
// 计算差多少秒//输出结果
// long sec = diff % nd % nh % nm / ns;
return day + "天" + hour + "小时" + min + "分钟";
}
/**
* 增加 LocalDateTime ==> Date
*/
public static Date toDate(LocalDateTime temporalAccessor)
{
ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault());
return Date.from(zdt.toInstant());
}
/**
* 增加 LocalDate ==> Date
*/
public static Date toDate(LocalDate temporalAccessor)
{
LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0));
ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
return Date.from(zdt.toInstant());
}
}
package com.lyy.admin.common.utils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.lyy.admin.common.exception.APIException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.validation.BindException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MissingPathVariableException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
import javax.servlet.http.HttpServletRequest;
/**
* 全局异常处理器
*
* @author yaobaizheng
*/
@RestControllerAdvice(basePackages = "com.lyy.admin.controller")
public class GlobalExceptionHandler implements ResponseBodyAdvice {
private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
boolean assignableFrom = returnType.getParameterType().isAssignableFrom(AjaxResult.class);
return !assignableFrom;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
AjaxResult value = AjaxResult.success(body);
boolean isStringResult = returnType.getParameterType().equals(String.class);
if (isStringResult) {
ObjectMapper objectMapper = new ObjectMapper();
try {
String s = objectMapper.writeValueAsString(value);
return s;
} catch (JsonProcessingException e) {
e.printStackTrace();
try {
throw new Exception(e.getMessage());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
return value;
}
@ExceptionHandler(APIException.class)
public AjaxResult APIExceptionHandler(APIException apiException) {
int code = apiException.getCode();
String message = apiException.getMessage();
AjaxResult fail = AjaxResult.warn( message);
return fail;
}
/**
* 请求方式不支持
*/
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public AjaxResult handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e,
HttpServletRequest request) {
String requestURI = request.getRequestURI();
log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod());
return AjaxResult.error(e.getMessage());
}
/**
* 拦截未知的运行时异常
*/
@ExceptionHandler(RuntimeException.class)
public AjaxResult handleRuntimeException(RuntimeException e, HttpServletRequest request) {
String requestURI = request.getRequestURI();
log.error("请求地址'{}',发生未知异常.", requestURI, e);
return AjaxResult.error(e.getMessage());
}
/**
* 系统异常
*/
@ExceptionHandler(Exception.class)
public AjaxResult handleException(Exception e, HttpServletRequest request) {
String requestURI = request.getRequestURI();
log.error("请求地址'{}',发生系统异常.", requestURI, e);
return AjaxResult.error(e.getMessage());
}
/**
* 请求路径中缺少必需的路径变量
*/
@ExceptionHandler(MissingPathVariableException.class)
public AjaxResult handleMissingPathVariableException(MissingPathVariableException e, HttpServletRequest request) {
String requestURI = request.getRequestURI();
log.error("请求路径中缺少必需的路径变量'{}',发生系统异常.", requestURI, e);
return AjaxResult.error(String.format("请求路径中缺少必需的路径变量[%s]", e.getVariableName()));
}
/**
* 请求参数类型不匹配
*/
@ExceptionHandler(MethodArgumentTypeMismatchException.class)
public AjaxResult handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e,
HttpServletRequest request) {
String requestURI = request.getRequestURI();
log.error("请求参数类型不匹配'{}',发生系统异常.", requestURI, e);
return AjaxResult.error(String.format("请求参数类型不匹配,参数[%s]要求类型为:'%s',但输入值为:'%s'", e.getName(), e.getRequiredType().getName(), e.getValue()));
}
/**
* 自定义验证异常
*/
@ExceptionHandler(BindException.class)
public AjaxResult handleBindException(BindException e) {
log.error(e.getMessage(), e);
String message = e.getAllErrors().get(0).getDefaultMessage();
return AjaxResult.error(message);
}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment