【PB案例學習筆記】-04文件瀏覽器

来源:https://www.cnblogs.com/xiezhr/p/18200440
-Advertisement-
Play Games

寫在前面 這是PB案例學習筆記系列文章的第4篇,該系列文章適合具有一定PB基礎的讀者。 通過一個個由淺入深的編程實戰案例學習,提高編程技巧,以保證小伙伴們能應付公司的各種開發需求。 文章中設計到的源碼,小凡都上傳到了gitee代碼倉庫https://gitee.com/xiezhr/pb-proje ...


寫在前面

這是PB案例學習筆記系列文章的第4篇,該系列文章適合具有一定PB基礎的讀者。

通過一個個由淺入深的編程實戰案例學習,提高編程技巧,以保證小伙伴們能應付公司的各種開發需求。

文章中設計到的源碼,小凡都上傳到了gitee代碼倉庫https://gitee.com/xiezhr/pb-project-example.git

gitee代碼倉庫

需要源代碼的小伙伴們可以自行下載查看,後續文章涉及到的案例代碼也都會提交到這個倉庫【pb-project-example

如果對小伙伴有所幫助,希望能給一個小星星⭐支持一下小凡。

一、小目標

學會使用MultiLineEdit控制項以及對文件操作函數的使用,最終實現一個如下圖所示文件瀏覽器功能。

文件瀏覽器

二、創建程式的基本框架

① 建立工作區

② 建立應用

③ 建立視窗

以上步驟忘記的小伙伴,請參照第一篇文章,創建應用、視窗與控制項

④ 建立控制項

在視窗中建立一個SingleLineEdit控制項、一個MultiLineEdit 控制項和CommandButton控制項,各個控制項的名稱

依次為sle_1mle_1cb_1

建立控制項

⑤ 保存視窗

將新建立的視窗保存為w_main

三、設置各個控制項的外觀及屬性

控制項名稱 主要屬性
w_main Title 文件瀏覽器
sle_1 Text (空)
cb_1 TextDefault 打開 | True
mle_1 TextVScrollBar (空)|True

四、編寫代碼

① 在按鈕cb_1 控制項的Clicked事件中添加如下代碼

integer li_filenum,li_loops,li_i
long ll_flen,ll_bytes_read,ll_new_pos
string ls_part,ls_total,ls_filename

ls_filename = sle_1.text

if ls_filename = '' or isnull(ls_filename) then
	messagebox('提示信息','請輸入文件名')
	return
end if

SetPointer(HourGlass!)

ll_flen = FileLength(ls_filename)

if ll_flen<=0 then
	
	messagebox('提示信息','無法打開文件')
	return
end if

li_filenum = FileOpen(ls_filename,StreamMode!,Read!,LockRead!)

if ll_flen >32765 then
	if mod(ll_flen,32765) = 0 then
		li_loops =ll_flen/32765
	else
		li_loops = (ll_flen/32765) +1
	end if
	
else 
	li_loops =1
end if

ll_new_pos =1 

for li_i =1 to li_loops
	ll_bytes_read = FileRead(li_filenum,ls_part)
	ls_total +=ls_part
next 

FileClose(li_filenum)

mle_1.text = ls_total

②在開發界面左邊雙擊App應用對象,在AppOpen 事件中添加如下代碼

open(w_main)

五、運行程式

我們在E:\workspace\2-PB\pbl\pb-project-example\04FileBrowser\dirtest目錄下新建xiezhr.txt 文件

運行程式,然後輸入xiezhr.txt全路徑,點擊【打開】按鈕便可讀出xiezhr.txt文件內容

打開文本內容

六、文件操作函數

2.1 函數列表

函數名稱 描述
CreateDirectory 創建一個目錄
ChangeDirectory 改變當前目錄
DirectoryExists 判斷目錄是否存在
GetCurrentDirectory 獲取當前目錄名
GetFileOpenName 獲取打開文件名
GetFileSaveName 獲取保存文件名
RemoveDirectory 刪除目錄
FileExists 判斷文件是否存在
FileLength 獲取文件長度
FileOpen 打開文件
FileClose 關閉文件
FileDelete 刪除文件
FileCopy 複製文件
FileMove 移動文件
FileSeek 移動文件指針
FileRead 讀取文件
FileWrite 寫文件

2.2 函數詳細說明

2.2.1 CreateDirectory 函數

語法

CreateDirectory (目錄名稱)

參數:

  • 目錄名稱,可以是絕對路徑,如果是絕對路徑,如果是絕對路徑,則在該路徑下創建,否則在項目空間下創建

返回值:Integer

  • 1 函數執行成功
  • -1 函數執行錯誤。例如:目錄已存在,再調用該函數會返回-1

功能

創建目錄

註: 如果目錄存在會報錯,所以在創建目錄前一般會判斷該目錄是否存在,不存在再創建

2.2.2 ChangeDirectory 函數

語法

ChangeDirectory  (目錄名稱)

返回值:Integer

  • 1 函數執行成功
  • -1 函數執行錯誤

功能

改變當前目錄

2.2.3 DirectoryExists 函數

語法

DirectoryExists(目錄名稱)

返回值:boolean

  • 如果目錄存在,則返回true
  • 如果目錄不存在,則返回false
  • 參數不符合規範,則返回false

功能

判斷某個目錄是否存在

2.2.4 GetCurrentDirectory 函數

語法

GetCurrentDirectory ()

返回值:string

  • 當前目錄字元串

功能

獲取當前目錄名

2.2.5 GetFileOpenName 函數

語法

GetFileOpenName(title,pathname,filename{,extension{,filter}})

參數:

  • title:string類型,指定對話框的標題
  • pathname:string類型變數,用於保存該對話框返回的文件路徑及文件名
  • filename:string類型變數,用於保存該對話框返回的文件名
  • extension:string類型,可選項,使用1到3個字元指定預設的擴展文件名
  • filter:string類型,可選項,其值為文件名掩碼,指定顯示在該對話框的列表框中供用戶選擇的文件名滿
    足的條件(比如..TXT,.EXE等)

返回值:Integer

  • 執行成功時返回1
  • 當用戶單擊了對話框上的“Cancel”按鈕時函數返回0
  • 發生錯誤時返回-1
  • 如果任何參數的值為NULL ,返回null

功能

顯示打開文件對話框,讓用戶選擇要打開的文件

例子

li_Value = GetFileOpenName("打開文件", ls_DocName, ls_Named, "rtf", &
"Text Files (*.TXT),*.TXT,"&
+"Doc Files (*.DOC),*.DOC," &
+"rtf files (*.rtf),*.rtf," &
+"all files (*.*),*.*")
If li_Value = -1 Then //打開文件錯誤
	Beep(2) //響鈴兩聲
	MessageBox("提示","文件打開錯誤!",Exclamation!) //提示錯誤
	Return //返回
Elseif li_Value = 0 Then //用戶取消
	Return //直接返回
End If
2.2.6 GetFileSaveName 函數

語法

GetFileSaveName(title,pathname,filename{,extension{,filter}})

參數:

  • title:string類型,指定對話框的標題
  • pathname:string類型變數,用於保存該對話框返回的文件路徑及文件名
  • filename:string類型變數,用於保存該對話框返回的文件名
  • extension:string類型,可選項,使用1到3個字元指定預設的擴展文件名
  • filter:string類型,可選項,其值為文件名掩碼,指定顯示在該對話框的列表框中供用戶選擇的文件名滿
    足的條件(比如..TXT,.EXE等)

返回值:Integer

  • 執行成功時返回1
  • 單擊了對話框上的“Cancel”按鈕時函數返回0
  • 發生錯誤時返回-1
  • 如果任何參數的值為NULL,那麼GetFileSaveName()函數返回NULL

功能

顯示保存文件對話框,讓用戶選擇要保存到的文件。

例子

value = GetFileSaveName("保存文件", docname, named, "txt",&
"Text Files (*.TXT),*.TXT,")
If value <> 1 Then //要保存的文件名沒有正確設定,
    Beep(2)
    MessageBox("錯誤","設置文件名"+docname+"錯誤!")
    return
End If
2.2.7 RemoveDirectory 函數

語法

RemoveDirectory(directoryname)

參數:string

  • directoryname: 要刪除的目錄名

返回值:Integer

  • 1 函數執行成功
  • -1 函數執行錯誤

功能

刪除目錄

2.2.8 FileExists 函數

語法

FileExists ( filename )

參數:string

  • filename:指定要檢查存在性的文件的文件名,其中可以包含路徑

返回值:Boolean

  • 指定文件存在時返回TRUE
  • 指定文件不存在時返回FALSE
  • 執行失敗時,返回FALSE
  • 參數為null,返回null

功能

判斷指定的文件是否存在。

2.2.9 FileLength 函數

語法

FileLength ( filename )

參數:string

  • filename:指定要得到其長度的文件的文件名,其中可以包含路徑

返回值:Long

  • 函數執行成功時返回指定文件的長度(以位元組為單位)。
  • 如果指定的文件不存在,函數返回-1。
  • 參數為null,則返回null
2.2.10 FileOpen 函數

語法

FileOpen(filename{,filemode{,fileaccess{,filelock{,writemode,
{creator,filetype}}}}})
  • filename:string類型,指定要打開文件的名稱,其中可以包含路徑

  • filemode:FileMode枚舉類型,可選項,指定文件打開方式。有效取值為:(LineMode! - 預設值,行
    模式)(StreamMode! - 流模式)

  • fileaccess:FileAccess枚舉類型,可選項,指定文件訪問方式。有效取值為:(Read! - 預設值,只
    讀方式,這樣打開的文件只能進行讀操作;)(Write! - 只寫方式,這樣打開的文件只能進行寫操作)

  • filelock:FileLock枚舉類型,可選項,指定文件加鎖方式。有效取值為:

    • n LockReadWrite! - 預設值,只有打開該文件的用戶能夠訪問該文件,其它用 戶對該文件的訪問均被拒
      絕;

    • n LockRead! - 只有打開該文件的用戶能夠讀該文件,但其它任何用戶均可寫該文件;

    • n LockWrite! - 只有打開該文件的用戶能夠寫該文件,但其它任何用戶均可讀該文件

    • n Shared! - 所有用戶均可讀寫該文件

  • writemode:WriteMode枚舉類型,可選項,當fileaccess參數指定為Write!時,該參數指定在指定文件
    已經存在時數據的添加方式。
    有效取值為:

    • Append! - 預設值,將數據添加到原文件尾部;
    • Replace! - 覆蓋原有數據
    • creator:可選項,用於Macintosh機,使用四個字元的字元串指定文件的創建者。指定該參數後,必須同時
      指定filetype參數
    • filetype:可選項,用於Macintosh機,使用四個字元的字元串指定文件類型

返回值:Integer

  • 執行成功時,返回1
  • 執行失敗時,返回-1
  • 參數為null時,返回null

功能

以指定的讀寫方式打開指定的文件,同時返回該文件的句柄。

2.2.11 FileClose 函數

語法

FileClose ( fileno )

參數:integer

  • fileno:指定要關閉文件的文件句柄,該句柄使用FileOpen()函數打開文件時得到

返回值:Integer

  • 函數執行成功時返回打開文件的句柄 文件操作函數利用該句柄完成對文件的操作
  • 發生錯誤時返回-1
  • 如果fileno參數的值為NULL,那麼FileClose()函數返回NULL

功能

關閉先前用FileOpen()函數打開的文件。

2.2.12 FileDelete 函數

語法

FileDelete ( filename )

參數:string

  • filename:指定要得到其長度的文件的文件名,其中可以包含路徑

返回值:Boolean

  • 函數執行成功時返回TRUE
  • 發生錯誤時返回FALSE
  • 如果filename參數的值為NULL,那麼FileDelete()函數返回NULL。

功能

刪除指定的文件

2.2.13 FileCopy 函數

語法

FileCopy ( Sourcefile, Targetfile{, replace } )

參數:

  • Sourcefile:要複製的文件的名稱的字元串
  • Targetfile: 複製到的文件的名稱的字元串
  • replace :指定是否替換目標文件的布爾值(true),為true時替換目標文件,為false時不替換(預設值為false)

返回值:Integer

  • 執行成功返回1
  • 打開源文件出錯-1
  • 寫入目標文件出錯 -2

註:如果沒有為 源文件 或 目標文件 指定完全限定的路徑,則該函數將相對於當前目錄工作。如果沒有指定replace參數,則FileCopy函數不會替換目標目錄中與在targetfile參數中指定的名稱相同的文件(這相當於將replace值設置為false)。

功能

複製文件

例子

將文件從當前目錄複製到另一個目錄,並將返回值保存在一個變數中

integer li_FileNum
li_FileNum = FileCopy ("jazz.gif" , &
   "C:\emusic\jazz.gif", FALSE)
2.2.14 FileMove 函數

語法

FileMove ( Sourcefile,Targetfile)

參數:

  • Sourcefile:要移動的文件的名稱的字元串
  • Targetfile:要移動文件的位置的名稱的字元串

返回值:

  • 執行成功 1
  • 打開源文件出錯 -1
  • 寫入目標文件出錯 -2

註:如果目標目錄中已經存在同名文件,則無法寫入目標文件。如果要複製目標文件,可以使用FileCopy並將replace參數設置為true。

功能

將當前文件移動到另一目錄

例子

將文件從當前目錄移動到另一個目錄,並將返回值保存在li_FileNum變數中

integer li_FileNum
li_FileNum = FileMove ("xiezhr.csv", &
   "D:/project/xiezhr2024.csv" )
2.2.15 FileSeek函數

語法

FileSeek ( fileno, position, origin )

參數:

  • fileno:integer類型,指定文件句柄(由FileOpen()函數得到)
  • position:long類型,指定相對於origin參數指定位置的新位置偏移量,以位元組為單位
  • originSeekType枚舉類型,指定從哪裡開始移動文件指針,即指針移動的基準。有效取值為:
    • FromBeginning! - 預設值,從文件開頭移動指針;
    • FromCurrent! - 從當前位置移動文件指針;
    • FromEnd! - 從文件結尾處移動文件指針

返回值:Long

  • 函數執行成功時返回指針移動後的指針位置
  • 參數為null,則返回null

功能

將文件指針移動到指定位置。讀寫文件時相應函數會自動移動文件指針。

2.2.16 FileRead 函數

語法

FileRead ( fileno, variable )

參數:

  • fileno:integer類型,指定文件句柄(由FileOpen()函數得到)
  • variable:string或blob類型的變數,用於保存讀取的數據

返回值:Integer

  • 函數執行成功時返回讀取的字元數或位元組數
  • 如果在讀取任何字元前讀到了文件結束符(EOF),則FileRead()函數返回-100
  • 指定文件以行模式打開時,如果在讀取任何字元之前遇到了回車(CR)或換行(LF)字元,則FileRead()
    函數返回0
  • 執行錯誤,函數返回-1

功能

從指定文件中讀取數據

2.2.17 FileWrite 函數

語法

FileWrite (fileno , variable )

參數:

  • fileno:integer類型,指定文件句柄(由FileOpen()函數得到)
  • variable:string或blob類型,其值將寫入fileno參數指定的文件

返回值:Integer

  • 執行成功時返回寫入文件的字元或位元組數
  • 發生錯誤時返回-1
  • 任何參數的值為NULL 函數返回NULL

功能

向指定文件中寫數據。

七、MultiLineEdit 控制項

3.1 常用屬性

屬性 描述
Visible 預設為 True。當為 False 時,該控制項在視窗上隱藏
Enabled 預設為 True。當為 False 時,該控制項不能獲得焦點,用戶不能進行編輯和選
中;控制項背景為灰色
DisplayOnly 預設為 False。當為 True 時,該控制項中的文字不能被修改,並且也不能
輸入,但可以選中、複製
AutoHScroll 預設為 True,表示當用戶輸入的內容顯示不下時,可以自動橫向滾動
游標,但是不顯示滾動條
HideSelection 預設為 True,表示只有當單行編輯器獲得焦點時,才高亮顯示選中文
本。建議使用預設值,因為將該屬性設置為 False,沒有獲得焦點時,選中的內容就高亮顯示,
這容易讓用戶造成錯誤
RightToLeft
Border 是否顯示邊框,預設為 True
Case 有三個選項, upper 表示用戶輸入的內容中的字母都自動轉換成大寫, down
表示都自動轉換成小寫, any 表示不做轉換
Limit 預設是 0,表示沒有長度限制。可以輸入其他一個數字,表示該單行編輯框中
最多接受用戶輸入的字元個數,最大數字是 32 767
HscrollBar 是否顯示橫向滾動條,預設為 False。當該屬性為 True 時,顯示橫向滾
動條, 某行文字的寬度大於控制項的寬度, 則滾動條可用, 否則灰色顯示不可用。 當屬性為 False
時,輸入的文字大於控制項寬度,則自動換行
VscrollBar 是否顯示縱向滾動條,預設為 False。當該屬性為 True 時,顯示縱向滾
動條, 如果文字的高度大於控制項的高度, 則滾動條可用, 否則灰色顯示不可用。 當屬性為 False
時,輸入的文字大於控制項高度時,就不允許再增加新的數據行
AutoVScroll 是否在需要時自動顯示縱向滾動條,預設為 False。如果設置為 True,
在當前內容顯示滿控制項時,增加新的數據行將會出現縱向滾動條
IgnoreDefaultButton 是否忽略 Enter 鍵,預設為 False。如果屬性為 True 並且當前焦
點在多行編輯器中, 這時使用 Enter 鍵則會在多行編輯器中增加一個新行; 如果屬性為 False,
則會觸發視窗上“ Default”按鈕的 Clicked 事件
Alignment 文本的對齊方式,是一個枚舉型取值,有 Center!、 Justify!、 Left!、 Right!4
個取值,預設為 Left!。

3.2 事件和腳本

多行編輯器提供了 12 個預設事件,觸發時機和單行編輯器的 12 個事件完全相同 (忘記的小伙伴可以翻一翻前面文章的內容)經常
使用的事件也是 Modified

多行編輯器也提供了很多的函數,和單行編輯器的同名函數的用法及註意事項完全相同,需要註意的是兩個單行編輯器沒有的函數 LineCountLineLength。這兩個函數經常配合使用,對多行編輯器中的文本逐個字元處理

① LineCount 函數

獲取editname 中數據的實際行數,不管每行後面是否有回車或換行符號

返回值:Integer

  • 執行成功,返回正確行數
  • 執行錯誤返回-1
  • editname 為 Null,則返回 Null

② LineLength 函數

可以獲取 editname 中當前游標所在行,包括空格在內的字元數,

返回值:Integer

  • 正確執行,返回游標所在行字元數
  • 執行錯誤,返回-1
  • 當 editname 為 Null 時返回 Null

本期內容到這兒就結束了,希望對你有所幫助。

我們下期再見 ヾ(•ω•`)o (●'◡'●)

本文來自博客園,作者:xiezhr,轉載請註明原文鏈接:https://www.cnblogs.com/xiezhr/p/18200440


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

-Advertisement-
Play Games
更多相關文章
  • 這篇文章介紹瞭如何在Vue.js應用中利用Vue Router實現單頁面應用的路由管理,包括配置路由、導航守衛的使用、路由懶載入以優化性能以及動態路由的實現方法,旨在提升用戶體驗和應用載入效率 ...
  • Popover API 為開發者提供了一種聲明式的方式來創建各種類型的彈窗。目前已在所有三大瀏覽器引擎中可用,並正式成為 Baseline 2024 的一部分。 ...
  • 前言 眾所周知,vue3的template中使用ref變數無需使用.value。還可以在事件處理器中進行賦值操作時,無需使用.value就可以直接修改ref變數的值,比如:<button @click="msg = 'Hello Vue3'">change msg</button>。你猜vue是在編 ...
  • 政務雲參考技術架構行業優勢總體架構 政務雲平臺技術框架圖,由機房環境、基礎設施層、支撐軟體層及業務應用層組成,在運維、安全和運營體系的保障下,為政務雲使用單位提供統一服務支撐。功能架構標準雙區隔離 參照國家電子政務規範,打造符合標準的雙區隔離的政務雲平臺,互聯網區承載對公服務業務,政務外網區承載各單 ...
  • 介紹: 在當今數字化時代,網路上的信息量龐大,如何使自己的網站在搜索引擎中脫穎而出成為了每個網站管理員都面臨的挑戰。網頁的原創度不僅能提升用戶體驗,還有利於搜索引擎排名。本文將介紹如何利用Coz API來重寫課件PPT網的網頁標題和正文內容,以增加網頁的原創度。 Coz API簡介: Coz是位元組出 ...
  • 前言 大家好,我是老馬。很高興遇到你。 我們為 java 開發者實現了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何處理的,可以參考我的另一個項目: 手寫從零實現簡易版 tomcat minicat 手寫 ngin ...
  • Trick: \(x\) 與各位數之和模 \(9\) 同餘(CF10D) st表 和 線段樹 可以存 gcd(CF10D) 註意函數增減性(CF1632D) dp 時若下標太大,可以調換下標和存儲的數值(CF1974E) 貪心不成立時,可以用反悔貪心(CF1974G) 乘法一般比加法更優(CF187 ...
  • 1.概述 1.1 介紹 Qt:它是一套基於C++的跨平臺開發框架,包括GUI、字元串、多線程處理、文件IO、網路IO、3D渲染等 時間:它誕生於1991年,由Haavard Nord和Eirik Chambe-Eng共同締造 發展:歷經Qt Company、Nokia、Digia多個公司開發迭代 版 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...