YC-A11(原创)基于springboot,vue网上商城

绪论
 课题的开发背景
随着计算机和网络的快速发展,并且越来越普及,互联网日益成为人们收集信息常用渠道,电子商务开始流行,一种全新的理念不断形成并且快速发展,像国内电商巨头淘宝、京东、苏宁易购、唯品会等电商平台,电子商务顾名思义是指在互联网上进行电子化的商务活动,也就是电子交易,利用Web提供的通信手段在网上进行交易活动, 改变传统经营方式和理念,以前商品的宣传是局限于电视和报纸等,现在网络就成为商家展示自己的商品的另一个平台,并且带来更多效益和降低商家成本,从而给用户带来更多优惠,网上购物不仅可以方便消费者,为用户节省更多时间,网上购物方式已经成为当今新潮流。

 

 课题研究的目的与意义
网上购物是当前互联网发展到一定阶段的产物,也是顺应新的消费方式和技术进步的必然结果。与传统的商店销售方式相比网上购物具有很大优势,不仅能够为商家节省成本,还能给消费者、商家带来双赢的局面。随着经济的不断发展,人们更希望更加方便和快捷的购物方式,在这需求下企业通过网上购物方式,使用先进技术打造一个网上购物平台供用户购买商品。通过对互联网发展以及国内外相关电子商务网站的现状不断进行分析,本次设计主要是基于SpringBoot的易淘商城网站的设计与实现,主要目的是在Internet网络环境下为用户提供一个网上书城平台,让用户可以浏览、查询、购买和配送等功能一体化的网上书城商城,致力为消费者提供更加人性化全方位服务,努力为用户创造更加亲切、流畅,安全可靠,更加全面商品展示,给消费者带来更多优惠,让消费者足不出户实现送货上门,在线支付或者货到付款的全方位服务,让消费者在网上购物更加安全有保障。

基于springboot,vue易淘网上商城定制版v4.0

本人原创作品,用户前台、系统管理员后台项目完整,无任何bug。

每行代码都是本人自己写,我在代码上面都写有详细注释

开发工具:IDEA

服务器:Tomcat9.0, jdk1.8

项目构建:maven

数据库:mysql5.7

系统分前后台,采用前后端分离

前端技术:vue (vue cli,vue-router,vuex全家桶),elementUI等框架实现

服务端技术:springboot,mybatis-plus

前台截图:

后台截图: 

<template>
  <div>
    <my-nav></my-nav>
    <div class="mallHome">
      <div class="productHome">
        <!--最新商品-->
        <el-row><p style="font-size:25px ;color:#67C23A">新品首发 <span style="font-size: 15px;">每日为你精心挑选</span></p>
        </el-row>
        <el-row :gutter="12">
          <el-col v-for="newProduct in newProductListV" :key="newProduct.id" :span="4">
            <el-card shadow="hover" style="margin-top: 10px;">
              <el-col>
                <el-link @click="toProductInfo(newProduct.id)" :underline="false">
                  <el-image :src="newProduct.imageUrl" fit="contain" style="width: 148px;height: 148px;"></el-image>
                </el-link>
              </el-col>
              <el-col style="line-height: 15px;margin-top: 5px;" class="lineDisplay">
                <el-link @click="toProductInfo(newProduct.id)" :underline="false">
                  {{ newProduct.name }}
                </el-link>
              </el-col>
              <el-col style="margin-top: 5px;">
                <span style="font-size:17px;color:#e33333">¥{{ newProduct.shopPrice }}</span>&nbsp;&nbsp;
                <span style="color:#999;font-size:13px"><del>¥{{ newProduct.marketPrice }}</del></span>
              </el-col>
            </el-card>
          </el-col>
        </el-row>
      </div>
      <div class="productHome">
        <!--热门商品-->
        <el-row><p style="font-size:25px;color:#67C23A">热门推荐 <span style="font-size: 15px;">每日为你精心挑选</span></p></el-row>
        <el-row :gutter="12">
          <el-col v-for="hotProduct in hotProductListV" :key="hotProduct.id" :span="4">
            <el-card shadow="hover" style="margin-top: 10px;">
              <el-col>
                <el-link @click="toProductInfo(hotProduct.id)" :underline="false">
                  <el-image :src="hotProduct.imageUrl" fit="contain" style="width: 148px;height: 148px;"></el-image>
                </el-link>
              </el-col>
              <el-col style="line-height: 15px;margin-top: 5px;" class="lineDisplay">
                <el-link @click="toProductInfo(hotProduct.id)" :underline="false">
                  {{ hotProduct.name }}
                </el-link>
              </el-col>
              <el-col style="margin-top: 5px;">
                <span style="font-size:17px;color:#e33333">¥{{ hotProduct.shopPrice }}</span>&nbsp;&nbsp;
                <span style="color:#999;font-size:13px"><del>¥{{ hotProduct.marketPrice }}</del></span>
              </el-col>
            </el-card>
          </el-col>
        </el-row>
      </div>
    </div>
  </div>
</template>

<script>

import MyNav from "@/components/MyNav";

export default {
  name: "MallHome",
  components: {MyNav},
  data() {
    return {
      newProductListV: [],
      hotProductListV: [],
      bannerHeight: "",
    }
  },
  methods: {
    query() {
      let _this = this;
      _this.getRequest("/index/indexData").then(resp => {
        if (resp) {
          _this.newProductListV = resp.newProductList;
          _this.hotProductListV = resp.hotProductList;
        }
      });
    },
    toProductInfo(val) {
      let _this = this;
      _this.$router.push({
        path: '/productInfo',
        query: {pid: val}
      });
    }
  },
  mounted() {
    let _this = this;
    _this.query();
  }

}
</script>

<style scoped>
.mallHome {
  text-align: center;
  margin-bottom: 5px;
  justify-content: space-between;
}

.productHome {
  width: 1200px;
  /* 水平垂直居中 */
  margin: 5px auto;
}
</style>

package lyp.itjiaochen.club.controller;


import io.swagger.annotations.ApiOperation;
import lyp.itjiaochen.club.enums.YesOrNoEnum;
import lyp.itjiaochen.club.pojo.Product;
import lyp.itjiaochen.club.pojo.dto.RespBean;
import lyp.itjiaochen.club.pojo.dto.RespPageBean;
import lyp.itjiaochen.club.pojo.dto.query.ProductQueryDto;
import lyp.itjiaochen.club.service.IProductCategoryService;
import lyp.itjiaochen.club.service.IProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author IT教程资源
 * @since 2023-03-23
 */
@RestController
@RequestMapping("/admin/product")
public class ProductController {

    @Autowired
    private IProductService iProductService;

    @Autowired
    private IProductCategoryService iProductCategoryService;

    @ApiOperation("分页查询商品信息")
    @PostMapping("/getProductPage")
    public RespPageBean getProductPage(@RequestBody ProductQueryDto queryDto){
        return iProductService.getProductPage(queryDto);
    }

    /**
     * @Author IT教程资源 2023/5/9 11:56
     * @Description 商品上下架
     */
    @ApiOperation(value = "商品上下架")
    @GetMapping("/handleProductShelves")
    public RespBean handleProductShelves(boolean flag, Integer id){
        Product product=new Product();
        product.setId(id);
        if(flag){
            product.setIsShelves(YesOrNoEnum.YES.getValue());
        }else {
            product.setIsShelves(YesOrNoEnum.NO.getValue());
        }
        if(iProductService.updateById(product)){
            return RespBean.success("操作成功!");
        }
        return RespBean.error("操作失败!");
    }


    /**
     * @Author IT教程资源 2023/5/9 17:30
     * @Description 添加商品
     */
    @ApiOperation("添加商品")
    @PostMapping("/addProduct")
    public RespBean addProduct(@RequestBody Product product){
        //默认是上架
        product.setIsShelves(YesOrNoEnum.YES.getValue());
        if(iProductService.save(product)){
            return RespBean.success("添加成功!");
        }
        return RespBean.error("添加失败!");
    }

    /**
     * @Author IT教程资源 2023/5/9 17:30
     * @Description 删除商品
     */
    @ApiOperation("删除商品")
    @DeleteMapping("/deleteProduct")
    public RespBean deleteProduct(@RequestBody Product product){
        if(product!=null && iProductService.removeById(product.getId())){
            return RespBean.success("删除成功!");
        }
        return RespBean.error("删除失败!");
    }

    /**
     * @Author IT教程资源 2023/5/9 17:40
     * @Description 修改商品
     */
    @ApiOperation("修改商品")
    @PutMapping("/updateProduct")
    public RespBean updateProduct(@RequestBody Product product){
        if(iProductService.updateById(product)){
            return RespBean.success("更新成功!");
        }
        return RespBean.error("更新失败!");
    }

}
package lyp.itjiaochen.club.controller;


import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import io.swagger.annotations.ApiOperation;
import lyp.itjiaochen.club.pojo.User;
import lyp.itjiaochen.club.pojo.dto.RespBean;
import lyp.itjiaochen.club.pojo.dto.RespPageBean;
import lyp.itjiaochen.club.pojo.dto.query.UserQueryDto;
import lyp.itjiaochen.club.service.IUserService;
import lyp.itjiaochen.club.utils.Md5Util;
import lyp.itjiaochen.club.utils.SysConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author IT教程资源
 * @since 2023-04-02
 */
@RestController
@RequestMapping("/admin/user")
public class UserController {

    @Autowired
    private IUserService iUserService;

    @ApiOperation("分页查询用户信息")
    @PostMapping("/getUserPage")
    public RespPageBean getUserPage(@RequestBody UserQueryDto queryDto){
        return iUserService.getUserPage(queryDto);
    }

    @ApiOperation("添加用户")
    @PostMapping("/addUser")
    public RespBean addUser(@RequestBody User user){
        //头像处理,如果为空,设置默认头像
        if(StringUtils.isBlank(user.getAvatar())){
            user.setAvatar(SysConstants.ADMIN_IMAGE_URL);
        }
        //设置默认密码123456
        user.setPassword(Md5Util.toMd5(SysConstants.ADMIN_DEFAULT_PASSWORD,SysConstants.PASSWORD_SALT,10));
        if(iUserService.save(user)){
            return RespBean.success("添加成功!");
        }
        return RespBean.error("添加失败!");
    }

    @ApiOperation(value = "检查账号是否可用")
    @GetMapping("/checkUsername")
    public RespBean checkUsername(String username){
        User user=iUserService.getUserByUserName(username);
        if(user!=null){
            return RespBean.error("账号已存在");
        }
        return RespBean.success("账号可用");
    }

    @ApiOperation("更新用户")
    @PutMapping("/updateUser")
    public RespBean updateUser(@RequestBody User user){
        if(iUserService.updateById(user)){
            return RespBean.success("更新成功!");
        }
        return RespBean.error("更新失败!");
    }

    @ApiOperation("删除用户")
    @DeleteMapping("/deleteUser")
    public RespBean deleteUser(@RequestBody User user){
        if(user!=null && iUserService.removeById(user.getId())){
            return RespBean.success("删除成功!");
        }
        return RespBean.error("删除失败!");
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JavaScript】2.JavaScript函数

JavaScript 函数 1. 函数的概念 函数&#xff1a;就是封装了一段可被重复调用执行的代码块 通过此代码块可以实现大量代码的重复使用 2. 函数的使用 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta na…

前馈PID控制(热交换器/反应釜温度控制)

如何利用PID进行温度控制请参看下面博客文章: 博途PID 1200/1500PLC PID_Compact比例作用权重b微分作用权重c解读(PI-D控制器 I-PD控制器)_RXXW_Dor的博客-CSDN博客很多人会问PLC自带的PID指令和我们自己设计的PID有什么区别,这个问题要看你和什么PID控制器作对比,PID负反…

NDK RTMP直播客户端二

在之前完成的实战项目【FFmpeg音视频播放器】属于拉流范畴&#xff0c;接下来将完成推流工作&#xff0c;通过RTMP实现推流&#xff0c;即直播客户端。简单的说&#xff0c;就是将手机采集的音频数据和视频数据&#xff0c;推到服务器端。 接下来的RTMP直播客户端系列&#xff…

Redis用于全局ID生成器、分布式锁的解决方案

全局ID生成器 每个店铺都可以发布优惠卷 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增id就存在一些问题&#xff1a; 1.id的规律性太明显 2.受单表数据量的限制 全局ID生成器&#xff0c;是一种在分布式系…

Atlassian后Server时代 | Server版vs.数据中心版,二者的区别在哪里?

2024年2月&#xff0c;也就是一年不到&#xff0c;Atlassian将终止对Server产品及插件的所有支持。 此公告发布后&#xff0c;许多用户需要了解怎样的前进方向才是最适合企业的。为此&#xff0c;Atlassian提供了本地部署的数据中心&#xff08;Data Center&#xff09;版以及云…

线段树笔记草稿

一个左节点u << 1和右节点u << 1 | 1 的证明 区间修改部分 1.批量等值修改 前提条件 是要区间修改&#xff0c;区间查询&#xff0c;且修改操作修改的值是相同的 情景 一般是要对一个数组执行k次操作&#xff0c;每次改变其中一个区间内所有元素的值&#x…

ChatGPT文本框再次升级,打造出新型操作系统

在ChatGPT到来之前&#xff0c;没有谁能够预见。但是&#xff0c;它最终还是来了&#xff0c;并引起了不小的轰动&#xff0c;甚至有可能颠覆整个行业。 从某种程度上说&#xff0c;ChatGPT可能是历史上增长最快的应用程序&#xff0c;仅在两个多月就拥有了1亿多活跃用户&…

Adaptive Weight Assignment Scheme For Multi-task Learning

Adaptive Weight Assignment Scheme For Multi-task Learning 题目Adaptive Weight Assignment Scheme For Multi-task Learning译题用于多任务学习的自适应权重分配方案时间2022年期刊/会议IAES International Journal of Artificial Intelligence (IJ-AI) 摘要&#xff1a;如…

【AutoGPT】你自己运行,我先睡了—— ChatGPT过时了吗?

系列文章目录 【AI绘画】Midjourney和Stable Diffusion教程_山楂山楂丸的博客-CSDN博客 目录 系列文章目录 前言 一、AutoGPT是什么&#xff1f; 二、AutoGPT带来的利弊 三、AutoGPT和ChatGPT区别 四、未来 总结 前言 ChatGPT是否过时&#xff1f;AutoGPT的兴起&#…

MappingGenerator PRO 2023.3 Visual Studio 2019-2022

您的私人编码助手 MappingGenerator 最初是作为 AutoMapper 的设计时替代品创建的。现在它正在演变为编码助手&#xff0c;您可以将最平凡的编码任务委派给它&#xff1a; 生成映射生成显式转换实施克隆生成投影表达式脚手架方法调用脚手架对象创建清理方法调用方便ILogger的使…

ChatGPT风口下的中外“狂飙”,一文看懂微软、谷歌、百度、腾讯、华为、字节跳动们在做什么?

毫无疑问&#xff0c;ChatGPT正成为搅动市场情绪的buzzword。 历史经历过无线电&#xff0c;半导体&#xff0c;计算机&#xff0c;移动通讯&#xff0c;互联网&#xff0c;移动互联网&#xff0c;社交媒体&#xff0c;云计算等多个时代&#xff0c;产业界也一直在寻找Next Bi…

Golang每日一练(leetDay0031)

目录 91. 解码方法 Decode Ways &#x1f31f;&#x1f31f; 92. 反转链表 II Reverse Linked List II &#x1f31f;&#x1f31f; 93. 复原 IP 地址 Restore IP Addresses &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练…

【JVM】JVM之执行引擎

文章目录一、前言二、名词解释机器码指令指令集汇编语言高级语言字节码虚拟机&物理机前端编译器&后端编译器三、JVM之执行引擎执行引擎是如何工作的&#xff1f;解释器即时编译器&#xff08;JIT&#xff09;分层编译策略虚拟机执行模式热点代码&探测方式1&#xf…

如何在 Linux 中使用 Chage 命令,修改Linux系统用户密码更改策略

Chage是一个用于修改Linux系统用户密码更改策略的命令行工具。在本文中&#xff0c;我们将介绍如何在Linux系统中使用Chage命令。 检查用户密码过期信息 使用Chage命令可以检查用户密码更改策略和过期信息。要检查特定用户的密码过期信息&#xff0c;可以使用以下命令&#x…

PPT NO.1【用ppt如何做一张海报+字体】

PPT做得好的人&#xff0c;一定是站在观众的角度思考的人。 1、设置幻灯片尺寸大小&#xff1a; 设置完成后如下&#xff1a; 2、加载一张自己喜欢的图片进来&#xff1a;【图片越高清越好】 将图片铺满空白的地方&#xff0c;调整好自己喜欢的区域&#xff1a; 做裁剪&#xf…

数据结构---递归转化为非递归

递归转化为非递归前言快速排序非递归归并排序的非递归前言 为什么要学习非递归写法呢&#xff1f; 当我们在用递归实现一个程序的时候&#xff0c;要考虑一个问题&#xff0c;这个程序用递归去实现&#xff0c;当数据量庞大的时候&#xff0c;会不会造成栈溢出(STACK OVERFLOW…

代码随想录_226翻转二叉树、101对称二叉树

leetcode 226. 翻转二叉树 ​​​226. 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;r…

算法训练第五十五天 | 392.判断子序列、115.不同的子序列

动态规划part15392.判断子序列题目描述思路总结115.不同的子序列题目描述思路392.判断子序列 题目链接&#xff1a;392.判断子序列 参考&#xff1a;https://programmercarl.com/0392.%E5%88%A4%E6%96%AD%E5%AD%90%E5%BA%8F%E5%88%97.html 题目描述 给定字符串 s 和 t &…

【CocosCreator入门】CocosCreator组件 | Graphics(绘制)组件

Cocos Creator 是一款流行的游戏开发引擎&#xff0c;具有丰富的组件和工具&#xff0c;其中Graphics组件允许您在游戏中绘制2D图形和几何形状&#xff0c;并通过编写脚本来控制其外观和行为。 目录 一、组件属性 二、组件方法 三、脚本示例 一、组件属性 属性功能说明lineW…

面试篇-Java并发之CAS:掌握原理、优缺点和应用场景分析,避免竞态问题

1、CAS介绍及原理 多线程中的CAS&#xff08;Compare-and-Swap&#xff09;操作是一种常见的并发控制方法&#xff0c;用于实现原子性更新共享变量的值。其核心思想是通过比较内存地址上的值和期望值是否相等来确定是否可以进行更新操作&#xff0c;从而避免多线程条件下的竞态…