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

news2024/11/19 5:55:21

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。

一、前言

使用技术栈 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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1210665.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JimuReport积木报表 v1.6.5 版本发布—免费报表工具

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…

JUC“阻塞队列”水很深,你把握不住!

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 提到阻塞队列&#xff…

java入门,从CK导一部分数据到mysql

一、需求 需要从生产环境ck数据库导数据到mysql&#xff0c;数据量大约100w条记录。 二、处理步骤 1、这里的关键词是生产库&#xff0c;第二就是100w条记录。所以处理数据的时候就要遵守一定的规范。首先将原数据库表进行备份&#xff0c;或者将需要导出的数据建一张新的表了…

界面控件Kendo UI for jQuery R3 2023 - 发布全新金字塔图表类型

Telerik & Kendo UI R3 2023版本带来了30多个新的UI组件&#xff0c;丰富的设计系统文档、多种自定义选项、支持Linux的现代化报表体验等。借助R3 2023&#xff0c;开发人员能够在现代框架上快速构建强大的数字体验功能&#xff0c;满足不断变化的业务需求等。今天将为大家…

vcenter server (部署较大服务器)

作用 VMware vCenter是集中管理控制台&#xff0c;管理所有安装了VMware ESXI的主机 使用vCenter Server可以对虚拟机进行实时的监控&#xff0c;包括服务器硬件、网络和共享的存储&#xff0c;并可以进行故障诊断。 可以查看实时的统计和图表&#xff0c;监控虚拟主机和资源…

【NodeJS】Nodejs安装及环境配置

下载安装包 网址&#xff1a;https://nodejs.org/en 安装程序 1.下载完成后&#xff0c;双击安装包&#xff0c;进行安装&#xff0c;一路默认配置 nxet 即可&#xff0c;安装路劲给默认在C盘&#xff0c;或者选择其他位置&#xff0c;当前教程默认C盘 2.下图根据本身的…

创造者设计模式

Bike package com.jmj.pattern.builder.demo01;public class Bike {private String frame;//车架private String seat;//车座public String getFrame() {return frame;}public void setFrame(String frame) {this.frame frame;}public String getSeat() {return seat;}public…

【京东API】商品详情+搜索商品列表接口

利用电商API获取数据的步骤 1.申请API接口&#xff1a;首先要在相应电商平台上注册账号并申请API接口。 2.获取授权&#xff1a;在账号注册成功后&#xff0c;需要获取相应的授权才能访问电商API。 3.调用API&#xff1a;根据电商API提供的请求格式&#xff0c;通过编程实现…

如何使用Servlet写一个简单的网站

文章目录 前言1. 创建项目2. 引入依赖3. 创建目录4. 编写代码5. 打包程序6. 部署7.验证程序将 tomcat 集成到 idea 中 前言 前面我们学习了Java中常用的 HTTP 服务器 tomcat 的安装和使用&#xff0c;那么今天我们将使用这个 HTTP 服务器为大家写一个简单的网站&#xff0c;这…

Linux之输入输出重定向和管道

一、是什么 linux中有三种标准输入输出&#xff0c;分别是STDIN&#xff0c;STDOUT&#xff0c;STDERR&#xff0c;对应的数字是0、1、2&#xff1a; STDIN 是标准输入&#xff0c;默认从键盘读取信息STDOUT 是标准输出&#xff0c;默认将输出结果输出至终端STDERR 是标准错误…

新版软考高项试题分析精选(三)

请点击↑关注、收藏&#xff0c;本博客免费为你获取精彩知识分享&#xff01;有惊喜哟&#xff01;&#xff01; 1、项目整体管理要综合考虑项目各个相关过程&#xff0c;围绕整体管理特点&#xff0c;以下说法中&#xff0c;&#xff08; &#xff09;是不正确的。 A.项目的…

【2021集创赛】 RISC-V杯三等奖:基于E203 处理器的SM4算法硬件加速

杯赛题目&#xff1a;基于蜂鸟E203 RISC-V处理器内核的SoC设计 参赛要求&#xff1a;研究生组/本科生组 赛题内容&#xff1a; 基于芯来科技的开源蜂鸟E203 Demo SoC进行扩展&#xff0c;在限定的可编程逻辑平台上构建面向专用应用领域&#xff08;譬如人工智能、信息安全、工业…

194. 二叉树的最近公共祖先

题目 题解 递归 def lowestCommonAncestor(root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:if not root or root p or root q:return rootleft lowestCommonAncestor(root.left, p, q)right lowestCommonAncestor(root.right, p, q)if not left:return right…

2.4G射频收发芯片XL2400P,收发一体,性能优异

XL2400P 系列芯片是工作在 2.400~2.483GHz 世界通用 ISM 频段的单片无线收发芯片。该芯片集成射频收发机、频率收生器、晶体振荡器、调制解调器等功能模块&#xff0c;并且支持一对多组网和带 ACK 的通信模式。发射输出功率、工作频道以及通信数据率均可配置。芯片已将多颗外围…

全志R128基础组件开发指南——图像采集

图像采集 CSI&#xff08;DVP&#xff09; 图像采集 SENSOR -> CSI 通路 CSI &#xff08;CMOS sensor interface&#xff09;接口时序上可支持独立 SYNC 和嵌入 SYNC(CCIR656)。支持接收 YUV422 或 YUV420 数据。 VSYNC 和HSYNC 的有效电平可以是正极性&#xff0c;也可…

常用网络命令(实习报告)

南京信息工程大学 实验&#xff08;实习&#xff09;报告 实验&#xff08;实习&#xff09;名称 常用网络命令 实验&#xff08;实习&#xff09;日期 2017/5/25 得分 指导教师 *** 专业 网络工程 年级 2015 班次 1 姓名 *** …

Mybatis报错找不到参数解决之编译保留参数名称

Hi, I’m Shendi Mybatis报错找不到参数解决之编译保留参数名称 需求场景 在使用 Mybatis 的过程中&#xff0c;对于函数参数&#xff0c;通常会加上 Param 注解来给参数命名&#xff0c;以让 Mybatis 找到参数。 有的时候忘记添加&#xff0c;执行时就会报找不到参数的错误&…

spring cloud之网关

Gateway网关(*) 什么是网关 # 1.说明 - 网关统一服务入口&#xff0c;可方便实现对平台众多服务接口进行管控。 - 网关 路由转发 过滤器路由转发&#xff1a;接收一切外界请求&#xff0c;转发到后端的微服务上去过滤器&#xff1a;在服务网关中可以完成一系列的横切功能&a…

学Diffusion前需要储备的一些知识点

自学Diffusion是非常困难的&#xff0c;尤其是到了VAE和VI这里基本找不到比较好的中文资料&#xff0c;甚至是涉及到一些重参数化&#xff0c;高斯混合之类的问题摸不着来龙去脉。在本文中&#xff0c;基本不会涉及公式&#xff0c;只有intuition和理解&#xff0c;如果要看公式…

Pytorch CUDA CPP简易教程,在Windows上操作

文章目录 前言一、使用的工具二、学习资源分享三、libtorch环境配置1.配置CUDA、nvcc、cudnn2.下载libtorch3.CLion配置libtorch4.CMake Application指定Environment variables5.测试libtorch 四、PyTorch CUDA CPP项目流程1.使用CLion结合torch extension编写可以调用cuda的C代…