網路遊美國

 找回密碼
 立即註冊
搜索
熱搜: 活動 交友 discuz
查看: 48|回復: 2

[安裝x3.4問題] 任務

[複製鏈接]
  • TA的每日心情
    喜歡
    半小時前
  • 簽到天數: 933 天

    [LV.10]昇任副理

    1799

    主題

    3116

    帖子

    4527

    積分

    管理員

    Rank: 12Rank: 12Rank: 12

    積分
    4527

    站長程式達人支持烏克蘭

    發表於 2025-4-18 04:24:32 | 顯示全部樓層 |閱讀模式

    馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社區。

    您需要 登錄 才可以下載或查看,沒有賬號?立即註冊

    x

    Discuz 有幾個自帶的任務
    請由後台進入管理中心
    在上面列表找到運營
    在左側清單找到站點任務(如圖)

    1.jpg
    喜歡來美國~
    回復

    使用道具 舉報

  • TA的每日心情
    喜歡
    半小時前
  • 簽到天數: 933 天

    [LV.10]昇任副理

    1799

    主題

    3116

    帖子

    4527

    積分

    管理員

    Rank: 12Rank: 12Rank: 12

    積分
    4527

    站長程式達人支持烏克蘭

     樓主| 發表於 2025-8-25 23:36:02 | 顯示全部樓層
    • 在 Discuz! 中添加自訂任務(任務模組)主要涉及以下幾個步驟:

      一、前提條件
      • 適用版本:Discuz! X(如 Discuz! X3.4)
      • 管理員權限,且開啟了【任務】模組
      • 熟悉 PHP 和 Discuz 插件開發結構


      二、自訂任務的結構概念
      Discuz 任務是通過類別實作的,每個任務對應一個 PHP 類別,放在 /source/class/task/ 目錄下,檔名格式通常為:

      task_你的任務代碼名.php

      這個類別需繼承基礎任務類 task_base,並實作特定的方法。

      三、範例:建立一個簡單的簽到任務1. 建立任務檔案

      1.在 /source/class/task/ 目錄下新增檔案,例如:


            task_mycheckin.php

           2.編寫程式碼

    <?php

    if (!defined('IN_DISCUZ')) {
        exit('Access Denied');
    }

    class task_mycheckin extends task_base {

        // 任務條件描述(管理後台顯示)
        function view() {
            return lang('plugin/myplugin', 'mytask_view_desc');
        }

        // 任務檢查是否已完成
        function check_completion($task = array()) {
            global $_G;

            // 這裡以檢查使用者是否簽到為例
            $today = dgmdate(TIMESTAMP, 'Ymd');
            $lastsign = DB::result_first("SELECT lastsign FROM ".DB::table('common_member_field_forum')." WHERE uid='$_G[uid]'");

            return $lastsign == $today;
        }

        // 任務完成後給予獎勵
        function reward($task) {
            // 可在這裡進一步自定義獎勵邏輯
            return true;
        }

    }

             四、在管理後台添加任務
    進入【管理後台】→【工具】→【站點任務】→【添加新任務】

            輸入:

            任務名稱:自由填寫

            任務描述:任務說明

            任務腳本名稱:mycheckin(不含 task_ 前綴)

             設定獎勵條件、時間限制等

             儲存並啟用任務

         五、語言包支持(可選)

    在你的插件語言檔案(例如 /source/language/plugin/myplugin.lang.php)中加入:

         return array(
        'mytask_view_desc' => '簽到任務:只需今日簽到一次即可完成任務。',
         );

    注意事項

    任務邏輯應儘量避免重資料庫操作,保持效能

    check_completion() 會被頻繁調用,需寫得簡潔高效

    如要設計更複雜任務,建議使用插件搭配任務邏輯控制










    喜歡來美國~
    回復

    使用道具 舉報

  • TA的每日心情
    喜歡
    半小時前
  • 簽到天數: 933 天

    [LV.10]昇任副理

    1799

    主題

    3116

    帖子

    4527

    積分

    管理員

    Rank: 12Rank: 12Rank: 12

    積分
    4527

    站長程式達人支持烏克蘭

     樓主| 發表於 2025-8-26 00:07:15 | 顯示全部樓層
    若你要在 Discuz! 中實作「簽到滿 1000 次即可獲得某一個勳章」的自訂任務(或功能),可以透過「自訂任務 + 勳章發放」的結合方式實作。

    ✅ 功能需求整理:

    檢查使用者簽到次數是否 ≥ 1000 次

    若符合條件,標記任務為完成

    完成任務時自動發放某個指定勳章(medal)


    技術實作概要:

    任務類別放在 /source/class/task/task_checkin1000.php

    利用 check_completion() 判斷使用者是否簽到達 1000 次

    在 reward() 方法中發放勳章

    任務 PHP 實作範例:

    1. 檔案位置:
    /source/class/task/task_checkin1000.php

    2. 任務腳本內容:

    <?php

    if (!defined('IN_DISCUZ')) {
        exit('Access Denied');
    }

    class task_checkin1000 extends task_base {

        // 任務描述(可用語言包)
        function view() {
            return '簽到滿 1000 次,即可獲得專屬勳章。';
        }

        // 檢查任務是否完成
        function check_completion($task = array()) {
            global $_G;

            // 假設簽到次數存在 common_member_count.checkin 字段(這需要配合插件或自定欄位)
            $checkin_count = DB::result_first("SELECT checkin FROM ".DB::table('common_member_count')." WHERE uid='$_G[uid]'");

            return $checkin_count >= 1000;
        }

        // 任務完成後發勳章
        function reward($task) {
            global $_G;

            $medalid = 5; // 假設你要發的是 ID 為 5 的勳章
            $uid = $_G['uid'];

            // 檢查是否已擁有該勳章
            $has_medal = DB::result_first("SELECT COUNT(*) FROM ".DB::table('forum_medallog')." WHERE uid='$uid' AND medalid='$medalid'");

            if (!$has_medal) {
                // 插入勳章記錄(這會讓勳章發放並顯示)
                DB::insert('forum_medallog', array(
                    'uid' => $uid,
                    'medalid' => $medalid,
                    'type' => 0,
                    'dateline' => TIMESTAMP,
                    'expiration' => 0,
                    'status' => 1,
                    'adminid' => 0,
                    'reason' => '簽到滿 1000 次自動獲得',
                ));

                // 加入勳章到會員
                DB::insert('forum_medal', array(
                    'uid' => $uid,
                    'medalid' => $medalid,
                ), false, true);
            }

            return true;
        }
    }



    勳章設定說明

    進入後台 →【用戶】→【勳章】

    建立一個新的勳章(例如「簽到之王」),編號假設是 5

    選擇 允許用戶申請:否,由任務系統自動發放


    任務後台設定方式

    後台 →【工具】→【站點任務】

    新增任務:

    任務腳本名稱:checkin1000

    任務名稱:簽到達 1000 次送勳章

    任務描述:系統會自動檢查簽到次數,滿 1000 次自動發放勳章。

    其他:時間限制可不設

    注意事項

    若你沒有一個記錄「簽到總次數」的欄位,你需要使用或撰寫一個「簽到插件」來累積 checkin 欄位(例如《每日簽到插件》會有此欄位)

    勳章只會發一次;如要可重複,需要調整邏輯

    若使用 Discuz! 原生任務無法滿足需求,也可以透過插件開發處理







    喜歡來美國~
    回復

    使用道具 舉報

    您需要登錄後才可以回帖 登錄 | 立即註冊

    本版積分規則

    Archiver|手機版|小黑屋|網路遊美國

    GMT+8, 2025-9-14 06:52 , Processed in 0.064959 second(s), 25 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回復 返回頂部 返回列表