浏览代码

邮件功能, 公告页面.

gwang 4 年之前
父节点
当前提交
a6f6d43110
共有 55 个文件被更改,包括 488 次插入245 次删除
  1. 23 0
      Gameserver/Amfphp/base/ErrCode.php
  2. 21 24
      Gameserver/Amfphp/model/Const/sm_sysmail.php
  3. 25 39
      Gameserver/Amfphp/model/User/EmailModel.php
  4. 196 164
      Gameserver/Amfphp/process/EmailProc.php
  5. 3 0
      Gameserver/Amfphp/test.php
  6. 二进制
      Gameserver/Public/app_files/1596438103.png
  7. 二进制
      Gameserver/Public/app_files/1596439374.jpg
  8. 二进制
      Gameserver/Public/app_files/1596440592.jpg
  9. 二进制
      Gameserver/Public/app_files/1596441068.png
  10. 二进制
      Gameserver/Public/app_files/1596442761(1).png
  11. 二进制
      Gameserver/Public/app_files/1596442761.png
  12. 二进制
      Gameserver/Public/app_files/1596442779.png
  13. 二进制
      Gameserver/Public/app_files/1596443185.png
  14. 二进制
      Gameserver/Public/app_files/1596443269.png
  15. 二进制
      Gameserver/Public/app_files/1596443328(1).png
  16. 二进制
      Gameserver/Public/app_files/1596443328.png
  17. 二进制
      Gameserver/Public/app_files/1596444458.jpg
  18. 二进制
      Gameserver/Public/app_files/1596445662.jpg
  19. 二进制
      Gameserver/Public/app_files/1596445823.jpg
  20. 二进制
      Gameserver/Public/app_files/1596445938.jpg
  21. 二进制
      Gameserver/Public/app_files/1596446539.jpg
  22. 二进制
      Gameserver/Public/app_files/1596505777.png
  23. 二进制
      Gameserver/Public/app_files/1596506110.png
  24. 二进制
      Gameserver/Public/app_files/1596506249.png
  25. 二进制
      Gameserver/Public/app_files/1596506265.png
  26. 二进制
      Gameserver/Public/app_files/1596506437.png
  27. 二进制
      Gameserver/Public/app_files/1596506740.png
  28. 二进制
      Gameserver/Public/app_files/1596506832.png
  29. 二进制
      Gameserver/Public/app_files/1596507104.png
  30. 二进制
      Gameserver/Public/app_files/1596529343.jpg
  31. 二进制
      Gameserver/Public/app_files/1596529512.jpg
  32. 二进制
      Gameserver/Public/app_files/1596529545.jpg
  33. 二进制
      Gameserver/Public/app_files/1596529719.jpg
  34. 二进制
      Gameserver/Public/app_files/1596529790.jpg
  35. 二进制
      Gameserver/Public/app_files/1596530116.jpg
  36. 二进制
      Gameserver/Public/app_files/1596532632.jpg
  37. 二进制
      Gameserver/Public/app_files/1596532679.jpg
  38. 二进制
      Gameserver/Public/app_files/1596532769.jpg
  39. 二进制
      Gameserver/Public/app_files/1596532875.jpg
  40. 二进制
      Gameserver/Public/app_files/1596533313.jpg
  41. 二进制
      Gameserver/Public/app_files/1596533388.jpg
  42. 二进制
      Gameserver/Public/app_files/1596635422.png
  43. 二进制
      Gameserver/Public/app_files/1596636105.png
  44. 0 0
      Gameserver/Public/app_files/basic.css
  45. 0 0
      Gameserver/Public/app_files/basic.js
  46. 0 0
      Gameserver/Public/app_files/index_cn.css
  47. 1 0
      Gameserver/Public/app_files/index_cn.js
  48. 8 0
      Gameserver/Public/app_files/jquery.webui-popover.min.js
  49. 1 0
      Gameserver/Public/app_files/lang_json_cn.js
  50. 二进制
      Gameserver/Public/app_files/loading.gif
  51. 33 0
      Gameserver/Public/app_files/online.css
  52. 0 0
      Gameserver/Public/app_files/webui-popover.min.css
  53. 6 0
      Gameserver/Public/app_files/webui-popover.min.js
  54. 169 5
      Gameserver/Public/gonggao.html
  55. 2 13
      Gameserver/nbproject/private/private.xml

+ 23 - 0
Gameserver/Amfphp/base/ErrCode.php

@@ -1006,6 +1006,29 @@ class ErrCode {
      */
     const rank_passsgate_unlocked = 4103;
 // </editor-fold>
+// <editor-fold defaultstate="collapsed" desc="   邮件错误码 42xx   ">
+
+    /**
+     * 邮件 - 错误的邮件id
+     */
+    const email_wrongid = 4201;
+
+    /**
+     * 邮件 - 未找到指定邮件
+     */
+    const email_not_found = 4202;
+
+    /**
+     * 邮件 - 不存在附件
+     */
+    const email_no_appendix = 4203;
+
+    /**
+     * 邮件 - 附件已领取
+     */
+    const email_appendix_drawed = 4204;
+
+// </editor-fold>
 // 
 // ------------神兽碎片融合模块错误码---------
 

+ 21 - 24
Gameserver/Amfphp/model/Const/sm_sysmail.php

@@ -1,58 +1,55 @@
 <?php
 
 ////////////////////
- // 由CodeGenerator创建。
- // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
- // author: gwang 
- // 日期: 2020-02-12 08:05:37
+// 由CodeGenerator创建。
+// Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
+// author: gwang 
+// 日期: 2020-02-12 08:05:37
 ////////////////////
 
-
 /**
  * Static Model sysmail 系统邮件
  */
-class sm_sysmail
-{
+class sm_sysmail {
 
     /**
-    * @var Int32 邮件统一编号,只能递增,不能重复使用  
-    */
+     * @var Int32 邮件统一编号,只能递增,不能重复使用  
+     */
     public $id;
 
     /**
-    * @var String 标题  
-    */
+     * @var String 标题  
+     */
     public $title;
 
     /**
-    * @var String 内容  
-    */
+     * @var String 内容  
+     */
     public $content;
 
     /**
-    * @var Int32 道具id  
-    */
+     * @var Int32 道具id  
+     */
     public $itemid;
 
     /**
-    * @var Int32 道具数量  
-    */
+     * @var Int32 道具数量  
+     */
     public $num;
 
     /**
-    * @var Int32 生效时间ts  
-    */
+     * @var Int32 生效时间ts  
+     */
     public $startts;
 
     /**
-    * @var Int32 过期/失效时间ts default(0) 
-    */
+     * @var Int32 过期/失效时间ts default(0) 
+     */
     public $endts;
 
     /**
-    * @var String 附加数据  
-    */
+     * @var String 附加数据  
+     */
     public $tag;
 
 }
-

+ 25 - 39
Gameserver/Amfphp/model/User/EmailModel.php

@@ -21,25 +21,19 @@ class EmailModel extends Object_ext {
      * 发件人uid
      * @var string
      */
-    public $uid_sender;
+    public $sender_uid;
 
     /**
      * 发件人昵称
      * @var string
      */
-    public $name_sender;
+    public $sender_name;
 
     /**
-     * 道具Id
-     * @var string
-     */
-    public $itemid;
-
-    /**
-     * 道具数量
-     * @var int
+     * 附件
+     * @var string itemId,num;itemId,num;....
      */
-    public $num;
+    public $appendix;
 
     /**
      * 邮件类型
@@ -66,16 +60,10 @@ class EmailModel extends Object_ext {
     public $tag;
 
     /**
-     * 生效时间
-     * @var ts
-     */
-    public $startts;
-
-    /**
-     * 过期时间
+     * 打开/读取邮件 时间戳
      * @var ts
      */
-    public $endts;
+    public $readts = 0;
 
     /**
      * 领取时间
@@ -87,7 +75,7 @@ class EmailModel extends Object_ext {
      * 发送时间
      * @var ts
      */
-    public $insertts;
+    public $insertts = 0;
 
     /**
      * 邮件是否已经领取
@@ -98,6 +86,14 @@ class EmailModel extends Object_ext {
         return $this->drawedts > 0;
     }
 
+    /**
+     * 计算邮件的超时时间
+     * @return type
+     */
+    public function ExpireTs() {
+        return $this->insertts + EmailProc::MaxMailExpireTs;
+    }
+
     /**
      * 邮件是否存在奖励内容
      * true = 有奖励
@@ -105,32 +101,22 @@ class EmailModel extends Object_ext {
      * @return bool
      */
     public function isExistReward() {
-        return $this->itemid > 0 && $this->num > 0;
-    }
-
-    /**
-     * 返回: 物品id,数量 的字符串
-     * @return string
-     */
-    public function getRewardStr() {
-        return $this->itemid . "," . $this->num;
+        return strlen($this->appendix) > 0;
     }
 
-    function __construct($tag = null, $type = 1, $title = "", $content = "", $itemid = 0, $num = 0, #
-            $uid_sender = "系统", $name_sender = "系统", $startts = 0, $endts = 1999999999) {
-        if (1 == func_num_args() && $tag) { # 默认的Object初始化方法
+    function __construct($tag = null, $type = 1, $title = "", $content = "", $appendix = "", #
+            $uid_sender = "系统", $name_sender = "系统") {
+        if (1 == func_num_args() && $tag) {                                     # 默认的Object初始化方法
             parent::__construct($tag);
-        } else {
+        } else {                                                                # 并非只有一个参数的情况下, tag还是tag
             $this->tag = $tag;
             $this->type = $type;
             $this->title = $title;
             $this->content = $content;
-            $this->itemid = $itemid;
-            $this->num = $num;
-            $this->uid_sender = $uid_sender;
-            $this->name_sender = $name_sender;
-            $this->startts = $startts;
-            $this->endts = $endts;
+            $this->appendix = $appendix;
+            $this->sender_uid = $uid_sender;
+            $this->sender_name = $name_sender;
+            $this->insertts = now();                                            # 初始化插入/创建时间
         }
     }
 

+ 196 - 164
Gameserver/Amfphp/process/EmailProc.php

@@ -28,28 +28,41 @@ class enum_Mail_Type extends Enum {
 
 /**
  * 邮件模块
- *
  * @author gwang
- * @version 1.0.1 经过分析, 邮件系统有性能问题. 当邮件数量较多的时候, 如何优雅的处理,
+ * @version 2.0.0 言灵世界2改版邮件系统 2020.8.13
+ *           1.0.1 经过分析, 邮件系统有性能问题. 当邮件数量较多的时候, 如何优雅的处理,
  *             代码中无解决方案.
  *           1.0.0 created 邮件系统.
  */
 class EmailProc {
 
+    /**
+     * 邮件最大容量100封
+     */
+    const MaxMailContent = 100;
+
+    /**
+     * 邮件最大过期时间7天
+     */
+    const MaxMailExpireTs = 7 * 24 * 3600;
+
+    /**
+     * 邮件日志表
+     */
     const MailLog_TableName = 'tab_mailrecord';
 
     public static function procMain($req) {
         switch ($req->cmd) {
             case CmdCode::cmd_email_questEmailList:                             # 6701 刷新邮件列表状态
                 return EmailProc::RefreshEmailList($req);
-            case CmdCode::cmd_email_readAEmail:                                 # 6702 读取邮件/领取奖励
+            case CmdCode::cmd_email_readAEmail:                                 # 6702 读取一封邮件
                 return EmailProc::ReadEmail($req);
-            case CmdCode::cmd_email_DrawReward:                                 # 6703 删除邮件
-                return EmailProc::deleteMail($req);
+            case CmdCode::cmd_email_DrawReward:                                 # 6703 领取一封邮件附件(奖励)
+                return EmailProc::DrawEmailAppendix($req);
             case CmdCode::cmd_email_DrawAllRewards:                             # 6704 领取所有邮件
-                return self::test($req);
-            case CmdCode::cmd_mail_delMailReaded:                               # 6705 删除邮件 没有条件限制
-                return EmailProc::deleteMailNoCondition($req);
+                return EmailProc::DrawAllEmailAppendixes($req);
+            case CmdCode::cmd_mail_delMailReaded:                               # 6705 删除已读邮件
+                return EmailProc::DelReadedEmail($req);
             case CmdCode::cmd_mail_notReadMailNum:                              # 6706 请求邮件未处理的数量
                 return EmailProc::queryNotReadEmails($req);
             default:
@@ -57,19 +70,20 @@ class EmailProc {
         }
     }
 
+// <editor-fold defaultstate="collapsed" desc="   API   ">
+
     /**
-     *
-     * @param type $req
+     * 【6706】查询未处理邮件数量
+     * @param req $req
      */
     static function queryNotReadEmails($req) {
         $uid = $req->uid;
         $zoneid = $req->zoneid;
-        $n = 0;
-        //删除全部标记为已读的,且没有奖励内容的邮件
-        $mails = ArrayInit();
+        $n = 0;                                                                 # 计数器
         $mails = self::getMailQueue($zoneid, $uid);
         foreach ($mails as $m) {
-            if (!$m->isDrawed()) {
+//            isEditor() and $m = new EmailModel();
+            if (!$m->readts <= 0) {
                 $n += 1;
             }
         }
@@ -77,149 +91,145 @@ class EmailProc {
     }
 
     /**
-     *
+     * 【6701】拉取最新邮件列表
      * @param Req $req
      */
-    static function test($req) {
-        if (GAME_ONLINE) {
-            return;
-        }
-        $zonid = $req->zoneid;
+    public static function RefreshEmailList($req) {
         $uid = $req->uid;
+        $zoneid = $req->zoneid;
+        self::refreshSysMail($zoneid, $uid);                                    # 更新下系统邮件
+        self::clearExpireMails($zoneid, $uid);                                  # 清理过期邮件, 以及超过容量的邮件
+        $mails = self::getMailQueue($zoneid, $uid);                             # 拉取邮件列表
+        var_dump($mails);
+        return Resp::ok(array('mailQueue' => $mails));                          # 返回值
+    }
 
-        $itemid = 399001;  # 钻石
-        $num = 3;
+    /**
+     * 【6702】读取一封邮件, 更新readts
+     * @param Req $req
+     */
+    public static function ReadEmail($req) {
 
-        $mail = new EmailModel(null, enum_Mail_Type::SysTemMail, #
-                "测试", "测试有好礼", $itemid, $num, "系统", "系统");
-        for ($i = 0; $i < 100; $i++) {
-            $mailId = self::InsertMail($zonid, $uid, $mail);
-        }
-        $req->paras[0] = $mailId;
-//        self:: ReadEmail($req);
-        return Resp::ok('ok');
+        $uid = $req->uid;
+        $zoneid = $req->zoneid;
+        $mailId = $req->paras[0];                                               # 传递参数,邮件的id字符串 
+        my_Assert($mailId, ErrCode::email_wrongid);                             # 普通读取一封邮件的逻辑
+
+        $mail = self::getMail($zoneid, $uid, $mailId);
+        $mail->readts = now();
+        self::updateMail($zoneid, $uid, $mail);                                 # 更新邮件数据
+        self::logMailReaded(array($mailId), $uid, $zoneid);                     # 更新数据库中邮件的read记录 
+        return Resp::ok(array("rewardstr" => $mail->appendix));
     }
 
     /**
-     * 刷新邮件列表状态
-     * @param Req $req
+     * 【6703】 领取一封邮件的附件,更新drawedts
+     * @param req $req
+     * @return type
      */
-    public static function RefreshEmailList($req) {
+    public static function DrawEmailAppendix($req) {
         $uid = $req->uid;
         $zoneid = $req->zoneid;
-        $mailId = $req->paras[0];                                               # Ps. 对比mailid, 推送更新包,
-#                                                                               # 第一次mailid传0, 以后传最新id,
-#                                                                               # 这样服务端发送的是增量包,节约流量
-        self::refreshSysMail($zoneid, $uid);                                    # 更新下系统邮件
-        self::clearExpireMails($zoneid, $uid);                                  # 清理过期邮件, 以及超过容量的邮件
-        $mails = self::getMailQueue($zoneid, $uid, $mailId);                    # 拉取邮件列表
-        return Resp::ok(array('mailQueue' => $mails));                          # 返回值
+        $mailId = $req->paras[0];                                               # 传递参数,邮件的id字符串  
+        my_Assert($mailId, ErrCode::email_wrongid);                             # 邮件id
+
+        $mail = self::getMail($zoneid, $uid, $mailId);                          # 取出对应的邮件数据
+        my_Assert($mail->readts > 0, ErrCode::err_innerfault);                  # 未打开的不可能调用领取接口
+        my_Assert($mail->isExistReward(), ErrCode::email_no_appendix);          # 先判断邮件,是否存在有效的奖励物品
+        my_Assert($mail->drawedts <= 0, ErrCode::email_appendix_drawed);        # 邮件不可重复领取
+        $err = StoreProc::AddMultiItemInStore($req, $mail->appendix, 4);        # 发放奖励  
+
+        my_Assert(ErrCode::ok == $err, $err);                                   # 发奖成功
+        $mail->drawedts = now();                                                # 更新领取时间戳
+        self::updateMail($zoneid, $uid, $mail);                                 # 回写邮件数据
+        self::logMailDrawed(array($mailId), $uid, $zoneid);                     # 更新数据库中邮件的领取记录 
+        UserProc::updateUserInfo();
+        return Resp::ok(array(#                                                 # 同步数据        
+                    'gold' => $req->userInfo->game->baseInfo->gold,
+                    'cash' => $req->userInfo->game->baseInfo->cash,
+                    'store' => $req->userInfo->game->store,
+                    'hero' => $req->userInfo->game->heros,
+                    'num' => 1,
+                    'reward' => $mail->appendix
+        ));
     }
 
     /**
-     * 读取一封邮件, 注意: 有删除所有邮件,但是没有一件领取好吗? 要不也加上吧
-     * @param Req $req
+     * 【6704】 领取所有邮件附件奖励
+     * @param req $req
+     * @return type
      */
-    public static function ReadEmail($req) {
+    public static function DrawAllEmailAppendixes($req) {
         $uid = $req->uid;
         $zoneid = $req->zoneid;
-        $mailId = $req->paras[0];                                               # 传递参数,邮件的id字符串
-        $arr = ArrayInit();
-        $rewardEmailIds = ArrayInit();
-        $notrewardEmails = ArrayInit();
-        $mails = ArrayInit();
-
-        if ($mailId) {                                                          # 普通读取一封邮件的逻辑
-            $mail = self::getMail($zoneid, $uid, $mailId);
-            if (!$mail) {
-                return Resp::ok(array('err' => -1, 'msg' => 'mail not found!'));
-            }
-            $mails[] = $mail;
-        } else {                                                                # 非有效mailid,执行一键领取
-            $mails = self::getMailQueue($zoneid, $uid);
-        }
-        ////如果进行的是全部领取操作
-        ////是 1 ,有奖励的邮件,全部处理,领取奖励。无奖励的邮件,不处理。因为全部领取邮件功能只限于处理有奖励的物品,无奖励的不管
-        /// 非 2 ,有奖励就领取。 无奖励,则要进行标记为已读。
-        //// 综上所述: 无论是全部还是单个邮件,
-        ////有奖励的邮件肯定要领取的,还得删掉。 无奖励的看情况, 一键领取模式则不处理,否则就标记为已读;但是不需要删掉。
-        foreach ($mails as $m) {
-            //先判断邮件,是否存在有效的奖励物品
-            if ($m->isExistReward()) {
-                $err = StoreProc::AddMultiItemInStore($req, $m->getRewardStr(), 4);
-
-                if (ErrCode::ok == $err) {                                      # 发奖成功
-                    $arr[] = $m->getRewardStr();
-                    $rewardEmailIds[] = $m->mailId;
-                    self::delMail($zoneid, $uid, $m->mailId);                   # 规则: 领取后就会删除邮件,需要跟策划确认
-                } else {                                                        # 发放物品失败或部分失败
-                    // todo: how to deal this case?
+        $arr = ArrayInit();                                                     # 记录奖励字符串
+        $rewardEmailIds = ArrayInit();                                          # 记录领取邮件id
+        $mails = self::getMailQueue($zoneid, $uid);                             # 提取邮件列表
+        // 有奖励的邮件,全部处理,领取奖励。无奖励的邮件,不处理。因为全部领取邮件功能只限于处理有奖励的物品,无奖励的不管 
+        foreach ($mails as $m) {                                                # 遍历所有邮件
+            isEditor() and $m = new EmailModel;
+            if ($m->isExistReward()) {                                          # 先判断邮件,是否存在附件
+                if ($m->drawedts > 0) {                                         # 已领取邮件跳过
+                    continue;
                 }
-            } else {
-                if ($mailId != 0) {
-                    $notrewardEmails[] = $m;
+                $err = StoreProc::AddMultiItemInStore($req, $m->appendix, 4);
+                my_Assert(ErrCode::ok == $err, $err);                           # 发奖成功
+                $m->drawedts = now();                                           # 更新下领取时间戳
+                if ($m->readts <= 0) {                                          # 更新下读取时间戳
+                    $m->readts = now();
                 }
-            }
+                $arr[] = $m->appendix;
+                $rewardEmailIds[] = $m->mailId;
+            } //  else                                                          # 无附件的邮件不管
         }
-        foreach ($notrewardEmails as $t_mail) {
-            #回写个人邮件的无奖励邮件的读取时间戳
-            $t_mail->drawedts = now();
-            self::updateMail($zoneid, $uid, $t_mail);
+        $asocMails = array();
+        foreach ($mails as $mm) {                                               # 转为关联数组
+//            isEditor() and $mm = new EmailModel;
+            $asocMails[$mm->mailId] = $mm;
         }
+        self::updateMails($zoneid, $uid, $asocMails);                           # 批量更新邮件 
         self::logMailDrawed($rewardEmailIds, $uid, $zoneid);                    # 更新数据库中邮件的领取记录
+        $n = count($rewardEmailIds);                                            # 计数,领取邮件数量
         $reward = implode(';', $arr);                                           # 拼接下奖励字符串
-        return Resp::ok(array('err' => 0,
+        UserProc::updateUserInfo();
+        return Resp::ok(array(#                                                 # 同步数据
+                    'gold' => $req->userInfo->game->baseInfo->gold,
+                    'cash' => $req->userInfo->game->baseInfo->cash,
                     'store' => $req->userInfo->game->store,
                     'hero' => $req->userInfo->game->heros,
+                    'num' => $n,
                     'reward' => $reward));
     }
 
     /**
-     * 删除邮件
-     * @param Req $req
+     * 【6705】 删除所有已读邮件
+     * @param req $req
+     * @return type
      */
-    static function deleteMail($req) {
+    public static function DelReadedEmail($req) {
         $uid = $req->uid;
         $zoneid = $req->zoneid;
-        $mailId = $req->paras[0];                                               # 邮件id, 0 or null:删除所有邮件
-        $n = 0;
-        if (!$mailId) {                                                         # null or 0 删除所有邮件
-//            $n = self::clearMailQueue($zoneid, $uid);
-            //上面操作太霸道,而且也不正确
-            $n = 0;
-            //删除全部标记为已读的,且没有奖励内容的邮件
-            $mails = ArrayInit();
-            $mails = self::getMailQueue($zoneid, $uid);
-            foreach ($mails as $m) {
-                if ($m->isDrawed() && !$m->isExistReward()) {
-                    self::delMail($zoneid, $uid, $m->mailId);
-                    $n += 1;
+        $mails = self::getMailQueue($zoneid, $uid);                             # 取邮件队列
+        $n = 0;                                                                 # 记个数,看一共删除几封邮件
+        foreach ($mails as $m) {
+            isEditor() and $m = new EmailModel;
+            if ($m->readts <= 0) {                                              # 未读邮件跳过
+                continue;
+            }
+            if ($m->isExistReward()) {                                          # 包含附件,
+                if (!$m->isDrawed()) {                                          # 且附件尚未领取的,不能删除,跳过
+                    continue;
                 }
             }
-        } else {                                                                # 传过来的是一个mailid
-            $n = self::delMail($zoneid, $uid, $mailId);
-        }
-        return Resp::ok(array('del' => $n));                                    # 返回删除的邮件数量
-    }
-
-    /**
-     * 删除邮件 没有条件限制
-     * @param type $req
-     */
-    static function deleteMailNoCondition($req) {
-        $uid = $req->uid;
-        $zoneid = $req->zoneid;
-        $mailIdStr = $req->paras[0];
-        $mids = explode(',', $req->paras[0]);                                   // 逗号分割uid字符串
-        $n = 0;
-        foreach ($mids as $mailId) {
-            self::delMail($zoneid, $uid, $mailId);
-            $n += 1;
+            self::delMail($zoneid, $uid, $m->mailId);                           # 规则: 附件领取后就可以删除邮件
+            $n++;
         }
-        return Resp::ok(array('del' => $n));                                    # 返回删除的邮件数量
+        return Resp::ok(array('num' => $n));                                    # 返回删除数量
     }
 
-    // <editor-fold defaultstate="collapsed" desc="  插入邮件">
+// </editor-fold>
+// 
+// <editor-fold defaultstate="collapsed" desc="  插入邮件">
 
     /**
      * 系统邮件 - 发送竞技场赛季排行榜奖励
@@ -236,7 +246,7 @@ class EmailProc {
                 $num = $arr[1];
                 $mail = new EmailModel(null, enum_Mail_Type::SysTemMail, "竞技场赛季上榜奖励", #
                         "恭喜您在上赛季的竞技场战斗中获得总榜" . $rkrwd->rankName . "的奖励", #
-                        $itemid, $num);
+                        "$itemid,$num");
                 self::InsertMail($zoneid, $uid, $mail);
                 break;
             }
@@ -258,7 +268,7 @@ class EmailProc {
                 $num = $arr[1];
                 $mail = new EmailModel(null, enum_Mail_Type::SysTemMail, "竞技场每日上榜奖励", #
                         "恭喜您在昨天的竞技场战斗中获得总榜" . $rkrwd->rankName . "的奖励", #
-                        $itemid, $num);
+                        "$itemid,$num");
                 self::InsertMail($zoneid, $uid, $mail);
                 break;
             }
@@ -275,10 +285,9 @@ class EmailProc {
     public static function SendDelTestMail($zoneid, $uid, $name, $content) {
         $arr = explode(',', $content);
         $itemid = $arr[0];
-        $num = intval($arr[1]);
+        $num = intval($arr[1]) * 2;                                             # 2倍返还
         $mail = new EmailModel(null, enum_Mail_Type::SysTemMail, "删档内侧补偿", #
-                "感谢您在之前的删档内侧活动中充值购买$name.", #
-                $itemid, $num * 2);                                             # 2倍返还
+                "感谢您在之前的删档内侧活动中充值购买$name.", "$itemid, $num");
         self::InsertMail($zoneid, $uid, $mail);
     }
 
@@ -294,8 +303,7 @@ class EmailProc {
      */
     public static function SendGuildApplyRefusedMail($zoneid, $uid, $guildName) {
         $mail = new EmailModel(null, enum_Mail_Type::GuildApplyRefuseMail, "公会申请结果", #
-                "很遗憾" . $guildName . "公会拒绝了您的加入申请", #
-                0, 0, "公会");
+                "很遗憾" . $guildName . "公会拒绝了您的加入申请", "", "公会");
         self::InsertMail($zoneid, $uid, $mail);
     }
 
@@ -310,8 +318,7 @@ class EmailProc {
         $itemNum = $chipArr[1];
         $content = $itemNum == null ? "请求捐献结算时间截止,没有得到捐献碎片" : "请求捐献结算时间截止,领取已获得碎片";
         $mail = new EmailModel(null, enum_Mail_Type::GuildDonateSettle, "公会捐献碎片结算", #
-                $content, #
-                $itemId, $itemNum, "公会");
+                $content, "$itemId, $itemNum", "公会");
         self::InsertMail($zoneid, $uid, $mail);
     }
 
@@ -323,8 +330,7 @@ class EmailProc {
      */
     public static function SendGuildCashGiftReward($zoneid, $uid, $itemId, $num) {
         $mail = new EmailModel(null, enum_Mail_Type::GuildCashGiftReward, "公会礼包回赠", #
-                "系统回赠礼品", #
-                $itemId, $num, "公会");
+                "系统回赠礼品", "$itemId, $num", "公会");
         self::InsertMail($zoneid, $uid, $mail);
     }
 
@@ -336,8 +342,7 @@ class EmailProc {
      */
     public static function SendGuildNoticeMail($zoneid, $uid, $title, $content) {
         $mail = new EmailModel(null, enum_Mail_Type::GuildNoticeMail, $title, #
-                $content, #
-                0, 0, "公会");
+                $content, "", "公会");
         self::InsertMail($zoneid, $uid, $mail);
     }
 
@@ -360,7 +365,7 @@ class EmailProc {
         if (!$mem->hsetnx($key_queue, $mail->mailId, $mail)) {                  # 重试下
             $mail->mailId = $mem->increment($key_id);
             if (!$mem->hsetnx($key_queue, $mail->mailId, $mail)) {
-//todo: 重试都没能成功的话, 记录下日志,  log err;
+                // todo: 重试都没能成功的话, 记录下日志,  log err;
                 CLog::err('create sysmail failed! id:' . JsonUtil::encode($mail), "EmailProc");
             }
         }
@@ -369,7 +374,7 @@ class EmailProc {
     }
 
     /**
-     *
+     * 回写mail数据
      * @param type $zoneid
      * @param type $uid
      * @param EmailModel $mail
@@ -378,36 +383,65 @@ class EmailProc {
         gMem()->hset(MemKey_User::Mail_Queue_hash($zoneid, $uid), $mail->mailId, $mail);
     }
 
+    /**
+     * 批量回写mail数据
+     * @param type $zoneid
+     * @param type $uid
+     * @param dic<mailId, EmailModel> $mails
+     */
+    private static function updateMails($zoneid, $uid, $mails) {
+        gMem()->hmset(MemKey_User::Mail_Queue_hash($zoneid, $uid), $mails);
+    }
+
+    /**
+     * 
+     * @param type $zoneid
+     * @param type $uid
+     * @param EmailModel $mail
+     */
     private static function logMail($zoneid, $uid, $mail) {
         $data = array(
             'mailId' => $mail->mailId,
             'zoneid' => $zoneid,
-            'itemid' => $mail->itemid,
-            'num' => $mail->num,
+            'appendix' => $mail->appendix,
             'type' => $mail->type,
-            'name_sender' => $mail->name_sender,
-            'uid_sender' => $mail->uid_sender,
-            'uid_to' => $uid, #                                                 # this mail is send to me 啊.
+            'sender_name' => $mail->sender_name,
+            'sender_uid' => $mail->sender_uid,
+            'to_uid' => $uid, #                                                 # this mail is send to me 啊.
             'title' => $mail->title,
             'content' => $mail->content,
-            'tag' => $mail->tag,
-            'startts' => $mail->startts,
-            'endts' => $mail->endts
+            'tag' => $mail->tag
         );
         daoInst()->insert('tab_mailrecord')->data($data)->exec();
     }
 
     /**
      * 更新邮件的领取记录
+     * @version  1 这里邮件id不是唯一, 需要联合uid一起改.--晨叶反馈于2020.5.21
+     *            0 created at 言灵世界1.0
      * @param type $ids
      */
     static function logMailDrawed($ids, $uid, $zoneid) {
-//        Err("这里邮件id不是唯一, 需要联合uid一起改.--晨叶反馈于2020.5.21");
         daoInst()->update(self::MailLog_TableName)->data(array(
                     'drawedts' => now()
                 ))->where('mailId')->in($ids)->
                 andWhere('zoneid')->eq($zoneid)->
-                andWhere('uid_to')->eq($uid)->
+                andWhere('to_uid')->eq($uid)->
+                exec();
+    }
+
+    /**
+     * 更新邮件的读取/打开记录
+     * @version  1 这里邮件id不是唯一, 需要联合uid一起改.--晨叶反馈于2020.5.21
+     *            0 created at 言灵世界1.0
+     * @param type $ids
+     */
+    static function logMailReaded($ids, $uid, $zoneid) {
+        daoInst()->update(self::MailLog_TableName)->data(array(
+                    'readts' => now()
+                ))->where('mailId')->in($ids)->
+                andWhere('zoneid')->eq($zoneid)->
+                andWhere('to_uid')->eq($uid)->
                 exec();
     }
 
@@ -419,17 +453,18 @@ class EmailProc {
      */
     private static function refreshSysMail($zoneid, $uid) {
         $mem = gMem();
-        $sysMailQueue = GameConfig::sysmail();
+        $sysMailQueue = GameConfig::sysmail();                                  # 取系统消息列表
         if (!$sysMailQueue) {
             return;                                                             # 系统消息为空
         }
         $key = MemKey_User::Mail_SysRecord_set($zoneid, $uid);                  # memkey
-        $record = $mem->smembers($key);                                         # 系统邮件处理记录,在数据集过大以前, 个人认为全部获取比较高效 --王刚,所以系统邮件不能太多呢
+        $record = $mem->smembers($key);                                         # 系统邮件处理记录,在数据集过大以前, 个人认为全部获取比较高效 --王刚,所以系统邮件不能太多呢(后面取已处理最大id,做优化吧)
         foreach ($sysMailQueue as $sysId => $sysMail) {
+            isEditor() and $sysMail = new \sm_sysmail();                        # 辅助方法.
             if (!StlUtil::arrayContains($record, $sysId)) {                     # 判断尚未处理此邮件
                 $ts = now();
                 if ($ts > $sysMail->endts) {                                    # 已经过期的系统邮件
-                    $mem->sadd($key, $sysId);                                   # 记录已经领取此邮件
+                    $mem->sadd($key, $sysId);                                   # 记录已经领取此邮件, 但不插入玩家邮件列表了.
                     continue;                                                   # 继续处理下一封
                 }
                 if ($ts < $sysMail->startts) {
@@ -437,7 +472,7 @@ class EmailProc {
                 }                                                               # else => 有效期内,继续处理
                 $mail = new EmailModel($sysMail);                               # 创建邮件
                 $mail->type = enum_Mail_Type::SysTemMail;                       # 设置邮件类型为系统邮件
-                $mail->uid_sender = $mail->name_sender = "系统";                # 设置发送者昵称和uid为系统
+                $mail->sender_uid = $mail->sender_name = "系统";                # 设置发送者昵称和uid为系统
                 self::InsertMail($zoneid, $uid, $mail);                         # 插入邮件
                 $mem->sadd($key, $sysId);                                       # 记录已经领取此邮件
             }
@@ -456,7 +491,8 @@ class EmailProc {
         $key = MemKey_User::Mail_Queue_hash($zoneid, $uid);
         $arr = $mem->hgetall($key);                                             # 所有邮件
         $del = array_filter((array) $arr, function($v) use($ts) {
-            return $v->endts < $ts;                                             # 选出过期邮件
+            $email = new EmailModel($v);
+            return $email->ExpireTs() < $ts;                                    # 选出过期邮件
         });
         if (count($del)) {                                                      # >0
             $mem->hdel($key, array_keys($del));                                 # 批量清除
@@ -464,20 +500,18 @@ class EmailProc {
     }
 
     /**
-     * 获取邮件序列[自动提取id>mailid的邮件]
+     * 获取邮件序列
      * @param int $zoneid
      * @param string $uid
-     * @param int $mailId
      * @return array
      */
-    private static function getMailQueue($zoneid, $uid, $mailId = 0) {
-        $key = MemKey_User::Mail_Queue_hash($zoneid, $uid);
-        $keys = gMem()->hkeys($key);                                            # 拉取所有id
-        $fkeys = array_filter($keys, function($v)use($mailId) {                 # 过滤邮件
-            return $v > $mailId;                                                # id 大于更新id
-        });
-        $skeys = sort($fkeys);                                                  # 排序
-        $mkeys = array_slice($fkeys, 0, 50);                                    # 取固定数量
+    private static function getMailQueue($zoneid, $uid) {
+        $key = MemKey_User::Mail_Queue_hash($zoneid, $uid);                     # redis-key:= 玩家邮件列表
+        $keys = gMem()->hkeys($key);                                            # 拉取所有id 
+        var_dump($keys);
+        sort($keys);                                                            # 排序
+        $mkeys = array_slice($keys, 0, self::MaxMailContent);                  # 取固定数量100
+        var_dump($mkeys);
         $mails = (array) gMem()->hmget($key, $mkeys);                           # mget
         $ret = array_map(function($v) {
             return new EmailModel($v);                                          # 装箱
@@ -494,10 +528,8 @@ class EmailProc {
      */
     private static function getMail($zoneid, $uid, $mailId) {
         $m = gMem()->hget(MemKey_User::Mail_Queue_hash($zoneid, $uid), $mailId);
-        if ($m) {
-            $m = new EmailModel($m);
-        }
-        return $m;
+        my_Assert($m, ErrCode::email_not_found);
+        return new EmailModel($m);
     }
 
     /**

+ 3 - 0
Gameserver/Amfphp/test.php

@@ -26,3 +26,6 @@ echo $str;
 var_dump(0 == "0");
 var_dump(is_null("0"));
 var_dump(mask($int, $mask));
+
+
+var_dump(strlen(""));

二进制
Gameserver/Public/app_files/1596438103.png


二进制
Gameserver/Public/app_files/1596439374.jpg


二进制
Gameserver/Public/app_files/1596440592.jpg


二进制
Gameserver/Public/app_files/1596441068.png


二进制
Gameserver/Public/app_files/1596442761(1).png


二进制
Gameserver/Public/app_files/1596442761.png


二进制
Gameserver/Public/app_files/1596442779.png


二进制
Gameserver/Public/app_files/1596443185.png


二进制
Gameserver/Public/app_files/1596443269.png


二进制
Gameserver/Public/app_files/1596443328(1).png


二进制
Gameserver/Public/app_files/1596443328.png


二进制
Gameserver/Public/app_files/1596444458.jpg


二进制
Gameserver/Public/app_files/1596445662.jpg


二进制
Gameserver/Public/app_files/1596445823.jpg


二进制
Gameserver/Public/app_files/1596445938.jpg


二进制
Gameserver/Public/app_files/1596446539.jpg


二进制
Gameserver/Public/app_files/1596505777.png


二进制
Gameserver/Public/app_files/1596506110.png


二进制
Gameserver/Public/app_files/1596506249.png


二进制
Gameserver/Public/app_files/1596506265.png


二进制
Gameserver/Public/app_files/1596506437.png


二进制
Gameserver/Public/app_files/1596506740.png


二进制
Gameserver/Public/app_files/1596506832.png


二进制
Gameserver/Public/app_files/1596507104.png


二进制
Gameserver/Public/app_files/1596529343.jpg


二进制
Gameserver/Public/app_files/1596529512.jpg


二进制
Gameserver/Public/app_files/1596529545.jpg


二进制
Gameserver/Public/app_files/1596529719.jpg


二进制
Gameserver/Public/app_files/1596529790.jpg


二进制
Gameserver/Public/app_files/1596530116.jpg


二进制
Gameserver/Public/app_files/1596532632.jpg


二进制
Gameserver/Public/app_files/1596532679.jpg


二进制
Gameserver/Public/app_files/1596532769.jpg


二进制
Gameserver/Public/app_files/1596532875.jpg


二进制
Gameserver/Public/app_files/1596533313.jpg


二进制
Gameserver/Public/app_files/1596533388.jpg


二进制
Gameserver/Public/app_files/1596635422.png


二进制
Gameserver/Public/app_files/1596636105.png


文件差异内容过多而无法显示
+ 0 - 0
Gameserver/Public/app_files/basic.css


文件差异内容过多而无法显示
+ 0 - 0
Gameserver/Public/app_files/basic.js


文件差异内容过多而无法显示
+ 0 - 0
Gameserver/Public/app_files/index_cn.css


文件差异内容过多而无法显示
+ 1 - 0
Gameserver/Public/app_files/index_cn.js


文件差异内容过多而无法显示
+ 8 - 0
Gameserver/Public/app_files/jquery.webui-popover.min.js


+ 1 - 0
Gameserver/Public/app_files/lang_json_cn.js

@@ -0,0 +1 @@
+window.METLANG = {"search":"搜索","home":"网站首页","success":"操作成功!","Title":"标题","Content":"内容","Online":"在线交流","Noinfo":"没有了","displayimg":"展示图片","default":"默认","Choice":"请选择","fliptext1":"查看更多","fliptext2":"加载中...","downloadtext1":"下载","tagweb":"标签","formerror1":"请填写此字段。","formerror2":"请从这些选项中选择一个。","formerror3":"请输入正确的手机号码。","formerror4":"请输入正确的Email地址。","formerror5":"两次输入的密码不一致,请重新输入。","formerror6":"请输入至少&metinfo&个字符。","formerror7":"输入不能超过&metinfo&个字符。","formerror8":"输入的字符数必须在&metinfo&之间。","read":"阅读","js46":"不能重复","confirm":"确定","cancel":"取消","opfailed":"操作失败","authen":"已认证","usercheckok":"验证成功!","img_px_tips":"图片尺寸超出系统限制(图片宽高不超过2000px)","member_cv":"简历","jsok":"操作成功","jslang3":"没有选中的记录","delete_information":"您确定要删除该信息吗?删除之后无法再恢复。","js49":"撤销。","weixinunbind":"你确定是否要解绑微信?","bindweixin":"微信绑定","accsaftips5":"微信绑定可以用于登录帐号,消息通知等功能","bound":"已绑定","unbind":"解绑","weixin_login_error":"当前语言不可使用微信登录","login_ok":"登录成功"}

二进制
Gameserver/Public/app_files/loading.gif


+ 33 - 0
Gameserver/Public/app_files/online.css

@@ -0,0 +1,33 @@
+@charset "utf-8";
+/*在线客服*/
+.onlinebox{background-color:#fff;-webkit-box-shadow:0 5px 9px rgba(4,0,0,.17);box-shadow:0 5px 9px rgba(4,0,0,.17);z-index:1699}
+.onlinebox,
+.onlinebox *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box}
+.onlinebox-box{width:160px}
+.onlinebox .onlinebox-top{padding:20px 20px 10px;background:#444;font-size:18px;color:#fff}
+.onlinebox .onlinebox-top h4{margin: 0;color: #fff;}
+.onlinebox .onlinebox-top-btn{position: absolute;top: 0;right: 10px;}
+.onlinebox .onlinebox-close,
+.onlinebox .onlinebox-min{float:right;color:#fff}
+.onlinebox .onlinebox-close{position:relative;top:-2px}
+.onlinebox .onlinebox-min{margin-right:10px}
+.onlinebox .onlinebox-close:hover,
+.onlinebox .onlinebox-min:hover{color:#fff;text-decoration:none}
+.onlinebox .onlinebox-open,
+.onlinebox.min .onlinebox-box{display:none}
+.onlinebox.min .onlinebox-open{display:block;cursor:pointer;padding:0 10px;background:#444;font-size:18px;line-height:40px;color:#fff}
+.onlinebox-center{padding:5px 0;margin-bottom:0}
+.onlinebox .list-group-item{padding:0}
+.onlinebox .list-group-item .fa,
+.onlinebox .list-group-item img{width:16px;float:left;font-size:16px;line-height:16px}
+.onlinebox .met_qq .fa{color:#62a8ea}
+.onlinebox .met_facebook .fa{color:#4267b2}
+.onlinebox .met_skype .fa{color:#00AFF0}
+.onlinebox .list-group-item img{height:16px}
+.onlinebox .list-group-item .list-group-item-text{padding:5px 1.25rem}
+.onlinebox .list-group-item .list-group-item-text:hover{background:#f8f8f8}
+.onlinebox .list-group-item .list-group-item-text a{display:block;color:#76838f}
+.onlinebox .list-group-item .list-group-item-text a:hover{text-decoration:none}
+.onlinebox .list-group-item .list-group-item-text span{display:table-cell;padding-left:5px;word-break:break-all;line-height:16px}
+.onlinebox .onlinebox-bottom{border-top:1px solid #eee;padding:.75rem 1.25rem}
+.onlinebox .onlinebox-bottom p{margin-bottom:0}

文件差异内容过多而无法显示
+ 0 - 0
Gameserver/Public/app_files/webui-popover.min.css


+ 6 - 0
Gameserver/Public/app_files/webui-popover.min.js

@@ -0,0 +1,6 @@
+/*!
+ * remark (http://getbootstrapadmin.com/remark)
+ * Copyright 2016 amazingsurge
+ * Licensed under the Themeforest Standard Licenses
+ */
+!function(global,factory){if("function"==typeof define&&define.amd)define("/Plugin/webui-popover",["exports","Plugin"],factory);else if("undefined"!=typeof exports)factory(exports,require("Plugin"));else{var mod={exports:{}};factory(mod.exports,global.Plugin),global.PluginWebuiPopover=mod.exports}}(this,function(exports,_Plugin2){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var _Plugin3=babelHelpers.interopRequireDefault(_Plugin2),NAME="webuiPopover",WebuiPopover=function(_Plugin){function WebuiPopover(){return babelHelpers.classCallCheck(this,WebuiPopover),babelHelpers.possibleConstructorReturn(this,(WebuiPopover.__proto__||Object.getPrototypeOf(WebuiPopover)).apply(this,arguments))}return babelHelpers.inherits(WebuiPopover,_Plugin),babelHelpers.createClass(WebuiPopover,[{key:"getName",value:function(){return NAME}}],[{key:"getDefaults",value:function(){return{trigger:"click",width:320,multi:!0,cloaseable:!1,style:"",delay:300,padding:!0}}}]),WebuiPopover}(_Plugin3.default);_Plugin3.default.register(NAME,WebuiPopover),exports.default=WebuiPopover});

+ 169 - 5
Gameserver/Public/gonggao.html

@@ -1,9 +1,173 @@
 <!DOCTYPE html>
+<!-- created by loyalsoft -->
 <html>
-<head><meta charset="UTF-8"></head>
-<body>
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+
+  <meta name="renderer" content="webkit">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="viewport"
+    content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,minimal-ui">
+  <meta name="format-detection" content="telephone=no">
+  <title>龙游科技</title>
+  <meta name="description" content="龙友科技 游戏 言灵世界">
+  <meta name="keywords" content="龙游科技, 游戏, 言灵世界">
+  <link href="http://www.game7000.com/loyalsoft/favicon.ico" rel="shortcut icon" type="image/x-icon">
+  <link rel="stylesheet" type="text/css" href="./app_files/basic.css">
+  <link rel="stylesheet" type="text/css" href="./app_files/index_cn.css">
+  <style>
+    body {
+      background-color: #ffffff !important;
+      font-family: mono !important;
+    } 
+  </style>  
+</head> 
+
+<body class="met-navfixed     ny-banner"> 
+  <section class="service_list_met_95_2_62     bgcolor" m-id="62">
+    <div class="container">
+      <div class="head animation-slide-bottom appear-no-repeat" data-plugin="appear" data-animate="slide-bottom"
+        data-repeat="false">
+        <h2 style="color:green;" ><b>游戏公告</b></h2>
+      </div>
+      <div class="service-list">
+        <ul class="server-tab severs-top col-lg-3 col-md-3 col-xs-3 animation-slide-left appear-no-repeat"
+          data-plugin="appear" data-animate="slide-left" data-repeat="false">
+          <li class="nav-item cur">
+            <p class="col-lg-4">
+              <img src="./app_files/1596505777.png" alt="企业展示网站" class="indeximg">
+            </p>
+            <div class="col-lg-8">
+              <p><b>版本更新公告</b></p>
+            </div>
+          </li>
+          <li class="nav-item">
+            <p class="col-lg-4">
+              <img src="./app_files/1596505777.png" alt="购物商场网站" class="indeximg">
+            </p>
+            <div class="col-lg-8">
+              <p><b>实名认证与防沉迷</b></p>
+            </div>
+          </li>
+          <li class="nav-item">
+            <p class="col-lg-4">
+              <img src="./app_files/1596506110.png" alt="高端定制网站" class="indeximg">
+            </p>
+            <div class="col-lg-8">
+              <p><b>严禁第三方交易</b></p>
+            </div>
+          </li>
+          <li class="nav-item">
+            <p class="col-lg-4">
+              <img src="./app_files/1596506265.png" alt="小程序/APP" class="indeximg">
+            </p>
+            <div class="col-lg-8">
+              <p><b>微信/小程序互动</b></p>
+            </div>
+          </li>
+        </ul>
+        <div
+          class="contantbox col-lg-9 col-md-12 col-xs-12 server-wrapper morebox animation-slide-right appear-no-repeat"
+          data-plugin="appear" data-animate="slide-right" data-repeat="false" data-leng="4" style="height: 580px;">
+          <div class="tab-pane server-con-item     active" data-bgimg="app_files/1596532769.jpg"
+            style="background-image: url(&quot;app_files/1596532769.jpg&quot;); display: block;">
+            <div class="server-con-item-wrapper animated fadeInUp">
+              <div class="server-con-item-wrapper-con">
+                <div class="server-con-item-title"><b>版本更新公告</b></div>
+                <div class="server-con-item-des"></div>
+                <p class="server-con-item-text">
+                  亲爱的指挥官:<br>
+为了给各位指挥官带来更好的游戏体验,我们决定于<font color="orange"><b>9月18日9:00</b></font>对全区全服进行停服维护,预计维护时长为90分钟,维护期间指挥官暂时无法进入游戏。如遇特殊情 况维护时间将会顺延,请指挥官们耐心等待,为您带来的不便,敬请谅解。<br>维护完成后 ,指挥官们将得到<font color="orange"><b>【钻石*300】</b></font>作为维护补偿,以邮件形式发放。</p>
+              </div>
+              <a href="http://www.game7000.com/loyalsoft/" title="企业展示网站" class="btn btn-block btn-more"
+                target="_self">前往官网</a>
+            </div>
+          </div>
+          <div class="tab-pane server-con-item     " data-bgimg="app_files/1596532632.jpg"
+            style="background-image: url(&quot;app_files/1596532632.jpg&quot;); display: none;">
+            <div class="server-con-item-wrapper animated fadeInUp">
+              <div class="server-con-item-wrapper-con">
+                <div class="server-con-item-title"><b>实名认证与防沉迷</b></div>
+                <div class="server-con-item-des"></div>
+                <p class="server-con-item-text">
+                  尊敬的指挥官:<br>
+为了响应国家最新的相关政策,方便大家平衡游戏与生活的时间,根据中华人民共和国文化和旅游部颁布的<b>《网络游戏管理暂行办法》、《关于规范网络游戏运营加强事中事后监管工作的通知》、《国家新闻出版广电总局办公厅关于深入开展网络游戏防沉迷实名验证工作的通知》</b>,《言灵世界》将于<font color="orange"><b>2020年1月1日00:00</b></font>正式开启实名制认证系统及防沉迷系统。<br><br>
+
+<b>【具体规则】</b><br>
+1.开启后,指挥官账号首次登录时将弹出实名验证窗口并开启验证,需指挥官提供<font color="orange"><b>真实身份证号</b></font>及<font color="orange"><b>姓名信息</b></font>,验证通过后此窗口将不再弹出;<br>
+2.开启后,首次登录时弹出的防沉迷实名验证窗口,指挥官可暂时关闭,但60分钟后将再次弹出验证,且<font color="orange"><b>不可再关闭</b></font>(无法体验游戏);<br>
+3.若指挥官未进行实名制登记操作,则游戏内<font color="orange"><b>无法</b></font>进行充值行为;<br>
+4.十八岁以下的未成年指挥官将受到<font color="orange"><b>登录时间</b></font>及<font color="orange"><b>游戏充值</b></font>的相关保护。<br><br>
+
+<b>【时长规则】</b><br>
+1.十八岁以下未成年的指挥官,在<font color="orange"><b>工作日</b></font>期间游戏账号累计登录游戏时长达<font color="orange"><b>90</b></font>分钟后、<font color="orange"><b>法定节假日</b></font>游戏账号累计登录游戏时长达<font color="orange"><b>180</b></font>分钟后,都将无法在当日继续游戏;<br>
+2.未成年指挥官的允许登录时段为每日<font color="orange"><b>8:00-22:00。</b></font><br><br>
+
+<b>【充值规则】</b><br>
+1.<font color="orange"><b>0-8</b></font>岁的指挥官将<font color="orange"><b>不被允许</b></font>进行充值;<br>
+2.<font color="orange"><b>8-16</b></font>岁的指挥官,单次充值额度将不超过<font color="orange"><b>50</b></font>元,单月累计充值额度将不超过<font color="orange"><b>200</b></font>元;<br>
+3.<font color="orange"><b>16-18</b></font>岁指挥官,单次充值额度将不超过<font color="orange"><b>100</b></font>元,单月累计充值额度将不超过<font color="orange"><b>400</b></font>元。<br><br>
+
+<b>【其他说明】</b><br>
+1.    未成年人的身份信息一经绑定,该账号将无法再换绑为其他人的身份信息;<br>
+2.    已绑定成年人身份信息的账号将无法换绑定为未成年人。<br><br>
+ 
+感谢大家的支持与理解!希望各位指挥官尽快完成实名验证登记,健康游戏,享受生活!</p>
+              </div>
+              <a href="http://www.game7000.com/loyalsoft/" title="购物商场网站"
+                class="btn btn-block btn-more" target="_blank">前往官网</a>
+            </div>
+          </div>
+          <div class="tab-pane server-con-item     " data-bgimg="app_files/1596532769.jpg"
+            style="background-image: url(&quot;app_files/1596532769.jpg&quot;); display: none;">
+            <div class="server-con-item-wrapper animated fadeInUp">
+              <div class="server-con-item-wrapper-con">
+                <div class="server-con-item-title"><b>严禁第三方交易</b></div>
+                <div class="server-con-item-des"></div>
+                <p class="server-con-item-text">
+                  亲爱的指挥官:<br>
+您好!<br>
+鉴于近期收到大量玩家在三方平台交易时的被盗、找回等投诉,《言灵世界》官方严正声明:官方禁止任何第三方交易平台及线下交易,请广大玩家注意游戏资产安全。<br>
+由此类交易带来的账号被盗、物品被盗、物品找回等的财产,我们会积极帮助广大玩家予以解决,但由此类交易带来的损失,官方将不能给予任何保障。<br>
+同时,为保障广大玩家财产安全,请广大玩家尽量避免不正规交易,以避免由于封号、封IP、物品被盗、账号被盗、物品找回等的影响正常游戏的情况。<br>
+账号无认证、安全等级不足的玩家,可以登录【安全管理中心】进行安全等级提升。<br>
+请广大玩家知晓并相互转告。<br>
+感谢您对《言灵世界》的支持,祝您游戏愉快! </p>
+              </div>
+              <a href="http://www.game7000.com/loyalsoft/" title="高端定制网站"
+                class="btn btn-block btn-more" target="_blank">前往官网</a>
+            </div>
+          </div>
+          <div class="tab-pane server-con-item     " data-bgimg=".app_files/1596532632.jpg"
+            style="background-image: url(&quot;app_files/1596532632.jpg&quot;); display: none;">
+            <div class="server-con-item-wrapper animated fadeInUp">
+              <div class="server-con-item-wrapper-con">
+                <div class="server-con-item-title"><b>微信/小程序互动<b></div>
+                <div class="server-con-item-des"></div>
+                <p class="server-con-item-text">
+                  专注于手机应用软件开发与服务,有很多在线app开发平台。移动互联网时代是全民的移动互联网时代,是每个企业的时代。便捷了每个人的生活,APP开发让企业开始移动信息化进程。</p>
+              </div>
+              <a href="http://www.game7000.com/loyalsoft/" title="小程序/APP"
+                class="btn btn-block btn-more" target="_blank">前往官网</a>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </section> 
+  <script src="./app_files/basic.js" ></script> 
+  <script>
+    $(function () {  
+      $(".nav-item").click(function () {            // 切换选项卡的代码 -gwang 2020年8月14日10:57:03
+        var _index = $(this).index();
+        $(".tab-pane").eq(_index).show().siblings().hide();
+        $(this).addClass("cur").siblings().removeClass("cur");
+      });
+      $(".close").click(function () {               // 返回游戏按钮   
+         
+      });
+    });
+  </script>
+</body> 
 
-    <div >
-        <a href="uniwebview://goto?module=gate&para1=1&para2=2"> test url scheme(跳转到游戏内模块)</a></div>
-</body>
 </html>

+ 2 - 13
Gameserver/nbproject/private/private.xml

@@ -13,21 +13,10 @@
     <open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
         <group>
             <file>file:/D:/local_svn/0_ylsj2019/ylsj2019Server/Gameserver/Amfphp/process/EmailProc.php</file>
-            <file>file:/D:/local_svn/0_ylsj2019/ylsj2019Server/Gameserver/Amfphp/model/User/UserInfoMo.php</file>
-            <file>file:/D:/local_svn/0_ylsj2019/ylsj2019Server/Gameserver/Amfphp/model/User/UserHeroModel.php</file>
-            <file>file:/D:/local_svn/0_ylsj2019/ylsj2019Server/Gameserver/Amfphp/util/CLog.php</file>
-            <file>file:/D:/local_svn/0_ylsj2019/ylsj2019Server/Gameserver/Amfphp/process/FightProc.php</file>
-            <file>file:/D:/local_svn/0_ylsj2019/ylsj2019Server/Gameserver/Amfphp/process/StoreProc.php</file>
-            <file>file:/D:/local_svn/0_ylsj2019/ylsj2019Server/Gameserver/Amfphp/process/TaskProc.php</file>
-            <file>file:/D:/local_svn/0_ylsj2019/ylsj2019Server/Gameserver/Amfphp/model/User/UserGameModel.php</file>
-            <file>file:/D:/local_svn/0_ylsj2019/ylsj2019Server/Gameserver/Amfphp/process/UserProc.php</file>
-            <file>file:/D:/local_svn/0_ylsj2019/ylsj2019Server/Gameserver/Amfphp/process/FightProc/SweepGatesProc.php</file>
-            <file>file:/D:/local_svn/0_ylsj2019/ylsj2019Server/Gameserver/Amfphp/model/User/UserPVPModel.php</file>
-            <file>file:/D:/local_svn/0_ylsj2019/ylsj2019Server/Gameserver/Amfphp/process/HeroProc.php</file>
-            <file>file:/D:/local_svn/0_ylsj2019/ylsj2019Server/Gameserver/Amfphp/model/User/UserGateDifficulty.php</file>
+            <file>file:/D:/local_svn/0_ylsj2019/ylsj2019Server/Gameserver/Amfphp/Services/AppServer.php</file>
+            <file>file:/D:/local_svn/0_ylsj2019/ylsj2019Server/Gameserver/Amfphp/base/ErrCode.php</file>
             <file>file:/D:/local_svn/0_ylsj2019/ylsj2019Server/Gameserver/Amfphp/model/User/EmailModel.php</file>
             <file>file:/D:/local_svn/0_ylsj2019/ylsj2019Server/Gameserver/Amfphp/base/CmdCode.php</file>
-            <file>file:/D:/local_svn/0_ylsj2019/ylsj2019Server/Gameserver/Amfphp/model/User/UserInteractModel.php</file>
         </group>
     </open-files>
 </project-private>

部分文件因为文件数量过多而无法显示