Bladeren bron

全国地区字典管理

qzyReal 1 jaar geleden
bovenliggende
commit
425c39c9c5

+ 20 - 0
sp-core/sp-api/src/main/java/com/pj/api/client/admin/AdminInterface.java

@@ -2,10 +2,14 @@ package com.pj.api.client.admin;
 
 import com.pj.api.FeignInterceptor;
 import com.pj.api.consts.FeignConsts;
+import com.pj.api.dto.DistrictDTO;
+import com.pj.api.dto.DistrictInfoDTO;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.util.List;
+
 /**
  * 系统配置 服务
  * @author kong
@@ -24,4 +28,20 @@ public interface AdminInterface {
 			   @RequestParam("type") Integer type,
 			   @RequestParam("status") Integer status);
 
+	/**
+	 * 根据城市名称查找地区数据
+	 * @param cityName
+	 * @return
+	 */
+	@RequestMapping("/TbDistrict/rpc/findInfoByCityName")
+	DistrictInfoDTO findInfoByCityName(String cityName);
+
+	/**
+	 * 根据IDs查找地区
+	 * @param ids
+	 * @return
+	 */
+	@RequestMapping(value = "TbDistrict/rpc/getByIds")
+	List<DistrictDTO> getDistrictList(@RequestParam("ids")String ids);
+
 }

+ 14 - 0
sp-core/sp-api/src/main/java/com/pj/api/client/admin/AdminInterfaceFallback.java

@@ -1,10 +1,14 @@
 package com.pj.api.client.admin;
 
+import com.pj.api.dto.DistrictDTO;
+import com.pj.api.dto.DistrictInfoDTO;
 import feign.hystrix.FallbackFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
+import java.util.List;
+
 /**
  * 系统配置 服务降级处理
  * @author kong
@@ -34,6 +38,16 @@ public class AdminInterfaceFallback implements FallbackFactory<AdminInterface>
 				log.error("错误的id:{},边民类型:{},状态:{},保护操作:{}",id,type,status,"熔断");
 				return 0;
 			}
+
+			@Override
+			public DistrictInfoDTO findInfoByCityName(String cityName) {
+				return null;
+			}
+
+			@Override
+			public List<DistrictDTO> getDistrictList(String ids) {
+				return null;
+			}
 		};
 	}
 

+ 69 - 0
sp-core/sp-api/src/main/java/com/pj/api/dto/DistrictDTO.java

@@ -0,0 +1,69 @@
+package com.pj.api.dto;
+
+import java.io.Serializable;
+
+public class DistrictDTO implements Serializable {
+    /**
+     * 序列化版本id
+     */
+    private static final long serialVersionUID = 1L;
+
+    public DistrictDTO() {
+    }
+
+    public DistrictDTO(Long id, Long pid, String district, String level) {
+        this.id = id;
+        this.pid = pid;
+        this.district = district;
+        this.level = level;
+    }
+
+    private Long id;
+
+    /**
+     * 父及地区关系
+     */
+    private Long pid;
+
+    /**
+     * 地区名称
+     */
+    private String district;
+
+    /**
+     * 子属级别关系
+     */
+    private String level;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getPid() {
+        return pid;
+    }
+
+    public void setPid(Long pid) {
+        this.pid = pid;
+    }
+
+    public String getDistrict() {
+        return district;
+    }
+
+    public void setDistrict(String district) {
+        this.district = district;
+    }
+
+    public String getLevel() {
+        return level;
+    }
+
+    public void setLevel(String level) {
+        this.level = level;
+    }
+}

+ 24 - 0
sp-core/sp-api/src/main/java/com/pj/api/dto/DistrictInfoDTO.java

@@ -0,0 +1,24 @@
+package com.pj.api.dto;
+
+import java.io.Serializable;
+
+public class DistrictInfoDTO implements Serializable {
+    private String name;
+    private String path;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+}

+ 23 - 0
sp-core/sp-base/src/main/java/com/pj/current/LongToStringConfig.java

@@ -0,0 +1,23 @@
+package com.pj.current;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
+
+@Configuration
+public class LongToStringConfig {
+    @Bean
+    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
+        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
+        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+        SimpleModule module = new SimpleModule();
+        module.addSerializer(Long.class, ToStringSerializer.instance);
+        module.addSerializer(Long.TYPE, ToStringSerializer.instance);
+        objectMapper.registerModule(module);
+        return objectMapper;
+    }
+}

+ 12 - 0
sp-core/sp-base/src/main/java/com/pj/current/dto/PCLoginUserInfo.java

@@ -0,0 +1,12 @@
+package com.pj.current.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+@Data
+@Accessors(chain = true)
+public class PCLoginUserInfo implements Serializable {
+    private Long loginId;
+    private String loginName;
+}

+ 21 - 0
sp-core/sp-base/src/main/java/com/pj/current/satoken/StpUserUtil.java

@@ -6,6 +6,7 @@ import java.util.List;
 import cn.dev33.satoken.strategy.SaStrategy;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
+import com.pj.current.dto.PCLoginUserInfo;
 import com.pj.utils.cache.RedisUtil;
 import org.springframework.stereotype.Component;
 
@@ -36,6 +37,26 @@ public class StpUserUtil {
     public static StpLogic stpLogic = new StpLogic(TYPE);
 
     /**
+     * 缓存登录用户信息
+     * @param info
+     */
+    public static void cachePcLoginInfo(PCLoginUserInfo info){
+       String loginId= StpUtil.getLoginIdAsString();
+       RedisUtil.set("pc:"+loginId,JSONUtil.toJsonStr(info));
+    }
+
+    /**
+     * 获取登录信息
+     * @return
+     */
+    public static PCLoginUserInfo getPCLoginInfo(){
+        String key="pc:"+getLoginIdAsString();
+        String info=RedisUtil.get(key);
+        return StrUtil.isNotEmpty(info)?new PCLoginUserInfo():JSONUtil.toBean(info,PCLoginUserInfo.class);
+    }
+
+
+    /**
      * 获取当前 StpLogic 的账号类型
      *
      * @return See Note

+ 2 - 2
sp-generate/src/main/java/com/pj/SpGenerateApplication.java

@@ -64,7 +64,7 @@ public class SpGenerateApplication {
 			.setOutFC(false)					// 是否输出FC.java工厂类
 			.setDefaultMeunIcon("el-icon-folder-opened")	// 生成后台管理页面时,默认的菜单图标
 			.setWebLibImportWay(2) 			// 前端js库导入方式(1=cdn导入, 2=本地导入[需将sa-admin附带js包复制到kj文件夹])
-			 .addTableName("app_user","app_user_login_log")	// 添加要生成的表 (单个添加)
+			 .addTableName("tb_district")	// 添加要生成的表 (单个添加)
 //			.addTableAll()		// 添加要生成的表 (一次性添加所有表)
             .removeTableName("sp_role", "sp_role_permission", "sp_admin", "sp_apilog", "sp_cfg")	// 移除这些内置的表,不必生成代码
             ; 
@@ -76,7 +76,7 @@ public class SpGenerateApplication {
 		GenUtil.doRead();	// 从数据库读取数据 
 		GenUtil.doOutMyBatis();	// 输出java代码 (mybatis版本)
 		GenUtil.doOutMyBatisService();	// 输出java代码 - 追加service层
-		GenUtil.doOutAdminHtml();	// 输出 admin后台管理页面
+		//GenUtil.doOutAdminHtml();	// 输出 admin后台管理页面
 //		GenUtil.doOutApidoc();	// 输出 接口文档页面
 		
 

+ 93 - 0
sp-service/sp-admin/src/main/java/com/pj/project/tb_district/TbDistrict.java

@@ -0,0 +1,93 @@
+package com.pj.project.tb_district;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Model: tb_district -- 全国地区表
+ * @author qzyReal 
+ */
+@Data
+@Accessors(chain = true)
+@TableName(TbDistrict.TABLE_NAME)
+@EqualsAndHashCode(callSuper = false)
+public class TbDistrict extends Model<TbDistrict> implements Serializable {
+
+	// ---------- 模块常量 ----------
+	/**
+	 * 序列化版本id 
+	 */
+	private static final long serialVersionUID = 1L;	
+	/**
+	 * 此模块对应的表名 
+	 */
+	public static final String TABLE_NAME = "tb_district";	
+	/**
+	 * 此模块对应的权限码 
+	 */
+	public static final String PERMISSION_CODE = "tb-district";	
+
+
+	// ---------- 表中字段 ----------
+	/**
+	 * 主键 
+	 */
+	private Long id;
+
+	/**
+	 * 父及地区关系 
+	 */
+	private Long pid;
+
+	/**
+	 * 地区名称 
+	 */
+	private String district;
+
+	/**
+	 * 子属级别关系 
+	 */
+	private String level;
+
+	@TableField(exist = false)
+	private List<TbDistrict> children;
+
+
+	@TableField(exist = false)
+	private Long AreaId;
+	@TableField(exist = false)
+	private String AreaName;
+	@TableField(exist = false)
+	private Long ParentId;
+	@TableField(exist = false)
+	private String Layer;
+
+
+	public Long getAreaId() {
+		return this.id;
+	}
+
+	public String getAreaName() {
+		return this.district;
+	}
+
+	public Long getParentId() {
+		return this.pid;
+	}
+
+	public String getLayer() {
+		return this.Layer;
+	}
+
+
+	
+
+
+}

+ 83 - 0
sp-service/sp-admin/src/main/java/com/pj/project/tb_district/TbDistrictController.java

@@ -0,0 +1,83 @@
+package com.pj.project.tb_district;
+
+import cn.hutool.core.util.StrUtil;
+import com.pj.api.dto.DistrictDTO;
+import com.pj.api.dto.DistrictInfoDTO;
+
+import com.pj.utils.sg.AjaxJson;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * Controller: tb_district -- 全国地区表
+ *
+ * @author qzyReal
+ */
+@RestController
+@RequestMapping("/TbDistrict/")
+public class TbDistrictController {
+
+    /**
+     * 底层 Service 对象
+     */
+    @Autowired
+    TbDistrictService tbDistrictService;
+
+
+    /**
+     * 查 - 根据id
+     */
+    @RequestMapping("getById")
+    public AjaxJson getById(Integer id) {
+        TbDistrict t = tbDistrictService.getById(id);
+        return AjaxJson.getSuccessData(t);
+    }
+
+    /**
+     * 获取树表格
+     * @return
+     */
+    @RequestMapping(value = "getTreeData")
+    public AjaxJson getTreeData() {
+        List<TbDistrict> list = tbDistrictService.getTreeData();
+        return AjaxJson.getSuccessData(list);
+    }
+
+    /**
+     * 远程调用
+     * @param ids
+     * @return List<DistrictDTO>
+     */
+    @RequestMapping(value = "rpc/getByIds")
+    public List<DistrictDTO> getByIds(String ids) {
+        List<TbDistrict> list = tbDistrictService.listByIds(StrUtil.splitTrim(ids,","));
+        List<DistrictDTO>districtDTOS=new ArrayList<>();
+        list.parallelStream().forEach(tbDistrict -> {
+            DistrictDTO districtDTO=new DistrictDTO();
+            BeanUtils.copyProperties(tbDistrict,districtDTO);
+            districtDTOS.add(districtDTO);
+        });
+        return districtDTOS;
+    }
+
+    /**
+     * 根据城市名称获取地区数据
+     * @param cityName
+     * @return
+     */
+  @RequestMapping(value = "rpc/findInfoByCityName")
+    public DistrictInfoDTO findByCityName(String cityName) {
+      return  tbDistrictService.findInfoByCityName(cityName);
+    }
+
+
+
+
+
+}

+ 55 - 0
sp-service/sp-admin/src/main/java/com/pj/project/tb_district/TbDistrictMapper.java

@@ -0,0 +1,55 @@
+package com.pj.project.tb_district;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pj.utils.so.SoMap;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * Mapper: tb_district -- 全国地区表
+ * @author qzyReal 
+ */
+
+@Mapper
+@Repository
+public interface TbDistrictMapper extends BaseMapper <TbDistrict> {
+
+	/**
+	 * 增  
+	 * @param t 实体对象 
+	 * @return 受影响行数 
+	 */
+	int add(TbDistrict t);
+
+	/**
+	 * 删  
+	 * @param id 要删除的数据id  
+	 * @return 受影响行数 
+	 */
+	int delete(Integer id);	 
+
+	/** 
+	 * 改  
+	 * @param t 实体对象 
+	 * @return 受影响行数 
+	 */
+	int update(TbDistrict t);
+
+	/** 
+	 * 查 - 根据id  
+	 * @param id 要查询的数据id 
+	 * @return 实体对象 
+	 */
+	TbDistrict getById(Integer id);	 
+
+	/**
+	 * 查集合 - 根据条件(参数为空时代表忽略指定条件)
+	 * @param so 参数集合 
+	 * @return 数据列表 
+	 */
+	List<TbDistrict> getList(SoMap so);
+
+
+}

+ 80 - 0
sp-service/sp-admin/src/main/java/com/pj/project/tb_district/TbDistrictMapper.xml

@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.pj.project.tb_district.TbDistrictMapper">
+
+	<!-- 增 [G] -->
+	<insert id="add">
+		insert into 
+		tb_district (id, pid, district, level) 
+		values (#{id}, #{pid}, #{district}, #{level}) 
+	</insert>
+
+	<!-- 删 -->
+	<delete id="delete">
+		delete from tb_district 
+		where id = #{id}
+	</delete>
+
+	<!-- 改 [G] -->
+	<update id="update">
+		update tb_district set
+		id = #{id}, 
+		pid = #{pid}, 
+		district = #{district}, 
+		level = #{level}
+		where id = #{id}
+	</update>
+
+
+	<!-- ================================== 查询相关 ================================== -->
+	<!-- select id, pid, district, level from tb_district  -->
+	
+	<!-- 通用映射:手动模式 -->
+	<resultMap id="model" type="com.pj.project.tb_district.TbDistrict">
+		<result property="id" column="id" />
+		<result property="pid" column="pid" />
+		<result property="district" column="district" />
+		<result property="level" column="level" />
+	</resultMap>
+	
+	<!-- 公共查询sql片段 -->
+	<sql id="select_sql">
+		select * 
+		from tb_district 
+	</sql>
+	
+	<!-- 查 - 根据id -->
+	<select id="getById" resultMap="model">
+		<include refid="select_sql"></include>
+		where id = #{id}
+	</select>
+	
+	<!-- 查集合 - 根据条件(参数为空时代表忽略指定条件) [G] -->
+	<select id="getList" resultMap="model">
+		<include refid="select_sql"></include>
+		<where>
+			<if test=' this.isNotNull("id") '> and id = #{id} </if>
+			<if test=' this.isNotNull("pid") '> and pid = #{pid} </if>
+			<if test=' this.isNotNull("district") '> and district = #{district} </if>
+			<if test=' this.isNotNull("level") '> and level = #{level} </if>
+		</where>
+		order by
+		<choose>
+			<when test='sortType == 1'> id desc </when>
+			<when test='sortType == 2'> pid desc </when>
+			<when test='sortType == 3'> district desc </when>
+			<when test='sortType == 4'> level desc </when>
+			<otherwise> id desc </otherwise>
+		</choose>
+	</select>
+	
+	
+	
+	
+	
+	
+	
+	
+	
+
+</mapper>

+ 149 - 0
sp-service/sp-admin/src/main/java/com/pj/project/tb_district/TbDistrictService.java

@@ -0,0 +1,149 @@
+package com.pj.project.tb_district;
+
+import cn.hutool.cache.CacheUtil;
+import cn.hutool.cache.impl.TimedCache;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.pj.api.dto.DistrictInfoDTO;
+import com.pj.utils.so.SoMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Service: tb_district -- 全国地区表
+ *
+ * @author qzyReal
+ */
+@Service
+public class TbDistrictService extends ServiceImpl<TbDistrictMapper, TbDistrict> implements IService<TbDistrict> {
+
+    /**
+     * 底层 Mapper 对象
+     */
+    @Autowired
+    TbDistrictMapper tbDistrictMapper;
+
+    /**
+     * 增
+     */
+    int add(TbDistrict t) {
+        return tbDistrictMapper.add(t);
+    }
+
+    /**
+     * 删
+     */
+    int delete(Integer id) {
+        return tbDistrictMapper.delete(id);
+    }
+
+    /**
+     * 改
+     */
+    int update(TbDistrict t) {
+        return tbDistrictMapper.update(t);
+    }
+
+    /**
+     * 查
+     */
+    TbDistrict getById(Integer id) {
+        return tbDistrictMapper.getById(id);
+    }
+
+    /**
+     * 查集合 - 根据条件(参数为空时代表忽略指定条件)
+     */
+    List<TbDistrict> getList(SoMap so) {
+        return tbDistrictMapper.getList(so);
+    }
+
+    /**
+     * 获取省份
+     *
+     * @return
+     */
+    public List<TbDistrict> GetListProvince() {
+        QueryWrapper<TbDistrict> ew = new QueryWrapper<>();
+        ew.eq("pid", 1);
+        return this.list(ew);
+    }
+
+    /**
+     * 根据父ID查询
+     *
+     * @param areaId
+     * @return
+     */
+    public List<TbDistrict> GetListCity(Long areaId) {
+        QueryWrapper<TbDistrict> ew = new QueryWrapper<>();
+        ew.eq("pid", areaId);
+        return this.list(ew);
+    }
+
+    /**
+     * 根据城市名称查询
+     *
+     * @param cityName 城市名
+     * @return
+     */
+    public TbDistrict findByCityName(String cityName) {
+        QueryWrapper<TbDistrict> ew = new QueryWrapper<>();
+        ew.lambda().eq(TbDistrict::getDistrict, cityName);
+        List<TbDistrict> list = list(ew);
+        return list.isEmpty() ? null : list.get(0);
+    }
+
+
+    TimedCache<String, List<TbDistrict>> timedCache = CacheUtil.newTimedCache(999999999);
+
+    public List<TbDistrict> getTreeData() {
+        List<TbDistrict> cacheList = timedCache.get("address");
+        if (cacheList != null && cacheList.size() > 0) {
+            return cacheList;
+        }
+        List<TbDistrict> list = this.GetListProvince();
+        list.forEach(tbDistrict -> {
+            List<TbDistrict> cityList = this.GetListCity(tbDistrict.getId());
+            tbDistrict.setChildren(cityList);
+            cityList.forEach(city -> {
+                List<TbDistrict> areaList = this.GetListCity(city.getId());
+                city.setChildren(areaList);
+            });
+        });
+        timedCache.put("address", list);
+        return list;
+    }
+
+    public DistrictInfoDTO findInfoByCityName(String cityName) {
+        TbDistrict tbDistrict = findByCityName(cityName);
+        if (tbDistrict == null) {
+            return null;
+        }
+        Long pid = tbDistrict.getPid();
+        TbDistrict parent = getById(pid);
+        List<Long> ids = new ArrayList<>();
+        ids.add(tbDistrict.getId());
+        StringBuilder name = new StringBuilder(cityName);
+        if (parent != null) {
+            ids.add(parent.getId());
+            name.insert(0, parent.getDistrict());
+            TbDistrict top = getById(parent.getPid());
+            if (top != null) {
+                ids.add(top.getId());
+                name.insert(0, top.getDistrict());
+            }
+        }
+        Collections.reverse(ids);
+        DistrictInfoDTO districtInfoDTO = new DistrictInfoDTO();
+        districtInfoDTO.setPath(ids.stream().map(id -> id.toString()).collect(Collectors.joining(",")));
+        districtInfoDTO.setName(name.toString());
+        return districtInfoDTO;
+    }
+}

+ 4 - 0
sp-service/sp-admin/src/main/java/com/pj/project4sp/admin4login/SpAccAdminService.java

@@ -4,6 +4,7 @@ package com.pj.project4sp.admin4login;
 import java.util.Date;
 import java.util.List;
 
+import com.pj.current.dto.PCLoginUserInfo;
 import com.pj.current.satoken.StpUserUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -100,6 +101,9 @@ public class SpAccAdminService {
         map.put("per_list", per_list);
         map.put("tokenInfo", StpUtil.getTokenInfo());
         StpUserUtil.cachePerList(per_list);
+        PCLoginUserInfo info=new PCLoginUserInfo();
+        info.setLoginId(admin.getId()).setLoginName(admin.getName());
+        StpUserUtil.cachePcLoginInfo(info);
         return AjaxJson.getSuccessData(map);
     }