基于java SpringBoot和Vue零食销售网站设计

news2024/12/28 5:21:30

        随着时代的发展,传统的超市购物方式已经不能满足人们的需求,对于顾客来说,排队购物和支付购物费用的问题亟待解决。对于实体超市来说,他们面临着网上购物的竞争压力,作为超市经理,他们要降低成本,节约人力,方便顾客购物和计算,因此提出了网上超市系统的设计和开发。本文分析了目前超市的收费模式,提出了网上超市无人售货系统的设计与开发,客户使用网站系统进行支付,改变原来的收费方式,实现自助购买、及时支付、实现实时查询。不仅可以节省超市人力,还可以节省顾客等待结算的时间。随着网络技术的发展和普及,人们的生活发生了迅速的变化。特别是计算机在经济和社会各个领域的应用,为了使消费者的网上购物过程简单、方便、安全、快捷,网上购物已经成为一种新的流行购物方式

        近年来,随着“互联网+”“大数据”等技术的快速普及,网店进入了快速发展时期,电子商务的出现显然对人们的购物方式产生了重大影响,从最初的商店购物转向网上购物。B2C网上购物中心系统是指在网络上创建虚拟购物中心,以满足用户的网上购物需求。随着时代的发展,传统的超市购物方式已经不能满足人们的需求,对于顾客来说,排队购物和支付购物费用的问题亟待解决。

 

 

实现的功能:

系统分为普通用户、商家和管理员三种角色;

本系统的功能应该包括:用户登录和注册、订单管理、钱包管理、商品管理、交易管理、充值管理、用户管理等功能。

注册、登录:未注册用户可以注册,包括普通用户注册和商家注册,有了账号后可以登录网站;

订单管理:普通用户可以查看和管理自己的购买订单,商家可以查看买家的购买订单;

钱包管理:普通用户和商家可以查看自己的钱包余额等信息;

商品管理:主要是商家可以上传、编辑、上架、下架商品等操作,管理员可以审核商家的商品,审核通过可以展示在网站首页;

交易管理:主要是管理员可以查看普通用户和商家的交易信息;

充值管理:管理员可以给普通用户和商家进行钱包的充值,方便使用;

用户管理:管理员可以审核用户的注册信息,只有审核通过才可以登录网站。

 

 

用到的技术:

后端 java语言,SpringBoot框架,MySql数据库,Maven依赖管理;

前端 Vue,element-ui等。

 

 部分代码展示

/**
 * 订单(Order)表控制层
 *
 */
@Slf4j
@RestController
@RequestMapping("order")
public class OrderController extends ApiController {
    /**
     * 服务对象
     */
    @Autowired
    private OrderService orderService;
    @Autowired
    private UserService userService;
    @Autowired
    private ShopService shopService;
    @Autowired
    private MiddleCountService middleCountService;
    @Autowired
    private CommodityService commodityService;

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("{id}")
    public R selectOne(@PathVariable Serializable id) {
        return success(this.orderService.getById(id));
    }

    @GetMapping("user/{userId}")
    public R selectByUserID(@RequestParam("page") long page, @PathVariable Serializable userId) {
        return success(this.orderService.page(new Page<>(page, 20),
                new LambdaQueryWrapper<Orders>().eq(Orders::getUserId, userId)));
    }

    @GetMapping("shop/{shopId}")
    public R selectByShopID(@RequestParam("page") long page, @PathVariable Serializable shopId) {
        return success(this.orderService.page(new Page<>(page, 20),
                new LambdaQueryWrapper<Orders>().eq(Orders::getShopId, shopId).between(Orders::getStatus,2,8)));
    }

    @GetMapping
    public R selectAll(@RequestParam("page") long page){
        return success(this.orderService.pageByStatus(new Page<>(page, 20),8));
    }

    /**
     * 修改数据
     *
     * @param orders 实体对象
     * @return 修改结果
     */
    @PostMapping("update")
    public R update(@RequestBody Orders orders) {
        if (orders.getCanReturn() == 1) {
            if (orders.getStatus() == 5 || orders.getStatus() == 6) {
                return failed("支付超过24h,无法退货");
            }
        }
        else if (orders.getStatus() == 6) {
            MiddleCount middleCount = middleCountService.getMiddleCountByOrderId(orders.getId());
            User user = userService.getById(orders.getUserId());
            user.setWallet(user.getWallet() + middleCount.getAmount());
            middleCountService.removeById(middleCount.getId());
        }
        if (orders.getStatus() == 1 || orders.getStatus() == 6) {
            Commodity commodity = commodityService.getById(orders.getCommodityId());
            commodity.setInventory(commodity.getInventory() + orders.getQuantity());
            commodityService.updateById(commodity);
        }
        return success(this.orderService.updateById(orders));
    }

    @PostMapping("pay")
    public R payOrders(@RequestBody List<Orders> orders) {
        User user = userService.getById(orders.get(0).getUserId());
        double sum = orders.stream().mapToDouble(Orders::getAmount).sum();
        if (user.getWallet() < sum) {
            return failed("余额不足");
        }
        for (Orders order : orders) {
            MiddleCount middleCount = new MiddleCount();
            middleCount.setOrderId(order.getId());
            middleCount.setUserId(user.getId());
            middleCount.setAmount(order.getAmount());
            middleCount.setSellerId(shopService.getById(order.getShopId()).getSellerId());
            middleCountService.save(middleCount);
            user.setWallet(user.getWallet() - order.getAmount());
            order.setStatus(2);
            orderService.updateById(order);
        }
        return success(userService.updateById(user));
    }
}
<template>
    <div class="order">
        <el-table :data="orders" stripe style="width: 100%">
            <el-table-column width="30"></el-table-column>
            <el-table-column prop="commodityId"  label="商品ID"  width="80"></el-table-column>
            <el-table-column prop="quantity"  label="数量"  width="80"></el-table-column>
            <el-table-column prop="amount" label="总价"  width="100"></el-table-column>
            <el-table-column  prop="creatTime" label="订单开始时间" width="200"></el-table-column>
            <el-table-column prop="endTime" label="订单结束时间"  width="200"></el-table-column>
            <el-table-column prop="status" label="标签" width="140"
                :filters="[{ text: '待支付', value: 0}, { text: '取消订单', value: 1 },
                            { text: '待发货', value: 2}, { text: '已收货', value: 4 },
                            { text: '退货审核中', value: 5 },{ text: '已退货', value: 6},
                            { text: '拒绝退货', value: 7},{ text: '已完成', value: 8} ]"
                :filter-method="filterTag"
                filter-placement="bottom-end">
                <template slot-scope="scope">
                    <el-tag
                    :type="scope.row.status === 8 ? 'success' : 'primary'"
                    disable-transitions>{{scope.row.status | formatStatus }}</el-tag>
                </template>
            </el-table-column>
            <el-table-column label="操作" width="200">
                <template slot-scope="scope">
                    <el-button v-if="determineType(scope.row.status,'付款')" size="mini" type="danger" @click="handlePay(scope.row)">付款</el-button>
                    <el-button v-if="determineType(scope.row.status,'取消订单')" size="mini"  @click="handleCancelPay(scope.row)">取消订单</el-button>
                    <el-button v-if="determineType(scope.row.status,'退货')" size="mini" type="danger"  @click="handleReturnGoods(scope.row)">退货</el-button>
                    <el-button v-if="determineType(scope.row.status,'确认订单')" size="mini"  @click="handleConfirm(scope.row)">确认订单</el-button>
                    <el-button v-if="determineType(scope.row.status,'取消退货')" size="mini"  @click="handleCancelReturn(scope.row)">取消退货</el-button>
                </template>
            </el-table-column>
        </el-table>
    </div>
</template>
<script>
import { mapState } from 'vuex'
export default {
    name:"order",
    data(){
        return{
            orders:[],
        }
    },
    created(){
        this.axios.get("/order/user/"+this.user.id,{params:{page:1}}).then(response => {
            if(response.status == 200){
                this.orders = response.data.data.records;
            }
        })
    },
    computed:{
        ...mapState('user',['user']),
    },
    methods:{
        filterTag(value, row) {
            return row.status === value;
        },

        //付款
        handlePay(row){
            this.$confirm("确认支付?").then(() =>{
                this.axios.post("/order/pay",[row]).then(response => {
                    if(response.data.code == 0){
                        this.$message({type:'success',message:"支付成功!"})
                        row.status = 2
                    }else{
                        this.$message(response.data.msg)
                    }
                }).catch(() => {error => alert(error)});
            }).catch(()=>{})
        },

        //取消订单
        handleCancelPay(row){
            this.$confirm("确认取消清单?").then(() =>{
                 let old = row.status;
                 row.status = 1
                 let ordEndTime = row.endTime
                 row.endTime = this.formatDate(new Date(),'YY-MM-DD hh:mm:ss')
                 this.axios.post("/order/update",row).then(response => {
                    if(response.data.code == 0){
                        this.$message({type:'success',message:"取消订单成功!"})
                    }else{
                        this.$message(response.data.msg)
                        row.status = old
                        row.endTime = ordEndTime
                    }
                }).catch(() => {error => alert(error)});
            }).catch(()=>{})
        },

        //退货
        handleReturnGoods(row){
            this.$confirm("确认提交退货申请?").then(() =>{
                 let old = row.status;
                 row.status = 5
                 this.axios.post("/order/update",row).then(response => {
                    if(response.data.code == 0){
                        this.$message({type:'success',message:"申请退货成功,请等待商家回应!"})
                    }else{
                        this.$message(response.data.msg)
                        row.status = old
                    }
                }).catch(() => {error => alert(error)});
            }).catch(()=>{})
        },
        
        //取消退货
        handleCancelReturn(row){
            this.$confirm("确认取消退货? 确认后订单不能再次退货!").then(() =>{
                 let oldStatus = row.status;
                 row.status = 8
                 let ordEndTime = row.endTime
                 row.endTime = this.formatDate(new Date(),'YY-MM-DD hh:mm:ss')
                 this.axios.post("/order/update",row).then(response => {
                    if(response.data.code == 0){
                        this.$message({type:'success',message:"取消退货成功,该订单已完成!"})
                    }else{
                        this.$message(response.data.msg)
                        row.status = oldStatus
                        row.endTime = ordEndTime
                    }
                }).catch(() => {error => alert(error)});
            }).catch(()=>{})
        },
        //确认订单
        handleConfirm(row){
            this.$confirm("确认订单已完成?").then(() =>{
                 let old = row.status;
                 row.status = 8
                 let ordEndTime = row.endTime
                 row.endTime = this.formatDate(new Date(),'YY-MM-DD hh:mm:ss')
                 this.axios.post("/order/update",row).then(response => {
                    if(response.data.code == 0){
                        this.$message({type:'success',message:"确认成功,该订单已完成!"})
                    }else{
                        this.$message(response.data.msg)
                        row.status = old
                        row.endTime = ordEndTime
                    }
                }).catch(() => {error => alert(error)});
            }).catch(()=>{})
        },
        
        //判断订单处于哪一阶段,显示该阶段的操作
        determineType(status, operation){
            if(operation == "付款"){
                if(status == 0) return true
            }else if(operation == "取消订单"){
                if(status == 0) return true
            }else if(operation == "退货"){
                if(status == 4 || status == 3) return true
            }else if(operation == "取消退货"){
                if(status == 5) return true
            }else{
                if(status == 4 || status == 6 || status == 3) return true
            }
            return false
        },

        //格式化时间
//      formatDate(new Date().getTime());//2017-05-12 10:05:44
//      formatDate(new Date().getTime(),'YY年MM月DD日');//2017年05月12日
//      formatDate(new Date().getTime(),'今天是YY/MM/DD hh:mm:ss');//今天是2017/05/12 10:07:45
        formatDate(time,format='YY-MM-DD hh:mm:ss'){
            var date = new Date(time);
        
            var year = date.getFullYear(),
                month = date.getMonth()+1,//月份是从0开始的
                day = date.getDate(),
                hour = date.getHours(),
                min = date.getMinutes(),
                sec = date.getSeconds();
            var preArr = Array.apply(null,Array(10)).map(function(elem, index) {
                return '0'+index;
            });开个长度为10的数组 格式为 00 01 02 03       
            var newTime = format.replace(/YY/g,year)
                                .replace(/MM/g,preArr[month]||month)
                                .replace(/DD/g,preArr[day]||day)
                                .replace(/hh/g,preArr[hour]||hour)
                                .replace(/mm/g,preArr[min]||min)
                                .replace(/ss/g,preArr[sec]||sec);        
            return newTime;         
        }
    },
    filters:{
        formatStatus(val){
            let value = "";
            switch(val) {
                case 0:
                    value = "待支付";
                    break;
                case 1:
                    value = "已取消";
                    break;
                case 2:
                    value = "待发货";
                    break;
                case 3:
                    value = "运输中";
                    break;
                case 4:
                    value = "已收货";
                    break;
                case 5:
                    value = "退货审核中";
                    break;
                case 6:
                    value = "已退货";
                    break;
                case 7:
                    value = "拒绝退货";
                    break;
                case 8:
                    value = "已完成";
                    break;                    
            }
            return value;
        }
    }
}
</script>

<style scoped>
    .order{
        width: 1030px;
        margin: 0 auto;
        margin-top: 50px;
    }
</style>

基于JAVA SpringBoot和vue零食销售网站设计

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

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

相关文章

全栈测试平台推荐:RunnerGo

做软件测试的同学在工作时应该都碰到过这种情况&#xff1a;接口管理、接口测试用postman、Apipost等接口管理工具&#xff0c;性能测试用jmeter、loadrunner等性能测试工具&#xff0c;接口自动化则是jmeter脚本或者python脚本配合jenkins使用。这种情况极大的降低了研发效率&…

聚观早报|网信办就人脸识别征求意见;地平线前总监入职比亚迪

【聚观365】8月9日消息 网信办就人脸识别应用征求意见地平线前总监廖杰入职比亚迪理想汽车预计三季度车辆交付量星纪魅族回应终止自研芯片业务上汽集团7月销量同比下滑21% 网信办就人脸识别应用征求意见 据网信中国微信公众号消息&#xff0c;为规范人脸识别技术应用&#xf…

自定义类型——联合

联合 1.联合体的定义 联合也是一种特殊的自定义类型。 先来看一个结构体变量&#xff1a; #include<stdio.h> #include<stdlib.h> union Un {char c;int i; }; int main() {union Un un;printf("%p\n", &un);printf("%p\n", &un.c)…

ad+硬件每日学习十个知识点(26)23.8.6 (DCDC的降压电路、升压电路、降压-升压电路,同步整流,选型考虑同步、隔离)

文章目录 1.DCDC的降压原理2.DCDC的升压原理3.DCDC的升压和降压原理4.什么是肖特基二极管造成的死区电压&#xff1f;5.MOS管有死区电压么&#xff1f;6.DCDC的同步整流&#xff08;用MOS管取代整流二极管&#xff0c;避免死区电压的影响&#xff09;7.DCDC选型——同步与非同步…

怎样学习PMP呢?

大多数人会觉得自己是工作者如果花时间去学习PMP精力上和时间上不好安排&#xff0c;其实上班族也是能学号pmp项目管理的。 首先&#xff0c;我把总结和思维导图打印出来&#xff0c;贴在镜子上&#xff0c;每天早上起来刷牙时&#xff0c;就可以过一遍这些内容。上班路上&…

《golang设计模式》第二部分·结构型模式-01-适配器模式(Adapter)

文章目录 1. 概念1.1 角色1.2 应用场景1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 示例类图 1. 概念 定义一个适配器&#xff0c;帮助原本不能实现接口的类“实现”该接口 1.1 角色 目标&#xff08;Target&#xff09;&#xff1a;客户端调用的目标接口 被适配者&#xff08…

Vue3中v-model在原生元素和自定义组件上的使用

目录 前言 一、原生元素上的用法 1. 输入框(input) 2. 多行文本域(textarea) 3. 单选按钮(radio) 4. 多选框(checkbox) 5. 下拉选择框(select) 二、自定义组件上的用法 1. 定义一个名为 modelValue 的 props 属性和一个名为 update:modelValue 的事件 2.使用一个可…

岩土工程仪器多通道振弦传感器信号转换器应用于桥梁安全监测

岩土工程仪器多通道振弦传感器信号转换器应用于桥梁安全监测 桥梁作为交通运输的重要节点&#xff0c;其安全性一直备受关注。不同于其他建筑物&#xff0c;桥梁所处的环境复杂多变&#xff0c;同时&#xff0c;其所需承受的负荷也相对较大&#xff0c;这就需要对桥梁的安全进…

关于eclipse导入部署具有增删改查的项目

目录 前言&#xff1a;当我们刚刚进入公司的第一步就是去部署当前公司的项目&#xff0c;本博客就是详细介绍怎么去部署当前公司的项目。 一&#xff0c;开发工具&#xff1a; 二&#xff0c;具体步骤&#xff1a; 2.1导入公司的项目 打开eclipse开发工具 2.2配置当前的环…

windows 10 远程桌面配置

1. 修改远程桌面端口&#xff08;3389&#xff09; 打开注册表&#xff08;winr&#xff09;, 输入regedit 找到配置项【计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Terminal Server\Wds\rdpwd\Tds\tcp】 &#xff0c; 可以通过搜索“Wds”快速定位。 修改端口配…

Linux线程同步(条件变量)

文章目录 前言一、条件变量概念二、条件变量相关的函数三、条件变量模拟生产者消费者模型四、使用条件变量的好处总结 前言 本篇文章来讲解一下条件变量的使用。 一、条件变量概念 条件变量&#xff08;Condition Variable&#xff09;是并发编程中一种线程同步机制&#xf…

解决阿里图标引入彩色图标却是黑色的问题

解决阿里图标引入彩色图标却是黑色的问题 下载symbol文件&#xff0c; 引入这些文件&#xff1a; 使用&#xff1a; <svg class"icon" aria-hidden"true"><use xlink:href"#icon-图标名称"></use></svg>.icon {width: …

Flowable-结束事件-取消结束事件

目录 定义图形标记XML内容使用示例视频教程 定义 取消结束事件只能与 BPMN 事务子流程结合使用&#xff0c;它可以取消一个事务子流程的执行&#xff0c;同时 也只能在子流程中执行。实际应用中&#xff0c;会把取消事件&#xff0c;事务子流程&#xff0c;补偿事件一起用。当…

实例033 制作闪烁的窗体

实例说明 Windows系统中&#xff0c;当程序在后台运行时&#xff0c;如果某个窗口的提示信息需要用户浏览&#xff0c;该窗口就会不停的闪烁&#xff0c;这样就会吸引用户的注意。同样&#xff0c;如果在自己的程序中使某个窗口不停的闪烁就会吸引用户的注意。本例设计了一个闪…

adb用法,安卓的用户CA证书放到系统CA证书下

设备需root&#xff01;&#xff01;设备需root&#xff01;&#xff01;设备需root&#xff01;&#xff01; ​​​​​​​测试环境&#xff1a;redmi 5 plus、miui10 9.9.2dev&#xff08;安卓8.1&#xff09;、已root win下安装手机USB驱动&#xff08;过程略&#xff0c…

图像的转置之c++实现(qt + 不调包)

1.基本原理 图像的转置就是将图像的横坐标和纵坐标交换位置&#xff0c;和矩阵的转置是一样的&#xff0c;公式见下&#xff1a; 2.代码实现&#xff08;代码是我以前自学图像处理时写的&#xff0c;代码很粗糙没做任何优化&#xff0c;但很好理解&#xff09; /*图像的转置函…

无涯教程-Perl - getc函数

描述 此函数从FILEHANDLE中读取下一个字符(如果未指定,则从STDIN中读取),并返回值。 语法 以下是此函数的简单语法- getc FILEHANDLEgetc返回值 此函数返回错误或文件结尾的undef以及从FILEHANDLE读取的字符值。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perl$k…

APT80DQ20BG-ASEMI快恢复二极管80A 200V

编辑&#xff1a;ll APT80DQ20BG-ASEMI快恢复二极管80A 200V 型号&#xff1a;APT80DQ20BG 品牌&#xff1a;ASEMI 芯片个数&#xff1a;双芯片 封装&#xff1a;TO-3P 恢复时间&#xff1a;≤50ns 工作温度&#xff1a;-55C~150C 浪涌电流&#xff1a;600A*2 正向电流…

解析Java中的包装类和泛型

Java中的包装类和泛型 一、包装类与基本类型二、泛型1、什么是泛型2、引出泛型3、泛型类的定义和使用4、擦除机制5、泛型的上界6、泛型方法7、通配符 总结 一、包装类与基本类型 包装类&#xff0c;就是基本数据类型对应的类类型。我们已知Java中有8种基本数据类型&#xff0c…

算法与数据结构(二十二)动态规划解题套路框架

动态规划解题套路框架 此文只在个人总结 labuladong 动态规划框架&#xff0c;仅限于学习交流&#xff0c;版权归原作者所有&#xff1b; 动态规划问题&#xff08;Dynamic Programming&#xff09;应该是很多读者头疼的&#xff0c;不过这类问题也是最具有技巧性&#xff0c…