8.2 KiB
新增 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_keywordsVARCHAR(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" />參數
- ⚠️ 需新增:
程式工作規劃
階段一:資料庫與配置 (優先)
-
資料庫結構調整
- 在
followers資料表新增search_keywordsVARCHAR(MAX) 欄位 - 執行 SQL Script 更新結構
- 備份現有資料
- 在
-
Web.config 配置
- 新增
UseSearchKeywords參數 (預設值: true) - 建立靜態類別讀取此設定值
- 新增
階段二:核心功能實作
-
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 的轉換邏輯
- 新增
-
follower.cs Partial 擴充 (D:\dev\ez\17168erp\git_17888\web\App_Code\Model\Partial\follower.cs)
- 新增屬性
public string search_keywords { get; set; } - 新增靜態方法
UpdateSearchKeywords()
- 新增屬性
階段三:儲存功能調整
-
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
-
-
API 控制器調整
- FollowerController.cs: 調整 POST/PUT 方法
- appFollowerController.cs: 同步調整
階段四:搜尋功能實作
-
前端頁面 - index.aspx
- 在搜尋區塊新增「電話/證號」搜尋欄位
- 修改 Vue.js data 區塊,新增
search.phone_idcode欄位 - 修改
btn_search()方法傳送新參數
-
後端頁面 - 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)); }
- 修改
-
API 控制器搜尋功能
-
FollowerController.cs -
GetList()方法- 新增 phone_idcode 參數處理
- 如果 UseSearchKeywords = true,使用 HEX 搜尋
- 如果 UseSearchKeywords = false,返回錯誤或略過
-
appFollowerController.cs - 同步修改
-
階段五:資料遷移與測試
-
現有資料更新
- 撰寫 SQL Script 或後台工具
- 批次更新現有 followers 的 search_keywords 欄位
- 驗證資料完整性
-
測試計畫
- 單元測試: HEX 轉換正確性
- 整合測試: 新增/修改資料後 search_keywords 正確生成
- 功能測試: 搜尋功能正常運作
階段六:文件與部署
-
文件撰寫
- 更新 API 文件
- 撰寫使用者手冊
- 記錄資料庫變更
-
部署準備
- 準備 SQL 更新腳本
- 準備回滾計畫
- 通知相關人員
程式問題
技術實作問題
8. 欄位為 NULL 的處理
- 6題: phone, cellphone, id_code, passport 可能為 NULL
- 風險: 轉 HEX 時可能發生錯誤
- 建議:
- 在 GenerateSearchKeywords() 方法中妥善處理 NULL 值
- 使用
string.Join("|", new string[] { ... }.Where(s => !string.IsNullOrEmpty(s)))
建議的緩解措施優先順序
實作優先順序建議
高優先級 (必須處理)
- NULL 值處理: 確保程式不會因為 NULL 值崩潰
- 現有資料遷移: 確保資料完整性
- 錯誤處理: 完善的例外處理機制