美妆商城系统 SpringBoot + Vue 【毕业设计 资料 + 源码】

简介: 这篇文章介绍了一个使用SpringBoot + Vue + Mybatis + Mysql技术栈开发的美妆商城系统,包括系统功能划分、部分页面截图和前后端源码示例,并提供了GitHub上的源码链接。

一、前言

使用技术栈 SpringBoot + Vue + Mybatis + Mysql
该系统只要稍微修改,就可以作为其它类似的商城系统

具体功能划分如下图所示,这里不在细说。源码已经分享到GitHub:仓库地址:美妆商城系统源码 目前本人 技术有效,如有BUG 或者 好的建议 请提出。我会进一步完善该系统。

在这里插入图片描述

二、功能划分

1.1 用户功能

用户功能划分如下

在这里插入图片描述

1.2 管理员功能

管理员功能划分如下,同时包含普通用户的所有功能。主要涉及 后台管理。

在这里插入图片描述

三、部分页面

1.1 用户部分页面截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1.2 管理员部分页面截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、部分源码

后台java代码

    @PostMapping("/login")
    public Result<Account> login(@RequestBody Account account, HttpServletRequest request) {
        if (StrUtil.isBlank(account.getName()) || StrUtil.isBlank(account.getPassword()) || account.getLevel() == null) {
            throw new CustomException(ResultCode.PARAM_LOST_ERROR);
        }
        Integer level = account.getLevel();
        Account login = new Account();
        if (1 == level) {
            login = adminInfoService.login(account.getName(), account.getPassword());
        }
        if (3 == level) {
            login = userInfoService.login(account.getName(), account.getPassword());
        }

        request.getSession().setAttribute("user", login);
        return Result.success(login);
    }

    @PostMapping("/register")
    public Result<Account> register(@RequestBody Account account) {
        Integer level = account.getLevel();
        Account login = new Account();
        if (1 == level) {
            AdminInfo info = new AdminInfo();
            BeanUtils.copyProperties(account, info);
            info.setAccount(0D);
            login = adminInfoService.add(info);
        }
        if (3 == level) {
            UserInfo info = new UserInfo();
            BeanUtils.copyProperties(account, info);
            info.setAccount(0D);
            login = userInfoService.add(info);
        }

        return Result.success(login);
    }

    @GetMapping("/logout")
    public Result logout(HttpServletRequest request) {
        request.getSession().setAttribute("user", null);
        return Result.success();
    }

页面代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="pragma" content="no-cache"/>
    <meta http-equiv="content-type" content="no-cache, must-revalidate"/>
    <meta http-equiv="expires" content="Wed, 26 Feb 1997 08:21:57 GMT"/>
    <title>购物车信息</title>
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <link href="css/my.css" rel="stylesheet">
    <link href="css/nav.css" rel="stylesheet">

    <style>
        [v-cloak] {
            display: none;
        }
        td{
            vertical-align: middle !important;
        }
    </style>
</head>
<body style="background-color: #f2dede">
<div id="wrapper" v-cloak>
    <!-- 头部开始 -->
    <div style="width: 100%; height: 30px; line-height: 30px; background-color: #518657">
        <div class="container">
            <div class="col-md-6" style="text-align: left">
                <a href="/end/page/login.html" target="_blank" style="color: white; margin-right: 20px" >登录</a>
                <a href="/end/page/register.html" target="_blank" style="color: white">注册</a>
            </div>
            <div class="col-md-6" style="color: yellow; text-align: right">
                <span v-if="user.name">
                    欢迎您,{
  
  {user.name}}
                    <a style="color: white" href="javascript:void(0)" @click="logout">退出</a>
                    <a v-if="isCollect" style="margin-left: 10px" href="collectInfo.html">收藏夹</a>
                </span>
            </div>
        </div>
        <hr>
    </div>
    <div class="container">
        <div style="width: 100%; height: 80px;border-bottom: 1px solid #ccc">
            <div class="col-md-3" style="height: 80px; display: flex; justify-content: left;align-items: center;
                     font-size: 30px;">
                <a style="color: red;" href="/front/index.html">MakeUp美妆网</a>
            </div>
            <div class="col-md-9">
                <div class="row" style="height: 80px; line-height: 80px">
                    <ul style="display: flex;">
                        <li class="nav-item"><a href="index.html">首页</a></li>
                        <li class="nav-item"><a href="advertiserInfo.html">公告信息</a></li>
                        <li class="nav-item"><a href="messageInfo.html">在线交流</a></li>
                        <li class="nav-item"><a href="cartInfo.html" class="nav-item-active">购物车信息</a></li>
                        <li class="nav-item"><a href="orderInfo.html">订单信息</a></li>
                        <li class="nav-item"><a href="commentInfo.html">评价信息</a></li>

                        <li class="nav-item"><a href="javascript:void(0)" @click="personalPage">个人信息</a></li>
                        <li class="nav-item" v-if="isShow"><a href="/end/page/index.html" target="_blank">进入后台系统</a>
                        </li>
                    </ul>
                </div>
            </div>
        </div>
    </div>
    <!-- 头部结束 -->
    <div class="container"  style="margin-top: 20px">
        <div class="col-md-12">
            <h4 style="margin: 10px 0">全部化妆品({
  
  {totalCount}})</h4>
            <table class="table table-bordered table-hover">
                <thead>
                <tr style="background-color: #f8eeee">
                    <th>商品</th>
                    <th>单价</th>
                    <th>数量</th>
                    <th>折扣</th>
                    <th>小计</th>
                    <th>操作</th>
                </tr>
                </thead>
                <tbody>
                <tr v-for="(item,index) in cartData" :key="item.id">
                    <td style="width:230px;">
                        <div style="display: flex;align-items: center">
                            <img style="width: 50%; height: 50%" :src=item.imgSrc>
                            <span style="font-size: 12px; margin-left: 10px">{
  
  {item.name}}</span>
                        </div>
                    </td>
                    <td>{
  
  {item.price}}</td>
                    <td>{
  
  {item.count}}</td>
                    <td>{
  
  {item.discountDesc}}</td>
                    <td>{
  
  {item.total}}</td>
                    <td>
                        <button class="btn btn-danger btn-xs" @click="del(item)">删除</button>
                    </td>
                </tr>
                </tbody>
            </table>
            <div class="layui-row" style="text-align: right">
                <div style="margin: 10px 0">应付金额:<span style="color: red; font-weight: bold;margin-left: 10px">¥ {
  
  {totalMoney}}</span></div>
                <button class="btn btn-info" @click="submitCart()">提交订单</button>
            </div>
        </div>
    </div>
</div>

<script src="js/jquery-1.10.2.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/jquery.metisMenu.js"></script>
<script src="js/vue2.6.11/vue.min.js"></script>
<script src="js/vue2.6.11/axios.js"></script>
<script src="js/my.js"></script>

<script>
    new Vue({
        el: '#wrapper',
        data: {
            isCollect: false,
            cartData: [],
            totalCount: 0,
            user: {},
            totalMoney: 0,
            isShow: false
        },

        created: function() {
            this.loadCartInfo();
        },

        methods: {
            loadCartInfo() {
                axios.get('/auth').then(res => {
                    if (res.data.code === '0') {
                        this.user = res.data.data;
                        if (this.user.level !== 3) {
                            this.isShow = true;
                        }
                        axios.get("/cartInfo?userId=" + this.user.id + "&level=" + this.user.level).then(res => {
                            if (res.data.code === '0') {
                                let cartData = res.data.data;
                                cartData.forEach(item => {
                                    this.totalCount += item.count;
                                    item.imgSrc = '/front/img/goods/default.png';
                                    // 获取展示图
                                    if (item.fileIds) {
                                        let fileIds = JSON.parse(item.fileIds);
                                        if (fileIds.length) {
                                            item.imgSrc = '/files/download/' + fileIds[0];
                                        }
                                    }
                                    // 获取小计
                                    item.total = (item.count * item.price * item.discount).toFixed(2);
                                    this.totalMoney += parseFloat(item.total);
                                    // 获取折扣展示
                                    item.discountDesc = item.discount < 1 ? item.discount * 10 + ' 折' : '-'
                                });
                                this.cartData = cartData;
                            } else {
                                alert(res.data.msg);
                            }
                        });
                    } else {
                        alert('请先登录');
                        location.href = '/end/page/login.html';
                    }
                })
            },
            del(data) {
                if (confirm('确定删除订单吗?')) {
                    axios.delete('/cartInfo/goods/' + this.user.id + '/' + this.user.level + '/' + data.id).then(res => {
                        if (res.data.code === '0') {
                            alert('删除成功');
                            this.loadCartInfo();
                        }
                    })
                }

            },
            submitCart() {
                if (!this.cartData.length) {
                    alert('未选择商品');
                    return;
                }
                let data = {userId: this.user.id, level: this.user.level, totalPrice: this.totalMoney, goodsList: this.cartData};
                axios.post('/orderInfo', data).then(res => {
                    if (res.data.code === '0') {
                        location.href = '/front/orderInfo.html'
                    } else {
                        alert(res.data.msg);
                    }
                })
            },
            logout() {
                axios.get("/logout").then(res => {
                    if(res.data.code === '0') {
                        location.href = '/front/index.html';
                    } else {
                        msg('error', res.data.msg);
                    }
                })
            }
        }
    })
</script>
</body>
</html>
相关文章
|
24天前
|
Java 关系型数据库 MySQL
水果商城系统 SpringBoot+Vue
这篇文章介绍了一个使用SpringBoot+Vue开发的前台和管理员端的水果商城系统,包括用户功能如登录、注册、商品浏览、购物车、订单处理等,以及管理员功能如用户管理、商品管理、新闻公告管理等。
水果商城系统 SpringBoot+Vue
|
15天前
|
JavaScript 前端开发 小程序
【项目实战】SpringBoot+vue+iview打造一个极简个人博客系统
这是一个基于 SpringBoot+MybatisPlus+Vue+Iview 技术栈构建的个人极简博客系统,适合初学者实战练习。项目包含文章分类、撰写文章、标签管理和用户管理等功能,代码简洁并配有详细注释,易于上手。此外,该项目也可作为毕业设计的基础进行二次开发。
61 0
【项目实战】SpringBoot+vue+iview打造一个极简个人博客系统
|
23天前
|
安全 Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+jsp实现的健身房管理系统(含教程&源码&数据库数据)
本文介绍了一款基于Spring Boot和JSP技术实现的健身房管理系统。随着健康生活观念的普及,健身房成为日常锻炼的重要场所,高效管理会员信息、课程安排等变得尤为重要。该系统旨在通过简洁的操作界面帮助管理者轻松处理日常运营挑战。技术栈包括:JDK 1.8、Maven 3.6、MySQL 8.0、JSP、Shiro、Spring Boot 2.0等。系统功能覆盖登录、会员管理(如会员列表、充值管理)、教练管理、课程管理、器材管理、物品遗失管理、商品管理及信息统计等多方面。
|
21天前
|
JavaScript Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+vue实现的前后端分离的考试管理系统(含教程&源码&数据库数据)
在数字化时代背景下,本文详细介绍了如何使用Spring Boot框架结合Vue.js技术栈,实现一个前后端分离的考试管理系统。该系统旨在提升考试管理效率,优化用户体验,确保数据安全及可维护性。技术选型包括:Spring Boot 2.0、Vue.js 2.0、Node.js 12.14.0、MySQL 8.0、Element-UI等。系统功能涵盖登录注册、学员考试(包括查看试卷、答题、成绩查询等)、管理员功能(题库管理、试题管理、试卷管理、系统设置等)。
毕设项目&课程设计&毕设项目:基于springboot+vue实现的前后端分离的考试管理系统(含教程&源码&数据库数据)
|
24天前
|
Web App开发 前端开发 关系型数据库
基于SpringBoot+Vue+Redis+Mybatis的商城购物系统 【系统实现+系统源码+答辩PPT】
这篇文章介绍了一个基于SpringBoot+Vue+Redis+Mybatis技术栈开发的商城购物系统,包括系统功能、页面展示、前后端项目结构和核心代码,以及如何获取系统源码和答辩PPT的方法。
|
14天前
|
前端开发 Java Spring
Spring与Angular/React/Vue:当后端大佬遇上前端三杰,会擦出怎样的火花?一场技术的盛宴,你准备好了吗?
【8月更文挑战第31天】Spring框架与Angular、React、Vue等前端框架的集成是现代Web应用开发的核心。通过RESTful API、WebSocket及GraphQL等方式,Spring能与前端框架高效互动,提供快速且功能丰富的应用。RESTful API简单有效,适用于基本数据交互;WebSocket支持实时通信,适合聊天应用和数据监控;GraphQL则提供更精确的数据查询能力。开发者可根据需求选择合适的集成方式,提升用户体验和应用功能。
46 0
|
25天前
|
SQL 前端开发 NoSQL
SpringBoot+Vue 实现图片验证码功能需求
这篇文章介绍了如何在SpringBoot+Vue项目中实现图片验证码功能,包括后端生成与校验验证码的方法以及前端展示验证码的实现步骤。
SpringBoot+Vue 实现图片验证码功能需求
|
24天前
|
JavaScript
SpringBoot+Vue+ElementUI 实现视频播放 轮播图效果
这篇文章介绍了如何在SpringBoot+Vue+ElementUI项目中使用vue-awesome-swiper插件实现视频播放轮播图效果,包括安装插件、引入项目和使用案例的步骤。
SpringBoot+Vue+ElementUI 实现视频播放 轮播图效果
|
24天前
|
JavaScript 前端开发 Java
SpringBoot + Vue 前端后分离项目精进版本
这篇文章详细介绍了一个基于SpringBoot + Vue的前后端分离项目的搭建过程,包括前端Vue项目的初始化、依赖安装、页面创建和路由配置,以及后端SpringBoot项目的依赖添加、配置文件修改、代码实现和跨域问题的解决,最后展示了项目运行效果。
SpringBoot + Vue 前端后分离项目精进版本
|
24天前
|
缓存 前端开发 JavaScript
前后端分离 SpringBoot+Vue商城买卖系统通杀版本。大家可以参考学习一下
这篇文章介绍了一个使用SpringBoot+Vue开发的前后端分离商城系统,包括技术架构、开发环境、实现的功能以及项目截图,并展示了普通用户和商家端的功能界面。
前后端分离 SpringBoot+Vue商城买卖系统通杀版本。大家可以参考学习一下