Files
17168ERP/data/search_keyword.md

8.2 KiB
Raw Blame History

新增 followers 欄位 search_keywords

  • 參考程式 : D:\dev\ez\17168erp\git_17888\web\admin\follower\follower_code.aspx

        string joinedString = string.Join("|", new string[] { 
            phone_decrypted,     // 解密後的 phone 電話號碼
            cellphone_decrypted, // 解密後的 cellphone 手機號碼
            id_code_decrypted,   // 解密後的 id_code 身份證號
            passport_decrypted   // 解密後的 passport 護照號碼
        });
        // 將連接字串轉換為 HEX
        string hexString = "";
        try {
            byte[] bytes = Encoding.UTF8.GetBytes(joinedString);
            hexString = BitConverter.ToString(bytes).Replace("-", "").ToLower();
        } catch {
            hexString = "";
        }    
    
  • 原本table: followers 有4個欄位 phone, cellphone, id_code, passport

  • 是加密儲存, 但因部份用戶認為方便比加密重要, 所以折衷加上欄位: search_keywords, 如上方式"編碼", 而非加密。

  • 為保持原程式安全性, 本功能應為: 輔助, 選用, 不使用此機制, 就保持安全性優先。使用了, 就放棄加密。

  • 為保彈性, 在web.config加一個參數: use search keywords, 為true/false, 目前設true, 並讀入為static class property。

  • 相關機制運作, 都只有在該值為true時作用。

應作用機制:

針對以下程式, 若web.config use search keywords為true:

D:\dev\ez\17168erp\git_17888\web\App_Code\api\FollowerController.cs
D:\dev\ez\17168erp\git_17888\web\admin\follower\index.aspx
D:\dev\ez\17168erp\git_17888\web\admin\follower\index.aspx.cs
D:\dev\ez\17168erp\git_17888\web\admin\follower\reg.aspx
D:\dev\ez\17168erp\git_17888\web\admin\follower\reg.aspx.cs
D:\dev\ez\17168erp\git_17888\web\App_Code\Model\Partial\follower.cs
D:\dev\ez\17168erp\git_17888\web\App_Code\api\FollowerController.cs
D:\dev\ez\17168erp\git_17888\web\App_Code\appapi\appFollowerController.cs
  • 搜尋時, 加上一個: 電話/證號 搜尋欄位, 將輸入的字串轉為HEX做 search_keywords like '%...%' 搜尋
  • 儲存時, 除了原來欄位加密照原方式運行, 另外將4個欄位解密/組合/轉為HEX字串, 存入search_keywords

現有程式檢查

1. 資料庫檢查

  • followers 資料表
    • 已有加密欄位: phone, cellphone, id_code, passport
    • ⚠️ 需新增: search_keywords VARCHAR(MAX) 欄位 (用於存放 HEX 編碼字串)

2. 加密解密機制檢查

  • MyWeb.encrypt 類別 (App_Code/encrypt.cs)
    • 已有加密方法: EncryptAutoKey()
    • 已有解密方法: DecryptAutoKey()
    • 已有 followerHash() 方法 (可參考其 HEX 轉換邏輯)

3. 現有程式搜尋功能

3.1 API 控制器 - FollowerController.cs

  • 路徑: D:\dev\ez\17168erp\git_17888\web\App_Code\api\FollowerController.cs
  • 現況:
    • GetList() 方法有搜尋功能
    • 使用 Contains() 搜尋 f_number, u_name, address 等欄位
    • ⚠️ 無加密欄位搜尋: phone, cellphone, id_code, passport 欄位無法直接搜尋

3.2 API 控制器 - appFollowerController.cs

  • 路徑: D:\dev\ez\17168erp\git_17888\web\App_Code\appapi\appFollowerController.cs
  • 現況: 與 FollowerController.cs 類似
    • ⚠️ 同樣無加密欄位搜尋功能

3.3 前端頁面 - index.aspx

  • 路徑: D:\dev\ez\17168erp\git_17888\web\admin\follower\index.aspx
  • 現況:
    • 搜尋欄位: 信眾編號、信眾姓名、地址、生日、國籍
    • ⚠️ 缺少: 電話/證號 搜尋欄位

3.4 後端頁面 - index.aspx.cs

  • 路徑: D:\dev\ez\17168erp\git_17888\web\admin\follower\index.aspx.cs
  • 現況:
    • searchData() 方法處理搜尋條件
    • ⚠️ 無加密欄位搜尋邏輯

4. 儲存功能檢查

4.1 註冊頁面 - reg.aspx.cs

  • 路徑: D:\dev\ez\17168erp\git_17888\web\admin\follower\reg.aspx.cs
  • 現況:
    • add_Click() 新增方法: 有使用 EncryptAutoKey() 加密
    • edit_Click() 修改方法: 有使用 EncryptAutoKey() 加密
    • ⚠️ 缺少: 儲存時需要生成 search_keywords

4.2 Model Partial 類別 - follower.cs

  • 路徑: D:\dev\ez\17168erp\git_17888\web\App_Code\Model\Partial\follower.cs
  • 現況:
    • 有各種輔助方法
    • ⚠️ 建議新增: 生成 search_keywords 的輔助方法

5. Web.config 檢查

  • 路徑: D:\dev\ez\17168erp\git_17888\web\web.config
  • 現況:
    • ⚠️ 需新增: <add key="UseSearchKeywords" value="true" /> 參數

程式工作規劃

階段一:資料庫與配置 (優先)

  1. 資料庫結構調整

    • followers 資料表新增 search_keywords VARCHAR(MAX) 欄位
    • 執行 SQL Script 更新結構
    • 備份現有資料
  2. Web.config 配置

    • 新增 UseSearchKeywords 參數 (預設值: true)
    • 建立靜態類別讀取此設定值

階段二:核心功能實作

  1. encrypt.cs 擴充 (D:\dev\ez\17168erp\git_17888\web\App_Code\encrypt.cs)

    • 新增 GenerateSearchKeywords() 方法
      // 輸入: phone, cellphone, id_code, passport (加密字串)
      // 輸出: HEX 編碼的搜尋關鍵字
      public string GenerateSearchKeywords(string phone, string cellphone, 
                                           string id_code, string passport)
      
    • 參考現有 follower_code.aspx 的轉換邏輯
  2. follower.cs Partial 擴充 (D:\dev\ez\17168erp\git_17888\web\App_Code\Model\Partial\follower.cs)

    • 新增屬性 public string search_keywords { get; set; }
    • 新增靜態方法 UpdateSearchKeywords()

階段三:儲存功能調整

  1. reg.aspx.cs 修改 (D:\dev\ez\17168erp\git_17888\web\admin\follower\reg.aspx.cs)

    • 修改 add_Click() 方法

      • 新增資料後,如果 UseSearchKeywords = true
      • 將 phone, cellphone, id_code, passport 解密
      • 調用 GenerateSearchKeywords() 生成 HEX
      • 更新 search_keywords 欄位
    • 修改 edit_Click() 方法

      • 同上述邏輯更新 search_keywords
  2. API 控制器調整

    • FollowerController.cs: 調整 POST/PUT 方法
    • appFollowerController.cs: 同步調整

階段四:搜尋功能實作

  1. 前端頁面 - index.aspx

    • 在搜尋區塊新增「電話/證號」搜尋欄位
    • 修改 Vue.js data 區塊,新增 search.phone_idcode 欄位
    • 修改 btn_search() 方法傳送新參數
  2. 後端頁面 - index.aspx.cs

    • 修改 searchData() 方法
    • 新增電話/證號搜尋邏輯
      if (!isStrNull(s_phone_idcode.Value) && UseSearchKeywords)
      {
          string hexSearch = ConvertToHex(s_phone_idcode.Value.Trim());
          qry = qry.Where(o => o.search_keywords.Contains(hexSearch));
      }
      
  3. API 控制器搜尋功能

    • FollowerController.cs - GetList() 方法

      • 新增 phone_idcode 參數處理
      • 如果 UseSearchKeywords = true使用 HEX 搜尋
      • 如果 UseSearchKeywords = false返回錯誤或略過
    • appFollowerController.cs - 同步修改

階段五:資料遷移與測試

  1. 現有資料更新

    • 撰寫 SQL Script 或後台工具
    • 批次更新現有 followers 的 search_keywords 欄位
    • 驗證資料完整性
  2. 測試計畫

    • 單元測試: HEX 轉換正確性
    • 整合測試: 新增/修改資料後 search_keywords 正確生成
    • 功能測試: 搜尋功能正常運作

階段六:文件與部署

  1. 文件撰寫

    • 更新 API 文件
    • 撰寫使用者手冊
    • 記錄資料庫變更
  2. 部署準備

    • 準備 SQL 更新腳本
    • 準備回滾計畫
    • 通知相關人員

程式問題

技術實作問題

8. 欄位為 NULL 的處理

  • 6題: phone, cellphone, id_code, passport 可能為 NULL
  • 風險: 轉 HEX 時可能發生錯誤
  • 建議:
    • 在 GenerateSearchKeywords() 方法中妥善處理 NULL 值
    • 使用 string.Join("|", new string[] { ... }.Where(s => !string.IsNullOrEmpty(s)))

建議的緩解措施優先順序

實作優先順序建議

高優先級 (必須處理)

  1. NULL 值處理: 確保程式不會因為 NULL 值崩潰
  2. 現有資料遷移: 確保資料完整性
  3. 錯誤處理: 完善的例外處理機制