├── README.md ├── asdebug.js ├── createstep.js └── projectStores.js /README.md: -------------------------------------------------------------------------------- 1 | # 微信应用号/小程序开发IDE 2 | 3 | LOGO 4 | 5 | 官方已推出正式版本IDE,请前往下载:https://mp.weixin.qq.com/wiki 6 | 7 | ## 下载声明 8 | 9 | * 相关代码纯属技术研究与爱好,请在学习使用后删除 10 | * 相关下载资源均来自于QQ群,与作者及贡献者本人无关 11 | * 当微信官方提供正式版本后,请支持微信官方,一起把应用号做的更好 12 | 13 | ## 相关资源 14 | 15 | * 开发群: 16 | * 一群(452137839)(满) 17 | * 二群(160108745)(满) 18 | * 三群(588937445) 19 | * 四群(579701728) 20 | 21 | ## 贡献者名单 22 | 23 | 感谢大家的贡献! 24 | 25 | | 时间 | 贡献者 | 贡献内容 | 26 | |--------|------------|---------------| 27 | | 2016.09.23 | importcjj | 去除调用接口必须在mp后台配置的限制 | 28 | | 2016.09.23 | AlayshChen | 去除请求URL域名限制 | 29 | | 2016.09.23 | qdsang | 解决无法创建App问题 | 30 | | 2016.09.22 | loulin | 补充常见问题 | 31 | | 2016.09.22 | fakefish | 修复0.7下载链接 | 32 | | 2016.09.22 | QFish | 补充常见问题 | 33 | 34 | ## 破解步骤 35 | 36 | ***Mac测试可用,Windows测试可用*** 37 | 38 | 1. 下载开发工具,并安装(***注意:一定要安装0.9版本***) 39 | 2. 打开『微信Web开发者工具』的程序目录 40 | * Windows:使用资源管理器查看 41 | * Mac:右键点击图标,选择『显示包内容』 42 | 3. 进入程序目录后,替换以下文件(只需要替换0.9版本里的,0.7版本用来登陆): 43 | * Windows: 44 | * \package.nw\app\dist\components\create\createstep.js 45 | * \package.nw\app\dist\stroes\projectStores.js 或 \package.nw\app\dist\stores\projectStores.js (0.9.092300之后版本) 46 | * \package.nw\app\dist\weapp\appservice\asdebug.js 47 | * Mac: 48 | * /Resources/app.nw/app/dist/components/create/createstep.js 49 | * /Resources/app.nw/app/dist/stroes/projectStores.js 或 /Resources/app.nw/app/dist/stroes/projectStores.js (0.9.092300之后版本) 50 | * /Resources/app.nw/app/dist/weapp/appservice/asdebug.js 51 | 52 | **[替换的文件点击这里下载](https://github.com/gavinkwoe/weapp-ide-crack/archive/master.zip)** 53 | 54 | 4. Good luck 55 | 56 | ## 项目创建 57 | 58 | 1. 运行『微信Web开发者工具』 59 | 2. 通过微信扫描二维码 60 | 3. 创建项目 61 | * AppID:选【无AppId】 62 | * 项目名称:随便填 63 | * 本地开发目录:选择一个目录 64 | 4. 点击「添加项目」 65 | 5. 打开项目 66 | 6. 开始写代码 67 | 7. Good luck 68 | 69 | ## Demo运行 70 | 71 | * 创建项目 72 | * 打开项目所在目录 73 | * 下载「Demo源代码」并解压覆盖 74 | * 打开项目 75 | * Good luck 76 | 77 | ## 常见问题(仅真对破解版) 78 | 1. 找不到所要替换的文件 79 | * 问题原因:开发工具版本不正确,老版本不支持 80 | * 解决方案:确保下载的程序版本在0.9.092100以上 81 | 2. Failed to load resource: net::ERR_NAME_NOT_RESOLVED http://1709827360.appservice.open.weixin.qq.com/appservice 82 | * 问题原因:通常是由于系统设置了代理如Shadowsocks等。 83 | * 解决方案:关闭代理,或者依次点击工具栏“动作”-"设置",选择“不使用任何代理,勾选后直连网络”。 84 | 3. 修复asdebug.js报错 85 | * 问题原因:TypeError: Cannot read property 'MaxRequestConcurrent' of undefined 86 | * 解决方案:替换 /Resources/app.nw/app/dist/weapp/appservice/asdebug.js 87 | 4. 扫码登录失败 88 | * 问题原因:please bind your wechat account to the appid first 89 | * 解决方案:先使用0.7版本的进行扫码登陆,登陆成功后,再用0.9的版本打开就直接进入了。 90 | * 0.7版本地址:http://dldir1.qq.com/WechatWebDev/release/0.7.0/wechat_web_devtools_0.7.0.dmg 91 | 5. mac版本升级到0.9.092300后,asdebug.js报错 92 | * 问题原因:TypeError: Cannot read property 'MaxRequestConcurrent' of undefined 93 | * 解决方案:替换 /Resources/app.nw/app/dist/weapp/appservice/asdebug.js 94 | 95 | ## 工具截图 96 | 97 | ![IDE](https://cloud.githubusercontent.com/assets/876707/18745196/f4f0488e-80f3-11e6-844b-f45d7e52a23c.png) 98 | 99 | ![IDE](https://cloud.githubusercontent.com/assets/876707/18745200/f7a74870-80f3-11e6-83cf-df00f7f87f56.png) 100 | 101 | ## 相关链接 102 | 103 | http://www.geek-zoo.com 104 | -------------------------------------------------------------------------------- /asdebug.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | ! function() { 3 | function e(e) { 4 | var o = JSON.parse(JSON.stringify(e)); 5 | o.to = "backgroundjs", o.comefrom = "webframe", o.command = "COMMAND_FROM_ASJS", o.appid = C, o.appname = R, o.apphash = W, o.webviewID = q, window.postMessage(o, "*") 6 | } 7 | 8 | function o(e) { 9 | e.command = "COMMAND_FROM_ASJS", e.appid = C, e.appname = R, e.apphash = W, e.webviewID = q; 10 | var o = "____sdk____" + JSON.stringify(e), 11 | n = prompt(o); 12 | n = JSON.parse(n), delete n.to, a(n) 13 | } 14 | 15 | function n(e) { 16 | e.to = "contentscript", e.comefrom = "webframe", e.webviewID = q, window.postMessage(e, "*") 17 | } 18 | 19 | function t() { 20 | var e = Math.random(); 21 | return L[e] ? initMappingID() : e 22 | } 23 | 24 | function r(n, r, a) { 25 | var i = t(); 26 | L[i] = a; 27 | var s = /Sync$/.test(n), 28 | c = { 29 | sdkName: n, 30 | args: r, 31 | callbackID: i 32 | }; 33 | s ? o(c) : e(c) 34 | } 35 | 36 | function a(o) { 37 | var n = o.command; 38 | delete o.command; 39 | var t = o.msg || {}, 40 | r = o.ext || {}; 41 | if ("WINDOW_GET_WEBAPP_ERROR" === n) { 42 | var a = t.fileName, 43 | i = t.errStr; 44 | return console.group("%c加载 " + a + " 错误", "color: red; font-size: x-large"), console.error("%c" + i, "color: red; font-size: x-large"), void console.groupEnd() 45 | } 46 | if ("MSG_FROM_WEBVIEW" === n || "GET_ASSDK_RES" === n) { 47 | var s = t.eventName || r.sdkName; 48 | O && (console.group(new Date + " GetMsg " + s), console.debug(s, t, r), console.groupEnd()), B.push({ 49 | type: "GetMsg", 50 | eventName: s, 51 | data: [s, t, r], 52 | timesmap: new Date 53 | }) 54 | } 55 | if ("MSG_FROM_WEBVIEW" === n) { 56 | var c = t.eventName, 57 | u = t.type, 58 | p = t.data || {}; 59 | p.webviewId = t.webviewID, "ON_APPLIFECYCLE_EVENT" === u ? S(c, p) : "ON_MUSIC_EVENT" === u && A(c, p), WeixinJSBridge._subscribe[c] && WeixinJSBridge._subscribe[c](p, p.webviewId) 60 | } else if ("GET_ASSDK_RES" === n) { 61 | var d = r.callbackID; 62 | L[d](t), delete L[d] 63 | } else if ("GET_APP_DATA" === n) e({ 64 | appData: __wxAppData, 65 | sdkName: "send_app_data" 66 | }); 67 | else if ("WRITE_APP_DATA" === n) 68 | for (var l in t) { 69 | var g = t[l], 70 | f = g.__webviewId__; 71 | WeixinJSBridge.publish("appDataChange", { 72 | data: { 73 | data: g 74 | } 75 | }, [f], !0) 76 | } 77 | } 78 | 79 | function i(e, o) { 80 | // 去除请求URL域名限制 81 | return true 82 | try { 83 | for (var n = F.projectConfig, t = n.Network, r = "webscoket" === o ? t.WsRequestDomain : t.RequestDomain, a = 0; a < r.length; a++) 84 | if (0 === e.indexOf(r[a])) return !0 85 | } catch (i) { 86 | return console.error(i), !1 87 | } 88 | } 89 | 90 | function s(e, o, n) { 91 | if (G++, G > I) return G--, n && n({ 92 | errMsg: "request:fail;" 93 | }), void console.error("%c 最多同时发起 " + I + " 个 wx.request 请求", "color: red; font-size: x-large"); 94 | var t = o.url, 95 | r = o.header || {}; 96 | // if (!i(t)) return G--, n && n({ 97 | // errMsg: "request:fail;" 98 | // }), void console.error("%c URL 域名不合法,请在 mp 后台配置后重试", "color: red; font-size: x-large"); 99 | var a, s = new XMLHttpRequest, 100 | c = o.method || "POST", 101 | u = (o.complete, F.networkTimeout && F.networkTimeout.request); 102 | s.open(c, o.url, !0), s.onreadystatechange = function() { 103 | if (3 == s.readyState, 4 == s.readyState) { 104 | s.onreadystatechange = null; 105 | var e = s.status; 106 | 0 == e ? n && n({ 107 | errMsg: "request:fail" 108 | }) : n && n({ 109 | errMsg: "request:ok", 110 | data: s.responseText, 111 | statusCode: e 112 | }), G--, a && clearTimeout(a) 113 | } 114 | }; 115 | var p = !1; 116 | for (var d in r) 117 | if (r.hasOwnProperty(d)) { 118 | var l = d.toLowerCase(); 119 | p = "content-type" == l || p, "cookie" === l ? s.setRequestHeader("_Cookie", r[d]) : s.setRequestHeader(d, r[d]) 120 | } 121 | "POST" != c || p || s.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"), s.setRequestHeader("X-Requested-With", "XMLHttpRequest"), "number" == typeof u && (a = setTimeout(function() { 122 | s.abort("timeout"), o.complete && o.complete(), o.complete = null, G--, n && n({ 123 | errMsg: "request:fail" 124 | }) 125 | }, u)); 126 | var g = "string" == typeof o.data ? o.data : null; 127 | try { 128 | s.send(g) 129 | } catch (f) { 130 | G--, n && n({ 131 | errMsg: "request:fail" 132 | }) 133 | } 134 | } 135 | 136 | function c(e, o) { 137 | var n = K[e]; 138 | n && o && n.push(o) 139 | } 140 | 141 | function u(e, o) { 142 | var n = K[e], 143 | t = !0, 144 | r = !1, 145 | a = void 0; 146 | try { 147 | for (var i, s = n[Symbol.iterator](); !(t = (i = s.next()).done); t = !0) { 148 | var c = i.value; 149 | c(o) 150 | } 151 | } catch (u) { 152 | r = !0, a = u 153 | } finally { 154 | try { 155 | !t && s["return"] && s["return"]() 156 | } finally { 157 | if (r) throw a 158 | } 159 | } 160 | } 161 | 162 | function p(e, o, n) { 163 | var t = o.url, 164 | r = o.header; 165 | if (!i(t, "webscoket")) return n && n({ 166 | errMsg: "closeSocket:fail" 167 | }), void console.error("%c URL 域名不合法,请在 mp 后台配置后,重启项目继续测试", "color: red; font-size: x-large"); 168 | j = new WebSocket(t); 169 | for (var a in r) r.hasOwnProperty(a); 170 | j.onopen = function() { 171 | u("open") 172 | }, j.onmessage = function(e) { 173 | u("message", { 174 | data: e.data 175 | }) 176 | }, j.onclose = function(e) { 177 | u("close", e) 178 | }, j.onerror = function(e) { 179 | u("error", e) 180 | }, n && n({ 181 | errMsg: "connectSocket:ok" 182 | }) 183 | } 184 | 185 | function d(e, o, n) { 186 | j ? (j.close(), j = null, n && n({ 187 | errMsg: "closeSocket:ok" 188 | })) : n && n({ 189 | errMsg: "closeSocket:fail" 190 | }) 191 | } 192 | 193 | function l(e, o, n) { 194 | var t = o.data; 195 | if (j) try { 196 | j.send(t), n && n({ 197 | errMsg: "sendSocketMessage:ok" 198 | }) 199 | } catch (r) { 200 | n && n({ 201 | errMsg: "sendSocketMessage:fail," + r.message 202 | }) 203 | } else n && n({ 204 | errMsg: "sendSocketMessage:fail" 205 | }) 206 | } 207 | 208 | function g(e, o) { 209 | c("open", o) 210 | } 211 | 212 | function f(e, o) { 213 | c("message", o) 214 | } 215 | 216 | function v(e, o) { 217 | c("error", o) 218 | } 219 | 220 | function w(e, o) { 221 | c("close", o) 222 | } 223 | 224 | function m(e, o) { 225 | var n = U[e]; 226 | n && o && n.push(o) 227 | } 228 | 229 | function S(e, o) { 230 | var n = U[e], 231 | t = !0, 232 | r = !1, 233 | a = void 0; 234 | try { 235 | for (var i, s = n[Symbol.iterator](); !(t = (i = s.next()).done); t = !0) { 236 | var c = i.value; 237 | c(o) 238 | } 239 | } catch (u) { 240 | r = !0, a = u 241 | } finally { 242 | try { 243 | !t && s["return"] && s["return"]() 244 | } finally { 245 | if (r) throw a 246 | } 247 | } 248 | } 249 | 250 | function h(e, o) { 251 | U.onAppLaunch || (o && o({}), U.onAppLaunch = !0) 252 | } 253 | 254 | function b(e, o) { 255 | m("onAppTerminate", o) 256 | } 257 | 258 | function _(e, o) { 259 | m("onAppRoute", o) 260 | } 261 | 262 | function y(e, o) { 263 | m("onAppEnterBackground", o) 264 | } 265 | 266 | function M(e, o) { 267 | U.onAppShow || (o && o({}), U.onAppShow = !0), m("onAppEnterForeground", o) 268 | } 269 | 270 | function k(e, o) { 271 | var n = X[e]; 272 | n && o && n.push(o) 273 | } 274 | 275 | function A(e, o) { 276 | var n = X[e], 277 | t = !0, 278 | r = !1, 279 | a = void 0; 280 | try { 281 | for (var i, s = n[Symbol.iterator](); !(t = (i = s.next()).done); t = !0) { 282 | var c = i.value; 283 | c(o) 284 | } 285 | } catch (u) { 286 | r = !0, a = u 287 | } finally { 288 | try { 289 | !t && s["return"] && s["return"]() 290 | } finally { 291 | if (r) throw a 292 | } 293 | } 294 | } 295 | 296 | function D(e, o) { 297 | k("onMusicPlay", o) 298 | } 299 | 300 | function E(e, o) { 301 | k("onMusicPause", o) 302 | } 303 | 304 | function N(e, o) { 305 | k("onMusicEnd", o) 306 | } 307 | 308 | function x(e, o) { 309 | k("onMusicError", o) 310 | } 311 | 312 | function T(e, o, n) { 313 | n && n({ 314 | errMsg: "openAddress:ok", 315 | userName: "张三", 316 | addressPostalCode: "510000", 317 | provinceFirstStageName: "广东省", 318 | addressCitySecondStageName: "广州市", 319 | addressCountiesThirdStageName: "天河区", 320 | addressDetailInfo: "某巷某号", 321 | nationalCode: "510630" 322 | }) 323 | } 324 | window.MutationObserver = window.WebKitMutationObserver = window.File = void 0; 325 | var I, W = __wxConfig.apphash, 326 | C = __wxConfig.appid, 327 | R = __wxConfig.appname, 328 | O = !1, 329 | B = [], 330 | J = navigator.userAgent, 331 | q = parseInt(J.match(/webview\/(\d*)/)[1]), 332 | P = [], 333 | L = {}, 334 | F = Object.assign({ 335 | domain: ["rapheal.sinaapp.com"], 336 | networkTimeout: { 337 | request: 3e4, 338 | connectSocket: 3e4, 339 | uploadFile: 3e4, 340 | downloadFile: 3e4 341 | } 342 | }, __wxConfig), 343 | G = 0, 344 | z = __wxConfig.appserviceConfig.AppserviceMaxDataSize; 345 | try { 346 | I = __wxConfig.projectConfig.Setting.MaxRequestConcurrent 347 | } catch (H) { 348 | // console.error(H), I = 5 349 | } 350 | var V = { 351 | login: !0, 352 | authorize: !0, 353 | operateWXData: !0, 354 | getStorage: !0, 355 | setStorage: !0, 356 | clearStorage: !0, 357 | getStorageSync: !0, 358 | setStorageSync: !0, 359 | clearStorageSync: !0, 360 | getMusicPlayerState: !0, 361 | operateMusicPlayer: !0, 362 | navigateTo: !0, 363 | redirectTo: !0, 364 | navigateBack: !0, 365 | setNavigationBarTitle: !0, 366 | showNavigationBarLoading: !0, 367 | hideNavigationBarLoading: !0, 368 | getLocation: !0, 369 | openLocation: !0, 370 | getNetworkType: !0, 371 | getSystemInfo: !0, 372 | chooseContact: !0, 373 | chooseImage: !0, 374 | chooseVideo: !0, 375 | saveFile: !0 376 | }; 377 | window._____sendMsgToNW = e, window.addEventListener("message", function(e) { 378 | var o = e.data, 379 | n = o.to; 380 | if ("appservice" === n) return delete n.appservice, "complete" !== document.readyState ? void P.push(o) : void a(o) 381 | }), window.WeixinJSBridge = {}; 382 | var j = null, 383 | K = { 384 | open: [], 385 | message: [], 386 | error: [], 387 | close: [] 388 | }, 389 | U = { 390 | onAppLaunch: !1, 391 | onAppShow: !1, 392 | onAppTerminate: [], 393 | onAppRoute: [], 394 | onAppEnterBackground: [], 395 | onAppEnterForeground: [] 396 | }, 397 | X = { 398 | onMusicPlay: [], 399 | onMusicPause: [], 400 | onMusicEnd: [], 401 | onMusicError: [] 402 | }; 403 | WeixinJSBridge._subscribe = {}, WeixinJSBridge.subscribe = function(e, o) { 404 | O && (console.group(new Date + " WeixinJSBridge subscribe"), console.debug(e, o), console.groupEnd()), B.push({ 405 | type: "subscribe", 406 | eventName: e, 407 | data: arguments, 408 | timesmap: new Date 409 | }), WeixinJSBridge._subscribe[e] = o 410 | }, WeixinJSBridge.publish = function(o, n, t, r) { 411 | if (O && (console.group(new Date + " WeixinJSBridge publish " + o), console.debug(o, n, t, r), console.groupEnd()), n && 0 !== o.indexOf("canvas")) { 412 | var a = JSON.stringify(n), 413 | i = a.length; 414 | if (i > z) return void console.error("%c " + o + " 数据传输长度为 " + i + " 已经超过最大长度 " + z, "color: red; font-size: x-large") 415 | } 416 | B.push({ 417 | type: "publish", 418 | eventName: o, 419 | data: arguments, 420 | timesmap: new Date 421 | }), "appDataChange" !== o && "pageInitData" !== o && "__updateAppData" !== o || r || e({ 422 | appData: __wxAppData, 423 | sdkName: "send_app_data" 424 | }), e({ 425 | eventName: o, 426 | data: n, 427 | sdkName: "publish", 428 | webviewIds: t 429 | }) 430 | }, WeixinJSBridge.invoke = function(e, o, n) { 431 | return O && (console.group(new Date + " WeixinJSBridge invoke " + e), console.debug(e, o, n), console.groupEnd()), B.push({ 432 | type: "invoke", 433 | eventName: e, 434 | data: arguments, 435 | timesmap: new Date 436 | }), V[e] ? void r(e, o, function(o) { 437 | if (o.errMsg.indexOf("ok") > -1 && ("navigateTo" === e || "redirectTo" === e)) { 438 | var t = o.url || "", 439 | r = t.match(/(([^\?]*)(\?([^\/]*))?)$/), 440 | a = "", 441 | i = {}; 442 | if (r) { 443 | a = r[2] || ""; 444 | for (var s = (r[4] || "").split("&"), c = 0; c < s.length; ++c) { 445 | var u = s[c].split("="); 446 | 2 == u.length && (i[u[0]] = u[1]) 447 | } 448 | } 449 | var p = e; 450 | S("onAppRoute", { 451 | path: a, 452 | query: i, 453 | openType: p, 454 | webviewId: o.webviewId 455 | }) 456 | } 457 | n && n(o) 458 | }) : void("request" == e ? s(e, o, n) : "connectSocket" == e ? p(e, o, n) : "closeSocket" == e ? d(e, o, n) : "sendSocketMessage" == e ? l(e, o, n) : "openAddress" == e && T(e, o, n)) 459 | }, WeixinJSBridge.on = function(e, o) { 460 | O && (console.group(new Date + " WeixinJSBridge on " + e), console.debug(e, o), console.groupEnd()), B.push({ 461 | type: "on", 462 | eventName: e, 463 | data: arguments, 464 | timesmap: new Date 465 | }), "onSocketOpen" == e ? g(e, o) : "onSocketError" == e ? v(e, o) : "onSocketMessage" == e ? f(e, o) : "onSocketClose" == e ? w(e, o) : "onAppLaunch" == e ? h(e, o) : "onAppTerminate" == e ? b(e, o) : "onAppRoute" == e ? _(e, o) : "onAppEnterBackground" == e ? y(e, o) : "onAppEnterForeground" == e ? M(e, o) : "onMusicPlay" == e ? D(e, o) : "onMusicPause" == e ? E(e, o) : "onMusicEnd" == e ? N(e, o) : "onMusicError" == e && x(e, o) 466 | }, n({ 467 | command: "SHAKE_HANDS" 468 | }), window.addEventListener("load", function() { 469 | P.forEach(function(e) { 470 | a(e) 471 | }), P = [] 472 | }), window.showDebugInfo = function(e, o) { 473 | var n = B.filter(function(n) { 474 | var t = !e || (Array.isArray(e) ? e.includes(n.type) : n.type === e), 475 | r = !o || (Array.isArray(o) ? o.includes(n.eventName) : n.eventName === o); 476 | if (t && r) return n 477 | }); 478 | console.group("showDebugInfo"), n.forEach(function(e) { 479 | console.group(e.timesmap + " WeixinJSBridge " + e.type + " " + e.eventName), console.debug.apply(window, e.data), console.groupEnd() 480 | }), console.groupEnd(), O = !0 481 | }, window.closeDebug = function() { 482 | console.clear(), O = !1 483 | }, window.showDebugInfoTable = function() { 484 | console.table(B) 485 | }, window.openToolsLog = function() { 486 | e({ 487 | sdkName: "__open-tools-log" 488 | }) 489 | }, window.openVendor = function() { 490 | e({ 491 | sdkName: "__open-tools-vendor" 492 | }) 493 | }, window.help = function() { 494 | console.table([{ 495 | fun: "showDebugInfo", 496 | "arg[0]": "type -- String || Array; publish on subscribe invoke GetMsg", 497 | "arg[1]": "eventName -- String || Array;", 498 | example: 'showDebugInfo() showDebugInfo("publish") showDebugInfo(["publish", "invoke"], "onAppRoute")', 499 | openToolsLog: "open tools logs" 500 | }, { 501 | fun: "closeDebug" 502 | }, { 503 | fun: "showDebugInfoTable" 504 | }, { 505 | fun: "openToolsLog" 506 | }, { 507 | fun: "openVendor" 508 | }]) 509 | } 510 | }(); 511 | -------------------------------------------------------------------------------- /createstep.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | function init() { 4 | function e(e) { 5 | alert(e) 6 | } 7 | var t = require("../../lib/react.js"), 8 | a = (require("../../utils/tools.js"), require("../../cssStr/cssStr.js")), 9 | r = (require("path"), require("../../utils/newReport.js")), 10 | i = require("../../config/urlConfig.js"), 11 | s = require("../../common/request/request.js"), 12 | c = (require("../../stores/webviewStores.js"), require("../../common/log/log.js")), 13 | o = require("glob"), 14 | n = require("../../config/errcodeConfig.js"), 15 | p = (require("../../actions/windowActions.js"), require("../../actions/projectActions.js")), 16 | l = t.createClass({ 17 | displayName: "Createstep", 18 | getInitialState: function() { 19 | return { 20 | projectpath: "", 21 | appid: "", 22 | appname: "", 23 | error: "", 24 | saveBtnDisable: !0, 25 | showQuickStart: !1, 26 | checked: !0, 27 | showLoading: !1 28 | } 29 | }, 30 | chooseDir: function() { 31 | var e = this, 32 | t = document.createElement("input"); 33 | t.setAttribute("type", "file"), t.setAttribute("nwdirectory", !0), t.style.display = "none", global.contentDocumentBody.appendChild(t), t.addEventListener("change", function(a) { 34 | o("*", { 35 | cwd: t.value 36 | }, function(a, r) { 37 | var i = 0 === r.length; 38 | e.setState({ 39 | projectpath: t.value, 40 | showQuickStart: i 41 | }) 42 | }), global.contentDocumentBody.removeChild(t) 43 | }), t.addEventListener("cancel", function(e) { 44 | global.contentDocumentBody.removeChild(t) 45 | }), t.click() 46 | }, 47 | editAppid: function(e) { 48 | var t = e.target, 49 | a = t.value; 50 | this.setState({ 51 | appid: a 52 | }) 53 | }, 54 | editAppname: function(e) { 55 | var t = e.target, 56 | a = t.value; 57 | this.setState({ 58 | appname: a 59 | }) 60 | }, 61 | addProject: function() { 62 | var t = this, 63 | a = this.state.projectpath, 64 | o = this.state.appid, 65 | l = encodeURIComponent(this.state.appname); 66 | if (!o) return void e("请填写 appid "); 67 | if (!l) return void e("请填写 项目名称 "); 68 | if (!a) return void e("请选择 项目目录 "); 69 | var m = o + "_" + l, 70 | d = this.props.projectLists.find(function(e) { 71 | return e.projectid === m 72 | }); 73 | return d ? void this.setState({ 74 | projectpath: "", 75 | appid: "", 76 | appname: "", 77 | saveBtnDisable: !0, 78 | error: "已存在 " + o + " " + decodeURIComponent(d.appname) + " 项目,请重新输入" 79 | }) : (this.setState({ 80 | showLoading: !0 81 | }), void s({ 82 | url: i.createWeappURL + "?appid=" + o, 83 | needToken: 1 84 | }, function(i, s, u) { 85 | i = 0; 86 | u = '{"baseresponse": {"errcode": 0}, "is_admin": 1}'; 87 | if (i) c.error("createstep.js create " + i.toString()), t.setState({ 88 | showLoading: !1 89 | }), e(i.toString()); 90 | else { 91 | t.setState({ 92 | showLoading: !1 93 | }), c.info("createstep.js create " + u); 94 | var h = JSON.parse(u), 95 | f = h.baseresponse, 96 | v = f ? parseInt(f.errcode) : 0; 97 | // if (v === n.DEV_App_Not_Band) return e("当前开发者未绑定此 appid ,请到 mp 后台操作后重试"), nw.Shell.openExternal("https://mp.weixin.qq.com/"), void c.error("createstep.js create project error " + v); 98 | // if (0 === v) { 99 | var b = h.app_head_img ? h.app_head_img + "/0" : "", 100 | g = t.state.showQuickStart && t.state.checked; 101 | return d = { 102 | appid: o, 103 | appname: l, 104 | projectpath: a, 105 | projectid: m, 106 | app_head_img: b, 107 | is_admin: h.is_admin 108 | }, p.add(d, g), r("project_createsuc", o), t.setState({ 109 | projectpath: "", 110 | appid: "", 111 | appname: "", 112 | error: "", 113 | saveBtnDisable: !0, 114 | showLoading: !1 115 | }), void t.props.goMain(d) 116 | // } 117 | // var E = u || "系统错误"; 118 | // e(E) 119 | } 120 | })) 121 | }, 122 | changeCheckbox: function(e) { 123 | var t = e.target.checked; 124 | this.setState({ 125 | checked: t 126 | }) 127 | }, 128 | render: function() { 129 | var e = this.props.show ? {} : a.displayNone, 130 | r = this.state.showQuickStart ? {} : a.visibilityHidden, 131 | i = this.props.createBack, 132 | s = this.state.showLoading ? "create-form-button-primary detail-upload-dialog-button-primary-loading" : "create-form-button-primary"; 133 | return t.createElement("div", { 134 | className: "create-step2", 135 | style: e 136 | }, t.createElement("div", { 137 | className: "create-toolbar app-drag" 138 | }, t.createElement("a", { 139 | onClick: i, 140 | href: "javascript:;", 141 | className: "create-toolbar-close app-no-drag" 142 | }, t.createElement("i", { 143 | className: "create-toolbar-back-icon" 144 | }), t.createElement("span", null, "返回"))), t.createElement("div", { 145 | className: "create-body" 146 | }, t.createElement("div", { 147 | className: "create-name" 148 | }, "新建项目"), t.createElement("div", { 149 | className: "create-form" 150 | }, t.createElement("div", { 151 | className: "create-form-item" 152 | }, t.createElement("label", { 153 | htmlFor: "", 154 | className: "create-form-label" 155 | }, "AppID"), t.createElement("div", { 156 | className: "create-form-input-box" 157 | }, t.createElement("input", { 158 | value: this.state.appid, 159 | onChange: this.editAppid, 160 | type: "text", 161 | className: "create-form-input" 162 | }), t.createElement("p", { 163 | style: this.state.error ? a.displayNone : {}, 164 | className: "create-form-tips" 165 | }, "填写小程序AppID,可在公众平台开发设置页中查看"), t.createElement("p", { 166 | style: this.state.error ? {} : a.displayNone, 167 | className: "create-form-tips-warn" 168 | }, this.state.error))), t.createElement("div", { 169 | className: "create-form-item" 170 | }, t.createElement("label", { 171 | htmlFor: "", 172 | className: "create-form-label" 173 | }, "项目名称"), t.createElement("div", { 174 | className: "create-form-input-box" 175 | }, t.createElement("input", { 176 | value: this.state.appname, 177 | onChange: this.editAppname, 178 | type: "text", 179 | className: "create-form-input" 180 | }))), t.createElement("div", { 181 | className: "create-form-item" 182 | }, t.createElement("label", { 183 | htmlFor: "", 184 | className: "create-form-label" 185 | }, "本地开发目录"), t.createElement("div", { 186 | onClick: this.chooseDir, 187 | className: "create-form-input-box" 188 | }, t.createElement("input", { 189 | value: this.state.projectpath, 190 | disabled: "true", 191 | type: "text", 192 | className: "create-form-input create-form-input-with-pointer" 193 | }), t.createElement("p", { 194 | className: "create-form-tips" 195 | })), t.createElement("div", { 196 | className: "create-form-extra" 197 | }, t.createElement("a", { 198 | href: "javascript:;", 199 | onClick: this.chooseDir, 200 | className: "create-form-extra-button" 201 | }, "选择"))), t.createElement("div", { 202 | style: r, 203 | className: "create-quick-checkbox" 204 | }, t.createElement("input", { 205 | id: "quick-checkbox", 206 | onChange: this.changeCheckbox, 207 | checked: this.state.checked, 208 | type: "checkbox" 209 | }), t.createElement("label", { 210 | htmlFor: "quick-checkbox" 211 | }, "在当前目录中创建 quick start 项目"))), t.createElement("div", { 212 | className: "create-form-footer" 213 | }, t.createElement("a", { 214 | href: "javascript:;", 215 | className: "create-form-button-default", 216 | onClick: i 217 | }, "取消"), t.createElement("a", { 218 | onClick: this.addProject, 219 | href: "javascript:;", 220 | className: s 221 | }, "添加项目")))) 222 | } 223 | }); 224 | _exports = l 225 | } 226 | var _exports; 227 | init(), module.exports = _exports; 228 | -------------------------------------------------------------------------------- /projectStores.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | function init() { 4 | function e(e) { 5 | var t = 0, 6 | r = void 0, 7 | o = void 0, 8 | i = void 0; 9 | if (0 === e.length) return t; 10 | for (r = 0, i = e.length; r < i; r++) o = e.charCodeAt(r), t = (t << 5) - t + o, t |= 0; 11 | return t > 0 ? t : 0 - t 12 | } 13 | 14 | function t() { 15 | localStorage.setItem("projectLists", JSON.stringify(j)) 16 | } 17 | 18 | function r(e, t) { 19 | if (t) { 20 | var r = e.projectpath, 21 | n = o.join(__dirname, "../weapp/quick/"); 22 | s("./**/**", { 23 | cwd: n 24 | }, function(e, t) { 25 | e || t.forEach(function(e) { 26 | var t = o.join(n, e), 27 | s = o.join(r, e), 28 | a = i.lstatSync(t); 29 | if (a.isDirectory()) c.sync(s); 30 | else { 31 | var p = i.readFileSync(t); 32 | i.writeFileSync(s, p) 33 | } 34 | }) 35 | }) 36 | } 37 | } 38 | var o = require("path"), 39 | i = require("fs"), 40 | n = require("../common/log/log.js"), 41 | s = require("glob"), 42 | c = require("mkdir-p"), 43 | a = require("../common/request/request.js"), 44 | p = require("../config/urlConfig.js"), 45 | f = require("../config/errcodeConfig.js"), 46 | u = require("events").EventEmitter, 47 | j = JSON.parse(localStorage.getItem("projectLists")) || [], 48 | d = {}, 49 | g = !1; 50 | j.forEach(function(t) { 51 | t.hash = e(t.projectid) 52 | }); 53 | var l = Object.assign({}, u.prototype, { 54 | getProjectByHash: function(e) { 55 | return e = parseInt(e), j.find(function(t) { 56 | return t.hash === e 57 | }) 58 | }, 59 | getProjectByID: function(e) { 60 | return j.find(function(t) { 61 | return t.projectid === e 62 | }) 63 | }, 64 | getProjectList: function() { 65 | return n.info("projectStores.js getProjectList " + JSON.stringify(j)), j 66 | }, 67 | add: function(o, i) { 68 | o.hash = e(o.projectid), j.unshift(o), r(o, i), t(), n.info("projectStores.js add " + JSON.stringify(o)), this.emit("ADD_PROJECT", j) 69 | }, 70 | del: function(e) { 71 | var r = j.findIndex(function(t) { 72 | return t.projectid === e 73 | }); 74 | if (r > -1) { 75 | var o = j[r]; 76 | delete localStorage["projectattr" + o.hash], j.splice(r, 1), t(), n.info("projectStores.js del " + e), this.emit("DEL_PROJECT", j) 77 | } 78 | }, 79 | close: function() { 80 | this.emit("CLOSE_PROJECT") 81 | }, 82 | restart: function(e) { 83 | this.emit("RESTART_PROJECT", e) 84 | }, 85 | getProjectConfig: function(e) { 86 | return d[e.hash] 87 | }, 88 | setProjectConfig: function(e, t) { 89 | if (!g) { 90 | g = !0; 91 | var r = "projectattr" + e.hash, 92 | o = JSON.parse(localStorage.getItem(r)); 93 | o && (d[e.hash] = o, t()); 94 | var i = p.getWeappAttrURL, 95 | s = i + "?appid=" + e.appid + "&_r=" + Math.random(); 96 | console.log(s), n.info("projectStores.js begin get projectAttr " + s), a({ 97 | url: s, 98 | body: JSON.stringify({ 99 | appid_list: [e.appid] 100 | }), 101 | method: "post", 102 | needToken: 1 103 | }, function(i, s, c) { 104 | c = '{"baseresponse": {"errcode": 0}, "is_admin": 1, "attr_list": []}'; 105 | if (g = !1, i) return void n.error("projectStores.js end get projectAttr network error: " + JSON.stringify(i)); 106 | n.info("projectStores.js end get projectAttr " + c); 107 | var a = void 0; 108 | try { 109 | a = JSON.parse(c) 110 | } catch (p) { 111 | return n.error("projectStores.js end get projectAttr parse body error: " + c + " " + JSON.stringify(i)), void(!o && alert("系统错误 " + c)) 112 | } 113 | var u = a.baseresponse, 114 | j = 0; //u ? parseInt(u.errcode) : 0; 115 | if (0 === j) { 116 | var l = {}; // a.attr_list[0]; 117 | d[e.hash] = l, localStorage.setItem(r, JSON.stringify(l)), o || t() 118 | } else { 119 | if (j === f.DEV_App_Not_Band) { 120 | alert("当前开发者未绑定此 appid ,请到 mp 后台操作后重试"), nw.Shell.openExternal("https://mp.weixin.qq.com/"), n.error("projectStores.js setProjectConfig error " + j); 121 | var h = require("./webviewStores.js"); 122 | return void h.emit("NOT_LOGIN") 123 | }!o && alert("系统错误 " + c) 124 | } 125 | }) 126 | } 127 | } 128 | }); 129 | _exports = l 130 | } 131 | var _exports; 132 | init(), module.exports = _exports; 133 | --------------------------------------------------------------------------------