dede顶一下数据如何获取或修改?

99ANYc3cd6
预计阅读时长 12 分钟
位置: 首页 DEDE建站 正文

dede_votes

DedeCMS 的所有“顶一下”、“踩一下”之类的投票数据,都统一存储在数据库的 dede_votes 表中,这个表是理解整个功能的关键。

dede 顶一下 数据
(图片来源网络,侵删)

dede_votes 表结构分析

这个表主要有以下几个关键字段:

字段名 数据类型 说明 示例数据
id int(10) unsigned 主键,自增ID 1, 2, 3, ...
typeid int(10) unsigned 关联的栏目ID,这是关键,用于区分不同栏目下的投票。 1 (新闻栏目), 4 (产品栏目)
ip char(20) 投票者的IP地址,用于防止同一IP重复投票。 0.0.1, 168.1.100
vote int(10) unsigned 投票的时间戳,记录投票发生的时间,方便统计和清理。 1678886400 (对应2025-03-15)
arcid int(10) unsigned 关联的文章ID,如果投票是针对某个具体内容的,这个字段就存文章ID。 123 (文章ID为123的文章)
usertype smallint(6) 用户类型,0代表匿名用户,1代表注册会员。 0
userid int(10) unsigned 用户ID,如果用户是注册会员,这里存会员的ID;匿名则为0。 0 或 15 (会员ID为15)

“顶一下”功能的完整数据流程

下面我们通过一个完整的用户操作流程,来理解数据是如何变化的。

前端触发

用户在文章页面上点击“顶一下”按钮,这个按钮通常是一个 <a> 标签,并带有一个 onclick 事件,

<a href="javascript:;" onclick="postDigg('good', 123)">顶一下</a>
  • postDigg: 这是 DedeCMS 内置的 JavaScript 函数名。
  • 'good': 表示“顶”这个动作,如果是 'bad',则代表“踩”。
  • 123: 这是当前文章的 ID,非常重要,JavaScript 会把它作为参数传递给后台。

JavaScript 发送请求

postDigg 函数会阻止默认的链接跳转,然后通过 AJAX (Asynchronous JavaScript and XML) 技术,向服务器发送一个异步请求,请求的 URL 类似这样:

dede 顶一下 数据
(图片来源网络,侵删)

/plus/digg_ajax.php?action=good&aid=123

  • digg_ajax.php: 这是处理投票请求的后台脚本。
  • action=good: 告诉服务器,这是一个“顶”的操作。
  • aid=123: 告诉服务器,这个投票是针对文章ID为123的。

后台处理 (digg_ajax.php)

这是整个逻辑的核心。digg_ajax.php 接收到请求后,会执行以下步骤:

a. 获取参数 从 URL 中获取 action (操作类型) 和 aid (文章ID)。

b. 安全检查

dede 顶一下 数据
(图片来源网络,侵删)
  • 检查是否关闭投票:会检查该文章或栏目是否在后台设置了禁止投票。
  • 检查是否重复投票
    1. 获取用户的 IP地址用户ID(如果已登录)。
    2. 拼接一个查询条件,去 dede_votes 表里查找是否存在相同的记录。
    3. 查询条件通常是:WHERE arcid = '123' AND (ip = '用户IP' OR userid = '用户ID')
    4. 如果查找到记录,说明该用户(IP或账号)已经投过票了,脚本会返回一个 JSON 格式的错误信息,{"status":-1,"info":"您已经投过票了!"},前端 JavaScript 收到后,会弹窗提示用户。
    5. 如果没有查找到记录,则继续下一步。

c. 数据入库 如果检查通过,就会向 dede_votes 表中插入一条新记录:

INSERT INTO `dede_votes` (`typeid`, `ip`, `vote`, `arcid`, `usertype`, `userid`) 
VALUES 
(文章的栏目ID, '用户的IP地址', UNIX_TIMESTAMP(), 123, 0, 0);
  • typeid: 需要根据 aid 去文章表 dede_archives 中查询得到。
  • vote: 使用 UNIX_TIMESTAMP() 函数获取当前的时间戳。
  • arcid: 就是从前端传过来的文章ID 123
  • usertypeuserid: 根据用户是否登录来设置。

d. 更新文章的顶数 为了在前台快速显示顶的数量,DedeCMS 会在文章附加表 dede_archives 中增加一个字段(通常是 clickdigg)来缓存票数。digg_ajax.php 在插入投票记录后,会执行一条 UPDATE 语句,将该文章的顶数加1。

UPDATE `dede_archives` SET `click` = `click` + 1 WHERE id = 123;

注意click 字段有时也用于记录点击量,具体要看网站后台的字段定义,很多模板会使用专门的 digg 字段。

e. 返回成功信息 处理完毕后,脚本会返回一个 JSON 格式的成功信息,{"status":1,"info":"投票成功!","diggcount":25}diggcount 是更新后的总票数。

前端显示

前端 JavaScript 收到服务器的成功响应后:

  1. 解析 JSON 数据。
  2. info 的内容显示在页面上(用 alert 或一个 div 提示)。
  3. 最重要的是,更新页面上的“顶一下”按钮旁边的数字,将其改为服务器返回的 diggcount(从 24 变成 25),这样用户就能立即看到自己的投票生效了。

如何在后台查看和管理“顶一下”数据?

  1. 查看数据: 登录你的 DedeCMS 后台,进入 [系统] -> [SQL命令工具]。 在命令框中输入以下 SQL 语句,然后执行,就可以看到所有投票记录:

    SELECT * FROM `dede_votes` ORDER BY `vote` DESC;

    你可以加上 WHERE 条件来筛选,比如只看某篇文章的投票:

    SELECT * FROM `dede_votes` WHERE `arcid` = 123;
  2. 数据清理: 如果需要清理“顶一下”的数据(比如测试数据),可以直接在 dede_votes 表中删除记录,别忘了将对应文章的 click 字段(或 digg 字段)数值也减去相应的数量。

  • 数据存储:所有“顶一下”的数据都存在 dede_votes 表里,每条记录包含投票时间、IP、文章ID、用户ID等关键信息。
  • 核心逻辑:通过 digg_ajax.php 脚本处理 AJAX 请求,核心是 防重复投票(检查IP和用户ID)和 数据入库
  • 性能优化:文章的顶数通过更新 dede_archives 表里的一个字段来缓存,避免了每次都要去 dede_votes 表里 COUNT(*),从而提高了页面加载速度。
  • 数据交互:前后端通过 JSON 格式进行数据通信,实现了无刷新投票和即时反馈。
-- 展开阅读全文 --
头像
织梦自定义字段如何实现关联?
« 上一篇 03-03
织梦手机网页搜索设置怎么弄?
下一篇 » 03-03

相关文章

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

目录[+]