首页 > CMS教程 > DEDECMS > 正文

DedeCMS评分功能怎么添加?评分显示如何设置?

月夜之吻
发布: 2025-09-06 10:51:01
原创
871人浏览过
DedeCMS评分功能通过修改内容页模板插入评分代码,利用{dede:field.scores /}标签显示平均分,并添加星形打分区域和JavaScript实现用户交互,数据通过AJAX提交至/plus/feedback_js.php处理,结合CSS美化界面,最终实现评分功能并可通过结构化数据优化SEO。

dedecms评分功能怎么添加?评分显示如何设置?

DedeCMS的评分功能,说白了,就是通过对内容页模板进行一番“手术”,插入特定的代码来展示当前评分、提供用户打分入口,并最终通过后端脚本处理数据。显示设置则更多是前端的活儿,通过CSS和JavaScript来美化和交互。核心在于理解DedeCMS的标签体系和它的

plus
登录后复制
目录下的反馈处理机制。

解决方案

要让DedeCMS的内容拥有评分功能,这事儿其实分两步走:一是把评分的“骨架”搭起来,二是给它穿上“衣服”并赋予“灵魂”。

第一步:搭建评分的骨架(添加功能)

这主要涉及修改你内容页的模板文件,比如

article_article.htm
登录后复制
(具体文件名可能因你使用的内容模型而异)。

  1. 找到你的内容模板: 通常在

    /templets/default/article_article.htm
    登录后复制
    或你自定义的模板目录下。

  2. 插入评分显示标签: DedeCMS有一个内置的

    {dede:field.scores /}
    登录后复制
    标签,它能直接显示当前内容的平均评分。你可以把它放在你觉得合适的位置,比如文章标题下方或者正文结尾。

    <div class="article-rating-display">
        当前文章平均评分:<span id="current-avg-score">{dede:field.scores /}</span> 分
        <!-- 这里可以根据需要添加更多信息,比如总评分人数等 -->
    </div>
    登录后复制
  3. 添加用户打分区域: 这才是关键。我们需要一个让用户点击打分的地方。通常我们会用一组星形图标来实现。

    <div class="user-rating-area">
        <p>请为本文打分:</p>
        <div class="rating-stars" id="ratingStars">
            <span class="star" data-score="1">☆</span>
            <span class="star" data-score="2">☆</span>
            <span class="star" data-score="3">☆</span>
            <span class="star" data-score="4">☆</span>
            <span class="star" data-score="5">☆</span>
        </div>
        <button id="submitRatingBtn" class="submit-rating-btn">提交我的评分</button>
        <p id="ratingMessage" style="color: green; display: none;"></p>
    </div>
    登录后复制

    这里我们用

    <span>
    登录后复制
    标签模拟星星,通过
    data-score
    登录后复制
    属性记录分数。

  4. 编写JavaScript处理打分逻辑: 这是让星星动起来,并将用户选择的分数发送到后台的核心。我们需要监听星星的点击事件,并用AJAX将数据提交到DedeCMS的反馈接口。

    <script src="/include/js/jquery.js"></script> <!-- 确保引入了jQuery -->
    <script>
    $(function(){
        let selectedScore = 0;
        const articleId = '{dede:field.id /}'; // 获取当前文章ID
    
        // 星星hover和点击效果
        $('#ratingStars .star').on('mouseenter', function() {
            $(this).prevAll().addBack().text('★').addClass('hovered');
            $(this).nextAll().text('☆').removeClass('hovered active');
        }).on('mouseleave', function() {
            if (selectedScore === 0) { // 如果没有选择分数,鼠标离开时恢复原样
                $('#ratingStars .star').text('☆').removeClass('hovered active');
            } else { // 如果已经选择分数,恢复到选择状态
                $('#ratingStars .star').each(function() {
                    if ($(this).data('score') <= selectedScore) {
                        $(this).text('★').addClass('active');
                    } else {
                        $(this).text('☆').removeClass('active');
                    }
                });
            }
        }).on('click', function() {
            selectedScore = $(this).data('score');
            $('#ratingStars .star').removeClass('active').text('☆');
            $(this).prevAll().addBack().addClass('active').text('★');
            // 可以立即提交,或者等待点击提交按钮
        });
    
        // 提交评分按钮点击事件
        $('#submitRatingBtn').on('click', function() {
            if (selectedScore === 0) {
                $('#ratingMessage').text('请选择一个分数再提交哦!').css('color', 'orange').fadeIn();
                return;
            }
    
            $.ajax({
                type: 'POST',
                url: '/plus/feedback_js.php', // DedeCMS的反馈处理接口
                data: {
                    action: 'send',
                    aid: articleId,
                    scores: selectedScore,
                    // msg: '用户通过评分功能提交', // DedeCMS feedback_js.php需要msg参数,即使是空字符串
                    validate: '' // 如果开启了验证码,这里需要处理
                },
                dataType: 'json',
                success: function(response) {
                    if (response.state) {
                        $('#ratingMessage').text('评分成功!感谢您的参与。').css('color', 'green').fadeIn();
                        // 成功后可以禁用打分区域,或者更新平均分显示
                        $('#ratingStars').off().find('.star').css('cursor', 'not-allowed');
                        $('#submitRatingBtn').prop('disabled', true);
                        // 考虑重新加载当前平均分或者通过AJAX更新
                        // 比如:$('#current-avg-score').text(response.new_avg_score);
                    } else {
                        $('#ratingMessage').text('评分失败:' + response.info).css('color', 'red').fadeIn();
                    }
                    setTimeout(() => $('#ratingMessage').fadeOut(), 3000); // 3秒后消息消失
                },
                error: function() {
                    $('#ratingMessage').text('网络错误,请稍后再试。').css('color', 'red').fadeIn();
                    setTimeout(() => $('#ratingMessage').fadeOut(), 3000);
                }
            });
        });
    });
    </script>
    登录后复制

第二步:美化与交互(评分显示设置)

这部分主要是CSS的工作,让那些“☆”变成漂亮的星星,并有hover效果。

  1. 添加CSS样式: 在你的模板文件

    head
    登录后复制
    部分或者外部CSS文件中添加。

    <style>
    .rating-stars {
        display: inline-block;
        font-size: 24px; /* 星星大小 */
        cursor: pointer;
        user-select: none; /* 防止文字被选中 */
    }
    .rating-stars .star {
        color: #ccc; /* 默认灰色 */
        transition: color 0.2s ease;
    }
    .rating-stars .star.hovered,
    .rating-stars .star.active {
        color: #FFD700; /* 选中或hover时的金色 */
    }
    .submit-rating-btn {
        padding: 8px 15px;
        background-color: #007bff;
        color: white;
        border: none;
        border-radius: 4px;
        cursor: pointer;
        margin-left: 10px;
    }
    .submit-rating-btn:hover {
        background-color: #0056b3;
    }
    .submit-rating-btn:disabled {
        background-color: #cccccc;
        cursor: not-allowed;
    }
    </style>
    登录后复制

    通过这些步骤,一个基本的DedeCMS评分功能就搭建起来了。当然,这只是一个起点,你可能还需要根据实际需求进行更多的定制和优化。

如何确保评分数据的准确性和防刷机制?

在我的实际操作中,评分功能上线后,最让人头疼的往往不是技术实现本身,而是如何保证那些分数是真实、有效的,而不是被恶意刷上去的。这就像盖房子,结构搭好了,还得防贼。

确保数据准确性:

AGI-Eval评测社区
AGI-Eval评测社区

AI大模型评测社区

AGI-Eval评测社区 63
查看详情 AGI-Eval评测社区
  1. 平均分计算逻辑: DedeCMS内置的
    {dede:field.scores /}
    登录后复制
    标签会从
    dede_feedback
    登录后复制
    表中获取所有与该文章相关的评分并计算平均值。你需要确保这个计算过程是正确的,通常DedeCMS在这方面做得还不错。如果需要更复杂的加权平均,那可能需要自己写SQL查询或者PHP代码来处理。
  2. 数据清洗: 定期检查评分数据,如果发现某个IP或者用户在短时间内给大量文章打高分或低分,或者分数分布极其不自然(比如全是5分或全是1分),就需要警惕。

防刷机制:

这部分是重中之重,没有防刷,评分功能很可能变成摆设甚至负面影响。

  1. IP限制: 最常见也最直接的方法。限制一个IP地址在一定时间内(比如24小时)只能对同一篇文章评分一次。DedeCMS的
    dede_feedback
    登录后复制
    表里有
    ip
    登录后复制
    字段,可以利用它。
    • 实现思路:
      feedback_js.php
      登录后复制
      处理评分提交时,查询
      dede_feedback
      登录后复制
      表,检查当前IP和文章ID是否存在已有的评分记录。
  2. 用户ID限制: 对于注册用户,可以限制一个用户ID只能对同一篇文章评分一次。这比IP限制更可靠,因为IP可以更换。
    • 实现思路: 同样在
      feedback_js.php
      登录后复制
      中,结合
      userid
      登录后复制
      字段进行判断。如果用户未登录,则只进行IP限制;如果已登录,则优先进行用户ID限制。
  3. 时间间隔限制: 即使是不同文章,同一个IP或用户在极短时间内连续提交评分也应被视为异常。
  4. 验证码: 如果你对评分的真实性要求极高,可以在提交评分时加入图片验证码或滑动验证。虽然DedeCMS的
    feedback_js.php
    登录后复制
    默认没有针对评分的验证码机制,但可以自行修改该文件,或者在前端JS提交前增加验证码校验。
  5. 前端JS混淆和后端验证: 别指望只靠前端JS就能防住刷分。所有的前端验证(比如分数范围、提交频率)都必须在后端
    feedback_js.php
    登录后复制
    中再次验证。恶意用户完全可以绕过你的前端JS直接发送POST请求。
  6. 人工审核/举报机制: 作为最后一道防线,提供一个举报功能,让其他用户可以举报可疑评分。后台管理员可以定期查看和删除异常评分。

我个人觉得,IP和用户ID的组合限制是DedeCMS这类系统最实用且成本最低的防刷方案。再高级一点,可能就需要结合行为分析了,但那通常超出了一般网站的需求。

DedeCMS评分功能与SEO有什么关联,如何优化?

评分功能和SEO的关系,其实比很多人想象的要深远,它不仅仅是网站内部的一个互动元素,更是搜索引擎理解你内容质量的一个重要信号。

  1. 提升用户体验和停留时间: 有评分功能的页面,用户通常会更愿意停留,去看看别人怎么评的,自己也参与一下。这无形中增加了页面的停留时间(Time on Site)和互动性,这些都是搜索引擎判断内容质量和用户满意度的间接指标。高互动性往往意味着高质量内容。

  2. 提供丰富的结果片段(Rich Snippets): 这是最直接的SEO关联。通过在页面中嵌入结构化数据(Schema Markup),你可以告诉搜索引擎这篇文章的平均评分是多少、有多少人参与评分。当你的页面在搜索结果中显示星级评分时,会显得格外醒目,大大提高点击率(CTR)。

    • 如何优化: 核心是使用
      Schema.org
      登录后复制
      AggregateRating
      登录后复制
      类型。你需要在内容页的HTML中添加JSON-LD或Microdata格式的结构化数据。
    <!-- 示例:在模板的 <head> 或 <body> 标签内添加 -->
    <script type="application/ld+json">
    {
      "@context": "https://schema.org/",
      "@type": "Article", // 或者 BlogPosting, WebPage等
      "name": "{dede:field.title /}",
      "description": "{dede:field.description function='html2text(@me)' /}",
      "image": "{dede:field.litpic /}",
      "author": {
        "@type": "Person",
        "name": "{dede:field.writer /}"
      },
      "datePublished": "{dede:field.pubdate function='MyDate(\'Y-m-d\',@me)' /}",
      "aggregateRating": {
        "@type": "AggregateRating",
        "ratingValue": "{dede:field.scores /}", // 当前平均评分
        "ratingCount": "{dede:sql query='SELECT COUNT(*) FROM dede_feedback WHERE aid = ~id~ AND scores > 0'}{/dede:sql}" // 参与评分的总人数
      }
    }
    </script>
    登录后复制

    注意:

    ratingCount
    登录后复制
    需要一个SQL查询来获取实际的评分人数,
    ~id~
    登录后复制
    会被当前文章ID替换。这个SQL可能需要你自己调整,确保能正确获取到。

  3. 关键词相关性与长尾词: 如果用户在评论中提到了文章相关的关键词,也能间接增强文章的关键词相关性。虽然评分本身不直接产生大量文本,但评分功能往往伴随着评论,而评论是产生UGC(用户生成内容)的重要来源。

我的建议是,在DedeCMS中实现评分功能时,务必把结构化数据这块做好。很多时候,星级评分在搜索结果中带来的点击率提升是立竿见影的。但也要注意,如果你的内容评分普遍很低,那显示星级反而会适得其反,所以内容质量是根本。

遇到评分功能不显示或提交失败怎么办?常见问题排查。

这玩意儿在实际部署中,总会遇到这样那样的小毛病。我个人经验是,大部分问题都出在前端脚本、模板标签或者后端接口的某个环节上。别慌,一步步来排查。

  1. 评分区域完全不显示?

    • 模板文件是否正确? 确认你修改的是当前内容模型使用的模板文件。DedeCMS有很多内容模型,每个模型可能有自己的模板。
    • HTML代码是否完整? 检查你插入的HTML代码(
      div.rating-stars
      登录后复制
      等)是否被浏览器正确解析,有没有漏掉标签或者拼写错误。
    • CSS是否加载? 检查你的CSS文件是否正确引入,或者内联样式是否被其他样式覆盖。用浏览器开发者工具(F12)检查元素样式。
  2. 星星显示了,但点击没反应或者效果不对?

    • JavaScript是否加载? 检查你的JS代码是否在页面中被正确引入,有没有JS报错(F12打开控制台看
      Console
      登录后复制
      )。常见的比如jQuery没加载或者版本冲突。
    • JS代码逻辑问题? 检查你的
      selectedScore
      登录后复制
      变量是否正确更新,事件监听器是否绑定成功。
    • jQuery冲突? DedeCMS自带的jQuery版本可能较老,或者你引入了其他JS库导致
      $
      登录后复制
      符号冲突。可以尝试使用
      jQuery.noConflict()
      登录后复制
      来解决。
  3. 点击提交按钮后,提示“评分失败”或没有任何反应?

    • 检查AJAX请求: 这是最关键的一步。打开浏览器开发者工具(F12),切换到
      Network
      登录后复制
      (网络)选项卡。
      • 查看请求是否发出: 点击提交后,有没有向
        /plus/feedback_js.php
        登录后复制
        发出POST请求?
      • 查看请求参数:
        aid
        登录后复制
        scores
        登录后复制
        action=send
        登录后复制
        这些参数是否正确传递?
      • 查看服务器响应: 服务器返回了什么?是200 OK,还是404、500错误?如果返回的是JSON,
        response.state
        登录后复制
        true
        登录后复制
        还是
        false
        登录后复制
        response.info
        登录后复制
        里有什么错误信息?这些信息是排查后端问题的关键。
    • feedback_js.php
      登录后复制
      文件问题:
      • 文件是否存在? 确保
        /plus/feedback_js.php
        登录后复制
        文件存在且可访问。
      • 文件权限? 确保服务器对
        feedback_js.php
        登录后复制
        有执行权限。
      • DedeCMS核心代码修改? 如果你或其他人修改过DedeCMS的核心文件,可能影响了
        feedback_js.php
        登录后复制
        的正常运行。
      • 数据库连接问题? 检查
        data/common.inc.php
        登录后复制
        中的数据库配置是否正确,数据库是否正常运行。
    • 服务器日志: 如果AJAX请求返回500错误,通常意味着PHP代码执行出错。查看服务器的错误日志(比如Apache的error.log或Nginx的error.log),能找到具体的PHP报错信息。
    • 防刷机制误判: 检查你自定义的防刷逻辑(IP限制、用户ID限制等)是否过于严格,导致正常用户也无法提交。可以暂时关闭防刷功能进行测试。
  4. 评分显示不正确(比如一直是0分)?

    • {dede:field.scores /}
      登录后复制
      标签是否有效?
      确保你使用的DedeCMS版本支持此标签,并且它能正确获取到数据。
    • dede_feedback
      登录后复制
      表数据?
      检查数据库中
      dede_feedback
      登录后复制

以上就是DedeCMS评分功能怎么添加?评分显示如何设置?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号