“文章定时发布功能”如何实现?(代码+详细注释)

目录

设计思路

分析

前后端交互接口

请求

响应

代码实现和详细注释

数据库设计

前后端交互

客户端开发

服务器开发


设计思路


分析

当用户选择好定时发布时间以后,点击定时发布按钮之后,向后端发起 ajax 请求,请求中的数据有:“文章标题、文章正文内容、定时发布时间”,后端接收到数据以后,首先对客户端传入数据进行非空校验,然后起一个线程,实现一个类似自旋锁的操作:“每过 2s 就进行一次自旋询问操作”,通俗来讲就是每过 2s 询问一下当前时间是否大于定时发布时间,若大于,就将文章发布,若不大于就使用 wait(2000) 让线程等待 2s 。 

这样就可以实现文章定时发布功能喽~

前后端交互接口

请求

POST /art/timeadd
Content-Type: application/json
{
    "title": jQuery('#title').val(), //获取标题
    "content": editor.getValue(),    //获取正文
    "postTime": postTime.val()       //获取定时发布时间
}

响应

Ps:采用同一返回数据格式处理(“code:状态码,msg:信息,data:数据”)

HTTP1.1 200 OK
Content-Type: application/json
{
    code: 200, //状态码
    msg: "",   //信息
    data: 1    //数据
}

代码实现和详细注释


数据库设计

文章表设计如下:

create table articleinfo(
    id int primary key auto_increment,
    title varchar(100) not null,
    content text not null,
    createtime timestamp default current_timestamp,
    updatetime timestamp default '1970-01-01 10:00:00',
    uid int not null,
    rcount int not null default 1,
    `state` int default 1,
)

前后端交互

客户端开发

创建 input 控件,type 类型为 datetime-local (可以选择年、月、日、时、分)

Ps:这里要注意 datetime-local 的格式为:"yyyy-mm-ddThh:mm"

创建 button 控件,点击触发 js 代码。

<input type="datetime-local" id="pubdate">
<button onclick="myTimeSub()" id="pubdate-button">定时发布</button>

js 代码实现如下:

        //定时发布
        function myTimeSub() {
            var postTime = jQuery("#pubdate");
            //非空校验
            if (postTime.val() == "") {
                alert("请选择定时发布时间!");
                return;
            }
            if(confirm("是否确认发布!")) {
                jQuery.ajax({
                    type: "POST",
                    url: "/art/timeadd",
                    data: {
                        "title": jQuery('#title').val(),
                        "content": editor.getValue(),
                        "postTime": postTime.val()
                    },
                    success: function (result) {
                        if (result != null && result.code == 200 && result.data == 1) {
                            alert("定时发布成功!");                       
                            location.assign("/myblog_list.html");
                        } else {
                            alert("定时发布失败,请稍后重试");
                        }
                    }
                });
            }
        }

服务器开发

按照刚刚讲到的分析思路和前后端交互接口不难实现~

Ps:定时发布时间的格式为:"yyyy-mm-ddThh:mm"

Controller 层代码如下;

    @RequestMapping("/timeadd")
    public AjaxResult timeAdd(HttpServletRequest request, ArticleInfoVO articleInfoVO) {
        //非空校验
        if(articleInfoVO == null || !StringUtils.hasLength(articleInfoVO.getTitle()) ||
        !StringUtils.hasLength(articleInfoVO.getContent())) {
            return AjaxResult.fail(403, "参数错误!");
        }
        UserInfo userInfo = UserSessionUtils.getUser(request);
        if(userInfo == null || !StringUtils.hasLength(userInfo.getUsername()) ||
        !StringUtils.hasLength(userInfo.getPassword())) {
            return AjaxResult.fail(403, "参数错误");
        }
        //设置定时发布,启动一个线程,每两秒询问一次是否到达过期时间
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        Thread queryTime = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    while(true) {
                        if(ArticleInfoUtils.checkOvertime(sdf.format(System.currentTimeMillis()),
                        articleInfoVO.getPostTime())) {
                            //到达过期时间
                            ArticleInfo articleInfo = new ArticleInfo();
                            articleInfo.setTitle(articleInfoVO.getTitle());
                            articleInfo.setContent(articleInfoVO.getContent());
                            articleInfo.setUid(userInfo.getId());
                            //添加文章
                            articleService.add(articleInfo);
                            break;
                        }
                        try {
                            System.out.println("休眠2s");
                            lock.wait(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        });
        queryTime.start();
        //发布博客
        return AjaxResult.success(1);
    }

定时发布时间检测:

    /**
     * 定时发布
     * 用来检验是否超时
     * @param startTime 起始时间(yyyy-MM-dd HH:mm)
     * @param endTime 定时发布时间(yyyy-mm-ddThh:mm)
     * @return
     */
    public static boolean checkOvertime(String startTime, String endTime) {
        String[] st = startTime.split(" ");
        String[] et = endTime.split("T");
        //yyyy-mm-dd
        String[] symd = st[0].split("-");
        String[] eymd = et[0].split("-");
        //hh:mm
        String[] shm = st[1].split(":");
        String[] ehm = et[1].split(":");
        //进行时间比较(一次按年月日进行比较,只要大于定时发布时间就返回 true,反之返回 false)
        if(Integer.parseInt(symd[0]) > Integer.parseInt(eymd[0])) return true;
        else if(Integer.parseInt(symd[0]) < Integer.parseInt(eymd[0])) return false;
        if(Integer.parseInt(symd[1]) > Integer.parseInt(eymd[1])) return true;
        else if(Integer.parseInt(symd[1]) < Integer.parseInt(eymd[1])) return false;
        if(Integer.parseInt(symd[2]) > Integer.parseInt(eymd[2])) return true;
        else if(Integer.parseInt(symd[2]) < Integer.parseInt(eymd[2])) return false;
        if(Integer.parseInt(shm[0]) > Integer.parseInt(ehm[0])) return true;
        else if(Integer.parseInt(shm[0]) < Integer.parseInt(ehm[0]))return false;
        if(Integer.parseInt(shm[1]) >= Integer.parseInt(ehm[1])) return true;
        else return false;
    }

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
前端采用Vue、Element UI。 后端采用Spring BootSpring Security、Redis & Jwt。 权限认证使用Jwt,支持多终端认证系统。 支持加载动态权限菜单,多方式轻松权限控制。 高效率开发,使用代码生成器可以一键生成前后端代码。 提供了单应用版本RuoYi-Vue-fast,Oracle版本RuoYi-Vue-Oracle,保持同步更新。 内置功能 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 岗位管理:配置系统用户所属担任职务。 菜单管理:配置系统菜单,操作权限,按钮权限标识等。 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 字典管理:对系统中经常使用的一些较为固定的数据进行维护。 参数管理:对系统动态配置常用参数。 通知公告:系统通知公告信息发布维护。 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 登录日志:系统登录日志记录查询包含登录异常。 在线用户:当前系统中活跃用户状态监控。 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。 代码生成:前后端代码的生成(javahtml、xml、sql)支持CRUD下载 。 系统接口:根据业务代码自动生成相关的api接口文档。 服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。 缓存监控:对系统的缓存信息查询,命令统计等。 在线构建器:拖动表单元素生成相应的HTML代码。 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。
《C语言课程设计——学生成绩管理系统(源代码 详细注释).zip》是一个包含有源代码详细注释的学生成绩管理系统的压缩文件。 学生成绩管理系统是一种用于管理学生的考试成绩和相关信息的软件工具。该系统基于C语言开发,通过使用源代码详细注释来了解其内部工作原理和实现细节。 源代码是指程序员使用C语言编写的计算机程序的文本文件。它包含一系列的指令和算法来实现特定的功能。通过查看源代码,我们可以了解程序是如何实现学生成绩管理的,例如如何读取和存储学生信息、计算和存储考试成绩等。同时,源代码中也包含了程序的各种功能和特性的具体实现细节。 详细注释是在源代码中加入的对代码的解释和说明,用于帮助程序员和读者理解代码的逻辑和功能注释通常以特定的标记符或特殊的注释语法来标识,并且会提供对代码行为、变量、函数和算法的解释。通过详细注释,我们可以更好地理解程序的运行逻辑和实现方式,同时也帮助我们更加容易地进行修改和维护。 压缩文件(.zip)是一种常见的文件格式,可以将多个文件或文件夹压缩成一个单独的文件。通过将源代码详细注释压缩成一个文件,可以方便地进行存储、传输和共享。 因此,对于《C语言课程设计——学生成绩管理系统(源代码 详细注释).zip》,我们可以通过解压缩该文件并查看源代码详细注释来了解其中的实现细节和代码逻辑。这对于学习C语言编程以及了解学生成绩管理系统的设计和实现都是非常有帮助的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈亦康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值