织梦dedecms如何仿百科功能?

99ANYc3cd6
预计阅读时长 31 分钟
位置: 首页 织梦建站 正文

第一步:核心思路与功能规划

我们要明确百度百科的核心功能,并将其拆解成织梦DedeCMS可以实现的功能模块。

织梦dedecms 仿 百科
(图片来源网络,侵删)
  1. 词条核心 (文章模型):

    • 每个词条就是一篇独立的文章。
    • 文章需要有标题、内容(支持富文本编辑器)、分类(如“科学”、“历史”、“地理”)。
    • 关键特性:
      • URL: index.php?/view-xxx.html (xxx为词条ID)
      • 在列表页显示词条简介。
      • 分类: 用于导航和筛选。
  2. 分类导航 (栏目管理):

    • 使用DedeCMS的顶级栏目来模拟百科的大分类,如“自然科学”、“社会科学”、“工程技术”等。
    • 在每个顶级栏目下,可以建立子栏目来模拟更细的分类,如“自然科学”下可以有“物理学”、“化学”、“生物学”。
  3. 词条创建与编辑 (会员与投稿):

    • 词条创建: 开放给所有注册会员,通过会员中心的“发布内容”功能,选择“词条”模型进行创建。
    • 词条编辑: 词条的创建者可以编辑自己的词条,管理员可以编辑所有词条。
    • 审核机制: 所有新创建或修改的词条,都需要经过后台审核才能显示,这是保证内容质量的关键。
  4. 词条关系 (自定义模型/表单):

    织梦dedecms 仿 百科
    (图片来源网络,侵删)
    • 这是“仿百科”的精髓之一,词条之间可以有关联,词条A”提到“词条B”,用户点击“词条B”就能跳转过去。
    • 实现方式:为“词条”文章模型增加一个自定义字段related_terms,用于存储关联词条的ID,用逗号隔开,前端通过JS解析这个字段,生成可点击的链接。
  5. 词条版本历史 (自定义表单):

    • 每次编辑词条时,都应该记录下编辑者、编辑时间、编辑摘要,形成一个历史版本列表。
    • 实现方式:创建一个自定义表单,命名为 词条版本,当会员编辑词条并提交后,通过一个触发器(需要修改或写个小程序)将编辑信息(编辑人、时间、旧内容快照)提交到这个表单中,在词条详情页调用这个表单的数据来展示历史版本。
  6. 词条评价/纠错 (自定义表单):

    • 用户可以对词条内容进行评价或指出错误。
    • 实现方式:创建一个自定义表单,命名为 词条评价,在词条详情页放置一个表单提交入口,用户提交后,管理员在后台审核并显示。

第二步:详细实施步骤

创建核心内容模型 - “词条”

这是整个项目的基础。

  • 路径: 核心 -> 内容模型管理 -> 添加新模型
  • 模型名称: 词条
  • 模型表前缀: dede_archives (默认即可,通常不修改)
  • 附加表: dede_addonarticle (默认即可,这是文章模型的默认附加表)
  • 选择字段: 勾选你需要的系统字段,如 title (标题), typeid (栏目), writer (作者), litpic (缩略图/词条封面图), description (词条简介), body (正文/词条内容)。
  • 保存模型。

创建分类栏目

  • 路径: 核心 -> 栏目管理
  • 添加顶级栏目:
    • 栏目名称: 自然科学
    • 栏目类型: 普通栏目
    • 内容模型: 选择 “词条”
    • 列表模板: list_article.htm (使用默认的,后续可以自定义)
    • 保存。
  • 为顶级栏目添加子栏目:
    • 点击“自然科学”的“[增加子栏目]”。
    • 栏目名称: 物理学
    • 栏目类型: 普通栏目
    • 内容模型: 选择 “词条”
    • 保存。
    • 重复此操作,创建“化学”、“生物学”等子栏目。

添加关键的自定义字段

这是实现“百科”特色功能的关键。

织梦dedecms 仿 百科
(图片来源网络,侵删)
  • 路径: 核心 -> 内容模型管理 -> 选择“词条”模型 -> [管理字段]
  • 添加关联词条字段:
    • 字段名称: related_terms (英文名,必须唯一)
    • 关联词条
    • 字段类型: 多选文本框 (或者单行文本,看你希望如何输入)
    • 字段说明: 输入与此词条相关的其他词条的ID,用英文逗号隔开。123, 456, 789
    • 是否显示在发布页: 是 (让编辑者可以填写)
    • 是否显示在列表页: 否 (不需要在列表页显示)
    • 保存。
  • 添加版本摘要字段 (用于编辑时填写修改说明):
    • 字段名称: edit_summary
    • 版本摘要
    • 字段类型: 单行文本框
    • 是否显示在发布页: 是 (在编辑表单中显示)
    • 保存。

创建自定义表单 (用于版本历史和评价)

  • 路径: 核心 -> 自定义表单管理 -> [增加一个自定义表单]
  • 创建“词条版本”表单:
    • 表单名称: 词条版本
    • 数据表: dede_addonexample (默认)
    • 进入字段管理,添加以下字段:
      • term_id (int, 11): 词条ID (主键)
      • editor (varchar, 50): 编辑者
      • edit_time (datetime): 编辑时间
      • summary (varchar, 255): 版本摘要
      • content_snapshot (text): 内容快照 (可选,存储修改前的内容)
  • 创建“词条评价”表单:
    • 表单名称: 词条评价
    • 数据表: dede_addonexample (或新建一个)
    • 进入字段管理,添加以下字段:
      • term_id (int, 11): 词条ID (主键)
      • user (varchar, 50): 评价人
      • comment (text): 评价内容
      • status (varchar, 10): 状态 (用于后台审核,如'待审核', '已通过')

设置会员与投稿

  • 开启会员功能:
    • 路径: 系统 -> 系统基本参数 -> 会员设置
    • 勾选“启用会员功能”,并设置相关参数。
  • 会员投稿权限:
    • 路径: 核心 -> 频道管理 -> 内容模型管理 -> 选择“词条”模型 -> [投稿设置]
    • 勾选“允许会员投稿”,并设置投稿后的默认状态为“待审核”。
  • 会员组权限:
    • 路径: 核心 -> 会员管理 -> 会员组管理
    • 为普通会员组设置“投稿”权限,并限制其只能在自己投稿的“词条”中进行编辑。

第三步:模板制作与调用

词条列表页模板 (list_article.htm)

这个模板用来显示一个分类下的所有词条。

{dede:list pagesize='20'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <p class="summary">[field:description function='cn_substr(@me, 100)'/]...</p>
        <span class="category">分类: [field:typename/]</span>
    </li>
{/dede:list}
{dede:pagelist listitem='info,index,end,pre,next,pageno' listsize='5'/}

词条详情页模板 (article_article.htm)

这是最核心的模板,需要整合所有功能。

<!DOCTYPE html>
<html>
<head>{dede:field.title/} - 我的百科</title>
    <meta name="description" content="{dede:field.description/}" />
</head>
<body>
    <h1>{dede:field.title/}</h1>
    <!-- 词条封面图 -->
    {dede:field name='litpic'/}
    <!-- 词条内容 -->
    <div class="content">
        {dede:field.body/}
    </div>
    <!-- 关联词条 -->
    <div class="related-terms">
        <h3>相关词条</h3>
        <ul>
            {dede:field name='related_terms' runphp='yes'}
                $rel_ids = @explode(',', trim(@me));
                if(!empty($rel_ids)){
                    $rel_ids = array_filter($rel_ids); // 过滤空值
                    $dsql = new DedeSql(false);
                    $orwhere = "";
                    foreach($rel_ids as $id){
                        $orwhere .= " OR id='$id' ";
                    }
                    $dsql->SetQuery("SELECT id, title FROM dede_archives WHERE ($orwhere) AND arcrank > -1");
                    $dsql->Execute('me');
                    $result = '';
                    while($row = $dsql->GetArray('me')){
                        $result .= "<li><a href='/view-{$row['id']}.html'>{$row['title']}</a></li>";
                    }
                    @me = $result;
                }else{
                    @me = "<li>暂无相关词条</li>";
                }
            {/dede:field}
        </ul>
    </div>
    <!-- 词条版本历史 -->
    <div class="version-history">
        <h3>版本历史</h3>
        <dl>
            {dede:php}
                $term_id = $arcID;
                $dsql = new DedeSql(false);
                $dsql->SetQuery("SELECT editor, edit_time, summary FROM dede_addonexample WHERE aid = '$term_id' ORDER BY edit_time DESC");
                $dsql->Execute('v');
                while($row = $dsql->GetArray('v')){
                    echo "<dt>{$row['edit_time']} by {$row['editor']}</dt>";
                    echo "<dd>{$row['summary']}</dd>";
                }
            {/dede:php}
        </dl>
    </div>
    <!-- 词条评价/纠错表单 -->
    <div class="feedback-form">
        <h3>纠错与评价</h3>
        <form action="/plus/diy.php" enctype="multipart/form-data" method="post">
            <input type="hidden" name="action" value="post" />
            <input type="hidden" name="diyid" value="2" /> <!-- 这里填你的“词条评价”表单ID -->
            <input type="hidden" name="do" value="2" />
            <input type="hidden" name="dede_fields" value='term_id,text;user,text;comment,text' />
            <input type="hidden" name="dede_fieldshash" value='这里需要根据你的表单字段生成hash值' />
            <input type="hidden" name="term_id" value="{dede:field.id/}" />
            <p><label>您的称呼:</label><input type="text" name="user" /></p>
            <p><label>评价内容:</label><textarea name="comment" rows="5" cols="50"></textarea></p>
            <p><input type="submit" name="submit" value="提交" /></p>
        </form>
    </div>
</body>
</html>

注意:

  • 关联词条的调用使用了 runphp='yes',在PHP代码中直接查询数据库生成链接。
  • 版本历史的调用使用了 {dede:php} 标签,直接嵌入PHP代码查询 dede_addonexample (你的版本表)。
  • 评价表单使用了DedeCMS的自定义表单提交功能,你需要将 diyid 替换为你创建的“词条评价”表单的实际ID,并根据你的表单字段正确填写 dede_fieldsdede_fieldshash,这个hash值可以通过查看一个已存在的表单页面源代码来找到。

第四步:URL优化与伪静态

为了URL更美观,需要设置伪静态规则。

  • 织梦后台设置:
    • 路径: 系统 -> 系统基本参数 -> 核心设置
    • 是否使用伪静态: 选择“是”
    • URL静态化: 选择“是”
  • 服务器配置:
    • Apache: 在网站根目录下创建 .htaccess 文件,写入以下规则:
      RewriteEngine On
      RewriteRule ^list-([0-9]+)\.html$ /plus/list.php?tid=$1
      RewriteRule ^view-([0-9]+)\.html$ /plus/view.php?aid=$1
    • Nginx: 在nginx的server配置块中添加:
      rewrite "^/list-([0-9]+)\.html$" /plus/list.php?tid=$1 last;
      rewrite "^/view-([0-9]+)\.html$" /plus/view.php?aid=$1 last;

第五步:可选高级功能

  1. 词条锁定: 管理员可以在后台对成熟、重要的词条进行“锁定”,禁止普通会员编辑,只有管理员可以修改。
  2. 重定向词条: 当一个词条有多个名称时(如“电脑”和“计算机”),可以将其中一个重定向到另一个,可以通过在数据库中添加一个重定向字段,或者用JS实现前端跳转。
  3. 词条浏览次数: 使用DedeCMS的click字段,在文章详情页模板中调用 {dede:field.click/} 显示,并使用JS在页面加载时进行一次/plus/count.php?view=yes&aid=[field:id/]的请求来增加计数。
  4. 词条等级: 根据词条内容的丰富程度、浏览量、编辑次数等,给词条设置一个等级(如“初级词条”、“优秀词条”、“精华词条”),这需要更复杂的逻辑和字段。

仿做织梦DedeCMS百科站点的核心在于:

  1. 模型”:将“词条”作为核心模型。
  2. 用好“自定义字段”:实现词条的特色属性,如关联词条。
  3. 用好“自定义表单”:实现词条的交互功能,如版本历史、用户评价。
  4. 用好“PHP标签”:在模板中嵌入PHP代码,实现复杂的数据库查询和逻辑处理。
  5. 用好“会员系统”:实现UGC(用户生成内容)的投稿和编辑流程。

这个方案为你提供了一个完整的框架,你可以根据实际需求进行细节的调整和功能的扩展,祝你项目顺利!

-- 展开阅读全文 --
头像
C语言cin用法与注意事项有哪些?
« 上一篇 2025-12-21
数据库数据还在,为何dede后台列表却不见了?
下一篇 » 2025-12-21

相关文章

取消
微信二维码
支付宝二维码

目录[+]