1. 程式人生 > >員工管理系統(C 語言)——伺服器解析

員工管理系統(C 語言)——伺服器解析

原始碼下載地址:https://download.csdn.net/download/wenfei11471/10477504伺服器功能:1、執行時主介面(伺服器啟動後,只有管理員下線,伺服器不會關閉):2、登入失敗後,進入登入介面:3、登入成功後,顯示下圖所示功能:4、查詢功能如下(需要輸入檢視的使用者名稱):5、修改的具體功能如下:6、修改的具體操作如下:7、新增功能如下:8、刪除功能如下:伺服器邏輯函式詳解:1、main 函式:1] 全域性定義 Usr、Root、Hist 後面函式都能直接使用,但不能修改; 2] 利用 create_struct 函式設定 Usr、Root、Hist 屬性關聯; 3] 根據 Usr 中的資訊利用 create_db 函式建立使用者資料庫;
4] usr_state_init 函式初始化使用者狀態; 5] 建立執行緒,利用 manager_fun 函式實現管理員登入操作; 6] 伺服器繫結 IP 和 Port; 7] 接收使用者登入請求 8] check_usr_fun 函式檢查使用者登入的賬號; 9] 使用者登入成功利用 create_db 函式建立使用者歷史記錄資料庫; 10] add_hist 函式將本次登入 IP 和時間記錄在使用者歷史記錄資料庫中; 11] 使用者登入成功開闢執行緒函式 login_usr_fun 用於處理客戶端請求; 12] 使用者登入失敗或者處理完使用者請求後關閉連線套接字。2、login_usr_fun 函式:
1] 引數:void * p (儲存連線套接字和使用者名稱)2] 返回值:void * 型別3] 功能:1) 資料接收錯誤、使用者掉線、使用者傳送 CLI_REQ_QUIT 時,執行緒退出; 2) search_info_fun 函式處理使用者查詢個人資訊請求; 3) modify_psw 函式處理使用者修改登入密碼請求; 4) modify_tel 函式處理使用者修改聯絡方式請求; 5) modify_mail 函式處理使用者修改 E_mail 請求; 6) modify_addr 函式處理使用者修改家庭住址請求; 7) search_hist_fun 函式處理使用者查詢歷史記錄請求; 8) 使用者退出 usr_state_fun 函式將使用者狀態設為 0。
3、search_info_fun 函式:1] 引數:PRO *command(傳輸結構體指標), DataBase *data(指定的資料庫)2] 返回值:無3] 功能:1) 開啟資料庫 sqlite3_open; 2) 執行查詢語句:select * from table where column="context";; 3) 資料庫查詢函式 sqlite3_get_table 會將查詢結果放在 result[][] 中; 4) 查詢結果一一賦值給傳輸結構體的對應項; 5) sqlite3_free_table 函式釋放 result 指向的空間; 6) 關閉已開啟的資料庫 sqlite3_close。4、search_hist_fun 函式:1] 引數:char (*record)[30](陣列指標), DataBase *data(指定的資料庫)2] 返回值:無3] 功能:1) 開啟資料庫 sqlite3_open; 2) 執行查詢語句:select * from table;; 3) 資料庫查詢函式 sqlite3_get_table 會將查詢結果放在 result[][] 中; 4) 將 result[][] 值一一賦給 record[][]; 5) sqlite3_free_table 函式釋放 result 指向的空間; 6) 關閉已開啟的資料庫 sqlite3_close。5、modify_psw/modify_name/modify_posi/modify_mail/modify_addr 函式:1] 引數:char *name(使用者名稱),char *(修改內容) DataBase *data(指定的資料庫)2] 返回值:無3] 功能:1) 開啟資料庫 sqlite3_open; 2) 執行查詢語句:update table set column="context" where column="context";; 3) 資料庫語句執行函式 sqlite3_exec; 4) 關閉已開啟的資料庫 sqlite3_close。6、modify_salary/modify_tel 函式:1] 引數:char *name(使用者名稱),double(修改內容) DataBase *data(指定的資料庫)2] 返回值:無3] 功能:1) 開啟資料庫 sqlite3_open; 2) 執行查詢語句:update table set column=value where column="context";; 3) 資料庫語句執行函式 sqlite3_exec; 4) 關閉已開啟的資料庫 sqlite3_close。7、manager_fun 函式:1] 引數:void * arg (保留引數,無意義)2] 返回值:void * 型別3] 功能:1) 管理登入函式; 2) 通過函式 name_fun 獲取使用者名稱,函式 password_fun 獲取密碼; 3) check_usr_fun 函式檢查使用者登入的賬號; 4) 使用者登入成功利用 manager_handler_fun 函式進入管理員操作介面; 5) 不論管理員登入成功與否,伺服器開啟後是不會關閉的。8、manager_handler_fun 函式:1] 引數:無2] 返回值:無3] 功能:1) 利用函式 read_file 函式顯示客戶端使用者的功能主介面; 2) show_info 函式列印使用者資訊; 3) 修改使用者資訊利用 modify_info_fun 函式操作; 4) 新增新的使用者利用 add_usr 函式操作。9、add_usr 函式:1] 引數:無2] 返回值:無3] 功能:1) 獲取新使用者的所有資訊; 2) add_db 函式是新增新使用者到使用者資料庫。10、add_db 函式:1] 引數:無2] 返回值:無3] 功能:1) 開啟資料庫 sqlite3_open; 2) 執行查詢語句:insert into table (column1, column2...) values ("context1", "context2"...);; 3) 資料庫語句執行函式 sqlite3_exec; 4) 關閉已開啟的資料庫 sqlite3_close;11、modify_info_fun 函式:1] 引數:無2] 返回值:無3] 功能:1) check_usr_fun 函式檢查使用者登入的賬號是否存在; 2) 利用函式 read_file 函式顯示管理員可修改的選項; 3) 修改登入密碼利用函式 modify_psw 操作; 4) 修改使用者姓名利用函式 modify_name 操作; 5) 修改使用者工資利用函式 modify_salary 操作;6) 修改使用者職位利用函式 modify_posi 操作;7) 修改聯絡方式利用函式 modify_tel 操作; 8) 修改 E_mail 利用函式 modify_mail 操作; 9) 修改家庭住址利用函式 modify_addr 操作; 10) 非命令輸入,提示輸入錯誤,重新選擇。客戶端功能函式詳解:1、add_hist 函式:1] 引數:無2] 返回值:無3] 功能:1) 開啟資料庫 sqlite3_open; 2) 執行查詢語句:insert into table (column1, column2...) values ("context1", "context2"...);; 3) 資料庫語句執行函式 sqlite3_exec; 4) 關閉已開啟的資料庫 sqlite3_close; 5) 本函式中時間和日期新增需要修改。2、creat_db 函式:1] 引數:DataBase *data 包含資料庫資訊2] 返回值:無3] 功能:1) 開啟/建立資料庫 sqlite3_open; 2) 執行查詢語句:create table if not exists tablename (column1, column2...) ;; 3) 資料庫語句執行函式 sqlite3_exec; 4) 關閉已開啟的資料庫 sqlite3_close; 5) 本函式建立普通使用者資料庫、管理員資料庫和歷史記錄資料庫分開了; 6) 建立管理員資料庫時會直接將管理員賬號和密碼一起添加了。3、create_struct 函式:1] 引數:const char *pathfile, const char *tablename,const char *col[10] 2] 返回值:DataBase *db3] 功能:1) 將 pathfile 指向的字串給 db->path; 2) 將 tablename 指向的字串給 db->table; 3) 將 col[10] 指向的字串給 db->column[i]; 4) 將 db 指向的結構體作為返回值返回,因此使用者記得 free。4、illegal_string_fun 函式:1] 引數:char *str 字串2] 返回值:int 型別3] 功能:1) 檢查字串中除了大小寫字母和數字外是否含有其他字元; 2) 如果字串中全是大小寫字母或數字則返回 0,否則返回 1。5、failed 函式:1] 引數:int ret,char *message2] 返回值:無3] 功能:1) 基本錯誤檢查,出錯會列印錯誤資訊。6、name_fun 函式:1] 引數:char *str 字串2] 返回值:無3] 功能:1) 從輸入端獲取使用者名稱; 2) 判斷使用者名稱是否為 0; 3) 判斷使用者名稱不能超過 19 個字元; 4) 利用 illegal_string_fun 判斷是否有非法字元; 5) 使用者名稱符合要求後將其賦值到 username 中; 6) 不能用 username = name,那樣在函式結束後 name 會被釋放; 7) 可以使用 strcpy 和 strcat 兩個函式。7、password_fun 函式:1] 引數:char *str 字串2] 返回值:無3] 功能:1) 從輸入端獲取密碼; 2) 判斷密碼不能少於 4 個字元; 3) 判斷密碼不能大於 19 個字元; 4) 利用 illegal_string_fun 判斷是否有非法字元; 5) 密碼符合要求後將其賦值到 usrpsw 中; 6) 不能用 usrpsw = psw,那樣在函式結束後 psw 會被釋放; 7) 可以使用 strcpy 和 strcat 兩個函式。8、read_file 函式:1] 引數:const char *file 檔案路徑2] 返回值:無3] 功能:1) 按照路徑開啟檔案; 2) 讀取檔案; 3) 輸出到標準輸出; 4) 關閉檔案。9、usr_state_fun 函式:1] 引數:char *name, DataBase *data, int state2] 返回值:無3] 功能:根據使用者名稱將其狀態修改為對應的狀態值9、usr_state_init 函式:1] 引數:DataBase *data, int state2] 返回值:無3] 功能: 1) 將所有使用者的狀態改為 0,一般為伺服器啟動和關閉時呼叫; 2) 必須保證狀態為 column[3].客戶端標頭檔案詳解:1、mydef.h 標頭檔案:1] 定義客戶端的所有請求指令2] 伺服器的所有回覆指令3] 各類可能使用到的路徑名4] 各類常用的字串彙總5] 型別常量值定義2、myfunction.h 標頭檔案:1] 對客戶端所有使用到的函式進行申明3、myinclude.h 標頭檔案:1] 定義函式中所有要使用到的標頭檔案4、mystruct.h 標頭檔案:1] 定義傳輸協議和資料型別結構體以及資料庫資訊的結構體客戶端目錄介紹:1、app 目錄:存放 Makefile 後產生的可執行檔案2、function 目錄:存放客戶端功能函式3、include 目錄:存放客戶端相關的標頭檔案4、main 目錄:存放客戶端主函式5、obj 目錄:存放 Makefile 後產生的目標檔案6、step 目錄:存放客戶端邏輯函式7、text 目錄:存放客戶端可能使用到的文件以及資料庫