摘 要
在经济全球化的今天,建立以客户为中心的经营战略,可以加强美容院和客户间的联系。对美容院来讲,为客户提供一流的服务,是美容院建立品牌、实现差别化服务、取得竞争的利器。一直以来人们使用传统人工的方式管理会员的基本档案,这种管理方式存在着许多缺点:效率低、保密性差,另外时间一长,将产生大量的文件和数据,对于查找、更新和维护都带来了不少的困难。而通过会员管理系统,企业就可以很轻松很方便的记录所有会员客户的资料,了解用户的兴趣爱好、消费特点、意向需求等;进而针对客户的需求,为其提供优质的个性化服务,还能为企业的产品开发、事业发展提供可靠的市场调研数据,是美容院经营不可或缺的一个有利工具。
本文主要通过对美容院会员管理系统的前台和后台管理进行了功能性需求分析,对系统的安全性和可扩展性进行了非功能性需求分析。在详细的需求分析的基础上,根据系统的功能设计确定了数据库结构,实现完整的代码编写。美容院会员管理系统完成了主要模块的页面设计和功能实现。本文展示了首页页面的实现效果图,并通过代码和页面介绍了用户注册功能、会员资料、会员卡类型、美容师信息、预约信息、服务信息、器材管理、余额充值、消费记录、积分领取功能的实现过程。
关键词:会员管理;springboot框架;
Springboot beauty salon member management system
Abstract
In today's economic globalization, establishing a customer-centered business strategy can strengthen the relationship between beauty salons and customers. For beauty salons, providing first-class services to customers is a sharp weapon for beauty salons to establish brands, realize differentiated services and obtain competition. For a long time, people use the traditional manual way to manage the basic files of members. This management method has many disadvantages: low efficiency and poor confidentiality. In addition, over a long time, it will produce a large number of documents and data, which has brought many difficulties to find, update and maintain. Through the member management system, enterprises can easily and conveniently record the information of all member customers and understand users' interests, consumption characteristics, intention and demand, etc; Furthermore, according to the needs of customers, providing them with high-quality personalized services can also provide reliable market research data for enterprise product development and career development. It is an indispensable and beneficial tool for the operation of beauty salons.
This paper mainly analyzes the functional requirements of the foreground and background management of the beauty salon member management system, and analyzes the non functional requirements of the security and scalability of the system. Based on the detailed demand analysis, the database structure is determined according to the functional design of the system to realize the complete coding. The beauty salon member management system has completed the page design and function realization of the main modules. This paper shows the implementation effect diagram of the home page, and introduces the implementation process of user registration function, member information, membership card type, beautician information, reservation information, service information, equipment management, balance recharge, consumption record and point collection function through the code and page.
Key words: member management; Springboot framework;
目 录
一、绪论
1.1 研究背景与意义
在计算机飞速发展的今天,将计算机这一高效的利器应用于会员管理已是势必所然,它可以带来意想不到的效果,尤其对于复杂的会员信息处理和大量的数据查询,计算机能够充分发挥它的优越性。在给广大用户带来方便的同时也会为的商业的发展提供无限潜力。
计算机已经成为我们学习和工作的得力助手,使用其管理会员有助于提高工作效率。今天,计算机的价格已经十分低廉,性能却有了长足的进步。它已经被应用于许多领域。现在我国的中小商业机构中会员的管理水平还停留在纸介质的基础上,这样的机制已经不能适应时代的发展,因为它浪费了许多人力和物力,在信息时代这种传统的管理方法必然被计算机为基础的信息管理所取代。
随着Internet 的快速发展,会员管理己经成为所有Web应用的基础。从电子政府、企业信息化、综合性网站、到垂直门户、数字图书馆乃至所有的电子商务,一定会涉及到内容的采集、创建、存储、管理、发布、检索和服务。会员管理在企业管理中有重要的地位和意义。开发会员管理信息系统是提高管理水平和管理效率的客观需要,结合会员管理信息系统的研究和开发工作,阐述了会员管理信息系统的特点、作用及有关其实现的若干关键性技术问题。
1.2研究内容
美容院会员管理系统的开发及实现,所需要的工作内容:
(1)首先是确定选题,确定好所要做的系统,并对系统的背景及现在面临的一些问题等进行系统的初步确认。
(2)系统确认完成后,结合系统开发的需求进行确认系统开发所使用的技术,美容院会员管理系统的开发使用springboot框架,数据库进行系统的搭建开发,确认好使用的技术进行技术分析,所使用的技术是否可以完成系统的实现。
(3)确定好系统使用的技术,进行在线确认系统所划分的用户角色,并且根据用户角色划分确定所要设计的功能模块,对于美容院会员管理系统的设计主要划分别为管理员和用户角色,并所使用的功能模块也相应不同,但是系统的数据库实现的内容是交互的,用户可以随时根据自己的需求进行信息搜索,对于系统工作人员可以根据自己的分管内容进行在线信息的处理及操作,管理员获取到所有用户的详细数据信息,并根据需求进行第一时间处理解决。
(4)系统的功能模块确认完成后进行程序及界面的设计,设计完成后,并且通过测试来判断程序是否完善,对于系统测试,需要不同的用户进行不同的内容编辑及提交,及使用不同的测试方式找出程序中存在的漏洞,并对程序出现的漏洞问题进行在线解决处理,如果测试系统没有任何问题时,可以将系统上传进行正式操作使用。
二、开发工具及相关技术介绍
2.1 开发技术
本系统前端框架采用了比较流行的渐进式JavaScript框架Vue.js。使用Vue-Router和Vuex实现动态路由和全局状态管理,Ajax实现前后端通信,Element UI组件库使页面快速成型。后端部分:采用springboot作为开发框架,同时集成MyBatis、Redis等相关技术。
2.2 MVVM模式
MVVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。当然这些事 ViewModel 已经帮我们做了,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑。微软的WPF带来了新的技术体验,如Silverlight、音频、视频、3D、动画……,这导致了软件UI层更加细节化、可定制化。同时,在技术层面,WPF也带来了 诸如Binding、Dependency Property、Routed Events、Command、DataTemplate、ControlTemplate等新特性。MVVM(Model-View-ViewModel)框架的由来便是MVP(Model-View-Presenter)模式与WPF结合的应用方式时发展演变过来的一种新型架构框架。它立足于原有MVP框架并且把WPF的新特性糅合进去,以应对客户日益复杂的需求变化。
2.3 MySQL数据库
科技的进步,给日常带来许多便利:教室的投影器用到了虚拟成像技术,数码相机用到了光电检测技术,比如超市货物进出库的记录需要一个信息仓库。这个信息仓库就是数据库,而这次的美容院会员管理系统也需要这项技术的支持。
用MySQL这个软件,是因为它能接受多个使用者访问,而且里面存在Archive等。它会先把数据进行分类,然后分别保存在表里,这样的特别操作就会提高数据管理系统自身的速度,让数据库能被灵活运用。MySQL的代码是公开的,而且允许别人二次编译升级。这个特点能够降低使用者的成本,再搭配合适的软件后形成一个良好的网站系统。虽然它有缺点,但是综合各方面来说,它是使用者的主流运用的对象。
2.4 B/S结构
B/S(Browser/Server)比前身架构更为省事的架构。它借助Web server完成数据的传递交流。只需要下载浏览器作为客户端,那么工作就达到“瘦身”效果, 不需要考虑不停装软件的问题。
2.5 spring boot框架介绍
Spring框架是Java平台上的一种开源应用框架,提供具有控制反转特性的容器。尽管Spring框架自身对编程模型没有限制,但其在Java应用中的频繁使用让它备受青睐,以至于后来让它作为EJB(EnterpriseJavaBeans)模型的补充,甚至是替补。Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供大量优秀的Web框架方便开发等等。Spring框架具有控制反转(IOC)特性,IOC旨在方便项目维护和测试,它提供了一种通过Java的反射机制对Java对象进行统一的配置和管理的方法。Spring框架利用容器管理对象的生命周期,容器可以通过扫描XML文件或类上特定Java注解来配置对象,开发者可以通过依赖查找或依赖注入来获得对象。Spring框架具有面向切面编程(AOP)框架,SpringAOP框架基于代理模式,同时运行时可配置;AOP框架主要针对模块之间的交叉关注点进行模块化。Spring框架的AOP框架仅提供基本的AOP特性,虽无法与AspectJ框架相比,但通过与AspectJ的集成,也可以满足基本需求。Spring框架下的事务管理、远程访问等功能均可以通过使用SpringAOP技术实现。Spring的事务管理框架为Java平台带来了一种抽象机制,使本地和全局事务以及嵌套事务能够与保存点一起工作,并且几乎可以在Java平台的任何环境中工作。Spring集成多种事务模板,系统可以通过事务模板、XML或Java注解进行事务配置,并且事务框架集成了消息传递和缓存等功能。Spring的数据访问框架解决了开发人员在应用程序中使用数据库时遇到的常见困难。它不仅对Java:JDBC、iBATS/MyBATIs、Hibernate、Java数据对象(JDO)、ApacheOJB和ApacheCayne等所有流行的数据访问框架中提供支持,同时还可以与Spring的事务管理一起使用,为数据访问提供了灵活的抽象。Spring框架最初是没有打算构建一个自己的WebMVC框架,其开发人员在开发过程中认为现有的StrutsWeb框架的呈现层和请求处理层之间以及请求处理层和模型之间的分离不够,于是创建了SpringMVC。
2.6 Vue.js 主要功能
Vue.js是一套构建用户界面的渐进式框架。与其他重量级框架不同的是,Vue采用自底向上增量开发的设计。Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合。另一方面,Vue 完全有能力驱动采用单文件组件和Vue生态系统支持的库开发的复杂单页应用。
Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。
Vue.js 自身不是一个全能框架——它只聚焦于视图层。因此它非常容易学习,非常容易与其它库或已有项目整合。另一方面,在与相关工具和支持库一起使用时,Vue.js 也能驱动复杂的单页应用。
三、系统分析
(一)可行性分析
本系统将在经济、技术、操作这三个角度上进行可行性分析。
整个系统从设计到开发以及测试过程严谨步骤齐全,所有工作任务全部由本人完成,并未获取外部技术支持,节约了一切服务成本开销以及人工成本,在硬件方面,为节约成本使用一台二手移动工作站作为项目部署服务器以及数据库服务器,成本在一万元一下,真个网络部署也是由本人独立完成不涉及到其他人工费用,整个开发过程本着低成本,低消耗的原则。
2.技术可行性
技术可行性分析的目的是确认该系统能否利用现有技术实现,并评估开发效率和完成情况。技术的可行性是指在当前的技术条件下,计算机软件和硬件的开发是否能够满足发展的要求。因为该系统的开发基于java语言,所以开发该系统所需的软件和硬件条件可以在普通计算机上满足。因为它占用的内存相对较少,所以用Mysql数据库开发和设计软件理论上没有问题,因为它占用的内存太少。上述技术可以有效地保证系统的成功和高效开发。
美容院会员管理系统的使用界面简单易于操作,采用常见的界面窗口来登录界面,通过电脑进行访问操作,用户只要平时使用过电脑都能进行访问操作。此系统的开发采用java技术开发,人性化和完善化是B/S结构开发比较显要的特点使得用户操作相比较其他更加简洁方便。易操作、易管理、交互性好在本系统操作上体现得淋漓尽致。
(二)系统功能分析和描述
使用美容院会员管理系统的分为管理员和用户、两个权限模块。
管理员所能使用的功能主要有:首页、用户管理(管理员、普通用户)更多管理(会员资料、会员卡类型、美容师信息、预约信息、服务信息、器材管理、余额充值、消费记录、积分领取)等。
用户可以实现首页、会员资料、美容师信息、预约信息、服务信息、余额充值、消费记录、积分领取。
管理人员用例图如下所示。
![](https://i-blog.csdnimg.cn/direct/c987034f9dd742fdb5e729f9c3201cd5.png)
图1 管理员用例图
系统用户用例图如下所示。
![](https://i-blog.csdnimg.cn/direct/aa716b8f9310404293e4870ed189092e.png)
图2 系统管理员用例图
(三)系统流程分析
添加信息流程
添加信息,编号系统使用自动编号模式,没有用户填写,用户添加信息输入信息,系统将自动确认的信息和数据,验证的成功是有效的信息添加到数据库,信息无效,重新输入信息。添加信息流程如图3-3所示。
![](https://i-blog.csdnimg.cn/direct/974c63b92caa40f4810fbe51a7d7d310.png)
图3添加信息流程图
操作流程
用户想进入系统,首先进入系统登录界面,通过正确的用户名、密码,选择登录类型登录,系统会检查登录信息,信息正确,然后输入相应的功能界面,提示信息错误,登录失败。系统操作流程如图3-4所示。
![](https://i-blog.csdnimg.cn/direct/1dbb5b3bcac445adabdec7fe037764a1.png)
图4操作流程图
删除信息流程
用户选择要删除的信息并单击Delete按钮。系统提示是否删除信息。如果用户想要删除信息,系统将删除信息。系统数据库删除信息。删除信息流程图如图3-5所示。
![](https://i-blog.csdnimg.cn/direct/6ba5d8478a6542c69245994018a33998.png)
图5 删除信息流程图
(四)非功能性需求分析
随着用户量的增加,系统可能会需要同时服务上千、上万个页面,服务器需要同时响应大量用户的操作,这就要求系统需要有良好的可扩展性,否则系统会出现延迟,卡顿甚至服务器崩溃的问题。高扩展性可以使软件保持旺盛的生命力,同时也能够使系统更好的适应用户增加、提高性能需求、增加应用功能等改变。
系统中保存了大量用户和管理员的个人信息,因此,保证系统服务器和数据安全是在开发过程中需要考虑的重要问题。安全性包括服务器安全、操作系统安全、数据库安全、程序代码安全以及用户个人信息和支付安全等,系统可以通过采用防火墙技术、加密技术、认证技术等来增强其安全性,只有一个健壮安全的系统才能具有长久的生命力。
(五)业务流程分析
美容院会员管理系统的前台中,会员模块和充值模块进行数据交互,前台的功能主要包括用户模块、商品模块、会员充值模块和消费记录模块。
美容院会员管理系统的后台中,管理员对用户在前台提交申请产生的数据进行处理,以满足用户的需求。前台系统和后台系统有数据交互,整个系统各个部分相互独立又密不可分。后台的功能主要包括用户管理、会员资料、美容师信息、预约信息、服务信息、余额充值、消费记录、积分领取管理。
四、系统设计
(一)功能模块设计
通过软件的需求分析已经获得了系统的基本功能需求。根据各大功能模块的不同,将系统分为各种功能大块。系统功能结构如下图所示。
![](https://i-blog.csdnimg.cn/direct/0851024ff56c416aa5a4a2e64f216980.png)
图4系统功能结构图
(二)数据库设计
概念设计包括实体和联系两部分,如该系统中,用户是一个实体,其属性包括用户 ID 标识、用户名、密码、电话、地址等属性。联系是指实体之间有意义的关联,包括一对一、一对多、多对多三种类型。
(1)管理员实体属性图如下图5所示
![](https://i-blog.csdnimg.cn/direct/80edbf1f0f5a47b9b3b5fd85a8e7cc05.png)
图5管理员实体属性图
(4) 用户注册实体属性如下图4-5所示
![](https://i-blog.csdnimg.cn/direct/4d18bffb2a344adaba689c42ffcd4390.png)
图4-5用户注册实体属性图
图5系统E-R图
连接数据库的文件在Resources 文件夹下的application.yml文件,代码如下:
port: 5000
servlet:
context-path: /api
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/CS725260_20211101091736?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
jackson:
property-naming-strategy: CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES
default-property-inclusion: ALWAYS
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
servlet:
multipart:
max-file-size: 100MB
max-request-size: 100MB
数据库表是设计和实现系统的一个重要基础。以下列出了小郑米粉店几个重要的数据库表。
字段名称 | 类型 | 长度 | 不是null | 主键 | 字段说明 |
balance_recharge_id | int | 11 | 否 | 主键 | 余额充值ID |
cardholder_user | int | 11 | 是 | 持卡用户 | |
user_name | varchar | 64 | 是 | 用户姓名 | |
user_gender | varchar | 64 | 是 | 用户性别 | |
membership_card_number | varchar | 64 | 是 | 会员卡号 | |
recharge_date | date | 0 | 是 | 充值日期 | |
recharge_amount | int | 11 | 是 | 充值金额 | |
recommend | int | 11 | 否 | 智能推荐 | |
create_time | datetime | 0 | 否 | 创建时间 | |
update_time | timestamp | 0 | 否 | 更新时间 | |
beautician_information | |||||
字段名称 | 类型 | 长度 | 不是null | 主键 | 字段说明 |
beautician_information_id | int | 11 | 否 | 主键 | 美容师信息ID |
name_of_beautician | varchar | 64 | 是 | 美容师姓名 | |
beautician_gender | varchar | 64 | 是 | 美容师性别 | |
beautician_head | varchar | 255 | 是 | 美容师头像 | |
service_expertise | text | 0 | 是 | 服务专长 | |
personal_profile | text | 0 | 是 | 个人简介 | |
recommend | int | 11 | 否 | 智能推荐 | |
create_time | datetime | 0 | 否 | 创建时间 | |
update_time | timestamp | 0 | 否 | 更新时间 | |
equipment_management | |||||
字段名称 | 类型 | 长度 | 不是null | 主键 | 字段说明 |
equipment_management_id | int | 11 | 否 | 主键 | 器材管理ID |
equipment_name | varchar | 64 | 是 | 器材名称 | |
purchase_time | datetime | 0 | 是 | 购买时间 | |
purchase_price | int | 11 | 是 | 购买价格 | |
equipment_function | text | 0 | 是 | 器材功能 | |
project_involved | text | 0 | 是 | 涉及项目 | |
equipment_status | text | 0 | 是 | 器材状态 | |
recommend | int | 11 | 否 | 智能推荐 | |
create_time | datetime | 0 | 否 | 创建时间 | |
update_time | timestamp | 0 | 否 | 更新时间 | |
member_information | |||||
字段名称 | 类型 | 长度 | 不是null | 主键 | 字段说明 |
member_information_id | int | 11 | 否 | 主键 | 会员资料ID |
cardholder_user | int | 11 | 是 | 持卡用户 | |
user_name | varchar | 64 | 是 | 用户姓名 | |
user_gender | varchar | 64 | 是 | 用户性别 | |
subscriber_telephone | varchar | 64 | 是 | 用户电话 | |
id_number | varchar | 64 | 是 | 身份证号 | |
user_birthday | varchar | 64 | 是 | 用户生日 | |
favorite_beautician | varchar | 64 | 是 | 心仪美容师 | |
membership_card_type | varchar | 64 | 是 | 会员卡类型 | |
membership_card_number | varchar | 64 | 是 | 会员卡号 | |
card_balance | int | 11 | 是 | 卡上余额 | |
residual_integral | int | 11 | 是 | 剩余积分 | |
recommend | int | 11 | 否 | 智能推荐 | |
create_time | datetime | 0 | 否 | 创建时间 | |
update_time | timestamp | 0 | 否 | 更新时间 | |
membership_card_type | |||||
字段名称 | 类型 | 长度 | 不是null | 主键 | 字段说明 |
membership_card_type_id | int | 11 | 否 | 主键 | 会员卡类型ID |
membership_card_type | varchar | 64 | 是 | 会员卡类型 | |
recommend | int | 11 | 否 | 智能推荐 | |
create_time | datetime | 0 | 否 | 创建时间 | |
update_time | timestamp | 0 | 否 | 更新时间 | |
points_collection | |||||
字段名称 | 类型 | 长度 | 不是null | 主键 | 字段说明 |
points_collection_id | int | 11 | 否 | 主键 | 积分领取ID |
cardholder_user | int | 11 | 是 | 持卡用户 | |
user_name | varchar | 64 | 是 | 用户姓名 | |
user_gender | varchar | 64 | 是 | 用户性别 | |
membership_card_number | varchar | 64 | 是 | 会员卡号 | |
consumption_date | date | 0 | 是 | 消费日期 | |
obtained_integral | varchar | 64 | 是 | 所得积分 | |
recommend | int | 11 | 否 | 智能推荐 | |
create_time | datetime | 0 | 否 | 创建时间 | |
update_time | timestamp | 0 | 否 | 更新时间 | |
records_of_consumption | |||||
字段名称 | 类型 | 长度 | 不是null | 主键 | 字段说明 |
records_of_consumption_id | int | 11 | 否 | 主键 | 消费记录ID |
cardholder_user | int | 11 | 是 | 持卡用户 | |
user_name | varchar | 64 | 是 | 用户姓名 | |
user_gender | varchar | 64 | 是 | 用户性别 | |
membership_card_number | varchar | 64 | 是 | 会员卡号 | |
consumption_date | date | 0 | 是 | 消费日期 | |
consumption_amount | int | 11 | 是 | 消费金额 | |
obtained_integral | int | 11 | 是 | 所得积分 | |
recommend | int | 11 | 否 | 智能推荐 | |
create_time | datetime | 0 | 否 | 创建时间 | |
update_time | timestamp | 0 | 否 | 更新时间 | |
reservation_information | |||||
字段名称 | 类型 | 长度 | 不是null | 主键 | 字段说明 |
reservation_information_id | int | 11 | 否 | 主键 | 预约信息ID |
reservation_user | int | 11 | 是 | 预约用户 | |
user_name | varchar | 64 | 是 | 用户姓名 | |
user_gender | varchar | 64 | 是 | 用户性别 | |
subscriber_telephone | varchar | 64 | 是 | 用户电话 | |
time_of_appointment | datetime | 0 | 是 | 预约时间 | |
service_items | varchar | 64 | 是 | 服务项目 | |
name_of_beautician | varchar | 64 | 是 | 美容师姓名 | |
recommend | int | 11 | 否 | 智能推荐 | |
create_time | datetime | 0 | 否 | 创建时间 | |
update_time | timestamp | 0 | 否 | 更新时间 | |
service_information | |||||
字段名称 | 类型 | 长度 | 不是null | 主键 | 字段说明 |
service_information_id | int | 11 | 否 | 主键 | 服务信息ID |
reservation_user | int | 11 | 是 | 预约用户 | |
user_name | varchar | 64 | 是 | 用户姓名 | |
user_gender | varchar | 64 | 是 | 用户性别 | |
subscriber_telephone | varchar | 64 | 是 | 用户电话 | |
reception_time | datetime | 0 | 是 | 接待时间 | |
service_items | varchar | 64 | 是 | 服务项目 | |
name_of_beautician | varchar | 64 | 是 | 美容师姓名 | |
recommend | int | 11 | 否 | 智能推荐 | |
create_time | datetime | 0 | 否 | 创建时间 | |
update_time | timestamp | 0 | 否 | 更新时间 |
五、系统实现
(一)用户登录的实现
用户注册完成后,点击“登陆”进入到登陆页面,输入用户名和密码,点击“登陆”按钮,对用户名和密码进行验证,根据传入的用户名和密码在数据库中是否能查询到一条用户信息,若不能返回用户信息则登陆失败,页面提示用户名或密码错误。
登陆拦截管理器,在config文件夹下的WebAppConfig.java文件,代码如下:
@Configuration
@Slf4j
public class WebAppConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//登录拦截的管理器
InterceptorRegistration registration = registry.addInterceptor(loginInterceptor());
//拦截的地址
registration.addPathPatterns("/**");
//方行的地址
//registration.excludePathPatterns("/**");
//根据需要拦截,一般设置所有地址拦截,放行公共连接
}
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
}
登录界面如下图所示。
![](https://i-blog.csdnimg.cn/direct/3b51758fd79b4feaae9a43cafe7a1e98.png)
图5-1登录界面
用户登录的关键代码如下。
/**
* 登录
* @param data
* @param httpServletRequest
* @return
*/
@PostMapping("login")
public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {
log.info("[执行登录接口]");
String username = data.get("username");
String email = data.get("email");
String phone = data.get("phone");
String password = data.get("password");
List resultList = null;
Map<String, String> map = new HashMap<>();
if(username != null && "".equals(username) == false){
map.put("username", username);
resultList = service.select(map, new HashMap<>()).getResultList();
}
else if(email != null && "".equals(email) == false){
map.put("email", email);
resultList = service.select(map, new HashMap<>()).getResultList();
}
else if(phone != null && "".equals(phone) == false){
map.put("phone", phone);
resultList = service.select(map, new HashMap<>()).getResultList();
}else{
return error(30000, "账号或密码不能为空");
}
if (resultList == null || password == null) {
return error(30000, "账号或密码不能为空");
}
//判断是否有这个用户
if (resultList.size()<=0){
return error(30000,"用户不存在");
}
User byUsername = (User) resultList.get(0);
Map<String, String> groupMap = new HashMap<>();
groupMap.put("name",byUsername.getUserGroup());
List groupList = userGroupService.select(groupMap, new HashMap<>()).getResultList();
if (groupList.size()<1){
return error(30000,"用户组不存在");
}
UserGroup userGroup = (UserGroup) groupList.get(0);
//查询用户审核状态
if (!StringUtils.isEmpty(userGroup.getSourceTable())){
String sql = "select examine_state from "+ userGroup.getSourceTable() +" WHERE user_id = " + byUsername.getUserId();
String res = String.valueOf(service.runCountSql(sql).getSingleResult());
if (res==null){
return error(30000,"用户不存在");
}
if (!res.equals("已通过")){
return error(30000,"该用户审核未通过");
}
}
//查询用户状态
if (byUsername.getState()!=1){
return error(30000,"用户非可用状态,不能登录");
}
String md5password = service.encryption(password);
if (byUsername.getPassword().equals(md5password)) {
// 存储Token到数据库
AccessToken accessToken = new AccessToken();
accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));
accessToken.setUser_id(byUsername.getUserId());
tokenService.save(accessToken);
// 返回用户信息
JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));
user.put("token", accessToken.getToken());
JSONObject ret = new JSONObject();
ret.put("obj",user);
return success(ret);
} else {
return error(30000, "账号或密码不正确");
}
}
(二)系统前台主要功能实现
1、用户注册的实现
用户进入系统首页后,点击“注册”链接进入到注册页面,按照页面提示输入用户名密码和手机号,页面进行表单验证,验证输入的用户名和账号是否合法,表单验证通过后,点击“立即注册”按钮,利用 Ajax 技术,对用户名和账号实现页面无刷新验证,检测数据库中是否已经存在该用户名,若数据库中不存在,则注册成功,注册成功后,自动跳转到登录页面。
用户注册界面如下所示。
![](https://i-blog.csdnimg.cn/direct/358c06967bbc463997c501923de425f2.png)
图5-3用户注册界面
用户注册的关键代码如下。
* 注册
* @param user
* @return
*/
@PostMapping("register")
public Map<String, Object> signUp(@RequestBody User user) {
// 查询用户
Map<String, String> query = new HashMap<>();
query.put("username",user.getUsername());
List list = service.select(query, new HashMap<>()).getResultList();
if (list.size()>0){
return error(30000, "用户已存在");
}
user.setUserId(null);
user.setPassword(service.encryption(user.getPassword()));
service.save(user);
return success(1);
}
/**
* 用户ID:[0,8388607]用户获取其他与用户相关的数据
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Integer userId;
/**
* 账户状态:[0,10](1可用|2异常|3已冻结|4已注销)
*/
@Basic
@Column(name = "state")
private Integer state;
/**
* 所在用户组:[0,32767]决定用户身份和权限
*/
@Basic
@Column(name = "user_group")
private String userGroup;
/**
* 上次登录时间:
*/
@Basic
@Column(name = "login_time")
private Timestamp loginTime;
/**
* 手机号码:[0,11]用户的手机号码,用于找回密码时或登录时
*/
@Basic
@Column(name = "phone")
private String phone;
/**
* 手机认证:[0,1](0未认证|1审核中|2已认证)
*/
@Basic
@Column(name = "phone_state")
private Integer phoneState;
/**
* 用户名:[0,16]用户登录时所用的账户名称
*/
@Basic
@Column(name = "username")
private String username;
/**
* 昵称:[0,16]
*/
@Basic
@Column(name = "nickname")
private String nickname;
/**
* 密码:[0,32]用户登录所需的密码,由6-16位数字或英文组成
*/
@Basic
@Column(name = "password")
private String password;
/**
* 邮箱:[0,64]用户的邮箱,用于找回密码时或登录时
*/
@Basic
@Column(name = "email")
private String email;
/**
* 邮箱认证:[0,1](0未认证|1审核中|2已认证)
*/
@Basic
@Column(name = "email_state")
private Integer emailState;
/**
* 头像地址:[0,255]
*/
@Basic
@Column(name = "avatar")
private String avatar;
/**
* 创建时间:
*/
@Basic
@Column(name = "create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Timestamp createTime;
@Basic
@Transient
private String code;
}
2、商品信息的实现
美容师信息页面,如下图所示。
![](https://i-blog.csdnimg.cn/direct/b7199a42dd1547db896ad0669dd5be6c.png)
图5-4美容师信息页面
美容师信息的关键代码如下。
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
3预约信息的实现
系统首页提供了预约信息的输入框,用户在输入框内输入预约信息关键字,点击提交按钮,系统将用户输入的关键字传递到后台。首先创建一个实体类 PageBean,该实体类的属性包括页码 pageCode、每页记录数 pageSize、总记录数 totalRecord 和一个 List 集合 beanList,用循环将录入到的结果分页展示。
预约信息界面如下图所示。
![](https://i-blog.csdnimg.cn/direct/e9fa9a2db3de40468a3466a87f41967c.png)
图5-5预约信息界面
预约信息的关键代码如下。
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
service.insert(service.readBody(request.getReader()));
return success(1);
}
@Transactional
public Map<String, Object> addMap(Map<String,Object> map){
service.insert(map);
return success(1);
}
public Map<String,Object> readBody(BufferedReader reader){
BufferedReader br = null;
StringBuilder sb = new StringBuilder("");
try{
br = reader;
String str;
while ((str = br.readLine()) != null){
sb.append(str);
}
br.close();
String json = sb.toString();
return JSONObject.parseObject(json, Map.class);
}catch (IOException e){
e.printStackTrace();
}finally{
if (null != br){
try{
br.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
return null;
}
public void insert(Map<String,Object> body){
StringBuffer sql = new StringBuffer("INSERT INTO ");
sql.append("`").append(table).append("`").append(" (");
for (Map.Entry<String,Object> entry:body.entrySet()){
sql.append("`"+humpToLine(entry.getKey())+"`").append(",");
}
sql.deleteCharAt(sql.length()-1);
sql.append(") VALUES (");
for (Map.Entry<String,Object> entry:body.entrySet()){
Object value = entry.getValue();
if (value instanceof String){
sql.append("'").append(entry.getValue()).append("'").append(",");
}else {
sql.append(entry.getValue()).append(",");
}
}
sql.deleteCharAt(sql.length() - 1);
sql.append(")");
log.info("[{}] - 插入操作:{}",table,sql);
Query query = runCountSql(sql.toString());
query.executeUpdate();
}
- 器材管理的实现
点击“器材管理”按钮,页面将该器材管理的数据传递到后台,首先查询数据库器材表中是否已经存在该商品,若存在直接将商品数量加一,若不存在则创建一个新的器材对象,添加成功,数据库中的器材表单添加一条信息。
器材添加界面如下图所示。
![](https://i-blog.csdnimg.cn/direct/26a4be900dc049459dcdcfa44f7ed003.png)
图5-6器材添加界面
(三)系统后台主要功能实现
管理员对系统用户的管理,在管理员管理实现管理员用户的管理,包括录入、删除、修改,修改密码通过SESSION获取用户名,然后输入新密码,使用sql命令更新密码。
用户管理界面如下图所示。
![](https://i-blog.csdnimg.cn/direct/b7665e7d994642799de49dc3fa5d0d23.png)
图5-8用户管理界面
- 余额充值管理的实现
管理员可以获取系统中所有会员的余额充值,并对其进行编辑。管理员在添加会员余额充值信息时,需要输入充值基本信息,如会员编号、充值金额、充值时间等。添加充值信息完成,数据库中的余额充值表添加一条信息。
余额充值管理界面如下图所示。
![](https://i-blog.csdnimg.cn/direct/addb5845ddc8491f898cad40be1bce58.png)
图5-9余额充值管理界面
余额充值管理关键代码:
@RestController
@RequestMapping("auth")
public class AuthController extends BaseController<Auth, AuthService> {
/**
* 服务对象
*/
@Autowired
public AuthController(AuthService service) {
setService(service);
}
}
- 消费记录管理的实现
管理员在后台管理界面点击到所有消费记录界面列表,可以搜索当前所有消费记录信息,调用搜索全部消费记录的请求,向数据库的消费记录表搜索当前所有消费记录并将消费记录信息以对象的形式层层返回到消费记录列表界面,显示出当前所有消费记录信息。同时可以删除过期消费记录,确认已有消费记录。
消费记录管理界面如下图所示。
![](https://i-blog.csdnimg.cn/direct/060c7177d27f4d32b6f77a93a1d10be7.png)
图5-10消费记录管理界面
消费记录管理的关键代码如下。
@RequestMapping(value = "/del")
@Transactional
public Map<String, Object> del(HttpServletRequest request) {
service.delete(service.readQuery(request), service.readConfig(request));
return success(1);
}
@Transactional
public void delete(Map<String,String> query,Map<String,String> config){
StringBuffer sql = new StringBuffer("DELETE FROM ").append("`").append(table).append("`").append(" ");
sql.append(toWhereSql(query, "0".equals(config.get(FindConfig.GROUP_BY))));
log.info("[{}] - 删除操作:{}",table,sql);
Query query1 = runCountSql(sql.toString());
query1.executeUpdate();
}
六、 系统测试
6.1测试定义及目的
关于系统实现的测试,英文名称是System TEST,简称ST,ST是使用完整其系统的各种功能多次、多案例、多环境测试,这是ST的简单描述。ST可以证明该功能对系统的要求是否得到满足以及是否有效。
对于系统开发的实现,不管开发过程多么努力,在系统运行的时候多少都会出现一些错误信息,所以为了系统的安全性及提高系统的使用率及给用户带来更好的体验,系统在完成之前,一定要进行一遍系统的测试,再完美的程序也会有漏洞,再细心的技术开发员也会有疏忽的时候,所以对于程序的测试是必须要做的一步。通过系统测试找到系统存在的问题,并根据问题的原因进行在线解决问题,如果找不到解决问题的办法可以进行通过咨询指导老师或者通过同学帮忙,一定将问题找出,否则将会出现更多的错误。所以程序出现错误时不可避免,系统测试虽然耗时费力,但是为了确保后期系统的长期使用,必须要进行系统测试,问题解决完成后还要再一步测试,直到没有任何问题后方可进行使用。
6.2性能测试
任何一款程序开发成功后都必须通过软件测试,它是保障软件稳定运行的前提。测试最主要的一步就是性能测试,性能测试内容如下:
(1)对于测试的速度有一定的要求,速度必须快,而且对于测试出来的错误问题一定以最快的速度进行处理解决,并且进行再次测试,保证整个系统运行的安全性。
(2)在系统测试的时候要将测试所用到的测试计划和测试报告保管好,方便后期系统的运行使用后的整体维护操作。
(3)软件测试整个过程中的聚类现象应优先考虑。
(4)对于整体系统测试,不要用自己的思想去认可整个系统,而是从公正的角度的进行对系统进行认可,是否符系统的整合应用。
6.3测试模块
测试系统是最新的Windows 10系统,通过对系统实现的功能模块进行每个功能模块的操作测试,查看每个用户的功能模块所对应的权限信息是否可以操作并且数据信息更新一致。
测试需求 | 测试重点 | 是否达成需求 | 结果 |
用户登录 | 输入账号密码 | 需求达成 | 通过 |
用户注册 | 创建新的账号密码 | 需求达成 | 通过 |
登录失败 | 输入错误账号密码 | 需求达成 | 通过 |
修改信息 | 修改成功 | 需求达成 | 通过 |
添加信息管理 | 增删查改 | 需求达成 | 通过 |
回复管理 | 增删查改 | 需求达成 | 通过 |
搜索查询管理 | 增删查改 | 需求达成 | 通过 |
系统测试方面,我们通常运用的是白盒测试以及黑盒测试这两种方法。白盒测试是指在了解系统内部工作流程的前提下,可以根据需求规范验证系统内部操作是否能够正常运行的测试;而黑盒测试指的是,倘若知道了这个系统的全部功能,可以进行测试检测系统中的每一个功能是否满足正常使用。
为了方便用户使用“美容院会员管理系统”,以及尽可能少的减少系统测试错误的发生,我们对该系统进行了相对应的测试。
对该系统的全部的功能界面进行测试,简单来说,就是我们输入一些数据并且对其进行提交,之后我们查看每个页面的反馈,检测页面的相关功能可不可以完全实现。
6.4测试结果
测试评估的结果是美容院会员管理系统满足要求中的所有功能,处理大多数错误条件,修复大多数错误并通过测试。美容院会员管理系统的基本功能都是可行的,不管是系统里面的功能还是界面的设计都是可值得推广宣传的。
七、总结与展望
本文针对美容院会员管理系统的特点和用户需求,利用 java相关技术、springboot框架等技术,通过详细的需求分析、页面设计和功能设计,系统利用JQuery 技术和 CSS 技术进行了页面设计,实现了包括用户模块、商品模块、销售模块。余额充值模块和消费记录模块的前台系统以及包括用户管理模块、器材管理模块、会员管理模块的后台系统。另外,系统还进行了数据安全设计,并添加了用户的访问控制,建立了一个完整、健壮、安全稳定的美容院会员管理系统。
由于时间限制和本人能力条件有限,还存在一些不足,今后也会出现许多新的开发技术,未来还可以对程序做出如下改进:
(1)优化程序页面,使页面更加美观且方便操作;
(2)优化信息搜索功能,提供多条件选择查询搜索;
(3)进一步提高使用程序的安全性,使其更加健壮;
(4)优化数据和代码,提升软件效率,方便维护和扩展。
参考文献
[1]张蒙蒙,曹成茂.基于MVC框架的会员管理系统的设计与实现[J].滁州学院学报,2021,23(05):27-32.
[2]黄志超,雷学峰.会员管理与备份系统的设计与实现[J].信息与电脑(理论版),2021,33(15):137-140.
[3]姜志敏,杨欢欢.在线化生存下的会员管理[J].中国药店,2021(05):74-77.
[4]梁增华,张书锋,尤澜涛.商业零售会员管理系统的设计与实现[J].电脑知识与技术,2021,17(05):67-70.
[5]徐驰. 基于分布式的会员管理系统的设计与实现[D].西安电子科技大学,2020.
[6]王娟,马薇.基于.NET的协会会员管理系统的设计与实现[J].电子技术与软件工程,2020(05):169-170.
[7]李坤. 大连宜家会员关系管理优化策略研究[D].大连理工大学,2019.
[8]段清阳. 基于会员分类的会员关系管理应用研究[D].长安大学,2019.
[9]罗苑瑜.PDCA循环法在会员管理制度的运用[J].管理观察,2019(05):88-89.
[10]顾宏. 高尔夫会员信息管理系统的设计与开发[D].湖北工业大学,2018.
[11]孙文宇. 电视台全媒体客户资源信息管理系统的设计与实现[D].山东大学,2018.
[12]周超. 会员管理系统运营支撑子系统的研究与实现[D].北京邮电大学,2018.
[13]泛舟.会员数据的“价值”[J].中国药店,2018(01):28.
[14]张朦博轩. 基于微信公众平台的电子会员信息管理系统研发[D].北京工业大学,2018.
致谢
时光飞逝,转眼间我在学校的这些年生活即将结束,回顾这几年的学习生活,收获良多,既有幸福也有难过,学校生活的结束对于我来说也是一个新的开始。论文即将完成,在此,我心中有许多想要感谢的人。首先感谢我的导师,不仅在学习研究方面加以指导,也在生活和为人处世上给予帮助。还要感谢授课老师,你们严谨的学术精神和积极向上的工作态度都在激励我的成长和进步。感谢多年来一直生活在一起的室友,谢谢你们多年来的陪伴和照顾。最后,要感谢各位论文评审老师,感谢您们在百忙之中抽空评阅本论文并给出宝贵的意见和建议。