zouyong 5 gadi atpakaļ
vecāks
revīzija
f6c28b1621

+ 2 - 2
mk_framework/assets/script/Main.ts

@@ -6,8 +6,8 @@ export default class main extends cc.Component {
         type: cc.Asset,
     })
     mainfestUrl: cc.Asset = null;
-    
+
     start() {
-        console.log(mk.time.format(12345));   
+        
     }
 }

+ 114 - 1
mk_framework/assets/script/mk/sdk/BuglySDK.ts

@@ -1,6 +1,119 @@
 export default class BuglySDK {
     constructor() {
-        
+        this.initErrorHandler();
     }
 
+    private initErrorHandler() {
+        if (cc.sys.isNative) {
+            let __handler;
+            if (window['__errorHandler']) {
+                __handler = window['__errorHandler'];
+            }
+
+            window['__errorHandler'] = function (...args) {
+                console.log('游戏报错,原生系统');
+                BuglySDK.handleError(...args);
+                if (__handler) {
+                    __handler(...args);
+                }
+            }
+        }
+        else if (cc.sys.isBrowser) {
+            let __handler;
+            if (window.onerror) {
+                __handler = window.onerror;
+            }
+            window.onerror = function (...args) {
+                console.log('游戏报错,浏览器');
+                BuglySDK.handleError(...args)
+                if (__handler) {
+                    __handler(...args);
+                }
+            }
+        }
+    }
+
+
+    /** 上次发送错误日志的时间 */
+    static lastSendErrorTime: number = new Date().getTime();
+    /** 最近发送的错误日志 */
+    static lastSendErrors: string[] = [];
+
+    static handleError(...args) {
+        //简化错误日志
+        let errors = "";
+        for (let i = 0; i < args.length; i++) {
+            if (typeof args[i] == 'string' && args[i].length > 20) {
+                errors += args[i] + '\n';
+            }
+            else if (args[i] instanceof Array) {
+                for (let j = 0; j < args[i].length; j++) {//安卓内捕获的错误优化缩减字段
+                    errors += args[i][j];
+                }
+            }
+        }
+        if (errors.indexOf('TypeError') != -1) {
+            errors = errors.slice(errors.indexOf('TypeError') + 'TypeError'.length + 2);
+        }
+        let [a, start, d, s, q] = [0, '', '', '', '[]@'];
+        while (a < errors.length) {
+            s = errors.charAt(a);
+            if (q.indexOf(s) != -1) {
+                if (start == '') {
+                    start = s;
+                }
+                else {
+                    if ((start == '[' && s == ']') || (start == '@' && s == ']')) {
+                        start = '';
+                        d += ' | ';
+                    }
+                }
+            }
+            else if (start == '') {
+                d += s;
+            }
+            a++;
+        }
+        //超过长度无法加密,加密Long服务器无法解析
+        if (d.length > 120) {
+            d = d.slice(0, 120);
+        }
+
+        //相同错误 一定时间禁止连续发送
+        let time = new Date().getTime();
+        if (BuglySDK.lastSendErrors.indexOf(d) != -1 && time - BuglySDK.lastSendErrorTime < 30000) {
+            return;
+        }
+        BuglySDK.lastSendErrors.push(d);
+        BuglySDK.lastSendErrorTime = time;
+        if (BuglySDK.lastSendErrors.length > 5) {
+            BuglySDK.lastSendErrors = BuglySDK.lastSendErrors.slice(BuglySDK.lastSendErrors.length - 5);
+        }
+
+        // 拼接服务类型(0测试服 1测试服)和 玩家uin 
+        let uin = ''
+        // 项目标签,尽量短
+        let gamename = 'tower';
+
+        let senddata = {
+            "level": "error",
+            "game": gamename + ":" + uin,
+            "message": d
+        };
+
+        const httpRequest = new XMLHttpRequest();
+        httpRequest.responseType = "text";
+        const send_url = 'https://elktest.duiweize.com/api/logs/record';
+        httpRequest.open("POST", send_url);
+        httpRequest.setRequestHeader("Content-Type", 'application/json;charset=UTF-8');
+
+        httpRequest.onerror = function (e) {
+            console.log("handleError.onError:", e);
+        };
+
+        let str = JSON.stringify(senddata);
+        str = Utils.RSAEncrypt(str);
+
+        httpRequest.send(str);
+    }
 }

+ 4 - 0
mk_framework/assets/script/mk/system/HttpSystem.ts

@@ -1,3 +1,7 @@
+/**
+ * @description http请求
+ * @author zy
+ */
 export default class HttpSystem {
     constructor() {
         

+ 16 - 10
mk_framework/assets/script/mk/system/MKSystem.ts

@@ -1,40 +1,46 @@
+import BuglySDK from "../sdk/BuglySDK";
 import FileUtil from "../utils/FileUtil";
 import TimeUtil from "../utils/TimeUtil";
+import DataSystem from "./DataSystem";
+import HttpSystem from "./HttpSystem";
 import LoaderSystem from "./LoaderSystem";
 
 
 class MKSystem {
-    constructor(){
+    constructor() {
         this.init();
     }
 
     /** 工具 */
-    time:TimeUtil;
-    file:FileUtil;
+    time: TimeUtil;
+    file: FileUtil;
 
     /** SDK */
+    bugly:BuglySDK;
+    
 
     /** 系统管理 */
-    loader:LoaderSystem;
+    loader: LoaderSystem;
+    data:DataSystem;
+    http:HttpSystem;
 
     init() {
-        this.initSystem();
-    }
-
-    initSystem() {
         //工具
         this.time = new TimeUtil();
         this.file = new FileUtil();
 
         //sdk
-        
+        this.bugly = new BuglySDK();
+
         //system
         this.loader = new LoaderSystem();
+        this.data = new DataSystem();
+        this.http = new HttpSystem();
     }
 }
 
 declare global {
-    const mk: MKSystem 
+    const mk: MKSystem;
 }
 window['mk'] = new MKSystem();
 

+ 0 - 6
mk_framework/assets/script/mk/utils/HttpUtil.ts

@@ -1,6 +0,0 @@
-export default class HttpUtil {
-    constructor() {
-        
-    }
-
-}

+ 0 - 9
mk_framework/assets/script/mk/utils/HttpUtil.ts.meta

@@ -1,9 +0,0 @@
-{
-  "ver": "1.0.8",
-  "uuid": "c5007252-c773-487e-b42f-2af60d37e847",
-  "isPlugin": false,
-  "loadPluginInWeb": true,
-  "loadPluginInNative": true,
-  "loadPluginInEditor": false,
-  "subMetas": {}
-}

+ 122 - 10
mk_framework/assets/script/mk/utils/TimeUtil.ts

@@ -8,19 +8,30 @@ export default class TimeUtil {
     }
 
     /**
-     * 获取当前日期
-     * @param replace 间隔符,默认'-',则返回2020-10-10
-     * @returns 当前时间字符串
+     * 本地时间与服务器时间的差值
      */
-    public getNowDayString(replace: string = '-'): string {
-        let date = new Date();
-        return date.getFullYear() + replace + (date.getMonth() + 1) + replace + date.getDate();
+    private offTime: number = 0;
+    /**
+     * 设置服务器时间
+     * @param time 服务器时间戳(秒)
+     */
+    public setServerTime(time: number) {
+        this.offTime = time - Math.ceil(new Date().getTime() / 1000);
+    }
+
+    /**
+     * 获取当前服务器时间,如果没有设置过服务器时间,默认为本地时间
+     * @returns 当前服务器时间戳(秒)
+     */
+    public getServerTime(): number {
+        return Math.ceil(new Date().getTime() / 1000 + this.offTime);
     }
 
     /**
-     * 倒计时转换为时间格式(h:m:s) ,可自定义
+     * 倒计时转换为时间格式(h:m:s),没有单位
      * @param t 时间(秒)
-     * @param f 格式
+     * @param f 格式,默认"h:m:s",可以过滤,如 "m:s"
+     * @returns 规定格式的字符串 如"04:22:06"
      */
     public format(t: number, f: string = "h:m:s"): string {
         let d: number = Math.floor(t / 24 / 3600);
@@ -35,29 +46,130 @@ export default class TimeUtil {
             }
             return s;
         }
+
         if (f.indexOf("d") != -1) {
             f = f.replace(/d/g, parse_format(d));
         }
         else {
             h += d * 24;
         }
+
         if (f.indexOf("h") != -1) {
             f = f.replace(/h/g, parse_format(h));
-        } else {
+        }
+        else {
             m += h * 60;
         }
+
         if (f.indexOf("m") != -1) {
             f = f.replace(/m/g, parse_format(m));
-        } else {
+        }
+        else {
             if (f.indexOf("h") != -1) {
                 s += m * 60;
             } else {
                 s = t;
             }
         }
+
         if (f.indexOf("s") != -1) {
             f = f.replace(/s/g, parse_format(s));
         }
         return f;
     }
+
+    /**
+     * 倒计时转换为时间格式,带中文单位 ,可过滤
+     * @param t 时间(秒)
+     * @param f 格式,默认"天时分秒",可以过滤,如 "分秒"
+     * @returns 规定格式的字符串 如“2天13时11分05秒”
+     */
+    public formatWithUnit(t: number, f: string = "天时分秒"): string {
+        let d: number = Math.floor(t / 24 / 3600);
+        let h: number = Math.floor((t / 3600) % 24);
+        let m: number = Math.floor((t % 3600) / 60);
+        let s: number = (t % 3600) % 60;
+
+        function parse_format(t: number, unit: string): string {
+            let s: string = t.toString();
+            if (t < 10) {
+                s = "0" + t;
+            }
+            return s + unit;
+        }
+
+        let str = '';
+
+        if (f.indexOf("天") != -1) {
+            str += d + "天";
+        }
+        else {
+            h += d * 24;
+        }
+
+        if (f.indexOf("时") != -1) {
+            str += parse_format(h, "时");
+        }
+        else {
+            m += h * 60;
+        }
+
+        if (f.indexOf("分") != -1) {
+            str += parse_format(m, "分");
+        }
+        else {
+            s += m * 60;
+        }
+
+        if (f.indexOf("秒") != -1) {
+            str += parse_format(s, "秒");
+        }
+        return str;
+    }
+
+    /**
+     * 获取一年中的第n天
+     * @param t
+     * @returns 一年中的第n天
+     */
+    public getDayInYear(t: number): number {
+        var time: Date = new Date(t);
+        var month = time.getMonth() + 1;
+        var year = time.getFullYear();
+        var days = time.getDate();
+        var sum = 0;
+
+        let a = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+        let b = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+        if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
+            for (var i: number = 0; i < month - 1; i++) {
+                sum += b[i];
+            }
+            return sum + days;
+        } else {
+            for (var i: number = 0; i < month - 1; i++) {
+                sum += a[i];
+            }
+            return sum + days;
+        }
+    }
+
+    /**
+     * 返回时间点在当天的秒数
+     * @param date 
+     * @returns 从零点开始的秒数
+     */
+    public getSecondsInDay(date: Date) {
+        return date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds();
+    }
+
+    /**
+     * 获取当前日期
+     * @param replace 间隔符,默认'-',则返回2020-10-10
+     * @returns 当前时间字符串
+     */
+    public getNowDayString(replace: string = '-'): string {
+        let date = new Date();
+        return date.getFullYear() + replace + (date.getMonth() + 1) + replace + date.getDate();
+    }
 }