【思路】-博客-自动发布功能设计思路-只说思路具体实现靠自己

VTSBlog自动发布

wordpress有自动发布的功能,我的实现过程是

在Post的表中设计一个PublishTime的字段 例如“2016-06-16 08:56:00”表示这个Post在这个时间开始发布

那么在前台调用数据的时候只需要让发布时间和当前时间做比对进行筛选,小于等于当前时间的就是已发布的,大于当前时间的就是未发布的

本质:就是一个比较时间大小的问题

自动发布:就是表中PublishTime字段按照一定的时间间隔来排列,这样每天查询出的数据都是最新的数据,从而实现自定发布的功能.

如何为系统中的所有Post实现自动的时间间隔呢?间隔时间的生成

问题:我想每天自动发布5条数据
比如有100条数据,我们想办法为这100条数据生成一段连续的时间间隔,就可以不用管网站了,每天都是自定发布

输入:起始发布时间,每天发布多少条,要发布的PostID列表
输出:每个PostID对应的发布时间

最后:采用批量更新的方式更新你的数据表,整个过程就完成了
这是一道数学题

100条数据每天发布5条,发布其实时间从今天00:00:00开始计算 就需要20天才能发布完
也就是100条数据生成20个发布时间间隔,每5个为一组,从二十个时间间隔中取出一个,直到完全取完

注意考虑:没有除尽的情况 101条的话就要21个发布时间间隔了
好了这个数学题思路我都说完了,还可以进行很多的扩展。

比如:设置间隔发布时间
有人说间隔时间怎么弄啊Datetime 有一个加天 加小时的函数。

【思路】-IP访问控制AccessControl-Httpmodule设计实现

IP访问控制AccessControl
用途:用来封杀访客的请求,基于访客IP的控制:可以访问?不可以访问?分时段访问?等等一些特殊的要求

实现思路如下
第一步:需要获得访客的IP,获取方式如下
通过.net内置的函数实现,可能没法知道访客是不是通过代理来访问的【当然也没必要做的那么死】
通过第三方的js代码,这种靠谱一些【需要访客在第一次访问我们网站的时候使用Ajax的方式将IP发送到我们的系统中去】
http://pv.sohu.com/cityjson?ie=utf-8
js代码这种方式也有可能不准备【不过要寻找到好的获取IP的第三方的扩展】
第二步:和我们系统中一个IP段,txt格式的做匹配
如果这个客户的IP在我们的IP访问段当中了,我们就做自己想做的事情

难点1:算法 IP和IP段匹配的过程
有几种实现的方式:
我采用了最笨的一种方法:效率比较低 但是非常好理解
如果一个IP在一个IP段内,它的四个值 必定是大于等于起始段 并且小于等于结束段 【每个值都是如此,不信你来找我】
所以我逐个判断IP的四个值,最终确定这个IP是不是在这个IP段中
难点2:IP范围数据量大
比如:禁止美国访客的访问;或者禁止中国的访客访问等等
光美国的IP的条数 就有5000多条,就意味着需要这个访客IP要在这5000数据中循环匹配5000多次,效率的话就不太好
需要优化这个算法,更快的执行判断
暂时想到的
1.5000条数据缓存在Memcahed中去,避免在当前的进程中占用过多的内存
2.分离中这些IP段的头一个值,和访客的IP的第一个值 在接下来做文章【设想中。。。未实现】
目的:就是尽量减少IP的匹配次数
扩展:既然可以做IP的访问控制,那也就可以通过UA来控制基于浏览设备的控制,骚年继续思考吧

ffmpeg-140秒提取方案 精确时间提取视频 twitter专用2分20秒视频

关键字:twitter视频|ffmpeg|ffmpeg精准提取视频

脚本版本1

@echo off

ffmpeg -ss 00:01:55 -t 23 -i G:\GoogleVideo\1020\C9268AF3D6A91C8F0788BAECE2DEE01C.mp4 -y -c:v libx264 -c:a aac -strict experimental -b:a 98k -y G:\GoogleVideo\1020\temp\C9268AF3D6A91C8F0788BAECE2DEE01C_1.mp4
ffmpeg -ss 00:03:35 -t 23 -i G:\GoogleVideo\1020\C9268AF3D6A91C8F0788BAECE2DEE01C.mp4 -y -c:v libx264 -c:a aac -strict experimental -b:a 98k -y G:\GoogleVideo\1020\temp\C9268AF3D6A91C8F0788BAECE2DEE01C_2.mp4
ffmpeg -ss 00:05:15 -t 23 -i G:\GoogleVideo\1020\C9268AF3D6A91C8F0788BAECE2DEE01C.mp4 -y -c:v libx264 -c:a aac -strict experimental -b:a 98k -y G:\GoogleVideo\1020\temp\C9268AF3D6A91C8F0788BAECE2DEE01C_3.mp4
ffmpeg -ss 00:06:55 -t 23 -i G:\GoogleVideo\1020\C9268AF3D6A91C8F0788BAECE2DEE01C.mp4 -y -c:v libx264 -c:a aac -strict experimental -b:a 98k -y G:\GoogleVideo\1020\temp\C9268AF3D6A91C8F0788BAECE2DEE01C_4.mp4
ffmpeg -ss 00:08:35 -t 23 -i G:\GoogleVideo\1020\C9268AF3D6A91C8F0788BAECE2DEE01C.mp4 -y -c:v libx264 -c:a aac -strict experimental -b:a 98k -y G:\GoogleVideo\1020\temp\C9268AF3D6A91C8F0788BAECE2DEE01C_5.mp4
ffmpeg -ss 00:10:15 -t 23 -i G:\GoogleVideo\1020\C9268AF3D6A91C8F0788BAECE2DEE01C.mp4 -y -c:v libx264 -c:a aac -strict experimental -b:a 98k -y G:\GoogleVideo\1020\temp\C9268AF3D6A91C8F0788BAECE2DEE01C_6.mp4

echo "file 'C9268AF3D6A91C8F0788BAECE2DEE01C_1.mp4'\nfile 'C9268AF3D6A91C8F0788BAECE2DEE01C_2.mp4'\nfile 'C9268AF3D6A91C8F0788BAECE2DEE01C_3.mp4'\nfile 'C9268AF3D6A91C8F0788BAECE2DEE01C_4.mp4'\nfile 'C9268AF3D6A91C8F0788BAECE2DEE01C_5.mp4'\nfile 'C9268AF3D6A91C8F0788BAECE2DEE01C_6.mp4'" >>G:\GoogleVideo\1020\temp\C9268AF3D6A91C8F0788BAECE2DEE01C_files.txt

ffmpeg -f concat -i G:\GoogleVideo\1020\temp\C9268AF3D6A91C8F0788BAECE2DEE01C_files.txt -c copy -y G:\GoogleVideo\1020\Prev\C9268AF3D6A91C8F0788BAECE2DEE01C.mp4

echo "14\n"

脚本版本2

@echo off

ffmpeg -ss 00:01:55 -t 23 -i G:\GoogleVideo\1020\C9268AF3D6A91C8F0788BAECE2DEE01C.mp4 -y -c:v libx264 -c:a aac -strict experimental -b:a 98k -y G:\GoogleVideo\1020\temp\C9268AF3D6A91C8F0788BAECE2DEE01C_1.mp4
ffmpeg -ss 00:03:35 -t 23 -i G:\GoogleVideo\1020\C9268AF3D6A91C8F0788BAECE2DEE01C.mp4 -y -c:v libx264 -c:a aac -strict experimental -b:a 98k -y G:\GoogleVideo\1020\temp\C9268AF3D6A91C8F0788BAECE2DEE01C_2.mp4
ffmpeg -ss 00:05:15 -t 23 -i G:\GoogleVideo\1020\C9268AF3D6A91C8F0788BAECE2DEE01C.mp4 -y -c:v libx264 -c:a aac -strict experimental -b:a 98k -y G:\GoogleVideo\1020\temp\C9268AF3D6A91C8F0788BAECE2DEE01C_3.mp4
ffmpeg -ss 00:06:55 -t 23 -i G:\GoogleVideo\1020\C9268AF3D6A91C8F0788BAECE2DEE01C.mp4 -y -c:v libx264 -c:a aac -strict experimental -b:a 98k -y G:\GoogleVideo\1020\temp\C9268AF3D6A91C8F0788BAECE2DEE01C_4.mp4
ffmpeg -ss 00:08:35 -t 23 -i G:\GoogleVideo\1020\C9268AF3D6A91C8F0788BAECE2DEE01C.mp4 -y -c:v libx264 -c:a aac -strict experimental -b:a 98k -y G:\GoogleVideo\1020\temp\C9268AF3D6A91C8F0788BAECE2DEE01C_5.mp4
ffmpeg -ss 00:10:15 -t 23 -i G:\GoogleVideo\1020\C9268AF3D6A91C8F0788BAECE2DEE01C.mp4 -y -c:v libx264 -c:a aac -strict experimental -b:a 98k -y G:\GoogleVideo\1020\temp\C9268AF3D6A91C8F0788BAECE2DEE01C_6.mp4

echo file 'G:\\GoogleVideo\\1020\\temp\\C9268AF3D6A91C8F0788BAECE2DEE01C_1.mp4' >>G:\\GoogleVideo\\1020\\temp\\C9268AF3D6A91C8F0788BAECE2DEE01C_files.txt
echo file 'G:\\GoogleVideo\\1020\\temp\\C9268AF3D6A91C8F0788BAECE2DEE01C_2.mp4' >> G:\\GoogleVideo\\1020\\temp\\C9268AF3D6A91C8F0788BAECE2DEE01C_files.txt
echo file 'G:\\GoogleVideo\\1020\\temp\\C9268AF3D6A91C8F0788BAECE2DEE01C_3.mp4' >> G:\\GoogleVideo\\1020\\temp\\C9268AF3D6A91C8F0788BAECE2DEE01C_files.txt
echo file 'G:\\GoogleVideo\\1020\\temp\\C9268AF3D6A91C8F0788BAECE2DEE01C_4.mp4' >> G:\\GoogleVideo\\1020\\temp\\C9268AF3D6A91C8F0788BAECE2DEE01C_files.txt
echo file 'G:\\GoogleVideo\\1020\\temp\\C9268AF3D6A91C8F0788BAECE2DEE01C_5.mp4' >> G:\\GoogleVideo\\1020\\temp\\C9268AF3D6A91C8F0788BAECE2DEE01C_files.txt
echo file 'G:\\GoogleVideo\\1020\\temp\\C9268AF3D6A91C8F0788BAECE2DEE01C_6.mp4' >> G:\\GoogleVideo\\1020\\temp\\C9268AF3D6A91C8F0788BAECE2DEE01C_files.txt

ffmpeg -f concat -i G:\GoogleVideo\1020\temp\C9268AF3D6A91C8F0788BAECE2DEE01C_files.txt -c copy -y G:\GoogleVideo\1020\Prev\C9268AF3D6A91C8F0788BAECE2DEE01C.mp4

echo 14

【思路】-【ImagesRename】-检查图片是否存在的设计思路

重命名

输入主图列和详细图列【竖线分割的文件名】,图片源目录,
输出重命名之后的图片和新命名的主图名字和详细图名字【保存在E盘】

如果文件不存在,那么新名字一行将为空
读取Excel获得Reader,然后循环处理每一行
获得主图原名称,获得文件的扩展后缀,生成新的名字。命名方式:随机编号 ;基于主图名字;基于产品名字;
随机编号:采用时间命名,为了防止程序过快重复,追加一个后缀变量i,来保证新名字每个都是唯一的
主图名字:西欧字符有可能不能正确命名,采用一个函数,逐个过滤每个字符串,只保留a-z 0-9 空格,下划线,减号等字符,保证新名称 每一个都是唯一的
详细图:兼容zencart的命名格式,在主图的基础上追加”_“+i的方式生成

处理完成一列之后,如果图片重命名成功之后,在Stringbulider 变量中保存这个新名字,处理完成一行直接换行
先复制主图,主图复制完成之后在复制详细图
Path.GetExtension 可能因为字符的问题引发异常,所默认需要给一个默认的后缀名

如何保存生成之后的新的详细图列呢?
使用一个变量:复制成功之后就在整个变量上累加”|”,如果不成功就累加空
每次处理完一行之后,重新将整个变量置为空
可以扩展到任意后缀的文件重命名
增加复制成功的图片个数统计
用来校队图片文件数

检查


用来检查Excel图片列中的主图列在文件目录中都是存在的,防止图片不存在
循环读取Excel的每一行,获得名字,获得文件的路径地址,判断文件是否存在,如果不存在变量递增1
函数从第二行开始计算
最后检查变量如果不存在的图片为0,表示图片和名字一一对应上,大于0表示 名字和图片文件没有对象需要重命名

过滤


用来将图片文件从众多的图片中分离出来,保存在另一个目录
【前提】Excel列中保存的图片名字都不重复,必须在对图片重命名之后,才使用此功能
输入源目录 保存目录 数据Excel文件
循环读取Excel中的每一行,获得文件名,获得文件地址。判断存在,开始复制
分文件夹过滤
Excel中包含文件夹列:用来将图片分别复制到不同的文件夹中去
读取一行,读取文件名 读取文件名名
如果文件不存在,创建文件夹,开始复制文件

检查重复


输入一个Excel文件,将需要检查的一列命名成“重复”
用来检查Excel中的名字列是否有重复的,可以检查图片的下载链接
创建一个List集合,使用Contains函数,如果包含这个字符串就输出这个字符串
否则就添加到集合中去

创建文件
用来根据Excel中的表格数据,创建生成IndexFile和Resource表的SQL语句

ZenCart研究-产品数据上传字段格式说明

此数据,主图包含详细图[可以保证一个最基本的数据上传]

v_products_model — 产品型号 唯一的 自定义
v_products_type — 产品类型 默认:1
v_products_image — 产品图片 格式:文件夹/主图名字
v_products_name_1 — 产品名字
v_products_description_1 — 产品描述
v_products_url_1 — 产品URL地址
v_specials_price — 产品特价 特价一定要定于原价 只有小于原价才会写入数据库
v_specials_date_avail — 特价日期 留空或者0001-01-01
v_specials_expires_date — 过期时间 留空
v_products_price — 产品原价 基础价
v_products_weight — 产品重量 0
v_product_is_call — 产品价格是否面议 0 否
v_products_sort_order — 产品排序 默认:0

v_products_quantity_order_min — 产品一次购买最小数量 默认:1
v_products_quantity_order_units — 购买单元 默认:1

v_products_priced_by_attribute — 产品价格是否受到属性的影响 默认:0 否
v_product_is_always_free_shipping — 产品是否总是免邮费 默认:0 否
v_date_avail — 产品到货日期 为空即可
v_date_added — 产品添加日期 当前时间

v_products_quantity — 产品数量 9999
v_manufacturers_name — 产品供应商 为空即可
v_categories_name_1 — 分类名字 分类名字1^分类名字2^
v_tax_class_title — 缴税商品 默认:–none–

v_status — 是否显示 1
v_metatags_products_name_status — Meta是否显示产品名字 0
v_metatags_title_status — 未知 0
v_metatags_model_status — 0
v_metatags_price_status — 0
v_metatags_title_tagline_status — 0

v_metatags_title_1 — 产品title 为空即可
v_metatags_keywords_1 — 产品关键字 为空即可
v_metatags_description_1 — 产品描述 为空即可

增加扩展选项

v_products_folder_name — 自定义 产品文件夹
v_products_mainimg — 自定义 产品主图名称
v_products_detailimg — 自定义 产品详细图名称【详细图包含主图】
v_products_videosrc — 自定义 产品视频路径
v_products_ext1 — 自定义 产品扩展字段
v_products_ext2 — 自定义 产品扩展字段
v_products_ext3 — 自定义 产品扩展字段

下面是各个字段的说明
v_products_model
自主定义,最好参考别人的正品站点,设置型号与商品的型号有相似和相同的最好。
因为FP的数据不可能和正品一样,所以这个有些时候这个设置自己习惯设置也是可以的。
(必保持每个model id是不一样的,唯一性原则)

v_products_image
产品图片,用别人正品网站的图片也是可以,或是最好是自己从批发商下载的图片库,这样保证货都可以拿到。
然后自己经过firework批量根据产品名来命名,这样保证原创性,然后zhecart程序里面有一个批量给图片加alt属性,
这样就保证图片唯一性及已经优化好了,对后期的图片优化有很好的基础作用。

v_products_name_1
一般包含产品品牌型号等基本信息,然后已经自己特色的优化词汇和促销词汇最佳,以保证优化的效果

v_products_description_1
这个是给顾客看的描述,就是产品信息的描述,也是我们做内链的地方。
交叉连接和推荐链接等是做内链的主要方式,并且长尾词布局在适当的地方。
一般我会用h2标签来重复标题一下,这样一是给谷歌看,利于为做长尾词优化铺垫,
二是在描述强调下产品标题,给顾客给更多的产品影响

v_specials_price
商品特价,根据原价的折扣,可以用函数F(x)=原价表格对应id*折扣 批量来做。

v_specials_expires_date
商品特价过期时间,这个根据时间格式,可以设置不同时间不同的促销活动,也可以设一个比较远的时间日期,
让整个站点的商品都长期有特价促销,利用销售。

v_products_price
商品的原价,一般根据正品的价格来定未,个人是以正品价格的70%定位。

v_products_weight
不同的单位批量定位不同的的重量

v_last_modified
最晚修改时间

v_date_added
商品增加日期,一般这边可以设置不同的商品在不同的时间增加,
能够保证产品不断更新,对于站内优化有比较好的作用(个人经验)

v_products_quantity
商品数量

v_manufacturers_name
商品的制造商

[新版本的分类做了调整下面不适用]
v_categories_name_1
就是一级分类 也是最重要的分类,一般我们网站分类尽量不要太多,太多二级分类,
导致网站权重分流过多,同时也影响用户体验。
v_categories_name_2 一级分类下面的第一级分类,也是二级分类
v_categories_name_3 以上的同样类推,三级分类

v_tax_class_title
这个地方一般是填默认的 none

v_status
1 或是0 1表示是开启的,正常的状态,0表示关闭和不正常的状态。
商品的状态,一般建议一定开启,如果不开启,就是商品不能正常显示。

v_metatags_products_name_status
1 或是0 1表示是开启的,正常的状态,0表示关闭和不正常的状态。建议关闭

v_metatags_title_status
1 或是0 1表示是开启的,正常的状态,0表示关闭和不正常的状态。
建议开启,因为对于我们google优化来说,这个就是我们的id状态有没打开,是非常重要的,
同时为了避免显示太长的数据,导致搜索引擎不喜欢,
所以就建议只开status和title.

v_metatags_model_status
1 或是0 1表示是开启的,正常的状态,0表示关闭和不正常的状态。
建议关闭,因为title里面本来就包括了。

v_metatags_title_tagline_status
1 或是0 1表示是开启的,正常的状态,0表示关闭和不正常的状态。
建议开启,强调长尾关键词的作用。

以下是数据表最重要的部分,因为数据表只能定义子页面的大部分信息,
所以除去首页的meta和分类的meta之外,
这部分就是核心,站内子页面优化的核心。

v_metatags_title_1
这边有二种方式,一个是以标题命名title
这个也是所以正规网站的命名之道也是最常用的方式,
标题中本身就有包含产品的所以信息和长尾关键词。

二是,标题名加上自己的促销语和自己FP关键词为主的sale ,cheap等各种词语,
因为在竞争力面前,我们做fpseo本身子页面的产品竞争性就很弱,所以加上这些词,
可以避免同正品词进行激烈的竞争,
也同时保证你的信息的唯一原创性,一举两得,个人建议采用第二种。

v_metatags_keywords_1
相关的长尾关键词一到两个,相关的主关键词一到两个,
越重要的关键词一定要越前排列,这样他得到的权重也才越高,
对优化才更有促进作用。

v_metatags_description_1
务必包含产品的title的内容以及关键词,
同时可以延伸跟多一些服务,优化及文火因素,让顾客更全面了解产品。

ZenCart数据上传fields-139

v_products_model
v_products_image
v_products_name_1
v_products_description_1
v_products_url_1
v_specials_price
v_specials_last_modified
v_specials_expires_date
v_products_price
v_products_weight
v_last_modified
v_date_added
v_products_quantity
v_manufacturers_name
v_categories_name_1
v_categories_name_2
v_categories_name_3
v_categories_name_4
v_categories_name_5
v_categories_name_6
v_categories_name_7
v_tax_class_title
v_status
v_metatags_products_name_status
v_metatags_title_status
v_metatags_model_status
v_metatags_price_status
v_metatags_title_tagline_status
v_metatags_title_1
v_metatags_keywords_1
v_metatags_description_1

ZenCart数据上传fields-155

v_products_model
v_products_type
v_products_image
v_products_name_1
v_products_description_1
v_products_url_1
v_specials_price
v_specials_date_avail
v_specials_expires_date
v_products_price
v_products_weight
v_product_is_call
v_products_sort_order
v_products_quantity_order_min
v_products_quantity_order_units
v_products_priced_by_attribute
v_product_is_always_free_shipping
v_date_avail
v_date_added
v_products_quantity
v_manufacturers_name
v_categories_name_1
v_tax_class_title
v_status
v_metatags_products_name_status
v_metatags_title_status
v_metatags_model_status
v_metatags_price_status
v_metatags_title_tagline_status
v_metatags_title_1
v_metatags_keywords_1
v_metatags_description_1

ffmpeg-错误-提取视频预览时 报错-h.264 – FFMPEG (libx264) height not divisible by 2

I sometimes get the following error:

[libx264 @ 0xa3b85a0] height not divisible by 2 (520×369)

归结原因就是 height 不是偶数

After playing around with this a bit, I think I’ve answered my own question. Here is the solution in case anyone else runs into a similar issue… I had to add the below argument to the command:

-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2"

Command

ffmpeg -r 24 -i frame_%05d.jpg -vcodec libx264 -y -an video.mp4 -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2"

Basically, .h264 needs even dimensions so this filter will:

Divide the original height and width by 2
Round it down to the nearest pixel
Multiply it by 2 again, thus making it an even number

https://stackoverflow.com/questions/20847674/ffmpeg-libx264-height-not-divisible-by-2

http://www.itkeyword.com/doc/3596353026169028160/ffmpeg-libx264-height-not-divisible-by-2

Google Ads -资料-谷歌广告学习笔记

概念术语

广告系列

广告组

广告

什么是广告目标?

就是你的广告目的,是销售?获取流量?潜在客户?

Google广告官方帮助

商标

面向广告客户的商标方面的帮助

验证程序

关于“尽可能争取更多点击次数”出价

自动出价简介

查看质量得分

关键字无法触发广告展示:该怎么办?

关于广告审批流程

Google Ads 政策

使用关键字规划师

寻找新关键字的最佳做法

在关键字规划师中优化新关键字

Google Ads 广告系列类型简介

雨果网

https://www.cifnews.com/google/googleadwords

Google四大主流广告类型

7天如何利用谷歌搜索广告赚取275美元

Google广告投放指南:如何写出最佳Google搜索广告?

新手必学:谷歌广告投放(初级)最全官方教程

谷歌广告因误导性内容被拒登?看完这篇文章,再也不怕啦!

谷歌竞价排名设置技巧

广告课程

https://www.cifnews.com/yuke/list?key=other

其中

Google Ads购物广告系列

Google Ads搜索广告系列

Google广告优化

三门付费课程感觉很重要

WordPress研究-链接管理功能-开启WordPress链接管理功能

关键字:wordpress 链接管理

WordPress在3.5版本以后就隐藏了WordPress链接管理功能。

为什么隐藏?

WordPress 3.0 以来,就支持了自定义菜单功能,可以在菜单设置中添加自定义链接,并且支持多个菜单、不同位置的调用。这样就可以用菜单功能来实现链接管理的功能。

官方提供了Link Manager插件来恢复链接管理功能。

只有这一行代码。就搞定了。
所以如果你不想下载插件的话

复制 add_filter( ‘pre_option_link_manager_enabled’, ‘__return_true’ );

到你的主题functions.php文件中。同样可以恢复WordPress链接管理功能。

开启方法

不瞎逼逼,看具体操作,在自己网站主题下面找到functions.php,在里面添加一句话即可
/*开启wordpress友情链接管理*/
add_filter( 'pre_option_link_manager_enabled', '__return_true' );

WordPress主题-网址导航类主题

WordPress WebStack 开源版本

https://github.com/owen0o0/WebStack/releases/tag/1.1422

https://nav.iowen.cn/

Slhao 收费版本

https://salongweb.com/product/slhao.html

https://salongweb.com/demo?theme=Slhao

百度关键字

  • wordpress 网址导航主题
  • wordpress Slhao 主题
  • wordpress添加链接
  • wordpress wp_links
  • wp_links数据表结构
  • wordpress做网址导航

爱导航WordPress主题

https://www.zhutibaba.com/themes/daohang

https://www.zhutibaba.com/demo/daohang/