python3.10.6+flask+sqlite開發一個越南留學中國網站的流程與文件組織結構說明

????????采用python3.10.6+flask+sqlite技術棧,開發一個越南留學中國網站(vietnam-study-in-china)。開發流程與文件組織結構說明

一、項目概述與規劃

(一)項目背景與意義

  1. 留學趨勢分析
    近年來,中越兩國教育交流日益頻繁,越南學生赴華留學人數逐年增長。據教育部統計,2023 年越南在華留學生數量突破 5 萬人,涵蓋基礎教育、高等教育、語言培訓等多個領域。然而,當前針對越南學生的赴華留學信息平臺存在信息分散、語言不通、流程不透明等問題,導致越南學生獲取準確留學信息的成本較高。

  2. 項目價值
    本項目 “vietnam-study-in-china”(越南留學中國網)旨在搭建一個集信息查詢、院校展示、申請指導、在線咨詢于一體的綜合性平臺,通過中越雙語服務消除語言障礙,整合中國高校資源與留學政策,為越南學生提供 “一站式” 赴華留學解決方案,同時助力中國高校拓展越南招生市場。

  3. 項目目標

    • 打造越南學生赴華留學的核心信息樞紐,覆蓋 80% 以上越南赴華留學生的信息查詢需求;
    • 接入至少 200 所中國高校的招生信息,實現院校專業、錄取要求、獎學金政策等信息的實時更新;
    • 提供智能化申請流程指導,將越南學生的留學申請材料準備時間縮短 50%;
    • 建立中越雙語在線咨詢系統,響應時間不超過 24 小時。

(二)技術棧選型分析

  1. 核心技術棧確定
    本項目采用 “Python 3.10.6 + Flask + SQLite” 技術棧,選擇依據如下:

    • Python 3.10.6:作為主流編程語言,具備語法簡潔、生態豐富的特點,3.10.6 版本支持結構化模式匹配(match-case)、更優的錯誤提示等特性,提升開發效率;
    • Flask輕量級 Web 框架,靈活性高,適合中小型項目快速開發,其模塊化設計便于功能擴展,且擁有豐富的擴展庫(如 Flask-SQLAlchemy、Flask-Login 等);
    • SQLite嵌入式關系型數據庫,無需獨立服務器,適合初期數據量較小的場景,且與 Python 兼容性極佳,后期可平滑遷移至 MySQL 或 PostgreSQL。
  2. 輔助技術與工具

    • 前端技術:HTML5、CSS3、JavaScript(ES6+)、Bootstrap 5(響應式框架)、jQuery(簡化 DOM 操作);
    • 模板引擎Jinja2(Flask 默認模板引擎,支持模板繼承、變量替換、條件判斷等);
    • ORM 工具Flask-SQLAlchemy(簡化數據庫操作,實現對象與關系的映射);
    • 認證授權:Flask-Login(用戶會話管理)、Flask-WTF(表單處理與驗證);
    • 部署工具:Waitress(Windows 環境下的 WSGI 服務器)、Gunicorn(Linux 環境備選);
    • 開發工具:PyCharm(IDE)、Git(版本控制)、Postman(API 測試)、SQLiteStudio(數據庫管理)。

(三)開發團隊與分工

  1. 團隊架構(5 人團隊)

    • 項目經理(1 人):負責項目整體規劃、進度管理、需求對接;
    • 后端開發工程師(2 人):負責 Flask 框架搭建、數據庫設計、API 開發、業務邏輯實現;
    • 前端開發工程師(1 人):負責頁面設計、響應式布局、交互功能開發;
    • 測試與運維工程師(1 人):負責系統測試、部署配置、服務器維護。
  2. 職責分工明細

    • 項目經理:制定里程碑計劃(如需求分析完成、原型設計完成、Alpha 版本發布等),每周組織進度評審會,協調跨部門資源;
    • 后端工程師 A:負責用戶模塊(注冊、登錄、權限管理)、數據庫模型設計;
    • 后端工程師 B:負責院校模塊、資訊模塊、申請流程模塊的開發;
    • 前端工程師:根據 UI 設計稿實現頁面,對接后端 API,優化用戶體驗;
    • 測試與運維工程師:編寫測試用例(單元測試、集成測試),搭建測試環境,部署生產環境并監控系統運行。

(四)項目時間規劃(總周期 12 周)

  1. 第一階段:需求分析與設計(2 周)

    • 第 1 周:完成用戶需求調研、需求文檔撰寫、競品分析;
    • 第 2 周:完成系統架構設計、數據庫設計、UI 原型設計。
  2. 第二階段:核心功能開發(6 周)

    • 第 3-4 周:搭建開發環境、實現用戶模塊與基礎框架;
    • 第 5-6 周:開發院校信息展示、搜索與篩選功能;
    • 第 7-8 周:開發留學資訊、申請指南、在線咨詢功能。
  3. 第三階段:測試與優化(2 周)

    • 第 9 周:單元測試、集成測試、功能測試,修復發現的 BUG;
    • 第 10 周:性能優化(頁面加載速度、數據庫查詢效率)、兼容性測試(多瀏覽器、多設備)。
  4. 第四階段:部署與上線(2 周)

    • 第 11 周:服務器環境配置、域名綁定、SSL 證書部署;
    • 第 12 周:數據初始化、灰度發布、上線后監控與問題修復。

二、需求分析

(一)用戶需求分析

  1. 目標用戶群體

    • 核心用戶:越南籍學生(15-30 歲),包括高中生(申請本科)、本科生(申請碩士)、在職人員(申請語言培訓或短期交流);
    • 次要用戶:中國高校招生辦工作人員、留學中介機構、越南學生家長。
  2. 用戶需求細分

    • 信息獲取需求:查詢中國高校名單、專業設置、錄取分數線、學費標準、獎學金政策、簽證流程等;
    • 交互需求:在線咨詢留學問題、下載申請材料模板、查看成功案例、與其他越南留學生交流;
    • 功能需求:中越雙語切換、院校對比、申請進度查詢、個性化推薦(根據成績、專業意向推薦院校)。
  3. 用戶場景示例

    • 場景 1:越南高中生 Nguyen 希望申請中國的計算機專業本科,通過網站查詢開設該專業的高校,篩選學費低于 5 萬元 / 年的院校,并下載申請表格;
    • 場景 2:中國某大學招生老師登錄后臺,發布 2024 年越南招生計劃,并回復學生的咨詢留言;
    • 場景 3:越南學生家長通過網站的 “家長指南” 板塊,了解學生在華生活注意事項及住宿安排。

(二)功能需求分析

  1. 前臺功能模塊

    • 首頁:輪播圖(展示熱門院校、留學政策)、快捷入口(院校查詢、申請指南、資訊動態)、數據統計(在華越南留學生人數、合作院校數量);
    • 院校庫:按地區(如北京、上海、廣東)、層次(本科、碩士、語言學校)、專業分類展示院校,支持關鍵詞搜索與篩選,院校詳情頁包含簡介、專業設置、招生要求、聯系方式;
    • 留學資訊:政策解讀(中國留學簽證政策、獎學金政策)、院校動態(招生通知、開放日信息)、留學攻略(申請流程、材料準備、生活指南),支持按時間、類別篩選;
    • 申請中心:申請流程指引、材料清單下載、在線咨詢入口、申請進度查詢(需登錄);
    • 用戶中心:注冊 / 登錄、個人信息管理、收藏的院校 / 資訊、咨詢記錄、消息通知。
  2. 后臺功能模塊

    • 用戶管理:查看用戶列表、審核用戶身份(如高校認證)、禁用違規賬號;
    • 內容管理:發布 / 編輯 / 刪除院校信息、資訊文章,上傳圖片與附件,管理評論與留言;
    • 數據統計:訪問量統計、用戶注冊量統計、熱門院校排名、咨詢問題分類統計;
    • 系統設置:網站基本信息配置(名稱、LOGO、聯系方式)、權限管理(分配管理員角色)、數據備份與恢復。
  3. 非功能需求

    • 性能:頁面加載時間≤3 秒,支持同時在線用戶≥500 人;
    • 安全性:用戶密碼加密存儲、敏感操作需二次驗證、防止 SQL 注入與 XSS 攻擊;
    • 易用性:界面簡潔直觀,中越雙語切換流暢,操作步驟不超過 3 步即可完成核心需求;
    • 可擴展性:預留 API 接口,便于后期對接高校招生系統、支付系統等第三方平臺。

(三)需求文檔輸出

  1. 需求規格說明書(SRS)
    包含項目概述、功能需求(用例圖 + 用例描述)、非功能需求、數據需求等,示例用例描述如下:

    • 用例名稱:查詢院校信息
    • 參與者:未登錄用戶、已登錄用戶
    • 前置條件:用戶訪問網站首頁
    • 基本流程:
      1. 用戶點擊 “院校庫” 入口;
      2. 系統展示院校篩選條件(地區、專業、層次);
      3. 用戶選擇篩選條件并提交;
      4. 系統顯示符合條件的院校列表;
      5. 用戶點擊某一院校,系統展示該院校詳情頁。
    • 異常流程:若篩選條件無匹配結果,系統提示 “未找到符合條件的院校,請調整篩選條件”。
  2. 原型設計(Axure RP 輸出)
    包括前臺頁面原型(首頁、院校列表頁、詳情頁、用戶中心等)和后臺頁面原型(管理員登錄頁、內容管理頁等),標注頁面元素、交互邏輯、跳轉關系。

  3. 數據字典
    定義核心數據實體及屬性,例如:

    • 實體 “用戶”:用戶 ID(主鍵)、用戶名、密碼(加密)、郵箱、國籍、身份類型(學生 / 高校 / 中介)、注冊時間、狀態(正常 / 禁用);
    • 實體 “院校”:院校 ID(主鍵)、名稱(中文 / 越南語)、地區、層次、簡介、聯系方式、合作狀態(已認證 / 待審核)。

三、系統設計

(一)架構設計

  1. 整體架構(三層架構)

    • 表現層:負責用戶交互與頁面展示,包括 HTML 頁面、CSS 樣式、JavaScript 腳本,通過 Jinja2 模板引擎與后端數據交互;
    • 業務邏輯層:處理核心業務邏輯,包括用戶認證、數據驗證、院校信息處理等,通過 Flask 視圖函數實現;
    • 數據訪問層:負責數據的存儲與讀取,通過 SQLAlchemy ORM 與 SQLite 數據庫交互,隱藏底層數據庫操作細節。
  2. 技術架構圖

    客戶端(瀏覽器)↓↑
    Web服務器(Waitress)↓↑
    Flask應用
    ├─ 藍圖(用戶模塊、院校模塊、資訊模塊等)
    ├─ 擴展(SQLAlchemy、Login、WTF等)
    └─ 業務邏輯處理↓↑
    SQLite數據庫
    
  3. 模塊間交互流程
    以 “用戶查詢院校信息” 為例:

    1. 用戶在瀏覽器輸入查詢條件并提交請求;
    2. 請求經 Web 服務器轉發至 Flask 應用的院校模塊藍圖;
    3. 業務邏輯層驗證請求參數,調用數據訪問層查詢符合條件的院校數據;
    4. 數據訪問層通過 SQLAlchemy 執行數據庫查詢,返回結果至業務邏輯層;
    5. 業務邏輯層將數據傳遞給表現層,Jinja2 模板渲染頁面并返回給用戶。

(二)接口設計

  1. 接口設計原則

    • 遵循 RESTful 規范,使用 HTTP 方法表示操作類型(GET 查詢、POST 創建、PUT 更新、DELETE 刪除);
    • 接口 URL 采用名詞復數形式(如/api/universities表示院校相關接口);
    • 統一返回格式,包含狀態碼(code)、消息(message)、數據(data),例如:
      {"code": 200,"message": "查詢成功","data": [{"id": 1, "name": "北京大學", ...}]
      }
      
  2. 核心 API 接口列表

    • 用戶模塊
      • POST /api/users/register:用戶注冊
      • POST /api/users/login:用戶登錄
      • GET /api/users/profile:獲取個人信息(需登錄)
    • 院校模塊
      • GET /api/universities:查詢院校列表(支持分頁、篩選)
      • GET /api/universities/{id}:獲取院校詳情
      • POST /api/universities/{id}/collect:收藏院校(需登錄)
    • 資訊模塊
      • GET /api/news:查詢資訊列表
      • GET /api/news/{id}:獲取資訊詳情
    • 咨詢模塊
      • POST /api/consultations:提交咨詢問題
      • GET /api/consultations/my:查詢個人咨詢記錄(需登錄)
  3. 接口權限控制

    • 公開接口:無需登錄即可訪問(如院校列表、資訊詳情);
    • 登錄接口:需驗證用戶身份(如個人信息、收藏功能);
    • 管理員接口:需管理員權限(如發布資訊、管理用戶),通過 Flask 的@admin_required裝飾器實現。

(三)安全設計

  1. 用戶認證與授權

    • 采用 Flask-Login 管理用戶會話,登錄狀態存儲在加密的 Cookie 中,有效期 7 天;
    • 密碼通過 Werkzeug 的generate_password_hash方法加密存儲(使用 SHA-256 算法,加鹽處理);
    • 基于角色的訪問控制(RBAC):普通用戶、高校用戶、管理員擁有不同操作權限,例如管理員可刪除任意內容,而普通用戶僅能管理自己的評論。
  2. 數據安全

    • 敏感數據(如用戶手機號、身份證號)在數據庫中加密存儲,解密密鑰通過環境變量管理;
    • 數據庫文件設置訪問權限,僅 Web 服務器進程可讀寫,防止未授權訪問;
    • 定期自動備份數據庫(每日凌晨 3 點),備份文件存儲在獨立目錄并加密。
  3. 防護措施

    • 防 SQL 注入:通過 SQLAlchemy ORM 的參數化查詢,避免直接拼接 SQL 語句
    • 防 XSS 攻擊:使用 Jinja2 模板自動轉義 HTML 特殊字符,對用戶輸入的富文本內容進行過濾
    • 防 CSRF 攻擊:通過 Flask-WTF 的 CSRF 令牌驗證,確保表單提交來自合法頁面
    • 限流措施:對登錄、注冊等接口設置頻率限制(如 1 分鐘內最多 5 次請求),防止暴力破解。

四、開發環境搭建

(一)本地開發環境搭建

  1. Python 3.10.6 安裝

    • 從 Python 官網(Python Release Python 3.10.6 | Python.org)下載對應操作系統的安裝包;
    • 安裝時勾選 “Add Python 3.10 to PATH”,確保命令行可直接調用pythonpip
    • 驗證安裝:打開命令行,執行python --version,顯示 “Python 3.10.6” 則安裝成功。
  2. 虛擬環境創建與激活

    • 進入項目目錄(如C:\projects\vietnam-study-in-china),執行以下命令創建虛擬環境
      python -m venv vsic-venv
      

    ? ? 進入項目目錄最快的方法,在資源管理器上直接寫上cmd(后面加空格),回車進入:

    ? ? ?創建虛擬環境:

    • 激活虛擬環境
      • Windows(CMD):vsic-venv\Scripts\activate
      • Windows(PowerShell):.\vsic-venv\Scripts\Activate.ps1
      • macOS/Linux:source vsic-venv/bin/activate
    • 激活后命令行前綴顯示(vsic-venv),表示當前處于虛擬環境中。
  3. 項目初始化與依賴安裝

    • 創建requirements.txt文件,列出項目依賴:
      Flask==2.2.3
      Flask-SQLAlchemy==3.0.3
      Flask-Login==0.6.2
      Flask-WTF==1.1.1
      Jinja2==3.1.2
      Werkzeug==2.2.3
      sqlite3==2.6.0
      waitress==2.1.2
      pytest==7.3.1
      

    ?? ?這一步,可以在本地開發完項目后,在通過命名pip freeze > requirements.txt,來自動導出項目所有依賴項,并保存到requirements.txt文件中。

    • 執行以下命令安裝依賴:

      當在服務器上部署項目時,可以通過requirements.txt文件安裝項目相關的依賴項。

      pip install -r requirements.txt
      
  4. 開發工具配置

    • 安裝 PyCharm 并打開項目,在 “File> Settings > Project: vietnam-study-in-china > Python Interpreter” 中選擇虛擬環境的 Python 解釋器(vsic-venv\Scripts\python.exe);
    • 配置 Git 倉庫:初始化倉庫(git init),創建.gitignore文件(忽略虛擬環境、日志文件、IDE 配置等):
      # 虛擬環境
      vsic-venv/
      # 日志
      logs/
      # 數據庫文件
      *.db
      # PyCharm配置
      .idea/
      # 環境變量
      .env
      

(二)服務器環境搭建(Windows Server)

? ? ? ? ? ? ? 這個地方,要補充說明:

? ? ?在本地開發有如上的項目,其中,app:項目代碼文件夾;instance:sqlite數據庫存放目錄;vsic-venv:項目虛擬環境目錄;run.py項目執行文件。

? ? ?在其他服務器部署項目時,只要執行兩步(創建和激活虛擬環境)即可運行項目,而不需要額外安裝依賴項,但是此時不能新增或是修改已有的依賴項。

? ? ?python -m venv vsic-venv

? ? ?vsic-venv\Scripts\activate

  1. 操作系統配置

    • 阿里云 ECS 實例選擇 Windows Server 2019 Datacenter 版本,配置至少 2 核 4GB 內存;可以看我的CSDN文章:阿里云ECS的windows server系統如何遠程桌面連接-CSDN博客
    • 關閉不必要的系統服務(如 Windows Search),優化性能;
    • 開啟遠程桌面服務,便于遠程管理(參考前文遠程連接配置)。
  2. Python 安裝與環境變量配置

    • 下載 Python 3.10.6 Windows 安裝包,在服務器上安裝,勾選 “Add Python to environment variables”;
    • 驗證安裝:遠程連接服務器,打開 CMD,執行python --version確認版本正確。
  3. Web 服務器配置(Waitress)

    • 由于 Windows 環境下不推薦使用 Flask 內置開發服務器(僅用于開發),采用 Waitress 作為生產環境 WSGI 服務器;
    • 安裝 Waitress:pip install waitress(建議在服務器的虛擬環境中安裝)。
  4. 數據庫配置

    • SQLite 無需獨立安裝,隨 Python 自帶,只需確保項目目錄有讀寫權限;
    • 為防止數據庫文件損壞,設置定期備份任務(通過 Windows 任務計劃程序實現)。
  5. 防火墻與端口配置

    • 開放 80 端口(HTTP)、443 端口(HTTPS)、5000 端口(Flask 應用);
    • 配置阿里云 ECS 安全組,允許公網訪問上述端口(參考前文安全組配置步驟)。

五、數據庫設計與實現

(一)數據庫模型設計

  1. ER 圖設計(核心實體關系)

    • 實體:用戶(User)、院校(University)、專業(Major)、資訊(News)、咨詢(Consultation)、收藏(Collection);
    • 關系:
      • 用戶與咨詢:一對多(一個用戶可提交多個咨詢);
      • 用戶與收藏:一對多(一個用戶可收藏多個院校);
      • 院校與專業:一對多(一個院校開設多個專業);
      • 院校與資訊:一對多(一個院校可發布多條資訊)。
  2. 核心數據表設計

    • users(用戶表)

      字段名類型約束說明
      idINTEGERPRIMARY KEY自增主鍵
      usernameVARCHAR(50)UNIQUE, NOT NULL用戶名(唯一)
      password_hashVARCHAR(256)NOT NULL加密存儲的密碼
      emailVARCHAR(100)UNIQUE, NOT NULL郵箱(唯一,用于登錄)
      fullnameVARCHAR(100)NOT NULL姓名(越南語 / 中文)
      nationalityVARCHAR(20)DEFAULT ' 越南'國籍
      roleVARCHAR(20)DEFAULT 'student'角色(student/university/admin)
      university_idINTEGERFOREIGN KEY關聯院校 ID(僅高校用戶)
      created_atDATETIMEDEFAULT CURRENT_TIMESTAMP注冊時間
      statusVARCHAR(10)DEFAULT 'active'狀態(active/disabled)
    • universities(院校表)

      字段名類型約束說明
      idINTEGERPRIMARY KEY自增主鍵
      name_cnVARCHAR(100)NOT NULL院校中文名稱
      name_vnVARCHAR(100)NOT NULL院校越南語名稱
      regionVARCHAR(50)NOT NULL所在地區(如北京)
      levelVARCHAR(20)NOT NULL層次(本科 / 碩士 / 語言學校)
      description_cnTEXT中文簡介
      description_vnTEXT越南語簡介
      websiteVARCHAR(200)官方網站
      contact_emailVARCHAR(100)聯系郵箱
      contact_phoneVARCHAR(20)聯系電話
      is_verifiedBOOLEANDEFAULT FALSE是否認證(審核通過)
      created_atDATETIMEDEFAULT CURRENT_TIMESTAMP創建時間
    • majors(專業表)

      字段名類型約束說明
      idINTEGERPRIMARY KEY自增主鍵
      university_idINTEGERFOREIGN KEY關聯院校 ID
      name_cnVARCHAR(100)NOT NULL專業中文名稱
      name_vnVARCHAR(100)NOT NULL專業越南語名稱
      degreeVARCHAR(20)NOT NULL學位(學士 / 碩士 / 博士)
      durationINTEGERNOT NULL學制(年)
      tuitionDECIMAL(10,2)NOT NULL學費(元 / 年)
      requirementsTEXT錄取要求
    • news(資訊表)

      字段名類型約束說明
      idINTEGERPRIMARY KEY自增主鍵
      title_cnVARCHAR(200)NOT NULL中文標題
      title_vnVARCHAR(200)NOT NULL越南語標題
      content_cnTEXTNOT NULL中文內容
      content_vnTEXTNOT NULL越南語內容
      categoryVARCHAR(50)NOT NULL類別(政策 / 院校動態 / 攻略)
      university_idINTEGERFOREIGN KEY關聯院校 ID(可選)
      author_idINTEGERFOREIGN KEY作者 ID(管理員 / 高校用戶)
      created_atDATETIMEDEFAULT CURRENT_TIMESTAMP發布時間
      is_publishedBOOLEANDEFAULT FALSE是否發布
    • consultations(咨詢表)

      字段名類型約束說明
      idINTEGERPRIMARY KEY自增主鍵
      user_idINTEGERFOREIGN KEY提問用戶 ID
      titleVARCHAR(200)NOT NULL咨詢標題
      contentTEXTNOT NULL咨詢內容
      languageVARCHAR(10)DEFAULT 'vn'語言(vn/zh)
      statusVARCHAR(20)DEFAULT 'pending'狀態(pending/answered/closed)
      reply_contentTEXT回復內容
      reply_user_idINTEGERFOREIGN KEY回復用戶 ID(管理員 / 高校)
      created_atDATETIMEDEFAULT CURRENT_TIMESTAMP提問時間
      replied_atDATETIME回復時間
    • collections(收藏表)

      字段名類型約束說明
      idINTEGERPRIMARY KEY自增主鍵
      user_idINTEGERFOREIGN KEY關聯用戶 ID
      university_idINTEGERFOREIGN KEY關聯院校 ID
      created_atDATETIMEDEFAULT CURRENT_TIMESTAMP收藏時間
      UNIQUE(user_id, university_id)防止重復收藏

(二)數據庫實現(SQLAlchemy ORM)

  1. 數據庫連接配置
    在 Flask 應用初始化文件(如app/__init__.py)中配置數據庫連接:

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    import os# 初始化Flask應用
    app = Flask(__name__, instance_relative_config=True)# 配置數據庫路徑(項目實例目錄下的vsic_db.sqlite)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(app.instance_path, 'vsic_db.sqlite')
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  # 禁用修改跟蹤,提升性能# 確保實例目錄存在
    try:os.makedirs(app.instance_path)
    except OSError:pass# 初始化SQLAlchemy
    db = SQLAlchemy(app)
    
  2. 模型類定義(app/models.py

    from datetime import datetime
    from flask_login import UserMixin
    from werkzeug.security import generate_password_hash, check_password_hash
    from app import db, login_managerclass User(UserMixin, db.Model):__tablename__ = 'users'id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(50), unique=True, nullable=False)password_hash = db.Column(db.String(256), nullable=False)email = db.Column(db.String(100), unique=True, nullable=False)fullname = db.Column(db.String(100), nullable=False)nationality = db.Column(db.String(20), default='越南')role = db.Column(db.String(20), default='student')  # student/university/adminuniversity_id = db.Column(db.Integer, db.ForeignKey('universities.id'), nullable=True)created_at = db.Column(db.DateTime, default=datetime.utcnow)status = db.Column(db.String(10), default='active')# 關系:用戶發布的咨詢consultations = db.relationship('Consultation', backref='user', lazy='dynamic')# 關系:用戶的收藏collections = db.relationship('Collection', backref='user', lazy='dynamic')def set_password(self, password):self.password_hash = generate_password_hash(password)def check_password(self, password):return check_password_hash(self.password_hash, password)# 其他模型類(University、Major、News、Consultation、Collection)按數據表結構定義...# 登錄管理器回調函數,用于加載用戶
    @login_manager.user_loader
    def load_user(user_id):return User.query.get(int(user_id))
    
  3. 數據庫初始化與遷移

    • 創建數據庫表:在app/__init__.py中添加創建表的代碼(僅首次執行):
      with app.app_context():db.create_all()  # 創建所有模型對應的表
      
    • 使用 Flask-Migrate 管理數據庫遷移(適用于后期 schema 變更):
      # 安裝Flask-Migrate
      pip install flask-migrate# 初始化遷移環境
      flask db init# 創建遷移腳本
      flask db migrate -m "Initial migration"# 應用遷移(創建表)
      flask db upgrade
      

六、前端架構設計與實現

(一)前端目錄結構

vietnam-study-in-china/
├── app/
│   ├── static/                # 靜態資源
│   │   ├── css/               # 樣式表
│   │   │   ├── base.css       # 基礎樣式
│   │   │   ├── home.css       # 首頁樣式
│   │   │   ├── university.css # 院校頁面樣式
│   │   │   └── admin.css      # 后臺樣式
│   │   ├── js/                # JavaScript腳本
│   │   │   ├── base.js        # 基礎腳本(如語言切換)
│   │   │   ├── search.js      # 搜索功能腳本
│   │   │   └── form.js        # 表單驗證腳本
│   │   ├── images/            # 圖片資源
│   │   │   ├── logo.png       # 網站LOGO
│   │   │   ├── universities/  # 院校圖片
│   │   │   └── banners/       # 輪播圖圖片
│   │   └── fonts/             # 字體文件(含越南語字體)
│   └── templates/             # 模板文件
│       ├── base/              # 基礎模板
│       │   ├── base.html      # 主模板(包含導航欄、頁腳)
│       │   ├── header.html    # 頁頭(導航欄)
│       │   └── footer.html    # 頁腳
│       ├── home/              # 首頁模板
│       │   └── index.html     # 首頁
│       ├── university/        # 院校模塊模板
│       │   ├── list.html      # 院校列表頁
│       │   └── detail.html    # 院校詳情頁
│       ├── news/              # 資訊模塊模板
│       │   ├── list.html      # 資訊列表頁
│       │   └── detail.html    # 資訊詳情頁
│       ├── user/              # 用戶模塊模板
│       │   ├── login.html     # 登錄頁
│       │   ├── register.html  # 注冊頁
│       │   └── profile.html   # 個人中心
│       ├── consultation/      # 咨詢模塊模板
│       │   ├── create.html    # 提交咨詢頁
│       │   └── list.html      # 咨詢記錄頁
│       └── admin/             # 后臺模板
│           ├── index.html     # 后臺首頁
│           ├── user_manage.html # 用戶管理頁
│           └── content_manage.html # 內容管理頁

(二)頁面設計與實現規范

  1. 基礎模板設計(base.html

    • 采用模板繼承機制,所有頁面繼承自base.html,減少代碼重復;
    • 包含語言切換按鈕(中 / 越語),通過 JavaScript 切換頁面文本;
    • 引入 Bootstrap 5 CSS 和 JS 文件,實現響應式布局:
      <!DOCTYPE html>
      <html lang="{{ current_language }}">
      <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>{% block title %}越南留學中國網{% endblock %}</title><!-- 引入Bootstrap --><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"><!-- 引入自定義CSS --><link rel="stylesheet" href="{{ url_for('static', filename='css/base.css') }}">{% block extra_css %}{% endblock %}
      </head>
      <body><!-- 頁頭 -->{% include 'base/header.html' %}<!-- 主內容區 --><main class="container py-4">{% block content %}{% endblock %}</main><!-- 頁腳 -->{% include 'base/footer.html' %}<!-- 引入jQuery和Bootstrap JS --><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script><!-- 引入語言切換腳本 --><script src="{{ url_for('static', filename='js/base.js') }}"></script>{% block extra_js %}{% endblock %}
      </body>
      </html>
      
  2. 響應式設計規范

    • 使用 Bootstrap 的網格系統(containerrowcol-*)實現多設備適配;
    • 移動端優先:默認樣式適配手機,通過@media (min-width: 768px)等媒體查詢適配平板和桌面端;
    • 導航欄在移動端自動折疊為漢堡菜單,通過 Bootstrap 的 Navbar 組件實現。
  3. 中越雙語實現

    • 在靜態文本中使用數據屬性存儲雙語內容,例如:
      <h1 data-zh="歡迎來到越南留學中國網" data-vn="Chào m?ng ??n v?i trang web Du h?c Trung Qu?c t? Vi?t Nam"></h1>
      
    • JavaScript 腳本根據用戶選擇的語言切換顯示內容:
      // base.js
      $(document).ready(function() {// 默認語言為越南語let currentLang = 'vn';// 語言切換按鈕點擊事件$('#lang-switch').click(function() {currentLang = currentLang === 'zh' ? 'vn' : 'zh';switchLanguage(currentLang);});// 切換語言函數function switchLanguage(lang) {$('[data-zh][data-vn]').each(function() {$(this).text($(this).data(lang));});// 更新頁面lang屬性$('html').attr('lang', lang);// 存儲用戶語言偏好到localStoragelocalStorage.setItem('preferredLanguage', lang);}// 加載用戶上次選擇的語言const savedLang = localStorage.getItem('preferredLanguage');if (savedLang) {switchLanguage(savedLang);}
      });
      

(三)核心頁面設計說明

  1. 首頁(home/index.html

    • 頂部輪播圖:展示 3-5 張熱門院校或留學政策宣傳圖,自動切換;
    • 快捷入口區:包含 “院校查詢”“申請指南”“最新資訊”“在線咨詢” 四個圖標按鈕,鏈接至對應頁面;
    • 熱門院校展示:以卡片形式展示 6 所認證院校,包含 LOGO、名稱、地區、簡介,點擊進入詳情頁;
    • 留學資訊推薦:展示 3 條最新資訊,包含標題、發布時間、摘要;
    • 數據統計區:使用 Chart.js 繪制越南在華留學生人數趨勢圖、熱門專業分布餅圖。
  2. 院校列表頁(university/list.html

    • 篩選區:包含地區下拉框(北京、上海、廣東等)、層次復選框(本科、碩士、語言學校)、專業搜索框,支持組合篩選;
    • 排序功能:支持按 “關注度”“學費(從低到高)”“成立時間” 排序;
    • 院校列表:以網格布局展示院校卡片,包含 LOGO、名稱(中越雙語)、地區、層次、學費范圍、認證狀態,卡片底部有 “查看詳情” 和 “收藏” 按鈕;
    • 分頁控件:底部顯示分頁導航,支持跳轉到指定頁碼,每頁顯示 12 條記錄。
  3. 院校詳情頁(university/detail.html

    • 院校頭部:展示院校 LOGO、名稱(中越雙語)、地區、層次、認證狀態,右上角有 “收藏” 按鈕(已登錄用戶可見);
    • 標簽頁導航:包含 “院校簡介”“專業設置”“招生要求”“聯系方式” 四個標簽頁,點擊切換內容;
    • 專業列表:在 “專業設置” 標簽頁中,以表格形式展示專業名稱、學位、學制、學費、錄取要求;
    • 相關資訊:底部展示該院校發布的最新資訊,最多 5 條;
    • 咨詢入口:提供 “向該校咨詢” 按鈕,點擊跳轉到咨詢提交頁(自動填充院校信息)。
  4. 用戶中心(user/profile.html

    • 個人信息區:展示用戶名、郵箱、姓名、國籍等基本信息,提供 “編輯” 按鈕;
    • 收藏管理:展示用戶收藏的院校列表,支持取消收藏;
    • 咨詢記錄:展示用戶提交的咨詢列表,包含標題、狀態(未回復 / 已回復)、提交時間,點擊可查看詳情及回復;
    • 消息通知:顯示系統消息(如收藏的院校有新資訊),未讀消息標紅提示。
  5. 后臺管理首頁(admin/index.html

    • 數據概覽:展示網站總訪問量、注冊用戶數、院校數量、資訊數量、咨詢數量的統計卡片;
    • 趨勢圖表:展示近 7 天用戶注冊量、資訊發布量、咨詢提交量的折線圖;
    • 待辦事項:顯示待審核的院校、待回復的咨詢、待發布的資訊數量,點擊可跳轉到對應管理頁;
    • 操作快捷入口:提供 “發布資訊”“審核院校”“回復咨詢” 的快速按鈕。

七、后端核心功能開發

(一)應用初始化與藍圖配置

  1. 應用入口文件(run.py

    from app import create_app# 創建Flask應用實例
    app = create_app()if __name__ == '__main__':# 開發環境使用內置服務器app.run(debug=True)# 生產環境使用Waitress(通過命令行啟動)#  waitress-serve --host 0.0.0.0 --port 5000 run:app
    
  2. 應用工廠函數(app/__init__.py

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    from flask_login import LoginManager
    from flask_wtf.csrf import CSRFProtect
    import os# 初始化擴展
    db = SQLAlchemy()
    login_manager = LoginManager()
    login_manager.login_view = 'user.login'  # 登錄頁面路由
    csrf = CSRFProtect()def create_app(test_config=None):# 創建并配置應用app = Flask(__name__, instance_relative_config=True)app.config.from_mapping(SECRET_KEY=os.environ.get('SECRET_KEY') or 'dev-key-for-development-only',SQLALCHEMY_DATABASE_URI='sqlite:///' + os.path.join(app.instance_path, 'vsic_db.sqlite'),SQLALCHEMY_TRACK_MODIFICATIONS=False,)if test_config is None:# 加載實例配置(如果存在)app.config.from_pyfile('config.py', silent=True)else:# 加載測試配置app.config.from_mapping(test_config)# 確保實例目錄存在try:os.makedirs(app.instance_path)except OSError:pass# 初始化擴展db.init_app(app)login_manager.init_app(app)csrf.init_app(app)# 注冊藍圖from app.blueprints import home, user, university, news, consultation, adminapp.register_blueprint(home.bp)app.register_blueprint(user.bp)app.register_blueprint(university.bp)app.register_blueprint(news.bp)app.register_blueprint(consultation.bp)app.register_blueprint(admin.bp)# 設置首頁路由app.add_url_rule('/', endpoint='index')return app
    
  3. 藍圖定義(以用戶模塊為例,app/blueprints/user.py

    from flask import Blueprint, render_template, redirect, url_for, request, flash
    from flask_login import login_user, logout_user, login_required, current_user
    from app.models import User
    from app import db
    from app.forms import LoginForm, RegistrationFormbp = Blueprint('user', __name__, url_prefix='/user')@bp.route('/login', methods=['GET', 'POST'])
    def login():if current_user.is_authenticated:return redirect(url_for('home.index'))form = LoginForm()if form.validate_on_submit():user = User.query.filter_by(email=form.email.data).first()if user is None or not user.check_password(form.password.data):flash('郵箱或密碼錯誤')return redirect(url_for('user.login'))if user.status != 'active':flash('賬號已被禁用,請聯系管理員')return redirect(url_for('user.login'))login_user(user, remember=form.remember_me.data)next_page = request.args.get('next')return redirect(next_page or url_for('home.index'))return render_template('user/login.html', form=form)@bp.route('/logout')
    @login_required
    def logout():logout_user()return redirect(url_for('home.index'))@bp.route('/register', methods=['GET', 'POST'])
    def register():if current_user.is_authenticated:return redirect(url_for('home.index'))form = RegistrationForm()if form.validate_on_submit():user = User(username=form.username.data,email=form.email.data,fullname=form.fullname.data,nationality=form.nationality.data,role='student')user.set_password(form.password.data)db.session.add(user)db.session.commit()flash('注冊成功,請登錄')return redirect(url_for('user.login'))return render_template('user/register.html', form=form)@bp.route('/profile')
    @login_required
    def profile():return render_template('user/profile.html', user=current_user)
    

(二)核心功能模塊開發

  1. 用戶模塊

    • 注冊與登錄:使用 Flask-WTF 處理表單驗證,Flask-Login 管理用戶會話;
    • 權限控制:通過@login_required裝飾器限制登錄后訪問,通過角色判斷(current_user.role)限制管理員功能;
    • 個人信息管理:支持用戶修改姓名、郵箱、密碼(需驗證舊密碼)。
  2. 院校模塊

    • 院校列表與篩選:接收前端傳遞的地區、專業等篩選參數,構建 SQL 查詢條件:
      @bp.route('/list')
      def list():# 獲取篩選參數region = request.args.get('region', '')level = request.args.get('level', '')major = request.args.get('major', '')# 構建查詢query = University.query.filter_by(is_verified=True)if region:query = query.filter(University.region == region)if level:query = query.filter(University.level == level)if major:# 關聯查詢包含該專業的院校query = query.join(Major).filter(Major.name_cn.like(f'%{major}%') | Major.name_vn.like(f'%{major}%'))# 分頁(每頁12條)page = request.args.get('page', 1, type=int)pagination = query.paginate(page=page, per_page=12)universities = pagination.itemsreturn render_template('university/list.html', universities=universities, pagination=pagination)
      
    • 院校收藏:登錄用戶可收藏院校,通過Collection模型記錄關聯關系,支持取消收藏。
  3. 資訊模塊

    • 資訊發布與管理:管理員和高校用戶可發布資訊(需填寫中越雙語內容),支持編輯、刪除、草稿保存;
    • 資訊分類與搜索:按類別(政策 / 院校動態 / 攻略)篩選,支持關鍵詞搜索(同時匹配標題和內容)。
  4. 咨詢模塊

    • 咨詢提交與回復:用戶可提交中 / 越語咨詢,管理員或對應院校用戶可回復,回復后通過郵件通知用戶;
    • 咨詢狀態跟蹤:顯示咨詢的狀態(未回復 / 已回復 / 已關閉),用戶可查看回復內容。
  5. 后臺管理模塊

    • 用戶管理:管理員可查看所有用戶列表,按角色篩選,禁用違規用戶;
    • 內容審核:審核院校認證申請(驗證院校資質)、資訊發布申請;
    • 數據統計:通過 SQL 查詢統計用戶增長、訪問量、熱門院校等數據,生成報表。

(三)表單處理與驗證

  1. 表單定義(app/forms.py

    from flask_wtf import FlaskForm
    from wtforms import StringField, PasswordField, BooleanField, SubmitField, TextAreaField, SelectField
    from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError
    from app.models import Userclass LoginForm(FlaskForm):email = StringField('郵箱', validators=[DataRequired(), Email()])password = PasswordField('密碼', validators=[DataRequired()])remember_me = BooleanField('記住我')submit = SubmitField('登錄')class RegistrationForm(FlaskForm):username = StringField('用戶名', validators=[DataRequired(), Length(min=4, max=50)])email = StringField('郵箱', validators=[DataRequired(), Email()])fullname = StringField('姓名', validators=[DataRequired(), Length(min=2, max=100)])nationality = StringField('國籍', validators=[DataRequired()], default='越南')password = PasswordField('密碼', validators=[DataRequired(), Length(min=6)])password2 = PasswordField('確認密碼', validators=[DataRequired(), EqualTo('password')])submit = SubmitField('注冊')def validate_email(self, email):user = User.query.filter_by(email=email.data).first()if user is not None:raise ValidationError('該郵箱已被注冊,請使用其他郵箱')def validate_username(self, username):user = User.query.filter_by(username=username.data).first()if user is not None:raise ValidationError('該用戶名已被使用,請選擇其他用戶名')# 其他表單(如咨詢表單、資訊發布表單)按類似方式定義...
    
  2. 表單渲染與提交
    在模板中渲染表單,并處理提交數據:

    <!-- user/login.html -->
    {% extends 'base/base.html' %}{% block title %}登錄 - 越南留學中國網{% endblock %}{% block content %}
    <div class="row justify-content-center"><div class="col-md-6"><h2 data-zh="用戶登錄" data-vn="??ng nh?p ng??i dùng"></h2><form method="post">{{ form.hidden_tag() }}  <!-- CSRF令牌 --><div class="mb-3">{{ form.email.label(data-zh="郵箱", data-vn="Email") }}{{ form.email(class="form-control") }}{% for error in form.email.errors %}<span class="text-danger">{{ error }}</span>{% endfor %}</div><div class="mb-3">{{ form.password.label(data-zh="密碼", data-vn="M?t kh?u") }}{{ form.password(class="form-control") }}{% for error in form.password.errors %}<span class="text-danger">{{ error }}</span>{% endfor %}</div><div class="mb-3 form-check">{{ form.remember_me(class="form-check-input") }}{{ form.remember_me.label(class="form-check-label", data-zh="記住我", data-vn="Ghi nh? t?i") }}</div>{{ form.submit(class="btn btn-primary", data-zh="登錄", data-vn="??ng nh?p") }}</form><p class="mt-3"><a href="{{ url_for('user.register') }}" data-zh="還沒有賬號?注冊" data-vn="Ch?a có tài kho?n? ??ng ky"></a></p></div>
    </div>
    {% endblock %}
    

八、系統集成與測試

(一)單元測試

  1. 測試環境配置
    創建tests目錄,編寫測試配置文件tests/conftest.py

    import pytest
    from app import create_app, db
    from app.models import User, University@pytest.fixture
    def app():# 使用內存數據庫進行測試app = create_app({'TESTING': True,'SQLALCHEMY_DATABASE_URI': 'sqlite:///:memory:'})# 創建測試數據with app.app_context():db.create_all()# 添加測試用戶user = User(username='testuser', email='test@example.com', fullname='測試用戶')user.set_password('testpassword')db.session.add(user)db.session.commit()yield app@pytest.fixture
    def client(app):return app.test_client()@pytest.fixture
    def runner(app):return app.test_cli_runner()
    
  2. 核心功能測試示例

    • 用戶登錄測試(tests/test_user.py):

    def test_login(client):

    訪問登錄頁

    response = client.get('/user/login')
    assert 200 == response.status_code

    提交正確的登錄信息

    response = client.post (
    '/user/login',
    data={'email': 'test@example.com', 'password': 'testpassword'},
    follow_redirects=True
    )
    assert 200 == response.status_code
    assert b' 測試用戶 ' in response.data # 登錄后顯示用戶名

    提交錯誤的密碼

    response = client.post (
    '/user/login',
    data={'email': 'test@example.com', 'password': 'wrongpassword'},
    follow_redirects=True
    )
    assert b' 郵箱或密碼錯誤 ' in response.data

    
    - 院校查詢測試(`tests/test_university.py`):  ```python
    def test_university_list(client, app):# 添加測試院校with app.app_context():from app.models import Universityuni = University(name_cn='測試大學',name_vn='Tr??ng ??i h?c ki?m tra',region='北京',level='本科',is_verified=True)db.session.add(uni)db.session.commit()# 訪問院校列表頁response = client.get('/university/list')assert 200 == response.status_codeassert b'測試大學' in response.data# 按地區篩選response = client.get('/university/list?region=北京')assert b'測試大學' in response.data# 按不存在的地區篩選response = client.get('/university/list?region=上海')assert b'測試大學' not in response.data
    

(二)集成測試

  1. 流程測試
    測試完整業務流程,如 “用戶注冊→登錄→收藏院校→查看收藏”:

    def test_user_collection_flow(client, app):# 注冊新用戶client.post('/user/register',data={'username': 'newuser','email': 'new@example.com','fullname': '新用戶','nationality': '越南','password': 'newpassword','password2': 'newpassword'},follow_redirects=True)# 登錄新用戶client.post('/user/login',data={'email': 'new@example.com', 'password': 'newpassword'},follow_redirects=True)# 添加測試院校with app.app_context():from app.models import Universityuni = University(name_cn='北京大學',name_vn='Tr??ng ??i h?c B?c Kinh',region='北京',level='本科',is_verified=True)db.session.add(uni)db.session.commit()uni_id = uni.id# 收藏院校response = client.get(f'/university/collect/{uni_id}', follow_redirects=True)assert b'收藏成功' in response.data# 查看個人收藏response = client.get('/user/profile#collections')assert 200 == response.status_codeassert b'北京大學' in response.data
    
  2. 接口測試
    使用 Postman 測試 API 接口,驗證返回格式和數據正確性:

    • 測試GET /api/universities接口:檢查返回的院校列表格式是否符合規范,分頁參數是否生效;
    • 測試POST /api/users/login接口:驗證正確的賬號密碼返回 200 狀態碼和用戶信息,錯誤信息返回 401 狀態碼。

(三)性能與兼容性測試

  1. 性能測試

    • 使用locust工具進行負載測試:模擬 100 個并發用戶訪問首頁、院校列表頁,測試響應時間(目標≤3 秒);
    • 數據庫查詢優化:對熱門查詢(如院校列表)添加索引,使用EXPLAIN ANALYZE分析查詢性能,確保查詢時間≤100ms。
  2. 兼容性測試

    • 瀏覽器兼容性:在 Chrome、Firefox、Safari、Edge 等主流瀏覽器中測試頁面顯示和功能,確保一致的用戶體驗;
    • 設備兼容性:使用瀏覽器開發者工具模擬手機(iPhone、Android)、平板設備,測試響應式布局是否正確。

九、部署與上線

(一)服務器配置

  1. 阿里云 ECS 實例配置

    • 實例規格:2 核 4GB 內存,40GB SSD 云盤;
    • 操作系統:Windows Server 2019 Datacenter;
    • 網絡:分配公網 IP,綁定彈性公網 IP(EIP),確保 IP 固定;
    • 安全組:開放 80 端口(HTTP)、443 端口(HTTPS)、5000 端口(Flask 應用)。
  2. 環境部署步驟

    • 遠程連接服務器(使用遠程桌面);
    • 安裝 Python 3.10.6,配置環境變量;
    • 創建項目目錄:C:\website\vietnam-study-in-china
    • 上傳項目文件至服務器(通過 FTP 或遠程桌面文件傳輸);
    • 創建并激活虛擬環境:
      cd C:\website\vietnam-study-in-china
      python -m venv vsic-venv
      vsic-venv\Scripts\activate
      
    • 安裝依賴:pip install -r requirements.txt
    • 初始化數據庫:
      set FLASK_APP=run.py
      flask db upgrade
      

(二)應用部署

  1. 使用 Waitress 啟動應用
    創建啟動腳本start_app.bat

    @echo off
    cd /d C:\website\vietnam-study-in-china
    vsic-venv\Scripts\activate
    waitress-serve --host 0.0.0.0 --port 5000 run:app
    
    ?

    雙擊運行腳本,驗證應用是否啟動(訪問http://127.0.0.1:5000)。

  2. 配置 Windows 服務(實現開機自啟)

    • 使用nssm工具將應用注冊為 Windows 服務:
      nssm install VietnamStudyInChina
      
    • 在彈出的窗口中設置:
      • Path:C:\website\vietnam-study-in-china\vsic-venv\Scripts\waitress-serve.exe
      • Arguments:--host 0.0.0.0 --port 5000 run:app
      • Working Directory:C:\website\vietnam-study-in-china
    • 啟動服務:nssm start VietnamStudyInChina
  3. 配置反向代理(IIS)

    • 安裝 IIS 及 URL 重寫模塊;
    • 創建網站,綁定域名(如www.vietnam-study-in-china.com);
    • 配置 URL 重寫,將請求轉發至 5000 端口:
      <!-- web.config -->
      <?xml version="1.0" encoding="UTF-8"?>
      <configuration><system.webServer><rewrite><rules><rule name="ReverseProxy" stopProcessing="true"><match url="(.*)" /><action type="Rewrite" url="http://localhost:5000/{R:1}" /></rule></rules></rewrite></system.webServer>
      </configuration>
      

(三)域名綁定與 SSL 配置

  1. 域名解析

    • 在域名注冊商控制臺添加 A 記錄,將域名指向服務器公網 IP;
    • 等待 DNS 生效(通常 10-30 分鐘),使用nslookup驗證解析是否正確。
  2. SSL 證書配置(HTTPS)

    • 在阿里云 SSL 證書服務申請免費 SSL 證書(Let's Encrypt);
    • 下載證書文件(包含.pem.key文件),上傳至服務器;
    • 在 IIS 中導入證書:服務器證書→導入→選擇證書文件;
    • 網站綁定添加 HTTPS 類型,選擇導入的證書,端口 443;
    • 配置 URL 重寫,強制跳轉 HTTPS:
      <rule name="HTTP to HTTPS" stopProcessing="true"><match url="(.*)" /><conditions><add input="{HTTPS}" pattern="off" /></conditions><action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
      </rule>
      

(四)上線前檢查清單

  1. 功能檢查

    • 驗證所有核心功能(注冊、登錄、院校查詢、資訊瀏覽、咨詢提交)是否正常;
    • 檢查中越雙語切換是否生效,文本是否正確顯示;
    • 測試用戶權限控制(如普通用戶無法訪問后臺)。
  2. 性能檢查

    • 使用瀏覽器開發者工具檢查頁面加載時間,確保≤3 秒;
    • 測試數據庫查詢性能,熱門頁面查詢時間≤100ms;
    • 驗證并發訪問(使用工具模擬 100 用戶)時系統是否穩定。
  3. 安全檢查

    • 確認密碼加密存儲,敏感數據傳輸使用 HTTPS;
    • 測試防 SQL 注入(在搜索框輸入特殊字符如' OR 1=1 --);
    • 檢查 CSRF 令牌是否生效(禁用 JavaScript 后提交表單)。
  4. 數據備份

    • 手動備份數據庫文件(vsic_db.sqlite)至獨立存儲;
    • 驗證備份文件可正常恢復(在測試環境恢復并檢查數據完整性)。

十、項目維護與迭代

(一)日常維護

  1. 服務器監控

    • 使用阿里云云監控:監控 CPU 使用率、內存占用、帶寬流量,設置閾值告警(如 CPU>80% 時短信通知);
    • 應用日志監控:配置 Flask 日志輸出至文件(logs/app.log),定期查看錯誤日志,及時修復 BUG。
  2. 數據備份

    • 自動備份:通過 Windows 任務計劃程序,每日凌晨 3 點執行數據庫備份腳本:
      @echo off
      set BACKUP_DIR=C:\backup\vsic
      set TIMESTAMP=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
      copy C:\website\vietnam-study-in-china\instance\vsic_db.sqlite %BACKUP_DIR%\vsic_db_%TIMESTAMP%.sqlite
      
    • 備份保留策略:保留最近 30 天的備份文件,自動刪除過期文件。
  3. 系統更新

    • 定期更新服務器操作系統補丁(通過 Windows Update);
    • 定期更新項目依賴包(pip list --outdated查看更新,pip upgrade更新),更新前需在測試環境驗證兼容性。

(二)問題修復與迭代

  1. BUG 修復流程

    • 收集 BUG:通過用戶反饋、日志監控發現問題;
    • 優先級分類:Critical(如登錄失敗)→ High(如頁面顯示異常)→ Medium(如排版問題)→ Low(如錯別字);
    • 修復與驗證:在開發環境修復,提交測試環境驗證,通過后部署至生產環境。
  2. 功能迭代計劃

    • 短期迭代(1-2 個月):
      • 增加留學費用計算器功能;
      • 優化搜索算法,支持越南語分詞搜索;
      • 接入微信支付,支持在線繳納申請費。
    • 中期迭代(3-6 個月):
      • 開發移動 APP(基于 Flutter),實現與網站數據同步;
      • 增加視頻面試功能,連接越南學生與中國高校;
      • 接入 AI 智能咨詢機器人,自動回復常見問題。
    • 長期迭代(1 年以上):
      • 擴展至其他東南亞國家(如老撾、柬埔寨);
      • 與中國教育部留學服務中心對接,實現學歷認證查詢。
  3. 性能優化

    • 數據庫優化:對大表(如資訊表)進行分區,添加合適的索引,定期清理冗余數據;
    • 緩存優化:使用 Redis 緩存熱門院校、資訊數據,減少數據庫查詢;
    • 前端優化:壓縮靜態資源(CSS/JS/ 圖片),使用 CDN 加速靜態資源分發。

十一、總結與展望

(一)項目總結

? ? ? ?本項目 “vietnam-study-in-china” 基于 Python 3.10.6、Flask、SQLite 技術棧,構建了一個面向越南學生的赴華留學信息平臺。通過需求分析、系統設計、開發實現、測試部署等階段,完成了用戶管理、院校展示、資訊發布、在線咨詢等核心功能,并通過阿里云 ECS 部署上線,實現了域名綁定與 HTTPS 訪問。

? ? ? ?項目開發過程中,重點解決了以下問題:

  • 中越雙語切換:通過前端數據屬性與 JavaScript 實現頁面文本動態切換;
  • 數據安全:采用密碼加密存儲、CSRF 防護、SQL 注入防護等措施;
  • 部署穩定性:使用 Waitress 作為生產服務器,配置 Windows 服務實現開機自啟;
  • 用戶體驗:通過響應式設計適配多設備,優化頁面加載速度。

(二)項目展望

? ? ? ?隨著中越教育交流的深入,越南留學中國網有望成為兩國教育合作的重要橋梁。未來可從以下方面進一步發展:

  1. 拓展服務范圍:除信息展示外,增加在線申請、簽證代辦、接機服務等增值服務;
  2. 深化技術應用:引入大數據分析用戶行為,提供個性化院校推薦;
  3. 加強合作生態:與中國高校、越南中學建立合作,提供招生代理、生源輸送服務;
  4. 國際化擴展:在越南設立本地化運營團隊,提升服務響應速度與本地化程度。

? ? ? ?通過持續迭代與優化,項目將為越南學生赴華留學提供更便捷、高效的服務,助力中越教育交流與合作邁向新高度。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92803.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92803.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92803.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uView Pro 正式開源!70+ Vue3 組件重構完成,uni-app 組件庫新晉之星

一、項目背景 uni-app 作為一款優秀的跨平臺框架&#xff0c;憑借其“一套代碼&#xff0c;多端運行”的理念&#xff0c;受到了廣大移動端開發者的青睞。 而在 uni-app 的生態中&#xff0c;uView UI 作為一款基于 Vue2 開發的開源組件庫&#xff0c;憑借其豐富的組件、完善…

Qwen3 技術報告 的 Strong-to-Weak Distillation 強到弱蒸餾 和 代碼實現

Qwen3 技術報告 的 Strong-to-Weak Distillation 強到弱蒸餾 和 代碼實現 flyfish 代碼在文末 技術報告就是不一定經過嚴格的學術期刊同行評審&#xff0c;但具有較強的專業性和實用性。 The post-training pipeline of Qwen3 is strategically designed with two core ob…

一體化步進伺服電機在無人機艙門應用中的應用案例

在無人機的設計過程中&#xff0c;艙門的快速、穩定開合對于無人機的任務執行效率和安全性至關重要。傳統的艙門驅動方式存在響應速度慢、控制精度不足等問題&#xff0c;難以滿足無人機復雜任務的需求。因此&#xff0c;某客戶無人機選擇了?一體化步進伺服電機?作為艙門的驅…

Ansible 面試題 20250811

1. 你使用過哪些 Ansible 模塊? Ansible 常用的模塊: file 、copy 、template 、yum 、apt 、service 、user 、group 、shell 、script 、command 、cron 等等。 這些模塊可以用來管理文件、軟件包、服務、用戶、組、計劃任務等等。 Docker相關模塊: docker_container:用…

安路Anlogic FPGA下載器的驅動安裝與測試教程

參考鏈接&#xff1a;安路下載器JTAG驅動安裝 - 米聯客(milianke) - 博客園 安路支持幾款下載器&#xff1a; AL-LINK在線下載器是基于上海安路信息科技股份科技有限公司全系列 CPLD/FPGA 器件&#xff0c;結合公司自研的 TD 軟件&#xff0c;可實現在線 JTAG 程序下載、Chip…

基于深度學習的股票分析和預測系統

摘要 【關鍵詞】 第一章 緒論 1.1 研究背景及意義 1.2 國內外文獻綜述 1.2.1 國外研究結果 1.2.2 國內研究結果 1.3 本課題主要工作 第二章 相關工作介紹 2.1文本量化方法 2.2 CNN、LSTM模型 2.3評測準確率及收益率 第三章 開發技術介紹 3.1 系統開發平臺 3.2平臺…

ML基礎設施(Machine Learning Infrastructure)

ML基礎設施&#xff08;Machine Learning Infrastructure&#xff09; 是指支持機器學習項目從開發到部署全生命周期所需的底層技術架構和工具集合。其核心目標是讓數據科學家和工程師能專注于模型創新&#xff0c;而非環境搭建等重復性工作。以下是深度解析&#xff1a;一、ML…

代碼隨想錄刷題Day29

逆波蘭表達式求值這是一道經典地使用棧來解決后綴表達式求解的題目。使用棧來求解后綴表達式的流程如下&#xff1a;借助棧的結構&#xff0c;可以求解出原始表達式是&#xff1a;9 &#xff08;-3 - 1&#xff09;* 3 10 / 2 2&#xff0c;在遵照規則過程中&#xff0c;還有…

crew AI筆記[3] - 設計理念

二八法則-task設計最重要80%精力設計tasks&#xff0c;20%精力定義agents花最多的實踐定義任務說明清晰定義輸入輸出增加示例和預期結果來約束輸出剩下的精力完善agent的role、goal、backstory1、Agent設計三要素role-goal-backstory框架Role - 職能定義足夠具體【作家 &#x…

【李宏毅-2024】第六講 大語言模型的訓練過程1——預訓練(Pre-training)

目錄概述1. 預訓練&#xff08;Pre-training&#xff09;2. 微調&#xff08;Fine-tuning&#xff0c;又稱 SFT&#xff0c;Supervised Fine-Tuning&#xff09;3. 對齊&#xff08;Alignment&#xff0c;又稱 RLHF 或 DPO 等&#xff09;4 三階段對比6 第一階段——自我學習&a…

基于LLVM的memcpy靜態分析工具:設計思路與原理解析(C/C++代碼實現)

在程序開發中&#xff0c;內存復制操作&#xff08;如memcpy&#xff09;往往是性能瓶頸的關鍵來源——尤其是大型內存塊的復制&#xff0c;可能導致緩存失效、帶寬占用過高等問題。為了精準定位這些潛在的性能熱點&#xff0c;開發者需要一種能自動識別程序中memcpy調用&#…

使用 Conda 安裝 xinference[all](詳細版)

1. 安裝 Miniconda&#xff08;若未安裝&#xff09; Miniconda 是 Anaconda 的輕量版&#xff0c;僅包含 Conda 和 Python&#xff0c;適合服務器環境。 下載并安裝 Miniconda 下載地址&#xff1a;Index of /miniconda &#xff0c;可以自行選擇適合的版本 # 下載最新版 …

服務器登上去,顯示 failed to send WATCHDOG 重啟有效嗎?

文章目錄 概要整體架構流程技術名詞解釋技術細節小結 概要 當你登錄服務器時&#xff0c;看到類似以下提示&#xff1a; failed to send WATCHDOG: Resource temporarily unavailable這通常和系統的 systemd 服務有關&#xff0c;尤其是那些啟用了 watchdog&#xff08;看門…

重學React(五):脫圍機制一

背景&#xff1a; 之前將React的基礎知識以及狀態管理相關的知識都過了一遍&#xff0c;查漏補缺的同時對React也有了一些新鮮的認知&#xff0c;接下來這個模塊的名字很有意思&#xff1a;脫圍機制&#xff0c;內容也比之前的部分難理解一些。但整體看下來&#xff0c;理解之后…

去除Edge微軟瀏覽器與Chrome谷歌瀏覽器頂部出現“此版本的Windows不再支持升級Windows 10”的煩人提示

前言 在 Windows 7 中&#xff0c;安裝 Microsoft Edge 109 版本后&#xff0c;啟動瀏覽器時會彈出提示&#xff1a; 此版本的 Windows 不再支持 Microsoft Edge。升級到 Windows 10 或更高版本&#xff0c;以獲取常規功能和安全更新。 同樣地&#xff0c;安裝 Google Chrome 1…

PWM、脈沖

要求&#xff1a;一、PWM輸出PWM波生成原理在此處使用TIM2生成PWM&#xff0c;PA1輸出PWM波。CNT小于CCR時&#xff0c;輸出高電平&#xff1b;CNT大于CCR時&#xff0c;輸出低電平。 輸入捕獲測量頻率的原理輸入捕獲的捕獲意思是它在PWM波上升沿或者下降沿的時候&#xff0c;會…

文件IO(1)

.文件IO1.概念標準IO是有緩存的IO&#xff0c;文件IO沒有緩存&#xff0c;適合于通信、硬件設備操作標準IO是庫函數&#xff0c;文件IO是系統調用2.系統調用與庫函數系統調用&#xff1a;是Linux內核中的代碼&#xff0c;只能在Linux系統中使用庫函數&#xff1a;是對系統調用的…

【AI】Pycharm中要注意Python程序文件的位置

博主試著在本地電腦用Pycharm環境運行隨便一個機器學習然后做圖像識別的模型&#xff0c;Python的程序一直報博主學習圖片的路徑不正確&#xff0c;博主查了好幾遍&#xff0c;也沒找出問題&#xff0c;后來借助Deepseek才知道&#xff0c;Python主程序的位置一定要在Project下…

TDengine 可觀測性最佳實踐

TDengine 介紹 TDengine 是一款開源、高性能、云原生的時序數據庫&#xff0c;專為物聯網、車聯網、工業互聯網、金融、IT 運維等場景優化設計。它不僅提供了高效的數據存儲和查詢功能&#xff0c;還帶有內建的緩存、流式計算、數據訂閱等系統功能&#xff0c;能大幅減少系統設…

Jenkins 搭建鴻蒙打包

1、創建流水線工程 選擇 Freestyle project 2、配置模板倉庫、憑證 配置倉庫地址 創建憑證&#xff0c;憑證選擇賬號-密碼&#xff08;能夠訪問該倉庫的個人或管理員 Gitlab 賬密&#xff09; 到這里執行構建&#xff0c;便可以克隆倉庫到工作目錄 3、安裝插件 3.1 Rebuild…