?方式一 通過調用接口(時間高達1s)
package cn.iocoder.yudao.module.supplier.utils;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;/**** 區域劃分代碼工具類 只需要傳 相應代碼值 就會返回 對應區域*/
public class AdministrativeRegionUtil {private static final String BASE_URL = "https://xingzhengquhua.bmcx.com/";public static String getAdministrativeRegionData(String regionCode) {regionCode = padRegionCode(regionCode);String urlString = BASE_URL + regionCode + "__xingzhengquhua/";StringBuilder result = new StringBuilder();try {URL url = new URL(urlString);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");int responseCode = conn.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) { // successBufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));String inputLine;while ((inputLine = in.readLine()) != null) {result.append(inputLine);}in.close();} else {System.out.println("GET request not worked");}} catch (Exception e) {e.printStackTrace();}return result.toString();}public static String padRegionCode(String regionCode) {if (regionCode == null) {throw new IllegalArgumentException("Region code cannot be null");}return String.format("%-12s", regionCode).replace(' ', '0');}public static String parseRegionData(String html) {Document doc = Jsoup.parse(html);Element h3Element = doc.selectFirst("td:contains(行政區劃代碼) h3");Element spanElement = doc.selectFirst("td:contains(行政區劃代碼) span");if (h3Element != null && spanElement != null) {String regionName = h3Element.text();String regionCode = spanElement.text();return "RegionName: " + regionName + ", RegionCode: " + regionCode;}return "Data not found";}public static String getAndParseRegionData(String regionCode) {String htmlData = getAdministrativeRegionData(regionCode);return parseRegionData(htmlData);}public static void main(String[] args) {String regionCode = "650000"; // Example region codeString parsedData = getAndParseRegionData(regionCode);System.out.println(parsedData);}
}
?運行之后代碼
方式二 通過讀文件 存入redis緩存中?
文件格式舉例? ?
推薦一個文本格式化網站?中英文自動加空格 - 小牛知識庫 (xnip.cn)
110000 北京市
110101 東城區
110102 西城區
110105 朝陽區
110106 豐臺區
110107 石景山區
110108 海淀區
110109 門頭溝區
110111 房山區
110112 通州區
110113 順義區
110114 昌平區
110115 大興區
代碼
配置類
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;@Configuration
public class RedisConfig {@Value("${spring.redis.host}")private String host;@Value("${spring.redis.port}")private int port;@Value("${spring.redis.database}")private int database;@Beanpublic RedisConnectionFactory redisConnectionFactory() {RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(host, port);config.setDatabase(database);return new LettuceConnectionFactory(config);}
}
讀取文件到redis的工具類
package cn.iocoder.yudao.module.supplier.utils;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;import org.springframework.data.redis.core.HashOperations;/**** 地區工具類 自動注入redis**/
@Component
@Slf4j
public class RedisDataLoader {private static final String FILE_PATH = "yudao-module-supplier/yudao-module-supplier-biz/src/main/java/cn/iocoder/yudao/module/supplier/utils/file/locateFile.txt"; // 替換為你的文件路徑private static final String CODE_TO_LOCATION_KEY = "LocationByCode"; // Redis Hash 的鍵private static final String LOCATION_TO_CODE_KEY = "CodeByLocation"; // Redis Hash 的鍵@Autowiredprivate RedisTemplate<String, String> redisTemplate;@PostConstructpublic void loadFileToRedis() {// 讀取文件行數,用于檢查是否擁有所有數據int expectedDataCount = countLines(FILE_PATH);// 查詢 Redis 中已有數據的數量long existingDataCount = redisTemplate.opsForHash().size(CODE_TO_LOCATION_KEY);// 如果 Redis 中數據不足預期數量,則繼續加載數據if (existingDataCount < expectedDataCount) {try (BufferedReader br = new BufferedReader(new FileReader(FILE_PATH))) {String line;HashOperations<String, String, String> codeToLocationHashOps = redisTemplate.opsForHash();HashOperations<String, String, String> locationToCodeHashOps = redisTemplate.opsForHash();int count = 0; // 計數器while ((line = br.readLine()) != null) {String[] parts = line.trim().split("\\s+", 2); // 使用空格字符分割,限制為兩部分if (parts.length == 2) {String code = parts[0].trim(); // 第一部分作為區域代碼String location = parts[1].trim(); // 第二部分作為地區名稱codeToLocationHashOps.put(CODE_TO_LOCATION_KEY, code, location);locationToCodeHashOps.put(LOCATION_TO_CODE_KEY, location, code);count++; // 每存儲一條數據,計數器加一}}log.info("存在地區數據{}條",count);} catch (IOException e) {e.printStackTrace();}} else {log.info("地區數據已緩存 無需加載");}}// 獲取文件行數,用于檢查是否擁有所有數據private int countLines(String filePath) {int count = 0;try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {while (reader.readLine() != null) count++;} catch (IOException e) {e.printStackTrace();}return count;}}
通過code碼獲取對應地點名稱 及相反? 工具類
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;@Component
public class LocationUtil {@Autowiredprivate RedisTemplate<String, String> redisTemplate;private static final String CODE_TO_LOCATION_KEY = "LocationByCode"; // Redis Hash 的鍵private static final String LOCATION_TO_CODE_KEY = "CodeByLocation"; // Redis Hash 的鍵// 獲取 code 對應的地區public String getLocationByCode(String code) {HashOperations<String, String, String> hashOps = redisTemplate.opsForHash();return hashOps.get(CODE_TO_LOCATION_KEY, code);}// 獲取地區對應的 codepublic String getCodeByLocation(String location) {HashOperations<String, String, String> hashOps = redisTemplate.opsForHash();return hashOps.get(LOCATION_TO_CODE_KEY, location);}
}
測試
@SpringBootTest
public class demo {@Resourceprivate LocationUtil locationUtil;@Testpublic void test1(){String location = locationUtil.getCodeByLocation("東城區");System.out.println(location);String locationByCode = locationUtil.getLocationByCode("710001");System.out.println(locationByCode);}
}
?