朋友讓幫忙寫個理髮店的會員信息管理系統...

背景

先說明,這不是私活,只是個無償幫助。其實對於花時間去做這些:就是在業餘時間還寫一些很常規的代碼,我個人不太喜歡的,我覺得可以把這些時間花到別的地方,比如提高自己,娛樂生活什麼的。不過這幾個月沒工作在家也是閒着,不能不寫代碼。

年前朋友給我提過,說我是搞軟件的麼,能不能給弄個會員信息的管理系統什麼的,當時還在工作也沒有抽時間,最近閒了就閒裏偷個忙,這段時間就給弄了下。

他的這個理髮店我清楚,我以前在那裏待過20多天給客人洗頭(年底比較忙,人也多,所以在寒假的時候去待了段時間),他們理髮店很小的,記錄會員信息就是給你一張卡(可以帶走的),然後店裏還有本子(保存副卡之類)在那裏記錄。誰剪髮了,就在本子上找到對應的信息處,扣一筆。大概就是這樣,屬於人工紙質操作。

順便講個故事,一直沒忘:當時在那20多天,遇到好多事情和人都不容易忘掉,撿個能說的。當時是大二寒假吧,我是放假前考完試沒事就去了,所以放假的時候,我已經可以熟練的洗長頭髮了(多爲女孩子的頭髮長),剛放假那一兩天,某天早上一個小姑娘來了,當時我給她洗頭的時候,人家一直在給我聊天,我呢那會話也不多,大早上人家說我就聽,問我就回句(頭髮長洗的慢,時間就長點)。然後人家給我說,我覺得你不太愛說話什麼的,就是這類意思。當時我聽了她原話,我就嗯嗯,我心裏想的是這誰家小孩子呀,好厲害,挺會聊的。她就問我,你覺得我多大,我想了想說14吧,本想說12的,想了想不敢說小,怕不開心,也不敢說太大,不像呀。她說我21了~~~~~,我在輕工業大學唸書的~~~~。。。。我類乖乖,內心算了下,我22,就比人家大一歲,然後什麼也沒敢再說。她接着說,都說她是娃娃臉,唔~~~那次看見人家,我是真的理解了什麼是對娃娃臉的定義。嗯,當然了,作爲一個直男,我內心當時的另一個想法是,輕工業離這裏中間隔了一個鄭大這麼遠呢,不會是走過來的吧,輕工業大學那邊應該也有理髮店吧,不過,我真的話少,人家該吹頭髮了就沒問出這個。

言歸正傳。

需求

1. 能保存會員信息可以查詢就行

2. 能修改會員信息就行

3. 能自己修改錢就行

4. 能備份數據,萬一電腦出問題了

上面是人家提的,下面是我需要額外考慮的:

1. 安全,但不用過多關注

監聽本地環回地址即可,只要流量進不來就行。登錄、授權什麼的不用考慮,因爲是在他自己的收銀臺那裏的電腦上,和他記錄會員信息的本子在同一個地方,安全等級,同級。

2. 操作日誌記錄

至少需要記錄在什麼時候,扣了誰一筆錢或者加錢了,或者改信息了。萬一他們用得上呢

3. 關於數據備份

單機應用,跨主機備份數據,最初考慮的是備份到百度網盤裏,不過看了下協議還是算了,這麼不正式的項目就跟個課程設計一樣,審覈不知道能不能過,也費事。

後來想了個別的方案。

4. 部署

部署得簡單,不能讓人家安裝配置太多依賴環境,比如數據庫,java運行環境。

另外,是部署在個人電腦的windows系統上(win10)。

不管什麼需求,實際上這些需求就很少,就像一個基本的課程設計一樣。

實現

1. 先寫個web的服務端應用

其實這個實現應該寫個pc端軟件比較合適,但是最開始沒想太多,想着自己兩年多沒寫過win32程序了,不想費事就寫成java web應用了。

前端選了個開源的後臺管理模板(AdminLTE),刪刪改改,帶主頁就3個頁面,不需要什麼,大概就下面這個樣子(理髮店叫柏***)。

用的springboot + jpa,存了近1w條用戶信息和1w條操作記錄測試了下,這可能是近60天內每天最大數據量了(實際肯定達不到,會員沒那麼多,操作記錄會刪除60天前的,每天150筆記錄才能達到60天9k筆,即使達到2w筆也不會多多少),數據量不大,用的h2的嵌入式數據庫將數據持久化到本地,打包方便,備份恢復也方便。

那問題來了,寫成java web往他電腦上部署着需要先讓他配置個Java運行環境,並且他每次啓動很尷尬。並且也不是有服務器可以部署這個web服務應用,不用每天用的時候再啓啓停停的。

想了想,寫個客戶端可以啓動這個web吧,對於小白用戶儘量友好點,然後把java運行環境、數據庫這些打包到安裝程序,一鍵安裝也方便。

界面庫用的duilib,畢竟寫出來好看點吧,比gdi,gdi+,mfc什麼的實現起來要有效率吧。

大概就這個樣子:

上面寫的很清楚吧,打開之後,點擊那個啓動按鈕,啓動本地的web服務,啓動完成後,自動打開默認瀏覽器,進入http://127.0.0.1:8080/index.html。

如果系統沒有設置默認瀏覽器,或者其它一些意外原因,比如,瀏覽器關閉了,用戶也可以按照啓動完成後上面紅字的提示,點擊複製按鈕將地址複製到剪切板,手動打開瀏覽器,粘貼地址打開等。

(背景圖片中的小姑娘是在百度上搜出來的,人像圖片有好多,感覺這張挺好,況且水印都看不見就拿來用了)

當然細節上一些也要考慮下吧,比如服務端口已經佔用問題、客戶端退出的時候關閉服務端應用、客戶端關閉服務端未退出再次啓動端、客戶端的單例、數據遠程備份什麼的這些小細節什麼的。

接下來打個安裝包了,寫一些啓動腳本,然後把java8的jre也安排進來還有客戶端用到的動態庫呀、皮膚圖片這些很基本的東西一起打包。打包工具用的NSIS的,在官方下的最新的,害我看了小半天文檔也沒忍住看完,最後還是找了個低版本增加版生成一個腳本然後改吧改吧省事了。下面是我調整後的這個腳本,如果下最新的,用來學習可以考慮先把這個複製過去在必要地方改改玩玩。

; 該腳本使用 HM VNISEdit 腳本編輯器嚮導產生

; 安裝程序初始定義常量
!define PRODUCT_NAME "BaishunStarter"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "許曉東."
!define PRODUCT_WEB_SITE "http://www.xiaodonggg.top"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"

SetCompressor lzma

; ------ MUI 現代界面定義 (1.67 版本以上兼容) ------
!include "MUI.nsh"

; MUI 預定義常量
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

; 歡迎頁面
!insertmacro MUI_PAGE_WELCOME
; 安裝目錄選擇頁面
!insertmacro MUI_PAGE_DIRECTORY
; 安裝過程頁面
!insertmacro MUI_PAGE_INSTFILES
; 安裝完成頁面
!insertmacro MUI_PAGE_FINISH

; 安裝卸載過程頁面
!insertmacro MUI_UNPAGE_INSTFILES

; 安裝界面包含的語言設置
!insertmacro MUI_LANGUAGE "SimpChinese"

; 安裝預釋放文件
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
; ------ MUI 現代界面定義結束 ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "BaishunStarter_NoBak_Setup.exe"
InstallDir "$PROGRAMFILES\BaishunStarter"
ShowInstDetails show
ShowUnInstDetails show

Section "MainSection" SEC01
; 指定爲所有用戶
  SetShellVarContext all

; 指定爲當前用戶
;SetShellVarContext current
  SetOutPath "$INSTDIR\*.*"
  SetOverwrite ifnewer
  File /r "baishun_setup\*.*"
  CreateShortCut "$DESKTOP\BaishunStarter.lnk" "$INSTDIR\BaishunStart.exe" "" "$INSTDIR\favicon.ico"
SectionEnd

Section -AdditionalIcons
  SetOutPath $INSTDIR
  CreateDirectory "$SMPROGRAMS\BaishunStarter"
  CreateShortCut "$SMPROGRAMS\BaishunStarter\Uninstall.lnk" "$INSTDIR\uninst.exe"
SectionEnd

Section -Post
  WriteUninstaller "$INSTDIR\uninst.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
SectionEnd

/******************************
 *  以下是安裝程序的卸載部分  *
 ******************************/

Section Uninstall
; 指定爲所有用戶
  SetShellVarContext all
  Delete "$INSTDIR\uninst.exe"

  Delete "$SMPROGRAMS\BaishunStarter\Uninstall.lnk"

  RMDir "$SMPROGRAMS\BaishunStarter"

  RMDir /r "$INSTDIR\*.*"

  RMDir "$INSTDIR"

  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  SetAutoClose true
SectionEnd

#-- 根據 NSIS 腳本編輯規則,所有 Function 區段必須放置在 Section 區段之後編寫,以避免安裝程序出現未可預知的問題。--#

Function un.onInit
  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "您確實要完全移除 $(^Name) ,及其所有的組件?" IDYES +2
  Abort
FunctionEnd

Function un.onUninstSuccess
  HideWindow
  MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地從您的計算機移除。"
FunctionEnd

然後,大概就這個樣子了。打成安裝包有點大90多m,主要還是jar包有點大。

結束語

這個東西的功能沒什麼亮點,我得意的就是,把一個java web弄得好像是一個pc端的單機應用來用這一點的想法了吧,這種實現對很多人來說應該是沒有意義的吧,寫pc端單機軟件就用c++或c#去寫就行,一般不用這麼繞。

這個項目小的就像個課程設計,功能點連畢設都不配。不過最後的打包卻是彌補了我當年做畢設的一個小尾巴的缺憾,當年花兩個多月寫的畢設是個考試管理的,一部分是給學生用的,用Java寫的B/S架構web應用(生成試卷進行考試,成績查詢之類的,然後當時在實習,功能上就用了很多會的技術,安全用的shiro,共享sesion外存搭了個redis集羣,工程分層用dubbo來進行rpc調用等一大堆。。。),另一部分C/S結構用c++寫的主要給老師用,導入題庫,自動判題/人工判題,生成成績之類的,服務端用的還是IOCP的網絡模型。連通信數據的協議格式還是自定義的,雖然很low。當時還買了個阿里雲服務器部署。不過當時只考慮到給老師看客戶端的功能了,沒考慮實用性,也沒研究過windows下製作安裝程序是怎麼回事,剛好這次借個機會研究下。

如果有在校的同學做平常的課程設計需要web部分的現成實現作參考可以私信我。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章