????????采用python3.10.6+flask+sqlite技術棧,開發一個越南留學中國網站(vietnam-study-in-china)。開發流程與文件組織結構說明
一、項目概述與規劃
(一)項目背景與意義
-
留學趨勢分析
近年來,中越兩國教育交流日益頻繁,越南學生赴華留學人數逐年增長。據教育部統計,2023 年越南在華留學生數量突破 5 萬人,涵蓋基礎教育、高等教育、語言培訓等多個領域。然而,當前針對越南學生的赴華留學信息平臺存在信息分散、語言不通、流程不透明等問題,導致越南學生獲取準確留學信息的成本較高。 -
項目價值
本項目 “vietnam-study-in-china”(越南留學中國網)旨在搭建一個集信息查詢、院校展示、申請指導、在線咨詢于一體的綜合性平臺,通過中越雙語服務消除語言障礙,整合中國高校資源與留學政策,為越南學生提供 “一站式” 赴華留學解決方案,同時助力中國高校拓展越南招生市場。 -
項目目標
- 打造越南學生赴華留學的核心信息樞紐,覆蓋 80% 以上越南赴華留學生的信息查詢需求;
- 接入至少 200 所中國高校的招生信息,實現院校專業、錄取要求、獎學金政策等信息的實時更新;
- 提供智能化申請流程指導,將越南學生的留學申請材料準備時間縮短 50%;
- 建立中越雙語在線咨詢系統,響應時間不超過 24 小時。
(二)技術棧選型分析
-
核心技術棧確定
本項目采用 “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。
-
輔助技術與工具
- 前端技術: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(數據庫管理)。
(三)開發團隊與分工
-
團隊架構(5 人團隊)
- 項目經理(1 人):負責項目整體規劃、進度管理、需求對接;
- 后端開發工程師(2 人):負責 Flask 框架搭建、數據庫設計、API 開發、業務邏輯實現;
- 前端開發工程師(1 人):負責頁面設計、響應式布局、交互功能開發;
- 測試與運維工程師(1 人):負責系統測試、部署配置、服務器維護。
-
職責分工明細
- 項目經理:制定里程碑計劃(如需求分析完成、原型設計完成、Alpha 版本發布等),每周組織進度評審會,協調跨部門資源;
- 后端工程師 A:負責用戶模塊(注冊、登錄、權限管理)、數據庫模型設計;
- 后端工程師 B:負責院校模塊、資訊模塊、申請流程模塊的開發;
- 前端工程師:根據 UI 設計稿實現頁面,對接后端 API,優化用戶體驗;
- 測試與運維工程師:編寫測試用例(單元測試、集成測試),搭建測試環境,部署生產環境并監控系統運行。
(四)項目時間規劃(總周期 12 周)
-
第一階段:需求分析與設計(2 周)
- 第 1 周:完成用戶需求調研、需求文檔撰寫、競品分析;
- 第 2 周:完成系統架構設計、數據庫設計、UI 原型設計。
-
第二階段:核心功能開發(6 周)
- 第 3-4 周:搭建開發環境、實現用戶模塊與基礎框架;
- 第 5-6 周:開發院校信息展示、搜索與篩選功能;
- 第 7-8 周:開發留學資訊、申請指南、在線咨詢功能。
-
第三階段:測試與優化(2 周)
- 第 9 周:單元測試、集成測試、功能測試,修復發現的 BUG;
- 第 10 周:性能優化(頁面加載速度、數據庫查詢效率)、兼容性測試(多瀏覽器、多設備)。
-
第四階段:部署與上線(2 周)
- 第 11 周:服務器環境配置、域名綁定、SSL 證書部署;
- 第 12 周:數據初始化、灰度發布、上線后監控與問題修復。
二、需求分析
(一)用戶需求分析
-
目標用戶群體
- 核心用戶:越南籍學生(15-30 歲),包括高中生(申請本科)、本科生(申請碩士)、在職人員(申請語言培訓或短期交流);
- 次要用戶:中國高校招生辦工作人員、留學中介機構、越南學生家長。
-
用戶需求細分
- 信息獲取需求:查詢中國高校名單、專業設置、錄取分數線、學費標準、獎學金政策、簽證流程等;
- 交互需求:在線咨詢留學問題、下載申請材料模板、查看成功案例、與其他越南留學生交流;
- 功能需求:中越雙語切換、院校對比、申請進度查詢、個性化推薦(根據成績、專業意向推薦院校)。
-
用戶場景示例
- 場景 1:越南高中生 Nguyen 希望申請中國的計算機專業本科,通過網站查詢開設該專業的高校,篩選學費低于 5 萬元 / 年的院校,并下載申請表格;
- 場景 2:中國某大學招生老師登錄后臺,發布 2024 年越南招生計劃,并回復學生的咨詢留言;
- 場景 3:越南學生家長通過網站的 “家長指南” 板塊,了解學生在華生活注意事項及住宿安排。
(二)功能需求分析
-
前臺功能模塊
- 首頁:輪播圖(展示熱門院校、留學政策)、快捷入口(院校查詢、申請指南、資訊動態)、數據統計(在華越南留學生人數、合作院校數量);
- 院校庫:按地區(如北京、上海、廣東)、層次(本科、碩士、語言學校)、專業分類展示院校,支持關鍵詞搜索與篩選,院校詳情頁包含簡介、專業設置、招生要求、聯系方式;
- 留學資訊:政策解讀(中國留學簽證政策、獎學金政策)、院校動態(招生通知、開放日信息)、留學攻略(申請流程、材料準備、生活指南),支持按時間、類別篩選;
- 申請中心:申請流程指引、材料清單下載、在線咨詢入口、申請進度查詢(需登錄);
- 用戶中心:注冊 / 登錄、個人信息管理、收藏的院校 / 資訊、咨詢記錄、消息通知。
-
后臺功能模塊
- 用戶管理:查看用戶列表、審核用戶身份(如高校認證)、禁用違規賬號;
- 內容管理:發布 / 編輯 / 刪除院校信息、資訊文章,上傳圖片與附件,管理評論與留言;
- 數據統計:訪問量統計、用戶注冊量統計、熱門院校排名、咨詢問題分類統計;
- 系統設置:網站基本信息配置(名稱、LOGO、聯系方式)、權限管理(分配管理員角色)、數據備份與恢復。
-
非功能需求
- 性能:頁面加載時間≤3 秒,支持同時在線用戶≥500 人;
- 安全性:用戶密碼加密存儲、敏感操作需二次驗證、防止 SQL 注入與 XSS 攻擊;
- 易用性:界面簡潔直觀,中越雙語切換流暢,操作步驟不超過 3 步即可完成核心需求;
- 可擴展性:預留 API 接口,便于后期對接高校招生系統、支付系統等第三方平臺。
(三)需求文檔輸出
-
需求規格說明書(SRS)
包含項目概述、功能需求(用例圖 + 用例描述)、非功能需求、數據需求等,示例用例描述如下:- 用例名稱:查詢院校信息
- 參與者:未登錄用戶、已登錄用戶
- 前置條件:用戶訪問網站首頁
- 基本流程:
- 用戶點擊 “院校庫” 入口;
- 系統展示院校篩選條件(地區、專業、層次);
- 用戶選擇篩選條件并提交;
- 系統顯示符合條件的院校列表;
- 用戶點擊某一院校,系統展示該院校詳情頁。
- 異常流程:若篩選條件無匹配結果,系統提示 “未找到符合條件的院校,請調整篩選條件”。
-
原型設計(Axure RP 輸出)
包括前臺頁面原型(首頁、院校列表頁、詳情頁、用戶中心等)和后臺頁面原型(管理員登錄頁、內容管理頁等),標注頁面元素、交互邏輯、跳轉關系。 -
數據字典
定義核心數據實體及屬性,例如:- 實體 “用戶”:用戶 ID(主鍵)、用戶名、密碼(加密)、郵箱、國籍、身份類型(學生 / 高校 / 中介)、注冊時間、狀態(正常 / 禁用);
- 實體 “院校”:院校 ID(主鍵)、名稱(中文 / 越南語)、地區、層次、簡介、聯系方式、合作狀態(已認證 / 待審核)。
三、系統設計
(一)架構設計
-
整體架構(三層架構)
- 表現層:負責用戶交互與頁面展示,包括 HTML 頁面、CSS 樣式、JavaScript 腳本,通過 Jinja2 模板引擎與后端數據交互;
- 業務邏輯層:處理核心業務邏輯,包括用戶認證、數據驗證、院校信息處理等,通過 Flask 視圖函數實現;
- 數據訪問層:負責數據的存儲與讀取,通過 SQLAlchemy ORM 與 SQLite 數據庫交互,隱藏底層數據庫操作細節。
-
技術架構圖
客戶端(瀏覽器)↓↑ Web服務器(Waitress)↓↑ Flask應用 ├─ 藍圖(用戶模塊、院校模塊、資訊模塊等) ├─ 擴展(SQLAlchemy、Login、WTF等) └─ 業務邏輯處理↓↑ SQLite數據庫
-
模塊間交互流程
以 “用戶查詢院校信息” 為例:- 用戶在瀏覽器輸入查詢條件并提交請求;
- 請求經 Web 服務器轉發至 Flask 應用的院校模塊藍圖;
- 業務邏輯層驗證請求參數,調用數據訪問層查詢符合條件的院校數據;
- 數據訪問層通過 SQLAlchemy 執行數據庫查詢,返回結果至業務邏輯層;
- 業務邏輯層將數據傳遞給表現層,Jinja2 模板渲染頁面并返回給用戶。
(二)接口設計
-
接口設計原則
- 遵循 RESTful 規范,使用 HTTP 方法表示操作類型(GET 查詢、POST 創建、PUT 更新、DELETE 刪除);
- 接口 URL 采用名詞復數形式(如
/api/universities
表示院校相關接口); - 統一返回格式,包含狀態碼(code)、消息(message)、數據(data),例如:
{"code": 200,"message": "查詢成功","data": [{"id": 1, "name": "北京大學", ...}] }
-
核心 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
:查詢個人咨詢記錄(需登錄)
- 用戶模塊:
-
接口權限控制
- 公開接口:無需登錄即可訪問(如院校列表、資訊詳情);
- 登錄接口:需驗證用戶身份(如個人信息、收藏功能);
- 管理員接口:需管理員權限(如發布資訊、管理用戶),通過 Flask 的
@admin_required
裝飾器實現。
(三)安全設計
-
用戶認證與授權
- 采用 Flask-Login 管理用戶會話,登錄狀態存儲在加密的 Cookie 中,有效期 7 天;
- 密碼通過 Werkzeug 的
generate_password_hash
方法加密存儲(使用 SHA-256 算法,加鹽處理); - 基于角色的訪問控制(RBAC):普通用戶、高校用戶、管理員擁有不同操作權限,例如管理員可刪除任意內容,而普通用戶僅能管理自己的評論。
-
數據安全
- 敏感數據(如用戶手機號、身份證號)在數據庫中加密存儲,解密密鑰通過環境變量管理;
- 數據庫文件設置訪問權限,僅 Web 服務器進程可讀寫,防止未授權訪問;
- 定期自動備份數據庫(每日凌晨 3 點),備份文件存儲在獨立目錄并加密。
-
防護措施
- 防 SQL 注入:通過 SQLAlchemy ORM 的參數化查詢,避免直接拼接 SQL 語句;
- 防 XSS 攻擊:使用 Jinja2 模板自動轉義 HTML 特殊字符,對用戶輸入的富文本內容進行過濾;
- 防 CSRF 攻擊:通過 Flask-WTF 的 CSRF 令牌驗證,確保表單提交來自合法頁面;
- 限流措施:對登錄、注冊等接口設置頻率限制(如 1 分鐘內最多 5 次請求),防止暴力破解。
四、開發環境搭建
(一)本地開發環境搭建
-
Python 3.10.6 安裝
- 從 Python 官網(Python Release Python 3.10.6 | Python.org)下載對應操作系統的安裝包;
- 安裝時勾選 “Add Python 3.10 to PATH”,確保命令行可直接調用
python
和pip
; - 驗證安裝:打開命令行,執行
python --version
,顯示 “Python 3.10.6” 則安裝成功。
-
虛擬環境創建與激活
- 進入項目目錄(如
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
- Windows(CMD):
- 激活后命令行前綴顯示
(vsic-venv)
,表示當前處于虛擬環境中。
- 進入項目目錄(如
-
項目初始化與依賴安裝
- 創建
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
- 創建
-
開發工具配置
- 安裝 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
- 安裝 PyCharm 并打開項目,在 “File> Settings > Project: vietnam-study-in-china > Python Interpreter” 中選擇虛擬環境的 Python 解釋器(
(二)服務器環境搭建(Windows Server)
? ? ? ? ? ? ? 這個地方,要補充說明:
? ? ?在本地開發有如上的項目,其中,app:項目代碼文件夾;instance:sqlite數據庫存放目錄;vsic-venv:項目虛擬環境目錄;run.py項目執行文件。
? ? ?在其他服務器部署項目時,只要執行兩步(創建和激活虛擬環境)即可運行項目,而不需要額外安裝依賴項,但是此時不能新增或是修改已有的依賴項。
? ? ?python -m venv vsic-venv
? ? ?vsic-venv\Scripts\activate
-
操作系統配置
- 阿里云 ECS 實例選擇 Windows Server 2019 Datacenter 版本,配置至少 2 核 4GB 內存;可以看我的CSDN文章:阿里云ECS的windows server系統如何遠程桌面連接-CSDN博客
- 關閉不必要的系統服務(如 Windows Search),優化性能;
- 開啟遠程桌面服務,便于遠程管理(參考前文遠程連接配置)。
-
Python 安裝與環境變量配置
- 下載 Python 3.10.6 Windows 安裝包,在服務器上安裝,勾選 “Add Python to environment variables”;
- 驗證安裝:遠程連接服務器,打開 CMD,執行
python --version
確認版本正確。
-
Web 服務器配置(Waitress)
- 由于 Windows 環境下不推薦使用 Flask 內置開發服務器(僅用于開發),采用 Waitress 作為生產環境 WSGI 服務器;
- 安裝 Waitress:
pip install waitress
(建議在服務器的虛擬環境中安裝)。
-
數據庫配置
- SQLite 無需獨立安裝,隨 Python 自帶,只需確保項目目錄有讀寫權限;
- 為防止數據庫文件損壞,設置定期備份任務(通過 Windows 任務計劃程序實現)。
-
防火墻與端口配置
- 開放 80 端口(HTTP)、443 端口(HTTPS)、5000 端口(Flask 應用);
- 配置阿里云 ECS 安全組,允許公網訪問上述端口(參考前文安全組配置步驟)。
五、數據庫設計與實現
(一)數據庫模型設計
-
ER 圖設計(核心實體關系)
- 實體:用戶(User)、院校(University)、專業(Major)、資訊(News)、咨詢(Consultation)、收藏(Collection);
- 關系:
- 用戶與咨詢:一對多(一個用戶可提交多個咨詢);
- 用戶與收藏:一對多(一個用戶可收藏多個院校);
- 院校與專業:一對多(一個院校開設多個專業);
- 院校與資訊:一對多(一個院校可發布多條資訊)。
-
核心數據表設計
-
users(用戶表)
字段名 類型 約束 說明 id INTEGER PRIMARY KEY 自增主鍵 username VARCHAR(50) UNIQUE, NOT NULL 用戶名(唯一) password_hash VARCHAR(256) NOT NULL 加密存儲的密碼 email VARCHAR(100) UNIQUE, NOT NULL 郵箱(唯一,用于登錄) fullname VARCHAR(100) NOT NULL 姓名(越南語 / 中文) nationality VARCHAR(20) DEFAULT ' 越南' 國籍 role VARCHAR(20) DEFAULT 'student' 角色(student/university/admin) university_id INTEGER FOREIGN KEY 關聯院校 ID(僅高校用戶) created_at DATETIME DEFAULT CURRENT_TIMESTAMP 注冊時間 status VARCHAR(10) DEFAULT 'active' 狀態(active/disabled) -
universities(院校表)
字段名 類型 約束 說明 id INTEGER PRIMARY KEY 自增主鍵 name_cn VARCHAR(100) NOT NULL 院校中文名稱 name_vn VARCHAR(100) NOT NULL 院校越南語名稱 region VARCHAR(50) NOT NULL 所在地區(如北京) level VARCHAR(20) NOT NULL 層次(本科 / 碩士 / 語言學校) description_cn TEXT 中文簡介 description_vn TEXT 越南語簡介 website VARCHAR(200) 官方網站 contact_email VARCHAR(100) 聯系郵箱 contact_phone VARCHAR(20) 聯系電話 is_verified BOOLEAN DEFAULT FALSE 是否認證(審核通過) created_at DATETIME DEFAULT CURRENT_TIMESTAMP 創建時間 -
majors(專業表)
字段名 類型 約束 說明 id INTEGER PRIMARY KEY 自增主鍵 university_id INTEGER FOREIGN KEY 關聯院校 ID name_cn VARCHAR(100) NOT NULL 專業中文名稱 name_vn VARCHAR(100) NOT NULL 專業越南語名稱 degree VARCHAR(20) NOT NULL 學位(學士 / 碩士 / 博士) duration INTEGER NOT NULL 學制(年) tuition DECIMAL(10,2) NOT NULL 學費(元 / 年) requirements TEXT 錄取要求 -
news(資訊表)
字段名 類型 約束 說明 id INTEGER PRIMARY KEY 自增主鍵 title_cn VARCHAR(200) NOT NULL 中文標題 title_vn VARCHAR(200) NOT NULL 越南語標題 content_cn TEXT NOT NULL 中文內容 content_vn TEXT NOT NULL 越南語內容 category VARCHAR(50) NOT NULL 類別(政策 / 院校動態 / 攻略) university_id INTEGER FOREIGN KEY 關聯院校 ID(可選) author_id INTEGER FOREIGN KEY 作者 ID(管理員 / 高校用戶) created_at DATETIME DEFAULT CURRENT_TIMESTAMP 發布時間 is_published BOOLEAN DEFAULT FALSE 是否發布 -
consultations(咨詢表)
字段名 類型 約束 說明 id INTEGER PRIMARY KEY 自增主鍵 user_id INTEGER FOREIGN KEY 提問用戶 ID title VARCHAR(200) NOT NULL 咨詢標題 content TEXT NOT NULL 咨詢內容 language VARCHAR(10) DEFAULT 'vn' 語言(vn/zh) status VARCHAR(20) DEFAULT 'pending' 狀態(pending/answered/closed) reply_content TEXT 回復內容 reply_user_id INTEGER FOREIGN KEY 回復用戶 ID(管理員 / 高校) created_at DATETIME DEFAULT CURRENT_TIMESTAMP 提問時間 replied_at DATETIME 回復時間 -
collections(收藏表)
字段名 類型 約束 說明 id INTEGER PRIMARY KEY 自增主鍵 user_id INTEGER FOREIGN KEY 關聯用戶 ID university_id INTEGER FOREIGN KEY 關聯院校 ID created_at DATETIME DEFAULT CURRENT_TIMESTAMP 收藏時間 UNIQUE(user_id, university_id) 防止重復收藏
-
(二)數據庫實現(SQLAlchemy ORM)
-
數據庫連接配置
在 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)
-
模型類定義(
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))
-
數據庫初始化與遷移
- 創建數據庫表:在
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 # 內容管理頁
(二)頁面設計與實現規范
-
基礎模板設計(
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>
- 采用模板繼承機制,所有頁面繼承自
-
響應式設計規范
- 使用 Bootstrap 的網格系統(
container
、row
、col-*
)實現多設備適配; - 移動端優先:默認樣式適配手機,通過
@media (min-width: 768px)
等媒體查詢適配平板和桌面端; - 導航欄在移動端自動折疊為漢堡菜單,通過 Bootstrap 的 Navbar 組件實現。
- 使用 Bootstrap 的網格系統(
-
中越雙語實現
- 在靜態文本中使用數據屬性存儲雙語內容,例如:
<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);} });
- 在靜態文本中使用數據屬性存儲雙語內容,例如:
(三)核心頁面設計說明
-
首頁(
home/index.html
)- 頂部輪播圖:展示 3-5 張熱門院校或留學政策宣傳圖,自動切換;
- 快捷入口區:包含 “院校查詢”“申請指南”“最新資訊”“在線咨詢” 四個圖標按鈕,鏈接至對應頁面;
- 熱門院校展示:以卡片形式展示 6 所認證院校,包含 LOGO、名稱、地區、簡介,點擊進入詳情頁;
- 留學資訊推薦:展示 3 條最新資訊,包含標題、發布時間、摘要;
- 數據統計區:使用 Chart.js 繪制越南在華留學生人數趨勢圖、熱門專業分布餅圖。
-
院校列表頁(
university/list.html
)- 篩選區:包含地區下拉框(北京、上海、廣東等)、層次復選框(本科、碩士、語言學校)、專業搜索框,支持組合篩選;
- 排序功能:支持按 “關注度”“學費(從低到高)”“成立時間” 排序;
- 院校列表:以網格布局展示院校卡片,包含 LOGO、名稱(中越雙語)、地區、層次、學費范圍、認證狀態,卡片底部有 “查看詳情” 和 “收藏” 按鈕;
- 分頁控件:底部顯示分頁導航,支持跳轉到指定頁碼,每頁顯示 12 條記錄。
-
院校詳情頁(
university/detail.html
)- 院校頭部:展示院校 LOGO、名稱(中越雙語)、地區、層次、認證狀態,右上角有 “收藏” 按鈕(已登錄用戶可見);
- 標簽頁導航:包含 “院校簡介”“專業設置”“招生要求”“聯系方式” 四個標簽頁,點擊切換內容;
- 專業列表:在 “專業設置” 標簽頁中,以表格形式展示專業名稱、學位、學制、學費、錄取要求;
- 相關資訊:底部展示該院校發布的最新資訊,最多 5 條;
- 咨詢入口:提供 “向該校咨詢” 按鈕,點擊跳轉到咨詢提交頁(自動填充院校信息)。
-
用戶中心(
user/profile.html
)- 個人信息區:展示用戶名、郵箱、姓名、國籍等基本信息,提供 “編輯” 按鈕;
- 收藏管理:展示用戶收藏的院校列表,支持取消收藏;
- 咨詢記錄:展示用戶提交的咨詢列表,包含標題、狀態(未回復 / 已回復)、提交時間,點擊可查看詳情及回復;
- 消息通知:顯示系統消息(如收藏的院校有新資訊),未讀消息標紅提示。
-
后臺管理首頁(
admin/index.html
)- 數據概覽:展示網站總訪問量、注冊用戶數、院校數量、資訊數量、咨詢數量的統計卡片;
- 趨勢圖表:展示近 7 天用戶注冊量、資訊發布量、咨詢提交量的折線圖;
- 待辦事項:顯示待審核的院校、待回復的咨詢、待發布的資訊數量,點擊可跳轉到對應管理頁;
- 操作快捷入口:提供 “發布資訊”“審核院校”“回復咨詢” 的快速按鈕。
七、后端核心功能開發
(一)應用初始化與藍圖配置
-
應用入口文件(
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
-
應用工廠函數(
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
-
藍圖定義(以用戶模塊為例,
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)
(二)核心功能模塊開發
-
用戶模塊
- 注冊與登錄:使用 Flask-WTF 處理表單驗證,Flask-Login 管理用戶會話;
- 權限控制:通過
@login_required
裝飾器限制登錄后訪問,通過角色判斷(current_user.role
)限制管理員功能; - 個人信息管理:支持用戶修改姓名、郵箱、密碼(需驗證舊密碼)。
-
院校模塊
- 院校列表與篩選:接收前端傳遞的地區、專業等篩選參數,構建 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
模型記錄關聯關系,支持取消收藏。
- 院校列表與篩選:接收前端傳遞的地區、專業等篩選參數,構建 SQL 查詢條件:
-
資訊模塊
- 資訊發布與管理:管理員和高校用戶可發布資訊(需填寫中越雙語內容),支持編輯、刪除、草稿保存;
- 資訊分類與搜索:按類別(政策 / 院校動態 / 攻略)篩選,支持關鍵詞搜索(同時匹配標題和內容)。
-
咨詢模塊
- 咨詢提交與回復:用戶可提交中 / 越語咨詢,管理員或對應院校用戶可回復,回復后通過郵件通知用戶;
- 咨詢狀態跟蹤:顯示咨詢的狀態(未回復 / 已回復 / 已關閉),用戶可查看回復內容。
-
后臺管理模塊
- 用戶管理:管理員可查看所有用戶列表,按角色篩選,禁用違規用戶;
- 內容審核:審核院校認證申請(驗證院校資質)、資訊發布申請;
- 數據統計:通過 SQL 查詢統計用戶增長、訪問量、熱門院校等數據,生成報表。
(三)表單處理與驗證
-
表單定義(
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('該用戶名已被使用,請選擇其他用戶名')# 其他表單(如咨詢表單、資訊發布表單)按類似方式定義...
-
表單渲染與提交
在模板中渲染表單,并處理提交數據:<!-- 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 %}
八、系統集成與測試
(一)單元測試
-
測試環境配置
創建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()
-
核心功能測試示例
- 用戶登錄測試(
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
- 用戶登錄測試(
(二)集成測試
-
流程測試
測試完整業務流程,如 “用戶注冊→登錄→收藏院校→查看收藏”: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
-
接口測試
使用 Postman 測試 API 接口,驗證返回格式和數據正確性:- 測試
GET /api/universities
接口:檢查返回的院校列表格式是否符合規范,分頁參數是否生效; - 測試
POST /api/users/login
接口:驗證正確的賬號密碼返回 200 狀態碼和用戶信息,錯誤信息返回 401 狀態碼。
- 測試
(三)性能與兼容性測試
-
性能測試
- 使用
locust
工具進行負載測試:模擬 100 個并發用戶訪問首頁、院校列表頁,測試響應時間(目標≤3 秒); - 數據庫查詢優化:對熱門查詢(如院校列表)添加索引,使用
EXPLAIN ANALYZE
分析查詢性能,確保查詢時間≤100ms。
- 使用
-
兼容性測試
- 瀏覽器兼容性:在 Chrome、Firefox、Safari、Edge 等主流瀏覽器中測試頁面顯示和功能,確保一致的用戶體驗;
- 設備兼容性:使用瀏覽器開發者工具模擬手機(iPhone、Android)、平板設備,測試響應式布局是否正確。
九、部署與上線
(一)服務器配置
-
阿里云 ECS 實例配置
- 實例規格:2 核 4GB 內存,40GB SSD 云盤;
- 操作系統:Windows Server 2019 Datacenter;
- 網絡:分配公網 IP,綁定彈性公網 IP(EIP),確保 IP 固定;
- 安全組:開放 80 端口(HTTP)、443 端口(HTTPS)、5000 端口(Flask 應用)。
-
環境部署步驟
- 遠程連接服務器(使用遠程桌面);
- 安裝 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
(二)應用部署
-
使用 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
)。 -
配置 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
- Path:
- 啟動服務:
nssm start VietnamStudyInChina
- 使用
-
配置反向代理(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 配置
-
域名解析
- 在域名注冊商控制臺添加 A 記錄,將域名指向服務器公網 IP;
- 等待 DNS 生效(通常 10-30 分鐘),使用
nslookup
驗證解析是否正確。
-
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>
(四)上線前檢查清單
-
功能檢查
- 驗證所有核心功能(注冊、登錄、院校查詢、資訊瀏覽、咨詢提交)是否正常;
- 檢查中越雙語切換是否生效,文本是否正確顯示;
- 測試用戶權限控制(如普通用戶無法訪問后臺)。
-
性能檢查
- 使用瀏覽器開發者工具檢查頁面加載時間,確保≤3 秒;
- 測試數據庫查詢性能,熱門頁面查詢時間≤100ms;
- 驗證并發訪問(使用工具模擬 100 用戶)時系統是否穩定。
-
安全檢查
- 確認密碼加密存儲,敏感數據傳輸使用 HTTPS;
- 測試防 SQL 注入(在搜索框輸入特殊字符如
' OR 1=1 --
); - 檢查 CSRF 令牌是否生效(禁用 JavaScript 后提交表單)。
-
數據備份
- 手動備份數據庫文件(
vsic_db.sqlite
)至獨立存儲; - 驗證備份文件可正常恢復(在測試環境恢復并檢查數據完整性)。
- 手動備份數據庫文件(
十、項目維護與迭代
(一)日常維護
-
服務器監控
- 使用阿里云云監控:監控 CPU 使用率、內存占用、帶寬流量,設置閾值告警(如 CPU>80% 時短信通知);
- 應用日志監控:配置 Flask 日志輸出至文件(
logs/app.log
),定期查看錯誤日志,及時修復 BUG。
-
數據備份
- 自動備份:通過 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 天的備份文件,自動刪除過期文件。
- 自動備份:通過 Windows 任務計劃程序,每日凌晨 3 點執行數據庫備份腳本:
-
系統更新
- 定期更新服務器操作系統補丁(通過 Windows Update);
- 定期更新項目依賴包(
pip list --outdated
查看更新,pip upgrade
更新),更新前需在測試環境驗證兼容性。
(二)問題修復與迭代
-
BUG 修復流程
- 收集 BUG:通過用戶反饋、日志監控發現問題;
- 優先級分類:Critical(如登錄失敗)→ High(如頁面顯示異常)→ Medium(如排版問題)→ Low(如錯別字);
- 修復與驗證:在開發環境修復,提交測試環境驗證,通過后部署至生產環境。
-
功能迭代計劃
- 短期迭代(1-2 個月):
- 增加留學費用計算器功能;
- 優化搜索算法,支持越南語分詞搜索;
- 接入微信支付,支持在線繳納申請費。
- 中期迭代(3-6 個月):
- 開發移動 APP(基于 Flutter),實現與網站數據同步;
- 增加視頻面試功能,連接越南學生與中國高校;
- 接入 AI 智能咨詢機器人,自動回復常見問題。
- 長期迭代(1 年以上):
- 擴展至其他東南亞國家(如老撾、柬埔寨);
- 與中國教育部留學服務中心對接,實現學歷認證查詢。
- 短期迭代(1-2 個月):
-
性能優化
- 數據庫優化:對大表(如資訊表)進行分區,添加合適的索引,定期清理冗余數據;
- 緩存優化:使用 Redis 緩存熱門院校、資訊數據,減少數據庫查詢;
- 前端優化:壓縮靜態資源(CSS/JS/ 圖片),使用 CDN 加速靜態資源分發。
十一、總結與展望
(一)項目總結
? ? ? ?本項目 “vietnam-study-in-china” 基于 Python 3.10.6、Flask、SQLite 技術棧,構建了一個面向越南學生的赴華留學信息平臺。通過需求分析、系統設計、開發實現、測試部署等階段,完成了用戶管理、院校展示、資訊發布、在線咨詢等核心功能,并通過阿里云 ECS 部署上線,實現了域名綁定與 HTTPS 訪問。
? ? ? ?項目開發過程中,重點解決了以下問題:
- 中越雙語切換:通過前端數據屬性與 JavaScript 實現頁面文本動態切換;
- 數據安全:采用密碼加密存儲、CSRF 防護、SQL 注入防護等措施;
- 部署穩定性:使用 Waitress 作為生產服務器,配置 Windows 服務實現開機自啟;
- 用戶體驗:通過響應式設計適配多設備,優化頁面加載速度。
(二)項目展望
? ? ? ?隨著中越教育交流的深入,越南留學中國網有望成為兩國教育合作的重要橋梁。未來可從以下方面進一步發展:
- 拓展服務范圍:除信息展示外,增加在線申請、簽證代辦、接機服務等增值服務;
- 深化技術應用:引入大數據分析用戶行為,提供個性化院校推薦;
- 加強合作生態:與中國高校、越南中學建立合作,提供招生代理、生源輸送服務;
- 國際化擴展:在越南設立本地化運營團隊,提升服務響應速度與本地化程度。
? ? ? ?通過持續迭代與優化,項目將為越南學生赴華留學提供更便捷、高效的服務,助力中越教育交流與合作邁向新高度。