基于springboot的美容院管理系统美容项目预约-JAVA.VUE【源码论文】

  博主介绍:👉全网个人号和企业号粉丝40W+,每年辅导几千名大学生较好的完成毕业设计,专注计算机软件领域的项目研发,不断的进行新技术的项目实战👈
⭐️热门专栏推荐订阅⭐️ 订阅收藏起来,防止下次找不到

🔎千套JAVA项目实战持续更新中~

🔎百套小程序APP项目实战持续更新中~

🔎百套Python实战项目持续更新中~
有需求的各位可以先收藏起来,还有大家在毕设选题,开题报告有疑惑的都可以找我,给你参考意见,需要开题模板的可以私信留言告诉我

❤️文末获取源码联系❤️        ⚠️一定要先收藏⚠️

第四章 系统设计

设计一个系统不单单是设计系统的页面,可以说系统设计其本质是一个结合了众多设计过程的比较复杂的系统工程。一般来说,在完成系统设计时,需要了解和掌握很多设计的知识,有界面布局技术的知识,页面采用的字体和颜色的运用,还有页面空白的规范使用等,如何将这些元素进行组合,让页面可以直观表达信息内容的同时,也能维持页面整体的美观。

4.1 系统设计思想

系统开发必然需要统一设计思想。根据这个设计思想指导系统的开发,可以加快系统开发进程。根据目前用户对美容院管理系统的需求,确定下述原则即为本系统的设计思想。

(1)实用性:本系统依照用户需求设计功能,遵循用户使用方便的原则,把用户在实际工作中的各个操作细节也充分考虑进来,让使用者在没有系统操作说明书的情况下,也能很容易的完成系统的操作。

(2)先进性:为了让本系统具备高性能,设计时,需要把目前的各种成熟技术加以考虑,比如软件开发技术也要考虑进去,比如计算机技术也需要进行考虑。对于系统结构的选择,本系统将毫不犹豫的选择成熟先进的B/S结构,方便开发的同时,对于后期的维护也提供了便利。

(3)高安全性:设计本系统时,对于一些系统的关键数据要严加看管,比如管理员本人的账号和密码,一定要加密保存在数据库里面。除此以外,也需要充分使用安全措施对用户的共享资源进行保护。

(4)可维护性:设计时,要提前考虑本系统的可维护性,因为一个便于维护的系统在后期产生的维护成本将会大大降低。维护一般包括软硬件的维护还有对于网络的维护等。

(5)可扩展性:重新开发一个新系统相比在原有系统上升级,会花费大量的资金和精力,由此,一个好的系统必定具备良好的可扩展性。在用户需求变动的情况下,可以通过系统的更新和升级来持续满足用户需求,这样的系统就具备了可扩展性。

4.2功能结构设计

这部分内容使用结构图这样的工具,显示设计结果,设计的管理员功能见下图。管理员管理美容用品,美容项目,美容部位,管理技师预约,管理订单,统计美容用品销量。

图4-1 管理员功能结构图

这部分内容使用结构图这样的工具,显示设计结果,设计的技师功能见下图。技师统计美容用品库存,管理美容项目,审核会员预约信息。

图4-2 技师功能结构图

这部分内容使用结构图这样的工具,显示设计结果,设计的前台功能见下图。前台负责普通用户与会员的管理,审核会员预约信息。

图4-3 前台功能结构图

这部分内容使用结构图这样的工具,显示设计结果,设计的普通用户功能见下图。普通用户购买美容用品,管理购买订单,管理收货地址。

图4-4 普通用户功能结构图

这部分内容使用结构图这样的工具,显示设计结果,设计的会员功能见下图。会员购买美容用品,预约美容项目,管理预约信息以及购买订单。

图4-5 会员功能结构图

4.3数据库设计

现如今,关系数据库已经广泛占据了市场。其具有坚实的理论基础,并且它可以很好的支持SQL这样的查询语言。所以,大部分程序的后台数据库几乎都是关系数据库。它们被用于长期对程序数据进行保存,采用的方式就是正确使用SQL语句在数据库中完成数据的插入,修改,删除等操作。

4.3.1 数据库E-R图

系统设计的内容不仅仅是对功能进行模块设计,它也包括了对数据库进行设计。功能设计这部分内容已经完成了,接下来进行的数据库设计也要根据规定的流程进行。

数据库设计这部分内容也需要参照用户的需求来完成。同时为了方便展示数据库中存在的各种关系,需要使用到E-R图,并运用E-R图中常见的符号来表示用户需求中的数据内容。所以,在建立E-R模型前,需要把用户需求的数据信息进行拆分并分析,并确定实体,实体特征,还有它们之间的关联,然后选择某个绘制E-R模型的工具比如Visio,亿图,Navicat等,用规定的符号去表示这些数据。这些常用的符号分别是矩形,菱形,椭圆,它们表示的内容分别是实体,关系,属性。

(1)设计的美容项目实体,还有其属性见下图。

图4-3 美容项目实体属性图

(2)设计的会员实体,还有其属性见下图。

图4-4 会员实体属性图

(3)设计的美容用品实体,还有其属性见下图。

图4-7 实体间关系E-R图

4.3.2 数据库表结构

很多时候,在进行数据表的存储结构的设计时,都会遇到一些困扰,比如每张数据表如何命名,如何设计每张数据表里面的字段,如何为各个字段进行命名,以及如何设置字段的取值范围等信息。很多初学者,在进行表结构设计时,无论是对表进行命名,还是对字段进行命名,都是采用中文的方式,导致在编码阶段,在对数据进行操作时,总是报错,影响编码人员的开发速度,而且一旦数据表结构建立之后,后期进行修改也比较麻烦。因为设计数据表的结构,就意味着程序中需要长期保存的数据都是根据这样的结构进行保存的,在后面的使用中,无论是程序数据往数据表中写入,还是需要编辑或删除数据,都是按照这个规则进行。如此说来,设计数据库也是非常重要的任务,它关系到后面程序的开发,也关系到程序的运行使用。

通常在设计数据表结构时,会把前面设计的E-R图进行表结构的转化。把实体用来代表数据表,把其属性,也就是椭圆形代表的内容用来表示数据表中的字段,然后根据程序对于数据的存储要求,设计字段的类型和长度。比如用户的年龄可以用int(整数型),设置其长度为4或者6等。总之,数据表结构一旦建立,就可以往里面填充数据了。

表4.1 地址信息表

字段

类型

默认

注释

id (主键)

bigint(20)

主键

addtime

timestamp

CURRENT_TIMESTAMP

创建时间

userid

bigint(20)

用户id

address

varchar(200)

地址

name

varchar(200)

收货人

phone

varchar(200)

电话

isdefault

varchar(200)

是否默认地址[是/否]

表4.2 购物车信息表

字段

类型

默认

注释

id (主键)

bigint(20)

主键

addtime

timestamp

CURRENT_TIMESTAMP

创建时间

tablename

varchar(200)

meirongyongpin

商品表名

userid

bigint(20)

用户id

goodid

bigint(20)

商品id

goodname

varchar(200)

NULL

商品名称

picture

varchar(200)

NULL

图片

buynumber

int(11)

购买数量

price

float

NULL

单价

discountprice

float

NULL

会员价

表4.3 会员信息表

字段

类型

默认

注释

id (主键)

bigint(20)

主键

addtime

timestamp

CURRENT_TIMESTAMP

创建时间

huiyuanzhanghao

varchar(200)

会员账号

mima

varchar(200)

密码

huiyuanxingming

varchar(200)

会员姓名

xingbie

varchar(200)

NULL

性别

nianling

int(11)

NULL

年龄

shouji

varchar(200)

NULL

手机

shenfenzheng

varchar(200)

NULL

身份证

touxiang

varchar(200)

NULL

头像

money

float

0

余额

表4.4 技师信息表

字段

类型

默认

注释

id (主键)

bigint(20)

主键

addtime

timestamp

CURRENT_TIMESTAMP

创建时间

jishigonghao

varchar(200)

技师工号

mima

varchar(200)

密码

jishixingming

varchar(200)

技师姓名

xingbie

varchar(200)

NULL

性别

nianling

int(11)

NULL

年龄

lianxidianhua

varchar(200)

NULL

联系电话

shenfenzheng

varchar(200)

NULL

身份证

zhaopian

varchar(200)

NULL

照片

money

float

0

余额

表4.5 美容部位信息表

字段

类型

默认

注释

id (主键)

bigint(20)

主键

addtime

timestamp

CURRENT_TIMESTAMP

创建时间

meirongbuwei

varchar(200)

NULL

美容部位

表4.6 美容项目信息表

字段

类型

默认

注释

id (主键)

bigint(20)

主键

addtime

timestamp

CURRENT_TIMESTAMP

创建时间

xiangmumingcheng

varchar(200)

NULL

项目名称

xiangmutupian

varchar(200)

NULL

项目图片

meirongbuwei

varchar(200)

NULL

美容部位

shiyongnianling

varchar(200)

NULL

适用年龄

xiangqing

longtext

NULL

详情

kaishishijian

date

NULL

开始时间

jishigonghao

varchar(200)

NULL

技师工号

jishixingming

varchar(200)

NULL

技师姓名

lianxidianhua

varchar(200)

NULL

联系电话

表4.7 美容用品信息表

字段

类型

默认

注释

id (主键)

bigint(20)

主键

addtime

timestamp

CURRENT_TIMESTAMP

创建时间

meirongpinming

varchar(200)

NULL

美容品名

tupian

varchar(200)

NULL

图片

leixing

varchar(200)

NULL

类型

kucun

int(11)

NULL

库存

shiyongfangfa

longtext

NULL

使用方法

shiyongnianling

varchar(200)

NULL

适用年龄

meirongbuwei

varchar(200)

NULL

美容部位

meironggongxiao

longtext

NULL

美容功效

price

float

价格

表4.8 订单信息表

字段

类型

默认

注释

id (主键)

bigint(20)

主键

addtime

timestamp

CURRENT_TIMESTAMP

创建时间

orderid

varchar(200)

订单编号

tablename

varchar(200)

meirongyongpin

商品表名

userid

bigint(20)

用户id

goodid

bigint(20)

商品id

goodname

varchar(200)

NULL

商品名称

picture

varchar(200)

NULL

商品图片

buynumber

int(11)

购买数量

price

float

0

价格/积分

discountprice

float

0

折扣价格

total

float

0

总价格/总积分

discounttotal

float

0

折扣总价格

type

int(11)

1

支付类型

status

varchar(200)

NULL

状态

address

varchar(200)

NULL

地址

tel

varchar(200)

NULL

电话

consignee

varchar(200)

NULL

收货人

表4.9 普通用户信息表

字段

类型

默认

注释

id (主键)

bigint(20)

主键

addtime

timestamp

CURRENT_TIMESTAMP

创建时间

zhanghao

varchar(200)

账号

mima

varchar(200)

密码

xingming

varchar(200)

姓名

xingbie

varchar(200)

NULL

性别

nianling

int(11)

NULL

年龄

shouji

varchar(200)

NULL

手机

shenfenzheng

varchar(200)

NULL

身份证

zhaopian

varchar(200)

NULL

照片

money

float

0

余额

表4.10 前台信息表

字段

类型

默认

注释

id (主键)

bigint(20)

主键

addtime

timestamp

CURRENT_TIMESTAMP

创建时间

qiantaizhanghao

varchar(200)

前台账号

mima

varchar(200)

密码

qiantaixingming

varchar(200)

前台姓名

xingbie

varchar(200)

NULL

性别

nianling

int(11)

NULL

年龄

shouji

varchar(200)

NULL

手机

zhaopian

varchar(200)

NULL

照片

money

float

0

余额

表4.11 管理员信息表

字段

类型

默认

注释

id (主键)

bigint(20)

主键

username

varchar(100)

用户名

password

varchar(100)

密码

role

varchar(100)

管理员

角色

addtime

timestamp

CURRENT_TIMESTAMP

新增时间

表4.12 销量信息表

字段

类型

默认

注释

id (主键)

bigint(20)

主键

addtime

timestamp

CURRENT_TIMESTAMP

创建时间

meirongpinming

varchar(200)

NULL

美容品名

xiaoshoushizhang

varchar(200)

NULL

销售时长

xiaoshouliang

int(11)

NULL

销售量

leixing

varchar(200)

NULL

类型

zhaopian

varchar(200)

NULL

照片

表4.13 预约信息表

字段

类型

默认

注释

id (主键)

bigint(20)

主键

addtime

timestamp

CURRENT_TIMESTAMP

创建时间

xiangmumingcheng

varchar(200)

NULL

项目名称

huiyuanzhanghao

varchar(200)

NULL

会员账号

huiyuanxingming

varchar(200)

NULL

会员姓名

shouji

varchar(200)

NULL

手机

zhaopian

varchar(200)

NULL

照片

yuyueshijian

datetime

NULL

预约时间

yuyuexiangqing

varchar(200)

NULL

预约详情

zhidingjishi

varchar(200)

NULL

指定技师

sfsh

varchar(200)

是否审核

shhf

longtext

NULL

审核回复

userid

bigint(20)

NULL

用户id


第五章 系统实现

前面做的所有工作,都是为了给系统实现做准备。在系统实现期间,需要根据设计方案执行,通过运用编码技术实现一个可以处理事务的系统。

5.1管理员功能实现

5.1.1 美容部位管理

实现管理员权限的美容部位管理功能,其运行效果见下图。管理员修改美容部位信息,删除美容部位信息,新增美容部位信息。

图5-1 美容部位管理页面

5.1.2 销量信息统计

实现管理员权限的销量信息统计功能,其运行效果见下图。管理员通过销量统计报表查看各种美容用品的销量信息。

图5-2 销量信息统计页面

5.1.3 已支付订单

实现管理员权限的已支付订单功能,其运行效果见下图。管理员查看已支付订单信息,查看下单人提供的收货地址,然后进行订单发货。

图5-3 已支付订单页面

5.2技师功能实现

5.2.1 统计美容用品库存

实现技师权限的统计美容用品库存功能,其运行效果见下图。技师可以通过统计报表查看各种美容用品对应的现有库存量。

图5-4 统计美容用品库存页面

5.2.2 预约信息管理

实现技师权限的预约信息管理功能,其运行效果见下图。会员预约技师提供的美容项目,技师则需要进行查看和审核。

图5-5 预约信息管理页面

5.3 前台功能实现

5.3.1 普通用户管理

实现前台权限的普通用户管理功能,其运行效果见下图。普通用户的基本信息也能让前台进行增删改查管理。

图5-6 普通用户管理页面

5.3.2 会员管理

实现前台权限的会员管理功能,其运行效果见下图。会员的基本信息可以让前台进行修改,也能让前台进行查询或删除。

图5-7 会员管理页面

5.4 普通用户功能实现

5.4.1 美容用品

实现普通用户权限的美容用品功能,其运行效果见下图。普通用户查看美容用品,在本页面购买美容用品,或把美容用品添加购物车。

图5-8 美容用品页面

5.4.2 购物车

实现普通用户权限的购物车功能,其运行效果见下图。普通用户在本模块购买美容用品,需要提供收货地址,然后选择支付方式支付订单。

图5-9 购物车页面

5.4.3 我的订单

实现普通用户权限的我的订单功能,其运行效果见下图。普通用户在本模块查看不同状态的订单,已支付订单在未发货前也能退款。

图5-10 我的订单页面

JAVA后端代码实现

package com.controller;
 
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
 
import javax.servlet.http.HttpServletRequest;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
 
import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.TokenEntity;
import com.entity.UserEntity;
import com.service.TokenService;
import com.service.UserService;
import com.utils.CommonUtil;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.ValidatorUtils;
 
/**
 * 登录相关
 */
@RequestMapping("users")
@RestController
public class UserController{
	
	@Autowired
	private UserService userService;
	
	@Autowired
	private TokenService tokenService;
 
	/**
	 * 登录
	 */
	@IgnoreAuth
	@PostMapping(value = "/login")
	public R login(String username, String password, String captcha, HttpServletRequest request) {
		UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
		if(user==null || !user.getPassword().equals(password)) {
			return R.error("账号或密码不正确");
		}
		String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
		return R.ok().put("token", token);
	}
	
	/**
	 * 注册
	 */
	@IgnoreAuth
	@PostMapping(value = "/register")
	public R register(@RequestBody UserEntity user){
//    	ValidatorUtils.validateEntity(user);
    	if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
    		return R.error("用户已存在");
    	}
        userService.insert(user);
        return R.ok();
    }
 
	/**
	 * 退出
	 */
	@GetMapping(value = "logout")
	public R logout(HttpServletRequest request) {
		request.getSession().invalidate();
		return R.ok("退出成功");
	}
	
	/**
     * 密码重置
     */
    @IgnoreAuth
	@RequestMapping(value = "/resetPass")
    public R resetPass(String username, HttpServletRequest request){
    	UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
    	if(user==null) {
    		return R.error("账号不存在");
    	}
    	user.setPassword("123456");
        userService.update(user,null);
        return R.ok("密码已重置为:123456");
    }
	
	/**
     * 列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,UserEntity user){
        EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
    	PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));
        return R.ok().put("data", page);
    }
 
	/**
     * 列表
     */
    @RequestMapping("/list")
    public R list( UserEntity user){
       	EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
      	ew.allEq(MPUtil.allEQMapPre( user, "user")); 
        return R.ok().put("data", userService.selectListView(ew));
    }
 
    /**
     * 信息
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") String id){
        UserEntity user = userService.selectById(id);
        return R.ok().put("data", user);
    }
    
    /**
     * 获取用户的session用户信息
     */
    @RequestMapping("/session")
    public R getCurrUser(HttpServletRequest request){
    	Long id = (Long)request.getSession().getAttribute("userId");
        UserEntity user = userService.selectById(id);
        return R.ok().put("data", user);
    }
 
    /**
     * 保存
     */
    @PostMapping("/save")
    public R save(@RequestBody UserEntity user){
//    	ValidatorUtils.validateEntity(user);
    	if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
    		return R.error("用户已存在");
    	}
        userService.insert(user);
        return R.ok();
    }
 
    /**
     * 修改
     */
    @RequestMapping("/update")
    public R update(@RequestBody UserEntity user){
//        ValidatorUtils.validateEntity(user);
    	UserEntity u = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername()));
    	if(u!=null && u.getId()!=user.getId() && u.getUsername().equals(user.getUsername())) {
    		return R.error("用户名已存在。");
    	}
        userService.updateById(user);//全部更新
        return R.ok();
    }
 
    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        userService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
}

源码获取

大家点赞、收藏、关注 ,让更多需要的同学看到

不同开发语言专栏推荐订阅

 🔎千套JAVA项目实战持续更新中~

🔎百套小程序APP项目实战持续更新中~

🔎百套Python实战项目持续更新中~

👇下方有我的微信名片👇

  • 44
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值