仿牛客学习论坛之发布帖子

本资料来源于牛客网的仿牛客学习论坛,仅供学习和交流使用。
经过了注册和登录功能的开发,我们终于到了正式的功能开发啦!

1 测试

1 知识点 ajax

  • Asynchronous JavavScript and XML
  • 异步的JavaScript与xml, 不是一门新技术,只是一个新的术语;
  • 使用Ajax, 网页能够将增量更新呈现在页面上,而不需要刷新整个页面;
  • 虽然x代表xml, 但目前json的使用比xml更加普遍;
  • http://develop.mozilla.org/zh-CN/Web/Guide/AJAX

示例

  • 使用jQuery发送AJAX请求;
    实践
  • 采用AJAX请求,实现发布帖子的功能。

2 编写json工具类

数据间传输采用json,所以我们在util包中编写json的相关方法。

先在pom.xml配置中引用阿里巴巴的fastjson

<dependency>
	<groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.80</version>
</dependency>

在 CommunityUtil 中编写json工具类

public class CommunityUtil{
	
	// JSON 相关
    public static String getJSONString(int code, String msg, Map<String, Object> map) {
        JSONObject json = new JSONObject();
        json.put("code", code);
        json.put("msg", msg);
        if(map != null) {
            for(String key: map.keySet()) {
                json.put(key, map.get(key));
            }
        }
        return json.toJSONString();
    }

    public static String getJSONString(int code, String msg) {
        return getJSONString(code, msg, null);
    }

    public static String getJSONString(int code) {
        return getJSONString(code, null, null);
    }

	// 此处的main方法用来测试上面的方法类,没有直接编写在test类中
    public static void main(String[] args) {
        Map<String, Object> map = new HashMap<>();
        map.put("name", "zhangsan");
        map.put("age", 25);
        System.out.println(getJSONString(0, "ok", map));
    }
}

3 编写前端页面接受值

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <!-- 静态类static下的网页可以直接访问 -->
    <p>
        <input type="button" value="发送" onclick="send()">
    </p>
    <script src="https://code.jquery.com/jquery-3.3.1.min.js" crossorigin="anonymous"></script>
<script>
	// 此处调用的是异步的ajax请求
    function send() {
        $.post(
            "/community/alpha/ajax",
            {"name":"张三", "age":18},
            // 回调完函数后,将服务器返回的数据传到data里
            function(data) {
                console.log(typeof(data));
                console.log(data);
                data = $.parseJSON(data);
                console.log(typeof(data));
                console.log(data.code);
                console.log(data.msg);
            }
        )
    }
</script>
</body>
</html>

4 编写controller,测试与前端ajax交互的正确性

public class AlphaController {
	// ajax示例
    @RequestMapping(path = "/ajax", method = RequestMethod.POST)
    @ResponseBody // 给页面返回的是字符串,而不是页面
    public String testAjax(String name, int age) {
        System.out.println(name);
        System.out.println(age);
        return CommunityUtil.getJSONString(0, "操作成功");
    }
}

以上是测试json测试类和ajax请求是否可以正常执行,下面进行业务代码编写。

2 编写业务

1 DAO层增加插入帖子的方法

@Mapper
public interface DiscussPostMapper {
	// 增加帖子
    int insertDiscussPost(DiscussPost discussPost);		
}
<?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.zcq.community.dao.DiscussPostMapper">
    <insert id="insertDiscussPost" parameterType="DiscussPost">
        insert into discuss_post (<include refid="insertFields"></include>)
        values(#{userId}, #{title}, #{content}, #{type}, #{status}, #{createTime}, #{commentCount}, #{score} )
    </insert>
</mapper>

2 编写service业务逻辑

此处的业务逻辑主要是过滤敏感词。

public class DiscussPostService {
	public int addDiscussPost(DiscussPost post) {
        if (post == null) {
           throw new IllegalArgumentException("参数不能为空");
        }
        // title 和 content 部分需要过滤
        // 标签也要处理
        post.setTitle(HtmlUtils.htmlEscape(post.getTitle()));
        post.setContent(HtmlUtils.htmlEscape(post.getContent()));
        // 过滤敏感词
        post.setTitle(sensitiveFilter.filter(post.getTitle()));
        post.setContent(sensitiveFilter.filter(post.getContent()));

        return discussPostMapper.insertDiscussPost(post);
    }
}

3 编写controller类

@Controller
@RequestMapping("/discuss")
public class DiscussPostController implements CommunityConstant {
	@Autowired
    private DiscussPostService discussPostService;

    @Autowired
    private HostHolder hostHolder;

	@RequestMapping(path = "/add", method = RequestMethod.POST)
    @ResponseBody
    public String addDiscussPost(String title, String content){
        User user = hostHolder.getUser();
        if(user == null) {
            return CommunityUtil.getJSONString(403, "你还没有登录哦");
        }
        DiscussPost post = new DiscussPost();
        post.setUserId(user.getId());
        post.setTitle(title);
        post.setContent(content);
        post.setCreateTime(new Date());
        discussPostService.addDiscussPost(post);
        // 报错的情况,将来统一处理
        return CommunityUtil.getJSONString(0, "发布成功");
    }
    
}

4 编写index页面的js点击事件

说明:index.html页面的发布按钮的id为 publishBtn

$(function(){
	$("#publishBtn").click(publish);
});

function publish() {
	$("#publishModal").modal("hide");
	// 获取标题和内容
	var title = $("#recipient-name").val();
	var content = $("#message-text").val();
	// 发送异步请求
	$.post(
		CONTEXT_PATH + "/discuss/add",
		{"title":title, "content":content},
		function(data) {
			data = $.parseJSON(data);
			// 在提示框中显示返回消息
			$("#hintBody").text(data.msg);
			// 显示提示框, 提示已发布完成
			$("#hintModal").modal("show");
			// 2s 后自动隐藏提示框
			setTimeout(function(){
				$("#hintModal").modal("hide");
				// 刷新页面
				if(data.code == 0) {
					window.location.reload();
				}
			}, 2000);
		}
	);
}

说明:启动测试类后支持 < script > 标签

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值