Bootstrap

[免费]Springboot+Vue(带推荐算法)网上购物商城系统【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的Springboot+Vue(带推荐算法)网上购物商城系统,分享下哈。

项目视频演示

【免费】Springboot+Vue(带推荐算法)网上购物商城系统 Java毕业设计_哔哩哔哩_bilibili


项目介绍

根据需求分析文档确定的需求,为系统开发提供更为详细、精确、可行的设计方案。在该文档中,我们将具体阐述系统各个阶段的设计方案,包括系统架构、模块划分、数据库设计、界面设计等细节内容,以确保开发人员能够准确理解和实现每一个阶段的开发。同时,该文档也需要提供详细的系统运行流程,通讯协议,算法实现、数据结构的说明等,以方便开发人员写出可靠的代码。另外,在系统维护时,该文档也作为重要依据,提供系统各模块的设计原则、开发要求、版本升级策略等,以确保系统可维护、可扩展、可重用性、安全性等方面要求得以满足。因此,该文档的编写应该全面考虑因素,并尽可能确保其具有清晰性、可读性和易于理解性,以便于开发人员理解、协作和实现

系统展示

部分代码

package com.shanzhu.em.controller;


import cn.hutool.core.util.BooleanUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.shanzhu.em.common.R;
import com.shanzhu.em.constants.Status;
import com.shanzhu.em.entity.form.LoginForm;
import com.shanzhu.em.entity.User;
import com.shanzhu.em.entity.vo.UserVo;
import com.shanzhu.em.service.UserService;
import com.shanzhu.em.utils.TokenUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 用户 控制层
 * <p>
 * '@CrossOrigin' 注解允许接口跨域
 *
 * @author:Admin
 * @date: 2025-5-10
 */
@CrossOrigin
@RestController
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    /**
     * 通过用户名查询用户
     *
     * @param username 用户名
     * @return 用户信息
     */
    @GetMapping("/userinfo/{username}")
    public R<User> getUserInfoByName(@PathVariable String username) {
        return R.success(userService.selectByUsername(username));
    }

    /**
     * 获取用户id
     *
     * @return 用户id
     */
    @GetMapping("/userid")
    public long getUserId() {
        return TokenUtils.getCurrentUser().getId();
    }

    /**
     * 查询所有用户
     *
     * @return 用户列表
     */
    @GetMapping("/user/")
    public R<List<User>> findAllUser() {
        return R.success(userService.list());
    }

    /**
     * 登录
     *
     * @param loginForm 登录表单
     * @return 用户信息
     */
    @PostMapping("/login")
    public R<UserVo> login(@RequestBody LoginForm loginForm) {
        return R.success(userService.login(loginForm));
    }

    /**
     * 注册
     *
     * @param loginForm 注册信息表单
     * @return 用户信息
     */
    @PostMapping("/register")
    public R<User> register(@RequestBody LoginForm loginForm) {
        return R.success(userService.register(loginForm));
    }

    /**
     * 保存用户信息
     *
     * @param user 用户信息
     * @return 结果
     */
    @PostMapping("/user")
    public R<Void> save(@RequestBody User user) {
        if (BooleanUtil.isTrue(userService.saveOrUpdate(user))) {
            return R.success();
        } else {
            return R.error(Status.CODE_500, "保存失败");
        }
    }

    /**
     * 删除用户信息
     *
     * @param id 用户id
     * @return 结果
     */
    @DeleteMapping("/user/{id}")
    public R<Void> deleteById(@PathVariable int id) {
        if (BooleanUtil.isTrue(userService.removeById(id))) {
            return R.success();
        } else {
            return R.error(Status.CODE_500, "删除失败");
        }
    }

    /**
     * 批量删除用户
     *
     * @param ids 用户id列表
     * @return 结果
     */
    @PostMapping("/user/del/batch")
    public R deleteBatch(@RequestBody List<Integer> ids) {
        if (BooleanUtil.isTrue(userService.removeBatchByIds(ids))) {
            return R.success();
        } else {
            return R.error(Status.CODE_500, "删除失败");
        }
    }

    /**
     * 分页查询用户
     *
     * @param pageNum  页数
     * @param pageSize 页大学
     * @param id       用户id
     * @param username 用户名
     * @param nickname 用户昵称
     * @return 用户
     */
    @GetMapping("/user/page")
    public R<IPage<User>> findUserPage(
            @RequestParam int pageNum,
            @RequestParam int pageSize,
            String id,
            String username,
            String nickname
    ) {
        return R.success(userService.selectUserPage(pageNum, pageSize, id, username, nickname));
    }

}
<!--
 * 用户登录页
 *
 * @Author: Admin
 * @Date: 2025-5-11
-->
<template>
 <div class="login-index" :style="backgroundDiv">

  <div class="login-window-index">

      <div class="title">
        <b><img src="../resource/logo.png" style="width: 40px;position: relative; top: 13px;right: 6px">
          <span style="color: #e75c09">登录网上购物商城</span>
        </b>
      </div>

      <div style="margin-top: 30px">

        <el-form label-width="70px">

          <el-form-item label="用户名">
            <el-input v-model.trim="user.username" aria-required="true"></el-input>
          </el-form-item>

          <el-form-item label="密码" style="margin-top: 25px">
            <el-input v-model.trim="user.password" show-password aria-required="true"></el-input>
          </el-form-item>

          <el-form-item style="margin: 30px 80px">
            <el-button type="success" @click="onSubmit">登录</el-button>
            <el-button @click="$router.push('/register')">注册</el-button>
          </el-form-item>
        </el-form>
     
      </div>
 </div>
</div>
</template>

<script>
import md5 from 'js-md5'
export default {
  name: "Login",
  //初始化数据
  data(){
    return {
      to: '/',//登陆成功跳转的页面
      user: {},
      backgroundDiv: {
        backgroundImage:
            "url(" + require("@/resource/img/login_back.png") + ")",
        backgroundRepeat: "no-repeat",
        backgroundSize: "100% 100%",
      },
    }
  },
  //页面创建
  created() {
      this.to = this.$route.query.to ? this.$route.query.to : "/"
    },
  //方法
  methods: {
    //登录提交
    onSubmit() {
      if(this.user.username==='' || this.user.password===''){
        this.$message.error("账号或密码不能为空")
        return false;
      }
      this.user.password = md5(this.user.password);
      this.request.post("/login",this.user).then(res=>{
        if(res.code==='200'){
          this.$message.success({message: "登陆成功",showClose: true})
          this.$router.push(this.to)
          localStorage.setItem("user",JSON.stringify(res.data))
        }else{
          this.$message.error(res.msg)
        }
      })
    }
  }
}
</script>

<style scoped>
.login-index {
  background: #ffffff;
  height: 100%;
  position: relative;
}

.login-window-index {
  padding: 20px;
  width: 450px;
  height: 280px;
  background: #ffffff;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}

.title {
  text-align: center;
  margin: 30px auto;
  font-size: 25px;
}
</style>

源码下载

链接:https://pan.baidu.com/s/13LqXYLbPDTBlH4DohlKlRA
提取码:1234

;