首页
老李抖音
我能做的
记录
老李是谁
推荐
老李网盘
搜索
1
x99鸡血BIOS教程(附工具和华南X99-QD3鸡血BIOS下载)
5,394 阅读
2
主板BIOS开启CSM方法(华硕、微星、技嘉)
4,054 阅读
3
湖北电信/联通/移动DNS服务器地址大全
3,699 阅读
4
【下载】猫影视PC版 V1.1.3
2,923 阅读
5
关于PUBG游戏提示未授权硬件的常见解决办法
2,786 阅读
老李原创
技术笔记
系统固件包
经营心得
虚拟化
软件工具
无盘万能包
安卓固件
登录
搜索
标签搜索
记录
无盘
问题解决
虚拟化
源码
心得
ARM
游戏
开源项目
硬件
linux
网管老李 VX:lizhi0710
累计撰写
266
篇文章
累计收到
0
条评论
首页
栏目
老李原创
技术笔记
系统固件包
经营心得
虚拟化
软件工具
无盘万能包
安卓固件
页面
老李抖音
我能做的
记录
老李是谁
推荐
老李网盘
搜索到
266
篇与
» lizhi0710
的结果
2026-07-29
MAC修改器队长版 v2026.0425
如果您的电脑,因为开挂等操作,导致游戏封禁网卡,可以通过这款工具一键永久修改您的物理网卡MAC地址。兼容列表1、Realtek 100M/1000M/2.5G/5G/10G系列网卡2、Intel X520系列网卡3、Mellanox CX4/CX5系列单口网卡 (双口网卡没做验证,不要轻易去尝试)升级日志文件名称: MAC修改器.exe文件大小: 16.2 MB (16,998,400 字节)修改时间: 2026年04月24日,21:43:39MD5: 8E6CB49FA6B871F73E9D04A9172899CFSHA1: FE31F9EBABFCDF1DBB325BF7877B6F00B847C1492026年4月25日兼容2.5G无序版网卡。优化程序运行逻辑。优化修改提示信息。添加修改失败时的指南信息。2025年10月31日修复Intel网卡有概率获取不到NIC的问题!2025年10月22日修复Realtek网卡查询Efuse报错的问题!2025年10月19日兼容Realtek 100M/1000M/2.5G/5G/10G系列网卡兼容Intel X520系列网卡兼容Mellanox CX4/CX5系列单口网卡 (双口网卡没做验证,不要轻易去尝试)常见问题1、为什么不建议修改前三组信息?答:MAC地址前三组为厂商信息,比如:04-A9-59 为H3C的注册信息,D8-DA-F1 为华为的注册信息,C0-A6-6D 为浪潮的注册信息。更多厂商MAC前缀信息参考:https://standards-oui.ieee.org/oui/oui.txt2、如果不修改前三组信息还是机器码怎么办?答:那就改!3、修改了前三组信息后,无法上网怎么办?答:有时候修改前三组信息,确实会导致无法正常上网,这时候就只能改回去。(这也是备份原MAC地址的意义所在。)4、如果网卡改废了怎么办?答:找卖家看看还能不能拯救一下。(硬改有风险,改前需谨慎。)5、Realtek如何查询剩余EFuse直接?答:参考下图 ↓最后该软件为免费软件,如果您是花钱购买的,请找对应商家退款!
2026年07月29日
15 阅读
0 评论
0 点赞
2026-07-29
队长发布的主板信息修改器 v2026.0501
如果您的电脑,因为开挂等操作,导致游戏封禁主板,可以通过这款工具一键永久修改您的主板信息软件特色1、兼容 American Megatrends Inc 底层所有主板。2、兼容 Win7/8/10/11/Windows Server 全部操作系统。3、支持完整的主板信息备份恢复功能。4、支持主板全部信息的自定义修改。(详情查看进阶技巧2)文件名称: 主板信息修改器 v2026.0501.exe文件大小: 0.99 MB (1,044,480 字节)修改时间: 2026年05月01日,20:40:18MD5: F49526547F45DC3E27F23B4B9B7C0C9FSHA1: 51A89F83DC196B05B175E1A99632F54954583061进阶技巧1、如何备份恢复主板信息?2、如何修改软件内没有包含的信息?第一步:使用软件备份信息。第二步:用记事本打开备份后的文件,并修改你要修改的内容。(修改后记得保存)第三步:使用软件恢复信息功能,选择你修改后的DMS文件。附送DMS各字段中文说明,方便大家DIY主板信息: BIOS # BIOS 信息 ├─ Name # BIOS 厂商名称与供应商信息 ├─ Version # BIOS 固件版本号(对应软件内的BIOS版本) └─ Date # BIOS 发布日期(格式:MM/DD/YYYY)(对应软件内的BIOS日期) System # 系统整体信息 ├─ Manufacturer # 系统整机制造商名称(对应软件内的系统品牌) ├─ Product # 系统产品型号标识(对应软件内的系统型号) ├─ Version # 系统版本号(通常为厂商定义) ├─ SerialNum # 系统出厂唯一序列号 ├─ UUID # 系统全局唯一标识符(对应软件的UUID) ├─ SKUNum # 系统库存单位编号(SKU) └─ Family # 系统所属产品家族系列 BaseBoard # 主板信息 ├─ Manufacturer # 主板硬件制造商名称(对应软件内的主板品牌) ├─ Product # 主板产品型号(对应软件内的主板型号) ├─ Version # 主板硬件版本号 ├─ SerialNum # 主板序列号(对应软件内的序列号) ├─ AssetTag # 主板资产标签(企业资产管理用) └─ LocInChassis # 主板在机箱内的物理位置描述 BaseBoardWithHandle # 带句柄的主板信息 ├─ Handle # SMBIOS 结构句柄(十六进制) ├─ Manufacturer # 主板制造商名称(对应软件内的主板品牌) ├─ Product # 主板产品型号(对应软件内的主板型号) ├─ Version # 主板版本号 ├─ SerialNum # 主板序列号(对应软件内的序列号) ├─ AssetTag # 主板资产标签 └─ LocInChassis # 主板在机箱内的位置 Chassis # 机箱信息 ├─ Manufacturer # 机箱制造商名称 ├─ ChassisType # 机箱类型代码(03 代表台式机) ├─ Version # 机箱版本号 ├─ SerialNum # 机箱序列号 ├─ TagNum # 机箱资产标签号 ├─ ChassisOEM # OEM 厂商保留字段(通常为 0) ├─ ChassisHeight # 机箱高度(单位 U,00 表示未知) ├─ PowerCords # 机箱所配电源线数量 └─ ChassisSKU # 机箱 SKU 编号 ChassisWithHandle # 带句柄的机箱信息 ├─ Handle # SMBIOS 结构句柄 ├─ Manufacturer # 机箱制造商名称 ├─ ChassisType # 机箱类型代码 ├─ Version # 机箱版本号 ├─ SerialNum # 机箱序列号 ├─ TagNum # 机箱资产标签号 ├─ ChassisOEM # OEM 保留字段 ├─ ChassisHeight # 机箱高度(U) ├─ PowerCords # 电源线数量 └─ ChassisSKU # 机箱 SKU 编号 Processor # CPU信息 ├─ SerialNum # CPU序列号(现代 CPU 通常为 Unknown) ├─ AssetTag # CPU资产标签(厂商预留) └─ PartNum # CPU部件号(通常不可用) ProcessorWithHandle # 带句柄的CPU信息 ├─ Handle # SMBIOS 结构句柄 ├─ SerialNum # CPU序列号 ├─ AssetTag # CPU资产标签 └─ PartNum # CPU部件号 OemString # OEM字符串 └─ String # OEM厂商自定义字符串(默认均为 Default string) Configuration # 配置信息 └─ String # 系统配置字符串(预留字段,通常为 Default string) 下载:https://url67.ctfile.com/d/8911067-167006179-4ffe44?p=3328
2026年07月29日
13 阅读
0 评论
0 点赞
2026-07-07
龙管家V8版本客户端快捷参数
商品点购 "C:\Program Files (x86)\Dim4\Dim4Client.exe" ShowShopping呼叫网管 "C:\Program Files (x86)\Dim4\Dim4Client.exe" ShowCallManage充值 "C:\Program Files (x86)\Dim4\Dim4Client.exe" ShowTopup包时 "C:\Program Files (x86)\Dim4\Dim4Client.exe" ShowBundleTime挂机 "C:\Program Files (x86)\Dim4\Dim4Client.exe" ShowSuspend结账 "C:\Program Files (x86)\Dim4\Dim4Client.exe" ShowCheckOut龙管家V8客户端 "C:\Program Files (x86)\Dim4\Dim4Client.exe" ShowMainWnd
2026年07月07日
50 阅读
0 评论
0 点赞
2026-06-21
技嘉AMD主板盲刷BIOS教程
A. 在开始执行 Q-Flash Plus 之前,请照下列步骤依序进行:请先至技嘉网站下载符合您主板型号的新一代 BIOS 版本压缩文件。解压缩所下载的 BIOS 压缩文件,将 BIOS 文件存储至 U 盘中,并重新命名为「GIGABYTE.bin」。( 请注意:所使用的 U 盘必须是 FAT32/16 文件系统格式。)连接 12V 电源插座及主电源插座 ( 若有两个 12V 电源插座请择一使用 ),即可执行 Q-FlashPlus。请先开启电源供应器的电源,再将 U 盘连接至主板后方的 Q-Flash Plus 接口。B. 执行 Q-Flash Plus按下 Q-Flash Plus 按钮后,系统将自动寻找比对连接于 Q-Flash Plus 接口的 BIOS 文件,同时QFLED 或 Q-Flash Plus 按钮会开始闪烁 ( 表示开始进行比对及更新 )。约等 6~8 分钟,灯号闪烁停止,代表 BIOS 更新结束。注意!!!执行 Q-Flash Plus 前,请确认系统于关机状态 (S5 待机模式 )。• 若主板上有配置 BIOS 切换器及 SB 切换器,在执行 Q-Flash Plus 前请先将其恢复为预设值 (BIOS_SW:由主 BIOS 开机、SB:Dual BIOS)。• 完成主 BIOS 更新后,有 DualBIOS ™的机种于系统再次开机时,会由 DualBIOS ™进行备份 BIOS 的更新,完成后系统会再次重新开机,由主 BIOS 正常开机
2026年06月21日
113 阅读
0 评论
0 点赞
2026-06-21
网页版本DMP在线分析代码分享
``
2026年06月21日
77 阅读
0 评论
2 点赞
2026-06-20
苹果CMSV10主题开发说明
自己学习记录一下 ========模板结构======= │─template/1/ 模板1 │ ├─info.ini 模板信息文件 │ ├─ads 广告文件目录 │ ├─js js文件 │ ├─css css文件 │ ├─images 图片文件 │ └─html 模板文件目录 │ └─art 文章模块模板目录 │ └─comment 评论模块模板目录 │ └─gbook 留言本模块模板目录 │ └─index 首页模块模板目录 │ └─label 自定义页面模块模板目录 │ └─map 地图页模块模板目录 │ └─public 公共页面模板目录 │ └─rss RSS和sitemap模板目录 │ └─topic 专题模块模板目录 │ └─user 用户中心模块模板目录 │ └─vod 视频模块模板目录 │ └─manga 漫画模块模板目录 │ └─plot 分集剧情模块模板目录 │ └─website 网址导航模块模板目录 │─tempalte/2/ 模板2 │─... │─template/n/ 模板N ========模板目录下的info.ini介绍======== 里边包含了对模板文件的简单介绍,及adsdir广告文件存放目录的设置,默认广告目录为ads ========模板名称====== public/include.html 全站公共引入文件 引入js、css样式,还有系统JS变量 public/head.html 全站头部 public/foot.html 全站尾部 public/jump.html 跳转提示页模板 public/msg.html 错误提示页模板 public/paging.html 分页样式模板 public/digg.html 顶踩样式模板 public/score.html 普通评分样式模板 public/star.html 星星评分样式模板 public/verify.html 搜索筛选页验证码模板 │ comment/index.html 评论页 comment/ajax.html 评论页 gbook/index.html 留言本 gbook/report.html 报错页面 │ index/index.html 首页 │ map/rss.html rss map/baidu.html 百度sitemap map/google.html 谷歌sitemap │ topic/index.html 专题首页 topic/detail.html 专题详情页 │ art/confirm.html 确认支付积分页面 art/detail.html 文章内容页 art/detail_pwd.html 验证密码页 art/rss.html 文章内容rss art/search.html 文章搜索页 art/type.html 文章分类页 art/show.html 文章分类筛选页 │ vod/confirm.html 确认支付积分页面 vod/copyright.html 版权提示和跳转 vod/detail.html 视频内容页 vod/detail_pwd.html 验证密码页 vod/rss.html 视频内容rss vod/play.html 视频播放页 vod/player.html 试看页面播放页 vod/player_pwd.html 验证密码页 vod/down.html 视频下载页 vod/downer_pwd.html 验证密码页 vod/search.html 视频搜索页面 vod/type.html 视频分类页面 vod/show.html 视频分类筛选页 vod/plot.html 视频分集剧情列表 │ manga/confirm.html 确认支付积分页面 manga/copyright.html 版权提示和跳转 manga/detail.html 漫画内容页 manga/detail_pwd.html 验证密码页 manga/rss.html 漫画内容rss manga/play.html 漫画阅读页 manga/player.html 试看页面阅读页 manga/player_pwd.html 验证密码页 manga/down.html 漫画下载页 manga/downer_pwd.html 验证密码页 manga/search.html 漫画搜索页面 manga/type.html 漫画分类页面 manga/show.html 漫画分类筛选页 │ user/ajax_info.html 用户弹出层登录详情 user/ajax_login.html 用户弹出层登录界面 user/buy.html 用户中心-在线充值 user/cards.html 用户中心-充值卡记录 user/cash.html 用户中心-提现记录 user/downs.html 用户中心-下载记录 user/favs.html 用户中心-收藏记录 user/findpass.html 用户中心-找回密码 user/findpass_msg.html 用户中心-找回密码提示信息 user/foot.html 用户中心-公共底部 user/head.html 用户中心-公共头部 user/include.html 用户中心-公共引入文件 user/index.html 用户中心-首页 user/info.html 用户中心-个人详情 user/login.html 用户中心-登录页 user/orders.html 用户中心-在线充值记录 user/pay.html 用户中心-支付页 user/payment_weixin.html 用户中心-支付微信二维码 user/plays.html 用户中心-点播记录 user/popedom.html 用户中心-权限列表 user/reg.html 用户中心-注册 user/reward.html 用户中心-分销记录 user/upgrade.html 用户中心-会员升级 │ plot/index.html 分集剧情首页 plot/detail.html 分集剧情详情页 | actor/index.html 演员首页 actor/detail.html 演员详情页 actor/search.html 演员网址搜索页 actor/show.html 演员筛选页 actor/type.html 演员分类页 | role/index.html 角色首页 role/detail.html 角色详情页 role/show.html 角色筛选页 │ website/index.html 网址导航首页 website/detail.html 网址详情页 website/search.html 网址搜索页 website/show.html 网址筛选页 website/type.html 网址分类页 ========全局标签======= {$maccms.site_name}网站名称 {$maccms.site_url}网站url {$maccms.site_wapurl} wap网站url {$maccms.site_logo}网站logo {$maccms.site_waplogo} wap网站logo {$maccms.site_keywords}网站关键字 {$maccms.site_description}网站描述 {$maccms.site_icp}备案号 {$maccms.site_qq}站长qq {$maccms.site_email}站长email {$maccms.site_tj|html_entity_decode}统计代码;也可以用{$maccms.path}static/js/tj.js 来动态引入统计代码。 {$maccms.site_status}网站状态1开启0关闭 {$maccms.site_close_tip}网站关闭提示信息 {$maccms.path}网站目录 {$maccms.path_tpl}当前模板目录 {$maccms.date} 当前日期 {$maccms.search_hot} 热门搜索词 {$maccms.art_extend_class} 全局文章扩展分类 {$maccms.vod_extend_class} 全局视频扩展分类 {$maccms.manga_extend_class} 全局漫画扩展分类 {$maccms.vod_extend_state} 全局视频资源 {$maccms.vod_extend_version} 全局视频版本 {$maccms.vod_extend_area} 全局视频地区 {$maccms.vod_extend_lang} 全局视频语言 {$maccms.vod_extend_year} 全局视频年代 {$maccms.vod_extend_weekday} 全局视频更新周期 {$maccms.actor_extend_area} 全局演员地区 {$maccms.http_type} 当前url访问协议,会输出 http:// 或者 https:// {$maccms.controller_action} 当前页面触发的程序路径controller/action 如果$maccms.标签不够用,想调用其他配置项的内容,可以用$GLOBALS['config'] 来获取到 例如 {$GLOBALS['config']['site']['site_name']} 其他项:具体包含哪些属性可以调试查看下;{php} dump($GLOBALS['config']);die; {/php} $GLOBALS['config']['site'] 站点配置 $GLOBALS['config']['app'] 预留参数配置 $GLOBALS['config']['user'] 用户配置 $GLOBALS['config']['gbook'] 留言本配置 $GLOBALS['config']['comment'] 评论配置 $GLOBALS['config']['upload'] 上传配置 $GLOBALS['config']['interface'] 站外入库配置 $GLOBALS['config']['pay'] 支付配置 $GLOBALS['config']['collect'] 采集配置 $GLOBALS['config']['api'] api配置 $GLOBALS['config']['connect'] 第三方登录配置 $GLOBALS['config']['weixin'] 微信配置 $GLOBALS['config']['view'] url浏览模式配置 $GLOBALS['config']['path'] url静态路径配置 $GLOBALS['config']['rewrite'] 路由配置 $GLOBALS['config']['weixin'] 微信配置 $GLOBALS['config']['email'] 邮件配置 $GLOBALS['config']['play'] 播放器配置 $GLOBALS['config']['urlsend'] url推送配置 $GLOBALS['config']['sms'] 短信配置 $GLOBALS['config']['extra'] 自定义参数配置 $GLOBALS['config']['seo'] SEO参数配置 ------------------SEO参数信息------------------------------ {$maccms.seo.vod.name} 视频首页SEO标题 {$maccms.seo.vod.key} 视频首页SEO关键字 {$maccms.seo.vod.des} 视频首页SEO描述 {$maccms.seo.art.name} 文章首页SEO标题 {$maccms.seo.art.key} 文章首页SEO关键字 {$maccms.seo.art.des} 文章首页SEO描述 {$maccms.seo.actor.name} 演员首页SEO标题 {$maccms.seo.actor.key} 演员首页SEO关键字 {$maccms.seo.actor.des} 演员首页SEO描述 {$maccms.seo.role.name} 角色首页SEO标题 {$maccms.seo.role.key} 角色首页SEO关键字 {$maccms.seo.role.des} 角色首页SEO描述 {$maccms.seo.plot.name} 剧情首页SEO标题 {$maccms.seo.plot.key} 剧情首页SEO关键字 {$maccms.seo.plot.des} 剧情首页SEO描述 {$maccms.seo.website.name} 网址导航首页SEO标题 {$maccms.seo.website.key} 网址导航首页SEO关键字 {$maccms.seo.website.des} 网址导航首页SEO描述 {$maccms.seo.manga.name} 漫画首页SEO标题 {$maccms.seo.manga.key} 漫画首页SEO关键字 {$maccms.seo.manga.des} 漫画首页SEO描述 ------------------下方高能------------------------------ $GLOBALS['type_id'] 当前分类页ID,在(分类页,筛选页,内容页,播放页,下载页都有值) $GLOBALS['type_pid'] 当前分类页父ID,在(分类页,筛选页,内容页,播放页,下载页都有值) {$maccms.mid}模块id,1=>'视频',2=>'文章',3=>'专题',4=>'评论',5=>'留言',6=>'用户中心',7=>'自定义页面',8=>'演员',9=>'角色',10=>'剧情',11=>'网址',12=>'漫画' {$maccms.aid}当前系统页面id 首页1 地图2 rss3 留言本4 评论5 用户中心6 自定义页面7 视频首页10 视频分类页11 视频分类筛选12 视频搜索13 视频详情14 视频播放15 视频下载16 视频角色17 文章首页20 文章分类21 文章分类筛选22 文章搜索23 文章详情24 专题首页30 专题搜索33 专题详情34 演员首页80 演员分类81 演员筛选82 演员搜索83 演员详情84 角色首页90 角色搜索93 角色详情94 剧情首页100 剧情搜索103 剧情想请104 网址导航首页110 网址导航分类111 网址导航筛选112 网址导航搜索113 网址导航详情114 漫画首页120 漫画分类121 漫画分类筛选122 漫画搜索123 漫画详情124 漫画阅读125 漫画下载126 ------------------------------------------------ 设计首页幻灯片的时候,建议统一调用推荐值为9的数据~ =======引入模板文件======= {include file="public/head"} =======分类列表标签======= order排列顺序desc倒序,asc正序 by排序依据 id,sort start从第几条开始 num获取条数 ids指定分类parent获取一级分类;child获取子分类;1,2,3一组指定ID; parent父分类id flag视频=vod文章=art not排除id cachetime自定义缓存时间单位秒 {maccms:type num="10" order="asc" by="sort" ids="all"} 内部同下方,{$obj.改为{$vo.开头即可 {/maccms:type} 嵌套标签获取一级及二级 {maccms:type ids="1,2,3,4" order="asc" by="sort" id="vo1" key="key1"} 一级分类:{$vo1.type_name}- {maccms:type parent="'.$vo1['type_id'].'" order="asc" by="sort" id="vo2" key="key2"} 二级分类{$vo2.type_name} {/maccms:type} <br> {/maccms:type} =======分类页独有标签======= {$obj.parent} 如果当前访问的是二级分类,这个是一级分类对象,也同样包含以下属性,如{$obj.parent.type_id}一级分类id {$obj.type_id}分类id {$obj.type_name}名称 {$obj.type_en}别名 {$obj.type_sort}排序号 {$obj.type_mid}所属模块 {$obj.type_pid}上级id {$obj.type_status}状态1开启0关闭 {$obj.type_tpl}分类页模板 {$obj.type_tpl_list}筛选页模板 {$obj.type_tpl_detail}详情页模板 {$obj.type_tpl_play}播放页模板 {$obj.type_tpl_down}下载页模板 {$obj.type_key}关键字 {$obj.type_des}描述信息 {$obj.type_title}标题 {$obj.type_extend}扩展配置json {$obj.type_logo}分类图标 {$obj.type_pic}分类封面 {$obj.type_jumpurl}跳转url {:mac_url_type($obj)} 分类链接 =======专题列表标签======= order排列顺序desc倒序,asc正序 by排序依据 id, time,time_add,score,hits,hits_day,hits_week,hits_month,up,down,level,rnd start从第几条开始 num获取条数 ids指定1,2,3一组指定ID; timeadd添加时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour timehits点击时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour time更新时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour hitsmonth月点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 hitsweek周点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 hitsday日点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 hits总点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 paging是否分页yes {maccms:topic num="10" paging="no" order="asc" by="sort" ids="all"} 内部同下方,{$obj.改为{$vo.开头即可 {/maccms:topic} =======专题页独有标签======= {$obj.topic_id}专题id {$obj.topic_name}名称 {$obj.topic_en}别名 {$obj.topic_sub}副标 {$obj.topic_status}状态 {$obj.topic_sort}排序号 {$obj.topic_letter}首字母 {$obj.topic_color}高亮颜色 {$obj.topic_tpl}模板文件 {$obj.topic_type}扩展分类 {$obj.topic_pic}图片 {$obj.topic_pic_thumb}缩略图 {$obj.topic_pic_slide}幻灯图 {$obj.topic_key}seo关键字 {$obj.topic_des}seo描述 {$obj.topic_title}seo标题 {$obj.topic_blurb}简介 {$obj.topic_remarks}备注 {$obj.topic_level}推荐值 {$obj.topic_up}顶数 {$obj.topic_down}踩数 {$obj.topic_score}平均分 {$obj.topic_score_all}总评分 {$obj.topic_score_num}总评次 {$obj.topic_hits}总点击 {$obj.topic_hits_day}日点击 {$obj.topic_hits_week}周点击 {$obj.topic_hits_month}月点击 {$obj.topic_time}更新时间 {$obj.topic_time_add}添加时间 {$obj.topic_content}详细介绍 {$obj.topic_extend}扩展配置json {$obj.topic_rel_vod|explode=',',###|count} 专题包含视频数量 {$obj.topic_rel_art|explode=',',###|count} 专题包含文章数量 {:mac_url_topic_detail($obj)} 专题详情页链接 {:mac_url_topic_index()} 专题首页链接 =======漫画列表标签======= order排列顺序desc倒序,asc正序 by排序依据 id,time,time_add,score,hits,hits_day,hits_week,hits_month,up,down,level,rnd start从第几条开始 num获取条数 ids指定1,2,3一组ID; not不抱含id 多个逗号链接 type指定获取分类数据 all所有;1,2,3指定; class指定某扩展分类 支持多个 动作,喜剧 tag指定tag 支持多个 aaa,xxx level指定推荐值 支持多个 1,2 area指定地区 支持多个 大陆,香港 lang指定语言 支持多个 国语,粤语 year指定年代 支持多个 2002,2003 serial连载状态 timeadd添加时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour timehits点击时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour time更新时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour hitsmonth月点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 hitsweek周点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 hitsday日点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 hits总点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 paging是否分页yes pageurl分页地址 cachetime自定义缓存时间单位秒 {maccms:manga num="10" paging="no" type="all" order="asc" by="sort"} 内部同下方,{$obj.改为{$vo.开头即可 {/maccms:manga} =======漫画内容页独有标签======= {$obj.manga_id} 漫画id {$obj.type_id} 分类id {$obj.type_id_1} 一级分类id {$obj.group_id} 会员组id {$obj.manga_name} 漫画名称 {$obj.manga_sub} 副标题 {$obj.manga_en} 英文名 {$obj.manga_status} 状态(0=锁定,1=正常) {$obj.manga_letter} 首字母 {$obj.manga_color} 标题颜色 {$obj.manga_from} 来源 {$obj.manga_author} 作者 {$obj.manga_tag} 标签 {$obj.manga_class} 扩展分类 {$obj.manga_pic} 封面图 {$obj.manga_pic_thumb} 封面缩略图 {$obj.manga_pic_slide} 封面幻灯图 {$obj.manga_pic_screenshot} 内容截图 {$obj.manga_blurb} 简介 {$obj.manga_remarks} 备注(例如:更新至xx话) {$obj.manga_jumpurl} 跳转URL {$obj.manga_tpl} 独立模板 {$obj.manga_level} 推荐级别 {$obj.manga_lock} 锁定状态(0=未锁,1=已锁) {$obj.manga_points} 点播所需积分 {$obj.manga_points_detail} 每章所需积分 {$obj.manga_up} 顶数 {$obj.manga_down} 踩数 {$obj.manga_hits} 总点击数 {$obj.manga_hits_day} 日点击数 {$obj.manga_hits_week} 周点击数 {$obj.manga_hits_month} 月点击数 {$obj.manga_time} 更新时间 {$obj.manga_time_add} 添加时间 {$obj.manga_time_hits} 点击时间 {$obj.manga_time_make} 生成时间 {$obj.manga_score} 平均评分 {$obj.manga_score_all} 总评分 {$obj.manga_score_num} 评分次数 {$obj.manga_rel_manga} 关联漫画 {$obj.manga_rel_vod} 关联视频 {$obj.manga_pwd} 访问密码 {$obj.manga_pwd_url} 密码跳转URL {$obj.manga_content} 详细介绍 {$obj.manga_serial} 连载状态(文字) {$obj.manga_total} 总章节数 {$obj.manga_chapter_from} 章节来源 {$obj.manga_chapter_url} 章节URL列表 {$obj.manga_last_update_time} 最后更新时间戳 {$obj.manga_age_rating} 年龄分级(0=全年龄,1=12+,2=18+) {$obj.manga_orientation} 阅读方向(1=左到右,2=右到左,3=垂直) {$obj.manga_is_vip} 是否VIP(0=否,1=是) {$obj.manga_copyright_info} 版权信息 {:mac_url_manga_detail($obj)} 漫画详情页链接 {:mac_url_manga_play($obj,['sid'=>1,'nid'=>1])} 漫画阅读页链接 {:mac_url_manga_play($obj,'first')} 漫画阅读页第一条链接 {:mac_url_manga_down($obj,['sid'=>1,'nid'=>1])} 漫画下载页链接 {:mac_url_manga_down($obj,'first')} 漫画下载页第一条链接 =======视频列表标签======= order排列顺序desc倒序,asc正序 by排序依据 id,time,time_add,score,hits,hits_day,hits_week,hits_month,up,down,level,rnd start从第几条开始 num获取条数 ids指定1,2,3一组ID; not不抱含id 多个逗号链接 type指定获取分类数据 all所有;1,2,3指定; class指定某扩展分类 支持多个 动作,喜剧 tag指定tag 支持多个 aaa,xxx level指定推荐值 支持多个 1,2 area指定地区 支持多个 大陆,香港 lang指定语言 支持多个 国语,粤语 year指定年代 支持多个 2002,2003 state资源类别 支持多个 高清版,剧场版,抢先版 version资源版本 支持多个 正片,预告片 weekday更新周期 支持多个 一,二,三 rel指定关联数据 1,2,3 或 变形金刚 timeadd添加时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour timehits点击时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour time更新时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour hitsmonth月点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 hitsweek周点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 hitsday日点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 hits总点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 paging是否分页yes pageurl分页地址 cachetime自定义缓存时间单位秒 isend是否连载完毕 0,1 plot是否包含分集剧情 0,1 {maccms:vod num="10" paging="no" type="all" order="asc" by="sort"} 内部同下方,{$obj.改为{$vo.开头即可 {/maccms:vod} =======视频内容页独有标签======= {$obj.vod_id} 视频id {$obj.type_id} 分类id {$obj.type_id_1} 一级分类id {$obj.type} 分类对象,二级属性可参考分类属性 {$obj.type.type_name} 分类名 {$obj.type.type_en} 分类拼音 {$obj.type_1} 一级分类对象,二级属性可参考分类属性 {$obj.type_1.type_name} 一级分类名 {$obj.type_1.type_en} 一级分类拼音 {$obj.group_id} 用户组id {$obj.vod_name} 视频名 {$obj.vod_sub} 副标题 {$obj.vod_en} 别名 {$obj.vod_status} 状态0未审1已审 {$obj.vod_letter} 首字母 {$obj.vod_color} 颜色 {$obj.vod_tag} tags {$obj.vod_class} 扩展分类 {$obj.vod_pic} 图片 {$obj.vod_pic_thumb} 缩略图 {$obj.vod_pic_slide} 幻灯图 {$obj.vod_pic_screenshot}截图多个图片用#连接 {$obj.vod_pic_screenshot_list}截图列表 {$obj.vod_actor} 主演 {$obj.vod_director} 导演 {$obj.vod_writer}编剧 {$obj.vod_behind}幕后 {$obj.vod_blurb} 简介 {$obj.vod_remarks} 备注 {$obj.vod_pubdate}上映日期 {$obj.vod_total} 总集数 {$obj.vod_serial} 连载数 {$obj.vod_tv} 上映电视台 {$obj.vod_weekday} 节目周期 {$obj.vod_area} 地区 {$obj.vod_lang} 语言 {$obj.vod_year} 年代 {$obj.vod_version} 版本-dvd,hd,720p {$obj.vod_state} 资源类别-正片,预告片,花絮 {$obj.vod_author} 编辑人员 {$obj.vod_jumpurl} 跳转url {$obj.vod_tpl} 独立模板 {$obj.vod_tpl_play} 独立播放页模板 {$obj.vod_tpl_down} 独立下载页模板 {$obj.vod_isend} 是否完结 {$obj.vod_lock} 锁定1 {$obj.vod_level} 推荐级别 {$obj.vod_points} 访问整个视频所需积分 {$obj.vod_points_play} 每集点播付费 {$obj.vod_points_down} 每集下载付费 {$obj.vod_hits} 总点击量 {$obj.vod_hits_day} 日点击量 {$obj.vod_hits_week} 周点击量 {$obj.vod_hits_month} 月点击量 {$obj.vod_duration} 时长 {$obj.vod_up} 顶数 {$obj.vod_down} 踩数 {$obj.vod_score} 平均分 {$obj.vod_score_all} 总评分 {$obj.vod_score_num} 评分次数 {$obj.vod_time} 更新时间 {$obj.vod_time_add} 添加时间 {$obj.vod_time_hits} 点击时间 {$obj.vod_time_make} 生成时间 {$obj.vod_trysee} 试看时长分 {$obj.vod_reurl} 来源地址 {$obj.vod_rel_vod} 关联视频ids {$obj.vod_rel_art} 关联文章ids {$obj.vod_content} 详细介绍 {$obj.vod_pwd} 访问内容页密码 {$obj.vod_pwd_url} 获取密码链接 {$obj.vod_pwd_play} 访问播放页密码 {$obj.vod_pwd_play_url} 获取密码链接 {$obj.vod_pwd_down} 访问下载页密码 {$obj.vod_pwd_down_url} 获取密码链接 {$obj.vod_copyright} 是否开启版权提示 {$obj.vod_play_from} 播放组 {$obj.vod_play_server} 播放服务器组 {$obj.vod_play_note} 播放备注 {$obj.vod_play_url} 播放地址 {$obj.vod_down_from} 下载租 {$obj.vod_down_server} 下载服务器组 {$obj.vod_down_note} 下载备注 {$obj.vod_down_url} 下载地址 {$obj.vod_plot} 是否包含分集剧情 {$obj.vod_plot_name} 分集剧情名称 {$obj.vod_plot_detail} 分集剧情详情 {:mac_url_vod_detail($obj)} 视频详情页链接 {:mac_url_vod_play($obj,['sid'=>1,'nid'=>1])} 视频播放页链接 {:mac_url_vod_play($obj,'first')} 视频播放页第一条链接 {:mac_url_vod_down($obj,['sid'=>1,'nid'=>1])} 视频下载页链接 {:mac_url_vod_down($obj,'first')} 视频下载页第一条链接 =======多个截图获取调用例子======= {maccms:foreach name="obj.vod_pic_screenshot_list" id="vo"} <img src="{$vo.url}" alt="{$vo.name}" /> {/maccms:foreach} =======视频播放地址和下载地址标签======= {maccms:foreach name="obj.vod_play_list" id="vo"} <div class="ui-box marg" id="playlist_1"> <div class="down-title"> <h2>{$vo.from}-在线播放</h2><span>[{$vo.player_info.tip}]</span> </div> <div class="video_list fn-clear"> {maccms:foreach name="vo.urls" id="vo2"} <a href="{:mac_url_vod_play($obj,['sid'=>$vo.sid,'nid'=>$vo2.nid])}" >{$vo2.name}</a> {/maccms:foreach} </div> </div> {/maccms:foreach} {maccms:foreach name="obj.vod_down_list" id="vo"} <div class="ui-box marg" id="downlist_1"> <div class="down-title"> <h2>{$vo.from}-下载</h2><span>[{$vo.player_info.tip}]</span> </div> <div class="video_list fn-clear"> {maccms:foreach name="vo.urls" id="vo2"} <a href="{:mac_url_vod_down($obj,['sid'=>$vo.sid,'nid'=>$vo2.nid])}" >{$vo2.name}</a> {/maccms:foreach} </div> </div> {/maccms:foreach} 如何在播放页或下载页只显示当前分组的地址呢?外层循环标签不变,只需要加一个判断就可以了。 {maccms:foreach name="obj.vod_play_list" id="vo"} {if condition="$vo.sid eq $param.sid"} ---------------------重点是这句if判断 <div class="ui-box marg" id="playlist_1"> <div class="down-title"> <h2>{$vo.from}-在线播放</h2><span>[{$vo.player_info.tip}]</span> </div> <div class="video_list fn-clear"> {maccms:foreach name="vo.urls" id="vo2"} <a href="{:mac_url_vod_play($obj,['sid'=>$vo.sid,'nid'=>$vo2.nid])}" >{$vo2.name}</a> {/maccms:foreach} </div> </div> {/if} {/maccms:foreach} 上边循环过程中,其中获取播放器详细信息的方法是 {$vo.player_info.from} 编码 {$vo.player_info.show} 名称 {$vo.player_info.des} 备注 {$vo.player_info.tip} 提示 {$vo.player_info.sort} 排序 {$vo.player_info.parse} 解析接口 {$vo.player_info.target} 目标窗口 当前_self 和 新页_blank ,可以直接用在a标签的target属性上 {$vo.from} 播放器编码 {$vo.note} 备注 {$vo.url} url地址 {$vo.url_count} 集数 =======视频播放页独有标签======= {$param.sid} 当前播放组序号 {$param.nid} 当前集数序号 {$obj.player_info.link_next} 下一页地址,最后一页时此链接将当前页链接 {$obj.player_info.link_pre} 上一页地址,第一页时此链接将当前页链接 {$obj['vod_play_list'][$param['sid']]} 获取当前播放组数据 {$obj['vod_play_list'][$param['sid']]['player_info']} 播放器信息 {$obj['vod_play_list'][$param['sid']]['server_info']} 服务器组信息 {$obj['vod_play_list'][$param['sid']]['url_count']} 总集数 {$obj['vod_play_list'][$param['sid']]['urls']} 集数信息 {$obj['vod_play_list'][$param['sid']]['urls'][$param['nid']]} 当前集数信息 {$obj['vod_play_list'][$param['sid']]['urls'][$param['nid']]['name']} 当前集数名称 {$obj['vod_play_list'][$param['sid']]['urls'][$param['nid']]['url']} 当前集数url 下载页获取以上信息,请把vod_play_list改为vod_down_list,其他参数不变 {$player_data} 播放数据 {$player_js} 加载播放器 =======获取与当前视频相关联视频和关联文章数据====== <h2>与<strong>“{$obj.vod_name}”</strong>关联的视频</h2> <ul class="img-list dis"> {maccms:vod num="6" ids="'.$obj['vod_rel_vod'].'" order="desc" by="time"} <li><a href="{:mac_url_vod_detail($vo)}" title="{$vo.vod_name}"><img src="{:mac_url_img($vo.vod_pic)}" alt="{$vo.vod_name}"/><h2>{$vo.vod_name}</h2><p></p><i>{$vo.vod_version}</i><em></em></a></li> {/maccms:vod} </ul> <h2>与<strong>“{$obj.vod_name}”</strong>关联的文章</h2> <ul class="img-list dis"> {maccms:art num="6" ids="'.$obj['vod_rel_art'].'" order="desc" by="time"} <li><a href="{:mac_url_art_detail($vo)}" title="{$vo.art_name}"><img src="{:mac_url_img($vo.art_pic)}" alt="{$vo.art_name}"/><h2>{$vo.art_name}</h2><p></p><i>{$vo.vod_from}</i><em></em></a></li> {/maccms:art} </ul> 版权跳转?配合后台提供的跳转url字段,在内容页播放页通用。 <script> {if condition="$obj.vod_jumpurl neq ''"} location.href='{$obj.vod_jumpurl}'; {/if} </script> 如果想判断每集是否跳转,可把要跳转的集数地址写成固定的格式,方便读取和操作。 比如火影忍者有10集, 第2集版权跳转,地址写为jump://baidu.com 在播放页加入代码 只跳转这一集 <script> {if condition="strpos($obj['vod_play_list'][$param['sid']]['urls'][$param['nid']]['url'],'jump:')!==false "} location.href='{$obj['vod_play_list'][$param['sid']]['urls'][$param['nid']]['url']|str_replace="jump:","http:",###}'; {/if} </script> =======视频分集剧情页独有标签======= {$obj['vod_plot_list'][$param['page']]['name']} 分集剧情名称 {$obj['vod_plot_list'][$param['page']]['detail']} 分集剧情详情 mac_url_plot_detail($obj,['page'=>1]) 分集剧情详情页地址 mac_url_plot_index() 分集剧情首页,建议放一些热门剧包含剧情分类的数据 mac_url_vod_plot($obj) 某个视频的分集剧情列表 =======文章列表标签======= order排列顺序desc倒序,asc正序 by排序依据 id,time,time_add,score,hits,hits_day,hits_week,hits_month,up,down,level,rnd start从第几条开始 num获取条数 ids指定1,2,3一组ID; not不抱含id 多个逗号链接 type指定获取分类数据 all所有;1,2,3指定; class指定某扩展分类 支持多个 tag指定tag 支持多个 aaa,xxx level指定推荐值 支持多个 rel指定关联数据 1,2,3 或 变形金刚 timeadd添加时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour timehits点击时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour time更新时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour hitsmonth月点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 hitsweek周点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 hitsday日点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 hits总点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 paging是否分页yes pageurl分页地址 cachetime自定义缓存时间单位秒 {maccms:art num="10" paging="no" type="all" order="asc" by="sort"} 内部同下方,{$obj.改为{$vo.开头即可 {/maccms:art} =======文章内容页独有标签======= {$obj.art_id} 文章id {$obj.type_id} 分类id {$obj.type_id_1} 一级分类id {$obj.type} 分类对象,二级属性可参考分类属性 {$obj.type.type_name} 分类名 {$obj.type.type_en} 分类拼音 {$obj.type_1} 一级分类对象,二级属性可参考分类属性 {$obj.type_1.type_name} 一级分类名 {$obj.type_1.type_en} 一级分类拼音 {$obj.group_id} 用户组id {$obj.art_name} 标题 {$obj.art_sub} 副标题 {$obj.art_en} 别名 {$obj.art_status} 状态0未审1已审 {$obj.art_letter} 首字母 {$obj.art_color} 颜色 {$obj.art_from} 来源 {$obj.art_author} 作者 {$obj.art_tag} tags {$obj.art_class} 扩展分类 {$obj.art_pic} 主图 {$obj.art_pic_thumb} 缩略图 {$obj.art_pic_slide} 幻灯图 {$obj.art_pic_screenshot}截图多个图片用#连接 {$obj.art_pic_screenshot_list}截图列表 {$obj.art_blurb} 简介 {$obj.art_remarks} 备注 {$obj.art_jumpurl} 跳转url {$obj.art_tpl} 独立模板 {$obj.art_level} 推荐等级 {$obj.art_lock} 锁定 {$obj.art_up} 顶数 {$obj.art_down} 踩数 {$obj.art_hits} 总点击量 {$obj.art_hits_day} 日点击量 {$obj.art_hits_week} 周点击量 {$obj.art_hits_month} 月点击量 {$obj.art_time} 更新时间 {$obj.art_time_add} 添加时间 {$obj.art_time_hits} 点击时间 {$obj.art_time_make} 生成时间 {$obj.art_score} 平均分 {$obj.art_score_all} 总评分 {$obj.art_score_num} 评分次数 {$obj.art_rel_art} 关联文章 {$obj.art_rel_vod} 关联视频 {$obj.art_title} 页标题 {$obj.art_note} 页备注 {$obj.art_content} 页详细介绍 {$obj.art_points} 访问整个文章所需点数 {$obj.art_points_detail} 访问每一页所需点数 {$obj.art_pwd} 访问密码 {$obj.art_pwd_url} 密码获取链接 {:mac_url_art_detail($obj)} 文章详情页链接 =======获取与当前文章相关联视频和关联文章数据====== <h2>与<strong>“{$obj.art_name}”</strong>关联的视频</h2> <ul class="img-list dis"> {maccms:vod num="6" rel="'.$obj['art_rel_vod'].'" order="desc" by="time"} <li><a href="{:mac_url_vod_detail($vo)}" title="{$vo.vod_name}"><img src="{:mac_url_img($vo.vod_pic)}" alt="{$vo.vod_name}"/><h2>{$vo.vod_name}</h2><p></p><i>{$vo.vod_version}</i><em></em></a></li> {/maccms:vod} </ul> <h2>与<strong>“{$obj.art_name}”</strong>关联的文章</h2> <ul class="img-list dis"> {maccms:art num="6" rel="'.$obj['art_rel_art'].'" order="desc" by="time"} <li><a href="{:mac_url_art_detail($vo)}" title="{$vo.art_name}"><img src="{:mac_url_img($vo.art_pic)}" alt="{$vo.art_name}"/><h2>{$vo.art_name}</h2><p></p><i>{$vo.vod_from}</i><em></em></a></li> {/maccms:art} </ul> =======文章分页内容特有标签======= {$obj['art_page_list'][$param['page']]} 分页内容数组,包含标题备注,分页内容 {$obj['art_page_list'][$param['page']]['title']} 分页标题 {$obj['art_page_list'][$param['page']]['note']} 分页备注 {$obj['art_page_list'][$param['page']]['content']} 分页内容 =======分页内容标签======= 分页代码可用在分类页、筛选页、搜索页、文章内容页、留言本、评论、专题首页等页面,使用前提是页面有包含paging='yes'获取分页数据的标签。 其中包含隐藏参数pageurl="",视频默认是vod/type,文章分页默认是art/type,分页时必须加入此参数以免分页出错!!! 例如:{maccms:vod num="10" paging="yes" pageurl="vod/type" half="3"} {/maccms:vod} 视频分类页是pageurl="vod/type" 视频筛选页是pageurl="vod/show" 视频搜索页是pageurl="vod/search" 首页是pageurl="index/index" 文章分类页是pageurl="art/type" 文章筛选页是pageurl="art/show" 文章搜索页是pageurl="art/search" 其中half参数是设置显示分页数字页码的个数,不设置默认为5。 <div class="mac_pages"> <div class="page_tip">共{$__PAGING__.record_total}条数据,当前{$__PAGING__.page_current}/{$__PAGING__.page_total}页</div> <div class="page_info"> <a class="page_link" href="{$__PAGING__.page_url|mac_url_page=1}" title="首页">首页</a> <a class="page_link" href="{$__PAGING__.page_url|mac_url_page=$__PAGING__.page_prev}" title="上一页">上一页</a> {maccms:foreach name="$__PAGING__.page_num" id="num"} {if condition="$__PAGING__['page_current'] eq $num"} <a class="page_link page_current" href="javascript:;" title="第{$num}页">{$num}</a> {else} <a class="page_link" href="{$__PAGING__.page_url|mac_url_page=$num}" title="第{$num}页" >{$num}</a> {/if} {/maccms:foreach} <a class="page_link" href="{$__PAGING__.page_url|mac_url_page=$__PAGING__.page_next}" title="下一页">下一页</a> <a class="page_link" href="{$__PAGING__.page_url|mac_url_page=$__PAGING__.page_total}" title="尾页">尾页</a> <input class="page_input" type="text" placeholder="页码" id="page" autocomplete="off" style="width:40px"> <button class="page_btn mac_page_go" type="button" data-url="{$__PAGING__.page_url}" data-total="{$__PAGING__.page_total}" data-sp="{$__PAGING__.page_sp}" >GO</button> </div> </div> =======非静态模式下,可获取到的当前登录用户的信息;用户中心里各个界面也可用以下参数{$obj.开头}======= {$user.user_id} 用户编号 {$user.user_name} 登录名 {$user.user_nick_name} 昵称 {$user.user_email} 邮箱 {$user.user_qq} QQ {$user.user_phone} 联系电话 {$user.user_portrait} 头像 {$user.user_points} 积分 {$user.user_reg_time} 注册时间 {$user.user_reg_ip} 注册ip {$user.user_login_time} 登录时间 {$user.user_login_ip} 登录ip {$user.user_last_login_time} 上次登录时间 {$user.user_last_login_ip} 上次登录ip {$user.user_login_num} 登录次数 {$user.user_end_time} vip截止期限 {$user.group_id}用户组编号 =======友情链接列表标签======= order排列顺序desc倒序,asc正序 by排序依据 id,sort start从第几条开始 num获取条数 type指定获取类型数据 all所有;font文字链接,pic图片链接; cachetime自定义缓存时间单位秒 {maccms:link num="10" type="all" order="asc" by="sort"} {$vo.link_id}编号 {$vo.link_name}名称 {$vo.link_type}类型0文字1图片 {$vo.link_url}链接 {$vo.link_sort}排序 {$vo.link_logo}图标 {$vo.link_add_time} 添加时间 {$vo.link_time} 更新时间 {/maccms:link} =======留言本列表标签======= order排列顺序desc倒序,asc正序 by排序依据 id,time,reply_time start从第几条开始 num获取条数 rid关联数据id {maccms:gbook num="10" paging="yes" order="asc" by="sort"} {$vo.gbook_id}编号 {$vo.gbook_name}昵称 {$vo.gbook_status}状态0未审核1已审核 {$vo.gbook_ip}ip地址 {$vo.gbook_time} 时间 {$vo.gbook_content} 留言内容 {$vo.gbook_reply_time} 回复时间 {$vo.gbook_reply} 回复内容 {/maccms:gbook} 调用方式: <script> $(function(){ MAC.Gbook.Login = {$gbook.login}; MAC.Gbook.Verify = {$gbook.verify}; MAC.Gbook.Init(); }); </script> =======评论列表标签======= order排列顺序desc倒序,asc正序 by排序依据 id, time,up,down start从第几条开始 num获取条数 rid关联数据id {maccms:comment num="10" paging="yes" order="asc" by="sort"} {$vo.comment_id}编号 {$vo.comment_mid}模块id,1视频2文字3专题 {$vo.comment_name}昵称 {$vo.comment_status}状态0未审核1已审核 {$vo.comment_ip}ip地址 {$vo.comment_time} 时间 {$vo.comment_content} 留言内容 {$vo.comment_up} 顶数 {$vo.comment_down} 踩数 {$vo.comment_report} 举报 {/maccms:comment} 调用方式,例如视频内容页中: <div class="mac_comment" data-id="{$obj.vod_id}" data-mid="{$maccms.mid}" ></div> <script> $(function(){ MAC.Comment.Login = {$comment.login}; MAC.Comment.Verify = {$comment.verify}; MAC.Comment.Init(); MAC.Comment.Show(1); }); </script> =======演员列表标签======= order排列顺序desc倒序,asc正序 by排序依据 id, time,time_add,score,hits,hits_day,hits_week,hits_month,up,down,level,rnd,in start从第几条开始 num获取条数 ids指定id 多个逗号连接 not不抱含id 多个逗号链接 type指定获取分类数据 all所有;1,2,3指定 area指定地区 sex指定性别 男 女 letter指定首字母 level指定推荐值 支持多个 1,2 area指定地区 支持多个 大陆,香港 name指定演员支持多个 刘德华,周华健 blood指定血型支持多个 A型,B型 starsign指定星座支持多个 处女座,天蝎座,白羊座 timeadd添加时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour timehits点击时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour time更新时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour hitsmonth月点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 hitsweek周点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 hitsday日点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 hits总点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 paging是否分页yes pageurl分页地址 cachetime自定义缓存时间单位秒 {maccms:actor num="10" paging="no" area="大陆" order="asc" by="sort"} 内部同下方,{$obj.改为{$vo.开头即可 {/maccms:actor} =======演员内容页独有标签======= {$obj.actor_id} 演员id {$obj.type_id} 分类id {$obj.type_id_1} 一级分类id {$obj.actor_name} 姓名 {$obj.actor_en} 拼音 {$obj.actor_alias} 别名 {$obj.actor_status} 状态 {$obj.actor_lock} 锁定 {$obj.actor_letter} 首字母 {$obj.actor_sex} 性别 {$obj.actor_color} 高亮颜色 {$obj.actor_pic} 图片 {$obj.actor_blurb} 简介 {$obj.actor_remarks} 备注 {$obj.actor_tag} tags {$obj.actor_class} 扩展分类 {$obj.actor_area} 地区 {$obj.actor_height} 身高 {$obj.actor_weight} 体重 {$obj.actor_birthday} 生日 {$obj.actor_birtharea} 出生地 {$obj.actor_blood} 血型 {$obj.actor_starsign} 星座 {$obj.actor_school} 毕业院校 {$obj.actor_works} 主要作品多个逗号相连 {$obj.actor_level} 推荐值 {$obj.actor_up} 顶数 {$obj.actor_down} 踩数 {$obj.actor_score} 平均分 {$obj.actor_score_all} 总评分 {$obj.actor_score_num} 评分次数 {$obj.actor_time} 更新时间 {$obj.actor_time_add} 添加时间 {$obj.actor_time_hits} 点击时间 {$obj.actor_time_make} 生成时间 {$obj.actor_tpl} 自定义模板 {$obj.actor_jumpurl} 跳转url {$obj.actor_content} 详情 {$obj|mac_url_actor_detail} 获取演员详情页链接 =======角色列表标签======= order排列顺序desc倒序,asc正序 by排序依据 id, time,time_add,score,hits,hits_day,hits_week,hits_month,up,down,level,rnd start从第几条开始 num获取条数 ids指定id 多个逗号连接 not不抱含id 多个逗号链接 rid指定关联视频id actor指定演员名 支持多个 例如 刘德华,成龙 name指定角色名 支持多个 例如 花千骨,黑山老妖 letter指定首字母 level指定推荐值 支持多个 1,2 area指定地区 支持多个 大陆,香港 timeadd添加时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour timehits点击时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour time更新时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour hitsmonth月点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 hitsweek周点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 hitsday日点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 hits总点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 paging是否分页yes pageurl分页地址 cachetime自定义缓存时间单位秒 {maccms:role num="10" paging="no" rid="'.$obj['vod_id'].'" order="asc" by="sort"} 内部同下方,{$obj.改为{$vo.开头即可 {/maccms:role} =======角色内容页独有标签======= {$obj.role_id} 角色id {$obj.role_rid} 关联视频id {$obj.role_name} 角色名 {$obj.role_en} 拼音 {$obj.role_status} 状态 {$obj.role_lock} 锁定 {$obj.role_letter} 首字母 {$obj.role_color} 高亮颜色 {$obj.role_actor} 演员名称 {$obj.role_remarks} 备注 {$obj.role_pic} 图片 {$obj.role_sort} 排序 {$obj.role_level} 推荐值 {$obj.role_up} 顶数 {$obj.role_down} 踩数 {$obj.role_score} 平均分 {$obj.role_score_all} 总评分 {$obj.role_score_num} 评分次数 {$obj.role_time} 更新时间 {$obj.role_time_add} 添加时间 {$obj.role_time_hits} 点击时间 {$obj.role_time_make} 生成时间 {$obj.role_tpl} 自定义模板 {$obj.role_jumpurl} 跳转url {$obj.role_content} 详情 {$obj|mac_url_role_detail} 获取角色详情页链接 =======网址列表标签======= order排列顺序desc倒序,asc正序 by排序依据 id, time,time_add,score,hits,hits_day,hits_week,hits_month,up,down,level,rnd start从第几条开始 num获取条数 ids指定id 多个逗号连接 not不抱含id 多个逗号链接 type指定获取分类数据 all所有;1,2,3指定 letter指定首字母 level指定推荐值 支持多个 1,2 area指定地区 支持多个 大陆,香港 lang指定语言 支持多个 英语,西班牙语 timeadd添加时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour timehits点击时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour time更新时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour hitsmonth月点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 hitsweek周点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 hitsday日点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 hits总点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000 paging是否分页yes pageurl分页地址 cachetime自定义缓存时间单位秒 {maccms:website num="10" paging="no" order="asc" by="sort"} 内部同下方,{$obj.改为{$vo.开头即可 {/maccms:website} =======网址内容页独有标签======= {$obj.website_id} 网址id {$obj.type_id} 分类id {$obj.type_id_1} 一级分类id {$obj.website_name} 网址名 {$obj.website_sub} 副标 {$obj.website_en} 拼音 {$obj.website_jumpurl} 跳转url {$obj.website_status} 状态 {$obj.website_lock} 锁定 {$obj.website_letter} 首字母 {$obj.website_color} 高亮颜色 {$obj.website_remarks} 备注 {$obj.website_tag} tags {$obj.website_class} 扩展分类 {$obj.website_pic} 截图 {$obj.website_pic_screenshot}截图多个图片用#连接 {$obj.website_pic_screenshot_list}截图列表 {$obj.website_logo} logo {$obj.website_sort} 排序 {$obj.website_level} 推荐值 {$obj.website_up} 顶数 {$obj.website_down} 踩数 {$obj.website_score} 平均分 {$obj.website_score_all} 总评分 {$obj.website_score_num} 评分次数 {$obj.website_time} 更新时间 {$obj.website_time_add} 添加时间 {$obj.website_time_hits} 点击时间 {$obj.website_time_make} 生成时间 {$obj.website_referer} 总来路 {$obj.website_referer_day} 日来路 {$obj.website_referer_week} 周来路 {$obj.website_referer_month} 月来路 {$obj.website_tpl} 自定义模板 {$obj.website_content} 详情 {$obj|mac_url_website_detail} 获取网址详情页链接 =======常用处理函数======= 允许使用多个函数,都使用|分隔开 所有图片地址,不管是远程的本地的都建议使用 mac_url_img 来处理。 {:mac_data_count(0,'all','vod')} 获取视频总数量 {:mac_data_count(0,'today','vod')} 获取今日更新视频总数量 {:mac_data_count(0,'all','art')} 获取文章总数量 {:mac_data_count(0,'today','art')} 获取今日更新文章总数量 {:mac_data_count(1,'all')} 获取某个分类下的数据总量,支持视频和文章,传入分类ID {:mac_data_count(1,'today')} 获取某个分类下的今日更新数据总量,支持视频和文章,传入分类ID 另外还支持topic,website,actor,role模块的获取数据数量 {:mac_url('map/index')} 获取站内链接,参数代表 模块/页面 {$obj.vod_content|mac_url_content_img} 如果使用了第三方附件存储,附件和图片默认url是mac:开头的,此方法将替换为http {$vo.vod_pic|mac_url_img} 自动转换图片地址 {$vo.vod_content|mac_substring=100}返回截取字符串100个字 {$vo.vod_content|mac_filter_html}返回没有html代码的内容 {$vo.actor|mac_url_create='actor','vod','search',' '} 把,号相连的一串字符生成N个搜索链接,后2个参数可以不填写默认是生成vod模块搜索链接。 例子是创建演员搜索链接。支持演员、导演、tag、扩展分类等字段。最后一个参数是生成链接的分隔符。 {$vo.vod_time|mac_day} 自动返回日期 {$vo.vod_time|mac_friend_date} 友好时间提醒 几秒前,几分前,几小时前,几天前。。。 {$vo.vod_year|mac_default='未知'}如果字符串为空,则返回默认字符串 {$user.user_login_ip|mac_long2ip}返回格式化ip地址 {$user.user_id|mac_get_user_portrait}获取用户头像地址 =======常用JS处理函数=======一般用元素的class自动绑定处理事件======== 会员-收藏视频内容 <a href="javascript:;" class="mac_ulog" data-type="2" data-mid="{$maccms.mid}" data-id="{$obj.vod_id}">我要收藏</a> 会员-收藏文章内容页 <a href="javascript:;" class="mac_ulog" data-type="2" data-mid="{$maccms.mid}" data-id="{$obj.art_id}">我要收藏</a> 会员-收藏专题内容页 <a href="javascript:;" class="mac_ulog" data-type="2" data-mid="{$maccms.mid}" data-id="{$obj.topic_id}">我要收藏</a> 以下内容一般放到body结尾之前,不用于显示,只用户记录信息。 会员-文章浏览记录 <span style="display:none" class="mac_ulog_set" alt="设置文章内容页浏览记录" data-type="1" data-mid="{$maccms.mid}" data-id="{$obj.art_id}" data-sid="{$param.sid}" data-nid="{$param.nid}"></span> 会员-专题浏览记录 <span style="display:none" class="mac_ulog_set" alt="设置专题内容页浏览记录" data-type="1" data-mid="{$maccms.mid}" data-id="{$obj.topic_id}" data-sid="{$param.sid}" data-nid="{$param.nid}"></span> 会员-视频浏览记录 <span style="display:none" class="mac_ulog_set" alt="设置内容页浏览记录" data-type="1" data-mid="{$maccms.mid}" data-id="{$obj.vod_id}" data-sid="{$param.sid}" data-nid="{$param.nid}"></span> 会员-视频播放记录 <span style="display:none" class="mac_ulog_set" alt="设置视频播放记录" data-type="4" data-mid="{$maccms.mid}" data-id="{$obj.vod_id}" data-sid="{$param.sid}" data-nid="{$param.nid}"></span> 会员-视频下载记录 <span style="display:none" class="mac_ulog_set" alt="设置视频播放记录" data-type="5" data-mid="{$maccms.mid}" data-id="{$obj.vod_id}" data-sid="{$param.sid}" data-nid="{$param.nid}"></span> 视频、文章、专题 顶和踩 通用 <a class="digg_link" data-id="{$obj.vod_id}{$obj.art_id}{$obj.topic_id}" data-mid="{$maccms.mid}" data-type="up" href="javascript:;"> 顶<em class="digg_num">{$obj.vod_up}{$obj.art_up}{$obj.topic_up}</em> </a> <a class="digg_link" data-id="{$vod_id}{$art_id}{$topic_id}" data-mid="{$maccms.mid}" data-type="down" href="javascript:;"> 踩<em class="digg_num">{$obj.vod_down}{$obj.art_down}{$obj.topic_down}</em> </a> 视频、文章、专题点击量显示 通用 总点击量:<span class="mac_hits hits" data-mid="{$maccms.mid}" data-id="{$obj.vod_id}{$obj.art_id}{$obj.topic_id}"" data-type="hits"></span> 日点击量:<span class="mac_hits hits_day" data-mid="{$maccms.mid}" data-id="{$obj.vod_id}{$obj.art_id}{$obj.topic_id}"" data-type="hits_day"></span> 周点击量:<span class="mac_hits hits_week" data-mid="{$maccms.mid}" data-id="{$obj.vod_id}{$obj.art_id}{$obj.topic_id}"" data-type="hits_week"></span> 月点击量:<span class="mac_hits hits_month" data-mid="{$maccms.mid}" data-id="{$obj.vod_id}{$obj.art_id}{$obj.topic_id}"" data-type="hits_month"></span> 前台浏览历史记录调用 <a href="javascript:;" class="mac_history">历史记录</a> 在视频、文章、专题详情页面写入浏览历史记录 <span style="display:none" class="mac_history_set" alt="设置视频历史记录" data-name="[{$obj.type.type_name}]{$obj.vod_name}" data-pic="{$obj.vod_pic|mac_url_img}"></span> <span style="display:none" class="mac_history_set" alt="设置文章历史记录" data-name="[{$obj.type.type_name}]{$obj.art_name}" data-pic="{$obj.art_pic|mac_url_img}"></span> <span style="display:none" class="mac_history_set" alt="设置专题历史记录" data-name="{$obj.topic_name}" data-pic="{$obj.topic_pic|mac_url_img}"></span> 访问页面触发定时任务,建议放到首页底部; 由于入口文件名可变,默认是api.php,如需修改请自定义 data-file="xxx.php" <span style="display: none;" class="mac_timming" data-file="" ></span> 网址导航来路记录统计;建议放到首页底部。来路域名必须和网址导航里的跳转url里的一致。 <span style="display: none;" class="mac_referer" data-file="" ></span> 自动获取短网址连接 <input type="text" name="shorten" class="mac_shorten" /> 短网址自定义用法,js来获取 <script> MAC.Shorten.Get("http://www.baidu.com/",function(r){ alert(r.data.url_short); }); </script> 获取用户记录日志,比如1浏览、2收藏、3想看、4点播、5下载 MAC.Ulog.Get有4个参数type类型0代表全部,page页码,limit每页条数,call回调函数 <script> MAC.Ulog.Get(0,1,999,function(r){ if(r.code == 1){ $.each(r['list'],function(index,row){ console.log(row['data']['id'] + '--' + row['data']['name'] + '--' + row['data']['pic'] + '--' + row['data']['link'] + '--' + row['data']['type']['type_name'] + '--' + row['data']['type']['link'] + '--' ); }); }else{ console.log('获取失败'); } }); </script> =======预留ajax数据接口,方便瀑布流加载======= 参数 mid:模块1视频2文章3专题 limit:每页条数,支持10,20,30 page:页码,最多不超过20页,防止非法采集 tid:分类id 接口地址是index.php/ajax/data.html?mid=1&page=1&limit=10 =======常用标签技巧======== 1,在循环中获取每个分类的数据量 {maccms:type ids="1,2,3,4" order="asc" by="sort" id="vo1" key="key1"} 分成:{$vo1.type_name};总数量: {$vo1.type_id|mac_data_count=all};今日数量:{$vo1.type_id|mac_data_count=today}。 {/maccms:type} 2,嵌套循环外层分类内部视频或文章,重点在于外部和内部标签各自设置 id 和 key,系统默认都是vo不适合会导致数据冲掉。 {maccms:type ids="1,2,3,4" order="asc" by="sort" id="vo1" key="key1"} {maccms:vod num="10" type="'.$vo1['type_id'].'" order="desc" by="time" id="vo2" key="key2"} {$vo1.type_name}:{$vo2.vod_name}; {/maccms:vod} {/maccms:type} 3,嵌套循环一级和二级分类数据 {maccms:type ids="1,2,3,4,5" order="asc" by="sort" id="vo" key="key"} {maccms:type parent="'.$vo['type_id'].'" order="asc" by="sort" id="vo2" key="key2"} <li><a href=":mac_url_type($vo2)}">{$vo2.type_name}</a></li> {/maccms:type} {/maccms:type} 4,全站调用全局预留参数,如全局视频扩展分类、地区、语言等数据 {maccms:foreach name=":explode(',',$maccms.vod_extend_class)"} {$vo|mac_url_create='class','vod','search'}<br> {/maccms:foreach}
2026年06月20日
62 阅读
0 评论
0 点赞
2026-06-01
m3u8局域网视频缓存系统AI项目文档
HCData 视频缓存管理系统 - 项目开发文档一、项目概述1.1 项目名称HCData — 局域网视频缓存管理与点播系统1.2 项目定位HCData 是一个运行在 Windows 平台上的轻量级 Web 服务端系统,用于管理和缓存网络视频资源(主要是 m3u8/HLS 流)。系统通过 Web 管理后台提供可视化操作界面,支持视频下载、缓存管理、在线播放、磁盘管理等功能,并可通过局域网供多设备访问。1.3 核心场景将网络 m3u8 视频流下载并缓存为本地 MP4 文件通过局域网内任意设备浏览器访问并播放已缓存视频首次播放未缓存视频时,自动触发后台下载,下次访问可"秒播"管理下载任务队列,监控下载进度和系统状态1.4 项目特点零构建部署:无需 webpack/vite 等前端构建工具,所有 HTML/CSS/JS 内联在单文件中单文件后端:整个服务端逻辑集中在 server.js(1463 行),无路由拆分文件嵌入式数据库:SQLite 单文件数据库,无需安装 MySQL/Redis 等服务局域网优先:自动检测局域网 IP,视频文件通过局域网 URL 直接访问智能缓存:首次播放走网络流,后台自动缓存,二次播放秒播实时推送:基于 SSE 的下载进度实时推送,无需轮询二、技术架构2.1 技术栈层级技术说明后端运行时Node.jsJavaScript 运行时环境Web 框架Express 5.2.1HTTP 服务与 RESTful API数据库SQLite3 (better-sqlite3 12.10.0)本地嵌入式数据库下载引擎N_m3u8DL-RE (20251027)高性能 m3u8 下载工具视频处理FFmpeg视频合并/转码(N_m3u8DL-RE 依赖)前端播放器DPlayer + MuiPlayer + hls.js视频播放(HLS/MP4)实时通信SSE (Server-Sent Events)服务端向客户端实时推送下载进度构建方式无构建纯原生 HTML/CSS/JS,无前端打包工具2.2 系统架构图┌─────────────────────────────────────────────────────────┐ │ 浏览器(客户端) │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐ │ │ │ 当前任务 │ │ 已缓存 │ │ 日志 │ │ 设置 │ │ │ └──────────┘ └──────────┘ └──────────┘ └─────────┘ │ │ SSE 实时事件流 / RESTful API 调用 │ └──────────────────────┬──────────────────────────────────┘ │ HTTP ┌──────────────────────┴──────────────────────────────────┐ │ Express 服务端 (port 3000) │ │ ┌────────────────────────────────────────────────────┐ │ │ │ RESTful API 层 │ │ │ │ /api/tasks /api/cached /api/settings /api/logs │ │ │ │ /api/download-video /api/check-video /api/video │ │ │ │ /api/stats /api/disk-space /api/drives │ │ │ └────────────────────────────────────────────────────┘ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ SSE 推送模块 │ │ 下载队列引擎 │ │ 文件管理模块 │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ ┌────────────────────────────────────────────────────┐ │ │ │ SQLite3 数据库 (hcdata.db) │ │ │ │ config | download_tasks | video_downloads | logs │ │ │ └────────────────────────────────────────────────────┘ │ └──────────────────────┬──────────────────────────────────┘ │ 调用外部工具 ┌────────────┴────────────┐ │ N_m3u8DL-RE.exe │ │ FFmpeg (合并/转码) │ └─────────────────────────┘2.3 server.js 模块拆解server.js 是整个系统的核心文件(1463 行),内部按功能划分为以下逻辑模块:模块行号范围职责SSE 推送模块11-39管理 SSE 连接池,实现 broadcastSSE() 广播函数数据目录初始化41-45确保 data/ 目录存在数据库初始化47-103创建 4 张数据表(config/download_tasks/video_downloads/system_logs)日志工具106-117writeLog() 函数,自动保留最近 500 条数据库迁移119-125为旧版 video_downloads 表补充 play_count 字段静态资源 & 中间件127-128express.json() + express.static('public')系统信息 API130-202获取局域网 IP、磁盘空间、盘符列表配置管理 API204-334通用 Key-Value 配置读写(单个/批量/全部)日志管理 API336-375日志列表查询(分页)和清空下载任务 API377-455任务列表、添加、更新进度缓存管理 API457-552单个删除、一键清空已缓存视频视频播放核心554-635存储路径管理、文件名生成、缓存检查下载队列引擎637-699临时目录、队列管理、并发控制、processQueue()启动恢复701-734initDownloadQueue() 服务启动时恢复未完成任务下载执行引擎736-1192startDownload() 核心函数:spawn 进程、进度解析、文件转移、超时处理下载入口 API1194-1242POST /api/download-video 去重、入队状态查询 API1244-1318下载状态、已缓存列表(分页+文件大小)视频流服务1320-1430播放地址生成、Range 请求支持、CORS 头服务启动 & 优雅关闭1432-1463监听端口、初始化队列、SIGINT/SIGTERM/SIGBREAK 处理2.4 目录结构e:\071058s-260801\ ├── hcdata-web/ # 项目主目录 │ ├── server.js # 后端服务主文件(核心,1463行) │ ├── check-db.js # 数据库检查工具(辅助脚本) │ ├── package.json # Node.js 依赖配置 │ ├── data/ # 数据目录(运行时生成) │ │ └── hcdata.db # SQLite 数据库文件 │ ├── public/ # 前端静态资源 │ │ ├── index.html # 管理后台主页面(1346行) │ │ ├── player.html # 视频播放页面(256行) │ │ └── assets/ # 第三方前端库 │ │ ├── DPlayer.min.js # DPlayer 播放器 │ │ ├── DPlayer.min.css │ │ ├── mui-player.min.js # MuiPlayer 播放器 │ │ ├── mui-player.min.css │ │ ├── mui-player-desktop-plugin.min.js │ │ └── hls.min.js # HLS 流媒体解析库 │ └── node_modules/ # Node.js 依赖包 ├── tools/ # 外部工具目录 │ ├── N_m3u8DL-RE.exe # m3u8 下载器 │ ├── N_m3u8DL-RE参数说明.txt # 下载器参数文档 │ ├── ffmpeg.exe # 视频处理工具 │ ├── ffplay.exe # 视频播放工具 │ ├── ffprobe.exe # 视频探测工具 │ ├── avcodec-62.dll # FFmpeg 依赖库 │ ├── avdevice-62.dll │ ├── avfilter-11.dll │ ├── avformat-62.dll │ ├── avutil-60.dll │ ├── swresample-6.dll │ └── swscale-9.dll ├── datatmp/tmp/ # 下载临时文件目录(运行时使用) ├── 启动服务端.bat # Windows 一键启动脚本 └── 更新日志.md # 版本更新记录三、数据库设计3.1 数据库文件路径: hcdata-web/data/hcdata.db引擎: SQLite3(通过 better-sqlite3 同步 API 操作)3.2 数据表结构3.2.1 config — 通用配置表存储系统所有可配置项,采用 Key-Value 模式。字段类型说明idINTEGER (PK, AUTO)主键keyTEXT (UNIQUE, NOT NULL)配置键名valueTEXT (NOT NULL)配置值created_atDATETIME创建时间updated_atDATETIME更新时间已知配置项:key说明默认值storage_path视频文件存储根路径未设置(需用户在设置页选择盘符)max_concurrent最大并发下载任务数4thread_count单任务下载线程数4nm_user_agentN_m3u8DL-RE 请求 User-Agent空3.2.2 download_tasks — 下载任务表记录当前正在进行的下载任务(完成后删除)。字段类型说明idINTEGER (PK, AUTO)主键nameTEXT (NOT NULL)任务名称urlTEXT (NOT NULL)视频 URLstatusTEXT状态:waiting / downloading / merging / errorprogressINTEGER进度百分比 (0-100)speedTEXT下载速度显示文本sizeTEXT文件总大小downloadedTEXT已下载大小created_atDATETIME创建时间设计说明:此表仅保存"进行中"的任务,下载完成后记录会被删除,转移到 video_downloads 表。3.2.3 video_downloads — 视频下载记录表保存所有视频的下载记录(包括历史)。字段类型说明idINTEGER (PK, AUTO)主键urlTEXT (UNIQUE, NOT NULL)视频 URL(唯一约束,用于去重)nameTEXT视频名称local_pathTEXT本地文件绝对路径statusTEXT状态:pending / downloading / completed / errorprogressINTEGER进度百分比messageTEXT状态消息formatTEXT输出格式(默认 mp4)play_countINTEGER播放次数(用于统计)created_atDATETIME创建时间updated_atDATETIME更新时间3.2.4 system_logs — 系统日志表字段类型说明idINTEGER (PK, AUTO)主键levelTEXT日志级别:info / warn / errormessageTEXT (NOT NULL)日志内容created_atDATETIME创建时间自动清理:日志超过 500 条时自动删除最早的记录。四、API 接口文档4.1 系统信息类GET /api/local-ip获取服务器局域网 IP 地址。响应:{ "success": true, "ip": "192.168.1.100" }GET /api/disk-space获取存储盘符的磁盘空间信息。响应:{ "success": true, "drive": "D:", "freeSpace": "120.50 GB", "totalSize": "500.00 GB", "usedSpace": "379.50 GB", "usedPercent": "75.9" }GET /api/drives获取电脑所有可用盘符列表。响应:{ "success": true, "drives": ["C:", "D:", "E:"] }GET /api/stats获取仪表盘统计数据(已完成数、点播总次数、命中率)。响应:{ "success": true, "stats": { "completed": 42, "playCountTotal": 128, "hitRate": "304.8" } }4.2 配置管理类GET /api/config获取存储路径配置。GET /api/settings获取所有配置项。GET /api/settings/:key获取指定配置项。POST /api/settings/:key保存/更新指定配置项。请求体:{ "value": "4" }POST /api/settings批量保存配置项。请求体:{ "max_concurrent": "4", "thread_count": "8" }POST /api/save-drive设置存储盘符并创建 hcdata 文件夹。请求体:{ "drive": "D:" }4.3 下载任务类GET /api/tasks获取当前进行中的下载任务列表(状态为 waiting/downloading/merging)。POST /api/tasks添加下载任务。请求体:{ "name": "视频名称", "url": "https://example.com/video.m3u8", "size": "500MB" }PUT /api/tasks/:id更新下载任务进度。POST /api/download-video启动视频下载(核心接口)。自动去重,加入下载队列。请求体:{ "url": "https://example.com/video.m3u8", "name": "视频名称" }响应:{ "success": true, "message": "下载任务已添加到队列", "taskId": 5 }GET /api/download-status?url=xxx查询指定 URL 的下载状态。GET /api/check-video?url=xxx检查本地是否已有指定 URL 的视频缓存。响应(已缓存):{ "success": true, "exists": true, "format": "mp4", "path": "D:\\hcdata\\abc123\\143025.mp4", "relativePath": "abc123/143025.mp4" }4.4 缓存管理类GET /api/cached?page=1&limit=99获取已缓存视频列表(分页)。DELETE /api/cached/:id删除指定缓存记录及其本地文件。DELETE /api/cached一键清空所有已缓存视频。4.5 视频播放类GET /api/video?url=xxx获取视频播放地址(返回局域网可访问的 URL),同时增加播放计数。GET /hcdata/*filepath视频文件静态服务路由,支持 HTTP Range 请求(断点续播/拖拽进度条)。4.6 日志管理类GET /api/logs?page=1&limit=100获取系统日志(分页,按时间倒序)。DELETE /api/logs清空所有日志。4.7 SSE 实时推送GET /api/eventsSSE 事件流端点,推送以下事件:事件名触发时机数据connected客户端连接成功{"status":"ok"}task-update下载进度更新{taskId, status, progress, speed, ...}task-completed下载任务完成{taskId, url, localPath}五、核心业务流程5.1 视频下载流程用户提交URL │ ▼ 检查去重(download_tasks + video_downloads) │ 已存在 → 返回"已在队列"或"已下载" │ 不存在 ↓ ▼ 插入 download_tasks 表(status=waiting) │ ▼ 加入内存下载队列 downloadQueue │ ▼ processQueue() 检查并发数 │ 未达上限 → 立即开始 startDownload() │ 已达上限 → 等待队列 ▼ 调用 N_m3u8DL-RE.exe(spawn 子进程) │ 参数:URL、保存目录、线程数、UA 等 │ ▼ 实时解析 stdout/stderr 输出 │ 提取进度百分比、速度、TS块号 │ 更新 download_tasks 表 │ SSE 推送 task-update 事件 │ ▼ 进程退出(exit code 0 = 成功) │ ▼ 在临时目录递归查找视频文件 │ ▼ safeMoveFile() 转移到最终存储路径 │ 路径格式:{storagePath}/{URL的MD5}/{时分秒}.mp4 │ ▼ 更新 video_downloads 表(status=completed) 删除 download_tasks 记录 SSE 推送 task-completed 事件 │ ▼ 延迟 8 秒后清理临时目录5.2 视频播放流程用户点击"播放"按钮 │ ▼ 打开 player.html?url={encodedURL} │ ▼ 调用 /api/check-video 检查本地缓存 │ ├── 已缓存(MP4)──→ "秒播模式" │ │ │ ▼ │ 调用 /api/video 获取局域网播放URL │ │ │ ▼ │ 使用 MuiPlayer 播放本地 MP4 │ (播放次数 +1) │ └── 未缓存 ──→ "后台加速中..." │ ▼ 使用 DPlayer + hls.js 直接播放 m3u8 流 │ ▼ 同时调用 /api/download-video 提交后台下载 (下次访问即可秒播)5.3 下载队列管理 ┌─────────────────────┐ │ downloadQueue[] │ ← 新任务入队 └─────────┬───────────┘ │ shift() ▼ ┌─────────────────────────┐ │ activeDownloads 计数器 │ │ 上限 = max_concurrent │ └─────────┬───────────────┘ │ ┌──────────────┼──────────────┐ ▼ ▼ ▼ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ 任务 A │ │ 任务 B │ │ 任务 C │ ... 最多 N 个并发 │ 线程: T │ │ 线程: T │ │ 线程: T │ └─────────┘ └─────────┘ └─────────┘ │ │ │ ▼ ▼ ▼ 完成后 activeDownloads-- 调用 processQueue() 取下一个5.4 文件存储策略存储根路径(用户设置) D:\hcdata\ │ ├── {MD5_hash_1}\ # 每个URL对应一个哈希目录 │ ├── 143025.mp4 # 文件名 = 下载时间(时分秒) │ └── 151200.mp4 │ ├── {MD5_hash_2}\ │ └── 092530.mp4 │ └── ... 临时下载目录: datatmp\tmp\ ├── {MD5_hash}\ # N_m3u8DL-RE 下载时的临时目录 │ └── {MD5_hash}.mp4 # 下载完成后的临时文件 └── tmp\ # 分片临时目录 └── ... # 下载完成后延迟 8 秒清理关键设计:URL 通过 MD5 哈希生成唯一目录名,避免文件名冲突文件名为下载时间(HHmmss 格式),同一 URL 多次下载不会覆盖跨盘符文件移动使用 safeMoveFile() 兼容 EXDEV 错误(先复制后删除)临时文件延迟清理,避免影响其他正在进行的任务5.5 服务启动流程服务启动时按以下顺序初始化:1. 创建 Express 应用,设置端口 3000 2. 初始化 SSE 客户端集合 (sseClients = new Set()) 3. 创建 data/ 目录(如不存在) 4. 打开 SQLite 数据库 (hcdata.db) 5. 执行 CREATE TABLE IF NOT EXISTS 创建 4 张表 6. 执行数据库迁移(为旧表添加 play_count 字段) 7. 注册中间件(JSON 解析、静态资源服务) 8. 注册所有 API 路由 9. 调用 app.listen() 开始监听 10. 写入启动日志 11. 调用 initDownloadQueue() 恢复未完成任务initDownloadQueue() 恢复逻辑:查询 download_tasks 表中状态为 waiting 或 downloading 的所有记录将这些任务的状态重置为 waiting,进度归零依次加入内存队列 downloadQueue[]调用 processQueue() 开始处理设计意图:服务异常退出后重启,未完成的下载任务不会丢失,会自动重新排队。5.6 优雅关闭流程收到 SIGINT / SIGTERM / SIGBREAK 信号 │ ▼ gracefulShutdown(signal) │ ├── 打印关闭提示 ├── 关闭数据库连接 (db.close()) └── process.exit(0)信号处理:SIGINT:Ctrl+C 触发SIGTERM:系统终止信号SIGBREAK:Windows 平台特有,Ctrl+Break 触发注意:当前优雅关闭未等待进行中的下载任务完成,直接退出。进行中的 N_m3u8DL-RE 子进程会随父进程退出而终止。5.7 合并超时处理机制N_m3u8DL-RE 下载完成后需要合并 TS 分片,这一步可能卡住。程序实现了超时兑底:进度 >= 99% │ ▼ 记录 mergeStartTime,启动 30 秒间隔检查器 │ ▼ 每 30 秒检查:Date.now() - mergeStartTime > 5 分钟? │ ├── 未超时 → 继续等待 │ └── 已超时 → │ ▼ 递归查找临时目录中的视频文件 │ ├── 找到文件 → 强制转移到最终路径,标记完成 └── 未找到 → 标记为 error,终止进程超时处理中的文件查找策略:先查 tempSubDir(任务专属临时目录)再查 tempPath(整个临时下载目录)最后查 tempOutputPath(固定预期路径)支持的文件扩展名:.mp4, .mkv, .ts, .flv, .m4s六、核心函数详解6.1 startDownload(task) — 下载执行引擎这是系统最核心的函数,负责从启动下载到文件转移的完整流程。参数:{ url: string, // 视频 m3u8 URL name: string, // 视频名称 taskId: number // download_tasks 表中的 ID }执行步骤:步骤操作说明1计算路径生成 URL 的 MD5 哈希、最终存储路径、临时下载路径2更新任务状态download_tasks.status = 'downloading'3写入视频记录video_downloads 表插入/更新记录4构建命令行参数URL、保存目录、线程数、UA 等5spawn 子进程启动 N_m3u8DL-RE.exe6注册进程映射activeDownloadProcesses.set(taskId, {child, ...})7监听 stdout/stderr实时解析进度8监听 close 事件处理成功/失败9成功时转移文件safeMoveFile() 到最终路径10更新数据库video_downloads.status = 'completed'11清理临时文件延迟 8 秒后清理12推送 SSEtask-completed 事件13触发下一任务activeDownloads--; processQueue()路径计算逻辑:// 最终存储路径 const finalDir = path.join(storagePath, urlHash); // D:\hcdata\{md5}\ const timeStr = formatTime(new Date()); // 如 "143025" const finalPath = path.join(finalDir, timeStr + '.mp4'); // D:\hcdata\{md5}\143025.mp4 // 临时下载路径 const tempSubDir = path.join(tempPath, urlHash); // datatmp\tmp\{md5}\ const tempOutputPath = path.join(tempSubDir, urlHash + '.mp4');6.2 parseProgress(output) — 进度解析函数从 N_m3u8DL-RE 的原始输出中提取结构化进度信息。处理流程:原始输出(含 ANSI 转义码) │ ▼ 去除 ANSI 转义码:output.replace(/\x1B\[[0-9;]*[a-zA-Z]/g, '') 替换 \r 为 \n │ ▼ 正则提取进度百分比:/(\d+\.?\d*)%/ 正则提取 TS 块进度:/(\d+)\/(\d+)\s+\d+\.?\d*%/ 正则提取下载速度:/([\d.]+\s*[KMGT]?Bps)/ │ ▼ 根据进度判断状态: - progress >= 99 → status = 'merging', speed = '合并中...' - progress >= 95 → speed = '即将完成...' - 其他 → status = 'downloading' │ ▼ 更新 download_tasks 表 更新 video_downloads 表 SSE 广播 task-update 事件为什么同时监听 stdout 和 stderr:N_m3u8DL-RE 在某些情况下会将进度信息输出到 stderr 而非 stdout。为确保不丢失进度更新,两个流都调用 parseProgress() 解析。6.3 processQueue() — 队列调度器async function processQueue() { while (activeDownloads < getMaxConcurrent() && downloadQueue.length > 0) { const task = downloadQueue.shift(); // 从队头取出 activeDownloads++; startDownload(task) .catch(err => console.error('下载任务失败:', err)) .finally(() => { activeDownloads--; // 无论成功失败都释放槽位 processQueue(); // 递归检查队列 }); } }关键特性:使用 while 循环一次性填充所有可用槽位getMaxConcurrent() 每次从数据库读取,支持运行时动态调整finally 块确保异常时也能释放槽位并触发下一轮调度递归调用实现链式调度6.4 safeMoveFile(src, dest) — 跨盘符文件移动function safeMoveFile(src, dest) { try { fs.renameSync(src, dest); // 同盘符:直接重命名(零拷贝) return true; } catch (err) { if (err.code === 'EXDEV') { // 跨盘符:EXDEV 错误 fs.copyFileSync(src, dest); // 先复制 fs.unlinkSync(src); // 再删除源 return true; } throw err; // 其他错误向上抛出 } }为什么需要这个函数:临时下载目录在 datatmp\tmp\(通常在 C 盘),而最终存储路径可能在 D/E 等任意盘符。fs.renameSync() 在跨盘符时会抛出 EXDEV 错误,需要回退到复制+删除方案。6.5 getVideoFileName(url) — URL 哈希生成function getVideoFileName(url) { const hash = crypto.createHash('md5').update(url).digest('hex'); return hash; // 32 位十六进制字符串 }用途: 将任意长度的 URL 映射为固定长度的唯一目录名,避免 URL 中的特殊字符导致文件系统问题。七、SSE 实时推送机制7.1 服务端实现const sseClients = new Set(); // 存储所有 SSE 连接的 response 对象 // 客户端连接 app.get('/api/events', (req, res) => { res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'X-Accel-Buffering': 'no' // 禁止 Nginx 缓冲 }); res.write('event: connected\ndata: {"status":"ok"}\n\n'); sseClients.add(res); req.on('close', () => sseClients.delete(res)); }); // 广播函数 function broadcastSSE(event, data) { const message = `event: ${event}\ndata: ${JSON.stringify(data)}\n\n`; sseClients.forEach(client => { try { client.write(message); } catch (e) { sseClients.delete(client); } }); }设计要点:使用 Set 存储连接,自动去重写入失败时自动移除断开的连接X-Accel-Buffering: no 防止反向代理缓冲 SSE 数据每个 SSE 消息以 \n\n 结尾(SSE 协议规范)7.2 客户端实现const eventSource = new EventSource('/api/events'); eventSource.addEventListener('connected', () => { console.log('SSE 已连接'); loadTasks(); // 连接成功后立即刷新任务列表 }); eventSource.addEventListener('task-update', (e) => { loadTasks(); // 每次进度更新都刷新任务列表 if (data.status === 'merging' || data.progress >= 99) { loadStats(); // 合并阶段同时刷新统计 } }); eventSource.addEventListener('task-completed', (e) => { loadTasks(); loadStats(); loadCached(); // 刷新已缓存列表 loadDiskSpace(); // 刷新磁盘空间 }); eventSource.onerror = () => { eventSource.close(); setTimeout(() => location.reload(), 3000); // 3 秒后整页刷新重连 };7.3 SSE 事件触发点触发位置事件名触发时机parseProgress()task-update每次解析到进度更新startDownload() 成功task-completed文件转移完成,数据库更新后7.4 备用轮询机制为防止 SSE 失效,前端同时使用定时轮询作为备用:轮询目标间隔说明loadTasks()5 秒任务列表(主刷新渠道)loadDiskSpace()10 秒磁盘空间loadLogs()15 秒系统日志loadCached()60 秒已缓存列表八、安全机制8.1 路径遍历防护视频文件服务路由 /hcdata/*filepath 实现了路径安全检查:app.get('/hcdata/*filepath', (req, res) => { const filePath = decodeURIComponent(req.params.filepath.join('/')); const fullPath = path.join(storagePath, filePath); // 安全检查:确保解析后的文件路径在存储目录内 const resolvedPath = path.resolve(fullPath); const resolvedStorage = path.resolve(storagePath); if (!resolvedPath.startsWith(resolvedStorage)) { return res.status(403).json({ success: false, error: '拒绝访问' }); } // ... });防护原理: 攻击者可能构造 ../../etc/passwd 这样的路径来访问系统文件。通过 path.resolve() 将路径解析为绝对路径后,检查是否以存储根路径开头,防止目录遍历攻击。8.2 XSS 防护前端渲染用户输入(视频名称、URL)时使用 escapeHtml() 函数:function escapeHtml(text) { const div = document.createElement('div'); div.textContent = text; // 浏览器自动转义 HTML 实体 return div.innerHTML; }所有动态内容在插入 DOM 前都经过此函数处理,防止跨站脚本攻击。8.3 输入验证所有 API 接口都进行基础输入验证:必填字段检查:if (!url) return res.status(400).json(...)类型检查:if (!drive) ...、if (value === undefined || value === null) ...数值范围限制:并发数 1-10、线程数 1-32URL 参数解码:decodeURIComponent()九、前端页面详细说明9.1 管理后台 (index.html) — CSS 设计体系CSS 变量主题系统::root { --bg-base: #0d1117; /* 页面底色(最深) */ --bg-surface: #161b22; /* 卡片/面板背景 */ --bg-elevated: #1c2128; /* 悬浮/高亮背景 */ --border: #30363d; /* 边框颜色 */ --text-primary: #e6edf3; /* 主文本 */ --text-secondary: #8b949e;/* 次要文本 */ --accent: #58a6ff; /* 强调色(蓝) */ --success: #3fb950; /* 成功色(绿) */ --warning: #d29922; /* 警告色(黄) */ --error: #f85149; /* 错误色(红) */ }设计原则:三层背景深度:base → surface → elevated,营造层次感所有 border-radius: 0,方正风格无阴影效果,依赖边框分割颜色与 GitHub Dark 主题相近9.2 管理后台 — 布局结构┌────────────────────────────────────────────────────┐ │ body (flex) │ │ ┌──────────┐ ┌────────────────────────────┐ │ │ │ sidebar │ │ main-content │ │ │ │ (220px) │ │ (flex: 1) │ │ │ │ │ │ │ │ │ │ ┌─────┐ │ │ ┌─────────────────────┐ │ │ │ │ │ Logo │ │ │ │ page-title │ │ │ │ │ └─────┘ │ │ └─────────────────────┘ │ │ │ │ ┌─────┐ │ │ ┌─────────────────────┐ │ │ │ │ │统计区│ │ │ │ │ │ │ │ │ │ IP │ │ │ │ 当前任务/已缓存 │ │ │ │ │ │已完成│ │ │ │ /日志/设置 │ │ │ │ │ │存储路径│ │ │ │ │ │ │ │ │ │磁盘剩余│ │ │ │ │ │ │ │ │ │点播次数│ │ │ │ │ │ │ │ │ │命中率│ │ │ │ │ │ │ │ │ └─────┘ │ │ └─────────────────────┘ │ │ │ │ ┌─────┐ │ │ │ │ │ │ │导航菜单│ │ │ │ │ │ │当前任务│ │ │ │ │ │ │已缓存 │ │ │ │ │ │ │日志 │ │ │ │ │ │ │设置 │ │ │ │ │ │ └─────┘ │ │ │ │ │ └──────────┘ └────────────────────────────┘ │ └────────────────────────────────────────────────────┘四个功能页面:页面导航项功能说明当前任务📊 当前任务显示正在下载/等待/合并的任务列表,含进度条、速度、TS块进度已缓存💾 已缓存已下载完成的视频列表,支持播放、删除、分页浏览、一键清空日志📋 日志系统运行日志查看,支持分页、清空设置⚙️ 设置存储盘符选择、并发下载数设置、单任务线程数设置页面切换机制:4 个 .page div 同时存在,通过 .active 类控制显示/隐藏导航点击时移除所有 .active,只给目标页添加无动画过渡,瞬间切换9.3 管理后台 — 前端状态管理全局变量:let tasks = []; // 当前下载任务列表(内存缓存) let cachedCurrentPage = 1; // 已缓存列表当前页码 let logCurrentPage = 1; // 日志列表当前页码 const cachedPageSize = 24; // 已缓存每页条数 const logPageSize = 100; // 日志每页条数数据加载函数一览:函数调用时机请求 APIloadSettingsDrives()页面初始化GET /api/drivesloadConfig()页面初始化GET /api/configloadMaxConcurrent()页面初始化GET /api/settings/max_concurrentloadThreadCount()页面初始化GET /api/settings/thread_countloadDiskSpace()初始化 + 每 10 秒GET /api/disk-spaceloadTasks()初始化 + 每 5 秒 + SSEGET /api/tasksloadCached(page)初始化 + 每 60 秒 + SSEGET /api/cachedloadLogs(page)初始化 + 每 15 秒GET /api/logsloadLocalIP()页面初始化GET /api/local-iploadStats()初始化 + SSEGET /api/stats9.4 管理后台 — 各页面详细功能当前任务页表格列定义(CSS Grid):grid-template-columns: 2fr 100px 130px 100px;列宽度内容下载地址自适应视频名称 + URL(溢出截断)进度100px状态点 + 百分比速度/TS块130px实时速度 + TS块进度状态100px下载中/等待中/合并中状态点颜色:downloading → 绿色 (--success)waiting → 黄色 (--warning)merging → 蓝色 (--accent)已缓存页表格列定义:grid-template-columns: 2fr 1fr 100px 1fr 120px;列内容文件名视频名称(title 显示完整 URL)大小文件大小(MB)播放次数N 次下载时间MM-DD HH:mm 格式操作播放按钮 + 删除按钮分页控件:显示总记录数页码按钮(最多显示当前后各 2 页)超出范围用省略号表示上/下一页按钮日志页表格列定义:grid-template-columns: 120px 80px 1fr;列内容时间MM-DD HH:mm:ss级别INFO/WARN/ERROR(带颜色)内容日志消息(自动换行)级别颜色映射:const levelColors = { info: 'var(--accent)', // 蓝色 warn: 'var(--warning)', // 黄色 error: 'var(--error)' // 红色 };设置页三个设置卡片:卡片控件保存 API范围默认保存路径盘符下拉框 + 保存按钮POST /api/save-drive系统盘符列表同时下载任务数数字输入框 + 保存按钮POST /api/settings/max_concurrent1-10单任务下载线程数数字输入框 + 保存按钮POST /api/settings/thread_count1-329.5 播放页面 (player.html) — 详细流程初始化流程:页面加载 │ ▼ 从 URL 参数获取视频源地址 const m3u8Url = getQueryParam('url'); │ ├── 无 URL → 显示错误信息 "错误: 未提供视频地址" │ └── 有 URL → │ ▼ 调用 /api/check-video?url=xxx │ ├── 已缓存 (format=mp4) → │ │ │ ▼ │ updateSourceTag('cached') // 显示"秒播模式" │ │ │ ▼ │ 调用 /api/video?url=xxx 获取局域网播放 URL │ │ │ ▼ │ createMuiPlayer(videoUrl) // MuiPlayer 播放 │ └── 未缓存 / 请求失败 → │ ▼ updateSourceTag('network') // 显示"后台加速中..." │ ▼ createDPlayer(m3u8Url, true) // DPlayer+hls.js 播放网络流 │ ▼ submitDownloadTask(m3u8Url) // 后台提交下载播放器创建对比:特性DPlayerMuiPlayer使用场景网络 m3u8 流本地 MP4 文件HLS 支持通过 hls.js customType原生支持自动播放autoplay: trueautoplay: true桌面插件无MuiPlayerDesktopPlugin控件默认控件可自定义 headControls/footerControls9.6 视频流服务 — Range 请求支持GET /hcdata/*filepath 路由支持 HTTP Range 请求,实现视频拖拽进度条和断点续播:客户端请求: GET /hcdata/abc123/143025.mp4 Range: bytes=1048576-2097151 服务端响应: HTTP/1.1 206 Partial Content Content-Range: bytes 1048576-2097151/5242880 Accept-Ranges: bytes Content-Length: 1048576 Content-Type: video/mp4CORS 头设置:res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Methods', 'GET, OPTIONS'); res.header('Access-Control-Allow-Headers', 'Range, Content-Type'); res.header('Access-Control-Expose-Headers', 'Content-Length, Content-Range, Accept-Ranges');十、API 接口详细参考10.1 统一响应格式成功响应:{ "success": true, "data_field": "...", "message": "操作成功" }失败响应:{ "success": false, "error": "错误描述信息" }HTTP 状态码使用:状态码场景200成功400参数缺失/无效403路径遍历拒绝404资源不存在500服务器内部错误10.2 下载相关 API 详细逻辑POST /api/download-video — 完整去重逻辑收到请求 { url, name } │ ▼ 检查 download_tasks 表是否有相同 URL │ ├── status=completed → 返回 { exists: true, message: '该视频已下载完成' } ├── status=downloading/waiting → 返回 { exists: true, message: '该视频已在下载队列中' } │ └── 不存在 ↓ │ ▼ 检查 video_downloads 表 │ ├── status=completed → 返回 { exists: true, message: '该视频已下载完成' } │ └── 不存在/其他状态 ↓ │ ▼ 插入 download_tasks(status=waiting) 加入 downloadQueue[] 调用 processQueue() 返回 { success: true, taskId }GET /api/check-video?url=xxx — 三级缓存检查检查顺序: 1. 数据库记录 → video_downloads 表中 url 对应记录的 local_path 是否存在 2. 哈希目录 → {storagePath}/{md5}/ 目录下是否有 .mp4 文件 3. 兼容旧路径 → {storagePath}/{md5}.mp4 或 {md5}.m3u8 是否存在GET /api/cached — 响应结构{ "success": true, "videos": [ { "id": 1, "url": "https://example.com/video.m3u8", "name": "视频名称", "local_path": "D:\\hcdata\\abc123\\143025.mp4", "status": "completed", "progress": 100, "message": "下载完成", "format": "mp4", "play_count": 5, "created_at": "2026-07-31 14:30:25", "updated_at": "2026-07-31 14:35:10", "file_size": "256.78 MB" } ], "pagination": { "page": 1, "limit": 99, "total": 42, "totalPages": 1 } }file_size 字段是服务端实时读取文件系统获取的,非数据库存储。10.3 缓存管理 API 详细逻辑DELETE /api/cached/:id — 删除流程1. 查询 video_downloads 获取记录 2. 删除本地文件 (fs.unlinkSync) 3. 尝试删除空目录 (fs.rmSync) 4. 删除 video_downloads 记录 5. 删除关联的 download_tasks 记录(按 URL 匹配) 6. 写入日志DELETE /api/cached — 一键清空流程1. 查询所有 status='completed' 的记录 2. 逐个删除本地文件和空目录 3. 删除所有 completed 的 video_downloads 记录 4. 删除所有 completed 的 download_tasks 记录 5. 返回删除统计 { deletedCount, errorCount }十一、临时文件清理策略11.1 临时文件产生来源N_m3u8DL-RE 下载过程中会产生以下临时文件:文件类型位置说明下载输出文件datatmp\tmp\{md5}\{md5}.mp4下载完成后的合并文件TS 分片datatmp\tmp\tmp\ 下以 md5 前 8 位命名的子目录下载的原始分片元数据 JSONdatatmp\tmp\{md5}\{md5}.json解析信息(如果开启了 write-meta-json)11.2 清理时机程序采用“延迟清理”策略,避免影响其他并发任务:任务完成 │ ▼ 立即转移视频文件到最终存储路径 │ ▼ 启动 8 秒延迟定时器 │ ▼ 8 秒后执行清理: ├── 清理任务专属临时目录 (tempSubDir) ├── 清理 tmp 目录中匹配 urlHash 前 8 位的子目录 └── 清理 tmp 目录根下匹配 urlHash 前 8 位的文件11.3 清理函数详解function cleanupTempDir(dir) { if (!fs.existsSync(dir)) return; const items = fs.readdirSync(dir); for (const item of items) { const itemPath = path.join(dir, item); const stat = fs.statSync(itemPath); if (stat.isDirectory()) { cleanupTempDir(itemPath); // 递归清理子目录 fs.rmdirSync(itemPath); } else { fs.unlinkSync(itemPath); // 删除文件 } } }匹配规则: 通过 tmpItem.includes(urlHash.substring(0, 8)) 匹配当前任务的分片目录,避免误删其他任务的临时文件。11.4 异常残留处理如果服务异常退出(如断电、强制关闭),临时文件可能残留。当前处理方式:无自动清理机制:残留文件需手动删除不影响功能:新下载任务会创建新的临时目录,不会读取旧残留十二、系统数据流总览12.1 完整数据流图用户浏览器 │ │ ① 访问管理后台 ▼ Express 静态服务 (public/index.html) │ │ ② 请求下载任务列表 ▼ GET /api/tasks → SQLite download_tasks 表 → JSON 响应 │ │ ③ SSE 连接 ▼ GET /api/events → 保持连接 → 实时推送进度 │ │ ④ 提交下载任务(通过播放器页面或 API) ▼ POST /api/download-video │ ├── 去重检查 (download_tasks + video_downloads) ├── 插入 download_tasks 表 ├── 加入 downloadQueue[] └── processQueue() → startDownload() │ │ ⑤ 调用外部工具 ▼ spawn N_m3u8DL-RE.exe │ │ ⑥ 实时解析进度 ▼ stdout/stderr → parseProgress() │ ├── 更新 download_tasks 表 ├── 更新 video_downloads 表 └── SSE 广播 task-update │ │ ⑦ 下载完成 ▼ safeMoveFile() 转移文件 │ ├── 更新 video_downloads (status=completed) ├── 删除 download_tasks 记录 ├── SSE 广播 task-completed └── 8 秒后清理临时文件 │ │ ⑧ 用户点击播放 ▼ GET /api/check-video → 检查缓存 │ ├── 已缓存 → GET /api/video → 返回局域网 URL │ │ │ ▼ │ GET /hcdata/*filepath → Range 请求支持 → 视频流 │ └── 未缓存 → 返回 m3u8 原始 URL + 后台下载12.2 数据库表关系config ──────────────────┐ (key-value) │ storage_path ────────┐ │ max_concurrent │ │ thread_count │ │ nm_user_agent │ │ │ │ download_tasks ──────┐ │ │ (进行中的任务) │ │ │ id, url, name │ │ │ status, progress │ │ │ 完成后删除 ───────┤ │ │ │ │ video_downloads ────┤ │ │ (全部历史记录) │ │ │ url (UNIQUE) ─────┘ │ │ local_path ──────────┘ │ status, play_count │ 完成后保留 ───────────┘ system_logs (运行日志) 自动保留 500 条十三、外部工具集成13.1 N_m3u8DL-RE版本: 20251027 (Beta)调用方式: 通过 Node.js child_process.spawn() 启动子进程核心参数:参数值说明<input>视频 URLm3u8 地址--save-dirdatatmp\tmp输出目录--save-nameURL 的 MD5 哈希保存文件名--tmp-dirdatatmp\tmp\tmp临时分片目录--thread-count配置值(默认 4)下载线程数--del-after-donefalse不自动删除临时文件(由程序管理清理)--headerUser-Agent: xxx可选,自定义请求头进度解析:同时监听 stdout 和 stderr先去除 ANSI 转义码正则提取进度百分比 (\d+\.?\d*%)正则提取 TS 块进度 (\d+/\d+)正则提取下载速度 ([KMGT]?Bps)13.2 FFmpegN_m3u8DL-RE 内部依赖 FFmpeg 进行视频合并。项目 tools 目录包含完整的 FFmpeg 可执行文件及依赖 DLL。十四、启动与部署14.1 环境要求操作系统: Windows(使用了 wmic、Windows 信号等)运行时: Node.js(需支持 ES5+ 语法)浏览器: 任意现代浏览器(Chrome/Edge/Firefox/Safari)14.2 安装步骤cd hcdata-web npm install14.3 启动方式方式一:批处理启动双击 启动服务端.bat该脚本会:设置 UTF-8 编码切换到 hcdata-web 目录自动打开浏览器访问 http://localhost:3000启动 Node.js 服务方式二:命令行启动cd hcdata-web node server.js14.4 访问地址本机:http://localhost:3000局域网:http://{服务器IP}:300014.5 首次使用配置进入"设置"页面选择视频文件存储盘符点击"保存"(会自动创建 {盘符}:\hcdata 目录)可选:调整并发下载数和线程数十五、关键设计决策15.1 为什么用 SQLite 而非文件存储配置支持并发读写(better-sqlite3 同步 API 无竞态问题)事务支持(批量保存配置)结构化查询(分页、条件过滤)单文件部署,无需额外数据库服务15.2 为什么用 SSE 而非 WebSocket单向推送即可满足需求(服务端 → 客户端)基于 HTTP,无需额外协议支持浏览器原生 EventSource API,代码更简洁断线自动重连15.3 为什么双播放器方案DPlayer + hls.js:对 m3u8 流兼容性最好MuiPlayer:MP4 本地文件播放体验更好(支持更多控件)根据缓存状态自动切换,用户无感知15.4 文件命名策略URL → MD5 哈希作为目录名:保证唯一性,避免特殊字符时间戳作为文件名:同一 URL 可多次下载不覆盖延迟清理临时文件:避免并发任务间的文件冲突15.5 下载队列设计内存队列 + 数据库双写:保证重启后可恢复服务启动时扫描未完成的任务,重新加入队列支持配置并发数(1-10)和单任务线程数(1-32)十六、辅助工具16.1 check-db.js数据库检查脚本,用于调试查看数据库状态:node check-db.js输出所有表名和 download_tasks 表的全部记录。16.2 启动服务端.batWindows 一键启动脚本,自动打开浏览器。十七、已知限制与注意事项17.1 平台限制仅支持 Windows:使用了 wmic 获取磁盘信息、Windows 信号处理(SIGBREAK)无跨平台支持:wmic logicaldisk 是 Windows 特有命令17.2 安全限制无用户认证:局域网内任何人可访问管理后台,无登录/权限机制无 HTTPS:仅支持 HTTP 协议,数据传输未加密CORS 全开:Access-Control-Allow-Origin: *,任何来源可调用 API17.3 性能限制数据库单文件:高并发场景下可能有锁竞争(当前场景可忽略)同步数据库 API:better-sqlite3 同步操作会阻塞 Node.js 事件循环(但 SQLite 操作通常很快)无连接数限制:SSE 连接数无上限,大量客户端可能导致内存问题17.4 可靠性限制临时文件清理:依赖延迟定时器(8 秒),异常退出可能残留临时文件合并超时:N_m3u8DL-RE 合并阶段可能卡住,程序设了 5 分钟超时兑底磁盘空间:大量下载可能导致磁盘满,侧边栏有实时显示但无预警机制优雅关闭不完善:关闭服务时不等待进行中的下载任务完成,子进程直接终止17.5 功能限制无搜索功能:已缓存列表不支持搜索/过滤无批量导入:只能逐个提交下载任务,不支持批量导入 URL 列表无下载重试:下载失败后不会自动重试,需手动重新提交无速度限制:单任务下载无限速配置(N_m3u8DL-RE 支持但程序未使用)十八、依赖清单Node.js 依赖 (package.json)包名版本用途express^5.2.1Web 服务框架better-sqlite3^12.10.0SQLite 数据库驱动node-gyp^12.3.0better-sqlite3 编译依赖外部工具工具版本用途N_m3u8DL-RE20251027m3u8/HLS/DASH 视频下载FFmpeg最新视频合并/转码(被 N_m3u8DL-RE 调用)前端库库名用途DPlayer视频播放器(网络流播放)MuiPlayer视频播放器(本地文件播放)MuiPlayerDesktopPluginMuiPlayer 桌面端插件hls.jsHLS 流媒体解析十九、开发约定19.1 代码风格后端:CommonJS 模块 (require/module.exports)前端:原生 JavaScript,无框架,内联 <script> 标签CSS:内联 <style> 标签,CSS 变量管理主题色无代码构建步骤19.2 API 响应格式所有 API 统一返回 JSON:{ "success": true/false, "data...": "...", "error": "错误信息" }19.3 错误处理API 层统一 try-catch,返回 500 状态码下载任务错误记录到数据库和日志前端 fetch 调用统一 catch 处理文档编写日期:2026年8月1日基于项目源码版本:hcdata-web v1.0.0
2026年06月01日
90 阅读
0 评论
0 点赞
2026-05-09
主板信息修改器 v2026.0501来自队长开发
如果您的电脑,因为开挂等操作,导致游戏封禁主板,可以通过这款工具一键永久修改您的主板信息。软件特色1、兼容 American Megatrends Inc 底层所有主板。2、兼容 Win7/8/10/11/Windows Server 全部操作系统。3、支持完整的主板信息备份恢复功能。4、支持主板全部信息的自定义修改。(详情查看进阶技巧2)更新说明2026年5月1日添加非AMI主板的检测(本软件不支持非AMI主板)添加路径检测,防止备份/恢复失败(信息备份和恢复路径中不能包含空格)添加重启提示(部分主板修改信息后需要重启电脑才可以生效)进阶技巧1、如何备份恢复主板信息?2、如何修改软件内没有包含的信息?第一步:使用软件备份信息。第二步:用记事本打开备份后的文件,并修改你要修改的内容。(修改后记得保存)第三步:使用软件恢复信息功能,选择你修改后的DMS文件。附送DMS各字段中文说明,方便大家DIY主板信息:BIOS # BIOS 信息├─ Name # BIOS 厂商名称与供应商信息├─ Version # BIOS 固件版本号(对应软件内的BIOS版本)└─ Date # BIOS 发布日期(格式:MM/DD/YYYY)(对应软件内的BIOS日期)System # 系统整体信息├─ Manufacturer # 系统整机制造商名称(对应软件内的系统品牌)├─ Product # 系统产品型号标识(对应软件内的系统型号)├─ Version # 系统版本号(通常为厂商定义)├─ SerialNum # 系统出厂唯一序列号├─ UUID # 系统全局唯一标识符(对应软件的UUID)├─ SKUNum # 系统库存单位编号(SKU)└─ Family # 系统所属产品家族系列BaseBoard # 主板信息├─ Manufacturer # 主板硬件制造商名称(对应软件内的主板品牌)├─ Product # 主板产品型号(对应软件内的主板型号)├─ Version # 主板硬件版本号├─ SerialNum # 主板序列号(对应软件内的序列号)├─ AssetTag # 主板资产标签(企业资产管理用)└─ LocInChassis # 主板在机箱内的物理位置描述BaseBoardWithHandle # 带句柄的主板信息├─ Handle # SMBIOS 结构句柄(十六进制)├─ Manufacturer # 主板制造商名称(对应软件内的主板品牌)├─ Product # 主板产品型号(对应软件内的主板型号)├─ Version # 主板版本号├─ SerialNum # 主板序列号(对应软件内的序列号)├─ AssetTag # 主板资产标签└─ LocInChassis # 主板在机箱内的位置Chassis # 机箱信息├─ Manufacturer # 机箱制造商名称├─ ChassisType # 机箱类型代码(03 代表台式机)├─ Version # 机箱版本号├─ SerialNum # 机箱序列号├─ TagNum # 机箱资产标签号├─ ChassisOEM # OEM 厂商保留字段(通常为 0)├─ ChassisHeight # 机箱高度(单位 U,00 表示未知)├─ PowerCords # 机箱所配电源线数量└─ ChassisSKU # 机箱 SKU 编号ChassisWithHandle # 带句柄的机箱信息├─ Handle # SMBIOS 结构句柄├─ Manufacturer # 机箱制造商名称├─ ChassisType # 机箱类型代码├─ Version # 机箱版本号├─ SerialNum # 机箱序列号├─ TagNum # 机箱资产标签号├─ ChassisOEM # OEM 保留字段├─ ChassisHeight # 机箱高度(U)├─ PowerCords # 电源线数量└─ ChassisSKU # 机箱 SKU 编号Processor # CPU信息├─ SerialNum # CPU序列号(现代 CPU 通常为 Unknown)├─ AssetTag # CPU资产标签(厂商预留)└─ PartNum # CPU部件号(通常不可用)ProcessorWithHandle # 带句柄的CPU信息├─ Handle # SMBIOS 结构句柄├─ SerialNum # CPU序列号├─ AssetTag # CPU资产标签└─ PartNum # CPU部件号OemString # OEM字符串└─ String # OEM厂商自定义字符串(默认均为 Default string)Configuration # 配置信息└─ String # 系统配置字符串(预留字段,通常为 Default string)注意事项:下载地址:文件名称: 主板信息修改器 v2026.0501.exe文件大小: 0.99 MB (1,044,480 字节)修改时间: 2026年05月01日,20:40:18MD5: F49526547F45DC3E27F23B4B9B7C0C9FSHA1: 51A89F83DC196B05B175E1A99632F54954583061https://url67.ctfile.com/d/8911067-163421932-cde7f3?p=3328
2026年05月09日
177 阅读
0 评论
0 点赞
2026-05-08
海康威视轻量化客户端v4.4
自写一款面向 海康威视 设备的轻量级客户端,专门针对官方软件臃肿、卡顿、占资源高的问题进行优化,仅保留最核心的实时预览与录像回放功能,界面极简清爽,打开即用,无需复杂配置,新手也能快速上手。性能表现:程序体积小、运行流畅,在老电脑、核显设备或远程桌面环境下依然稳定运行,对系统资源占用极低,相比官方客户端明显更顺滑。功能定位:仅专注“看监控”这一件事:实时视频预览历史录像回放去掉所有复杂功能,避免干扰操作体验。使用体验:无广告、无更新弹窗、无后台进程干扰,界面干净直观,适合长期挂机使用,不影响系统性能。适用场景适用于家庭监控查看、工厂值守、设备调试等场景,是一款实用且高效的替代工具,特别适合对“流畅和简单”有要求的用户。在想要回放的视频窗口右键就是回放、在想要回放的视频窗口右键就是回放、在想要回放的视频窗口右键就是回放网盘分享:{cloud title="v4.4去标题版本" type="ct" url="https://url67.ctfile.com/d/8911067-163383214-3aea9f?p=3328" password=""/}
2026年05月08日
182 阅读
0 评论
0 点赞
2026-04-28
网吧小活动文字版3.0
1.30天未到店顾客发送会员召回送充赠或免费上网时长券2.抖音、快手发网吧视频送网费3.调研用户喜好送网费或小吃4.撸猫专区5.周围1公里小区贴宣传单进专属微信群,多送网费体验券6.带宠物到店免费提供宠物笼+水+粮+零食7.每日抽奖,到店抽奖100%中奖,最小一小时 最大通宵免费+餐饮套餐8.每日盲盒,提前装好盲盒礼品,抽中盲盒吧台送盲盒过来顾客打开9.顾客向网吧提供优化建议送礼品,直送5小时上网时长+免费饮品10.首次进店配合调研,给顾客贴标签,奖励10元网费,后续针对顾客提供良好服务(大吧掌功能)11.通宵结束送早餐12.黄金档专属会员日13.故障补偿,断网、系统故障、黑屏、蓝屏、死机等送2小时上网体验券14.包天上网送餐食饮品礼包15.通宵套餐,泡面+火腿+功能饮料+槟榔等,比单买便宜10元或更多16.白银档专属鼠标垫 17.积分兑换各种商品(大吧掌功能)18.预约叫醒服务19.失物招领,免费快递到家20.返乡青年,凭机票火车票到店送3小时免费上网券21.钻石档冰可乐免费续杯22.里程碑,上网100小时\300小时\ 500小时\1000小时\1500小时等有不同的福利发放23.自制饮品、自制小吃、自制餐食编辑满赠活动(大吧掌功能)24.会员生日周,一周内每天可领1小时免费上网券25.30天不缺勤挑战,达成后送福利26.回忆录,顾客分享自己与网吧的故事,一经采纳送100元网费,故事张贴在墙面27.早起打卡活动,8点前到店送早餐28.游戏代练服务,可与某团队签署专属价格29.上网5小时免费提醒并送活力套餐30.热点活动,世界杯 奥运会 电竞比赛等专属福利发放
2026年04月28日
173 阅读
0 评论
0 点赞
2026-04-28
网吧小活动文字版2.0
1.新客首次进店,29.9元一天2.Cosplay主题日,每月举办一次,cosplay游戏角色到店,全天免费上网并送餐饮套餐3.老带新送3小时免费时长4.夜间12点以后到店送免费泡面套餐5.出租车\外卖员,休息区 免费充电+热水6.生日当天送小蛋糕和礼品(价值在50元内)主力推送充赠券周 会员充100送2张1小时(送的转天可用,有效期3天)7.节日礼包,黄金档会员可领8.凌晨2点后通宵半价9.淡季工作日上午和通宵半价10.特定日期的某个时间段把链接发到微信群里抢折扣券(大吧掌功能)11.通宵免费热饮或食品12.里程碑,上网满2000小时终身9折13.每日限时抢购1元秒杀1小时(指定区域或指定时间使用)14.自制饮品第二杯半价(大吧掌功能)15.自制饮品、自制小吃、自制餐食编辑满减活动(大吧掌功能)16.黄金档会员免费租赁无线充电器(大吧掌功能)17.黄金档会员免费使用洗衣间、洗澡间等18.黄金档会员专属外设、专属杯子(大吧掌功能)19.黄金档会员外设免费深度清洁(大吧掌功能)20.打车报销(10元网费)21.朋友圈积攒(30赞起步按赞的数量加网费)22.黄金档会员免费订座时长延长23.游戏活动24.免费打印、复印(20张以内)25.跨年度 跨季度 跨月,免费礼品、赠送、秒杀券等26.军火库外设体验日免费使用27.军火库外设爆款限定人群使用28.签到3天送1小时29.充值满*打折几天30.砸金蛋
2026年04月28日
161 阅读
0 评论
0 点赞
2026-04-28
网吧小活动文字版1.0
1.全城寻人,今天生日的人来我网吧上网免费2.带女同学来上网,我请你喝奶茶3.学生党福利,凭学生证 某时段半价4.组队开黑,五人成行 一人免单5.高考结束了,来我这免费领上网券6.附近上班族,午休新去处,一小时套餐(含午餐和饮品)7.情侣上网,送两杯饮料8.转发视频,到店免费两小时9.店里新到一批**外设,免费体验一周10.假期来了,学生包月套餐上线11.开学季活动,新生来上网 送网费12.新人一元三小时13.凭学生证,在某个时段减多少钱,或给什么(饮品或小吃之类的)14.情侣进店,女生免费(吧台亲一下并留影)情人节七夕等15.周边店铺员工(小区业主或公寓租客等)八折上网(单出会员等级限制时间段)推荐卖权益卡16.雨天半价(恶劣天气打折或补券)17.下雪送冷饮(高温送冰镇酸梅汤)18.产业联动有哪些优惠,例如女仆店、桌游店、密室逃脱、棋牌、台球、KTV、小酒馆(小酒吧)、驾校19.充100送100,,充300送300送饮料一箱,,充1000送1000送饮品若干送外设套餐20.首次充值200元,免费畅玩12小时21.充值摇奖,(大吧掌转盘抽奖)奖品有外设券、网费、饮料等22.签到7-14-21-28天有不同的券赠送(大吧掌功能)23.春节留守套餐(除夕夜送饺子,通宵3折等)24.情人节双人包间送玫瑰送巧克力,限情侣25.光棍节,单人上网送饮料一杯26.圣诞夜,装扮圣诞老人送苹果 送网费券27.跨年倒计时,送网费(充赠券),送饮料等28.国庆7天乐,一张卡畅玩7天(开通大吧掌包时段功能)不允许挂机29.元宵节,送网费(充赠券)送饮料 送汤圆30.护士节/教师节,凭证免费上网一天,提供情绪价值31.生日礼,生日当天免费上网,送小蛋糕,增加顾客记忆锚点 提供情绪价值32.会员聚会,每季度一次老板组织吃饭+洗浴+搓澡33.会员纪念日, 满一年送纪念礼品(每周礼品不同,提前准备),增加记忆锚点34.小红书种草,,发图文定位,送下午茶套餐,吸引女性玩家35.网吧群偶尔发发小红包,手机最佳送100元网费36.结拜兄弟,不要管真假,5人结拜送网费,增加顾客粘性
2026年04月28日
190 阅读
0 评论
0 点赞
2026-04-19
磐熠交换机上云教程
磐熠交换机上云教程1 登陆交换机1.1 登录使用web管理设备,设备管理口默认地址192.168.1.1(电脑网线直接连接交换机ETH口),vlanif默认地址192.168.100.100(电脑线直接连接交换机任意一个口),账号:admin,密码:admin2 设置IP2.1 设置VLAN1接口静态地址我们使用vlan1上互联网。需要对vlan1设置一个和客户机同网段的IP,如需要以下信息:交换机vlan1地址 192.168.0.155掩码 255.255.255.0网关 192.168.0.254DNS服务器 8.8.8.8设置步骤:点击【配置】,选择【VLAN】,在【VLANIF接口】中,选中Vlanif1,点击编辑,在打开页面中,选择IP分配类型为【静态】,可以设置vlan1接口的静态地址“点应用后 页面就打不开了 需要用设置的新ip 登陆 ,再点右上角的保存配置”3 确认交换机通网3.1 ping外网点击右上角的网络 选择“ping” ,在 VRF ID 选择 “default vrf ” , 目标ip地址 输入 8.8.8.8 点击ping 按钮如果出现下面的显示 说明 交换机已经可以上网了4 开启云服务4.1 应用镜像登录交换机WEB页面。点击“维护”菜单。点击“云维管理”进入云维配置页面。点击“启用”按钮。点击“云维连接模式”下拉框,选择设备连接云维平台的模式:Service port点击“应用”按钮,开启交换机的云管理功能点击“应用”按钮后,等待1分钟后刷新WEB页面。再次进入“云维管理页面”,可以看到设备的“云维绑定码”,表示设备已经成功连接到云维平台。5 后台绑定5.1 新建项目打开云管理平台:http://net.panyi.vip 输入代理商账号 密码点击“工作台”展开菜单。点击“我的项目”,进入项目管理页面。点击“新增”按钮,进入新增项目页面在“新增项目”页面,输入“项目”名称;选择“项目状态”;输入“地址”;点击“确认”按钮,创建网吧项目。7.2 绑定设备进入“我的项目”页面。点击“我的网吧”,进入“项目管理”页面。在“项目管理”页面,点击“设备绑定”按钮,进入绑定设备页面。输入交换机WEB页面的“云维绑定码”。点击“绑定”按钮。7.3 远程查看交换机网页出现提示“绑定成功”后,刷新网页“项目管理”页面出现已绑定的交换机图示,表示这台交换机已经成功绑定到这个网吧项目。 点击进去 就可以管理这个交换机了
2026年04月19日
146 阅读
0 评论
0 点赞
2026-04-07
如何在linux下让Docker调用N卡
最新使用Docker跑大模型,发现无法调用显卡,翻阅资料才知道要,安装 NVIDIA Container Toolkit下面的步骤:1. 添加 NVIDIA 源与 GPG 密钥 curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \ | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \ | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \ | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list 2. 安装 sudo apt update sudo apt install -y nvidia-container-toolkit 3. 配置 Docker 运行时并重启 sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker 4.Docker Compose 使用 GPU(v2.19+)docker-compose.yml 示例:version: '3.8' services: my-gpu-app: image: nvidia/cuda:12.3.1-base-ubuntu22.04 runtime: nvidia deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu, compute, utility] command: nvidia-smi
2026年04月07日
106 阅读
0 评论
0 点赞
2026-04-06
优化ACE系统占用
分享一个可以优化ACE反作弊占用的程序,可以降低ACE程序对系统资源的占用尤其是CPU和磁盘。使用方法也很简单,把这个程序设置通过开机启动。教程:设置服务端下发,指定此程序,运行参数填写 ACE-Tray.exe,可以做个延迟,这个程序要比ACE程序后启动。网盘分享:https://url67.ctfile.com/d/8911067-162327153-516bbb?p=3328
2026年04月06日
239 阅读
0 评论
0 点赞
1
2
...
18