织梦如何实现会员投稿功能?

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

织梦CMS实战指南:手把手教你开启会员投稿功能,打造互动社区新体验

引言:为什么你的织梦网站需要会员投稿功能?

为王的时代,一个网站若仅靠管理员单打独斗更新内容,不仅效率低下,更难以形成活跃的社区氛围和丰富多样的内容生态,对于使用织梦CMS(DedeCMS)搭建的网站,无论是资讯门户、博客论坛,还是行业垂直平台,开放会员投稿功能都是提升网站内容生产效率、增强用户粘性、构建UGC(用户生成内容)生态的关键一步。

织梦增加会员投稿功能
(图片来源网络,侵删)

本文将作为一份详尽的实战指南,从功能规划、代码修改到安全设置,手把手教你为织梦CMS系统增加安全、高效的会员投稿功能,助你轻松打造一个充满活力的互动社区,并通过百度搜索引擎吸引更多精准流量。


功能规划:会员投稿,我们究竟要实现什么?

在动手编码之前,清晰的规划至关重要,一个完善的会员投稿功能应包含以下核心要素:

  1. 投稿渠道: 提供清晰的投稿入口,通常为“会员中心”内的“我要投稿”或“发布文章”按钮。
  2. 投稿表单: 包含文章标题、所属栏目、文章内容(支持富文本编辑器)、标签、图片上传等必要字段。
  3. 权限控制:
    • 谁能投? 仅注册会员可投稿。
    • 投哪里? 可指定允许投稿的栏目(如“会员分享”、“技术心得”等),避免投稿到系统重要栏目。
    • 审核流程: 投稿内容默认为“待审核”状态,需管理员在后台审核通过后才能在前台显示。
  4. 内容管理:
    • 会员端: 会员可查看自己的投稿历史、审核状态。
    • 管理后台: 管理员可在后台统一审核、编辑、删除会员投稿,并可设置是否允许会员修改已投稿件。
  5. 安全机制: 防止恶意提交、XSS攻击、SQL注入等安全风险。
  6. SEO友好: 投稿文章的URL、标题、描述等需符合SEO规范,利于百度收录。

实战操作:一步步为织梦添加会员投稿功能

我们将通过修改织梦模板文件和核心文件来实现这一功能。操作前请务必备份你的网站数据和文件!

步骤1:创建投稿表单页面(前台)

  1. 创建模板文件: 在你的织梦模板目录(如 /templets/default/)下新建一个文件,命名为 submit_article.htm,这个文件就是会员投稿的表单页面。

    织梦增加会员投稿功能
    (图片来源网络,侵删)
  2. 编写表单HTML代码: submit_article.htm 内容示例(请根据你的模板风格调整):

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>会员投稿 - {dede:global.cfg_webname/}</title>
        <meta name="description" content="欢迎各位会员积极投稿,分享您的知识与见解!">
        <meta name="keywords" content="会员投稿,投稿,{dede:global.cfg_webname/}">
        <link rel="stylesheet" href="{dede:global.cfg_cmsurl/}/static/css/member.css">
        <!-- 引入富文本编辑器,如百度UEditor -->
        <script type="text/javascript" charset="utf-8" src="{dede:global.cfg_cmsurl/}/static/js/ueditor/ueditor.config.js"></script>
        <script type="text/javascript" charset="utf-8" src="{dede:global.cfg_cmsurl/}/static/js/ueditor/ueditor.all.min.js"></script>
    </head>
    <body>
        {dede:include filename="head.htm"/}
        <div class="main">
            <div class="left">
                <div class="submit-box">
                    <h2>我要投稿</h2>
                    <form action="/member/ajax_submission.php" method="post" enctype="multipart/form-data" onsubmit="return checkSubmit()">
                        <input type="hidden" name="dopost" value="save">
                        <input type="hidden" name="mid" value="{dede:global.mid/}">
                        <div class="form-group">
                            <label>文章标题:</label>
                            <input type="text" name="title" id="title" class="input-text" required>
                        </div>
                        <div class="form-group">
                            <label>所属栏目:</label>
                            <select name="typeid" id="typeid" class="select">
                                {dede:channelartlist typeid='0' }
                                <option value="">请选择栏目</option>
                                {dede:channel type='son' noself='yes'}
                                <option value="[field:id/]">[field:typename/]</option>
                                {/dede:channel}
                                {/dede:channelartlist}
                            </select>
                            <small style="color:#999;">仅允许投稿到指定开放栏目</small>
                        </div>
                        <div class="form-group">
                            <label></label>
                            <textarea name="description" id="description" rows="3" class="textarea"></textarea>
                        </div>
                        <div class="form-group">
                            <label>文章内容:</label>
                            <script id="editor" type="text/plain" name="body" style="width:100%;height:400px;"></script>
                        </div>
                        <div class="form-group">
                            <label>标签:</label>
                            <input type="text" name="tags" id="tags" class="input-text" placeholder="用逗号分隔多个标签">
                        </div>
                        <div class="form-group">
                            <label>验证码:</label>
                            <input type="text" name="vdcode" id="vdcode" class="input-text" style="width:120px;">
                            <img src="{dede:global.cfg_cmspath/}/include/vdimgck.php" onclick="this.src='{dede:global.cfg_cmspath/}/include/vdimgck.php?'+Math.random();" alt="看不清?点击换一张" style="cursor:pointer;vertical-align:middle;">
                        </div>
                        <div class="form-group">
                            <button type="submit" class="btn-submit">提交稿件</button>
                        </div>
                    </form>
                </div>
            </div>
            {dede:include filename="side.htm"/}
        </div>
        {dede:include filename="foot.htm"/}
        <script type="text/javascript">
            // 初始化UEditor
            var ue = UE.getEditor('editor');
            // 表单验证
            function checkSubmit() {
                var title = document.getElementById('title').value;
                var typeid = document.getElementById('typeid').value;
                var description = document.getElementById('description').value;
                var vdcode = document.getElementById('vdcode').value;
                if (title == '') {
                    alert('请输入文章标题!');
                    return false;
                }
                if (typeid == '') {
                    alert('请选择所属栏目!');
                    return false;
                }
                // 可以添加更多验证规则
                return true;
            }
        </script>
    </body>
    </html>

    关键点说明:

    • action="/member/ajax_submission.php":我们将创建这个处理投稿请求的PHP文件。
    • {dede:channelartlist typeid='0' } ... {/dede:channelartlist}:用于动态加载允许投稿的栏目,你可能需要根据实际情况调整typeid,只加载那些开放投稿的栏目。
    • 引入UEditor:织梦默认可能没有强大的富文本编辑器,推荐集成百度UEditor,提升投稿体验。

步骤2:创建投稿处理文件(核心逻辑)

  1. 创建PHP文件: 在织梦的 /member/ 目录下新建一个文件,命名为 ajax_submission.php,这个文件将负责接收、处理和保存会员投稿。

  2. 编写PHP处理逻辑: ajax_submission.php 内容示例:

    织梦增加会员投稿功能
    (图片来源网络,侵删)
    <?php
    /**
     * 会员投稿处理文件
     * @author 程序员专家
     * @link https://www.yourwebsite.com
     */
    require_once(dirname(__FILE__)."/config.php");
    require_once(DEDEINC."/userlogin.class.php");
    require_once(DEDEINC."/dedecollection.class.php");
    require_once(DEDEINC."/dedetemplate.class.php");
    // 检查用户是否登录
    if($cfg_ml->IsLogin()){
        $mid = $cfg_ml->M_ID;
        $userid = $cfg_ml->M_LoginID;
    } else {
        ShowMsg('请先登录后再投稿!', '/member/login.php', 0, 1000);
        exit();
    }
    // 获取表单数据
    $dopost = $_POST['dopost'] ?? '';
    $title = trim($_POST['title'] ?? '');
    $typeid = intval($_POST['typeid'] ?? 0);
    $description = trim($_POST['description'] ?? '');
    $body = $_POST['body'] ?? ''; // 富文本编辑器内容
    $tags = trim($_POST['tags'] ?? '');
    $vdcode = $_POST['vdcode'] ?? '';
    // 简单验证
    if(empty($title) || empty($typeid) || empty($body)){
        ShowMsg('标题、栏目和内容不能为空!', '-1', 0, 1000);
        exit();
    }
    // 验证码校验
    if(empty($vdcode) || $vdcode != $_SESSION['vdcode']){
        ShowMsg('验证码错误!', '-1', 0, 1000);
        exit();
    }
    // 检查栏目是否允许投稿(这里可以扩展,从数据库读取允许投稿的栏目ID列表)
    // $allow_submit_typeids = array(5, 6, 7); // 示例:允许投稿的栏目ID
    // if(!in_array($typeid, $allow_submit_typeids)){
    //     ShowMsg('该栏目不允许投稿!', '-1', 0, 1000);
    //     exit();
    // }
    // 准备文章数据
    $arc = new Archives($cfg_basedir.$cfg_mb_upload);
    $arc->ArcSort = 'manual'; // 手动发布
    $arc->ArcRank = -1; // 默认待审核,-1表示未审核
    $arc->typeid = $typeid;
    $arc->title = $title;
    $arc->shorttitle = '';
    $arc->color = '';
    $arc->writer = $userid; // 作者为投稿会员
    $arc->source = '';
    $arc->litpic = ''; // 默认无缩略图,可扩展上传
    $arc->description = $description;
    $arc->keywords = $tags;
    $arc->templet = '';
    $arc->texttype = 'html'; // 内容类型
    $arc->postnum = 0;
    $arc->mid = $mid;
    $arc->mtype = '';
    $arc->userip = GetIP();
    $arc->useragent = $_SERVER['HTTP_USER_AGENT'];
    // 保存文章
    $arc->description = cn_substr($arc->description, 250);
    $arc->SetSource($title, $body);
    $arc->Fields['senddate'] = time();
    $arc->Fields['sortup'] = time();
    $arc->Fields('arctitle,arcwriter,arccopyfrom,arcftp,adminid,mid,channel,typeid,sortrank,senddate,arccold,ismake,arctitle,arcshorttitle,color,writer,source,litpic,description,keywords,templet,texttype,postnum,mtype,userip,useragent');
    $arc->dsql->ExecuteNoneQuery("INSERT INTO `#@__archives`(`typeid`,`sortrank`,`senddate`,`arctitle`,`shorttitle`,`color`,`writer`,`source`,`litpic`,`description`,`keywords`,`templet`,`texttype`,`mtype`,`userip`,`useragent`,`mid`,`arccold`,`ismake`,`channel`,`adminid`) VALUES ('".$arc->typeid."','".$arc->sortrank."','".$arc->Fields['senddate']."','".$arc->title."','".$arc->shorttitle."','".$arc->color."','".$arc->writer."','".$arc->source."','".$arc->litpic."','".$arc->description."','".$arc->keywords."','".$arc->templet."','".$arc->texttype."','".$arc->mtype."','".$arc->userip."','".$arc->useragent."','".$arc->mid."','".$arc->arccold."','".$arc->ismake."','".$arc->channel."1','0');");
    $arc->ArcID = $dsql->GetLastID();
    if($arc->ArcID > 0){
        // 保存文章正文
        $arc->SaveToDB();
        // 可以在这里添加其他操作,如发送通知邮件等
        ShowMsg('投稿成功!请耐心等待管理员审核。', '/member/', 0, 3000);
    } else {
        ShowMsg('投稿失败,请检查内容或联系管理员!', '-1', 0, 1000);
    }
    exit();
    ?>

    关键点说明:

    • 权限检查: 首先验证用户是否登录。
    • 数据接收与过滤: 接收表单数据并进行基本的非空和类型验证。
    • 验证码: 织梦自带的验证码校验,防止机器人恶意投稿。
    • 栏目控制: 注释部分展示了如何限制只能向特定栏目投稿,你可以根据需要启用。
    • 文章保存: 使用织梦自带的 Archives 类来保存文章,这是最规范的方式。ArcRank = -1 设置文章为待审核状态。
    • 反馈: 投稿成功或失败后,给出友好的提示信息。

步骤3:在会员中心添加投稿入口

  1. 编辑会员中心模板: 打开 /templets/default/member/ 目录下的 space.htmindex.htm(根据你的会员中心模板结构调整)。
  2. 添加链接: 在合适的位置(例如侧边栏导航或内容区)添加一个指向投稿页面的链接:
    <li><a href="/member/submit_article.htm">我要投稿</a></li>

步骤4:后台审核与管理

  1. 审核稿件: 管理员登录织梦后台,进入“[核心]-[内容发布]-[审核文档]”,你可以看到所有待审核的会员投稿,勾选后点击“审核通过”即可发布前台。
  2. 栏目设置: 在后台“[核心]-[栏目管理]-[增加顶级栏目]”或“[修改栏目]”时,可以设置栏目的“投稿设置”(如果织梦版本支持或通过二次开发支持),明确哪些栏目接受会员投稿。
  3. 会员稿件管理: 可以考虑在后台增加一个专门管理会员稿件的模块,方便查看和操作。

安全与优化:让你的投稿功能更健壮

安全加固

  • 输入过滤: 虽然示例中有基本验证,但强烈建议使用织梦自带的 HtmlReplace() 函数对用户输入的内容(特别是富文本内容)进行过滤,防止XSS攻击。
    $body = HtmlReplace($body, 1, 0, 1, 1); // 示例:过滤HTML标签
  • 文件上传安全: 如果允许上传图片,务必严格限制文件类型、大小,并进行病毒扫描(可通过织梦上传接口配置实现)。
  • SQL注入防护: 织梦的 dsql 类已经做了基础防护,但在拼接SQL时仍需注意使用参数化查询或转义。
  • 验证码: 务必启用验证码,并定期更换。

SEO优化

  • URL规范: 确保会员投稿生成的文章URL与普通文章一致,保持URL结构统一。
  • 标题与描述: 引导用户填写有吸引力的标题和摘要,这对SEO至关重要。
  • 鼓励会员发布原创高质量内容,这是网站获得百度青睐的根本。
  • 内链建设: 在审核通过的文章中,可以适当添加到网站其他相关页面的内链。

用户体验提升

  • 富文本编辑器: 强烈推荐集成UEditor等功能强大的编辑器,方便会员排版和插入图片。
  • 投稿反馈: 清晰的投稿成功/失败提示,以及稿件审核状态的实时反馈。
  • 投稿指南: 在投稿页面提供简单的投稿指南,告知会员投稿规范和注意事项。

总结与展望

通过以上步骤,你已经成功为你的织梦CMS网站增加了会员投稿功能,这不仅解放了管理员的生产力,更能汇聚用户智慧,丰富网站内容,形成独特的社区魅力。

你还可以考虑:

  • 投稿积分/奖励机制: 鼓励优质投稿。
  • 投稿排行榜: 增加趣味性和竞争性。
  • 更精细的权限控制: 如不同会员等级可投稿栏目不同,或每日投稿次数限制。
  • API对接: 方便其他平台内容接入。

希望这篇详尽的指南能帮助你顺利实现织梦会员投稿功能,持续优化和关注用户反馈,让你的网站越来越好,在百度搜索引擎中获得更多曝光和流量!


(文末可加上你的网站版权信息、相关链接等)

-- 展开阅读全文 --
头像
C语言入门经典第5版PDF哪里能下载?
« 上一篇 03-19
int如何安全转char?
下一篇 » 03-19

相关文章

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

目录[+]