【保姆级SSM教程】高并发朋友圈点赞项目设计

简介: 【保姆级SSM教程】高并发朋友圈点赞项目设计

【保姆级SSM教程】高并发朋友圈点赞项目设计

项目部署方法:

所用技术栈

项目还在维护更新中,Start一下可以和我一起维护呀,我会持续开发最新模块,完善项目。

github地址:https://github.com/JackieLing/Sell-Circle-Option.git

一、数据库建表设计

1.1、创建user表(用户表)

/*
Navicat MySQL Data Transfer
Source Server         : localhost
Source Server Version : 50717
Source Host           : localhost:3306
Source Database       : springmvc-mybatis-book
Target Server Type    : MYSQL
Target Server Version : 50717
File Encoding         : 65001
Date: 2018-05-01 18:11:23
*/
-- ----------------------------
-- Table structure for ay_user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(32) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `account` varchar(20) default null,
  PRIMARY KEY (`id`),
  key `user_name_index`(`name`) using btree,
  key `user_account_index`(`account`) using btree
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

1.2、创建mood表(说说表)

/*
Navicat MySQL Data Transfer
Source Server         : localhost
Source Server Version : 50717
Source Host           : localhost:3306
Source Database       : springmvc-mybatis-book
Target Server Type    : MYSQL
Target Server Version : 50717
File Encoding         : 65001
Date: 2018-05-01 18:11:23
*/
-- ----------------------------
-- Table structure for  mood
-- ----------------------------
CREATE TABLE `mood` (
  `id` int(32) NOT NULL AUTO_INCREMENT,
  `content` varchar(256) DEFAULT NULL,
  `user_id` varchar(32) default null,
  `publish_time` datetime default null,
  `praise_num` int(11) default null,
  PRIMARY KEY (`id`),
  key `mood_user_id_index` (`user_id`) using btree
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

1.3、创建user_mood_praise_rel表(点赞关联表)

/*
Navicat MySQL Data Transfer
Source Server         : localhost
Source Server Version : 50717
Source Host           : localhost:3306
Source Database       : springmvc-mybatis-book
Target Server Type    : MYSQL
Target Server Version : 50717
File Encoding         : 65001
Date: 2018-05-01 18:11:23
*/
-- ----------------------------
-- Table structure for  user_mood_praise_rel
-- ----------------------------
CREATE TABLE `user_mood_praise_rel` (
  `id` int(32) NOT NULL AUTO_INCREMENT,
  `user_id` varchar(32) default null,
  `mood_id` varchar(32) default null,
  PRIMARY KEY (`id`),
  key `user_mood_praise_rel_user_id_index`(`user_id`) using btree,
  key `user_mood_praise_rel_mood_id_index`(`mood_id`) using btree
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

1.4、数据库初始化数据

1.4.1、user表初始化数据

/*
Navicat MySQL Data Transfer
Source Server         : localhost
Source Server Version : 50717
Source Host           : localhost:3306
Source Database       : springmvc-mybatis-book
Target Server Type    : MYSQL
Target Server Version : 50717
File Encoding         : 65001
Date: 2018-05-01 18:11:23
*/
-- ----------------------------
-- Table structure for  user_mood_praise_rel  data  insert
-- ----------------------------
insert into `user` VALUES ('3','阿毅','ay');
insert into `user` VALUES ('2','阿兰','al');

1.4.2、mood表初始化数据

/*
Navicat MySQL Data Transfer
Source Server         : localhost
Source Server Version : 50717
Source Host           : localhost:3306
Source Database       : springmvc-mybatis-book
Target Server Type    : MYSQL
Target Server Version : 50717
File Encoding         : 65001
Date: 2018-05-01 18:11:23
*/
-- ----------------------------
-- Table structure for  mood  data  insert
-- ----------------------------
insert into `mood` VALUES ('1','今天天气真好','1','2018-06-30 22:09:06','100');
insert into `mood` VALUES ('2','厦门真美,么么哒!','2','2018-07-29 17:09:06','99');

二、实体类设计

2.1、实体类结构图示:进行属性封装

2.2、创建对应实体类的Dao层和Mapper文件

2.2.1、创爱User类的DaoUserDao接口,生成一个抽象方法findAll方法用户查询用户。

package com.ay.dao;
import com.ay.model.User;
public interface UserDao {
    //查询用户
    User findAll(int id);
}

2.2.2、在resource目录下创建mapper文件,新建一个UserMapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ay.dao.UserDao">
    <resultMap id="userMap" type="com.ay.model.User">
        <id property="id" column="id"/>
        <id property="name" column="name"/>
        <id property="account" column="account"/>
    </resultMap>
 
    <sql id="table_column">
        id,
        name,
        account
    </sql>
    <select id="find" resultMap="userMap">
        select
        <include refid="table_column"/>
        from user
        <where>
            id=#{id}
        </where>
    </select>
</mapper>

2.2.3、在dao层新建 MoodDao接口

package com.ay.dao;
import com.ay.model.Mood;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface MoodDao {
    List<Mood> findAll();
}

2.2.4、在resource目录的mapper文件下创建MoodMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ay.dao.MoodDao">
    <cache-ref namespace="com.ay.dao.UserDao"/>
    <resultMap id="moodMap" type="com.ay.model.Mood">
        <id property="id" column="id"/>
        <result property="content" column="content"/>
        <result property="userId" column="user_id"/>
        <result property="praiseNum" column="praise_num"/>
        <result property="publishTime" column="publish_time"/>
    </resultMap>
    <sql id="table_column">
        id,
        content,
        user_id,
        praise_num,
        publish_time
    </sql>
    <select id="findAll" resultMap="moodMap">
        select
        <include refid="table_column"/>
        from mood
    </select>
</mapper>

2.2.5、在dao层创建UserMoodPraiseRelDao接口

package com.ay.dao;
import com.ay.model.UserMoodPraiseRel;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
/**
 * 描述:用户说说点赞关联DAO
 *
 * @author Ay
 * @create 2018/07/01
 **/
@Repository
public interface UserMoodPraiseRelDao {
    boolean save(@Param("userMoodPraiseRel") UserMoodPraiseRel userMoodPraiseRel);
}

2.2.6在mapper文件下创建UserMoodPraiseRelMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ay.dao.UserMoodPraiseRelDao">
    <insert id="save" useGeneratedKeys="true" keyProperty="id"
            parameterType="com.ay.model.UserMoodPraiseRel">
        insert into user_mood_praise_rel (user_id, mood_id)
        VALUE (#{userMoodPraiseRel.userId}, #{userMoodPraiseRel.moodId})
    </insert>
</mapper>

2.3、创建Service层和DTO类

2.3.1创建dto包下的MoodDTO类
package com.ay.dto;
import com.ay.model.Mood;
import java.io.Serializable;
/**
 * 描述:说说DTO
 *
 * @author Ay
 * @date 2018/1/6.
 */
public class MoodDTO extends Mood implements Serializable {
    /**
     * 用户名称
     */
    private String userName;
    /**
     * 用户的账号
     */
    private String userAccount;
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserAccount() {
        return userAccount;
    }
    public void setUserAccount(String userAccount) {
        this.userAccount = userAccount;
    }
}
2.3.2创建dto包下的UserDTO类
package com.ay.dto;
import com.ay.model.User;
/**
 * 描述:用户DTO
 *
 * @author Ay
 * @create 2018/07/01
 **/
public class UserDTO extends User {
}
2.3.4在Service层创建UserService接口
package com.ay.service;
import com.ay.dto.UserDTO;
/**
 * 描述:用户服务接口
 *
 * @author Ay
 * @date 2018/1/6.
 */
public interface UserService {
    UserDTO find(String id);
}
2.3.5在Service层创建MoodService接口
package com.ay.service;
import com.ay.dto.MoodDTO;
import java.util.List;
public interface MoodService {
    //查询所有的说说
    List<MoodDTO> findAll();
}
2.3.6在service的Impl文件下新建UserServiceImpl.java
package com.ay.service.impl;
import com.ay.dao.UserDao;
import com.ay.dto.UserDTO;
import com.ay.model.User;
import com.ay.service.UserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
 * 描述:用户服务类
 *
 * @author Ay
 * @date 2018/1/6.
 */
@Service
public class UserServiceImpl implements UserService {
    @Resource
    private UserDao userDao;
    public UserDTO find(String id) {
        User user = userDao.find(id);
        return converModel2DTO(user);
    }
    private UserDTO converModel2DTO(User user) {
        UserDTO userDTO = new UserDTO();
        userDTO.setId(user.getId());
        userDTO.setAccount(user.getAccount());
        userDTO.setName(user.getName());
        return userDTO;
    }
}
2.3.7、在service的Impl文件下新建MoodServiceImpl.java
package com.ay.service.impl;
import com.ay.dao.MoodDao;
import com.ay.dao.UserDao;
import com.ay.dto.MoodDTO;
import com.ay.model.Mood;
import com.ay.model.User;
import com.ay.service.MoodService;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
 * 描述:说说服务类
 *
 * @author Ay
 * @date 2018/1/6.
 */
@Service
public class MoodServiveImpl implements MoodService {
    @Resource
    private MoodDao moodDao;
    @Resource
    private UserDao userDao;
    public List<MoodDTO> findAll() {
        List<Mood> moodList = moodDao.findAll();
        return converModel2DTO(moodList);
    }
    private List<MoodDTO> converModel2DTO(List<Mood> moodList) {
        if (CollectionUtils.isEmpty(moodList)) return Collections.EMPTY_LIST;
        List<MoodDTO> moodDTOList = new ArrayList<MoodDTO>();
        for (Mood mood : moodList) {
            MoodDTO moodDTO = new MoodDTO();
            moodDTO.setId(mood.getId());
            moodDTO.setContent(mood.getContent());
            moodDTO.setPraiseNum(mood.getPraiseNum());
            moodDTO.setPublishTime(mood.getPublishTime());
            moodDTO.setUserId(mood.getUserId());
            moodDTOList.add(moodDTO);
            //设置用户信息
            User user = userDao.find(mood.getUserId());
            moodDTO.setUserName(user.getName());
            moodDTO.setUserAccount(user.getAccount());
        }
        return moodDTOList;
    }
}
2.3.8、在service文件下新建MoodServiceImpl接口
package com.ay.service;
import com.ay.model.UserMoodPraiseRel;
/**
 * 描述:用户说说点赞关联接口
 *
 * @author Ay
 * @date 2018/1/6.
 */
public interface UserMoodPraiseRelService {
    boolean save(UserMoodPraiseRel userMoodPraiseRel);
}
2.3.9、在service的Impl文件下新建UserMoodPraiseRelServiceImpl
package com.ay.service.impl;
import com.ay.dao.UserMoodPraiseRelDao;
import com.ay.model.UserMoodPraiseRel;
import com.ay.service.UserMoodPraiseRelService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
 * 描述:用户说说点赞关联服务类
 *
 * @author Ay
 * @date 2018/1/6.
 */
@Service
public class UserMoodPraiseRelServiceImpl implements UserMoodPraiseRelService {
    @Resource
    private UserMoodPraiseRelDao userMoodPraiseRelDao;
    public boolean save(UserMoodPraiseRel userMoodPraiseRel) {
        return userMoodPraiseRelDao.save(userMoodPraiseRel);
    }
}

2.4、Controller层和前端页面

2.4.1创建Controller层下的UserController
package com.ay.controller;
import com.ay.service.UserService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
 * 描述:用户控制层
 *
 * @author Ay
 * @date 2018/6/6.
 */
@RestController
@RequestMapping("/user")
public class UserController {
    @Resource
    private UserService userService;
}
2.4.2创建Controller层下的MoodController
package com.ay.controller;
import com.ay.dto.MoodDTO;
import com.ay.service.MoodService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.annotation.Resource;
import java.util.List;
/**
 * 描述:说说控制层
 *
 * @author Ay
 * @date 2018/1/6.
 */
@Controller
@RequestMapping("/mood")
public class MoodController {
    @Resource
    private MoodService moodService;
    @GetMapping(value = "/findAll")
    public String findAll(Model model) {
        List<MoodDTO> moodDTOList = moodService.findAll();
        model.addAttribute("moods", moodDTOList);
        return "mood";
    }
}
2.4.3、在web-inf下创建views文件下创建mood.jsp
<%@page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8" isELIgnored="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
<!DOCTYPE HTML>
<html>
<head>
    <title>Getting Started: Serving Web Content</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<div id="moods">
    <b>说说列表:</b><br>
    <c:forEach items="${moods}" var="mood">
        ------------------------------------
        <br>
        <b>用户:</b><span id="account">${mood.userName}</span><br>
        <b>说说内容:</b><span id="content">${mood.content}</span><br>
        <b>发表时间:</b>
        <span id="publish_time">
                ${mood.publishTime}
        </span><br>
        <b>点赞数:</b><span id="praise_num">${mood.praiseNum}</span><br>
        <div style="margin-left: 350px">
                <%--<a id="praise" href="/mood/${mood.id}/praise?userId=${mood.userId}">赞</a>--%>
            <a id="praise" href="/mood/${mood.id}/praiseForRedis?userId=${mood.userId}">赞</a>
        </div>
    </c:forEach>
</div>
</body>
<script></script>
</html>

三、测试

http://localhost:8080/SSM_war/mood/findAll

**

目录
相关文章
|
24天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
17天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
4天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
1天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
226 12
|
19天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
21天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2579 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
3天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
168 2
|
1天前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
101 65
|
21天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1578 16
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
4天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
253 2