这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战
背景
其实对于花时间去做这些:就是在业余时间还写一些很常规的代码,我个人不太喜欢的,我觉得可以把这些时间花到别的地方,比如提高自己,娱乐生活什么的。不过这几个月疫情原因,没出门工作在家也是闲着,不能不写代码。
年前朋友给我提过,说我是搞软件的么,能不能给弄个会员信息的管理系统什么的,当时还在工作也没有抽时间,最近闲了就闲里偷个忙,这段时间就给弄了下。
他的这个理发店我清楚,我以前在那里待过20多天给客人洗头(年底比较忙,人也多,所以在寒假的时候去待了段时间),他们理发店很小的,记录会员信息就是给你一张卡(可以带走的),然后店里还有本子(保存副卡之类)在那里记录。谁剪发了,就在本子上找到对应的信息处,扣一笔。大概就是这样,属于人工纸质操作。
需求
-
能保存会员信息可以查询就行
-
能修改会员信息就行
-
能自己修改钱就行
-
能备份数据,万一电脑出问题了
上面是人家提的,下面是我需要额外考虑的:
- 安全,但不用过多关注
监听本地环回地址即可,只要流量进不来就行。登录、授权什么的不用考虑,因为是在他自己的收银台那里的电脑上,和他记录会员信息的本子在同一个地方,安全等级,同级。
- 操作日志记录
至少需要记录在什么时候,扣了谁一笔钱或者加钱了,或者改信息了。万一他们用得上呢
- 关于数据备份
单机应用,跨主机备份数据,最初考虑的是备份到百度网盘里,不过看了下协议还是算了,这么不正式的项目就跟个课程设计一样,审核不知道能不能过,也费事。
后来想了个别的方案。
- 部署
部署得简单,不能让人家安装配置太多依赖环境,比如数据库,java运行环境。
另外,是部署在个人电脑的windows系统上(win10)。
不管什么需求,实际上这些需求就很少,就像一个基本的课程设计一样。
实现
- 先写个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包有点大。
结束语
这个项目的github: github.com/xxd76379515… 如果有在校的同学做平常的课程设计需要web部分的现成实现可以作参考。
这个东西的功能没什么亮点,我得意的就是,把一个java web弄得好像是一个pc端的单机应用来用这一点的想法了吧,这种实现对很多人来说应该是没有意义的吧,写pc端单机软件就用c++或c#去写就行,一般不用这么绕。
这个项目小的就像个课程设计,功能点少的连毕设都不配。
不过最后的打包却是弥补了我当年做毕设的一个小尾巴的缺憾,当年花两个多月写的毕设是个考试管理的,一部分是给学生用的,用Java写的B/S架构web应用(生成试卷进行考试,成绩查询之类的,然后当时还在实习,功能上就用了很多会的技术,安全用的shiro,共享sesion外存搭了个redis集群,工程分层用dubbo来进行rpc调用等一大堆)。
另一部分C/S结构用c++写的主要给老师用,导入题库,自动判题/人工判题,生成成绩之类的,服务端用的还是IOCP的网络模型。连通信数据的协议格式还是自定义的,虽然很low。当时还买了个阿里云服务器部署。不过当时只考虑到给老师看客户端的功能了,没考虑实用性,也没研究过windows下制作安装程序是怎么回事,刚好这次借个机会研究下。
今天的文章朋友让帮忙写个理发店的会员信息管理系统…分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/16553.html