[帝国cms]python如何静态化tags
前言
这里不多说我为什么要弄这个了,反正目前有个需求,静态话tags
找办法
我先是网上找了很多相关的插件,无一例外都需要付费,虽然说付费无可厚非,但是我本人不是用于盈利的,那肯定不能增加我的成本.于是开始研究帝国的表结构,并且使用python脚本生成静态页
自己动手
分析
实际上帝国的表结构很简单明确,tags信息存放在emp_db.phome_enewstags
表中,跟文章的关联存放在emp_db.phome_enewstagsdata
表中
所以查询也就呼之欲出了
SELECT
*
FROM
emp_db.phome_enewstagsdata t,
emp_db.phome_ecms_ljz t1,
emp_db.phome_enewstags t2
WHERE
t.id = t1.id AND t.tagid = t2.tagid
AND t2.tagname = 'android'
当然这个查询是完全没有优化过性能的.这里说下查询的内容,通过enewstagedata关联到文章表,再关联到tag信息表.
优化性能
主要是提高了分页的效率
SELECT
t1.*
FROM
(SELECT
a.id, a.tid, a.tagid
FROM
emp_db.phome_enewstagsdata a
JOIN (SELECT
tid
FROM
emp_db.phome_enewstagsdata
WHERE
tagid = '706'
LIMIT 1000 , 2000) b ON a.tid = b.tid) AS t,
emp_db.phome_ecms_ljz t1,
emp_db.phome_enewstags t2
WHERE
t.id = t1.id AND t.tagid = t2.tagid;
python脚本
为了效率,我直接使用动态页渲染出来的结果,而中间的列表,则可以使用python来循环出来.
代码大概这样:
emssql.py
import pymysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root',
password='!J*aUn73Kde', database='emp_db', charset='utf8')
# 获取所有的tag,无分页
def getAllTags():
# # 生成一个游标对象(相当于cmd打开mysql中的 mysql>)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# # 让数据自动组织成字典
sql = 'select * from emp_db.phome_enewstags'
# 执行SQL语句
cursor.execute(sql)
res = cursor.fetchall()
cursor.close()
return res
# 判断tag对应的文章总量
def getDTByTagPageInfo(id):
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = '''SELECT count(1) as sl FROM emp_db.phome_enewstagsdata t, emp_db.phome_ecms_ljz t1, emp_db.phome_enewstags t2 where t.tagid=%s and t.id=t1.id and t.tagid=t2.tagid'''
cursor.execute(sql,(id))
res = cursor.fetchone()
cursor.close()
return res
# 分页取数据
def getDTByTag(id,start,number):
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 优化了分页的性能
sql = ''' SELECT from_unixtime(t1.newstime,%s) as newstime_local, t1.onclick, t1.title, t1.titleurl, t1.newstime, t1.smalltext FROM (select a.id,a.tid,a.tagid from emp_db.phome_enewstagsdata a join (select tid from emp_db.phome_enewstagsdata where tagid=%s limit %s,%s) b on a.tid=b.tid ) as t, emp_db.phome_ecms_ljz t1, emp_db.phome_enewstags t2 where t.id=t1.id and t.tagid=t2.tagid '''
cursor.execute(sql,('%Y-%m-%d',id,start,number))
res = cursor.fetchall()
cursor.close()
return res
tags.py
import io
import os
import re
from os import makedirs, mkdir
import shutil
from types import SimpleNamespace
import emssql as ecms
def main(config):
# 清空对应目录
deleteFirst(config)
tags=ecms.getAllTags()
# 构建tag目录
for tag in tags:
mkdirTags(tag,config)
#遍历所有tag,并且生成页面
for tag in tags:
genTagPage(config,tag)
# 分页生成tag
def genTagPage(config,tag):
# 每页显示的数量
pagenum=20
# 数据量
pageDtCount=ecms.getDTByTagPageInfo(tag["tagid"])["sl"]
pagecount = int(pageDtCount/pagenum)
print(f"标签id:{tag['tagid']},总页数{pagecount},总数据量{pageDtCount}")
for i in range(pagecount+1):
# 获取当前页的数据
archives=ecms.getDTByTag(tag["tagid"],i*pagenum,pagenum)
# cpage就是要生成的页面,这里我为了节省篇幅,去掉了我的页面的html代码
cpage = f''' {genTagWzList(archives)} '''
# 生成html到文件
f=open("%s/%s/%s.html"%(config.tags_file_path,tag["tagname"],i),"a")
f.write(cpage)
f.close()
# 生成列表内容
def genTagWzList(archives):
s=''
for arc in archives:
v=re.sub('<[^<]+?>','',arc["smalltext"]).replace('\n','').replace("<","<").replace(">",">").strip()
s+=f''' <li><h2><a href="{arc["titleurl"]}">{arc["title"]}</a></h2> <div class="single-meta"> <span class="time">时间:{arc["newstime_local"]}</span> </div> <p> {v} <div class="post-tags mt20"> </div> '''
return s
# 创建目录
def mkdirTags(tag,config):
if(exists(f"{config.tags_file_path}/{tag['tagname']}/")):
return
makedirs(f"{config.tags_file_path}/{tag['tagname']}/")
# 清空目录
def deleteFirst(config):
if(config.tags_deleteFirst==True):
if not os.path.exists(config.tags_file_path):
makedirs(f"{config.tags_file_path}")
else:
shutil.rmtree(config.tags_file_path)
帝国cms调整
进入系统->系统设置->伪静态参数设置,将其设置为tags/[!--tagname--]/[!--page--].html
即可.
最后
这篇文章只是给大家做个参考,用python只是因为我最近也在学习这门语言.
帝国cms这些年已经渐渐变的无人问津,已然有一种日落西山的感觉,想来8.0的到来能勉强拉一拉,但是终究抵挡不住历史的洪流,会被埋的.
本文来自:[帝国cms]python如何静态化tags-小码农,转载请保留本条链接,感谢!
温馨提示:
本文最后更新于 2022年05月25日,已超过 923 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
正文到此结束
- 本文标签: python 帝国cms tags
- 本文链接: https://djc8.cn/archives/ecms-how-to-statically-tags-use-python.html
- 版权声明: 本文由小码农原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权