{"id":30844096,"url":"https://github.com/edenleung/duxcms-2.1","last_synced_at":"2026-06-29T18:04:30.339Z","repository":{"id":125013345,"uuid":"201456251","full_name":"edenleung/duxcms-2.1","owner":"edenleung","description":"DUXCMS 2.1 多语言版本","archived":false,"fork":false,"pushed_at":"2020-06-06T13:12:04.000Z","size":3238,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-09-06T22:18:23.101Z","etag":null,"topics":["cms","duxcms","php"],"latest_commit_sha":null,"homepage":"https://duxcms.xiaodim.com","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/edenleung.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-08-09T11:40:02.000Z","updated_at":"2021-10-07T01:25:15.000Z","dependencies_parsed_at":"2023-08-09T22:32:30.082Z","dependency_job_id":null,"html_url":"https://github.com/edenleung/duxcms-2.1","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/edenleung/duxcms-2.1","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edenleung%2Fduxcms-2.1","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edenleung%2Fduxcms-2.1/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edenleung%2Fduxcms-2.1/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edenleung%2Fduxcms-2.1/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/edenleung","download_url":"https://codeload.github.com/edenleung/duxcms-2.1/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edenleung%2Fduxcms-2.1/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34937408,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-29T02:00:05.398Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cms","duxcms","php"],"created_at":"2025-09-06T22:08:54.856Z","updated_at":"2026-06-29T18:04:30.333Z","avatar_url":"https://github.com/edenleung.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DUXCMS 2.1\r\n[![LICENSE](https://img.shields.io/badge/license-Anti%20996-blue.svg)](https://github.com/996icu/996.ICU/blob/master/LICENSE)\r\n[![Build Status](https://travis-ci.org/xiaodit/duxcms-2.1.svg?branch=master)](https://travis-ci.org/xiaodit/duxcms-2.1)\r\n[![Release](https://img.shields.io/github/v/release/xiaodit/duxcms-2.1.svg?style=flat)](https://github.com/xiaodit/duxcms-2.1/releases/latest)\r\n[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/xiaodit/duxcms-2.1/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/xiaodit/duxcms-2.1/?branch=master)\r\n[![HitCount](http://hits.dwyl.io/{username}/xiaodit/duxcms-21.svg)](http://hits.dwyl.io/{username}/xiaodit/duxcms-21)\r\n\r\n[最新版本](https://github.com/xiaodit/duxcms-2.1/releases/latest)\r\n\r\n默认没有前台模板的，请下载[官方仓库](https://gitee.com/duxcms/DuxCms-2.0/tree/master/themes/default)模板文件进行开发  \r\n\r\n没安装Composer？ 请在最新版本链接下找`DuxCMS_Full.zip`下载\r\n\r\n* `DuxCMS_Full.zip` 含composer包的完整程序 建议首次下载\r\n* `DuxCMS-update.zip` 提供给在线更新的增量更新包\r\n\r\n## 特征\r\n* 支持php 5.6+ 7.4-\r\n* [支持多语言](#多语言)\r\n* [添加常用判断标签](#标签)\r\n* [提供更稳定的分词服务](#分词功能)\r\n* [提供文章推送百度收录](#百度推送)\r\n* [提供更好的异常接管（Whoops）](https://packagist.org/packages/filp/whoops)\r\n* [提供多条件筛选](#多条件筛选)\r\n* [提供在线更新服务(增量更新)](#在线更新) 🚀\r\n* 提供网站地图生成\r\n* [提供api接口调用](#api-调用)\r\n\r\n## 安装\r\n* mysqli扩展必须安装\r\n* pdo扩展可选安装\r\n```sh\r\n$ composer install\r\n```\r\n\r\n## 预览\r\n[线上预览](http://duxcms.xiaodim.com)  \r\n感谢 👉[Coding Page](http://coding.net)👈提供免费服务器支持\r\n\r\n## 数据库驱动\r\n* mysqli\r\n* pdo\r\n\r\n## 参考模板\r\n[GITEE](https://gitee.com/duxcms/DuxCms-2.0/tree/master/themes/default)  \r\n[开发文档](http://doc.duxcms.com/)\r\n\r\n## 多语言\r\n\r\n### 添加语种\r\n[在此文件](https://github.com/xiaodit/duxcms-2.1/blob/master/data/config/lang.php#L7)添加其它语种\r\n\r\n### 开启语言\r\n1. 后台设置-\u003e多语言设置-\u003e开启\r\n2. 选择默认语言\r\n\r\n### 切换语言\r\n#### 前台切换\r\n```php\r\n// 切换英文\r\nhttp://www.domain.com/en-us\r\n\r\n// 切换中文\r\nhttp://www.domain.com/zh-cn\r\n```\r\n#### 前台获取语言配置\r\n模板调用 `$lang_list` 获取列表\r\n\r\n```php\r\n\u003c?php var_dump($lang_list);?\u003e\r\n```\r\n\r\n具体用法\r\n```html\r\n\u003cul\u003e\r\n\u003c!--foreach{$lang_list as $key=\u003e$vo}--\u003e\r\n  \u003cli\u003e\u003ca href=\"/{$key}\"\u003e{$vo.label}\u003c/a\u003e\u003c/li\u003e\r\n\u003c!--{/foreach}--\u003e\r\n\u003c/ul\u003e\r\n```\r\n\r\n## 百度推送\r\n* 模板使用 `\u003c!--#pushBaidu--\u003e`\r\n* 后台实时提交 系统设置-\u003e百度链接提交-\u003e开启\r\n\r\n\r\n## 小功能\r\n### 栏目页\r\n* 添加分类文章统计（支持频道、列表） `$categoryInfo['article_count']`\r\n\r\n## 助手函数\r\n* `hasSub($cid)` 是否有下级分类\r\n* `articleSumByCid(int $cid, $positionId = '', $isShow = true)` 获取分类文章统计\r\n* `isOdd($index)` 是否为奇数 例子 `\u003c!--if{isOdd($list['i'])}--\u003e单数 \u003c!--{else}--\u003e偶数\u003c!--{/if}--\u003e`\r\n\r\n## 标签\r\n| 标签 | 说明| 参数 | 例子\r\n| ----|----|----|----\r\n| empty | 数组为空时| name | `{empty name=\"$list\"}{/empty}`\r\n| noempty | 数组不为空时 | name | `{noempty name=\"$list\"}{/noempty}`\r\n| defined | 常量已定义时 | name | `{defined name=\"APP_NAME\"}{/defined}`\r\n| nodefined | 常量未定义时 | name | `{nodefined name=\"APP_NAME\"}{/nodefined}`\r\n| isset | 变量定义时 | name | `{isset name=\"$test\"}{/isset}`\r\n| noset | 变量未定义时 | name | `{noset name=\"$test\"}{/noset}`\r\n| between | 变量存在某个区间时 | name, value | `{between name=\"$test\" value=\"1,2\"}{/between}`\r\n| nobetween | 变量不存在某个区间时 | name, value | `{nobetween name=\"$test\" value=\"1,2\"}{/nobetween}`\r\n| in | 变量存在数组时 | name, value | `{in name=\"$test\" value=\"1,2\"}{/in}`\r\n| noin | 变量不存在数组时 | name, value | `{noin name=\"$test\" value=\"1,2\"}{/noin}`\r\n| page | 单页信息| class 分类id, id 调用的变量名 | `{page class=\"$class_id\" id=\"page\"}{$page.content}{/page}`\r\n| progress | 获取文章阅读进度 | container, parent, child, class | [详细说明](#文章阅读进度)\r\n\r\n### 文章阅读进度\r\n参数\r\n* `container` 包着文章内容的根 （id, class） 例如 .back-to-top\r\n* `parent` 包着百分比的根（id, class） 例如 .back-to-top\r\n* `child` 包着百分比的标签 例如 span\r\n* `class` 当页面浏览到文章内容内，加的类名 例如 on\r\n```\r\n  \u003cdiv class=\"g-bd\"\u003e\r\n    文章内容\r\n  \u003c/div\u003e\r\n  {progress container=\".g-bd\" parent=\".back-to-top\" child=\"span\" class=\"on\"}\r\n    \u003cdiv class=\"back-to-top\" style=\"position: fixed;top:50\"\u003e\r\n      \u003cspan\u003e\u003c/span\u003e\r\n    \u003c/div\u003e\r\n  {/progress}\r\n```\r\n## 分词功能\r\n由于http://keyword.discuz.com 出现403(应该关服务了)\r\n\r\n使用[@梁斌penny](https://weibo.com/pennyliang)的分词服务, 使用此项目的'模板工'们，你们应该感谢梁厂长！\r\n\r\n## 多条件筛选\r\n\r\n### 后台\r\n1. 后台创建扩展模型 \r\n2. 添加【下拉菜单】类型的字段， 【字段配置】用逗号分隔 例如创建一个码数的字段 字段配置：m,xl,xxl\r\n\r\n### 前台\r\n`$duowei`数组  \r\n`$v['selected']`当前属性是否已选择  \r\n`$v['url']` 当前属性的url 相当于 使用当前属性进行筛选  \r\n`$v['durl']` 当前属性的url 相当于 不使用当前属性进行筛选  \r\n```\r\n\u003c!--foreach{$duowei as $vo}--\u003e\r\n  \u003cul\u003e\r\n    \u003cli\u003e\r\n      \u003ca href=\"#\"\u003e{$vo.name}\u003c/a\u003e\r\n      {noempty name=\"$vo['child']\"}\r\n      \u003cul\u003e\r\n        \u003c!--foreach{$vo['child'] as $v}--\u003e\r\n          \u003c!--if{$v['selected']==true}--\u003e\r\n            \u003ca href=\"{$v.durl}\" class=\"on\"\u003e\r\n              {$v.name}\r\n            \u003c/a\u003e\r\n          \u003c!--{/if}--\u003e\r\n\r\n          \u003c!--if{$v['selected']==false}--\u003e\r\n            \u003ca href=\"{$v.url}\"\u003e\r\n              {$v.name}\r\n            \u003c/a\u003e\r\n          \u003c!--{/if}--\u003e\r\n        \u003c!--{/foreach}--\u003e \r\n      \u003c/ul\u003e\r\n      {/noempty}\r\n    \u003c/li\u003e\r\n  \u003c/ul\u003e\r\n  \u003c!--{/foreach}--\u003e \r\n```\r\n\r\n## 伪静态 规则\r\n* 列表页 `urlname` 栏目URL\r\n* 列表详情页 `class_urlname` 上级分类栏目URL `urltitle` 当前页URL\r\n* 单页面 `urlname` 当前页URL  \r\n\r\n|名称 | 规则 | 对应类| 例子|\r\n|----|----|----|----|\r\n|列表页|`\u003curlname\u003e`|`article/Category/index`|`'\u003curlname\u003e/index.html' =\u003e 'article/Category/index'`\r\n|列表详情页|`\u003cclass_urlname\u003e` `\u003curltitle\u003e`|`article/Content/index`|`'\u003cclass_urlname\u003e/\u003curltitle\u003e.html' =\u003e 'article/Content/index'`\r\n|单页面|`\u003curlname\u003e`|`page/Category/index`|`'page/\u003curlname\u003e.html' =\u003e 'page/Category/index'`\r\n\r\n## api 调用\r\n\r\nGET `/api.php`\r\n\r\n**注意区分大小写**  \r\n\r\n| 参数 | 说明(参数范围)| 是否必传 | \r\n| ----|----|----|\r\n| signature |  签名 | 是 |\r\n| timestamp |  时间戳 | 是 |\r\n| nonce | 随机字符串| 是 |\r\n| app |  ['DuxCms', 'Article']| 是 |\r\n| label | ['contentList', 'categoryList', 'tagsList'] | 是 |\r\n| ... | 其它查询参数，与普通模板标签一样 | 否 |\r\n\r\n签名生成参考\r\n```\r\n$timestamp = time();\r\n$nonce = rand(1, 9999);\r\n$token = '';\r\n\r\n$params = [\r\n  $token,\r\n  $timestamp,   // timestamp 参数值\r\n  $nonce,   // nonce 参数值\r\n  'DuxCms', // app 参数值\r\n  'categoryList' // label 参数值\r\n];\r\n\r\nsort($params, SORT_STRING);\r\n$tmpStr = implode( $params );\r\n$signature = sha1( $tmpStr );\r\n```\r\n\r\n组装 query 参数\r\n```php\r\n$host = 'http://www.domain.com';\r\n$params = [\r\n    // 上面生成的签名\r\n    'signature' =\u003e $signature,\r\n    // 时间戳\r\n    'timestamp' =\u003e $timestamp,\r\n    // 随机字符串\r\n    'nonce' =\u003e $nonce,\r\n    // app\r\n    'app' =\u003e 'Duxcms',\r\n    // label\r\n    'label' =\u003e 'contentList'\r\n];\r\n\r\n$url = $host .\"?\" .http_build_query($params);\r\n```\r\n\r\n## 在线更新\r\n为了不影响已有的文件，作了增量更新包。  \r\n更新服务默认下载releases的Duxcms-update.zip压缩包，进行程序升级。  \r\n[更新服务](https://github.com/xiaodit/duxcms-update)  \r\n[检测地址](https://raw.githubusercontent.com/xiaodit/duxcms-update/master/ver.json)\r\n\r\n## 打赏\r\n如果对你有帮助的，打赏下小弟吧。  \r\n\u003cimg src=\"https://raw.githubusercontent.com/xiaodit/duxcms-update/master/WechatIMG4.jpeg\" title=\"微信\" width=\"300\"\u003e\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedenleung%2Fduxcms-2.1","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fedenleung%2Fduxcms-2.1","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedenleung%2Fduxcms-2.1/lists"}