Java项目:SSM在线二手图书交易商城网站平台

news2024/9/23 5:32:56

作者主页:源码空间站2022

 简介:Java领域优质创作者、Java项目、学习资料、技术互助

文末获取源码

项目介绍

用户角色包含以下功能:
用户登录,查看商品详情,按分类查看,查看我的书架,上传二手书等功能。

由于本程序规模不大,可供课程设计,毕业设计学习演示之用
 

PS:这个没有管理员角色。

环境需要

1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。
2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;
3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可
4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 

5.数据库:MySql 5.7版本;

6.是否Maven项目:是;

技术栈

1. 后端:Spring+SpringMVC+Mybatis

2. 前端:JSP+CSS+JavaScript+jquery

使用说明

1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件;

2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven;

若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行;

3. 将项目中jdbc.properties配置文件中的数据库配置改为自己的配置;

4. 运行项目,输入localhost:8080/ssm_sebook_market 登录

运行截图

相关代码

图书控制器

package com.daniel.controller;

import com.alibaba.fastjson.JSONObject;
import com.daniel.common.Result;
import com.daniel.common.ResultGenerator;
import com.daniel.pojo.Book;
import com.daniel.pojo.BookImage;
import com.daniel.pojo.Category;
import com.daniel.pojo.User;
import com.daniel.service.BookImageService;
import com.daniel.service.BookService;
import com.daniel.service.CategoryService;
import com.daniel.service.UserService;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Map;

@RestController
@RequestMapping("/books")
public class BookController {

    @Autowired
    private UserService userService;
    @Autowired
    private BookService bookService;
    @Autowired
    private BookImageService bookImageService;
    @Autowired
    private CategoryService categoryService;

    // 日志文件
    private static final Logger log = Logger.getLogger(BookController.class);

    /**
     * 书本详情页
     * @param id 图书ID
     * @return 该ID图书的详情页
     */
    @RequestMapping(value = "/{id}",method = RequestMethod.GET)
    public ModelAndView getBookDetail(@PathVariable("id") String id) {
        ModelAndView mav = new ModelAndView("bookDetail");
        int intId = Integer.parseInt(id);
        Book curBook = bookService.get(intId);
        curBook.setBookImage(bookImageService.getByBookId(intId));
        curBook.setUser(userService.get(bookService.getUserId(intId)));
        mav.addObject("book",curBook);
        return mav;
    }

    /**
     * 上传图书
     * @param request 用于获取当前用户信息
     * @param book 图书实体类
     * @param file 图片文件
     */
    @RequestMapping(value = "",method = RequestMethod.POST)
    public Result uploadSell(HttpServletRequest request,Book book,
                           @RequestParam(value = "image" , required = false) MultipartFile file){
        // 获取当前用户的信息
        User user = (User) request.getSession().getAttribute("user");
        try {
            if(file != null && book != null){
                // 写入图书信息
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                long time = System.currentTimeMillis();
                String timeStr= sdf.format(time);
                book.setDate(timeStr);
                book.setUser(user);
                bookService.add(book);
                BookImage bookImage = new BookImage();
                bookImage.setBook(book);
                bookImageService.add(bookImage);
                String imageName = bookImage.getId()+".jpg";
                String imagePath = request.getServletContext().getRealPath("/img/book-list/article/");
                File filePath = new File(imagePath,imageName);
                if (!filePath.getParentFile().exists()){
                    filePath.getParentFile().mkdir();
                }
                file.transferTo(new File(imagePath + File.separator + imageName));
                log.info("request: book/upload , book: " + book.toString());
                return ResultGenerator.genSuccessResult();
            }else {
                return ResultGenerator.genFailResult("信息填写不完整或未上传图片!");
            }
        } catch (IOException e) {
            e.printStackTrace();
            return ResultGenerator.genFailResult("上传失败");
        }
    }

    /**
     * 更新图书的视图
     * @param id 图书的ID
     * @return 该ID的图书的更新界面
     */
    @RequestMapping(value = "/renewal/{id}",method = RequestMethod.GET)
    public ModelAndView goEditBook(@PathVariable String id){
        ModelAndView  mav = new ModelAndView("editBook");
        int bookId = Integer.parseInt(id);
        Book curBook = bookService.get(bookId);
        log.info("request: book/update , book: " + curBook.toString());
        if (curBook != null){
            curBook.setBookImage(bookImageService.getByBookId(bookId));
        }
        mav.addObject("book",curBook);
        Map<Integer,String> categories = categoryService.listByMap();
        mav.addObject("categories",categories);
        return mav;
    }

    /**
     * 根据ID获取书的Category
     * @param book
     * 应该使用GET的,但是会产生不合法URI异常,待解决
     */
    @RequestMapping(value = "/categories")
    public Result getCategory(@RequestBody Book book){
        JSONObject data = new JSONObject();
        Category category = bookService.get(book.getId()).getCategory();
        log.info("request: book/category/get , bookId: " + book.getId()+" , category:"+category.toString());
        if (category.getId() != 0){
            data.put("categoryId",category.getId());
            return ResultGenerator.genSuccessResult(data);
        }else {
            return ResultGenerator.genFailResult("无效的Category!");
        }
    }

    /**
     * 更新图书内容
     * @param request 用于获取路径
     * @param book 除图片外其他的图书信息
     * @param file 图片
     * @return
     * 应该使用PUT,可是需要上传图片,表单提交无法用PUT,待解决
     */
    @RequestMapping(value = "/renewal",method = RequestMethod.POST)
    public Result editBook(HttpServletRequest request, Book book,
                           @RequestParam(value = "image" , required = false) MultipartFile file){
        try {
            bookService.update(book);
            if (file != null) {
                BookImage bookImage = bookImageService.getByBookId(book.getId());
                bookImage.setBook(book);
                bookImageService.update(bookImage);
                String imageName = bookImage.getId() + ".jpg";
                String imagePath = request.getServletContext().getRealPath("/img/book-list/article/");
                File filePath = new File(imagePath, imageName);
                if (!filePath.getParentFile().exists()) {
                    filePath.getParentFile().mkdir();
                }else if (filePath.exists()){
                    filePath.delete();
                }
                file.transferTo(new File(imagePath + File.separator + imageName));
            }
            log.info("request: book/update , book: " + book.toString());
            return ResultGenerator.genSuccessResult();
        } catch (IOException e) {
            e.printStackTrace();
            return ResultGenerator.genFailResult("修改失败!");
        }
    }

    /**
     * 删除一本或多本图书
     * @param request 用于获取路径,删除图片
     * @param bookIds 要删除的图书ID数组
     */
    @RequestMapping(value = "",method = RequestMethod.DELETE)
    public Result deleteBook(HttpServletRequest request, @RequestParam(value = "bookIds", required = false) String[] bookIds){

        if (bookIds != null) {
            // 遍历每个ID
            for (String bookId : bookIds) {
                int id = Integer.parseInt(bookId);

                // 获取当前图书的图片名称与存放路径
                String imageName = bookImageService.getByBookId(id).getId() + ".jpg";
                String imagePath = request.getServletContext().getRealPath("/img/book-list/article/");
                File filePath = new File(imagePath, imageName);

                // 删除图片
                if (filePath.exists()){
                    filePath.delete();
                }

                // 删除数据库中的图书
                bookImageService.deleteByBookId(id);
                bookService.delete(id);
            }
            log.info("request: book/delete , bookIds: " + Arrays.toString(bookIds));
            return ResultGenerator.genSuccessResult();
        }else {
            return ResultGenerator.genFailResult("删除失败!未选中图书");
        }
    }
}

 如果也想学习本系统,下面领取。回复:187ssm

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

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

相关文章

三、CAM可解释性分析——可解释性机器学习(DataWhale组队学习)

文章目录前言CAM算法的精妙之处相关工作CAM算法其它相关问题为什么不用池化操作&#xff1f;CAM的优点CAM算法的缺点扩展阅读和思考题前言 CAM算法奠定了可解释分析的基石 CAM算法的精妙之处 对深度学习实现可解释性分析、显著性分析可扩展性强&#xff0c;后续衍生出各种…

域名备案怎么查?怎么批量查询域名备案

ICP备案&#xff0c;是为了防止在网上从事非法的网站经营活动&#xff0c;打击不良互联网信息的传播&#xff0c;国家对互联网信息服务实行的备案制度。 备案的目的就是为了防止在网上从事非法的网站经营活动&#xff0c;打击不良互联网信息的传播&#xff0c;如果网站不备…

Android TP驱动模型框架分析

本文主要是对TP驱动框架的学习。 一、概述 1、触摸IC的工作原理 tp与主控间的通信接口一般是i2c&#xff0c;即scl、sda、gnd、vcc。在正常工作时需要加上rst、int脚。 整个过程是&#xff1a;通过点击屏幕&#xff0c;tp ic端会将int 脚电平拉低&#xff0c;等待主控的读取。…

【技术分享】Anaconda下载、安装、pip切换镜像源、conda切换镜像、conda创建指定Python版本虚拟环境教程

文章目录1.下载Anaconda1.1.下载最新版本Anaconda1.2.下载历史版本的Anaconda2.安装Anaconda3.conda切换镜像源4.pip切换镜像源5.conda创建指定版本Python环境1.下载Anaconda 1.1.下载最新版本Anaconda 步骤&#xff1a; 进入Anaconda官网&#xff0c;点击Download按钮下载最…

海量数据小内存!如何找到高频数

文章目录题目解答总结题目 如何在 20 亿个无符号整数中找到出现次数最多的那个数&#xff0c;在只提供 1 G 内存的条件下 解答 找到出现次数最多的数&#xff0c;通常的思维就是使用 HashMap 来统计这 20 亿个无符号整数中每个数出现的次数 已知只有 20 亿个数&#xff0c;…

b站黑马的Vue快速入门案例代码——【axios+Vue2】悦听player(音乐播放器)

目录 本文中修改的原代码中的BUG&#xff1a; 修改方法&#xff1a; 本文案例代码仍有的BUG&#xff1a;&#xff08;欢迎大家献计献策&#xff09; 目标效果&#xff1a; 悦音player案例——效果展示视频&#xff1a; 更换的新接口/参数&#xff1a; 1.歌曲搜索接口&…

实战讲解及分析Spring新建Bean的几种方式以及创建过程(图+文+源码)

1 缘起 作为一个应用开发人员而言&#xff0c;会使用某一个工具分为两个层次&#xff08;个人观点&#xff09;&#xff1a; 第一个层次&#xff0c;知道工具&#xff0c;会使用这个工具解决问题&#xff1b; 第二个层次&#xff0c;理解工具的实现原理。 关于Spring的学习&am…

Linux Centos7 磁盘的分区、挂载

1、前言 注&#xff1a;看不懂的同学可以直接跟着后面的步骤操作 一块新的磁盘放到电脑上&#xff0c;要经过分区-->给分区设置文件系统--->挂载才能用。 也就是说要想将磁盘挂载&#xff0c;必须完成给磁盘分区和给分区设置文件系统这两步。 分区的时候先分成主分区和扩…

【DBN分类】基于matlab深度置信网络DBN变压器故障诊断【含Matlab源码 2284期】

一、深度置信网络DBN变压器故障诊断简介 1 DBN模型 DBN是深度学习中最关键的一个多层网络架构&#xff0c;如图2所示&#xff0c;由多层RBM堆叠而成&#xff0c;前一层RBM的输出为后一层RBM的输入&#xff0c;最顶层采用Softmax分类器作为标签层&#xff0c;输出分类识别的结果…

AD-DA转换(PCF8591)

AD转换目录一、AD转换&#xff08;PCF8591&#xff09;①初始化函数②读取ADC值的函数二、DA转换&#xff08;PCF8591&#xff09;三、STC15系列单片机用户手册.pdf—第10章一、AD转换&#xff08;PCF8591&#xff09; 思路&#xff1a;&#xff08;66&#xff0c;两个地址0x90…

RNA-seq——上游分析练习2(数据下载+trim-galore+hisat2+samtools+featureCounts)

目录软件安装新建文件夹一、下载数据二、质控过滤1.数据质量检测2.数据质量控制3.对处理后的数据再次QC三、序列比对1.hisat2比对2.flagstat检查一下结果四、featureCounts定量写在前面——本文是转录组上游分析的实战练习。主要包含四个步骤&#xff1a; 数据下载&#xff08…

DockerCompose编排Redis6.2.6以及遇到的那些坑

场景 Docker中使用Dockerfile的方式部署SpringBootVue前后端分离的项目(若依前后端分离框架为例): Docker中使用Dockerfile的方式部署SpringBootVue前后端分离的项目(若依前后端分离框架为例)_霸道流氓气质的博客-CSDN博客_若依 dockerfile 在上面使用Dockerfile分别构建每个…

Heron‘s formula

In geometry, Heron’s formula (or Hero’s formula) gives the area A of a triangle in terms of the three side lengths a, b, c. If {\textstyle s{\tfrac {1}{2}}(abc)}{\textstyle s{\tfrac {1}{2}}(abc)} is the semiperimeter of the triangle, the area is,[1] {\d…

影视中学职场套路——《如懿传》中职场生存法则

目录 一、老板决定的事&#xff0c;赞成不赞成都要执行 二、居人之下&#xff0c;聪明劲儿别往外露 三、切忌大庭广众直接与上级冲突 四、取悦所有人&#xff0c;不如取悦最大的boss 五、再强的人&#xff0c;也需要团队作战 六、人善被人欺&#xff08;首先要自保&#…

第三十一章 linux-模块的加载过程一

第三十一章 linux-模块的加载过程一 文章目录第三十一章 linux-模块的加载过程一sys_init_modulestruct moduleload_module模块ELF静态的内存视图字符串表&#xff08;string Table)HDR视图的第一次改写find_sec函数ps:kernel symbol内核符号表&#xff0c;就是在内核的内部函数…

opencv图像去畸变

图像去畸变的思路 对于目标图像(无畸变图像)上的每个像素点&#xff0c;转换到normalize平面&#xff0c;再进行畸变变换&#xff0c;进行投影&#xff0c;得到这个像素点畸变后的位置&#xff0c;然后将这个位置的源图像&#xff08;畸变图像&#xff09;的像素值作为目标图像…

Visual Studio 2022安装与编译简单c语言以及C#语言(番外)

文章目录1 软件下载网站2 下载与安装3 创建并学习C语言4 创建并学习C#语言1 软件下载网站 Visual Studio官网 2 下载与安装 1、下载社区版即可。 2、下载得到安装文件&#xff0c;右键以管理员方式运行安装文件。 3、点击继续。 4、等待下载完成。 5、这里学习C选择使用…

SpringBoot文件上传同时,接收复杂参数

目录 环境信息 问题描述 错误分析 解决方法 简单参数 总结 环境信息 Spring Boot&#xff1a;2.0.8.RELEASE Spring Boot内置的tomcat&#xff1a;tomcat-embed-core 8.5.37 问题描述 收到文件上传的开发工作&#xff0c;要求能适配各种场景&#xff0c;并且各场景的请求…

C语言——操作符详解(上)

C语言——操作符详解&#xff08;上&#xff09; 操作符的分类 C语言中的操作符主要分为算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式、下标引用、函数调用和结构成员。我将分成三篇文章为大家详细介绍以上所…

[附源码]Python计算机毕业设计Django网约车智能接单规划小程序

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…