From c68f4fb7ad81c5f29edc60bc4624b93ead02440e Mon Sep 17 00:00:00 2001 From: dong_bo0602 <358256383@qq.com> Date: Sat, 20 Mar 2021 10:59:52 +0800 Subject: [PATCH] Initial Commit --- .gitignore | 14 + app.js | 16 + app.json | 22 + app.wxss | 10 + images/camera.png | Bin 0 -> 574 bytes images/default-avatar.png | Bin 0 -> 3108 bytes images/delete.png | Bin 0 -> 757 bytes images/marker_red.png | Bin 0 -> 812 bytes images/position.png | Bin 0 -> 598 bytes images/select.png | Bin 0 -> 320 bytes images/vioce.png | Bin 0 -> 757 bytes lib/bmap-wx.js | 452 ++++++++++++ lib/qqmap-wx-jssdk.js | 1122 ++++++++++++++++++++++++++++++ pages/caseCheck/caseCheck.js | 228 ++++++ pages/caseCheck/caseCheck.json | 3 + pages/caseCheck/caseCheck.wxml | 89 +++ pages/caseCheck/caseCheck.wxss | 180 +++++ pages/caseDetail/caseDetail.js | 122 ++++ pages/caseDetail/caseDetail.json | 3 + pages/caseDetail/caseDetail.wxml | 31 + pages/caseDetail/caseDetail.wxss | 81 +++ pages/caseReport/caseReport.js | 472 +++++++++++++ pages/caseReport/caseReport.json | 3 + pages/caseReport/caseReport.wxml | 132 ++++ pages/caseReport/caseReport.wxss | 191 +++++ pages/index/index.js | 195 ++++++ pages/index/index.json | 3 + pages/index/index.wxml | 34 + pages/index/index.wxss | 109 +++ pages/process/process.js | 98 +++ pages/process/process.json | 3 + pages/process/process.wxml | 22 + pages/process/process.wxss | 64 ++ project.config.json | 70 ++ sitemap.json | 7 + utils/dialog.js | 15 + utils/restAjax.js | 227 ++++++ utils/util.js | 32 + 38 files changed, 4050 insertions(+) create mode 100644 .gitignore create mode 100644 app.js create mode 100644 app.json create mode 100644 app.wxss create mode 100644 images/camera.png create mode 100644 images/default-avatar.png create mode 100644 images/delete.png create mode 100644 images/marker_red.png create mode 100644 images/position.png create mode 100644 images/select.png create mode 100644 images/vioce.png create mode 100644 lib/bmap-wx.js create mode 100644 lib/qqmap-wx-jssdk.js create mode 100644 pages/caseCheck/caseCheck.js create mode 100644 pages/caseCheck/caseCheck.json create mode 100644 pages/caseCheck/caseCheck.wxml create mode 100644 pages/caseCheck/caseCheck.wxss create mode 100644 pages/caseDetail/caseDetail.js create mode 100644 pages/caseDetail/caseDetail.json create mode 100644 pages/caseDetail/caseDetail.wxml create mode 100644 pages/caseDetail/caseDetail.wxss create mode 100644 pages/caseReport/caseReport.js create mode 100644 pages/caseReport/caseReport.json create mode 100644 pages/caseReport/caseReport.wxml create mode 100644 pages/caseReport/caseReport.wxss create mode 100644 pages/index/index.js create mode 100644 pages/index/index.json create mode 100644 pages/index/index.wxml create mode 100644 pages/index/index.wxss create mode 100644 pages/process/process.js create mode 100644 pages/process/process.json create mode 100644 pages/process/process.wxml create mode 100644 pages/process/process.wxss create mode 100644 project.config.json create mode 100644 sitemap.json create mode 100644 utils/dialog.js create mode 100644 utils/restAjax.js create mode 100644 utils/util.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..14ea590 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# Windows +[Dd]esktop.ini +Thumbs.db +$RECYCLE.BIN/ + +# macOS +.DS_Store +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes + +# Node.js +node_modules/ diff --git a/app.js b/app.js new file mode 100644 index 0000000..3ac381d --- /dev/null +++ b/app.js @@ -0,0 +1,16 @@ +//app.js +var restAjax = require('utils/restAjax.js'); +var dialog = require('utils/dialog.js'); +App({ + loginUrl: 'https://www.tenlion.com.cn/usercenter/', + // requestUrl: 'http://192.168.0.120:8083/servicecity/', + requestUrl: 'https://www.tenlion.com.cn/servicecity/', + restAjax: restAjax, + dialog: dialog, + onLaunch: function () { + + }, + globalData: { + userInfo: null + } +}) \ No newline at end of file diff --git a/app.json b/app.json new file mode 100644 index 0000000..8df9b7f --- /dev/null +++ b/app.json @@ -0,0 +1,22 @@ +{ + "pages":[ + "pages/index/index", + "pages/caseCheck/caseCheck", + "pages/caseReport/caseReport", + "pages/caseDetail/caseDetail", + "pages/process/process" + ], + "window":{ + "backgroundTextStyle":"light", + "navigationBarBackgroundColor": "#008cff", + "navigationBarTitleText": "片长制城市管理服务平台", + "navigationBarTextStyle":"white" + }, + "style": "v2", + "sitemapLocation": "sitemap.json", + "permission": { + "scope.userLocation": { + "desc": "你的位置信息将用于小程序位置接口的效果展示" + } + } +} diff --git a/app.wxss b/app.wxss new file mode 100644 index 0000000..06c6fc9 --- /dev/null +++ b/app.wxss @@ -0,0 +1,10 @@ +/**app.wxss**/ +.container { + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; + padding: 200rpx 0; + box-sizing: border-box; +} diff --git a/images/camera.png b/images/camera.png new file mode 100644 index 0000000000000000000000000000000000000000..4aedb8d836dc08a6279a19c8bca44332387919ed GIT binary patch literal 574 zcmV-E0>S->P)r&fCttXW#qotM}@y>0bL=-}=^f);?pVL5xiU4rWQ@Da=SE=3sq=k6z(# zMc#PIAW9s-Wz4Gp|Ba)#QIT6sVm{tsF`icdZ^AdM!LP3TS|zsOA>Jq8F5Doz8r$)x zE4h}$J?z9K9Pa|fMI6I@?CQ#IBN0-b!^YzBPprlFE>JAOTP!GYU*c3b(vrjqd~7Ka z28*tqR1nB1TatQV=rUH~Q?ES{Dm+WBKG;z(#I*iX-X#Yx=D3V$Y~Z%uUkA zz6jSx=Q%duDPpTGEjo`a`+8I)w&F4FU~kK~@|bp{y;7!R6(=>0R**)eq0R^OL{=iC zZF|V_rYuL5d5%PhrYB1C<^u6%tiqp`agBsT;5NUGANY)AX-md=FBO`1C*_IUTz*Fu zHo6T3Zg%XKktxwsIrd79nkRlrNOWxW|Bh!KiCDAO25qw<|1fr^6&^LlqwRm<7WP#D z4x4ft`&Q5=F1A z1=$J_QnIC9OH^bld$uXQ(f0PocfH?pJ0Eo)d zT-`bD_I6kjlMW-UVPHIZppXp!7@P0{i6nmt2jWffr7>{O$%;o%2#t(`?lZ7Q*azY% zRGM`ti{cXM;7SVhCmE5UCc7ZUJgm?Fox&kPc=P}U8_UB%zuCnK*K2Ax6!Hzi@y9{G z2jy<>1i>>|6o>&#PnU#1A|Yrr45@E`Mk93~Ca(BfX1RQkRKOR=#548 z!8#KxfA|u9;h!`I6ATUmdqguSx1{MDqw zk6&$0VF-JhC2Znsl)@(fK;pIy!OWG{{qe9r`@Ny;pi6qbV0D$f&>Wy+TNf*L;NJusnrH03+)CFB_8QxQFog{A_zbArueD)8uDLpa%jv|%a>?XdkOv|Yx+f5PpRA@zPF3}<9`rtRDyLXEjSuX4h@m$WQ%b-g*~ zHrCn$990;39V6ac!zxnK5sH})UPkV+7f%lf#hY)M?;BUXX})cQu)jmsHkh(qt4euS z)UyY-)`s*wWcHShcWr&bAwP>N37dx-^xwMXy(oo>;reX7c%S9MHMb$b-nNwTA7i{A+xA9%d45SXl-^O#va>bAe%)ADhLT-R|; z-zL57l>Xt_@+pbOkr{#xNRL4VSME}SpU1$%h48q?z(fO`g|yfkuWc?ADsqRekz@N? zWBH9UNm(x%D7XQIm-b!bn?2ink`I@{`6IXrh0nVkV;Xlkyj+j|piG3W9u2OubnKs- z3i&wLdOdrl72Mu^wfOJskn~$+7x=q@?t31_%I99RbHNv$H_v_is`|P+yP?nM)~SO$ z<81u}$*)KYJLD7cE9ps7+L-y;&aZY?f+kje!yLctyo6zNoHmei z`M?zbFICs1%lW#Wzs!!=SilaD^QLdDW6+?N;OFi_=*zsXd70ttH>+sKUq@G(c~WeTJPe_W`yH9 z**>Y~+yerHx-1^aZ7efoROSa)+k@O^!s9L@6_*V=ToIOgZCLrm#d0I36%LXPWy&4e z6ly!7f?K3S+%z3ZydW3!FC}=(pE2`uFfJrQyPR!Xu{D=m3T|36Qw?t z(n>kv$4^qL=b~?lbo!th$pPzWV!Amw51WLYxhhd{A(nkn1a)| z2X$a?9ofxz*Rl8Uxw9a*xFJdu*w#sFS{|G^0+W;ijd;!F zZ+c=-Ki*ClG4MieyoeI(KC4lXc}4TGcvI><{s*|(TzGDL%jlixl+l2X(w-O7Z&*Hi zrekxYl)ASUsmdzI_I+27ZlxOqwEcXr4E~qy4NJ;{OMj}%hm~d^ZYpmU&Ue_CH!9KgR+Px4@d7tue^u(>Mmeg*;s0600h1_j?ac4@5>cmPXXOF?3)Ff_m zt#yROY=9|CY&s=$$1Q~ts`CemJT}n6?M|K4nZsjcMR2Q)amLm2sa-<`MP5m{rH!VS zb;o(hUjy3-Rj*#+%e0?6h>vuf(vQ?B8=AH9t?7BO1|K**TvRYTBZrt8Z+oIlvhBFZ>i-=<( zMfxwxfo0dq;u~@|R>WkpoUE?gzYXrxx{Eb0jpYpQXR#H03&>#s$2vdU%V{Z^F-&`_ zxh;yi?IG-V5O}Mz(?Is{aR0w%AE4^b{5OzQI;Mo6pjbyeR>m6QZSHE{_&Jq z^6XNc^d-tIlG+P&_bA7C{!l|(#lpKr;|(*XOY(TVO0WH~Z{?CKpgjdD=fsT&hKB4^`K|D-ucc@|e!kY;+{y{(*6so2DPYx=3;D7+ zW1|UP2w)e)u{quGe7$)IDAA|%{>Exg%$D==D(c(oDgx^tt$bPHY%Ei8YClxBjQ+pu5XT&n7sx!%cZl~t5- zkk)R6;NoHB;E<_#htcQOAw^9gVY6I;7~B!FdqMi;0@|9%_~Kz49G1i(tIw~jWK~Z8 zM;10Oo!?mr9tJmj+FG?VaP-fiM`KpRet}|y_|Yk=-ld>3mwZ;EaEs$HkH#@R#xKW4 z-6l&H1@*_@3cRY6sSVj-#)}=fiH%3t_vS7|yj`uC%=z0*V)c;O>h!U|f2Qe~>Yrm+ zI9o;j8Okh)-zM>Dd&8ZZ>Ls&}=7RE;`unC4Um}Skh{}Qe?P>QD_P9-M=c$2X%>{>e zwiVKEV2}f=A4!7>FPt4ijAwZ|iJ*l~T*Q}$jZLp^Sk8}rIKWn6)tH1Iv_)|8^S-2SS0l*Qx&kI7w!x literal 0 HcmV?d00001 diff --git a/images/delete.png b/images/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..7418ea8fcd0020f137331f71f576eb74117bf72c GIT binary patch literal 757 zcmV=*S7DkDzDPpIEf;RpK8%;n91uH=dg+v?wgN=d~+L=Ow z!Nfv0*}On!x3LSGAk2+BM=qOLcdmCHF-tZB13T=w-}&x&-1A*Rn;&Ykf21a`){pMr zo?QU(1Oe*pWuRAWfPkM|e`mood&KtU2G&tcv$;e9#XLmEwtbVCZ!yr960|}@Pj@=K zXZa#z+?rSdOIdN%BHRZsn#QrgX3=Ln7%9tFQR^cKlpK2!;OYN#tSzIdoa@b)u#5y& z9s9Bme%%`9brcJ9WzhBB=$QWySn2B+V~aku(s_VIKA#(^?94Y~hX|;G%WR1`L(Uff zoB+_1lGrAI4FG2}`^8$9EHoEph`{PG`?k;gSYucma^=Z2M~wKu3kLEDRb8}z>jSP_ zT5-fT-QFU)Gx)=M(uhj%iM=?lFM&V)dLSrKkz}W6qW1Ap$FoSm%1B$3FUQmGK^(tGsUvxw2o6z!recBm%pO z8tG8qd)RpZznybs*Wn^?7*f#QB3yRFLjvv|L>n^jXxNqaLN&0QwJ#F!+k-fWnCa4R z*?Sivpd^Vl~*hwb@d!gv8@dkEx*|TaZM~Q@Q&W=7u89j4@dQ9)rmGpi^FGt8myz!S n$(2;NiC42Efc^g8b^?C@;kBnQ4Np~%00000NkvXXu0mjf0tR1_ literal 0 HcmV?d00001 diff --git a/images/marker_red.png b/images/marker_red.png new file mode 100644 index 0000000000000000000000000000000000000000..8b4e20d8b2dff17ad7bca50423cfc4638edc50c0 GIT binary patch literal 812 zcmV+{1JnG8P)X1^@s6+90*i00009a7bBm001r{ z001r{0eGc9b^rhX8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0=Y>< zK~#9!rIy`GQ*ju_k4=w}CN0<2X3@;qam?-Ptgsv-2kukY`426FaWd-39PvA56j?0KF&&$v)1 z#Ho31a+L!eustggc~pO1WPX(5YtJNayNkckE-4e}D~D^z|O z{QT0spZpjYAm97@Ny6=xg)BY_A`K7&?*Gd11|LW+boxm;5+O;ypTu)W83Cq&g(=4i zdhjSJwvcohC8|45Iz_a8u>))x~UXlz1iV{=e&2}nZ0w$LH;*>=s-}?HB z7H4={FE_ZGCBGLHcantHTe4g!%~h6sXl8pWSro;R<@B4wbA>7YB$O`BC%+#R94nG% zCWa*+cyC!*=5#&46J*IfueV4gix>WlVj|Zln!rf3$+41>41&sBKmPzo(=3V+&ti!^ zGr8vO8te{^<0^m#tYR&$YsJ)_?jDGLUDpZcAZ!8+pbo49JSbZ(H-b_6H4BkXV(s44 z+a4M;{1J$JzzaISZcqJBH@)_*Q3@cpd=}eCfQ_e3>CV3=V)@V1wLT zhFs&STx-T59-dM)mJ}VfXTJStCcYT0000vWg1Mp9-v+!E+b z=w8aa_+PPqao4Sp(QJ;a4s}JV#50r~8FDG1I-wgVGbk_#_->3Ur<#G>O4YC$>1lzR zF4(THX?|2byV%N5cZqOYV2gvlu}0$NB}=?W?*bzoM1{xAx*W>8z8C5^!bOK$uvM0E zMi!D9dXats);mF0t&y=j!By9EV6nxwlp|sLue!WX1pP=qDr`<1!o8-EW4R7cc0#L zo{Iv(xkY8STau(HosVj$Ln6eYeV0PeG!o?nrl(D$SAbd{#i!OtS3SENCf$tmIk2xl z^ao}3+nT&BI<#v9`3>EsFoWWCB`L>kAa{D*Aa|zu4INP>e&g=S9an{2&JytyD!~bj k|4(Jo1~T5aTYm%o0F?!?6)0?yv;Y7A07*qoM6N<$f=*5f`~Uy| literal 0 HcmV?d00001 diff --git a/images/select.png b/images/select.png new file mode 100644 index 0000000000000000000000000000000000000000..1db700f6d70f17c2e62da9541003be782c120bdd GIT binary patch literal 320 zcmV-G0l)rKe#XVV7s1EVjJ#YMehE7LY^R2#76j{lVXg9DALw)h(X`7jkk S67=T)0000ZuxnocnI`_n#oG=+@zA-_9xyyUM`#-<$|DE%lBh2w5a~z-l z7hqXZmyczr_8gq&WB5~0KF-9=k{t*nwE<{QWy9ovB0LBBQbFk}1*9YZe_St#a1{8i zE?rm*O$4hE2m%XLxttEmF;fU*0DnxQVsQp|qb^6%5qU8=h(D(5#o`LEMqSRPBN8=% zFb1%b`T%7+!WJhePx6V|N!^U{7-7H(%8uCuNT_;(PDlzu+lK3MaOMse3YP)O4$PVZ zfo@%FWmxq2lni?rYbrc--O_Vf?fUqZYL>70%5vH&$kn~;5*UeyGZTQSnA(;_s?fbK zEkGcl=M|bo*q;i@Ejyvtfdi6ZQ>s-4^X(?ksdeh(DR9FH$-zKU_o;GIpgR?klchNj z*G7aMlwKz+O?E;L0as0~V&Je7l52Kcdk`8?nw+romISb*OLw|1_kb~ky-rZ>+6j#S zow;TtKHhqwnqjqAw0O-3Xmvsovy-|T<+j(YEsI@WTI7C70NKRLxd6ke)ThJp%8qM2 zf(Np7ir^!Zm=l(Me_Yp!&<|7>+P(LG(W}@_=xLxG_@FKqD=N9*Rfd<{W23Cd4kVR) z$h{jM<%C!qhwQgDCnOz(no?1K2`Ba-cp!Bi2!glUcOtyb9)VJWunNt(;sqW=>2Shw zr&vcc0?3L)wZcE2HcO~gp%z#}`{Rf=BmT~$f!sUI@X&N1EjbBu{h&zR nWcz?=Zkd;%sbY!i$^gFrA(2EdJvCn|00000NkvXXu0mjf@kCcK literal 0 HcmV?d00001 diff --git a/lib/bmap-wx.js b/lib/bmap-wx.js new file mode 100644 index 0000000..c6ca337 --- /dev/null +++ b/lib/bmap-wx.js @@ -0,0 +1,452 @@ +/** + * @file 微信小程序JSAPI + * @author 崔健 cuijian03@baidu.com 2017.01.10 + * @update 邓淑芳 623996689@qq.com 2019.07.03 + */ + +/** + * 百度地图微信小程序API类 + * + * @class + */ +class BMapWX { + + /** + * 百度地图微信小程序API类 + * + * @constructor + */ + constructor(param) { + this.ak = param["ak"]; + } + + /** + * 使用微信接口进行定位 + * + * @param {string} type 坐标类型 + * @param {Function} success 成功执行 + * @param {Function} fail 失败执行 + * @param {Function} complete 完成后执行 + */ + getWXLocation(type, success, fail, complete) { + type = type || 'gcj02', + success = success || function () { }; + fail = fail || function () { }; + complete = complete || function () { }; + wx.getLocation({ + type: type, + success: success, + fail: fail, + complete: complete + }); + } + + /** + * POI周边检索 + * + * @param {Object} param 检索配置 + * 参数对象结构可以参考 + * http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-placeapi + */ + search(param) { + var that = this; + param = param || {}; + let searchparam = { + query: param["query"] || '生活服务$美食&酒店', + scope: param["scope"] || 1, + filter: param["filter"] || '', + coord_type: param["coord_type"] || 2, + page_size: param["page_size"] || 10, + page_num: param["page_num"] || 0, + output: param["output"] || 'json', + ak: that.ak, + sn: param["sn"] || '', + timestamp: param["timestamp"] || '', + radius: param["radius"] || 2000, + ret_coordtype: 'gcj02ll' + }; + let otherparam = { + iconPath: param["iconPath"], + iconTapPath: param["iconTapPath"], + width: param["width"], + height: param["height"], + alpha: param["alpha"] || 1, + success: param["success"] || function () { }, + fail: param["fail"] || function () { } + }; + let type = 'gcj02'; + let locationsuccess = function (result) { + searchparam["location"] = result["latitude"] + ',' + result["longitude"]; + wx.request({ + url: 'https://api.map.baidu.com/place/v2/search', + data: searchparam, + header: { + "content-type": "application/json" + }, + method: 'GET', + success(data) { + let res = data["data"]; + if (res["status"] === 0) { + let poiArr = res["results"]; + // outputRes 包含两个对象, + // originalData为百度接口返回的原始数据 + // wxMarkerData为小程序规范的marker格式 + let outputRes = {}; + outputRes["originalData"] = res; + outputRes["wxMarkerData"] = []; + for (let i = 0; i < poiArr.length; i++) { + outputRes["wxMarkerData"][i] = { + id: i, + latitude: poiArr[i]["location"]["lat"], + longitude: poiArr[i]["location"]["lng"], + title: poiArr[i]["name"], + iconPath: otherparam["iconPath"], + iconTapPath: otherparam["iconTapPath"], + address: poiArr[i]["address"], + telephone: poiArr[i]["telephone"], + alpha: otherparam["alpha"], + width: otherparam["width"], + height: otherparam["height"] + } + } + otherparam.success(outputRes); + } else { + otherparam.fail({ + errMsg: res["message"], + statusCode: res["status"] + }); + } + }, + fail(data) { + otherparam.fail(data); + } + }); + } + let locationfail = function (result) { + otherparam.fail(result); + }; + let locationcomplete = function (result) { + }; + if (!param["location"]) { + that.getWXLocation(type, locationsuccess, locationfail, locationcomplete); + } else { + let longitude = param.location.split(',')[1]; + let latitude = param.location.split(',')[0]; + let errMsg = 'input location'; + let res = { + errMsg: errMsg, + latitude: latitude, + longitude: longitude + }; + locationsuccess(res); + } + } + + /** + * sug模糊检索 + * + * @param {Object} param 检索配置 + * 参数对象结构可以参考 + * http://lbsyun.baidu.com/index.php?title=webapi/place-suggestion-api + */ + suggestion(param) { + var that = this; + param = param || {}; + let suggestionparam = { + query: param["query"] || '', + region: param["region"] || '全国', + city_limit: param["city_limit"] || false, + output: param["output"] || 'json', + ak: that.ak, + sn: param["sn"] || '', + timestamp: param["timestamp"] || '', + ret_coordtype: 'gcj02ll' + }; + let otherparam = { + success: param["success"] || function () { }, + fail: param["fail"] || function () { } + }; + wx.request({ + url: 'https://api.map.baidu.com/place/v2/suggestion', + data: suggestionparam, + header: { + "content-type": "application/json" + }, + method: 'GET', + success(data) { + let res = data["data"]; + if (res["status"] === 0) { + otherparam.success(res); + } else { + otherparam.fail({ + errMsg: res["message"], + statusCode: res["status"] + }); + } + }, + fail(data) { + otherparam.fail(data); + } + }); + } + + /** + * rgc检索(逆地理编码:经纬度->地点描述) + * + * @param {Object} param 检索配置 + * 参数对象结构可以参考 + * https://lbs.baidu.com/index.php?title=webapi/guide/webservice-geocoding-abroad + * + */ + regeocoding (param) { + var that = this; + param = param || {}; + let regeocodingparam = { + coordtype: param["coordtype"] || 'gcj02ll', + ret_coordtype: 'gcj02ll', + radius: param["radius"] || 1000, + ak: that.ak, + sn: param["sn"] || '', + output: param["output"] || 'json', + callback: param["callback"] || function () { }, + extensions_poi: param["extensions_poi"] || 1, + extensions_road: param["extensions_road"] || false, + extensions_town: param["extensions_town"] || false, + language: param["language"] || 'zh-CN', + language_auto: param["language_auto"] || 0 + }; + let otherparam = { + iconPath: param["iconPath"], + iconTapPath: param["iconTapPath"], + width: param["width"], + height: param["height"], + alpha: param["alpha"] || 1, + success: param["success"] || function () { }, + fail: param["fail"] || function () { } + }; + let type = 'gcj02'; + let locationsuccess = function (result) { + regeocodingparam["location"] = result["latitude"] + ',' + result["longitude"]; + wx.request({ + url: 'https://api.map.baidu.com/reverse_geocoding/v3', + data: regeocodingparam, + header: { + "content-type": "application/json" + }, + method: 'GET', + success(data) { + let res = data["data"]; + if (res["status"] === 0) { + let poiObj = res["result"]; + // outputRes 包含两个对象: + // originalData为百度接口返回的原始数据 + // wxMarkerData为小程序规范的marker格式 + let outputRes = {}; + outputRes["originalData"] = res; + outputRes["wxMarkerData"] = []; + outputRes["wxMarkerData"][0] = { + id: 0, + latitude: result["latitude"], + longitude: result["longitude"], + address: poiObj["formatted_address"], + iconPath: otherparam["iconPath"], + iconTapPath: otherparam["iconTapPath"], + desc: poiObj["sematic_description"], + business: poiObj["business"], + alpha: otherparam["alpha"], + width: otherparam["width"], + height: otherparam["height"] + } + otherparam.success(outputRes); + } else { + otherparam.fail({ + errMsg: res["message"], + statusCode: res["status"] + }); + } + }, + fail(data) { + otherparam.fail(data); + } + }); + }; + let locationfail = function (result) { + otherparam.fail(result); + } + let locationcomplete = function (result) { + }; + if (!param["location"]) { + that.getWXLocation(type, locationsuccess, locationfail, locationcomplete); + } else { + let longitude = param.location.split(',')[1]; + let latitude = param.location.split(',')[0]; + let errMsg = 'input location'; + let res = { + errMsg: errMsg, + latitude: latitude, + longitude: longitude + }; + locationsuccess(res); + } + } + + /** + * gc检索(地理编码:地点->经纬度) + * + * @param {Object} param 检索配置 + * 参数对象结构可以参考 + * https://lbs.baidu.com/index.php?title=webapi/guide/webservice-geocoding + * + */ + geocoding(param) { + var that = this; + param = param || {}; + let geocodingparam = { + address: param["address"] || '', + city: param["city"] || '', + ret_coordtype: param["coordtype"] || 'gcj02ll', + ak: that.ak, + sn: param["sn"] || '', + output: param["output"] || 'json', + callback: param["callback"] || function () { } + }; + let otherparam = { + iconPath: param["iconPath"], + iconTapPath: param["iconTapPath"], + width: param["width"], + height: param["height"], + alpha: param["alpha"] || 1, + success: param["success"] || function () { }, + fail: param["fail"] || function () { } + }; + if (param["address"]) { + wx.request({ + url: 'https://api.map.baidu.com/geocoding/v3', + data: geocodingparam, + header: { + "content-type": "application/json" + }, + method: 'GET', + success(data) { + let res = data["data"]; + if (res["status"] === 0){ + let poiObj = res["result"]; + // outputRes 包含两个对象: + // originalData为百度接口返回的原始数据 + // wxMarkerData为小程序规范的marker格式 + let outputRes = res; + outputRes["originalData"] = res; + outputRes["wxMarkerData"] = []; + outputRes["wxMarkerData"][0] = { + id: 0, + latitude: poiObj["location"]["lat"], + longitude: poiObj["location"]["lng"], + iconPath: otherparam["iconPath"], + iconTapPath: otherparam["iconTapPath"], + alpha: otherparam["alpha"], + width: otherparam["width"], + height: otherparam["height"] + } + otherparam.success(outputRes); + } else { + otherparam.fail({ + errMsg: res["message"], + statusCode: res["status"] + }); + } + }, + fail(data) { + otherparam.fail(data); + } + }); + } else { + let errMsg = 'input address!'; + let res = { + errMsg: errMsg + }; + otherparam.fail(res); + } + } + + /** + * 天气检索 + * + * @param {Object} param 检索配置 + */ + weather(param) { + var that = this; + param = param || {}; + let weatherparam = { + coord_type: param["coord_type"] || 'gcj02', + output: param["output"] || 'json', + ak: that.ak, + sn: param["sn"] || '', + timestamp: param["timestamp"] || '' + }; + let otherparam = { + success: param["success"] || function () { }, + fail: param["fail"] || function () { } + }; + let type = 'gcj02'; + let locationsuccess = function (result) { + weatherparam["location"] = result["longitude"] + ',' + result["latitude"]; + wx.request({ + url: 'https://api.map.baidu.com/telematics/v3/weather', + data: weatherparam, + header: { + "content-type": "application/json" + }, + method: 'GET', + success(data) { + let res = data["data"]; + if (res["error"] === 0 && res["status"] === 'success') { + let weatherArr = res["results"]; + // outputRes 包含两个对象, + // originalData为百度接口返回的原始数据 + // wxMarkerData为小程序规范的marker格式 + let outputRes = {}; + outputRes["originalData"] = res; + outputRes["currentWeather"] = []; + outputRes["currentWeather"][0] = { + currentCity: weatherArr[0]["currentCity"], + pm25: weatherArr[0]["pm25"], + date: weatherArr[0]["weather_data"][0]["date"], + temperature: weatherArr[0]["weather_data"][0]["temperature"], + weatherDesc: weatherArr[0]["weather_data"][0]["weather"], + wind: weatherArr[0]["weather_data"][0]["wind"] + }; + otherparam.success(outputRes); + } else { + otherparam.fail({ + errMsg: res["message"], + statusCode: res["status"] + }); + } + }, + fail(data) { + otherparam.fail(data); + } + }); + } + let locationfail = function (result) { + otherparam.fail(result); + } + let locationcomplete = function (result) { + } + if (!param["location"]) { + that.getWXLocation(type, locationsuccess, locationfail, locationcomplete); + } else { + let longitude = param.location.split(',')[0]; + let latitude = param.location.split(',')[1]; + let errMsg = 'input location'; + let res = { + errMsg: errMsg, + latitude: latitude, + longitude: longitude + }; + locationsuccess(res); + } + } + } + + module.exports.BMapWX = BMapWX; \ No newline at end of file diff --git a/lib/qqmap-wx-jssdk.js b/lib/qqmap-wx-jssdk.js new file mode 100644 index 0000000..595b65b --- /dev/null +++ b/lib/qqmap-wx-jssdk.js @@ -0,0 +1,1122 @@ +/** + * 微信小程序JavaScriptSDK + * + * @version 1.2 + * @date 2019-03-06 + */ + +var ERROR_CONF = { + KEY_ERR: 311, + KEY_ERR_MSG: 'key格式错误', + PARAM_ERR: 310, + PARAM_ERR_MSG: '请求参数信息有误', + SYSTEM_ERR: 600, + SYSTEM_ERR_MSG: '系统错误', + WX_ERR_CODE: 1000, + WX_OK_CODE: 200 +}; +var BASE_URL = 'https://apis.map.qq.com/ws/'; +var URL_SEARCH = BASE_URL + 'place/v1/search'; +var URL_SUGGESTION = BASE_URL + 'place/v1/suggestion'; +var URL_GET_GEOCODER = BASE_URL + 'geocoder/v1/'; +var URL_CITY_LIST = BASE_URL + 'district/v1/list'; +var URL_AREA_LIST = BASE_URL + 'district/v1/getchildren'; +var URL_DISTANCE = BASE_URL + 'distance/v1/'; +var URL_DIRECTION = BASE_URL + 'direction/v1/'; +var MODE = { + driving: 'driving', + transit: 'transit' +}; +var EARTH_RADIUS = 6378136.49; +var Utils = { + /** + * md5加密方法 + * 版权所有©2011 Sebastian Tschan,https://blueimp.net + */ + safeAdd(x, y) { + var lsw = (x & 0xffff) + (y & 0xffff); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xffff); + }, + bitRotateLeft(num, cnt) { + return (num << cnt) | (num >>> (32 - cnt)); + }, + md5cmn(q, a, b, x, s, t) { + return this.safeAdd(this.bitRotateLeft(this.safeAdd(this.safeAdd(a, q), this.safeAdd(x, t)), s), b); + }, + md5ff(a, b, c, d, x, s, t) { + return this.md5cmn((b & c) | (~b & d), a, b, x, s, t); + }, + md5gg(a, b, c, d, x, s, t) { + return this.md5cmn((b & d) | (c & ~d), a, b, x, s, t); + }, + md5hh(a, b, c, d, x, s, t) { + return this.md5cmn(b ^ c ^ d, a, b, x, s, t); + }, + md5ii(a, b, c, d, x, s, t) { + return this.md5cmn(c ^ (b | ~d), a, b, x, s, t); + }, + binlMD5(x, len) { + /* append padding */ + x[len >> 5] |= 0x80 << (len % 32); + x[((len + 64) >>> 9 << 4) + 14] = len; + + var i; + var olda; + var oldb; + var oldc; + var oldd; + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + var d = 271733878; + + for (i = 0; i < x.length; i += 16) { + olda = a; + oldb = b; + oldc = c; + oldd = d; + + a = this.md5ff(a, b, c, d, x[i], 7, -680876936); + d = this.md5ff(d, a, b, c, x[i + 1], 12, -389564586); + c = this.md5ff(c, d, a, b, x[i + 2], 17, 606105819); + b = this.md5ff(b, c, d, a, x[i + 3], 22, -1044525330); + a = this.md5ff(a, b, c, d, x[i + 4], 7, -176418897); + d = this.md5ff(d, a, b, c, x[i + 5], 12, 1200080426); + c = this.md5ff(c, d, a, b, x[i + 6], 17, -1473231341); + b = this.md5ff(b, c, d, a, x[i + 7], 22, -45705983); + a = this.md5ff(a, b, c, d, x[i + 8], 7, 1770035416); + d = this.md5ff(d, a, b, c, x[i + 9], 12, -1958414417); + c = this.md5ff(c, d, a, b, x[i + 10], 17, -42063); + b = this.md5ff(b, c, d, a, x[i + 11], 22, -1990404162); + a = this.md5ff(a, b, c, d, x[i + 12], 7, 1804603682); + d = this.md5ff(d, a, b, c, x[i + 13], 12, -40341101); + c = this.md5ff(c, d, a, b, x[i + 14], 17, -1502002290); + b = this.md5ff(b, c, d, a, x[i + 15], 22, 1236535329); + + a = this.md5gg(a, b, c, d, x[i + 1], 5, -165796510); + d = this.md5gg(d, a, b, c, x[i + 6], 9, -1069501632); + c = this.md5gg(c, d, a, b, x[i + 11], 14, 643717713); + b = this.md5gg(b, c, d, a, x[i], 20, -373897302); + a = this.md5gg(a, b, c, d, x[i + 5], 5, -701558691); + d = this.md5gg(d, a, b, c, x[i + 10], 9, 38016083); + c = this.md5gg(c, d, a, b, x[i + 15], 14, -660478335); + b = this.md5gg(b, c, d, a, x[i + 4], 20, -405537848); + a = this.md5gg(a, b, c, d, x[i + 9], 5, 568446438); + d = this.md5gg(d, a, b, c, x[i + 14], 9, -1019803690); + c = this.md5gg(c, d, a, b, x[i + 3], 14, -187363961); + b = this.md5gg(b, c, d, a, x[i + 8], 20, 1163531501); + a = this.md5gg(a, b, c, d, x[i + 13], 5, -1444681467); + d = this.md5gg(d, a, b, c, x[i + 2], 9, -51403784); + c = this.md5gg(c, d, a, b, x[i + 7], 14, 1735328473); + b = this.md5gg(b, c, d, a, x[i + 12], 20, -1926607734); + + a = this.md5hh(a, b, c, d, x[i + 5], 4, -378558); + d = this.md5hh(d, a, b, c, x[i + 8], 11, -2022574463); + c = this.md5hh(c, d, a, b, x[i + 11], 16, 1839030562); + b = this.md5hh(b, c, d, a, x[i + 14], 23, -35309556); + a = this.md5hh(a, b, c, d, x[i + 1], 4, -1530992060); + d = this.md5hh(d, a, b, c, x[i + 4], 11, 1272893353); + c = this.md5hh(c, d, a, b, x[i + 7], 16, -155497632); + b = this.md5hh(b, c, d, a, x[i + 10], 23, -1094730640); + a = this.md5hh(a, b, c, d, x[i + 13], 4, 681279174); + d = this.md5hh(d, a, b, c, x[i], 11, -358537222); + c = this.md5hh(c, d, a, b, x[i + 3], 16, -722521979); + b = this.md5hh(b, c, d, a, x[i + 6], 23, 76029189); + a = this.md5hh(a, b, c, d, x[i + 9], 4, -640364487); + d = this.md5hh(d, a, b, c, x[i + 12], 11, -421815835); + c = this.md5hh(c, d, a, b, x[i + 15], 16, 530742520); + b = this.md5hh(b, c, d, a, x[i + 2], 23, -995338651); + + a = this.md5ii(a, b, c, d, x[i], 6, -198630844); + d = this.md5ii(d, a, b, c, x[i + 7], 10, 1126891415); + c = this.md5ii(c, d, a, b, x[i + 14], 15, -1416354905); + b = this.md5ii(b, c, d, a, x[i + 5], 21, -57434055); + a = this.md5ii(a, b, c, d, x[i + 12], 6, 1700485571); + d = this.md5ii(d, a, b, c, x[i + 3], 10, -1894986606); + c = this.md5ii(c, d, a, b, x[i + 10], 15, -1051523); + b = this.md5ii(b, c, d, a, x[i + 1], 21, -2054922799); + a = this.md5ii(a, b, c, d, x[i + 8], 6, 1873313359); + d = this.md5ii(d, a, b, c, x[i + 15], 10, -30611744); + c = this.md5ii(c, d, a, b, x[i + 6], 15, -1560198380); + b = this.md5ii(b, c, d, a, x[i + 13], 21, 1309151649); + a = this.md5ii(a, b, c, d, x[i + 4], 6, -145523070); + d = this.md5ii(d, a, b, c, x[i + 11], 10, -1120210379); + c = this.md5ii(c, d, a, b, x[i + 2], 15, 718787259); + b = this.md5ii(b, c, d, a, x[i + 9], 21, -343485551); + + a = this.safeAdd(a, olda); + b = this.safeAdd(b, oldb); + c = this.safeAdd(c, oldc); + d = this.safeAdd(d, oldd); + } + return [a, b, c, d]; + }, + binl2rstr(input) { + var i; + var output = ''; + var length32 = input.length * 32; + for (i = 0; i < length32; i += 8) { + output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff); + } + return output; + }, + rstr2binl(input) { + var i; + var output = []; + output[(input.length >> 2) - 1] = undefined; + for (i = 0; i < output.length; i += 1) { + output[i] = 0; + } + var length8 = input.length * 8; + for (i = 0; i < length8; i += 8) { + output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32); + } + return output; + }, + rstrMD5(s) { + return this.binl2rstr(this.binlMD5(this.rstr2binl(s), s.length * 8)); + }, + rstrHMACMD5(key, data) { + var i; + var bkey = this.rstr2binl(key); + var ipad = []; + var opad = []; + var hash; + ipad[15] = opad[15] = undefined; + if (bkey.length > 16) { + bkey = this.binlMD5(bkey, key.length * 8); + } + for (i = 0; i < 16; i += 1) { + ipad[i] = bkey[i] ^ 0x36363636; + opad[i] = bkey[i] ^ 0x5c5c5c5c; + } + hash = this.binlMD5(ipad.concat(this.rstr2binl(data)), 512 + data.length * 8); + return this.binl2rstr(this.binlMD5(opad.concat(hash), 512 + 128)); + }, + rstr2hex(input) { + var hexTab = '0123456789abcdef'; + var output = ''; + var x; + var i; + for (i = 0; i < input.length; i += 1) { + x = input.charCodeAt(i); + output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f); + } + return output; + }, + str2rstrUTF8(input) { + return unescape(encodeURIComponent(input)); + }, + rawMD5(s) { + return this.rstrMD5(this.str2rstrUTF8(s)); + }, + hexMD5(s) { + return this.rstr2hex(this.rawMD5(s)); + }, + rawHMACMD5(k, d) { + return this.rstrHMACMD5(this.str2rstrUTF8(k), str2rstrUTF8(d)); + }, + hexHMACMD5(k, d) { + return this.rstr2hex(this.rawHMACMD5(k, d)); + }, + + md5(string, key, raw) { + if (!key) { + if (!raw) { + return this.hexMD5(string); + } + return this.rawMD5(string); + } + if (!raw) { + return this.hexHMACMD5(key, string); + } + return this.rawHMACMD5(key, string); + }, + /** + * 得到md5加密后的sig参数 + * @param {Object} requestParam 接口参数 + * @param {String} sk签名字符串 + * @param {String} featrue 方法名 + * @return 返回加密后的sig参数 + */ + getSig(requestParam, sk, feature, mode) { + var sig = null; + var requestArr = []; + Object.keys(requestParam).sort().forEach(function(key){ + requestArr.push(key + '=' + requestParam[key]); + }); + if (feature == 'search') { + sig = '/ws/place/v1/search?' + requestArr.join('&') + sk; + } + if (feature == 'suggest') { + sig = '/ws/place/v1/suggestion?' + requestArr.join('&') + sk; + } + if (feature == 'reverseGeocoder') { + sig = '/ws/geocoder/v1/?' + requestArr.join('&') + sk; + } + if (feature == 'geocoder') { + sig = '/ws/geocoder/v1/?' + requestArr.join('&') + sk; + } + if (feature == 'getCityList') { + sig = '/ws/district/v1/list?' + requestArr.join('&') + sk; + } + if (feature == 'getDistrictByCityId') { + sig = '/ws/district/v1/getchildren?' + requestArr.join('&') + sk; + } + if (feature == 'calculateDistance') { + sig = '/ws/distance/v1/?' + requestArr.join('&') + sk; + } + if (feature == 'direction') { + sig = '/ws/direction/v1/' + mode + '?' + requestArr.join('&') + sk; + } + sig = this.md5(sig); + return sig; + }, + /** + * 得到终点query字符串 + * @param {Array|String} 检索数据 + */ + location2query(data) { + if (typeof data == 'string') { + return data; + } + var query = ''; + for (var i = 0; i < data.length; i++) { + var d = data[i]; + if (!!query) { + query += ';'; + } + if (d.location) { + query = query + d.location.lat + ',' + d.location.lng; + } + if (d.latitude && d.longitude) { + query = query + d.latitude + ',' + d.longitude; + } + } + return query; + }, + + /** + * 计算角度 + */ + rad(d) { + return d * Math.PI / 180.0; + }, + /** + * 处理终点location数组 + * @return 返回终点数组 + */ + getEndLocation(location){ + var to = location.split(';'); + var endLocation = []; + for (var i = 0; i < to.length; i++) { + endLocation.push({ + lat: parseFloat(to[i].split(',')[0]), + lng: parseFloat(to[i].split(',')[1]) + }) + } + return endLocation; + }, + + /** + * 计算两点间直线距离 + * @param a 表示纬度差 + * @param b 表示经度差 + * @return 返回的是距离,单位m + */ + getDistance(latFrom, lngFrom, latTo, lngTo) { + var radLatFrom = this.rad(latFrom); + var radLatTo = this.rad(latTo); + var a = radLatFrom - radLatTo; + var b = this.rad(lngFrom) - this.rad(lngTo); + var distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLatFrom) * Math.cos(radLatTo) * Math.pow(Math.sin(b / 2), 2))); + distance = distance * EARTH_RADIUS; + distance = Math.round(distance * 10000) / 10000; + return parseFloat(distance.toFixed(0)); + }, + /** + * 使用微信接口进行定位 + */ + getWXLocation(success, fail, complete) { + wx.getLocation({ + type: 'gcj02', + success: success, + fail: fail, + complete: complete + }); + }, + + /** + * 获取location参数 + */ + getLocationParam(location) { + if (typeof location == 'string') { + var locationArr = location.split(','); + if (locationArr.length === 2) { + location = { + latitude: location.split(',')[0], + longitude: location.split(',')[1] + }; + } else { + location = {}; + } + } + return location; + }, + + /** + * 回调函数默认处理 + */ + polyfillParam(param) { + param.success = param.success || function () { }; + param.fail = param.fail || function () { }; + param.complete = param.complete || function () { }; + }, + + /** + * 验证param对应的key值是否为空 + * + * @param {Object} param 接口参数 + * @param {String} key 对应参数的key + */ + checkParamKeyEmpty(param, key) { + if (!param[key]) { + var errconf = this.buildErrorConfig(ERROR_CONF.PARAM_ERR, ERROR_CONF.PARAM_ERR_MSG + key +'参数格式有误'); + param.fail(errconf); + param.complete(errconf); + return true; + } + return false; + }, + + /** + * 验证参数中是否存在检索词keyword + * + * @param {Object} param 接口参数 + */ + checkKeyword(param){ + return !this.checkParamKeyEmpty(param, 'keyword'); + }, + + /** + * 验证location值 + * + * @param {Object} param 接口参数 + */ + checkLocation(param) { + var location = this.getLocationParam(param.location); + if (!location || !location.latitude || !location.longitude) { + var errconf = this.buildErrorConfig(ERROR_CONF.PARAM_ERR, ERROR_CONF.PARAM_ERR_MSG + ' location参数格式有误'); + param.fail(errconf); + param.complete(errconf); + return false; + } + return true; + }, + + /** + * 构造错误数据结构 + * @param {Number} errCode 错误码 + * @param {Number} errMsg 错误描述 + */ + buildErrorConfig(errCode, errMsg) { + return { + status: errCode, + message: errMsg + }; + }, + + /** + * + * 数据处理函数 + * 根据传入参数不同处理不同数据 + * @param {String} feature 功能名称 + * search 地点搜索 + * suggest关键词提示 + * reverseGeocoder逆地址解析 + * geocoder地址解析 + * getCityList获取城市列表:父集 + * getDistrictByCityId获取区县列表:子集 + * calculateDistance距离计算 + * @param {Object} param 接口参数 + * @param {Object} data 数据 + */ + handleData(param,data,feature){ + if (feature == 'search') { + var searchResult = data.data; + var searchSimplify = []; + for (var i = 0; i < searchResult.length; i++) { + searchSimplify.push({ + id: searchResult[i].id || null, + title: searchResult[i].title || null, + latitude: searchResult[i].location && searchResult[i].location.lat || null, + longitude: searchResult[i].location && searchResult[i].location.lng || null, + address: searchResult[i].address || null, + category: searchResult[i].category || null, + tel: searchResult[i].tel || null, + adcode: searchResult[i].ad_info && searchResult[i].ad_info.adcode || null, + city: searchResult[i].ad_info && searchResult[i].ad_info.city || null, + district: searchResult[i].ad_info && searchResult[i].ad_info.district || null, + province: searchResult[i].ad_info && searchResult[i].ad_info.province || null + }) + } + param.success(data, { + searchResult: searchResult, + searchSimplify: searchSimplify + }) + } else if (feature == 'suggest') { + var suggestResult = data.data; + var suggestSimplify = []; + for (var i = 0; i < suggestResult.length; i++) { + suggestSimplify.push({ + adcode: suggestResult[i].adcode || null, + address: suggestResult[i].address || null, + category: suggestResult[i].category || null, + city: suggestResult[i].city || null, + district: suggestResult[i].district || null, + id: suggestResult[i].id || null, + latitude: suggestResult[i].location && suggestResult[i].location.lat || null, + longitude: suggestResult[i].location && suggestResult[i].location.lng || null, + province: suggestResult[i].province || null, + title: suggestResult[i].title || null, + type: suggestResult[i].type || null + }) + } + param.success(data, { + suggestResult: suggestResult, + suggestSimplify: suggestSimplify + }) + } else if (feature == 'reverseGeocoder') { + var reverseGeocoderResult = data.result; + var reverseGeocoderSimplify = { + address: reverseGeocoderResult.address || null, + latitude: reverseGeocoderResult.location && reverseGeocoderResult.location.lat || null, + longitude: reverseGeocoderResult.location && reverseGeocoderResult.location.lng || null, + adcode: reverseGeocoderResult.ad_info && reverseGeocoderResult.ad_info.adcode || null, + city: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.city || null, + district: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.district || null, + nation: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.nation || null, + province: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.province || null, + street: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.street || null, + street_number: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.street_number || null, + recommend: reverseGeocoderResult.formatted_addresses && reverseGeocoderResult.formatted_addresses.recommend || null, + rough: reverseGeocoderResult.formatted_addresses && reverseGeocoderResult.formatted_addresses.rough || null + }; + if (reverseGeocoderResult.pois) {//判断是否返回周边poi + var pois = reverseGeocoderResult.pois; + var poisSimplify = []; + for (var i = 0;i < pois.length;i++) { + poisSimplify.push({ + id: pois[i].id || null, + title: pois[i].title || null, + latitude: pois[i].location && pois[i].location.lat || null, + longitude: pois[i].location && pois[i].location.lng || null, + address: pois[i].address || null, + category: pois[i].category || null, + adcode: pois[i].ad_info && pois[i].ad_info.adcode || null, + city: pois[i].ad_info && pois[i].ad_info.city || null, + district: pois[i].ad_info && pois[i].ad_info.district || null, + province: pois[i].ad_info && pois[i].ad_info.province || null + }) + } + param.success(data,{ + reverseGeocoderResult: reverseGeocoderResult, + reverseGeocoderSimplify: reverseGeocoderSimplify, + pois: pois, + poisSimplify: poisSimplify + }) + } else { + param.success(data, { + reverseGeocoderResult: reverseGeocoderResult, + reverseGeocoderSimplify: reverseGeocoderSimplify + }) + } + } else if (feature == 'geocoder') { + var geocoderResult = data.result; + var geocoderSimplify = { + title: geocoderResult.title || null, + latitude: geocoderResult.location && geocoderResult.location.lat || null, + longitude: geocoderResult.location && geocoderResult.location.lng || null, + adcode: geocoderResult.ad_info && geocoderResult.ad_info.adcode || null, + province: geocoderResult.address_components && geocoderResult.address_components.province || null, + city: geocoderResult.address_components && geocoderResult.address_components.city || null, + district: geocoderResult.address_components && geocoderResult.address_components.district || null, + street: geocoderResult.address_components && geocoderResult.address_components.street || null, + street_number: geocoderResult.address_components && geocoderResult.address_components.street_number || null, + level: geocoderResult.level || null + }; + param.success(data,{ + geocoderResult: geocoderResult, + geocoderSimplify: geocoderSimplify + }); + } else if (feature == 'getCityList') { + var provinceResult = data.result[0]; + var cityResult = data.result[1]; + var districtResult = data.result[2]; + param.success(data,{ + provinceResult: provinceResult, + cityResult: cityResult, + districtResult: districtResult + }); + } else if (feature == 'getDistrictByCityId') { + var districtByCity = data.result[0]; + param.success(data, districtByCity); + } else if (feature == 'calculateDistance') { + var calculateDistanceResult = data.result.elements; + var distance = []; + for (var i = 0; i < calculateDistanceResult.length; i++){ + distance.push(calculateDistanceResult[i].distance); + } + param.success(data, { + calculateDistanceResult: calculateDistanceResult, + distance: distance + }); + } else if (feature == 'direction') { + var direction = data.result.routes; + param.success(data,direction); + } else { + param.success(data); + } + }, + + /** + * 构造微信请求参数,公共属性处理 + * + * @param {Object} param 接口参数 + * @param {Object} param 配置项 + * @param {String} feature 方法名 + */ + buildWxRequestConfig(param, options, feature) { + var that = this; + options.header = { "content-type": "application/json" }; + options.method = 'GET'; + options.success = function (res) { + var data = res.data; + if (data.status === 0) { + that.handleData(param, data, feature); + } else { + param.fail(data); + } + }; + options.fail = function (res) { + res.statusCode = ERROR_CONF.WX_ERR_CODE; + param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg)); + }; + options.complete = function (res) { + var statusCode = +res.statusCode; + switch(statusCode) { + case ERROR_CONF.WX_ERR_CODE: { + param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg)); + break; + } + case ERROR_CONF.WX_OK_CODE: { + var data = res.data; + if (data.status === 0) { + param.complete(data); + } else { + param.complete(that.buildErrorConfig(data.status, data.message)); + } + break; + } + default:{ + param.complete(that.buildErrorConfig(ERROR_CONF.SYSTEM_ERR, ERROR_CONF.SYSTEM_ERR_MSG)); + } + + } + }; + return options; + }, + + /** + * 处理用户参数是否传入坐标进行不同的处理 + */ + locationProcess(param, locationsuccess, locationfail, locationcomplete) { + var that = this; + locationfail = locationfail || function (res) { + res.statusCode = ERROR_CONF.WX_ERR_CODE; + param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg)); + }; + locationcomplete = locationcomplete || function (res) { + if (res.statusCode == ERROR_CONF.WX_ERR_CODE) { + param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg)); + } + }; + if (!param.location) { + that.getWXLocation(locationsuccess, locationfail, locationcomplete); + } else if (that.checkLocation(param)) { + var location = Utils.getLocationParam(param.location); + locationsuccess(location); + } + } +}; + + +class QQMapWX { + + /** + * 构造函数 + * + * @param {Object} options 接口参数,key 为必选参数 + */ + constructor(options) { + if (!options.key) { + throw Error('key值不能为空'); + } + this.key = options.key; + }; + + /** + * POI周边检索 + * + * @param {Object} options 接口参数对象 + * + * 参数对象结构可以参考 + * @see http://lbs.qq.com/webservice_v1/guide-search.html + */ + search(options) { + var that = this; + options = options || {}; + + Utils.polyfillParam(options); + + if (!Utils.checkKeyword(options)) { + return; + } + + var requestParam = { + keyword: options.keyword, + orderby: options.orderby || '_distance', + page_size: options.page_size || 10, + page_index: options.page_index || 1, + output: 'json', + key: that.key + }; + + if (options.address_format) { + requestParam.address_format = options.address_format; + } + + if (options.filter) { + requestParam.filter = options.filter; + } + + var distance = options.distance || "1000"; + var auto_extend = options.auto_extend || 1; + var region = null; + var rectangle = null; + + //判断城市限定参数 + if (options.region) { + region = options.region; + } + + //矩形限定坐标(暂时只支持字符串格式) + if (options.rectangle) { + rectangle = options.rectangle; + } + + var locationsuccess = function (result) { + if (region && !rectangle) { + //城市限定参数拼接 + requestParam.boundary = "region(" + region + "," + auto_extend + "," + result.latitude + "," + result.longitude + ")"; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'search'); + } + } else if (rectangle && !region) { + //矩形搜索 + requestParam.boundary = "rectangle(" + rectangle + ")"; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'search'); + } + } else { + requestParam.boundary = "nearby(" + result.latitude + "," + result.longitude + "," + distance + "," + auto_extend + ")"; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'search'); + } + } + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_SEARCH, + data: requestParam + }, 'search')); + }; + Utils.locationProcess(options, locationsuccess); + }; + + /** + * sug模糊检索 + * + * @param {Object} options 接口参数对象 + * + * 参数对象结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-suggestion.html + */ + getSuggestion(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + + if (!Utils.checkKeyword(options)) { + return; + } + + var requestParam = { + keyword: options.keyword, + region: options.region || '全国', + region_fix: options.region_fix || 0, + policy: options.policy || 0, + page_size: options.page_size || 10,//控制显示条数 + page_index: options.page_index || 1,//控制页数 + get_subpois : options.get_subpois || 0,//返回子地点 + output: 'json', + key: that.key + }; + //长地址 + if (options.address_format) { + requestParam.address_format = options.address_format; + } + //过滤 + if (options.filter) { + requestParam.filter = options.filter; + } + //排序 + if (options.location) { + var locationsuccess = function (result) { + requestParam.location = result.latitude + ',' + result.longitude; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'suggest'); + } + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_SUGGESTION, + data: requestParam + }, "suggest")); + }; + Utils.locationProcess(options, locationsuccess); + } else { + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'suggest'); + } + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_SUGGESTION, + data: requestParam + }, "suggest")); + } + }; + + /** + * 逆地址解析 + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-gcoder.html + */ + reverseGeocoder(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + var requestParam = { + coord_type: options.coord_type || 5, + get_poi: options.get_poi || 0, + output: 'json', + key: that.key + }; + if (options.poi_options) { + requestParam.poi_options = options.poi_options + } + + var locationsuccess = function (result) { + requestParam.location = result.latitude + ',' + result.longitude; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'reverseGeocoder'); + } + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_GET_GEOCODER, + data: requestParam + }, 'reverseGeocoder')); + }; + Utils.locationProcess(options, locationsuccess); + }; + + /** + * 地址解析 + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-geocoder.html + */ + geocoder(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + + if (Utils.checkParamKeyEmpty(options, 'address')) { + return; + } + + var requestParam = { + address: options.address, + output: 'json', + key: that.key + }; + + //城市限定 + if (options.region) { + requestParam.region = options.region; + } + + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'geocoder'); + } + + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_GET_GEOCODER, + data: requestParam + },'geocoder')); + }; + + + /** + * 获取城市列表 + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-region.html + */ + getCityList(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + var requestParam = { + output: 'json', + key: that.key + }; + + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'getCityList'); + } + + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_CITY_LIST, + data: requestParam + },'getCityList')); + }; + + /** + * 获取对应城市ID的区县列表 + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-region.html + */ + getDistrictByCityId(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + + if (Utils.checkParamKeyEmpty(options, 'id')) { + return; + } + + var requestParam = { + id: options.id || '', + output: 'json', + key: that.key + }; + + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'getDistrictByCityId'); + } + + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_AREA_LIST, + data: requestParam + },'getDistrictByCityId')); + }; + + /** + * 用于单起点到多终点的路线距离(非直线距离)计算: + * 支持两种距离计算方式:步行和驾车。 + * 起点到终点最大限制直线距离10公里。 + * + * 新增直线距离计算。 + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-distance.html + */ + calculateDistance(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + + if (Utils.checkParamKeyEmpty(options, 'to')) { + return; + } + + var requestParam = { + mode: options.mode || 'walking', + to: Utils.location2query(options.to), + output: 'json', + key: that.key + }; + + if (options.from) { + options.location = options.from; + } + + //计算直线距离 + if(requestParam.mode == 'straight'){ + var locationsuccess = function (result) { + var locationTo = Utils.getEndLocation(requestParam.to);//处理终点坐标 + var data = { + message:"query ok", + result:{ + elements:[] + }, + status:0 + }; + for (var i = 0; i < locationTo.length; i++) { + data.result.elements.push({//将坐标存入 + distance: Utils.getDistance(result.latitude, result.longitude, locationTo[i].lat, locationTo[i].lng), + duration:0, + from:{ + lat: result.latitude, + lng:result.longitude + }, + to:{ + lat: locationTo[i].lat, + lng: locationTo[i].lng + } + }); + } + var calculateResult = data.result.elements; + var distanceResult = []; + for (var i = 0; i < calculateResult.length; i++) { + distanceResult.push(calculateResult[i].distance); + } + return options.success(data,{ + calculateResult: calculateResult, + distanceResult: distanceResult + }); + }; + + Utils.locationProcess(options, locationsuccess); + } else { + var locationsuccess = function (result) { + requestParam.from = result.latitude + ',' + result.longitude; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'calculateDistance'); + } + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_DISTANCE, + data: requestParam + },'calculateDistance')); + }; + + Utils.locationProcess(options, locationsuccess); + } + }; + + /** + * 路线规划: + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * https://lbs.qq.com/webservice_v1/guide-road.html + */ + direction(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + + if (Utils.checkParamKeyEmpty(options, 'to')) { + return; + } + + var requestParam = { + output: 'json', + key: that.key + }; + + //to格式处理 + if (typeof options.to == 'string') { + requestParam.to = options.to; + } else { + requestParam.to = options.to.latitude + ',' + options.to.longitude; + } + //初始化局部请求域名 + var SET_URL_DIRECTION = null; + //设置默认mode属性 + options.mode = options.mode || MODE.driving; + + //设置请求域名 + SET_URL_DIRECTION = URL_DIRECTION + options.mode; + + if (options.from) { + options.location = options.from; + } + + if (options.mode == MODE.driving) { + if (options.from_poi) { + requestParam.from_poi = options.from_poi; + } + if (options.heading) { + requestParam.heading = options.heading; + } + if (options.speed) { + requestParam.speed = options.speed; + } + if (options.accuracy) { + requestParam.accuracy = options.accuracy; + } + if (options.road_type) { + requestParam.road_type = options.road_type; + } + if (options.to_poi) { + requestParam.to_poi = options.to_poi; + } + if (options.from_track) { + requestParam.from_track = options.from_track; + } + if (options.waypoints) { + requestParam.waypoints = options.waypoints; + } + if (options.policy) { + requestParam.policy = options.policy; + } + if (options.plate_number) { + requestParam.plate_number = options.plate_number; + } + } + + if (options.mode == MODE.transit) { + if (options.departure_time) { + requestParam.departure_time = options.departure_time; + } + if (options.policy) { + requestParam.policy = options.policy; + } + } + + var locationsuccess = function (result) { + requestParam.from = result.latitude + ',' + result.longitude; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'direction',options.mode); + } + wx.request(Utils.buildWxRequestConfig(options, { + url: SET_URL_DIRECTION, + data: requestParam + }, 'direction')); + }; + + Utils.locationProcess(options, locationsuccess); + } +}; + +module.exports = QQMapWX; \ No newline at end of file diff --git a/pages/caseCheck/caseCheck.js b/pages/caseCheck/caseCheck.js new file mode 100644 index 0000000..c461bed --- /dev/null +++ b/pages/caseCheck/caseCheck.js @@ -0,0 +1,228 @@ +// pages/caseCheck/caseCheck.js +var bmap = require('../../lib/bmap-wx.js'); +var app = getApp() +Page({ + + /** + * 页面的初始数据 + */ + data: { + caseId: '', + longitude: '111.759608', + latitude: '40.860318', + markers: [], + caseDetail: {}, + token: wx.getStorageSync('token'), + requestUrl: app.requestUrl, + evaluateContent: '', + isPass: 1, + grade: '', + photoList: [] + }, + getDetail: function () { + var self = this + app.restAjax.get(app.restAjax.path('{reqesutUrl}app/reportcase/getreportcase/' + self.data.caseId, [app.requestUrl]), {}, { + headers: { + token: self.data.token + } + }, function (code, data) { + console.log(data) + var imgArr, handleArr + imgArr = data.casePhotos.split(',') + handleArr = data.handlePhotos.split(',') + var arr = [{longitude: data.caseLongitude,latitude: data.caseLatitude,iconPath:'../../images/marker_red.png',width:'25px',height: '30px'}] + self.setData({ + markers: arr + }); + self.setData({ + caseDetail: data, + longitude: data.caseLongitude, + latitude: data.caseLatitude, + imageList: imgArr, + handleList: handleArr + }) + }); + }, + isQualified: function (e) { + this.setData({ + isPass: e.detail.value + }) + }, + isSatisfied: function (e) { + this.setData({ + grade: e.detail.value + }) + }, + // 选择图片 + chooseImage: function () { + var self = this + wx.chooseImage({ + count: 9 - self.data.photoList.length, + sourceType: ['album', 'camera'], + success: function (res) { + console.log(res) + self.setData({ + showPhotoList: self.data.photoList.concat(res.tempFiles) + }) + wx.showToast({ + title: '上传中', + icon: 'loading' + }) + var arr = [] + for (let i = 0; i < res.tempFiles.length; i++) { + var path = res.tempFiles[i].path; + app.restAjax.file(app.restAjax.path('{requestUrl}app/file/uploadimage', [app.requestUrl]), path, 'image', { + headers: { + token: self.data.token + } + }, function (code, data) { + var id = JSON.parse(data).data + arr.push(id) + if (arr.length == res.tempFiles.length) { + self.setData({ + photoList: arr + }) + wx.hideToast() + } + }, function (code, data) { + console.log(data) + }) + } + } + }) + }, + // 删除图片 + deleteImg: function (e) { + var idx = e.currentTarget.dataset.num + var self = this + self.data.photoList.splice(idx, 1) + self.data.showPhotoList.splice(idx, 1) + self.setData({ + showPhotoList: self.data.showPhotoList, + photoList: self.data.photoList + }) + }, + // 确认处理 + submitHandle: function () { + var photo = '', self = this + if (!self.data.evaluateContent) { + wx.showToast({ + title: '请输入评价内容', + duration: 2000, + icon: 'none' + }) + return + } + if (!self.data.grade) { + wx.showToast({ + title: '请选择满意度', + duration: 2000, + icon: 'none' + }) + return + } + if (this.data.photoList.length == 0) { + wx.showToast({ + title: '请至少上传一张照片', + duration: 2000, + icon: 'none' + }) + return + } + for (let i = 0; i < this.data.photoList.length; i++) { + + if (i == this.data.photoList.length - 1) { + photo += this.data.photoList[i] + } else { + photo += this.data.photoList[i] + ',' + } + console.log(i, photo) + } + var info = { + inspectPhotos: photo, + inspectOpinion: self.data.evaluateContent, + isPass: self.data.isPass, + grade: self.data.grade + } + app.restAjax.post(app.restAjax.path('{reqesutUrl}app/reportcase/savereportcaseinspect/' + self.data.caseId, [app.requestUrl]), info, { + headers: { + token: self.data.token + } + }, function (code, data) { + if (code == '200') { + wx.showToast({ + title: '处理成功', + duration: 2000, + success: function () { + setTimeout(function () { + wx.navigateTo({ + url: '../index/index', + }) + }, 2000) + } + }) + } + }); + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + this.setData({ + caseId: options.id + }) + this.getDetail() + var BMap = new bmap.BMapWX({ + ak: 'Zk732rbyjd327q7Zj9EOtRjUn2ED1GWK' + }); + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/caseCheck/caseCheck.json b/pages/caseCheck/caseCheck.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/caseCheck/caseCheck.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/caseCheck/caseCheck.wxml b/pages/caseCheck/caseCheck.wxml new file mode 100644 index 0000000..29216d9 --- /dev/null +++ b/pages/caseCheck/caseCheck.wxml @@ -0,0 +1,89 @@ + + + + {{caseDetail.communityName}} + 待处理 + + + {{caseDetail.caseContent}} + 上报时间:{{caseDetail.reportDate}} + 上报类型:{{caseDetail.caseTypeName}} + 上报人员:{{caseDetail.caseReporter}} + + + + + + {{caseDetail.casePosition}} + + + + + + + 案件处理详情 + + 处理人员:{{caseDetail.handleUserName}} + 处理时间:{{caseDetail.handleCreateTime}} + {{caseDetail.handleOpinion}} + + + + + + + *案件处理详情 + + + + + + 是否合格 + + + + + + + + + 处理满意度 + + + + + + + + + + + + + + + + + + + + + + + 确认处理 + + \ No newline at end of file diff --git a/pages/caseCheck/caseCheck.wxss b/pages/caseCheck/caseCheck.wxss new file mode 100644 index 0000000..6fe6cdf --- /dev/null +++ b/pages/caseCheck/caseCheck.wxss @@ -0,0 +1,180 @@ +page{ + background: #f2f1f6; +} +.check{ + padding: 20rpx; +} +.case-info{ + background: #fff; + border-radius: 10rpx; + padding: 20rpx; + margin-bottom: 15rpx; +} +.title-status{ + display: flex; + justify-content: space-between; + margin-bottom: 10rpx; +} +.title{ + font-size: 36rpx; + line-height: 60rpx; + display: inline-block; + max-width: 65%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: #06a3f6; +} +.status{ + line-height: 60rpx; + display: inline-block; + padding: 0 30rpx; + background: #fff7ec; + color: #fdc36e; + border-radius: 30rpx; +} +.status.green{ + color: #2dfe2e; + background: rgba(45,254,46,0.1) +} +.status.red{ + color: red; + background: rgba(255,0,0,0.1) +} +.row{ + border-bottom: 1px dashed #EEE; + font-size: 32rpx; + color: #888; + line-height: 60rpx; +} +.photo{ + margin: 50rpx 0; +} +.photo image{ + width: 140rpx; + height: 140rpx; + margin-right: 10rpx; + margin-bottom: 10rpx; +} +.position{ + font-size: 36rpx; + color: #06a3f6; + margin-bottom: 10rpx; +} +.map-box map{ + width: 100%; + height: 400rpx; +} +.handle-info{ + border-radius: 10rpx; + background: #fff; + margin-top: 15rpx; + padding: 20rpx 20rpx 10rpx; +} +.handle-photo{ + margin: 20rpx 0 0; +} +.handle-title{ + font-size: 36rpx; + color: #888; +} +.handle-title text{ + color: red; +} +.check-box{ + padding: 20rpx; + background: #fff; + border-radius: 10rpx; + margin-top: 15rpx; +} +.check-content{ + background: #f2f1f6; + margin-bottom: 20rpx; +} +.check-content textarea{ + width: 100%; + height: 300rpx; + padding: 15rpx; + box-sizing: border-box; +} +.qualified{ + display: flex; + justify-content: space-between; + background: #f2f1f6; + padding: 15rpx; +} +.qualified label{ + margin-right: 20rpx; +} +.qualified label:last-child{ + margin-right: 0; +} +.satisfied{ + margin-top: 15rpx; + background: #f2f1f6; + padding: 15rpx; +} +.satisfied-title{ + font-size: 36rpx; +} +.satisfied-box label{ + display: block; + margin-top: 15rpx; +} +.choose-photo{ + margin-top: 15rpx; +} +.choose-photo .img-box{ + width: 32%; + height: 140rpx; + margin-right: 2%; + margin-bottom: 10rpx; + position: relative; + display: inline-block; +} +.img-box image{ + width: 100%; + height: 100%; +} +.img-box .delete-btn{ + position: absolute; + top: -10rpx; + right: -10rpx; + width: 40rpx; + height: 40rpx; +} +.choose-photo .img-box:nth-child(3n){ + margin-right: 0; +} +.photo-main{ + background: none; + padding: 0; +} +.add{ + display: inline-block; + width: 32%; + height: 140rpx; + background: #f1f1f6; + position: relative; +} +.add image{ + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 60rpx; + height: 60rpx; +} +.submit{ + width: 710rpx; + height: 100rpx; + background: #008cff; + line-height: 100rpx; + text-align: center; + color: #fff; + border-radius: 10rpx; + margin: 15rpx auto; +} +.check-container{ + margin-top: 15rpx; +} \ No newline at end of file diff --git a/pages/caseDetail/caseDetail.js b/pages/caseDetail/caseDetail.js new file mode 100644 index 0000000..1cef167 --- /dev/null +++ b/pages/caseDetail/caseDetail.js @@ -0,0 +1,122 @@ +const app = getApp() +// var QQMapWX = require('../../lib/qqmap-wx-jssdk.js'); +var bmap = require('../../lib/bmap-wx.js'); +// pages/caseDetail/caseDetail.js +Page({ + + /** + * 页面的初始数据 + */ + data: { + requestUrl: app.requestUrl, + token: '', + caseId: '', + caseDetail: {}, + longitude: '', + latitude: '', + markers: [], + imageList: [] + }, + // 获取详情 + getDetail: function () { + var self = this + app.restAjax.get(app.restAjax.path('{reqesutUrl}app/reportcase/getreportcase/' + self.data.caseId, [app.requestUrl]), {}, { + headers: { + token: self.data.token + } + }, function (code, data) { + var imgArr + imgArr = data.casePhotos.split(',') + var arr = [{longitude: data.caseLongitude,latitude: data.caseLatitude,iconPath:'../../images/marker_red.png',width:'25px',height: '30px'}] + // varwxMarkerData = arr; + self.setData({ + markers: arr + }); + self.setData({ + caseDetail: data, + longitude: data.caseLongitude, + latitude: data.caseLatitude, + imageList: imgArr + }) + }); + }, + // 查看流程 + goProcess: function () { + var self = this + wx.navigateTo({ + url: '../process/process?id=' + self.data.caseId, + }) + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + this.setData({ + caseId: options.id + }) + wx.getStorage({ + key: 'token', + success: function (res) { + self.setData({ + token: res.data + }) + self.getDetail() + } + }) + + var BMap = new bmap.BMapWX({ + ak: 'Zk732rbyjd327q7Zj9EOtRjUn2ED1GWK' + }); + + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/caseDetail/caseDetail.json b/pages/caseDetail/caseDetail.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/caseDetail/caseDetail.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/caseDetail/caseDetail.wxml b/pages/caseDetail/caseDetail.wxml new file mode 100644 index 0000000..3e577e8 --- /dev/null +++ b/pages/caseDetail/caseDetail.wxml @@ -0,0 +1,31 @@ + + + + {{caseDetail.communityName}} + 待处理 + 待立案 + 待下派 + 待处理 + 待检查 + 待结案 + 已归档 + 案件异常 + + + {{caseDetail.caseContent}} + 上报时间:{{caseDetail.reportDate}} + 上报类型:{{caseDetail.caseTypeName}} + 上报人员:{{caseDetail.caseReporter}} + + + + + + {{caseDetail.casePosition}} + + + + + 查看流程 + + \ No newline at end of file diff --git a/pages/caseDetail/caseDetail.wxss b/pages/caseDetail/caseDetail.wxss new file mode 100644 index 0000000..62ad6a8 --- /dev/null +++ b/pages/caseDetail/caseDetail.wxss @@ -0,0 +1,81 @@ +page{ + background: #f2f1f6; +} +.case{ + width: 710rpx; + margin: 20rpx auto; + padding: 20rpx; + box-sizing: border-box; + background: #fff; + border-radius: 10rpx; +} +.case-info{ + margin-bottom: 15rpx; +} +.title-status{ + display: flex; + justify-content: space-between; + margin-bottom: 10rpx; +} +.title{ + font-size: 36rpx; + line-height: 60rpx; + display: inline-block; + max-width: 65%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: #06a3f6; +} +.status{ + line-height: 60rpx; + display: inline-block; + padding: 0 30rpx; + background: #fff7ec; + color: #fdc36e; + border-radius: 30rpx; +} +.status.green{ + color: #2dfe2e; + background: rgba(45,254,46,0.1) +} +.status.red{ + color: red; + background: rgba(255,0,0,0.1) +} +.row{ + border-bottom: 1px dashed #EEE; + font-size: 32rpx; + color: #888; + line-height: 60rpx; +} +.photo{ + margin: 50rpx 0; +} +.photo image{ + width: 140rpx; + height: 140rpx; + margin-right: 10rpx; + margin-bottom: 10rpx; +} +.position{ + font-size: 36rpx; + color: #06a3f6; + margin-bottom: 10rpx; +} +.map-box map{ + width: 100%; + height: 400rpx; +} +.process{ + width: 100%; + height: 80rpx; + display: flex; + justify-content: center; + align-items: center; + border-radius: 10rpx; + background: #06a3f6; + color: #fff; + font-size: 30rpx; + margin-top: 15rpx; +} \ No newline at end of file diff --git a/pages/caseReport/caseReport.js b/pages/caseReport/caseReport.js new file mode 100644 index 0000000..021c93a --- /dev/null +++ b/pages/caseReport/caseReport.js @@ -0,0 +1,472 @@ +const app = getApp() +var bmap = require('../../lib/bmap-wx.js'); +let wxMarkerData = []; +// pages/caseReport/caseReport.js +Page({ + + /** + * 页面的初始数据 + */ + data: { + address: '获取案件地址中...', + recodePath: '', + recorderManager: wx.getRecorderManager(), + innerAudioContext: wx.createInnerAudioContext(), + // 办事处 + officeIndex: 0, + officeArray: [], + officeList: [], + officeSelectedId: '', + // 社区 + communityIndex: 0, + communityArray: [], + communityList: [], + communitySelectedId: '', + // 类型 + typeIndex: 0, + typeArray: [], + typeList: [], + typeSelectedId: '', + // 类型二级 + typeLvIndex: 0, + typeLvArray: [], + typeLvList: [], + typeLvSelectedId: '', + // 案件类型 + caseIndex: 0, + caseArray: [], + caseList: [], + caseSelectedId: '', + photoList: [], + startTouch: {}, + selfHandle: 0, + caseDesc: '', + imageList: [], + token: '' + }, + // 办事处列表 + getOfficeList: function () { + var self = this + app.restAjax.get(app.restAjax.path('{reqesutUrl}app/dict/listdict/9d179f05-3ea0-48f7-853c-d3b7124b791c', [app.requestUrl]), {}, { + headers: { + token: self.data.token + } + }, function (code, data) { + var arr = [] + for (let i = 0 ; i < data.length; i++) { + arr.push(data[i].dictName) + } + self.setData({ + officeArray: arr, + officeList: data, + officeSelectedId: data[0].dictId + }) + self.getCommunityList() + }); + }, + // 办事处选中 + bindPickerChange: function (e) { + var self = this + this.setData({ + officeIndex: e.detail.value, + officeSelectedId: self.data.officeList[e.detail.value].dictId + }) + wx.showToast({ + title: '加载中', + icon: 'loading' + }) + this.getCommunityList() + }, + // 社区列表 + getCommunityList: function () { + var self = this + self.setData({ + communityIndex: 0 + }) + app.restAjax.get(app.restAjax.path('{reqesutUrl}app/community/listareacommunity/' + self.data.officeSelectedId, [app.requestUrl]), {}, { + headers: { + token: self.data.token + } + }, function (code, data) { + var arr = [] + for (let i = 0 ; i < data.length; i++) { + arr.push(data[i].communityName) + } + self.setData({ + communityArray: arr, + communityList: data, + communitySelectedId: data[0].communityId + }) + wx.hideToast() + }); + }, + // 选中社区 + bindCommunityChange: function (e) { + var self = this + this.setData({ + communityIndex: e.detail.value, + communitySelectedId: self.data.communityList[e.detail.value].communityId + }) + }, + // 类型列表 + getTypeList: function () { + var self = this + app.restAjax.get(app.restAjax.path('{reqesutUrl}app/dict/listdict/46d108b2-4ef9-4f6f-b30c-0c700e3ee852' + self.data.officeSelectedId, [app.requestUrl]), {}, { + headers: { + token: self.data.token + } + }, function (code, data) { + var arr = [] + for (let i = 0 ; i < data.length; i++) { + arr.push(data[i].dictName) + } + self.setData({ + typeArray: arr, + typeList: data, + typeSelectedId: data[0].dictId + }) + self.getTypeLv() + }); + }, + // 类型选中 + bindTypeChange: function (e) { + var self = this + this.setData({ + typeIndex: e.detail.value, + typeSelectedId: self.data.typeList[e.detail.value].dictId + }) + self.getTypeLv() + }, + // 类型二级 + getTypeLv: function () { + var self = this + self.setData({ + typeLvIndex: 0 + }) + wx.showToast({ + title: '加载中', + icon: 'loading' + }) + app.restAjax.get(app.restAjax.path('{reqesutUrl}app/dict/listdict/' + self.data.typeSelectedId, [app.requestUrl]), {}, { + headers: { + token: self.data.token + } + }, function (code, data) { + var arr = [] + for (let i = 0 ; i < data.length; i++) { + arr.push(data[i].dictName) + } + self.setData({ + typeLvArray: arr, + typeLvList: data, + typeLvSelectedId: data[0].dictId + }) + wx.hideToast() + }); + }, + // 类型二级选中 + bindTypeLvChange: function (e) { + var self = this + this.setData({ + typeLvIndex: e.detail.value, + typeLvSelectedId: self.data.typeLvList[e.detail.value].dictId + }) + self.getTypeLv() + }, + // 案件类型列表 + getCaseList: function () { + var self = this + app.restAjax.get(app.restAjax.path('{reqesutUrl}app/dict/listdict/46d108b2-4ef9-4f6f-b30c-0c700e3ee852' + self.data.officeSelectedId, [app.requestUrl]), {}, { + headers: { + token: self.data.token + } + }, function (code, data) { + var arr = [] + for (let i = 0 ; i < data.length; i++) { + arr.push(data[i].dictName) + } + self.setData({ + typeArray: arr, + typeList: data, + typeSelectedId: data[0].dictId + }) + self.getTypeLv() + }); + }, + // 录音 + recordVoice: function (e) { + this.setData({ + startTouch: e.touches[0] + }) + var options = { + format: 'mp3' + } + this.data.recorderManager.start(options) + wx.showToast({ + title: "正在录音", + icon: "none", + duration: 60000//先定义个60秒,后面可以手动调用wx.hideToast()隐藏 + }); + }, + // 录音结束 + recordEnd: function () { + var self = this + this.data.recorderManager.stop() + this.data.recorderManager.onStop(function (res) { + var path = res.tempFilePath + self.setData({ + recodePath: path + }) + wx.showToast({ + title: '上传中', + icon: 'loading' + }) + app.restAjax.file(app.restAjax.path('{requestUrl}app/file/uploadaudio', [app.requestUrl]), path, 'audio', { + headers: { + token: self.data.token + } + }, function (code, data) { + var id = JSON.parse(data).data + self.setData({ + audioId: id + }) + wx.hideToast() + }, function (code, data) { + console.log(data) + }) + }) + var self = this + wx.hideToast() + }, + // 播放录音 + playRecord: function () { + var innerAudioContext = wx.createInnerAudioContext() + innerAudioContext.src = this.data.recodePath + innerAudioContext.play() + }, + // 选择图片 + chooseImage: function () { + var self = this + wx.chooseImage({ + count: 9 - self.data.photoList.length, + sourceType: ['album', 'camera'], + success: function (res) { + self.setData({ + photoList: self.data.photoList.concat(res.tempFiles) + }) + wx.showToast({ + title: '上传中', + icon: 'loading' + }) + var arr = [] + for (let i = 0; i < res.tempFiles.length; i++) { + var path = res.tempFiles[i].path; + app.restAjax.file(app.restAjax.path('{requestUrl}app/file/uploadimage', [app.requestUrl]), path, 'image', { + headers: { + token: self.data.token + } + }, function (code, data) { + var id = JSON.parse(data).data + arr.push(id) + if (arr.length == res.tempFiles.length) { + self.setData({ + imageList: arr + }) + wx.hideToast() + } + }, function (code, data) { + console.log(data) + }) + } + } + }) + }, + // 删除图片 + deleteImg: function (e) { + var idx = e.currentTarget.dataset.num + var self = this + self.data.photoList.splice(idx, 1) + self.data.imageList.splice(idx, 1) + self.setData({ + photoList: self.data.photoList, + imageList: self.data.imageList + }) + }, + // touchMove: function (e) { + // var moveLenght = e.touches[e.touches.length - 1].clientY - this.data.startTouch.clientY; + // if (Math.abs(moveLenght) > 50) { + // wx.showToast({ + // title: "松开手指,取消发送", + // icon: "none", + // duration: 60000 + // }); + // } else { + // wx.showToast({ + // title: "正在录音,上划取消发送", + // icon: "none", + // duration: 60000 + // }); + // } + // }, + /** + * 生命周期函数--监听页面加载 + */ + // 是否自行处理 + isSelfHandle: function (e) { + this.setData({ + selfHandle: e.detail.value + }) + }, + // 提交上报 + submitReport: function () { + var self = this + var photos = '' + if (!self.data.caseDesc) { + wx.showToast({ + title: '案件内容不能为空', + icon: 'none', + duration: 2000 + }) + return + } + if (self.data.imageList.length != 'undefined' && self.data.imageList.length != 0) { + for (let i = 0; i < self.data.imageList.length; i++) { + if (i == self.data.imageList.length - 1) { + photos += self.data.imageList[i] + } else { + photos += self.data.imageList[i] + ',' + } + } + } else { + wx.showToast({ + title: '请至少上传一张照片', + icon: 'none', + duration: 2000 + }) + return + } + + var info = { + areaId: self.data.officeSelectedId, + areaName: self.data.officeArray[self.data.officeIndex], + casePhotos: photos, + caseAudio: self.data.audioId, + communityId: self.data.communitySelectedId, + communityName: self.data.communityArray[self.data.communityIndex], + caseSource: 1, + isSelf: self.data.selfHandle, + caseTypeId: self.data.typeLvSelectedId, + caseTypeName: self.data.typeLvArray[self.data.typeLvIndex], + caseContent: self.data.caseDesc, + caseLatitude: self.data.latitude, + caseLongitude: self.data.longitude, + casePosition: self.data.address + } + wx.showToast({ + title: '上传中', + icon: 'loading' + }) + app.restAjax.post(app.restAjax.path('{reqesutUrl}app/reportcase/saveappautoreportcase', [app.requestUrl]), info, { + headers: { + token: self.data.token + } + }, function (code, data) { + if (code == '200') { + wx.hideToast() + wx.showToast({ + title: '上报成功', + duration: 1500 + }) + setTimeout(function () { + wx.navigateTo({ + url: '../index/index', + }) + }, 1500) + } + }, function (code, data) { + wx.showToast({ + title: data.msg, + duration: 2000 + }) + }); + }, + onLoad: function (options) { + var self = this + wx.getStorage({ + key: 'token', + success: function (res) { + self.setData({ + token: res.data + }) + self.getOfficeList() + self.getTypeList() + } + }) + var BMap = new bmap.BMapWX({ + ak: 'Zk732rbyjd327q7Zj9EOtRjUn2ED1GWK' + }); + var success = function (data) { + self.setData({ + address: data.wxMarkerData[0].address, + latitude: data.wxMarkerData[0].latitude, + longitude: data.wxMarkerData[0].longitude + }) + } + var fail = function (data) { + console.log(data); + } + BMap.regeocoding({ + fail:fail, + success:success + }); + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/caseReport/caseReport.json b/pages/caseReport/caseReport.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/caseReport/caseReport.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/caseReport/caseReport.wxml b/pages/caseReport/caseReport.wxml new file mode 100644 index 0000000..04c5c3e --- /dev/null +++ b/pages/caseReport/caseReport.wxml @@ -0,0 +1,132 @@ + + 基本信息 + + + * + + + + + {{officeArray[officeIndex]}} + + + + + + + + + + * + + + + + {{communityArray[communityIndex]}} + + + + + + + + + + * + + + + + {{typeArray[typeIndex]}} + + + + + + + + + + * + + + + + {{typeLvArray[typeLvIndex]}} + + + + + + + + + + * + + 巡检采集 + + + + * + + 自行处理 + + + + + + + + + * + + {{address}} + + + + + + 详细信息 + + + * + + + + + + + + + 录音 + + + + 播放录音 + + 长按录音 + + + + + * + + + + + + + + + + + + + + + + 上报 + \ No newline at end of file diff --git a/pages/caseReport/caseReport.wxss b/pages/caseReport/caseReport.wxss new file mode 100644 index 0000000..70ba910 --- /dev/null +++ b/pages/caseReport/caseReport.wxss @@ -0,0 +1,191 @@ +page{ + background: #f2f1f6; +} +.report, .detail{ + padding: 0 20rpx; +} +.report{ + margin-bottom: 15rpx; +} +.title, .detail-title{ + font-size: 36rpx; + margin-bottom: 15rpx; +} +.info{ + padding: 20rpx 20rpx 0; + overflow: hidden; + background: #fff; + border-radius: 10rpx; + box-shadow: 0 0 10rpx #EEE; +} +.row{ + margin-bottom: 20rpx; + position: relative; + padding-left: 20rpx; +} +.required{ + position: absolute; + top: 0; + left: 0; + color: red; +} +.main{ + background: #f1f1f6; + width: 100%; + height: 75rpx; + border-radius: 10rpx; + padding: 0 15rpx; + box-sizing: border-box; + position: relative; +} +.main input{ + width: 100%; + height: 100%; +} +.selected{ + display: block; + line-height: 75rpx; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + padding-right: 75rpx; +} +.select-icon{ + position: absolute; + top: 0; + right: 0; + width: 75rpx; + height: 75rpx; +} +.select-icon image{ + width: 30rpx; + height: 22rpx; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%,-50%); +} +.detail-required{ + color: red; +} +.detail-row{ + margin-bottom: 20rpx; + padding-left: 0; +} +.detail-row textarea{ + width: 100%; + height: 200rpx; + padding: 10rpx; + box-sizing: border-box; + background: #f1f1f6; +} +.detail .info{ + padding: 20rpx; +} +.voice{ + display: flex; + justify-content: space-between; + padding: 20rpx; + background: #f1f1f6; + border-radius: 10rpx; +} +.detail-info{ + background: #FFF; + border-radius: 10rpx; + padding: 20rpx 20rpx 0; + overflow: hidden; +} +.detail-main{ + height: auto; +} +.voice-btn{ + height: 70rpx; + padding: 0 20rpx; + background: #008cff; + color: #fff; + border-radius: 10rpx; + line-height: 70rpx; +} +.voice-info{ + line-height: 70rpx; + padding-left: 50rpx; + position: relative; +} +.voice-info image{ + position: absolute; + top: 50%; + left: 0; + width: 45rpx; + height: 45rpx; + transform: translate(0,-50%); +} +.choose-photo .img-box{ + width: 32%; + height: 140rpx; + margin-right: 2%; + margin-bottom: 10rpx; + position: relative; + display: inline-block; +} +.img-box image{ + width: 100%; + height: 100%; +} +.img-box .delete-btn{ + position: absolute; + top: -10rpx; + right: -10rpx; + width: 40rpx; + height: 40rpx; +} +.choose-photo .img-box:nth-child(3n){ + margin-right: 0; +} +.photo-main{ + background: none; + padding: 0; +} +.submit{ + width: 710rpx; + height: 100rpx; + background: #008cff; + line-height: 100rpx; + text-align: center; + color: #fff; + border-radius: 10rpx; + margin: 15rpx auto; +} +.add{ + display: inline-block; + width: 32%; + height: 140rpx; + background: #f1f1f6; + position: relative; +} +.add image{ + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 60rpx; + height: 60rpx; +} +.address{ + line-height: 75rpx; +} +.self-box{ + display: flex; + justify-content: space-between; +} +.self, .self-check label{ + line-height: 75rpx; +} +.self-check label{ + margin-right: 15rpx; +} +.self-check label:last-child{ + margin-right: 0; +} +.address-main{ + height: auto; +} \ No newline at end of file diff --git a/pages/index/index.js b/pages/index/index.js new file mode 100644 index 0000000..853daaf --- /dev/null +++ b/pages/index/index.js @@ -0,0 +1,195 @@ +const app = getApp() +Page({ + + /** + * 页面的初始数据 + */ + data: { + token: '', + areaList: [], + requestUrl: app.requestUrl, + page: { + page: 1, + rows: 20, + totalPage: 1 + }, + tab: 0 + }, + // 登录 + doLogin: function () { + var self = this + wx.login({ + success: function (res) { + app.restAjax.post(app.restAjax.path('{url}wxminiapp/auth/login', [app.loginUrl]), { + jsCode: res.code + }, null, function (code, data) { + var tokenArray = data.data.split('_'); + var token = tokenArray[0]; + self.setData({ + token: token + }) + wx.setStorageSync('token', token); + self.getList() + }, function (code, data) { + app.dialog.msg(data.msg); + }); + } + }) + }, + // 获取列表 + getList: function () { + var self = this + wx.showToast({ + title: '加载中', + icon: 'loading' + }) + app.restAjax.get(app.restAjax.path('{reqesutUrl}app/reportcase/listpagereportcase', [app.requestUrl]), self.data.page, { + headers: { + token: self.data.token + } + }, function (code, data) { + if(data.rows.length == 0) { + self.setData({ + [`page.page`] : self.data.page.page - 1 + }) + app.dialog.msg('暂无更多') + return false; + } + data.rows.forEach(function (i) { + i.casePhotos = i.casePhotos.split(',')[0] + }) + if (self.data.page.page == 1) { + self.setData({ + areaList: data.rows + }) + } else { + self.setData({ + areaList: self.data.areaList.concat(data.rows) + }) + } + wx.hideToast() + }); + }, + // 查看详情 + goDetail: function (e) { + if (e.currentTarget.dataset.status == '4') { + wx.navigateTo({ + url: '../caseCheck/caseCheck?id=' + e.currentTarget.dataset.id, + }) + } else { + wx.navigateTo({ + url: '../caseDetail/caseDetail?id=' + e.currentTarget.dataset.id, + }) + } + + }, + // 前往上报 + goReport: function () { + wx.navigateTo({ + url: '../caseReport/caseReport', + }) + }, + // 切换 + changeTab: function (e) { + var cur = e.currentTarget.dataset.tab + if (this.data.tab != cur) { + this.setData({ + tab: cur, + [`page.page`]: 1 + }) + if (cur == '0') { + this.getList() + } else { + this.getCheckList() + } + } + }, + // 获取待检查列表 + getCheckList: function () { + var self = this + wx.showToast({ + title: '加载中', + icon: 'loading' + }) + app.restAjax.get(app.restAjax.path('{reqesutUrl}app/reportcase/listpagereportcaseinspectofmine', [app.requestUrl]), self.data.page, { + headers: { + token: self.data.token + } + }, function (code, data) { + if (self.data.page.page) { + self.setData({ + areaList: data.rows + }) + } else { + self.setData({ + areaList: self.data.areaList.concat(data.rows) + }) + } + wx.hideToast() + }); + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + this.doLogin() + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + var self = this + var pageNum = 'page.page' + self.setData({ + [pageNum]: self.data.page.page + 1 + }) + if (self.data.tab == '0') { + this.getList() + } else { + this.getCheckList() + } + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/index/index.json b/pages/index/index.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/index/index.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/index/index.wxml b/pages/index/index.wxml new file mode 100644 index 0000000..8f67b34 --- /dev/null +++ b/pages/index/index.wxml @@ -0,0 +1,34 @@ + + 上报历史 + 待检查 + + + + + + + + + + {{item.communityName}} + 待受理 + 待立案 + 待下派 + 待处理 + 待检查 + 待结案 + 已归档 + 案件异常 + + + {{item.caseContent}} + + + + + {{item.casePosition}} + + + + +案件上报 \ No newline at end of file diff --git a/pages/index/index.wxss b/pages/index/index.wxss new file mode 100644 index 0000000..d1b4dc6 --- /dev/null +++ b/pages/index/index.wxss @@ -0,0 +1,109 @@ +page{ + background: #f2f1f6; +} +.tab-box{ + position: fixed; + top: 0; + left: 0; + right: 0; + height: 100rpx; + display: flex; + background: #fff; + overflow-x: auto; +} +.tab{ + display: flex; + flex: 1; + flex-shrink: 0; + justify-content: center; + align-items: center; + font-size: 30rpx; + box-sizing: border-box; +} +.tab.active{ + font-size: 36rpx; + color: #226cd9; + border-bottom: 3px solid #226cd9; +} +.list{ + margin-top: 100rpx; + padding: 20rpx 20rpx 0; +} +.list-box{ + padding: 20rpx; + background: #fff; + border-radius: 10rpx; + margin-bottom: 20rpx; + display: flex; + justify-content: space-between; +} +.avatar, .avatar image{ + width: 150rpx; + height: 150rpx; +} +.case{ + width: 500rpx; +} +.case-info{ + border-bottom: 1px dashed #EEE; +} +.case-title{ + display: flex; + justify-content: space-between; + margin-bottom: 10rpx; +} +.title{ + font-size: 36rpx; + line-height: 60rpx; + display: inline-block; + max-width: 65%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.status{ + line-height: 60rpx; + display: inline-block; + padding: 0 30rpx; + background: #fff7ec; + color: #fdc36e; + border-radius: 30rpx; +} +.status.green{ + color: #2dfe2e; + background: rgba(45,254,46,0.1) +} +.status.red{ + color: red; + background: rgba(255,0,0,0.1) +} +.case-desc{ + font-size: 28rpx; + color: #888; + margin-bottom: 10rpx; +} +.case-postion{ + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + font-size: 28rpx; + color: #108aff; + margin-top: 10rpx; +} +.case-postion image{ + width: 30rpx; + height: 28rpx; +} +.new-case{ + position: fixed; + bottom: 40rpx; + right: 40rpx; + width: 120rpx; + height: 120rpx; + background: #108aff; + color: #fff; + border-radius: 50%; + padding: 20rpx; + box-sizing: border-box; + text-align: center; +} \ No newline at end of file diff --git a/pages/process/process.js b/pages/process/process.js new file mode 100644 index 0000000..8002525 --- /dev/null +++ b/pages/process/process.js @@ -0,0 +1,98 @@ +const app = getApp() +// pages/process/process.js +Page({ + + /** + * 页面的初始数据 + */ + data: { + requestUrl: app.requestUrl, + token: '', + caseId: '', + processList: [] + }, + // 获取流程 + getProcess: function () { + var self = this + app.restAjax.get(app.restAjax.path('{reqesutUrl}app/reportcase/listreportcaselog/' + self.data.caseId, [app.requestUrl]), {}, { + headers: { + token: self.data.token + } + }, function (code, data) { + console.log(data) + for (let i = 0; i < data.length; i++) { + data[i].userPhotos = data[i].userPhotos.split(',') + } + self.setData({ + processList: data + }) + }); + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + this.setData({ + caseId: options.id + }) + wx.getStorage({ + key: 'token', + success: function (res) { + self.setData({ + token: res.data + }) + self.getProcess() + } + }) + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/process/process.json b/pages/process/process.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/process/process.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/process/process.wxml b/pages/process/process.wxml new file mode 100644 index 0000000..521a917 --- /dev/null +++ b/pages/process/process.wxml @@ -0,0 +1,22 @@ + + + + + {{item.gmtCreate}} + {{item.optionType}} + + + 处理人:{{item.userName}} + 处理描述:{{item.userOpinion}} + 受理人:{{item.handleUserName}} + 处理时限:{{item.handleTime}}天 + + 同意处理 + 未处理 + + + + + + + \ No newline at end of file diff --git a/pages/process/process.wxss b/pages/process/process.wxss new file mode 100644 index 0000000..c11ffc9 --- /dev/null +++ b/pages/process/process.wxss @@ -0,0 +1,64 @@ +page{ + background: #f2f1f6; +} +.process{ + padding: 0 10rpx 0 25rpx; +} +.process-box{ + border-left: 3px solid #17bef5; + box-sizing: border-box; + padding-left: 25rpx; + padding-bottom: 15rpx; +} +.time-status{ + display: flex; + justify-content: space-between; + position: relative; + font-size: 30rpx; + padding: 10rpx 0; +} +.point{ + position: absolute; + top: 26rpx; + left: -42rpx; + width: 30rpx; + height: 30rpx; + background: #17bef5; + border-radius: 50%; +} +.time{ + line-height: 60rpx; +} +.status{ + line-height: 60rpx; + padding: 0 20rpx; + background: #dae5f7; + color: #158afa; + border-radius: 30rpx; +} +.process-content{ + padding: 20rpx; + background: #fff; + border-radius: 10rpx; +} +.row{ + border-bottom: 1px dashed #EEE; + font-size: 28rpx; + color: #888; + line-height: 50rpx; +} +.row text.green{ + color: #2dfe2e; +} +.row text.gray{ + color: #888; +} +.process-img{ + margin-top: 10rpx; +} +.process-img image{ + width: 140rpx; + height: 140rpx; + margin-right: 10rpx; + margin-bottom: 10rpx; +} diff --git a/project.config.json b/project.config.json new file mode 100644 index 0000000..5c97c05 --- /dev/null +++ b/project.config.json @@ -0,0 +1,70 @@ +{ + "description": "项目配置文件", + "packOptions": { + "ignore": [] + }, + "setting": { + "urlCheck": false, + "es6": true, + "enhance": false, + "postcss": true, + "preloadBackgroundData": false, + "minified": true, + "newFeature": false, + "coverView": true, + "nodeModules": false, + "autoAudits": false, + "showShadowRootInWxmlPanel": true, + "scopeDataCheck": false, + "uglifyFileName": false, + "checkInvalidKey": true, + "checkSiteMap": true, + "uploadWithSourceMap": true, + "compileHotReLoad": false, + "useMultiFrameRuntime": true, + "useApiHook": true, + "useApiHostProcess": true, + "babelSetting": { + "ignore": [], + "disablePlugins": [], + "outputPath": "" + }, + "bundle": false, + "useIsolateContext": true, + "useCompilerModule": true, + "userConfirmedUseCompilerModuleSwitch": false, + "userConfirmedBundleSwitch": false, + "packNpmManually": false, + "packNpmRelationList": [], + "minifyWXSS": true + }, + "compileType": "miniprogram", + "libVersion": "2.15.0", + "appid": "wxc529578602bca580", + "projectname": "report", + "debugOptions": { + "hidedInDevtools": [] + }, + "scripts": {}, + "isGameTourist": false, + "condition": { + "search": { + "list": [] + }, + "conversation": { + "list": [] + }, + "game": { + "list": [] + }, + "plugin": { + "list": [] + }, + "gamePlugin": { + "list": [] + }, + "miniprogram": { + "list": [] + } + } +} \ No newline at end of file diff --git a/sitemap.json b/sitemap.json new file mode 100644 index 0000000..ca02add --- /dev/null +++ b/sitemap.json @@ -0,0 +1,7 @@ +{ + "desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html", + "rules": [{ + "action": "allow", + "page": "*" + }] +} \ No newline at end of file diff --git a/utils/dialog.js b/utils/dialog.js new file mode 100644 index 0000000..ef95156 --- /dev/null +++ b/utils/dialog.js @@ -0,0 +1,15 @@ +function msg(text) { + wx.showToast({ + title: text, + icon: 'none', + duration: 1000 + }) +} +function loading(msg) { + wx.showLoading({ + title: msg, + mask: true + }) +} +module.exports.msg = msg; +module.exports.loading = loading; \ No newline at end of file diff --git a/utils/restAjax.js b/utils/restAjax.js new file mode 100644 index 0000000..c818e8d --- /dev/null +++ b/utils/restAjax.js @@ -0,0 +1,227 @@ +var methods = { + POST_METHOD: 'POST', + DELETE_METHOD: 'DELETE', + PUT_METHOD: 'PUT', + GET_METHOD: 'GET' +}; + +/** + * 新增 + * @param url + * @param dataObj + * @param args + * @param successCallback + * @param errorCallback + * @param completeCallback + */ +function postJson(url, dataObj, args, successCallback, errorCallback, completeCallback) { + doAjax(url, methods.POST_METHOD, dataObj, args, successCallback, errorCallback, completeCallback); +} + +/** + * 删除 + * @param url + * @param dataObj + * @param args + * @param successCallback + * @param errorCallback + * @param completeCallback + */ +function deleteForm(url, dataObj, args, successCallback, errorCallback, completeCallback) { + doAjax(url, methods.DELETE_METHOD, dataObj, args, successCallback, errorCallback, completeCallback); +} + +/** + * 修改 + * @param url + * @param dataObj + * @param args + * @param successCallback + * @param errorCallback + * @param completeCallback + */ +function putJson(url, dataObj, args, successCallback, errorCallback, completeCallback) { + doAjax(url, methods.PUT_METHOD, dataObj, args, successCallback, errorCallback, completeCallback); +} + +/** + * 查询 + * @param url + * @param dataObj + * @param args + * @param successCallback + * @param errorCallback + * @param completeCallback + */ +function getForm(url, dataObj, args, successCallback, errorCallback, completeCallback) { + doAjax(url, methods.GET_METHOD, dataObj, args, successCallback, errorCallback, completeCallback); +} + +/** + * 执行上传 + * @param url + * @param method + * @param dataObj + * @param args + * @param successCallback + * @param errorCallback + * @param completeCallback + */ +function doAjax(url, method, dataObj, args, successCallback, errorCallback, completeCallback) { + var headers = {}; + if (args != null && typeof (args.headers) != 'undefined' && args.headers != null) { + headers = args.headers; + } + wx.request({ + url: url, + method: method, + data: dataObj, + header: headers, + dataType: 'json', + success: function (response) { + if (response.statusCode == 200) { + successCallback(response.statusCode, response.data, args); + } else { + if (errorCallback && typeof (errorCallback) == 'function') { + errorCallback(response.statusCode, response.data); + } + } + }, + fail: function (response) { + console.log(response); + }, + complete: function () { + if (completeCallback && typeof (completeCallback) == 'function') { + completeCallback(); + } + } + }) +} + +/** + * 检测是路径参数有重复值 + * @param pathArgArray + * @returns {boolean} + */ +function pathArgsHasSameValue(pathArgArray) { + var tempArgIndex = 0; + var tempArgs = pathArgArray[tempArgIndex]; + for (var i = (tempArgIndex + 1), item; item = pathArgArray[i]; i++) { + if (tempArgs == item) { + throw new Error('参数' + item + '有重复值!!!'); + } + if (i == pathArgArray.length - 1) { + tempArgs = pathArgArray[++tempArgIndex]; + i = tempArgIndex; + continue; + } + } +} + +/** + * 获取页面间传递的参数 + * @param url + */ +function getParamsArg(url) { + var params = url.split('?')[1]; + var paramsObj = {}; + if (typeof (params) == 'undefined' || params == null) { + return paramsObj; + } + var paramsKVs = params.split('&'); + for (var i = 0, item = null; item = paramsKVs[i++];) { + var kvs = item.split('='); + if (kvs.length == 1) { + paramsObj[kvs[0]] = null; + } + if (kvs.length == 2) { + paramsObj[kvs[0]] = decodeURI(kvs[1]); + } + } + return paramsObj; +} + +/** + * 构建路径 + * @param basePath 请求路径,{参数}, + * @param pathArgs 替换的路径参数,不能重复 + * @returns {*} + */ +function buildPath(basePath, pathArgs) { + var path = basePath; + if (!basePath || !(typeof (basePath) == 'string')) { + throw new Error('basePath必须为字符串!!!'); + } + if (!pathArgs || !Array.isArray(pathArgs)) { + throw new Error('pathArgs必须为数组!!!'); + } + var pathArgArray = basePath.match(/\{\w+\}/g); + if (!pathArgArray) { + return path; + } + pathArgsHasSameValue(pathArgArray); + for (var i = 0, item; item = pathArgArray[i]; i++) { + path = path.replace(item, pathArgs[i]); + } + return path; +} + +/** + * 通过form对象上传文件 + * @param url + * @param formData + * @param args + * @param successCallback + * @param errorCallback + * @param beforeCallback + * @param completeCallback + */ +function postFile(url, path, name, args, successCallback, errorCallback, completeCallback) { + var headers = {}; + if (args != null && typeof (args.headers) != 'undefined' && args.headers != null) { + headers = args.headers; + } + wx.uploadFile({ + filePath: path, + name: name, + url: url, + header: headers, + success: function (response) { + if (response.statusCode == 200) { + successCallback(response.statusCode, response.data, args); + } else { + if (errorCallback && typeof (errorCallback) == 'function') { + errorCallback(response.statusCode, response.data); + } + } + }, + fail: function (response) { + console.log(response); + }, + complete: function () { + if (completeCallback && typeof (completeCallback) == 'function') { + completeCallback(); + } + } + }) +}; + +/** + * xss 转义 + * @param html + * @returns {string} + */ +function escape(html) { + return String(html || '').replace(/&(?!#?[a-zA-Z0-9]+;)/g, '&') + .replace(//g, '>') + .replace(/'/g, ''').replace(/"/g, '"'); +} + +module.exports.post = postJson; +module.exports.delete = deleteForm; +module.exports.put = putJson; +module.exports.get = getForm; +module.exports.params = getParamsArg; +module.exports.path = buildPath; +module.exports.escape = escape; +module.exports.file = postFile; \ No newline at end of file diff --git a/utils/util.js b/utils/util.js new file mode 100644 index 0000000..9e2b322 --- /dev/null +++ b/utils/util.js @@ -0,0 +1,32 @@ +const formatTime = date => { + const year = date.getFullYear() + const month = date.getMonth() + 1 + const day = date.getDate() + const hour = date.getHours() + const minute = date.getMinutes() + const second = date.getSeconds() + + return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':') +} + +/** + * + * @param {*} date + */ +const formatDate = date => { + const year = date.getFullYear() + const month = date.getMonth() + 1 + const day = date.getDate() + + return [year, month, day].map(formatNumber).join('-') +} + +const formatNumber = n => { + n = n.toString() + return n[1] ? n : '0' + n +} + +module.exports = { + formatTime: formatTime, + formatDate: formatDate +}