YC-B09(原创)基于springboot,vue网上书城

news2025/1/16 15:01:31

(原创)基于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 style="background-color: #f7f9f9;">
    <el-row>
      <el-col :span="7" style="text-align: left;">
        <el-link :underline="false" @click="$router.push({path:'/mallHome'}).catch(err => {err})"><img :src="logoUrl" class="image" style="width: 274px;height: 60px;"></el-link>
      </el-col>
      <el-col :span="8">
        <el-autocomplete
            v-model="state"
            :fetch-suggestions="querySearchAsync"
            placeholder="请输入内容"
        ></el-autocomplete>
        <el-button type="primary" icon="el-icon-search" @click="search()">搜索</el-button>
      </el-col>
      <el-col :span="9">
        <template v-if="$store.state.account">
          <el-row>
            <el-col :span="7">
              <el-link :underline="false" href="#">
                欢迎您,
                <el-avatar :size="size" :src="$store.state.account.avatar" style="vertical-align: middle;"></el-avatar>
                <span style="color:red;">{{ $store.state.account.name }}</span>
              </el-link>
            </el-col>
            <el-col :span="5">
              <el-link :underline="false" style="color:#23527c;" @click="logout()">退出登录</el-link>
            </el-col>
            <el-col :span="4">
              <el-dropdown>
            <span class="el-dropdown-link">
            <el-link :underline="false" type="primary">个人中心</el-link><i
                class="el-icon-arrow-down el-icon--right"></i>
            </span>
                <el-dropdown-menu slot="dropdown">
                  <el-dropdown-item>
                    <el-link :underline="false" @click="toChangePassword">修改密码</el-link>
                  </el-dropdown-item>
                  <el-dropdown-item>
                    <el-link :underline="false" @click="toDeliveryAddress">地址管理</el-link>
                  </el-dropdown-item>
                  <el-dropdown-item>
                    <el-link :underline="false" @click="toUserInfo">资料修改</el-link>
                  </el-dropdown-item>
                  <el-dropdown-item>
                    <el-link :underline="false" @click="toLeaveMessage">留言反馈</el-link>
                  </el-dropdown-item>
                </el-dropdown-menu>
              </el-dropdown>
            </el-col>
            <el-col :span="4">
              <el-link :underline="false" icon="el-icon-shopping-cart-2" type="primary" @click="toCart">我的购物车</el-link>
            </el-col>
            <el-col :span="4">
              <el-link :underline="false" icon="el-icon-s-order" type="primary" @click="toOrder">我的订单</el-link>
            </el-col>
          </el-row>
        </template>
        <template v-else>
          <el-row>
            <el-col :span="6">
              <el-link :disabled="isLoginDisabled" :underline="false" @click="toLogin()">你好,请登录</el-link>
            </el-col>
            <el-col :span="6">
              <el-link :disabled="isRegisterDisabled" :underline="false" @click="toRegister()">免费注册</el-link>
            </el-col>
            <el-col :span="6"></el-col>
            <el-col :span="6"></el-col>
          </el-row>
        </template>
      </el-col>
    </el-row>
  </div>
</template>

<script>
export default {
  name: "MyHead",
  data() {
    return {
      categoryListV:[],
      logoUrl:"logo.png",
      state: "",
      restaurants: [],//搜索标题
      size:"small",
      isLoginDisabled:false,
      isRegisterDisabled:false,
    }
  },
  mounted:function () {
    let _this = this;
    this.restaurants = this.loadAll();
  },
  methods: {
    loadAll() {
      let _this = this;
      _this.getRequest("/public/getProductNameList").then(resp=>{
        if(resp){
          _this.restaurants=resp.obj;
        }
      })
    },
    querySearchAsync(queryString, cb) {
      let _this = this;
      var restaurants = _this.restaurants;
      var results = queryString ? restaurants.filter(_this.createStateFilter(queryString)) : restaurants;

      clearTimeout(_this.timeout);
      this.timeout = setTimeout(() => {
        cb(results);
      }, 3000 * Math.random());
    },
    createStateFilter(queryString) {
      return (state) => {
        return (state.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0);
      };
    },
    toLogin(){
      let _this=this;
      _this.$router.push({path:'/loginForm'})
      //设置登录不可点,可以注册
      _this.isLoginDisabled=!_this.isLoginDisabled;
      _this.isRegisterDisabled=false;
    },
    toRegister(){
      let _this=this;
      _this.$router.push({path:'/registerForm'})
      //设置注册不可点,可以登录
      _this.isRegisterDisabled=!_this.isRegisterDisabled;
      _this.isLoginDisabled=false;
    },
    logout(){
      let _this=this;
      _this.$confirm('确定退出登录?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        //注销登录
        _this.getRequest('/user/logout');
        //清空用户信息
        _this.$store.commit('logout');
        //跳转到登录页面
        this.$router.push({ path: '/' }).catch(data => {  })
      }).catch(() => {
        _this.$message({
          type: 'info',
          message: '已取消操作'
        });
      });
    },
    search(){
      if(this.state){
        this.$router.push({
          path:'/searchProduct',
          query: { pname:this.state}
        });
      }
    },
    toLeaveMessage(){
      this.$router.push({
        path:'/leaveMessage',
      });
    },
    toChangePassword(){
      this.$router.push({
        path:'/changePassword',
      });
    },
    toDeliveryAddress(){
      this.$router.push({
        path:'/deliveryAddress',
      });
    },
    toUserInfo(){
      this.$router.push({
        path:'/updateUserInfo',
      });
    },
    toCart(){
      this.$router.push({
        path:'/shoppingCart',
      });
    },
    toOrder(){
      this.$router.push({
        path:'/orderList',
      });
    }
  }
}
</script>

<style scoped>

</style>

package lyp.itjiaochen.club.controller;


import io.swagger.annotations.ApiOperation;
import lyp.itjiaochen.club.pojo.LeaveMessage;
import lyp.itjiaochen.club.pojo.dto.RespBean;
import lyp.itjiaochen.club.pojo.dto.RespPageBean;
import lyp.itjiaochen.club.pojo.dto.query.LeaveMessageQueryDto;
import lyp.itjiaochen.club.service.ILeaveMessageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author IT教程资源
 * @since 2023-04-03
 */
@RestController
@RequestMapping("/admin/leaveMessage")
public class LeaveMessageController {
    @Autowired
    private ILeaveMessageService iLeaveMessageService;



    @ApiOperation("分页查询留言信息")
    @PostMapping("/getLeaveMessagePage")
    public RespPageBean getLeaveMessagePage(@RequestBody LeaveMessageQueryDto queryDto){
        return iLeaveMessageService.getLeaveMessagePage(queryDto);
    }



    @ApiOperation("删除留言")
    @DeleteMapping("/deleteLeaveMessage")
    public RespBean deleteLeaveMessage(@RequestBody LeaveMessage leaveMessage){
        if(leaveMessage!=null && iLeaveMessageService.removeById(leaveMessage.getId())){
            return RespBean.success("删除成功!");
        }
        return RespBean.error("删除失败!");
    }
}

package lyp.itjiaochen.club.controller;


import io.swagger.annotations.ApiOperation;
import lyp.itjiaochen.club.pojo.ProductCategory;
import lyp.itjiaochen.club.pojo.dto.RespBean;
import lyp.itjiaochen.club.pojo.dto.RespPageBean;
import lyp.itjiaochen.club.pojo.dto.query.ProductCategoryQueryDto;
import lyp.itjiaochen.club.service.IProductCategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author IT教程资源
 * @since 2023-03-14
 */
@RestController
@RequestMapping("/admin/category")
public class ProductCategoryController {
    @Autowired
    private IProductCategoryService iProductCategoryService;


    @ApiOperation("分页查询商品分类")
    @PostMapping("/getCategoryPage")
    public RespPageBean getCategoryPage(@RequestBody ProductCategoryQueryDto queryDto){
        return iProductCategoryService.getProductCategoryPage(queryDto);
    }

    @ApiOperation("添加商品分类")
    @PostMapping("/addCategory")
    public RespBean addCategory(@RequestBody ProductCategory productCategory){
        if(iProductCategoryService.save(productCategory)){
            return RespBean.success("添加成功!");
        }
        return RespBean.error("添加失败!");
    }

    @ApiOperation("更新商品分类")
    @PutMapping("/updateCategory")
    public RespBean updateCategory(@RequestBody ProductCategory productCategory){
        if(iProductCategoryService.updateById(productCategory)){
            return RespBean.success("更新成功!");
        }
        return RespBean.error("更新失败!");
    }

    @ApiOperation("删除商品分类")
    @DeleteMapping("/deleteCategory")
    public RespBean deleteCategory(@RequestBody ProductCategory productCategory){
        if(productCategory!=null && iProductCategoryService.deleteCategory(productCategory)){
            return RespBean.success("删除成功!");
        }
        return RespBean.error("删除失败!");
    }

}

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

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

相关文章

代码随想录算法训练营第五十九天-单调栈2| 503.下一个更大元素II 42. 接雨水

503. Next Greater Element II 成环就用取模mod方法 import java.util.Arrays; import java.util.Stack;public class NextGreaterElement2 {public int[] nextGreaterElements(int[] nums) {//边界判断if(nums null || nums.length < 1){return new int[]{-1};}int size …

无需兔魔法!国内手机直接畅玩GPT!

为了用上ChatGPT很多同学都是经历一波三折&#xff0c;闯三关过五将&#xff01;因为使用ChatGPT的门槛很高&#xff0c;尤其是这个kx上网把很多人都挡在了门外&#xff01;有的同学说newbing呢&#xff0c;newbing如果你要用聊天功能&#xff0c;一样有这样门槛&#xff01;很…

Ubuntu docker 基本操作

安装docker&#xff1a; curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 也可以使用国内 daocloud 一键安装命令&#xff1a; curl -sSL https://get.daocloud.io/docker | sh 启动Docker命令&#xff1a; systemctl start docker 查看版本号&#xf…

NKCTF2023 babyrust

这道题目适合科普&#xff1a;rust逆向&#xff0c;xmm指令。 rust逆向的一些注意事项 rust题中&#xff0c;“ida给的main”里的第一个lea是“用户写的main”。 如下图&#xff0c;这是ida标记的main。而用户写的main其实是sub_1400012A0。姑且可以认为“ida给的main”里的…

初识springcloud

认识微服务 单体架构&#xff1a; 简单方便&#xff0c;高度耦合&#xff0c;扩展性差&#xff0c;适合小型项目&#xff0c;例如&#xff0c;学生管理系统。 分布式架构 松耦合&#xff0c;扩展性好&#xff0c;但架构复杂&#xff0c;难度大。适合大型互联网项目。如&#x…

【数据结构】解析队列各接口功能实现

目录 前言&#xff1a; 一、队列概述&#xff1a; 1.队列的概念&#xff1a; 二、队列的各种接口功能实现&#xff1a; 1.初始化队列&#xff1a; 2.入队&#xff08;尾插&#xff09;&#xff1a; 3.出队&#xff08;头删&#xff09;&#xff1a; 4.查看队头&#xf…

Zookeeper安装(Win和Linux)

Zookeeper安装 Zookeeper单机安装&#xff08;Windows&#xff09; 下载地址&#xff1a;Apache ZooKeeper 1.1 下载安装 下载好的文件进行解压缩得到apache-zookeeper-3.8.0-bin目录&#xff0c;创建zkdata及log目录&#xff0c;后续作为数据存放目录 1.2 配置启动 我们…

易点易动设备管理系统高效管理海量备品备件

纸质设备备品备件管理是企业运营中的重要环节&#xff0c;其管理效率和精度直接关系到企业的生产效率和经济效益。然而&#xff0c;传统的纸质管理方式存在诸多问题&#xff0c;如信息不透明、数据难以更新、易丢失等。为解决这些问题&#xff0c;易点易动设备管理系统应运而生…

webpack 之 Loader开发(一)

1. You may need an additional loader to handle the result of these loaders.&#xff08;我们可能还需要一个额外的加载器来处理当前加载器的结果&#xff09; 2. Loader可能经过一层层链路、又或者只有一层&#xff0c;最终的处理都是转化成 js&#xff0c;&#xff08;L…

【LeetCode: 139. 单词拆分 | 暴力递归=>记忆化搜索=>动态规划】

&#x1f34e;作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域新星创作者&#x1f3c6;&#xff0c;保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享&#x1f48e;&#x1f48e;&#x1f48e; &#x1f34e;座右…

Ae:灯光选项

灯光选项 Light Options&#xff0c;用于调整光源的特性以及所产生的投影的相关设置。下面以属性最多的聚光灯的灯光选项为例进行说明。强度 Intensity光源的亮度。数值越大&#xff0c;光照越大。负值可产生吸光效果&#xff0c;即降低场景中其它光源的光照强度。颜色 Color默…

KNN、SVM、MLP、K-means分类实验

来源&#xff1a;投稿 作者&#xff1a;摩卡 编辑&#xff1a;学姐 数据集简介 实验使用了两个数据集&#xff0c;一个是经典的鸢尾花数据集(iris)另一个是树叶数据集(leaf) 鸢尾花数据集(iris)&#xff1a; 鸢尾花数据集发布于1988年7月1日&#xff0c;该数据集共有150条数…

客快物流大数据项目(一百一十二):初识Spring Cloud

文章目录 初识Spring Cloud 一、Spring Cloud简介 二、SpringCloud 基础架构图

使用cocopod就那么容易

第一节、配置coopod 打开终端替换ruby镜像源&#xff0c;系统自带的镜像源(gem sources --remove https://rubygems.org/)被墙挡住了或者&#xff08;https://ruby.taobao.org/&#xff09;已过期。需替换成新的镜像源。 1&#xff09;.先查看已有的镜像是否是&#xff1a;ht…

Spring Security --- 快速入门

概念 Spring Security是一个功能强大且高度可定制的&#xff0c;主要负责为Java程序提供声明式的 身份验证和访问控制 的安全框架Spring Security的底层主要是 基于 Spring AOP 和 Servlet 过滤器 来实现安全控制它提供了全面的安全解决方案同时授权粒度可以在 Web请求级和方法…

GPT-4 介绍

1 简介 本文根据openAI的2023年3月的《GPT-4 Technical Report 》翻译总结的。 原文地址&#xff1a;https://arxiv.org/pdf/2303.08774.pdf 原文确实没有GPT-4 具体的模型结构&#xff0c;openAI向盈利组织、非公开方向发展了。也没透露硬件、训练成本、训练数据、训练方法等…

攻防世界-web-easyupload

题目描述&#xff1a;一名合格的黑客眼中&#xff0c;所有的上传点都是开发者留下的后门 很简单的一个上传图片的界面。 我们先正常上传一个图片&#xff0c;从提示信息中可以看出我们是上传到了uploads目录下 然后通过bupsuite抓包修改请求&#xff0c;将文件名修改为1.php&a…

spark第七章:SparkStreaming实例

系列文章目录 系列文章目录 spark第一章&#xff1a;环境安装 spark第二章&#xff1a;sparkcore实例 spark第三章&#xff1a;工程化代码 spark第四章&#xff1a;SparkSQL基本操作 spark第五章&#xff1a;SparkSQL实例 spark第六章&#xff1a;SparkStreaming基本操作 spa…

HTML标签结构1.1(标题标签、文本格式化标签)

1&#xff0c;标签结构图&#xff1a; <!-- 加粗标签 双标签 --><strong>文字变粗</strong> <!-- 换行 单标签--><br><!-- 水平分割线 单标签--><hr> HTML标签与标签之间的关系&#xff1a; ①父子关系&#xff08;嵌套关系&…

开源代码只是心里安慰,开源软件如何选择?

大家好&#xff0c;欢迎来到停止重构的频道。 本期我们聊一个比较开放的话题&#xff0c;也是项目中经常遇到的问题。 在实际项目当中&#xff0c;由于开发成本、上线周期等因素&#xff0c;不可避免地需要使用开源软件。 开源软件意味着源码公开。 但是&#xff0c;使用开…