文章详情页静态页面
详情页骨架渲染
后端视图
python
@index_bp.get("/article/<int:article_id>")
def article_view(article_id):
return render_template('forum/article.html')
前端静态页面
对于前端页面,实现的方式有两种
- 可以把
index.html
的内容复制一份,缺点是重复的逻辑需要再每个页面都写一遍,更新的时候需要一个个页面去更新。好处是简单。 - 使用
jinja2
的block
定义块,然后使用继承。缺点是需要封装,优点是不需要重复定义一些逻辑。
这里采用 jinja2
的方案,先封装一个 base.html
页面
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>正心论坛</title>
<!--头部脚本-->
{% block header_script %}
<title>正心论坛</title>
{% endblock %}
</head>
<body>
<!--头部标签栏-->
<div class="header">
<div class="header-demo">
{% block header %}{% endblock %}
</div>
</div>
<!--主要内容部分-->
<div class="main">
{% block main %}{% endblock %}
</div>
<!--页脚部分-->
<div class="footer">
{% block footer %}{% endblock %}
</div>
<!-- 页脚脚本 -->
{% block footer_script %}{% endblock %}
</body>
</html>
html
{% extends 'forum/base.html' %}
{% block header_script %}
<title>正心论坛</title>
<link rel="stylesheet" href="/static/layui/css/layui.css">
<link rel="stylesheet" href="/static/css/main.css">
<script src="/static/layui/layui.js"></script>
{% endblock %}
{% block header %}
<a href="/" class="logo">
正心全栈论坛
</a>
<!--中间分类栏 省略-->
<!--登录注册栏 省略-->
{% endblock %}
{% block main %}
<!--文章列表 省略-->
<!--侧边栏 省略-->
{% endblock %}
{% block footer %}
<!--页脚内容 省略-->
{% endblock %}
{% block footer_script %}
<form class="layui-form register_form" lay-filter="register_form">
<!-- 表单内容 省略 -->
</form>
<form class="layui-form login_form"lay-filter="login_form">
<!-- 表单内容 省略 -->
</form>
<script>
let page = {{ paginate.page }};
let limit = {{ paginate.per_page }};
let count = {{ paginate.total }};
</script>
<script src="/static/js/passport.js"></script>
<script src="/static/js/main.js"></script>
{% endblock %}
页面拆分之后,需要对 JavaScript 拆分。之前的 main.js
中有部分内容,只能在 index
页使用,还有部分内容是通用的,需要拆分为 main.js
与 `index.js.
javascript
layui.use(function () {
let $ = layui.$
let params = new URLSearchParams(location.search)
// 首页分类切换
$('.menu li').click(function () {
let click_cid = $(this).attr('data-cid');
$('.menu li').each(function () {
$(this).removeClass('active');
});
// 设置当前标签别选中并且高亮
$(this).addClass('active');
if (params.get('cid') !== click_cid) {
// 记录当前分类id
params.set('cid', click_cid)
// 重置分页参数
params.set('page', '1')
location.href = '/?' + params.toString()
location.search = params.toString()
}
});
// 高亮当前选择的内容 SSR 渲染之后的内容
if (params.get('cid')) {
$('.menu li').removeClass('active');
$(`li[data-cid="${params.get('cid')}"]`).addClass('active')
}
})
javascript
layui.use(function () {
let laypage = layui.laypage
let $ = layui.$
laypage.render({
elem: 'article-page'
, curr: page
, count: count
, first: '首页'
, last: '尾页'
, limit: limit
, prev: '<em>←</em>'
, next: '<em>→</em>'
, jump: function (obj, first) {
if (!first) {
if (obj.curr !== page) {
/*模板渲染*/
console.log(obj);
let params = new URLSearchParams(location.search)
params.set('page', obj.curr)
location.search = params.toString();
}
}
},
});
$.ajax({
url: '/api/v1/hot_article',
type: 'get',
success: function (res) {
res.results.forEach((article, index) => {
$('.rank_list a').eq(index).text(article.title).attr('href', `/article/${article.id}`)
})
}
})
})
然后修改 index.html 中的引入
html
{% block footer_script %}
<!-- 前面代码省略 -->
<script src="/static/js/passport.js"></script>
<script src="/static/js/main.js"></script>
<script src="/static/js/index.js"></script>
<link rel="stylesheet" href="/static/css/article.css">
{% endblock %}
然后编写文章详情页
html
{% extends 'forum/index.html' %}
{% block main %}
内容详情页
{% endblock %}
{% block footer_script %}
<form class="layui-form register_form" lay-filter="register_form">
<!-- 表单内容 省略 -->
</form>
<form class="layui-form login_form"lay-filter="login_form">
<!-- 表单内容 省略 -->
</form>
<script src="/static/js/passport.js"></script>
<script src="/static/js/main.js"></script>
<script src="/static/js/article.js"></script>
{% endblock %}
详情页内容渲染
html
{% block main %}
<div class="article-content">
<h3>开源 – “这是最好的时代,这是最坏的时代”</h3>
<div class="detail_about">
<span class="time_source">2018-01-16 14:38</span>
<span class="author"> 来源: 商务部</span>
<span class="comment_count">3</span>
</div>
<p class="summary">
开源给程序员提供了一个展现自己个人能力的绝好机会,特别是对于大厂、大系统的开发者。这个展现,能让大家更加客观地评价一个程序员的价值。
</p>
<p>
今天一早,我给一位远在西安还从未谋面的程序员小邓发出了一份很不错的offer。一周前,他观看腾讯开发者大会的直播视频,听了我的演讲之后,加了我的微信,并主动告诉我,很想加入涛思数据。虽然他毕业的学校还有工作的经历,不是那么靓丽,但我一下看到了他简历里列的GitHub地址以及参与的开源项目,因此马上进GitHub浏览他的程序,发现程序挺漂亮,结构、层次都很清晰,代码可读性很强,更让我惊讶的是,用英文写的文档以及注释完全不输给我这个在美国留学工作10多年的海归。我立即让另外一个同事也去看一下他的代码,得出的结论是,这人很优秀,即使远程工作,也值得马上录用。因此我们马上视频交流,很快,我就定下了录用的决定。
</p>
<p>
如果没有GitHub,没法翻看他写的上万行代码以及文档,没法查看修改记录,我绝不会考虑录用一个连面都没有见过的小伙子,而且招聘时,还是会更倾向于我中国科大的师弟师妹,或有过其他名校就读和大厂工作经历的人。<strong>开源,改变了我的面试流程,改变了涛思数据,也改变了一个程序员的人生轨迹。</strong>
</p>
<p>现在的软件系统往往很大,以大家熟悉的Linux内核为例,源代码行数已经超过2500万行,文件超过6万个,参与的开发者超过2万人。就连涛思数据开源的TDengine,
一个看似简单的物联网大数据处理平台软件,C/C++代码已经超过30万行,Python测试代码都已超过15万行,而且还会成倍增长。开发一款软件,更多的是团队协同,而不是单兵作战。单个程序员的贡献如何体现?如何让外界的人知道并评估?对于闭源软件来说,这个价值判断问题无从下手。但开源不同,因为程序员写的任何一行代码,注释,做的任何修改都会被记录下来,而且任何人都可以看到。能力的高低,贡献的大小随时可查。</p>
<p>
<img alt=""
src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9zTkVDYVZqNUtYUHJFeXliV0pLOUNrQXRiOVRVTUtpYXJ2RWljQWljajNvbzNOVnJ2Sm1GWTR6MnZQbk1wblR0ZWFZVzJxalNEVEFsSjZnVDdPb1Jnd1hiQS82NDA?x-oss-process=image/format,png">TDengine
在 GitHub 上的页面</p>
<p>
开源给程序员提供了一个展现自己个人能力的绝好机会,特别是对于大厂、大系统的开发者。这个展现,能让大家更加客观地评价一个程序员的价值。长期以来,大家更容易相信在大厂工作过的,虽然他有可能从没贡献过核心代码,从没解决过重大技术问题,只是一个滥竽充数之辈;大家更倾向于相信名校毕业的,即使他早已停止学习,只是曾经高考分数不错;大家更容易相信35岁以下的人,不相信大龄程序员依然有很强的战斗力。开源的代码,能让大家抛弃对教育、年龄、性别、经验、肤色、地域、文化的偏见,看到一个程序员背后真正的价值,便于组建团队,便于协同作战。</p>
<p>
开源让程序员的代码成为了作品,与画家的画、音乐家的曲子一样,可以被全球程序员欣赏、使用,并传承。对于闭源的软件而言,这是不可能的,大家看到的只是UI或API,无法让人看到程序本身,更无从欣赏。你在微软为Windows
操作系统开发的核心模块,无论设计得多么优雅,你在腾讯为微信后台设计的消息处理模块,无论高并发能力有多么强悍,都无法让人欣赏、惊叹。但开源之后,一切都变了。只要你的代码足够好,解决了重大问题,那一定会成为传世之作。即使有瑕疵,后来者也可以在你的基础上修改,但你的名字永远会镌刻在代码上,而不会被历史冲刷掉。</p>
<p>
有了作品这个感觉之后,程序员会天然的对自己的代码产生一种自豪感,会对代码的质量产生极致的追求,因为他不想自己的代码被人唾弃,而是被欣赏。在2019年7月决定将TDengine开源之前,涛思数据团队花了好几个月的时间整理代码,编写文档,目的就是不想让它过于难看,被人诟病。不开源的话,我们根本没有这个动力去做,因为用户是看不见的。在2019年底启动TDengine
2.0的开发,更是如此,就是想让TDengine的设计与代码更加优雅,结构更加清晰,让其他程序员看的时候,能享受到一种快乐和美感。3个月前,我花了几天时间动手为TDengine写了一个小模块tref.c,就想完美地解决在多线程情况下,资源的生命周期管理问题,而且就希望这个500来行的小程序能被全球的程序员学习、使用和改进,不再为多线程问题所烦。如果不是因为开源,没有会成为作品的感觉,我大半就是仅仅解决一个具体问题而已。</p>
<p style="text-align:center;">
<img alt=""
src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9zTkVDYVZqNUtYUHJFeXliV0pLOUNrQXRiOVRVTUtpYXJuOXU4WnZMa29IWXdYZ01zYW9Ic1RpYXp2UEdsYk9JUzRTa2dZR2Y5Rmx2dzROdFQwZlUydjRBLzY0MA?x-oss-process=image/format,png">
</p>
<p>GitHub 上 tref.c 的一段源代码</p>
<p>
对于初入茅庐的程序员而言,参与开源项目,更是一种学习的机会。不仅可以观摩、学习绝顶高手的代码,更可以参与其中,贡献一段代码。自己写的代码有问题,一定会被测试出来、被人指出毛病,甚至直接被人修改或抛弃。与大侠直接过招,相比闭门造车,相比自己摸索,成长的速度要快N倍。而且参与的方式有很多种,除直接贡献产品代码外,还可以贡献测试例、测试代码,贡献文档,贡献使用案例等。就象TDengine,测试代码的行数将会远超过产品本身的代码行数,而且对技术的要求一点都不亚于产品本身。我的第一行程序是1984年写下的,当时正读高中一年级,只能看到谭浩强编写的《BASIC语言程序》这本书,书里尽是一些简单得不能再简单的程序。如果当时就能像现在这样访问无数优秀的开源代码,对于一个如饥似渴的学生而言,那无疑找到了世界上最好的课本和老师。</p>
<p>
对于90后00后程序员而言,开源,让他们赶上了程序员前所未有的黄金时代。对于我这个52岁的大龄程序员而言,仍然是赶上了黄金时代,因为可以依靠自己的实力证明,编程没有年龄的限制,而且仍大有用武之地。真心的希望,三十年之后,还有人在看在用我写的代码,而且我自己还能给TDengine贡献代码,那才是我最大的幸福。</p>
<p style="text-align:center;">
<img alt=""
src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9zTkVDYVZqNUtYUHJFeXliV0pLOUNrQXRiOVRVTUtpYXJ1elU1bXh4T3JsTFM2c0hqRjJQaWNsUFI5SElINHlZbURPc3NUend1bEtRMVl0MGFUNUVqNGpBLzY0MA?x-oss-process=image/format,png">
</p>
<p>这台Mac为TDengine贡献了4万多行代码</p>
<p><strong>“这是最好的时代”</strong>,开源,让程序员的价值能更客观地展现,让程序员有了属于自己的作品,让程序员去追求极致,有动力去打磨作品,让其成为传世之作。对于真正的程序员而言,毫无疑问,这是最好的时代。
</p>
<p><strong>“这是最坏的时代”</strong>,开源,让滥竽充数的程序员无所遁形,能传承下去的一定是精美的作品,不再会有劣币驱逐良币之说。对于靠拍、靠混,依赖炫酷的PPT和报告升迁的程序员而言,毋庸置疑,这是最坏的时代。
</p>
<p>无论年龄,无论学历,无论是在BAT还是在startup工作,
只要你热爱编程,就一定要参与到开源的浪潮中。无论你是全职加入涛思数据这样的开源软件公司,还是作为社区贡献者参与一个开源项目,只要持续努力,你一定会给世界留下一个印迹,给人类留下一幅作品。</p>
<p>陶建辉</p>
<p>2020年12月27日于北京望京</p>
<!--收藏/取消收藏-->
<a href="javascript:;" class="collection block-center">收藏</a>
<a href="javascript:;" class="collected block-center" style="display: none">
<!-- <a href="javascript:;" class="collected block-center">-->
<span class="out">已收藏</span>
<span class="over" style="display: none">取消收藏</span>
</a>
<!--评论栏-->
<!--评论栏-未登陆显示登陆之后进行评论-->
<div class="comment_form_logout">
登录发表你的评论
</div>
<!--评论栏-登陆之后显示用户头像并进行评论-->
<form class="layui-form comment_form" action="">
<div class="layui-form-item">
<label class="layui-form-label person_pic">
<img src="../static/images/cat.jpg" alt="用户图标">
</label>
<div class="layui-input-block">
<textarea placeholder="请输入内容" class="layui-textarea"></textarea>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block" style="float: right">
<button type="submit" class="layui-btn layui-btn-primary layui-btn-sm" lay-submit
lay-filter="comment">评论
</button>
</div>
</div>
</form>
<!--评论列表-->
<div class="comment_list">
<div class="comment">
<div class="person_pic">
<img src="../static/images/worm.jpg" alt="用户图标">
</div>
<div class="comment-content">
<div class="username">用户张山</div>
<div class="comment_text">
写的不错,学习了,学习的道路上一起进步,也期待你的关注与支持!
</div>
<div class="comment_info" data-cid="1">
<div class="comment_time">2020-01-01 00:00:00</div>
<a href="javascript:;" class="comment_up" style="float: right">赞</a>
<a href="javascript:;" class="comment_reply">回复</a>
</div>
<div class="sub-comment">
<div class="sub-username">用户李思</div>
<div class="comment_text">
个人认为,这篇文章同样代表了开源的另一个现实——令人悲哀。推广请好好推,别把应聘和推广以及开源相提并论,这样只会拉低你们开源的价值。
</div>
<div class="comment_info" data-cid="2">
<div class="comment_time">2020-01-01 00:00:00</div>
<a href="javascript:;" class="comment_up" style="float: right">赞</a>
<a href="javascript:;" class="comment_reply">回复</a>
</div>
</div>
</div>
</div>
<div class="comment">
<div class="person_pic">
<img src="../static/images/worm.jpg" alt="用户图标">
</div>
<div class="comment-content">
<div class="username">用户张山</div>
<div class="comment_text">
写的不错,学习了,学习的道路上一起进步,也期待你的关注与支持!
</div>
<div class="comment_info" data-cid="3">
<div class="comment_time">2020-01-01 00:00:00</div>
<a href="javascript:;" class="comment_up" style="float: right">赞</a>
<a href="javascript:;" class="comment_reply">回复</a>
</div>
<div class="sub-comment">
<div class="sub-username">用户李思</div>
<div class="comment_text">
个人认为,这篇文章同样代表了开源的另一个现实——令人悲哀。推广请好好推,别把应聘和推广以及开源相提并论,这样只会拉低你们开源的价值。
</div>
<div class="comment_info" data-cid="4">
<div class="comment_time">2020-01-01 00:00:00</div>
<a href="javascript:;" class="comment_up" style="float: right">赞</a>
<a href="javascript:;" class="comment_reply">回复</a>
</div>
</div>
<form class="layui-form reply_form" action="">
<div class="layui-form-item">
<textarea placeholder="请输入内容" class="layui-textarea"></textarea>
</div>
<div class="layui-form-item">
<div class="layui-input-block" style="float: right">
<button type="submit" class="layui-btn layui-btn-primary layui-btn-sm"
lay-submit
lay-filter="sub-comment">评论
</button>
</div>
</div>
</form>
</div>
</div>
<div class="comment">
<div class="person_pic">
<img src="../static/images/worm.jpg" alt="用户图标">
</div>
<div class="comment-content">
<div class="username">用户张山</div>
<div class="comment_text">
写的不错,学习了,学习的道路上一起进步,也期待你的关注与支持!
</div>
<div class="comment_info" data-cid="5">
<div class="comment_time">2020-01-01 00:00:00</div>
<a href="javascript:;" class="comment_up" style="float: right">赞</a>
<a href="javascript:;" class="comment_reply">回复</a>
</div>
</div>
</div>
<div class="comment">
<div class="person_pic">
<img src="../static/images/worm.jpg" alt="用户图标">
</div>
<div class="comment-content">
<div class="username">用户张山</div>
<div class="comment_text">
写的不错,学习了,学习的道路上一起进步,也期待你的关注与支持!
</div>
<div class="comment_info" data-cid="6">
<div class="comment_time">2020-01-01 00:00:00</div>
<a href="javascript:;" class="comment_up" style="float: right">赞</a>
<a href="javascript:;" class="comment_reply">回复</a>
</div>
<form class="layui-form reply_form" action="">
<div class="layui-form-item">
<textarea placeholder="请输入内容" class="layui-textarea"></textarea>
</div>
<div class="layui-form-item">
<div class="layui-input-block" style="float: right">
<button type="submit" class="layui-btn layui-btn-primary layui-btn-sm"
lay-submit
lay-filter="sub-comment">评论
</button>
</div>
</div>
</form>
</div>
</div>
<div class="comment">
<div class="person_pic">
<img src="../static/images/worm.jpg" alt="用户图标">
</div>
<div class="comment-content">
<div class="username">用户张山</div>
<div class="comment_text">
写的不错,学习了,学习的道路上一起进步,也期待你的关注与支持!
</div>
<div class="comment_info" data-cid="7">
<div class="comment_time">2020-01-01 00:00:00</div>
<a href="javascript:;" class="comment_up" style="float: right">赞</a>
<a href="javascript:;" class="comment_reply">回复</a>
</div>
</div>
</div>
</div>
</div>
<div class="right-side">
<div class="article_author_card">
<a href="user.html" class="author_pic">
<img src="../static/images/user_pic.png" alt="author_pic">
</a>
<a href="user.html" class="author_name">张大山</a>
<div class="author_resume">
张大山的简介,张大山张大山的简介,张大山张大山的简介,张大山张大山的简介,张大山张大山的简介,张大山
</div>
<div style="margin-bottom: 10px;">
<span class="writings"><span>总篇数:</span><b>23</b></span>
<span class="follows"><span>粉丝:</span><b>36</b></span>
</div>
<div>
<a href="javascript:;" class="focus">关注</a>
<a href="javascript:;" class="focused">
<span class="out">已关注</span>
<span class="over">取消关注</span>
</a>
</div>
</div>
<!--排行榜栏-->
<div class="rank_card">
<div class="rank_title">
<h3>排行榜</h3>
</div>
<div class="rank_list">
<div><span>1</span><a href="#">苹果 M1 芯片预示着 RISC-V 完全替代 ARM?</a></div>
<div><span>2</span><a href="#">用DNS进行网络度量和安全分析</a></div>
<div><span>3</span><a href="#">阿里开源量子模拟器“太章2.0”,支持量子算法和纠错探索</a></div>
<div><span>4</span><a href="#">抖音 Android 性能优化系列:Java 内存优化篇</a></div>
<div><span>5</span><a href="#">离散数学总复习精华版(最全 最简单易懂)已完结</a></div>
<div><span>6</span><a href="#">AI能帮你快速过滤看着烦的广告留言</a></div>
</div>
</div>
</div>
{% endblock %}
css
.article-content {
/*文章详情内容*/
flex: 2.3;
overflow: hidden;
/*width: 778px;*/
padding: 20px;
background: #fff;
border: 1px solid #ececee;
}
.article-content h3 {
font-size: 30px;
line-height: 45px;
}
.detail_about {
/*文章详情(发布时间/评论)*/
margin: 10px 0;
border-bottom: 1px solid #ebebeb;
padding: 10px 0;
}
.detail_about .time_source {
color: #999;
font-size: 12px;
padding-left: 20px;
background: url(/static/images/clock.png) left center no-repeat;
}
.detail_about .author {
color: #999;
font-size: 12px;
padding-left: 20px;
}
.detail_about .comment_count {
/*评论数量*/
color: #999;
font-size: 12px;
margin-left: 20px;
padding-left: 20px;
background: url(/static/images/comment_icon.png) left center no-repeat;
}
.article-content .summary {
/*摘要*/
letter-spacing: 0.5px;
text-align: justify;
background: #f0f2f5;
font-size: 16px;
line-height: 28px;
padding: 15px 25px;
margin-top: 30px;
position: relative;
}
.article-content .summary:before {
position: absolute;
left: 5px;
top: 5px;
content: "『";
}
.article-content .summary:after {
position: absolute;
right: 5px;
bottom: 5px;
content: "』";
}
.article-content h4 {
/*文章内容*/
font-size: 18px;
font-weight: 700;
color: #16baaa;
border-left: 5px solid #16baaa;
padding-left: 10px;
}
.article-content p {
font-size: 16px;
line-height: 28px;
margin-bottom: 30px;
}
.article-content img {
width: 100%;
}
.collection {
/*收藏*/
display: block;
margin: 0 auto;
width: 98px;
line-height: 34px;
text-indent: 45px;
border: 1px solid #16baaa;
color: #16baaa;
border-radius: 4px;
font-size: 14px;
background: url(/static/images/collect_icons.png) 21px 7px no-repeat;
overflow: hidden;
}
.collection:hover {
background: url(/static/images/collect_icons.png) 21px -33px no-repeat;
}
.collected {
/*取消收藏*/
display: block;
margin: 0 auto;
width: 100px;
height: 36px;
line-height: 34px;
text-indent: 45px;
color: #666;
border-radius: 4px;
font-size: 14px;
background: url(/static/images/collect_icons.png) 15px -73px no-repeat #e6e6e6;
position: relative;
overflow: hidden;
}
.collected:hover {
color: #666;
border: 1px solid #16baaa;
background: url(/static/images/collect_icons.png) 21px 7px no-repeat;
width: 120px;
}
.comment_form_logout {
/*登录之后进行评论*/
border: 1px solid #e3e8ee;
border-radius: 4px;
padding: 15px 10px;
outline: none;
font-size: 16px;
color: #e3e8ee;
margin-top: 50px;
}
.comment_form {
/*登录之后评论表单数据渲染*/
margin-top: 50px;
overflow: hidden;
}
.person_pic {
padding: 6px 0;
margin: 0 auto;
}
.comment_form .person_pic img {
width: 80px;
border-radius: 50%;
}
.comment_list {
border-top: 1px solid #ebebeb;
}
.comment {
/*评论列表*/
border-bottom: 1px solid #ebebeb;
overflow: hidden;
margin-top: 15px;
padding-bottom: 15px;
display: flex;
}
.comment_list .person_pic {
width: 40px;
}
.comment_list .person_pic img {
width: 40px;
height: 40px;
border-radius: 20px;
}
.comment-content {
flex: 1;
display: flex;
flex-direction: column;
padding: 10px 10px;
}
.comment-content .username {
font-size: 14px;
font-weight: 700;
line-height: 20px;
color: #333;
}
.comment_text {
width: 718px;
font-size: 14px;
line-height: 20px;
color: #333;
margin: 10px 0;
}
.comment_time {
font-size: 12px;
color: #999;
}
.comment_up {
/*评论点赞*/
font-size: 12px;
color: #999;
text-indent: 20px;
background: url(/static/images/zan_icon.png) left top no-repeat;
}
.has_comment_up {
/*如果已经被点赞了就高亮图标*/
font-size: 12px;
color: #999;
text-indent: 20px;
background: url(/static/images/zan_icon.png) left bottom no-repeat;
}
.comment_reply {
/*回复评论*/
font-size: 12px;
color: #999;
text-indent: 20px;
background: url(/static/images/reply_icon.png) left center no-repeat;
}
.reply_form {
margin-top: 10px;
}
.sub-comment {
/*二级回复显示*/
width: 698px;
padding: 10px;
}
.sub-username {
font-size: 12px;
font-weight: 700;
line-height: 18px;
color: #333;
margin-bottom: 8px;
}
.comment_info {
display: flex;
flex-direction: row;
gap: 10px
}
.article_author_card {
/*文章作者信息展示*/
padding: 10px;
border: 1px solid #ececee;
border-radius: 5px;
margin-bottom: 10px;
background-color: #fff;
}
.article_author_card .author_pic {
width: 60px;
height: 60px;
}
.article_author_card img {
width: 60px;
height: 60px;
border-radius: 30px;
}
.article_author_card .author_name {
color: #333;
font-size: 22px;
line-height: 60px;
margin-left: 16px;
}
.article_author_card .author_name:hover {
color: #16baaa;
}
.article_author_card .author_resume {
width: 100%;
font-size: 13px;
color: #666;
margin-top: 10px;
margin-bottom: 10px;
}
.article_author_card .writings,
.article_author_card .follows {
margin: 20px 30px 0 0;
}
.focus {
/*个人信息 关注*/
display: inline-block;
width: 98px;
line-height: 34px;
text-indent: 45px;
border: 1px solid #f80;
color: #f80;
border-radius: 4px;
font-size: 14px;
background: url(/static/images/focus_icons.png) 21px 7px no-repeat;
overflow: hidden;
}
.focus:hover {
background: url(/static/images/focus_icons.png) 21px -33px no-repeat;
}
.focused {
/*个人信息 取消关注*/
display: inline-block;
width: 100px;
height: 36px;
color: #666;
border-radius: 4px;
font-size: 14px;
background: url(/static/images/focus_icons.png) 15px -73px no-repeat #e6e6e6;
position: relative;
overflow: hidden;
}
.focused:hover {
background-position: 10px -73px;
}
.focused:hover .out {
left: 40px;
top: 35px;
}
.focused:hover .over {
left: 33px;
top: 8px;
}
.focused .out {
position: absolute;
left: 40px;
top: 8px;
}
.focused .over {
position: absolute;
left: 40px;
top: 35px;
}