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

news2024/11/17 1:43:12

绪论
 课题的开发背景
随着计算机和网络的快速发展,并且越来越普及,互联网日益成为人们收集信息常用渠道,电子商务开始流行,一种全新的理念不断形成并且快速发展,像国内电商巨头淘宝、京东、苏宁易购、唯品会等电商平台,电子商务顾名思义是指在互联网上进行电子化的商务活动,也就是电子交易,利用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("删除失败!");
    }

}

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

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

相关文章

筑牢合规营销“防火墙”,助力四环医药实现合规营销管理能力全面进阶 | 案例研究

四环医药控股集团有限公司&#xff08;以下简称“四环医药”&#xff09;是一家集药品研发、生产和销售于一体的集团化医药企业&#xff0c;公司现拥有心脑血管疾病、肝病治疗、提高机体免疫机能、代谢及抗感染等多领域100品种。四环医药强大的营销体系及独特营销模式确保了自身…

会画画的海龟,Python Turtle库详解(27)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 欢迎和猫妹一起&#xff0c;趣味学Python。 今日主题 介绍下Python的turtle库&#xff0c;这是一个可以画画的库&#xff0c;非常适合小孩子在屏幕上画画。 先学习基础知…

Python入门教程+项目实战-9.4节: 字符串的格式化

目录 9.4.1 理解格式化 9.4.2 使用f-string进行格式化 9.4.3 使用格式化符号进行格式化 9.4.4 使用format方法进行格式化 9.4.5 知识要点 9.4.6 系统学习python 9.4.1 理解格式化 同学们比较熟悉的是磁盘格式化&#xff0c;将磁盘格式化以后&#xff0c;磁盘中的文件全部…

第10章_多线程

第10章_多线程 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 本章专题与脉络 我们之前学习的程序在没有跳转语句的情况下&#xff0c;都是由上至下沿着一条路径依次执行。现在想要设计一个程序…

Spring概述及IoC,DI的理解

目录 一、Spring 是什么&#xff1f; 1.1 什么是容器&#xff1f; 1.2 如何理解IoC&#xff1f; 1.3 理解Spring Ioc 1.4 DI是什么 1.5 回顾IoC&#xff0c;DI 1.6 IoC和DI的对比 一、Spring 是什么&#xff1f; 我们通常所说的 Spring 指的是 Spring Framework&#x…

不会写代码也能做自动化?推荐一款自动化测试神器

在软件测试这条道路上&#xff0c;大部分的职业技能发展道路都会是纯业务手工测试→自动化测试→性能测试→安全测试/测试开发。 但是却有着一部分人起初进入软件测试这一行看重的就是软件测试属于IT行业&#xff0c;门槛比较低&#xff0c;不需要代码基础。 这就导致了这一部…

数据库系列之MySQL线程ID和操作系统线程ID对应关系

在日常运维工作中&#xff0c;MySQL数据库服务器出现SQL语句执行导致服务器CPU使用率突增&#xff0c;如何通过现有手段快速定位排查到哪个SQL语句&#xff0c;并采取应急措施。本文介绍基于传统的操作系统线程的CPU使用监控手段入手&#xff0c;利用操作系统线程ID和MySQL线程…

Leetcode.1631 最小体力消耗路径

题目链接 Leetcode.1631 最小体力消耗路径 Rating &#xff1a; 1948 题目描述 你准备参加一场远足活动。给你一个二维 rows x columns的地图 heights&#xff0c;其中 heights[row][col]表示格子 (row,col)(row, col)(row,col) 的高度。一开始你在最左上角的格子 (0,0)(0, 0)…

8.Java面向对象---类、属性和方法

Java面向对象—类、属性和方法 在生活中&#xff0c;说到类&#xff0c;可以联想到类别&#xff0c;同类&#xff0c;会想到一类人&#xff0c;一类事物等等。而这一类人或事物都是具有相同特征或特点和行为的&#xff0c;我们根据不同的特征或特点和行为将他们归类或分类。同…

ActiveReportsJS 4.0 FIX ActiveReportsJS 4.0 Crack

JavaScript 报告工具是一组用于数据整合和可视化的 Web 组件。ActiveReportsJS 是前端开发人员用来在 Web 应用程序中嵌入报告的解决方案。报表设计器和查看器组件、强大的数据可视化器和丰富的 API 等主要功能使 ActiveReportsJS 成为行业领导者。 JavaScript 报告引擎 利用强…

【算法与数据结构】2 梅开二度,线性查找的究极优化

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于算法与数据结构体系专栏,本专栏对于0基础者极为友好,欢迎与我一起完成算法与数据结构的从0到1的跨越 线性查找的究极优化1.前言2.泛型1.1粗略介绍泛型类1.2使用泛型方法1…

Python 中如果键不存在,则将键添加到字典

文章目录使用 not in 检查键是否存在如果字典不存在则使用 dict.get() 添加键到字典如果字典不存在&#xff0c;则使用 setdefault() 将键添加到字典中使用 not in 检查键是否存在 如果字典不存在&#xff0c;则将键添加到字典中&#xff1a; 使用 not in 运算符检查键是否不…

如何用ChatGPT写文章?只需要这3步,10倍提升写作效率

随着技术的不断进步和创新&#xff0c;我们的生活方式和工作方式也在不断变化。在日常工作中&#xff0c;越来越多的人使用人工智能和机器学习等技术提高效率减少时间成本。最近ChatGPT火出圈了&#xff0c;很多人通过使用ChatGPT提高了工作效率。那么&#xff0c;在写作领域&a…

【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点 p269 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/ 1. 题目介绍&#xff08; 54. 二叉搜索树的第k大节点&#xff09; 给定一棵二叉搜索树&#xff0c;请找出其中第 k 大的节点的值。 【测试用例】&#xff1a; 示例 1: 示例2&…

UTONMOS:打造你的梦想,开启元宇宙无限彩排的游戏时代

有人认为&#xff0c;元宇宙不过是 VR 概念的“旧瓶换新酒式”的炒作。 有人认为&#xff0c;元宇宙是被资本和巨头绑架的另一场“游戏”。 有人认为&#xff0c;元宇宙是骗局&#xff0c;是智商税。 更多人对元宇宙的评价是“呵呵”。 媒体朋友对元宇宙的描述更具艺术性&a…

详解FreeRTOS中的软件定时器

软件定时器用于让某个任务定时执行&#xff0c;或者周期性执行。比如设定某个时间后执行某个函数&#xff0c;或者每隔一段时间执行某个函数。由软件定时器执行的函数称为软件定时器的回调函数。 参考资料&#xff1a; 《Mastering the FreeRTOS™ Real Time Kernel》——Cha…

vue2、vue3使用i18n实现国际化

一、目标效果 源码地址&#xff1a;git clone i18n-demo: vue2、vue3实现i18n国际化功能 默认语言是中文&#xff1a; 点击语言切换&#xff0c;变成英文&#xff08;这里简单设置了中文、英文两种语言&#xff09; 注意&#xff1a;vue2支持 vue-i18n 版本8.0 &#xff0c;vu…

本轮沙尘已跨过长江!这些地区请注意加强防范

气象台4月12日06时继续发布沙尘暴蓝色预警&#xff1a;受冷空气大风影响&#xff0c;预计4月12日08时至13日08时&#xff0c;新疆南疆盆地和东部、内蒙古中西部、甘肃河西和中部、宁夏、陕西中部、山西、河北、辽宁、北京、天津、山东、河南、安徽、江苏、上海、湖北中北部、浙…

漏洞利用之弱口令

漏洞利用之弱口令1.弱口令的定义2.弱口令字典生成收集用户信息&#xff0c;组成爆破字典特殊字符增强的字典生成字典生成项目3.利用 Burp Suite 进行密码爆破1.弱口令的定义 弱口令没有严格和准确的定义&#xff0c;通常认为容易被别人猜测到或被破解工具破解的口令均为弱口令…

【Mysql】mysql8.0.26解压包部署方式

版本背景&#xff1a; 操作系统&#xff1a;centos7.3 mysql版本&#xff1a;mysql-8.0.26-linux-glibc2.12-x86_64.tar 一、前期准备 1、检测操作系统自带安装的mysql和mariadb服务&#xff0c;如存在&#xff0c;需卸载 rpm -qa | grep mysql rpm -qa | grep mariadb 卸载…