省市區 - 三級聯動通用化模塊組件

来源:http://www.cnblogs.com/leechenxiang/archive/2016/06/16/5591332.html
-Advertisement-
Play Games

都說我們要做模塊化設計,而不要做功能化設計 什麼是模塊化設計,就是可插拔性高,組件化,想要就用,不要用拉倒,直接刪除就行 什麼是功能化設計,就是一個簡單的功能,實現想要的效果,但是不夠通用化,別人要用的話需要讀懂你的代碼,還需要複製黏貼很多代碼這樣效率不高 今天寫了一個省市區三級聯動的模塊,寫完後使 ...


都說我們要做模塊化設計,而不要做功能化設計

什麼是模塊化設計,就是可插拔性高,組件化,想要就用,不要用拉倒,直接刪除就行

什麼是功能化設計,就是一個簡單的功能,實現想要的效果,但是不夠通用化,別人要用的話需要讀懂你的代碼,還需要複製黏貼很多代碼這樣效率不高

 

今天寫了一個省市區三級聯動的模塊,寫完後使用會非常方便,也很靈活

主要使用到的技術:jquery,redis,springMVC,MyBatis(springMVC和MyBatis無所謂,你用struts或者hibernate或者spring data都行)

首先頁面引入js

1 <script src="/js/jquery-2.2.4.min.js"></script>
2 <script src="/cityselect/js/jquery.cityselect.js"></script>

HTML中寫入3個div塊,這是互斥的,div#id不同就可以做到模塊化可插拔

 1 <div id="city"> 
 2         <select class="prov"></select>  
 3         <select class="city" disabled="disabled"></select> 
 4         <select class="dist" disabled="disabled"></select> 
 5     </div> 
 6     
 7     <div id="city2"> 
 8         <select class="prov"></select>  
 9         <select class="city" disabled="disabled"></select> 
10         <select class="dist" disabled="disabled"></select> 
11     </div> 
12     
13     <div id="city3"> 
14         <select class="prov"></select>  
15         <select class="city" disabled="disabled"></select> 
16         <select class="dist" disabled="disabled"></select> 
17     </div> 

初始化JS:

    <script type="text/javascript">
        /**
         * 
         * @Description: 省市區三級聯動api
         * Copyright: Copyright (c) 2016
         * 
         * ==============================
         * 參數說明
         * url:省市數據josn文件路徑
         * prov:預設省份
         * city:預設城市
         * dist:預設地區(縣)
         * nodata:無數據狀態
         * required:必選項
         * ==============================
         * 
         * @author leechenxiang
         * @date 2016年6月16日 下午3:46:58
         * @version V1.0
         */
        $(function(){
            $("#city").citySelect({
                prov:"江蘇省",
                city:"無錫市",
                dist:"南長區",
                required:false
            }); 
            
            $("#city2").citySelect({
                nodata:"none",
                required:false
            }); 
            
            $("#city3").citySelect({
                nodata:"none",
                required:false
            }); 
            
        });
    </script>

後臺controller:

 1 /**
 2      * 
 3      * @Description: 獲取所有的省市區列表
 4      * @return
 5      * @throws Exception
 6      * 
 7      * @author leechenxiang
 8      * @date 2016年6月16日 上午11:22:10
 9      */
10     @RequestMapping("/getCities")
11     @ResponseBody
12     public CitiesDataResult getCities() throws Exception {
13         CitiesDataResult areas = commonService.getAllCities();
14         return areas;
15     }

service:

 1 @Override
 2     public CitiesDataResult getAllCities() {
 3         // 取出緩存
 4         try {
 5             String citiesDataResult = jedisClient.get(REDIS_CITIES_KEY);
 6             if (!StringUtils.isBlank(citiesDataResult)) {
 7                 CitiesDataResult redisResult = JsonUtils.jsonToPojo(citiesDataResult, CitiesDataResult.class);
 8                 return redisResult;
 9             }
10         } catch (Exception e1) {
11             e1.printStackTrace();
12         }
13         
14         List<AreaProvince> provinceList = areaProvinceMapper.getProvinceList();
15         List<Province> pList = new ArrayList<Province>();
16         for (AreaProvince province : provinceList) {
17             int provinceId = province.getProvinceId();
18             String provinceName = province.getProvinceName();
19             
20             List<AreaCity> cityList = areaProvinceMapper.getCityListBypId(provinceId);
21             List<City> cList = new ArrayList<City>();
22             for (AreaCity city : cityList) {
23                 int cityId = city.getCityId();
24                 String cityName = city.getCityName();
25                 
26                 List<District> districtList = areaProvinceMapper.getDistrictListBycId(cityId);
27                 
28                 City c = new City();
29                 c.setN(cityName);
30                 c.setA(districtList);
31                 cList.add(c);
32             }
33             
34             Province p = new Province(provinceName, cList);
35             pList.add(p);
36         }
37         
38         CitiesDataResult result = new CitiesDataResult();
39         result.setCitylist(pList);
40         
41         // 放入緩存
42         try {
43             jedisClient.set(REDIS_CITIES_KEY, JsonUtils.objectToJson(result));
44         } catch (Exception e) {
45             e.printStackTrace();
46         }
47         
48         return result;
49     }

如果需要預設選中那麼只需要對這3個參數賦值即可:

prov:"江蘇省",
city:"無錫市",
dist:"南長區",

對於省市區的數據源,可以存放在資料庫表中,也可以直接存入js,作為一個json來調用即可

如果沒有省市區可以淘一下萬能的X寶,可以參考如下鏈接,真的是太強大了,把省市區直接細化到了極致:

省市區 資料庫 腳本 excel

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、設置父窗體: 如果要將某個窗體設置為父窗體,只需將該窗體的IsMdiContainer屬性設置為True即可。 2、設置子窗體: 通過設為某個窗體的MdiParent屬性來確定該窗體是那個窗體的子窗體。 語法如下: 3、排列MDI子窗體: 語法如下: value:是MdiLayout的枚舉值之一 ...
  • 問題:如下代碼 想獲取某兩個Decimal類型數之間的商的大小,結果偶爾出錯(請註意是 偶爾) Decima t1; Decima t2; int shang =Convert.ToInt32(t1 / t2) ; 解決方法:將Decimal類型數據強制轉換成INT整型時 會有四捨五入的過程。如下, ...
  • 本文參考Roslyn項目Issue:#206,及Docs:#patterns。 1. C# 7.0 新特性1: 基於Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 模式匹配也許能算的上C#本次更新最重量級的升級,也是最受關註的特性(也 ...
  • 參考鏈接:C 標準庫 - <string.h> string.h中主要有兩類函數: memxxx 和 strxxx,其中memxxx是針對記憶體操作的函數,在遇到'\0'的時候並不會停下來,而通常是設置一個size_t類型(其實是unsigned int)的參數來表示位元組大小; 而strxxx是針對字 ...
  • 安裝篇 第一步:配置防火牆(預設情況下,埠80和3306是拒絕訪問的,在防火牆上進行配置): vi /etc/sysconfig/iptables(在"COMMIT"的上一行加上如下兩句) -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 ...
  • 目錄 1 如何更新權值向量?2 最小均方法(LMS)與感知機:低效的民主3 最小二乘法:完美的民主4 支持向量機:現實的民主5 總結6 參考資料 1 如何更新權值向量? 在關於線性模型你可能還不知道的二三事(一、樣本)中我已提到如何由線性模型產生樣本,在此前提下,使用不同機器學習演算法來解決回歸問題的 ...
  • 1、下載php安裝包 http://cn2.php.net/get/php-5.5.36.tar.gz/from/this/mirror 預設情況下Nginx和PHP他倆之間是一點感覺沒有的。Apache+PHP編譯後生成的是模塊文件,而Nginx+PHP需要PHP生成可執行文件才可以,所以要利用f ...
  • 如何解決PHP中文亂碼問題 如何解決PHP中文亂碼問題 一、解決HTML中中文亂碼問題方法 1、在head標簽裡面加入UTF8編碼(國際化編碼):UTF-8是沒有國家的編碼,也就是獨立於任何一種語言,任何語言都可以使用的。 <meta http-equiv="Content-Type" conten ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...