15. 实现业务功能--帖子操作

这篇具有很好参考价值的文章主要介绍了15. 实现业务功能--帖子操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 集成编译器

editor.md 支持 MarkDown 语法编辑,在需要用户输⼊内容的页面按以下代码嵌入编辑器
1.1 编写 HTML
<!-- 引⼊编辑器的CSS -->
<link rel="stylesheet" href="./dist/editor.md/css/editormd.min.css">
<!-- 引⼊编辑器JS -->
<script src="./dist/editor.md/editormd.min.js"></script>
<script src="./dist/editor.md/lib/marked.min.js"></script>
<script src="./dist/editor.md/lib/prettify.min.js"></script>
<script src="./dist/libs/tinymce/tinymce.min.js" defer></script>
<!-- 需要初始化编辑器的DIV -->
<div id="edit-article">
 <!-- textarea也是⼀个表单控件,当在editor.md中编辑好的内容会关联这个⽂本域上 -->
 <textarea id="article_post_content" style="display: none;"></textarea>
</div>
1.2 编写 JS
var editor = editormd("edit-article", {
 width: "100%",
 height: "100%",
 // theme : "dark",
 // previewTheme : "dark",
 // editorTheme : "pastel-on-dark",
 codeFold: true,
 //syncScrolling : false,
 saveHTMLToTextarea: true, // 保存 HTML 到 Textarea
 searchReplace: true,
 watch : true, // 关闭实时预览
 htmlDecode: "style,script,iframe|on*", // 开启 HTML 标签解析,为了安
全性,默认不开启 
 // toolbar : false, //关闭⼯具栏
 // previewCodeHighlight : false, // 关闭预览 HTML 的代码块⾼亮,默认开启
 emoji: true,
 taskList: true,
 tocm: true, // Using [TOCM]
 tex: true, // 开启科学公式TeX语⾔⽀持,默认关闭
 // flowChart: true, // 开启流程图⽀持,默认关闭
 // sequenceDiagram: true, // 开启时序/序列图⽀持,默认关闭,
 placeholder: '开始创作...', // 占位符
 path: "./dist/editor.md/lib/"
});

2. 发布帖子

2.1 实现逻辑

1. 用户点击发布新帖按钮,进入发贴页面

15. 实现业务功能--帖子操作,项目,java,数据库,服务器

2. 选择版块,填入标题、正文后提交服务器

15. 实现业务功能--帖子操作,项目,java,数据库,服务器 

15. 实现业务功能--帖子操作,项目,java,数据库,服务器

3. 服务器校验信息,并写入数据库

4. 更新用户发帖数与版块贴子数

5. 返回结果 

要对帖子表、用户表、板块表同时进行操作,就需要通过事务进行管理。 

2.2 参数要求
参数名 描述 类型 默认值 条件
boardId 版块 Id long 必须
title 文章标题 String 必须
content 帖子内容 String 必须

作者 Id 需要从 Session 中获取(即当前的登录用户)。

2.3 在 UserExtMapper.xml 中编写 SQL 语句
<!-- 更新用户的发帖数 -->
  <update id="updateArticleCount" parameterType="java.lang.Long">
    update t_user set articleCount = articleCount + 1,updateTime = now() where id = #{id,jdbcType=BIGINT}
  </update>
2.4 创建 Service 接口
在 IUserService 定义方法:
    /**
     * 贴子数增加1
     * @param id
     * @return
     */
   void addOneArticleCountById(Long id);
在 IBoardService 定义方法:
    /**
     * 贴子数增加1
     * @param id
     * @return
     */
   void addOneArticleCountById(Long id);

在 IArticleService 定义方法:

使用事务管理,加入 @Transactional 注解

 文章来源地址https://www.toymoban.com/news/detail-680903.html

    /**
     * 发布帖⼦
     * @param article 帖⼦信息
     */
    // 事务管理
    @Transactional
    void create(Article article);

在这个方法中,需要对三个表进行更新操作,因此需要通过事务进行管理。如果在执行过程中抛出异常,那么事务将会被自动回滚。

2.5 实现 Service 接口

在 IBoradService.java 中实现以下方法:

 @Override
    public void addOneArticleCountById(Long id) {
        // 非空检验
        if(id == null || id <= 0){
            // 打印日志
            log.warn(ResultCode.FAILED_PARAMS_VALIDATE.toString());
            // 抛出异常
            throw new ApplicationException(AppResult.failed(ResultCode.FAILED_PARAMS_VALIDATE));
        }
        // 查询现有的用户信息
        User user = selectById(id);
        // 校验用户是否存在
        if (user == null) {
            // 打印日志
            log.info(ResultCode.FAILED_USER_NOT_EXISTS.toString());
            // 抛出异常
            throw new ApplicationException(AppResult.failed(ResultCode.FAILED_USER_NOT_EXISTS));
        }
        // 构造要更新的对象
        User updateUser = new User(); 
        updateUser.setId(user.getId()); // 用户Id
        updateUser.setArticleCount(user.getArticleCount() + 1); //帖子数量+1
        updateUser.setUpdateTime(new Date());// 更新时间
        
        // 调用 DAO
        int row = userMapper.updateByPrimaryKeySelective(updateUser);
        if(row != 1){
            // 打印日志
            log.warn(ResultCode.ERROR_SERVICES.toString());
            // 抛出异常
            throw new ApplicationException(AppResult.failed(ResultCode.ERROR_SERVICES));
        }
    }

在 BoardServiceImpl.java 中实现以下方法:

@Override
    public void addOneArticleCountById(Long id) {
        // 非空检验
        if(id == null || id <= 0){
            // 打印日志
            log.warn(ResultCode.FAILED_PARAMS_VALIDATE.toString());
            // 抛出异常
            throw new ApplicationException(AppResult.failed(ResultCode.FAILED_PARAMS_VALIDATE));
        }
        // 查询板块信息
        Board board = selectById(id);
        // 检验版块是否存在
        if(board == null){
            // 打印日志
            log.warn(ResultCode.FAILED_BOARD_NOT_EXISTS.toString());
            // 抛出异常
            throw new ApplicationException(AppResult.failed(ResultCode.FAILED_BOARD_NOT_EXISTS));
        }
        // 构造要更新的对象
        Board updateBoard = new Board();
        updateBoard.setId(board.getId()); // 版块Id
        updateBoard.setArticleCount(board.getArticleCount() + 1); //帖子数量
        updateBoard.setUpdateTime(new Date());// 更新时间

        // 调用 DAO
        int row = boardMapper.updateByPrimaryKeySelective(updateBoard);
    }
2.6 测试

在以上的实现方法写好后,编写测试代码:

在 UserServiceImplTest.java 文件中:

@Test
    @Transactional
    void addOneArticleCountById() {
        userService.addOneArticleCountById(1l);
        System.out.println("更新成功");

        userService.addOneArticleCountById(2l);
        System.out.println("更新成功");

    }

在 BoardServiceImplTest.java 中:

    @Test
    void addOneArticleCountById() {
        boradService.addOneArticleCountById(1l);
        System.out.println("更新成功");

        boradService.addOneArticleCountById(2l);
        System.out.println("更新成功");

        boradService.addOneArticleCountById(55l);
        System.out.println("更新成功");
    }

加了事务的注解后,测试的结果不在持久化到数据库,当测试通过后,写入的数据会被回滚。 

    @Test
    void create() {
        Article article = new Article();
        article.setBoardId(1l);
        article.setUserId(1l);
        article.setTitle("单元测试标题");
        article.setContent("单元测试内容");
        // 调用service
        articleService.create(article);
        System.out.println("写入成功");
    }

 测试成功:15. 实现业务功能--帖子操作,项目,java,数据库,服务器

2.7 实现 Controller
@ApiOperation("发布帖子")
    @PostMapping("/create")
    public AppResult create(HttpServletRequest request,
                            @ApiParam("版块Id") @RequestParam("boardId") @NonNull Long boardId,
                            @ApiParam("帖子标题") @RequestParam("title") @NonNull String title,
                            @ApiParam("帖子正文") @RequestParam("content") @NonNull String content){
        // 获取用户信息
        HttpSession session = request.getSession(false);
        User user =(User)session.getAttribute(AppConfig.SESSION_USER_KEY);
        // 校验用户状态
        if(user.getState() == 1){
            // 用户已禁言,返回提示
            return AppResult.failed(ResultCode.FAILED_USER_BANNED);
        }
        // 构造帖子对象
        Article article = new Article();
        article.setUserId(user.getId()); // 当前登录用户就是作者
        article.setBoardId(boardId); // 版块Id
        article.setTitle(title); // 帖子标题
        article.setContent(content); // 帖子正文
        // 调用 Service
        articleService.create(article);
        // 返回结果
        return AppResult.success("贴子发布成功");
    }

15. 实现业务功能--帖子操作,项目,java,数据库,服务器

15. 实现业务功能--帖子操作,项目,java,数据库,服务器

2.8 实现前端界面
// 构造帖子对象
      let postData = {
        boardId : boardIdEl.val(),
        title : titleEl.val(),
        content : contentEl.val()
      };
      

      // 提交, 成功后调用changeNavActive($('#nav_board_index'));回到首页并加载帖子列表
      // contentType: 'application/x-www-form-urlencoded'
      $.ajax({
        type : 'post',
        url : 'article/create',
        contentType : 'application/x-www-form-urlencoded',
        data : postData,
        // 成功回调
        success: function(respData){
          if(respData.code == 0){
            // 成功后跳转到首页
            changeNavActive($('#nav_board_index'));
          }else{
            // 失败
            $.toast({
                heading : '警告',
                text : respData.message,
                icon : 'Warning'
              }); 
            }
          },
          // 失败回调
          error: function(){
            $.toast({
                heading : '错误',
                text : '出错了,请联系管理员',
                icon : 'error'
              });
          }

3. 帖子详情

3.1 实现逻辑
1. 用户点击帖子,将帖子 Id 做为参数向服务器发送请求
2. 服务器查询帖子信息
3. 帖子访问次数加1
4. 返回查询结果

那么此时的操作有一个查询,一个更新需要用事务进行管理吗?

答:只对一条记录进行更新时,不需要事务。

在帖子详情中,必须包含帖子的全部信息。

3.2 创建扩展 Mapper.xml
在 ArticleExtMapper.xml 中添加SQL:
<?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.example.demo.dao.ArticleMapper">
  <!--  定义表关系的结果集映射  -->
  <resultMap id="AllInfoResultMap" type="com.example.demo.model.Article" extends="ResultMapWithBLOBs">
    <!--    关联User对象  -->
    <association property="user" resultMap="com.example.demo.dao.UserMapper.BaseResultMap" columnPrefix="u_"/>
    <!--    关联Board对象  -->
    <association property="board" resultMap="com.example.demo.dao.BoardMapper.BaseResultMap" columnPrefix="b_"/>
  </resultMap>
  <!--  查询所有的帖子集合  -->
  <select id="selectAll" resultMap="AllInfoResultMap">
    select
    u.id as u_id,
    u.nickname as u_nickname,
    u.gender as u_gender,
    u.avatarUrl as u_avatarUrl,
    a.id,
    a.boardId,
    a.userId,
    a.title,
    a.visitCount,
    a.replyCount,
    a.likeCount,
    a.state,
    a.deleteState,
    a.createTime,
    a.updateTime
    from t_article as a ,t_user as u
    where a.userId = u.id
    and a.deleteState = 0
    order by a.createTime desc
  </select>
  <!--  查询所有的帖子集合  -->
  <select id="selectByBoardId" resultMap="AllInfoResultMap">
    select
    u.id as u_id,
    u.nickname as u_nickname,
    u.gender as u_gender,
    u.avatarUrl as u_avatarUrl,
    a.id,
    a.boardId,
    a.userId,
    a.title,
    a.visitCount,
    a.replyCount,
    a.likeCount,
    a.state,
    a.deleteState,
    a.createTime,
    a.updateTime
    from t_article as a ,t_user as u
    where a.userId = u.id
    and a.deleteState = 0
    and a.boardId = #{boardId,jdbcType=BIGINT}
    order by a.createTime desc
  </select>
  
  <!--  根据帖子Id 查询帖子详情  -->
  <select id="selectById" resultMap="AllInfoResultMap" parameterType="java.lang.Long">
    select
    u.id as u_id,
    u.nickname as u_nickname,
    u.gender as u_gender,
    u.avatarUrl as u_avatarUrl,
    b.id as b_id,
    b.name as b_name,
    a.id,
    a.boardId,
    a.userId,
    a.title,
    a.visitCount,
    a.replyCount,
    a.likeCount,
    a.state,
    a.deleteState,
    a.createTime,
    a.updateTime
    from t_article as a ,t_user as u,t_board b
    where a.userId = u.id
    and a.boardId = b.id
    and a.id = #{id,jdbcType=BIGINT}
    and a.deleteState = 0
  </select>
</mapper>
3.3 修改 DAO
在 dao 包下的 ArticleMapper 中添加方法声明:
    /**
     * 根据帖子Id 查询帖子详情
     * @param id
     * @return
     */
    Article selectById(@Param("id") Long id);
3.4 创建 Service 接口
在 IArticleService 定义方法:
    /**
     * 根据帖子Id 查询帖子详情
     * @param id
     * @return
     */
    Article selectById(Long id);
3.5 实现 Service 接口
在 ArticleServiceImpl 中实现方法:
 @Override
    public Article selectById(Long id) {
        // 非空检验
        if(id == null || id <= 0){
            // 打印日志
            log.warn(ResultCode.FAILED_PARAMS_VALIDATE.toString());
            // 抛出异常
            throw new ApplicationException(AppResult.failed(ResultCode.FAILED_PARAMS_VALIDATE));
        }
        // 调用 DAO
        Article article = articleMapper.selectById(id);
        // 返回结果
        return article;
    }
3.6 测试
@Test
    void selectById() throws JsonProcessingException {
        Article article = articleService.selectById(1l);
        System.out.println(objectMapper.writeValueAsString(article));

        article = articleService.selectById(8l);
        System.out.println(objectMapper.writeValueAsString(article));

        article = articleService.selectById(100l);
        System.out.println(objectMapper.writeValueAsString(article));
    }

测试结果:

15. 实现业务功能--帖子操作,项目,java,数据库,服务器

3.7 实现 Controller
在 ArticleController 中提供对外的API接口:
@ApiOperation("根据Id查询帖⼦详情")
    @GetMapping("/getById")
    public AppResult<Article> getDetails(@ApiParam("帖⼦Id")
                                         @RequestParam("id") 
                                             @NonNull Long id) {
        // 调⽤Service层获取帖⼦详情
        Article article = articleService.selectById(id);
        // 校验
        if (article == null) {
            return AppResult.failed("帖子不存在");
        }
        // 返回成功信息
        return AppResult.success(article);
    }

15. 实现业务功能--帖子操作,项目,java,数据库,服务器

15. 实现业务功能--帖子操作,项目,java,数据库,服务器 

15. 实现业务功能--帖子操作,项目,java,数据库,服务器

3.8 实现前端界面
$.ajax({
      type : 'get',
      url : '/article/getById?id=' + currentArticle.id,
      // 成功回调
      success: function(respData){
          if(respData.code == 0){
            // 把查询到的数据设置到页面上
            initArticleDetails(respData.data);
          }else{
            // 失败
            $.toast({
                heading : '警告',
                text : respData.message,
                icon : 'Warning'
              }); 
            }
          },
          // 失败回调
          error: function(){
            $.toast({
                heading : '错误',
                text : '出错了,请联系管理员',
                icon : 'error'
              });
          }

    });

15. 实现业务功能--帖子操作,项目,java,数据库,服务器

 

 

到了这里,关于15. 实现业务功能--帖子操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java(一):创建 Spring Boot 项目并实现连接操作MySQL数据库

    MySQL 命令 Maven 相关地址 下载地址: https://maven.apache.org/ maven配置方法地址: https://developer.aliyun.com/mvn/guide 仓库搜索地址: https://mvnrepository.com/ https://repo.maven.apache.org/ maven 本地配置 conf/settings.xml 下载 idea 并配置本地环境 maven Maven 构建 生命周期 Maven 的构建 生命周期 包括 三

    2024年02月07日
    浏览(53)
  • 【项目实战】登录与注册业务的实现(前端+后端+数据库)

             本示例基于Vue.js和mint UI实现。 目录 一、数据库的创建 二、后端接口与数据库的连接 三、前端代码实现 1.注册页相关代码 2.注册页效果 3.登录页相关代码 4.登录页效果 四、注册登录演示 五、项目文件结构         此处以 Navicat 软件进行创建,新建数据库r

    2023年04月08日
    浏览(45)
  • java springboot架构 自定义注解保存项目业务日志,使用线程池保存到数据库

    目录 1:pom.xml依赖 2:注解类样例 3:枚举类 4:具体处理方法类 5:线程池类 1:pom.xml依赖 2:注解类样例 3:枚举类 4:具体处理方法类 5:线程池类

    2024年02月15日
    浏览(37)
  • 使用javaweb实现登录注册页面,并且对功能和业务进行分层 用户登录成功跳转到主页并展示数据库的商品的信息

    一、Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据。 Servlet+JSP+JavaBean模式程序各个模块之间层次清晰,web开发推荐采用此种模式。 这里以一个最常用的用户登录

    2024年02月03日
    浏览(40)
  • 1.php开发-个人博客项目&文章功能显示&数据库操作&数据接收

    (2022-day12) 1-php入门,语法,提交 2-mysql 3-HTML+css ​ 博客-文章阅读功能初步实现 实现功能: 前端文章导航,点入内容显示,更改ID显示不同内容 实现步骤: 1-前端页面显示,编写(html,css) 2-数据库文章数据导入(mysql操作) 3-php操作mysql编写-php变量提交 ​ 搜:html横向导

    2024年01月20日
    浏览(45)
  • 【业务功能篇20】Springboot java逻辑实现动态行转列需求

    在此前,我也写过一个行转列的文章,是用存储过程sql处理的一个动态的逻辑 Mysql 存储过程Mybatis框架call调用 实现动态行转列 那么后面我们同样又接收了业务的一个新需求,针对的是不同的业务数据,做的同样的一个展示数据报表,同样还是产品归属信息表头,拼接查询年

    2024年02月09日
    浏览(36)
  • 通过Annotation将用户操作记录到数据库表功能实现

    一、背景         在用户对我们所开发的系统访问的时候,需要我们的系统具有强大的健壮性,使得给与用户的体验感十足。在业务开发的过程中,我们通过将几个相关的操作绑定成一个事件,使得安全性以及数据的前后一致性得到提高。但是在溯源方面,我们往往没有很好

    2024年03月13日
    浏览(79)
  • java连接数据库实现登录与注册小功能(小白版)

    准备工作: 创建数据库stu;        create database stu charset=utf8; 使用数据库stu;            use stu; 创建用户表user(id,username,password,nick) create table user(id int primary key auto_increment,username varchar(50),password varchar(50),nick varchar(50));   1.开始创建springboot工程,勾选Web-spring Web,  SQL-MyBatis Frame

    2024年02月08日
    浏览(32)
  • 使用javaweb项目实现对数据库的增、删、改、查操作

      JavaWeb是指使用Java语言进行Web应用程序开发的技术,可以利用Java编写一些动态网页、交互式网页、企业级应用程序等。 JavaWeb技术主要包括Servlet、JSP、JDBC、JavaBean、JNDI、EJB、Web Services等。 Servlet是JavaWeb技术的核心组件之一,它是一个运行在Web服务器上的Java程序,可以接收

    2024年02月05日
    浏览(27)
  • Vue项目通过node连接MySQL数据库并实现增删改查操作

    1.创建Vue项目 Vue项目创建的详细步骤,有需要的可移步这里 2.下载安装需要的插件 下载express 下载cors,用于处理接口跨域问题 下载mysql 下载axios 3.在项目中创建server文件夹,用于搭建本地服务器 新建/server/app.js,用于配置服务器相关信息 新建/server/db/index.js,用于配置数据库

    2024年02月16日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包