
简介面向Discuz!论坛站长、管理员与二次开发者这份rar压缩包汇集了DZ论坛搭配克米模板3.5版本的完整应用方案适合需要快速提升社区界面与互动能力的场景。包内共1755个文件以818个php脚本、374张jpg图片、201个png图标、159个htm页面以及css/js等资源为主布局清晰便于对照模板结构进行修改和部署压缩包整体约52.45MB。资源重点覆盖微信登录整合、首页风格定制、全文阅读、图片展示、短信验证、HTTPS安全支持、作者高亮、19楼式展示、多彩配色等十余个功能模块又包含配套教程有助于强化用户互动、安全防护和个性化体验。目前已有162人学习下载对正在选用或升级论坛模板、希望降低二次开发成本的技术人员具有直接参考价值。1. 为什么老站长还在回头用克米模板 3.5 —— 先从 comiis.css 说起做过 Discuz! 站点维护的人对“模板”两字都有执念换皮容易换完还能让体验、加载速度、SEO 不开倒车才考验功力。克米模板 3.5 就是这么一套值得拆开的 DZ 论坛模板它把微信登录、全文阅读、图片灯箱、短信验证、HTTPS 都做成了 comiis 系列组件安装包里反复出现的 comiis.css 也不是冗余而是样式加载顺序设计。实际部署时难点不是上传而是装完不知道怎么验证CSS 顺序错首页乱版微信回调域名差一个字母登录就报 redirect_uri 错误。下面按操作流程来拆先解决“装没生效”再讲组件参数最后给 19 楼推荐位改造思路。适合接手 DZ 论坛、想在 3.5 版本上稳定升级的运维和二次开发者。2. 拆包与安装克米模板 3.5 在 Discuz! X3.5 上的目录结构与 CSS 加载顺序2.1 模板包结构comiis.css 为什么出现多次拿到 “DZ论坛克米模板3.5版本教程.rar” 后第一眼印象是 comiis.css 到处都是。根目录放一份template 里放一份某些插件目录再放一份。新手容易当垃圾文件删掉实际上每个位置都有用途。根目录那份多半是教程作者为了方便覆盖放的备份template/comiis_17/common/ 下的是运行时基础样式comiis_14_style.css、comiis_15_style.css、comiis_16_style.css、comiis_17_style.css 这四件套分别对应几种历史皮肤粒度论坛运营者可以在后台给不同分区指定不同风格。# 建议先看目录再复制别一上来就覆盖 tree /data/wwwroot/dz/template/comiis_17 -L 2 # 输出常见结构 # comiis_17/ # ├── common/ # │ ├── comiis.css # │ ├── comiis_14_style.css # │ ├── comiis_15_style.css # │ ├── comiis_16_style.css # │ └── comiis_17_style.css # ├── forum/ # └── style/这里先解释目录再谈加载顺序Discuz! X3.5 的模板机制会先加载 common 目录里的基础样式后续风格文件通过 header 里的 link 标签追加。克米把 comiis_17_style.css 放在最后是为了让它覆盖前几个皮肤里的相同类名。这个覆盖顺序如果被某种 “CSS 合并插件” 打乱就会出现按钮颜色对不上、列表间距诡异的问题。在 common/header.htm 里常见的是link relstylesheet href{STATICURL}template/comiis_17/style/comiis.css?v3.5 link relstylesheet href{STATICURL}template/comiis_17/style/comiis_17_style.css?v3.5 idcomiisSkin说明{STATICURL}是 Discuz! 模板变量输出静态资源路径?v3.5是缓存刷新用的版本号改样式后记得更新这个参数第二个 link 带 id 是因为克米的换肤 JS 会动态替换 href。如果在页面上看到这两条说明模板头文件加载正常如果只有第一条多半是二次开发时把 header.htm 改坏了。2.2 上传与安装先看权限再进后台安装前先确认 Discuz! 版本。克米 3.5 这个名字容易和 Windows 的 .NET 3.5 离线安装包搞混也有朋友在 Windows Server 1909 上装 DZ 时问“要不要先装 .NET 3.5”这里明确一下Discuz! 是 PHP 应用模板更不依赖 .NET你需要的是 PHP 7.3、MySQL 5.7 和可写的 data 目录。然后把文件放到位cd /data/wwwroot/dz # unar 对 rar 压缩包支持更稳7z 需要额外组件 unar DZ论坛克米模板3.5版本教程.rar -o /tmp/km35 cp -r /tmp/km35/template/comiis_17 ./template/ cp -r /tmp/km35/source/plugin/comiis_* ./source/plugin/ chown -R www:www ./template/comiis_17 ./source/plugin/comiis_*说明前三行是解压和复制最后一行把目录属主改成 PHP-FPM 的运行用户通常是 www否则后台安装插件会写入失败。接着进后台 - 界面 - 风格管理如果列表里出现克米模板就点“安装”。如果没有出现检查 template/comiis_17 下是否存在discuz_style_comiis_17.xml文件这是 Discuz! 识别模板的入口。权限可以按下面这张表对一遍少一个位都可能出 500路径权限用途template/comiis_17755模板文件可读source/plugin/comiis_*755插件主目录可读data/template777模板编译缓存写入安装完不要急着看效果先去后台 - 工具 - 更新缓存勾选模板缓存和数据缓存。这一步漏掉浏览器里看到的还是旧模板的 CSS容易误判为安装失败。2.3 验证 CSS 是否真的加载判断模板装没装好最直接的是看网络请求。打开浏览器开发者工具刷新首页搜索comiis_17_style也可以在服务器上直接抓curl -I https://your-domain.com/template/comiis_17/style/comiis_17_style.css?v3.5说明返回 200 且Content-Type: text/css是正常的。如果 404先看路径里有没有多一层static目录如果返回 301注意是不是站点开启了 HTTPS 跳转而请求地址还是 http。看到 200 之后再对比样式确认列表页的按钮、圆角、间距和官方演示一致。补充一点如果安装包里有多个 comiis.css不要凭感觉只保留一个。有些组件会在自己目录下放一份独立 css比如 comiis_19show 模块的样式文件全局 comiis.css 只负责基础变量两者是配合关系。删除“重复文件”前在 templates 目录里 grep 一下文件名有没有被引用。3. 组件配置实战会员登录、首页风格与全文阅读3.1 comiis_weixin微信登录与支付克米 3.5 的微信整合模块把 OAuth 登录、公众号绑定、微信支付三件事放在一个插件里。默认插件路由是plugin.php?idcomiis_weixin安装后先去后台启用然后在source/plugin/comiis_weixin/comiis_weixin.class.php里填参数。大多数版本用数组保存配置常见字段如下/* comiis_weixin.class.php 中的配置项 */ $_comiis_weixin[appid] wx1234567890abcdef; $_comiis_weixin[appsecret] abcdef1234567890abcdef1234567890; $_comiis_weixin[callback] https://your-domain.com/plugin.php?idcomiis_weixin:callback; $_comiis_weixin[token] km35token; $_comiis_weixin[mchid] ; // 微信支付商户号仅支付需要 $_comiis_weixin[apiv3key] ; // 微信支付 APIv3 密钥说明appid 和 appsecret 在微信公众平台“基本配置”里拿callback 必须使用完整的 https 地址这个地址要和公众平台“网页授权域名”的根域名一致。最常见的报错是redirect_uri 参数错误十有八九是域名带了 www 而公众平台没带或者回调地址写成了http://。token 是给微信服务器验证消息加签用的不需要和 appsecret 一样但两边要一致如果只做登录mchid 和 apiv3key 留空即可填错反而导致登录接口报“缺少参数”。微信登录的流程不复杂用户点击“微信登录” - 跳到微信授权页 - 微信回调克米 callback - 插件拿到 openid 比对pre_common_member_weixin表 - 已存在则直接登录不存在则引导绑定已有账号或注册新账号。调试时重点看data/log/下当天的日志里面会记录微信 API 返回的原始 JSON比看页面提示快得多。3.2 comiis_app_homestyle 与 comiis_app_color首页风格与配色这两个组件一个管布局一个管颜色经常一起调。comiis_app_homestyle 后台路径一般是扩展 - 克米模板3.5 - 首页风格。它提供的不只是“换几张 Banner”而是把版块列表、主题列表、图片墙、推荐位做了组合拆成几种预设模式。选择后如果不刷新可以先切到模板缓存清理再看。| 配置项 | 示例值 | 作用 | | home_style | card | flat/card/hybrid 三种布局 | | list_rows | 20 | 首页主题列表条数越大压力越高 | | show_cover | 1 | 是否显示缩略图封面 | | app_color | #d33 | 全局主色影响按钮、链接、标签 |关于comiis_app_color新版模板在common/comiis.css顶部用 CSS 变量定义了一套主题色直接改一处就能全局生效:root { --comiis-main: #d33; --comiis-main-dark: #b02020; --comiis-bg: #f5f6fa; }说明改完不要只刷新浏览器Discuz! 会把 template 编译成 PHP 缓存CSS 文件是静态的但 link 标签可能带版本号顺手把 header.htm 里的v3.5改成v3.5.1强制浏览器重新拉取。旧版模板没有这些变量需要在comiis_17_style.css里搜索原来的主色值全局替换注意别把hover状态的深色也一并覆盖否则按钮会没有按下反馈。3.3 comiis_lookfulltext全文阅读的取舍与实现comiis_lookfulltext 在列表页直接展开帖子全文减少一次点击。听起来提升效率但对内容型社区有个潜在问题搜索引擎可能同时收录列表页全文和帖子详情页全文造成重复页面。我一般会把它限定在“已登录用户组”或“手机版”开启设置面板里有needLogin选项打开后游客只能看到摘要登录后才会请求全文。/* 列表页引入 comiis_lookfulltext 后初始化 */ if (window.comiisLookFullText) { comiisLookFullText.init({ forumId: 2, // 只在该版块启用 needLogin: true, // 未登录不加载全文 maxHeight: 480, // 超过 480px 截断 loadMore: true // 滚动到底部自动加载下一页 }); }参数说明forumId 传一个版块 ID0 表示全局开启needLogin 为 true 时插件会先发 AJAX 到forum.php?modajaxactioncheckuser未登录返回 403maxHeight 决定正文最高撑到多高这里要和 CSS 里的-webkit-line-clamp保持一致loadMore 会改变滚动行为开启后注意统计代码要放到回调里否则 PV 会比实际少一截。3.4 comiis_imgshow图片展示与附件加载图片是论坛帖子里的重量级资源。comiis_imgshow 做的事情本质上是缩略图 懒加载 灯箱。在 Discuz! 后台“性能优化 - 帖子性能”里可以调缩略图尺寸克米模板会优先读这些全局参数/* config_global.php 中的图片设置示例 */ $_G[setting][thumbwidth] 960; $_G[setting][thumbquality] 85; $_G[setting][lazyload] 1;说明thumbwidth 建议和帖子内容区最大宽度一致设太大浪费流量设太小点开大图会糊thumbquality 建议 75~85超过 90 对视觉提升很小但体积涨得快lazyload 开启后图片会带>$_comiis_authorpost[uids] [1, 8, 23]; $_comiis_authorpost[display] top; // top 置顶显示 / tab 单独标签 $_comiis_authorpost[limit] 5;说明uids 填站长或核心作者的 UIDdisplay 为top时会把作者帖置顶在列表前tab时在页面上生成一个“作者”切换页。注意这些 UID 不等于管理员组跨用户组也生效适合做“内容合伙人”机制。调试时如果作者帖不出现确认 UID 是否存在以及主题表里first字段是否为 1只查首帖。4. 安全与性能HTTPS、短信验证与缓存排错4.1 comiis_httpsSSL 配置与混合内容克米 3.5 的 comiis_https 组件解决两件事把 http 请求 301 跳转到 https以及把模板/插件的资源 URL 修正成 https。Nginx 层如果没做跳转组件里的 PHP 跳转也会生效但建议在 Web 服务器配好减少一次后端处理server { listen 443 ssl http2; server_name your-domain.com; ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; } server { listen 80; server_name your-domain.com; return 301 https://$host$request_uri; }注意$host会保留原请求的域名避免 www 和非 www 双证书时跳错。组件里另一个重要函数是“修正混合内容”旧模板里写死的http://your-domain.com/static/...会被替换为当前协议。如果站点已经运行很久直接改文件不如在数据库里做一次全局替换但只替换自己域名开头的内容UPDATE pre_common_setting SET svalue REPLACE(svalue, http://your-domain.com, https://your-domain.com) WHERE svalue LIKE %http://your-domain.com%;说明pre_common_setting存了站点 URL、水印文字等配置替换完去后台更新缓存不要对所有http://做替换否则外部图片或下载链接会被改坏。替换后按 F12 看 Console出现 “Mixed Content” 警告说明还有资源走 http通常集中在comiis_17_style.css里的背景图手动改成相对路径/static/...更省事。4.2 comiis_sms短信验证码接入短信验证主要用在注册和找回密码。克米这个模块的配置项可以映射到阿里云、腾讯云等短信服务参数含义差不多| 配置项 | 示例 | 说明 | | sms_provider | aliyun | 服务商标识 | | access_key_id | LTAI5tXXXX | 访问密钥 ID | | access_key_secret | 只存服务端 | 密钥 | | sign_name | 我的社区 | 签名 | | template_code | SMS_21001234 | 验证码模板 ID |接入时最容易踩的是模板 ID 和签名不匹配短信平台审核通过的模板里往往写死了“你的验证码是 ${code}”而插件发送时也要求模板变量名是code变量名对不上会报template not exist。另外不管接哪家服务本地都要做频率限制否则用户狂点会把账号刷爆。插件里常见的限制思路/* 发送前的 60 秒校验 */ if (time() - (int)$_G[cache][sms_last_ . $mobile] 60) { showmessage(两次发送间隔不能少于 60 秒); }说明$_G[cache]是 Discuz! 的内存缓存直接挂在内存里如果开启了 Redis同一套代码也能生效。showmessage是 Discuz! 的友好提示函数会跳转回来源页。生产环境建议再叠加一个“同 IP 每天最多 10 次”的计数防止脚本用代理池刷号。4.3 常见报错与排错组件装多了排错顺序比排错本身更重要。我一般先看 Web 服务器错误日志再看 Discuz! 运行日志最后才开浏览器调试。命令如下# Nginx 错误日志 tail -f /var/log/nginx/error.log # Discuz! 运行时日志 tail -f /data/wwwroot/dz/data/log/$(date %Y%m%d)_errorlog.php说明第二条日志文件名是按日期生成的Debian 系服务器date命令能取到日期日志行里如果出现Call to undefined function comiis_send_sms()说明插件文件被部分上传重新覆盖 source/plugin 目录。如果出现Table pre_common_member_comiis doesnt exist是插件附带的数据表没装全后台插件列表里应该能看到“升级”按钮点一下会补执行 install.sql。模板 CSS 不刷新也归这类问题处理方式比较简单# 清理模板编译缓存X3.5 中模板会编译成 php 文件 rm -rf /data/wwwroot/dz/data/template/*.php说明执行完第一次重新访问页面会重新编译如果突然 500就是模板 PHP 存在语法错误error_log里会精确到行号。注意这个命令只清 template 缓存不影响 DIY 数据DIY 的缓存放在 data/diy 下面不需要因为改 CSS 去动它。5. 把 19 楼模式改造成自己的内容推荐页克米模板 3.5 里最后一组值得单独玩的组件是 comiis_19show 和 comiis_19forum它们把“板块混排”这种运营手段做成了模板位。与其在后台手动拖模块不如直接写一个 PHP 函数挂到 DIY 标签里方便以后换推荐位。思路很简单给定一组板块 ID查询最新主题按指定时间窗口排序输出。/* 放到 source/function/function_comiis.php 末尾 */ function comiis_19_pick($fids, $limit 10) { $fids array_map(intval, (array)$fids); if (!$fids) return []; $where fid IN ( . implode(,, $fids) . ) AND displayorder0; $query DB::query( SELECT tid, subject, author, dateline FROM %t WHERE %i ORDER BY dateline DESC LIMIT %d, [forum_thread, $where, $limit] ); $list []; while ($row DB::fetch($query)) { $row[url] forum.php?modviewthreadtid . $row[tid]; $list[] $row; } return $list; }%t是 Discuz! 数据库封装层的表名占位符自动补pre_前缀%i是条件占位符%d强制转整数杜绝注入。displayorder 大于等于 0 能过滤掉回收站和待审核主题如果想排除置顶把条件改成displayorder0。写完之后在 19 楼推荐位模板中直接循环ul classcomiis-19-list !--{loop comiis_19_pick(2,5,9) $row}-- lia href{$row[url]} target_blank{$row[subject]}/a/li !--{/loop}-- /ul这里!--{loop}--是 Discuz! 模板语法对应 PHP foreach传进去的数组不必提前定义模板引擎会逐个输出。验证推荐位是否生效在服务器上执行time curl -s https://your-domain.com/forum.php | grep -c comiis-19-list输出大于 0 说明推荐位已经渲染再配合一段var_dump(comiis_19_pick(2,5,9));调试文件能直接看到数组里有没有数据。fids 写错不会报错只是返回空数组所以排查时先确认版块 ID 存在且对应用户组有访问权限。如果板块数多、访问量大可以给函数加一段静态缓存把结果写到data/cache/comiis_19show.php第二次请求直接读文件不再查 MySQL打开页面刷新两次对比 grep 命中数是否稳定就能确认推荐位已经由缓存接管。本文还有配套的精品资源点击获取