基于Java Jsp SpringMVC等实现漫威手办商城系统


一、前言介绍:

随着社会的快速发展,计算机的影响是全面且深入的。人们生活水平的不断提高,日常生活中用户对手办周边商城方面的要求也在不断提高,而漫威系列手办周边商城得到广大用户的青睐,使得漫威系列手办周边商城的开发成为必需而且紧迫的事情。漫威系列手办周边商城主要是借助计算机,通过对漫威系列手办周边商城所需的信息管理,增加用户的选择,同时也方便对广大用户信息的及时查询、修改以及对用户信息的及时了解。手办周边商城对用户带来了更多的便利,该系统通过和数据库管理系统软件协作来满足用户的需求。计算机技术在现代管理中的应用,使计算机成为人们应用现代技术的重要工具。能够有效的解决获取信息便捷化、全面化的问题,提高效率。

二、功能设计:

本漫威系列手办周边商城系统主要功能设计为实现管理员;个人中心、系统公告管理、用户管理、商品系列管理、商品信息管理、订单评价管理、论坛管理、系统管理、订单管理,用户;个人中心、订单评价管理、我的收藏管理、订单管理,前台首页;首页、商品信息、论坛信息、我的、跳转到后台、购物车客服等信息管理功能。 系统操作流程如下:

三、功能截图:

普通用户登录注册:

首页主要功能介绍:商品信息、论坛信息、我的、跳转到后台、购物车客服等信息管理功能

商品详情:可加入购物车、修改数量、立即购买和收藏商品

商品详情可以配置图文介绍等

商品评论交流模块

添加了论坛帖子系列功能:普通用户可以发布、可以对帖子进行交流讨论等

帖子详情数据查看、可以在底部评论

在我的个人中心可以查看我的发布、我的订单、我的地址修改以及我的收藏模块和个人信息模块

购物车模块:要选择收货地址信息等

我的订单模块:

我的收藏模块:

普通用户后台中心:

订单评价:

收藏管理:

订单信息管理:

后端管理员主要功能:

修改密码:

用户管理:

商品系列管理:

商品信息管理:

商品详情修改:

商品评价管理:

论坛管理:

客服管理:

首页轮播图管理:

订单信息管理:

四、数据库设计:

表address (地址)

编号 名称 数据类型 长度 小数位 允许空值 主键
1 id bigint 20 0 N Y
2 addtime timestamp 19 0 N N
3 userid bigint 20 0 N N
4 address varchar 200 0 N N
5 name varchar 200 0 N N
6 phone varchar 200 0 N N
7 isdefault varchar 200 0 N N

表cart (购物车表)

编号 名称 数据类型 长度 小数位 允许空值 主键
1 id bigint 20 0 N Y
2 addtime timestamp 19 0 N N
3 tablename varchar 200 0 Y N
4 userid bigint 20 0 N N
5 goodid bigint 20 0 N N
6 goodname varchar 200 0 Y N
7 picture varchar 200 0 Y N
8 buynumber int 10 0 N N
9 price float 13 0 Y N
10 discountprice float 13 0 Y N

表chat (客服聊天表)

编号 名称 数据类型 长度 小数位 允许空值 主键 说明
1 id bigint 20 0 N Y 主键
2 addtime timestamp 19 0 N N 创建时间
3 userid bigint 20 0 N N 用户id
4 adminid bigint 20 0 Y N 管理员id
5 ask longtext 2147483647 0 Y N 提问
6 reply longtext 2147483647 0 Y N 回复
7 isreply int 10 0 Y N 是否回复

表config (配置文件)

编号 名称 数据类型 长度 小数位 允许空值 主键 说明
1 id bigint 20 0 N Y 主键
2 name varchar 100 0 N N 配置参数名称
3 value varchar 100 0 Y N 配置参数值

表dingdanpingjia (订单评价)

编号 名称 数据类型 长度 小数位 允许空值 主键 说明
1 id bigint 20 0 N Y 主键
2 addtime timestamp 19 0 N N 创建时间
3 dingdanbianhao varchar 200 0 N N 订单编号
4 shangpinbianhao varchar 200 0 Y N 商品编号
5 shangpinmingcheng varchar 200 0 N N 商品名称
6 shangpinxilie varchar 200 0 Y N 商品系列
7 pingfen varchar 200 0 Y N 评分
8 pingjianeirong longtext 2147483647 0 Y N 评价内容
9 tianjiatupian varchar 200 0 Y N 添加图片
10 pingjiariqi date 10 0 Y N 评价日期
11 yonghuming varchar 200 0 Y N 用户名
12 lianxidianhua varchar 200 0 Y N 联系电话
13 sfsh varchar 200 0 Y N 是否审核
14 shhf longtext 2147483647 0 Y N 审核回复

表discussshangpinxinxi (商品信息评论表)

编号 名称 数据类型 长度 小数位 允许空值 主键 说明
1 id bigint 20 0 N Y 主键
2 addtime timestamp 19 0 N N 创建时间
3 refid bigint 20 0 N N 关联表id
4 userid bigint 20 0 N N 用户id
5 content longtext 2147483647 0 N N 评论内容
6 reply longtext 2147483647 0 Y N 回复内容

表discussxitonggonggao (系统公告评论表)

编号 名称 数据类型 长度 小数位 允许空值 主键 说明
1 id bigint 20 0 N Y 主键
2 addtime timestamp 19 0 N N 创建时间
3 refid bigint 20 0 N N 关联表id
4 userid bigint 20 0 N N 用户id
5 content longtext 2147483647 0 N N 评论内容
6 reply longtext 2147483647 0 Y N 回复内容

表forum (论坛表)

编号 名称 数据类型 长度 小数位 允许空值 主键 说明
1 id bigint 20 0 N Y 主键
2 addtime timestamp 19 0 N N 创建时间
3 title varchar 200 0 Y N 帖子标题
4 content longtext 2147483647 0 N N 帖子内容
5 parentid bigint 20 0 Y N 父节点id
6 userid bigint 20 0 N N 用户id
7 username varchar 200 0 Y N 用户名
8 isdone varchar 200 0 Y N 状态

表orders (订单)

编号 名称 数据类型 长度 小数位 允许空值 主键 说明
1 id bigint 20 0 N Y 主键
2 addtime timestamp 19 0 N N 创建时间
3 orderid varchar 200 0 N N 订单编号
4 tablename varchar 200 0 Y N 商品表名
5 userid bigint 20 0 N N 用户id
6 goodid bigint 20 0 N N 商品id
7 goodname varchar 200 0 Y N 商品名称
8 picture varchar 200 0 Y N 商品图片
9 buynumber int 10 0 N N 购买数量
10 price float 13 0 N N 价格/积分
11 discountprice float 13 0 Y N 折扣价格
12 total float 13 0 N N 总价格/总积分
13 discounttotal float 13 0 Y N 折扣总价格
14 type int 10 0 Y N 支付类型
15 status varchar 200 0 Y N 状态
16 address varchar 200 0 Y N 地址

表shangpinxilie (商品系列)

编号 名称 数据类型 长度 小数位 允许空值 主键 说明
1 id bigint 20 0 N Y 主键
2 addtime timestamp 19 0 N N 创建时间
3 shangpinxilie varchar 200 0 N N 商品系列

表shangpinxinxi (商品信息)

编号 名称 数据类型 长度 小数位 允许空值 主键 说明
1 id bigint 20 0 N Y 主键
2 addtime timestamp 19 0 N N 创建时间
3 shangpinbianhao varchar 200 0 Y N 商品编号
4 shangpinmingcheng varchar 200 0 N N 商品名称
5 shangpinxilie varchar 200 0 Y N 商品系列
6 tupian varchar 200 0 Y N 图片
7 guige varchar 200 0 Y N 规格
8 shangpinxiangqing longtext 2147483647 0 Y N 商品详情
9 clicktime datetime 19 0 Y N 最近点击时间
10 clicknum int 10 0 Y N 点击次数
11 price float 13 0 N N 价格

表storeup (收藏表)

编号 名称 数据类型 长度 小数位 允许空值 主键 说明
1 id bigint 20 0 N Y 主键
2 addtime timestamp 19 0 N N 创建时间
3 userid bigint 20 0 N N 用户id
4 refid bigint 20 0 Y N 收藏id
5 tablename varchar 200 0 Y N 表名
6 name varchar 200 0 N N 收藏名称
7 picture varchar 200 0 N N 收藏图片

表token (token表)

编号 名称 数据类型 长度 小数位 允许空值 主键 说明
1 id bigint 20 0 N Y 主键
2 userid bigint 20 0 N N 用户id
3 username varchar 100 0 N N 用户名
4 tablename varchar 100 0 Y N 表名
5 role varchar 100 0 Y N 角色
6 token varchar 200 0 N N 密码
7 addtime timestamp 19 0 N N 新增时间
8 expiratedtime timestamp 19 0 N N 过期时间

表users (用户表)

编号 名称 数据类型 长度 小数位 允许空值 主键 说明
1 id bigint 20 0 N Y 主键
2 username varchar 100 0 N N 用户名
3 password varchar 100 0 N N 密码
4 role varchar 100 0 Y N 角色
5 addtime timestamp 19 0 N N 新增时间

表xitonggonggao (系统公告)

编号 名称 数据类型 长度 小数位 允许空值 主键 说明
1 id bigint 20 0 N Y 主键
2 addtime timestamp 19 0 N N 创建时间
3 gonggaobiaoti varchar 200 0 N N 公告标题
4 gonggaoleixing varchar 200 0 N N 公告类型
5 tupian varchar 200 0 Y N 图片
6 neirong longtext 2147483647 0 Y N 内容
7 faburiqi date 10 0 Y N 发布日期

表yonghu (用户)

编号 名称 数据类型 长度 小数位 允许空值 主键 说明
1 id bigint 20 0 N Y 主键
2 addtime timestamp 19 0 N N 创建时间
3 yonghuming varchar 200 0 N N 用户名
4 mima varchar 200 0 N N 密码
5 xingming varchar 200 0 N N 姓名
6 xingbie varchar 200 0 Y N 性别
7 touxiang varchar 200 0 Y N 头像
8 lianxidianhua varchar 200 0 Y N 联系电话
9 money float 13 0 Y N 余额

五、关键代码:

/**
 * 登录相关
 */
@RequestMapping("users")
@RestController
public class UserController{

    @Autowired
    private UserService userService;

    @Autowired
    private TokenService tokenService;

    /**
     * 登录
     */
    @IgnoreAuth
//  @PostMapping(value = "/login")
    @RequestMapping(value = "/login", method ={RequestMethod.GET,RequestMethod.POST} )
    public R login(String username, String password, String captcha, HttpServletRequest request) {
        UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
        if(user==null || !user.getPassword().equals(password)) {
            return R.error("账号或密码不正确");
        }
        String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
        return R.ok().put("token", token);
    }

    /**
     * 注册
     */
    @IgnoreAuth
    @PostMapping(value = "/register")
    public R register(@RequestBody UserEntity user){
//      ValidatorUtils.validateEntity(user);
        if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
            return R.error("用户已存在");
        }
        userService.insert(user);
        return R.ok();
    }

    /**
     * 退出
     */
    @GetMapping(value = "logout")
    public R logout(HttpServletRequest request) {
        request.getSession().invalidate();
        return R.ok("退出成功");
    }

    /**
     * 密码重置
     */
    @IgnoreAuth
    @RequestMapping(value = "/resetPass")
    public R resetPass(String username, HttpServletRequest request){
        UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
        if(user==null) {
            return R.error("账号不存在");
        }
        user.setPassword("123456");
        userService.update(user,null);
        return R.ok("密码已重置为:123456");
    }

    /**
     * 列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,UserEntity user){
        EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
        PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));
        return R.ok().put("data", page);
    }

    /**
     * 列表
     */
    @RequestMapping("/list")
    public R list( UserEntity user){
        EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
        ew.allEq(MPUtil.allEQMapPre( user, "user")); 
        return R.ok().put("data", userService.selectListView(ew));
    }

    /**
     * 信息
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") String id){
        UserEntity user = userService.selectById(id);
        return R.ok().put("data", user);
    }

    /**
     * 获取用户的session用户信息
     */
    @RequestMapping("/session")
    public R getCurrUser(HttpServletRequest request){
        Long id = (Long)request.getSession().getAttribute("userId");
        UserEntity user = userService.selectById(id);
        return R.ok().put("data", user);
    }

    /**
     * 保存
     */
    @PostMapping("/save")
    public R save(@RequestBody UserEntity user){
//      ValidatorUtils.validateEntity(user);
        if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
            return R.error("用户已存在");
        }
        userService.insert(user);
        return R.ok();
    }

    /**
     * 修改
     */
    @RequestMapping("/update")
    public R update(@RequestBody UserEntity user){
//        ValidatorUtils.validateEntity(user);
        userService.updateById(user);//全部更新
        return R.ok();
    }

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        userService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
}



<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- 配置数据源 -->
    <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="url" value="${jdbc_url}"/>
        <property name="username" value="${jdbc_username}"/>
        <property name="password" value="${jdbc_password}"/>

        <!-- 初始化连接大小 -->
        <property name="initialSize" value="0"/>
        <!-- 连接池最大使用连接数量 -->
        <property name="maxActive" value="20"/>
        <!-- 连接池最大空闲 -->
        <property name="maxIdle" value="20"/>
        <!-- 连接池最小空闲 -->
        <property name="minIdle" value="0"/>
        <!-- 获取连接最大等待时间 -->
        <property name="maxWait" value="60000"/>

        <property name="validationQuery" value="${validationQuery}"/>
        <property name="testOnBorrow" value="false"/>
        <property name="testOnReturn" value="false"/>
        <property name="testWhileIdle" value="true"/>

        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000"/>
        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="25200000"/>

        <!-- 打开removeAbandoned功能 -->
        <property name="removeAbandoned" value="true"/>
        <!-- 1800秒,也就是30分钟 -->
        <property name="removeAbandonedTimeout" value="1800"/>
        <!-- 关闭abanded连接时输出错误日志 -->
        <property name="logAbandoned" value="true"/>

        <!-- 监控数据库 -->
        <property name="filters" value="mergeStat"/>
    </bean>

    <!-- Spring整合Mybatis,更多查看文档:http://mp.baomidou.com -->
    <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!-- 自动扫描Mapping.xml文件 -->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
        <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
        <property name="typeAliasesPackage" value="com..model.*"/>
        <property name="typeEnumsPackage" value="com.model.enums"/>
        <property name="plugins">
            <array>
                <!-- 分页插件配置 -->
                <bean id="paginationInterceptor" class="com.baomidou.mybatisplus.plugins.PaginationInterceptor">
                </bean>
            </array>
        </property>
        <!-- 全局配置注入 -->
        <property name="globalConfig" ref="globalConfig" />
    </bean>
    <bean id="globalConfig" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
        <!--
            AUTO->`0`("数据库ID自增")
            INPUT->`1`(用户输入ID")
            ID_WORKER->`2`("全局唯一ID")
            UUID->`3`("全局唯一ID")
        -->
        <property name="idType" value="2" />
        <!--
            MYSQL->`mysql`
            ORACLE->`oracle`
            DB2->`db2`
            H2->`h2`
            HSQL->`hsql`
            SQLITE->`sqlite`
            POSTGRE->`postgresql`
            SQLSERVER2005->`sqlserver2005`
            SQLSERVER->`sqlserver`
        -->
        <!-- Oracle需要添加该项 -->
        <!-- <property name="dbType" value="oracle" /> -->
        <!-- 全局表为下划线命名设置 true -->
        <!-- <property name="dbColumnUnderline" value="true" /> -->
        <property name="metaObjectHandler">
            <bean class="com.config.MyMetaObjectHandler" />
        </property>
    </bean>

    <!-- MyBatis 动态扫描  -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.dao"/>
    </bean>

    <!-- 配置事务管理 -->
    <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 事务管理 属性 -->
    <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="append*" propagation="REQUIRED"/>
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="modify*" propagation="REQUIRED"/>
            <tx:method name="edit*" propagation="REQUIRED"/>
            <tx:method name="insert*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <tx:method name="remove*" propagation="REQUIRED"/>
            <tx:method name="repair" propagation="REQUIRED"/>

            <tx:method name="get*" propagation="REQUIRED" read-only="true"/>
            <tx:method name="find*" propagation="REQUIRED" read-only="true"/>
            <tx:method name="load*" propagation="REQUIRED" read-only="true"/>
            <tx:method name="search*" propagation="REQUIRED" read-only="true"/>
            <tx:method name="datagrid*" propagation="REQUIRED" read-only="true"/>

            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

    <!-- 配置切面 -->
    <aop:config>
        <aop:pointcut id="transactionPointcut" expression="execution(* com.service..*.*(..))"/>
        <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice"/>
    </aop:config>

</beans>


原文链接:https://blog.csdn.net/weixin_39709134/article/details/122967896?utm_medium=distribute.pc_feed_blog.none-task-blog-hot_rank_bottoming-8.nonecasedepth_1-utm_source=distribute.pc_feed_blog.none-task-blog-hot_rank_bottoming-8.nonecase