DedeCMS 技术问答

织梦自定义模型前台投稿开发

业务场景

会员中心默认只支持普通文章投稿。如果想让会员在前台投稿自定义模型内容(如提交课程、房产、招聘信息),需要扩展会员投稿模板和后台处理逻辑。常见场景包括:用户自主发布二手商品、教师上传课程、企业发布招聘等。

前台投稿开发涉及三块:投稿表单模板、投稿处理程序、审核机制。下面以“课程信息”模型为例完整演示。

第一步:开启模型投稿权限

1. 后台 → 核心频道模型内容模型管理 → 编辑“课程信息”。

2. 在“会员投稿权限”中勾选允许投稿的会员组(如“注册会员”)。

3. 在 系统系统基本参数会员设置 中确认“是否开启会员投稿”为“是”。

第二步:制作投稿表单模板

投稿表单模板位于 /member/templets/,参考系统自带的 article_add.htm 复制一份为 course_add.htm

表单核心代码

<form name="addcontent" action="course_add.php" method="post" enctype="multipart/form-data">
  <input type="hidden" name="channelid" value="-8">
  <input type="hidden" name="dopost" value="save">
  <label>课程标题:</label>
  <input type="text" name="title" required>

  <label>授课老师:</label>
  <input type="text" name="course_teacher">

  <label>课程价格:</label>
  <input type="number" name="course_price" min="0">

  <label>难度等级:</label>
  <select name="course_level">
    <option value="1">初级</option>
    <option value="2">中级</option>
    <option value="3">高级</option>
  </select>

  <label>课程大纲:</label>
  <textarea name="course_outline" rows="5"></textarea>

  <label>封面图:</label>
  <input type="file" name="course_cover">

  <button type="submit">提交投稿</button>
</form>

第三步:编写投稿处理程序

/member/ 目录下新建 course_add.php,参考 article_add.php 改造:

require_once(dirname(__FILE__)."/config.php");
require_once(DEDEINC."/image.func.php");
require_once(DEDEINC."/oxwindow.class.php");

if($dopost=='save') {
    // 1. 基础校验
    if(empty($title)) ShowMsg('标题不能为空', '-1');
    if($cfg_ml->M_ID <=0) ShowMsg('请先登录', '../login.php');

    // 2. 写入主表 archives
    $arcID=InsertArchives(array(
        'title'=> $title,
        'typeid'=> $typeid,
        'channel'=> -8,
        'mid'=> $cfg_ml->M_ID,
        'arcrank'=> -1, // 待审核
    ));

    // 3. 写入附加表 addoncourse
    $inQuery="INSERT INTO `dede_addoncourse`
        (aid, typeid, course_teacher, course_price, course_level, course_outline)
        VALUES ('$arcID', '$typeid',
        '$course_teacher', '$course_price',
        '$course_level', '$course_outline')";
    $dsql->ExecuteNoneQuery($inQuery);

    // 4. 处理封面上传
    if($_FILES['course_cover']['name']) {
        $upload=UploadOneImage('course_cover', $_FILES['course_cover']);
        $dsql->ExecuteNoneQuery("UPDATE `dede_archives` SET litpic='$upload' WHERE id='$arcID'");
    }

    ShowMsg('投稿成功,等待审核', 'content_list.php');
    exit();
}

第四步:投稿列表与编辑

会员中心需提供“我发布的课程”列表与编辑入口。复制 content_list.php 改为 course_list.php,查询条件加 channel=-8

$sql="SELECT * FROM `dede_archives`
    WHERE mid='{$cfg_ml->M_ID}' AND channel=-8
    ORDER BY id DESC";

编辑页 course_edit.php 类似,先读出附加表字段回填表单,保存时同步更新主表与附加表。

第五步:审核机制

投稿默认 arcrank=-1(待审核),后台管理员进入 核心审核文档 即可看到列表。审核通过后改为 0 才会生成静态页并对外显示。

也可开发“投稿自动审核”模块:根据会员等级、信用分自动放行,但需配套反垃圾机制(关键词过滤、IP 限制、验证码)。

注意事项

1. 投稿表单必须做服务端校验,不能只靠前端 JS,否则容易被绕过提交恶意数据。
2. 文件上传需校验类型与大小,限制为图片或指定文档格式,禁止上传 .php/.htm 等可执行文件。
3. $_POST 数据入库前必须用 htmlspecialchars 或织梦自带的 GetApiKey 处理,防止 XSS。
4. 投稿权限按会员组严格控制,避免普通注册用户能投稿敏感栏目。
5. 静态生成模式下,审核通过后需触发内容页重新生成,否则前台看不到新内容。

后续优化方向

建议为投稿系统接入“草稿箱”功能,会员可暂存未完成的内容;增加“投稿统计”面板,让会员看到审核通过率与浏览数据。同时结合反垃圾策略(同 IP 限频、敏感词过滤、验证码),降低人工审核成本。对于高价值投稿(如优质课程),可开发积分奖励机制,提升会员投稿积极性,形成内容生态正向循环。