原创

[帝国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("<","&lt;").replace(">","&gt;").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的到来能勉强拉一拉,但是终究抵挡不住历史的洪流,会被埋的.

温馨提示:
本文最后更新于 2022年05月25日,已超过 43 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我
正文到此结束
本文目录