论小白是如何手撕Github项目源码,一步步想成为dai佬的---(三)用户区功能模块理解1.0

博主对网站功能模块进行代码研究,分析了“搜索”和“一键分享功能”原理。“搜索”功能核心在mybatis的sql语句,涉及动态sql、返回值类型等知识;“一键分享功能”借用第三方库,涉及javascript相关知识。最后总结了各功能的关键要点。

(一)前言

       功能模块划分已经完成了,接下来就是对每个模块进行代码研究和学习了,确实还是很期待的。对与代码的研究,我的方法是这样的:考虑到自身基础薄弱,所以每学习一个功能模块,我都会把其中涉及到的知识点列出并加以总结。对整个功能的实现代码加以分析,可以的话,也会自建一个小项目来实际操作一下。接下来我会逐次分析每个模块,每个版块格式不一定统一,但都会记录下我认为比较有价值的地方,最后也会做一个大总结来归纳当天学习到的知识点和方法技巧。下面言归正传

(二)功能版块分析

2.1“搜索”原理分析

在这里插入图片描述
       原来就一直很好奇,当我们输入一些关键词,网站是如何检索出和该关键词有关的文章内容的,当然不同网站的检错方法千差万别,而且有些也是特别复杂,这里就先学习一下该网站的检索方法。我原来以为会是把所有数据先从数据库取出,然后再用一些数据结构和算法对所需数据进行筛选,所有在看源码时我也是从jsp页面一直回退到了sql语句,我想找的答案竟然在sql语句中,哎~。不过也能想得通,数据那么多怎么可能都取出来筛选呢,当然是先筛选再取出的呀!前面的页面方法调用和参数传递不是我们讨论的重点,这里直接看mybatis部分的sql语句了。

    <select id="findAll" resultMap="BaseResultMap">
        SELECT
        article.*
        FROM
        article
        <where>
            <if test="status != null">
                article.article_status = #{status} AND
            </if>
            <if test="keywords != null">
                article.article_title LIKE concat(concat('%',#{keywords}),'%') AND
            </if>
            <if test="userId != null">
                article.article_user_id = #{userId} AND
            </if>
            <if test="categoryId != null">
                article.article_id IN (
                SELECT article_category_ref.article_id FROM article_category_ref
                WHERE article_category_ref.category_id = #{categoryId}
                ) AND
            </if>
            <if test="tagId != null">
                article.article_id IN (
                SELECT article_tag_ref.article_id FROM article_tag_ref
                WHERE article_tag_ref.tag_id = #{tagId}
                ) AND
            </if>
            1 = 1
        </where>
        ORDER BY `article`.`article_order` DESC, `article`.`article_id` DESC
    </select>

涉及知识点
1.mybatis的动态sql:
where 元素知道只有在一个以上的if条件有值的情况下才去插入"WHERE"子句。而且,若最后的内容是"AND"或"OR"开头的,where 元素也知道如何将他们去除。
2.mybatis的sql返回值类型:

  • 返回一般数据类型,如:resultType=“java.lang.Integer”
  • 返回JavaBean类型,如:resultType=“Student”(需要在配置文件中取别名,否则得加上包名等前缀)
  • 返回List类型,如:resultType=“Student”(注:如果是多条数据,会自动封装在list中返回)
  • 返回Map类型,如:resultType=“map”
    上述例子代码中的“BaseResultMap”没有见过,搜到的有关BaseResultMap的信息并不多,如下:mybatis 非常的智能,如果配置了resultMap,返回值统一使用 resultMap=“BaseResultMap”,mybatis会根据查询到的条目数量自动进行判断,如果是一条就返回对象,如果是多条就返回List对象列表。

3.sql语法:
sql contact函数用于将两个字符串连接起来,形成一个单一的字符串。
       比较核心的检索语句还是LIKE concat(concat(’%’,#{keywords}),’%’) ,意思是找标题中含有该关键词的文章,虽然翻译过来有点low,但至少学会了如何用sql语句来描述。

2.2“一键分享功能”原理分析

在这里插入图片描述
这里也是原来就很好奇的一键分享功能实现,不出所料的是借用第三方库的,代码如下图所示。猜测有些网站适用qq第三方入口登录会不会也是这么一个道理,但应该会比这个复杂些。不用着急,在项目的留言板块会介绍第三方入口登录的使用。

<!DOCTYPE html>
<html>
<head>
<META http-equiv="content-type" content="text/html; charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div class="bdsharebuttonbox">
<a href="#" class="bds_more" data-cmd="more"></a>
<a href="#" class="bds_qzone" data-cmd="qzone" title="分享到QQ空间"></a>
<a href="#" class="bds_tsina" data-cmd="tsina" title="分享到新浪微博"></a>
<a href="#" class="bds_tqq" data-cmd="tqq" title="分享到腾讯微博"></a>
<a href="#" class="bds_renren" data-cmd="renren" title="分享到人人网"></a>
<a href="#" class="bds_weixin" data-cmd="weixin" title="分享到微信"></a>
</div>
<script>
window._bd_share_config={
		"common":{
			"bdPopTitle":"您的自定义pop窗口标题",
			"bdSnsKey":{},
			"bdText":"此处填写自定义的分享内容", 
			"bdMini":"2",
			"bdMiniList":false,
			"bdPic":"http://localhost/centlight/public/attachment/201410/24/14/5449ef39574f5_282x220.jpg", /* 此处填写要分享图片地址 */
			"bdStyle":"0",
			"bdSize":"16"
			},
		"share":{}
};
with(document)0[
                (getElementsByTagName('head')[0]||body).
                appendChild(createElement('script')).
                src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)
];
		</script>
</body>
</html>

涉及知识点
1.javascript:void(0):
href="#"与href="javascript:void(0)"的区别包含了一个位置信息,默认的锚是#top 也就是网页的上端。而javascript:void(0), 仅仅表示一个死链接。
2.οnclick=“return false”:
return false表示阻止浏览器对事件的默认处理。比如:

<input type="submit" onclick="submitAction(); return false;" />

submitAction 方法里面有提交表单的动作。万一不加 return false,在执行完 submitAction 方法后,submit 按钮还会继续执行它的默认事件(提交表单),加上return false后,则不会再执行提交表单的动作 。

(三)后续

       做源码分析真是项体力活,耗时耗力,产量还低。但确实解开了很多疑惑,帮助也挺大,再是明白为什么说看源码一定要带有目的地看了,这里做个小总结。

  1. mybatis的BaseResultMap可以返回任意数量的对象;
  2. 搜索栏的简易检索是通过sql语句LIKE concat(concat(’%’,#{keywords}),’%’)来实现的,查找标题中含有该关键词的文章;
  3. 第三方登录只是一个固定代码块;
  4. onclick 里的return false组织默认事件的进行;
  5. javascript:void(0)声明一个死链接;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

赶路的苟狗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值