From 0622aa2e224c3b9ddbd46a6629ffe5be8636f735 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E8=B1=AA?= <781521347@qq.com> Date: Fri, 24 Sep 2021 14:10:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.js | 118 +++-- app.json | 38 +- app.wxss | 30 +- images/arrow-d.png | Bin 0 -> 280 bytes images/home/call.png | Bin 0 -> 2051 bytes images/home/progress.png | Bin 0 -> 308 bytes images/home/组 221@2x.png | Bin 1284 -> 0 bytes images/home/组 668@2x.png | Bin 2718 -> 0 bytes images/no-needs.png | Bin 0 -> 60046 bytes images/no-order.png | Bin 0 -> 39832 bytes images/user/header.png | Bin 28167 -> 4460 bytes pages/demandHall/applyDetail/index.js | 140 ++++++ pages/demandHall/applyDetail/index.json | 6 + pages/demandHall/applyDetail/index.wxml | 66 +++ pages/demandHall/applyDetail/index.wxss | 173 ++++++++ pages/demandHall/companyDetail/index.js | 39 +- pages/demandHall/companyDetail/index.wxml | 69 ++- pages/demandHall/companyDetail/index.wxss | 8 +- pages/demandHall/createProject/index.js | 254 +++++++++++ pages/demandHall/createProject/index.json | 4 + pages/demandHall/createProject/index.wxml | 111 +++++ pages/demandHall/createProject/index.wxss | 188 ++++++++ pages/demandHall/index.js | 111 ++++- pages/demandHall/index.wxml | 98 +++- pages/demandHall/index.wxss | 22 +- pages/demandHall/needsContact/index.js | 119 +++++ pages/demandHall/needsContact/index.json | 4 + pages/demandHall/needsContact/index.wxml | 57 +++ pages/demandHall/needsContact/index.wxss | 175 ++++++++ pages/demandHall/needsDetail/index.js | 31 +- pages/demandHall/needsDetail/index.wxml | 48 +- pages/demandHall/needsDetail/index.wxss | 59 ++- pages/demandHall/platform/index.js | 99 +++++ pages/demandHall/platform/index.json | 4 + pages/demandHall/platform/index.wxml | 10 + pages/demandHall/platform/index.wxss | 36 ++ pages/demandHall/resourcesContact/index.js | 126 ++++++ pages/demandHall/resourcesContact/index.json | 4 + pages/demandHall/resourcesContact/index.wxml | 49 ++ pages/demandHall/resourcesContact/index.wxss | 171 +++++++ pages/demandHall/resourcesDetail/index.js | 38 +- pages/demandHall/resourcesDetail/index.wxml | 29 +- pages/demandHall/resourcesDetail/index.wxss | 31 +- pages/index/index.js | 90 +++- pages/index/index.wxml | 48 +- pages/index/index.wxss | 17 +- pages/login/index.js | 172 +++++++ pages/login/index.json | 3 + pages/login/index.wxml | 17 + pages/login/index.wxss | 46 ++ pages/release/companyAuth/index.js | 228 +++++++++- pages/release/companyAuth/index.wxml | 47 +- pages/release/index.js | 124 +++++- pages/release/index.wxml | 16 +- pages/release/index.wxss | 21 + pages/release/perfectCompanyInfo/index.js | 146 +++++- pages/release/perfectCompanyInfo/index.wxml | 40 +- pages/release/perfectCompanyInfo/index.wxss | 21 +- pages/release/perfectPersonInfo/index.js | 132 +++++- pages/release/perfectPersonInfo/index.wxml | 104 +++-- pages/release/perfectPersonInfo/index.wxss | 18 +- pages/release/personAuth/index.js | 106 ++++- pages/release/personAuth/index.wxml | 17 +- pages/user/agreement/index.js | 8 +- pages/user/agreement/index.wxml | 33 +- pages/user/editNeeds/index.js | 220 +++++++++ pages/user/editNeeds/index.json | 4 + pages/user/editNeeds/index.wxml | 77 ++++ pages/user/editNeeds/index.wxss | 105 +++++ pages/user/index.js | 50 ++- pages/user/index.wxml | 48 +- pages/user/index.wxss | 10 + pages/user/needsManage/index.js | 145 ++++++ pages/user/needsManage/index.json | 4 + pages/user/needsManage/index.wxml | 74 ++++ pages/user/needsManage/index.wxss | 116 +++++ pages/user/needsOrder/index.js | 240 ++++++++++ pages/user/needsOrder/index.json | 4 + pages/user/needsOrder/index.wxml | 108 +++++ pages/user/needsOrder/index.wxss | 67 +++ pages/user/resourcesManage/index.js | 143 ++++++ pages/user/resourcesManage/index.json | 5 + pages/user/resourcesManage/index.wxml | 70 +++ pages/user/resourcesManage/index.wxss | 113 +++++ pages/user/resourcesOrder/index.js | 180 ++++++++ pages/user/resourcesOrder/index.json | 4 + pages/user/resourcesOrder/index.wxml | 170 +++++++ pages/user/resourcesOrder/index.wxss | 235 ++++++++++ pages/webview/index.js | 68 +++ pages/webview/index.json | 3 + pages/webview/index.wxml | 2 + pages/webview/index.wxss | 1 + project.config.json | 3 +- project.private.config.json | 96 ++++ .../icon/{组 1051@2x.png => home.png} | Bin tabbarComponent/icon/icon_release.png | Bin 729 -> 2718 bytes tabbarComponent/icon/icon_release2.png | Bin 0 -> 729 bytes .../icon/{组 1048@2x.png => tab2-a.png} | Bin .../icon/tab2.png | Bin .../icon/{组 1049@2x.png => tab3-a.png} | Bin .../icon/tab3.png | Bin .../icon/{组 1050@2x.png => tab4-a.png} | Bin .../icon/tab4.png | Bin tabbarComponent/icon/组 226@2x.png | Bin 1609 -> 0 bytes tabbarComponent/icon/组 227@2x.png | Bin 1362 -> 0 bytes tabbarComponent/icon/组 229@2x.png | Bin 1236 -> 0 bytes tabbarComponent/icon/组 668@2x.png | Bin 2718 -> 0 bytes tabbarComponent/tabbar.js | 18 +- tabbarComponent/tabbar.wxss | 1 + utils/WxValidate.js | 418 ++++++++++++++++++ utils/checkLogin.js | 11 + utils/qqmap-wx-jssdk.min.js | 1 + utils/util.js | 103 ++++- 113 files changed, 6569 insertions(+), 367 deletions(-) create mode 100644 images/arrow-d.png create mode 100644 images/home/call.png create mode 100644 images/home/progress.png delete mode 100755 images/home/组 221@2x.png delete mode 100755 images/home/组 668@2x.png create mode 100644 images/no-needs.png create mode 100644 images/no-order.png create mode 100644 pages/demandHall/applyDetail/index.js create mode 100644 pages/demandHall/applyDetail/index.json create mode 100644 pages/demandHall/applyDetail/index.wxml create mode 100644 pages/demandHall/applyDetail/index.wxss create mode 100644 pages/demandHall/createProject/index.js create mode 100644 pages/demandHall/createProject/index.json create mode 100644 pages/demandHall/createProject/index.wxml create mode 100644 pages/demandHall/createProject/index.wxss create mode 100644 pages/demandHall/needsContact/index.js create mode 100644 pages/demandHall/needsContact/index.json create mode 100644 pages/demandHall/needsContact/index.wxml create mode 100644 pages/demandHall/needsContact/index.wxss create mode 100644 pages/demandHall/platform/index.js create mode 100644 pages/demandHall/platform/index.json create mode 100644 pages/demandHall/platform/index.wxml create mode 100644 pages/demandHall/platform/index.wxss create mode 100644 pages/demandHall/resourcesContact/index.js create mode 100644 pages/demandHall/resourcesContact/index.json create mode 100644 pages/demandHall/resourcesContact/index.wxml create mode 100644 pages/demandHall/resourcesContact/index.wxss create mode 100644 pages/login/index.js create mode 100644 pages/login/index.json create mode 100644 pages/login/index.wxml create mode 100644 pages/login/index.wxss create mode 100644 pages/user/editNeeds/index.js create mode 100644 pages/user/editNeeds/index.json create mode 100644 pages/user/editNeeds/index.wxml create mode 100644 pages/user/editNeeds/index.wxss create mode 100644 pages/user/needsManage/index.js create mode 100644 pages/user/needsManage/index.json create mode 100644 pages/user/needsManage/index.wxml create mode 100644 pages/user/needsManage/index.wxss create mode 100644 pages/user/needsOrder/index.js create mode 100644 pages/user/needsOrder/index.json create mode 100644 pages/user/needsOrder/index.wxml create mode 100644 pages/user/needsOrder/index.wxss create mode 100644 pages/user/resourcesManage/index.js create mode 100644 pages/user/resourcesManage/index.json create mode 100644 pages/user/resourcesManage/index.wxml create mode 100644 pages/user/resourcesManage/index.wxss create mode 100644 pages/user/resourcesOrder/index.js create mode 100644 pages/user/resourcesOrder/index.json create mode 100644 pages/user/resourcesOrder/index.wxml create mode 100644 pages/user/resourcesOrder/index.wxss create mode 100644 pages/webview/index.js create mode 100644 pages/webview/index.json create mode 100644 pages/webview/index.wxml create mode 100644 pages/webview/index.wxss rename tabbarComponent/icon/{组 1051@2x.png => home.png} (100%) create mode 100644 tabbarComponent/icon/icon_release2.png rename tabbarComponent/icon/{组 1048@2x.png => tab2-a.png} (100%) rename images/home/组 227@2x.png => tabbarComponent/icon/tab2.png (100%) mode change 100755 => 100644 rename tabbarComponent/icon/{组 1049@2x.png => tab3-a.png} (100%) rename images/home/组 226@2x.png => tabbarComponent/icon/tab3.png (100%) mode change 100755 => 100644 rename tabbarComponent/icon/{组 1050@2x.png => tab4-a.png} (100%) rename images/home/组 229@2x.png => tabbarComponent/icon/tab4.png (100%) mode change 100755 => 100644 delete mode 100755 tabbarComponent/icon/组 226@2x.png delete mode 100755 tabbarComponent/icon/组 227@2x.png delete mode 100755 tabbarComponent/icon/组 229@2x.png delete mode 100755 tabbarComponent/icon/组 668@2x.png create mode 100644 utils/WxValidate.js create mode 100644 utils/checkLogin.js create mode 100644 utils/qqmap-wx-jssdk.min.js diff --git a/app.js b/app.js index 5c68452..6dea786 100644 --- a/app.js +++ b/app.js @@ -4,11 +4,52 @@ App({ var that = this; //获取设备信息 this.setMenuHeight() + this.autoUpdate() + }, + autoUpdate:function(){ + console.log(new Date()) + var self=this + // 获取小程序更新机制兼容 + if (wx.canIUse('getUpdateManager')) { + const updateManager = wx.getUpdateManager() + //1. 检查小程序是否有新版本发布 + updateManager.onCheckForUpdate(function (res) { + // 请求完新版本信息的回调 + if (res.hasUpdate) { + //2. 小程序有新版本,则静默下载新版本,做好更新准备 + updateManager.onUpdateReady(function () { + console.log(new Date()) + wx.showModal({ + title: '更新提示', + content: '新版本已经准备好,是否重启应用?', + success: function (res) { + if (res.confirm) { + //3. 新的版本已经下载好,调用 applyUpdate 应用新版本并重启 + updateManager.applyUpdate() + } + } + }) + }) + updateManager.onUpdateFailed(function () { + // 新的版本下载失败 + wx.showModal({ + title: '已经有新版本了哟~', + content: '新版本已经上线啦~,请您删除当前小程序,重新搜索打开哟~', + }) + }) + } + }) + } else { + // 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示 + wx.showModal({ + title: '提示', + content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。' + }) + } }, onShow(e){ //隐藏系统tabbar wx.hideTabBar(); - var query = {}; if(e.query.q){ //通过扫码进来获取二维码上的参数并存入storage @@ -61,44 +102,26 @@ App({ tabbar: tabbar }); }, - getToken(){ - // console.log('getToken') - var tokentime = wx.getStorageSync('tokentime') || '';//过期时间 - var timestamp = Date.parse(new Date());// 当前时间 - var expiration = timestamp + 60000 * 60 * 12; //缓存12小时 - var token = wx.getStorageSync('token') || ''; - this.login(expiration); - }, - login(expiration){ - wx.login({ - success: res => { - // 发送 res.code 到后台换取 openId, sessionKey, unionId - // console.log('code:',res.code) - this.http('GET','wechat/auth',{code : res.code,spread:0,login_type:0}).then( - response =>{ - if(response.data.isSuccess){ - wx.setStorageSync('token', 'Bearer '+ response.data.data.token); - wx.setStorageSync('uid', response.data.data.userId); - wx.setStorageSync('tokentime', expiration); - } else{ - wx.showToast({ - title: response.data.msg, - icon : 'none' - }) - } - } - ) - } - }) - }, getInfo(){ this.http('get','userinfo').then((res)=>{ if(res.data.success){ + // console.log(res.data) wx.setStorageSync('userInfo',res.data.data) var pages = getCurrentPages().pop();//当前页面 if (pages.getUser){ pages.getUser(); } + } else{ + wx.showToast({ + title: res.data.msg, + icon: 'none', + duration: 2000 + }) + setTimeout(()=>{ + wx.navigateTo({ + url: '/pages/login/index', + }) + },2000) } }) }, @@ -120,10 +143,13 @@ App({ data: params || {}, //请求参数 success: res => { wx.hideLoading(); + console.log(res) //判断token是否过期 res.data.code == 40001 - if(!res.data.isSuccess && res.data.code == 40001){ - console.log('token过期') - that.getToken() + if(!res.data.success && res.data.status == 401){ + console.log('登陆失效') + wx.navigateTo({ + url: '/pages/login/index', + }) } resolve(res); //成功执行方法,参数值为res.data,直接将返回的数据传入 @@ -142,8 +168,8 @@ App({ ) }, globalData: { - // baseURL : 'http://192.168.0.114:8092/api/', - baseURL : 'https://www.cyjyyjy.com:8093/api/', + baseURL : 'http://192.168.0.114:8092/api/', + // baseURL : 'https://www.cyjyyjy.com:8093/api/', userInfo: null, navHeight : 0, navTopHeight: 0, @@ -155,18 +181,18 @@ App({ tabBar: { "backgroundColor": "#ffffff", "color": "#979795", - "selectedColor": "#1c1c1b", + "selectedColor": "#FF6F34", "list": [ { "pagePath": "/pages/index/index", - "iconPath": "icon/icon_home.png", - "selectedIconPath": "icon/icon_home_HL.png", + "iconPath": "icon/home.png", + "selectedIconPath": "icon/home-a.png", "text": "首页" }, { "pagePath": "/pages/demandHall/index", - "iconPath": "icon/icon_home.png", - "selectedIconPath": "icon/icon_home_HL.png", + "iconPath": "icon/tab2.png", + "selectedIconPath": "icon/tab2-a.png", "text": "供需大厅" }, { @@ -177,14 +203,14 @@ App({ }, { "pagePath": "/pages/life/index", - "iconPath": "icon/icon_mine.png", - "selectedIconPath": "icon/icon_mine_HL.png", - "text": "购物车" + "iconPath": "icon/tab3.png", + "selectedIconPath": "icon/tab3-a.png", + "text": "生活" }, { "pagePath": "/pages/user/index", - "iconPath": "icon/icon_mine.png", - "selectedIconPath": "icon/icon_mine_HL.png", + "iconPath": "icon/tab4.png", + "selectedIconPath": "icon/tab4-a.png", "text": "我的" } ] diff --git a/app.json b/app.json index d47029f..24761a1 100644 --- a/app.json +++ b/app.json @@ -1,23 +1,34 @@ { "pages":[ + "pages/index/index", "pages/user/index", + "pages/login/index", + "pages/webview/index", + "pages/demandHall/createProject/index", + "pages/demandHall/needsContact/index", + "pages/user/needsOrder/index", + "pages/user/resourcesOrder/index", + "pages/user/needsManage/index", + "pages/user/resourcesManage/index", + "pages/user/editNeeds/index", "pages/demandHall/needsDetail/index", "pages/demandHall/resourcesDetail/index", "pages/demandHall/companyDetail/index", + "pages/demandHall/resourcesContact/index", + "pages/demandHall/applyDetail/index", + "pages/demandHall/platform/index", "pages/demandHall/index", "pages/release/index", "pages/release/personAuth/index", "pages/release/companyAuth/index", "pages/release/perfectPersonInfo/index", "pages/release/perfectCompanyInfo/index", - "pages/index/index", + "pages/life/index", "pages/user/mine/index", - "pages/user/agreement/index", "pages/user/incomeDetail/index", "pages/user/profession/index", - "pages/user/completeData/index", "pages/user/personalData/index", "pages/user/industry/index" @@ -36,29 +47,34 @@ { "pagePath": "pages/index/index", "text": "首页", - "iconPath": "tabbarComponent/icon/icon_home.png", - "selectedIconPath": "tabbarComponent/icon/icon_home_HL.png" + "iconPath": "tabbarComponent/icon/home.png", + "selectedIconPath": "tabbarComponent/icon/home-a.png" }, { "pagePath": "pages/demandHall/index", "text": "供需大厅", - "iconPath": "tabbarComponent/icon/icon_home.png", - "selectedIconPath": "tabbarComponent/icon/icon_home_HL.png" + "iconPath": "tabbarComponent/icon/tab2.png", + "selectedIconPath": "tabbarComponent/icon/tab2-a.png" }, { "pagePath": "pages/life/index", "text": "生活", - "iconPath": "tabbarComponent/icon/icon_mine.png", - "selectedIconPath": "tabbarComponent/icon/icon_mine_HL.png" + "iconPath": "tabbarComponent/icon/tab3.png", + "selectedIconPath": "tabbarComponent/icon/tab3-a.png" }, { "pagePath": "pages/user/index", "text": "我的", - "iconPath": "tabbarComponent/icon/icon_mine.png", - "selectedIconPath": "tabbarComponent/icon/icon_mine_HL.png" + "iconPath": "tabbarComponent/icon/tab4.png", + "selectedIconPath": "tabbarComponent/icon/tab4-a.png" } ] }, "style": "v2", + "permission": { + "scope.userLocation": { + "desc": "你的位置信息将用于小程序位置接口的效果展示" + } + }, "sitemapLocation": "sitemap.json" } diff --git a/app.wxss b/app.wxss index fb453d8..d999bd8 100644 --- a/app.wxss +++ b/app.wxss @@ -9,7 +9,10 @@ label, navigator, image { -webkit-box-sizing: border-box; - box-sizing: border-box; + box-sizing: border-box; +} +image{ + /* border-radius: 8rpx; */ } /* layout */ .acea-row-nowrap { @@ -120,4 +123,29 @@ radio .wx-radio-input.wx-radio-input-checked::before { border: 2rpx solid #FF5100; transform: translate(-50%, -50%) scale(1); -webkit-transform: translate(-50%, -50%) scale(1); +} + +.no-list{ + display: flex; + flex-direction: column; + align-items: center; + font-size: 46rpx; + color: #D8D8D8; + font-weight: 500; + padding-top: 20%; +} +.no-list image{ + width: 536rpx; + height: 490rpx; +} +.no-list .to-btn{ + width: 458rpx; + height: 88rpx; + line-height: 88rpx; + text-align: center; + background: linear-gradient(134deg, #FFA782 0%, #FF6D31 100%); + border-radius: 44rpx; + font-size: 40rpx; + color: #fff; + margin-top: 160rpx; } \ No newline at end of file diff --git a/images/arrow-d.png b/images/arrow-d.png new file mode 100644 index 0000000000000000000000000000000000000000..a9d6b9abb5fa07b4a51d017bedcd9d9ad43ba4df GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMI!3HF6S#5U!QY^(zo*^7SP{WbZ0py?eba4!^ z@Lzl7BIh9k0k#MKFECm)NzV{0ne@0eh(lKtGkaouMJR{IGVCyu?{DiVA${gNx=B3&1WV4YxxsLxAGi#hT_;$%;r zORc!b+EU5&g1h38F1M9YaH;i51^Ixh>nDm_5V+v@uhGeY|0in~V_XVP3L~2!cM5Bh z2Zt21i=e(sLhTf7-l*BlH`FiMJ-l$xuP^H+-wdmlPdR3odiIrGcr)ATrGvw=|F`dQ cg*>-Az4i?M=iF({K(8@)y85}Sb4q9e09~SMDgXcg literal 0 HcmV?d00001 diff --git a/images/home/call.png b/images/home/call.png new file mode 100644 index 0000000000000000000000000000000000000000..886a78d8cb71667c5f1b0b85d1241b11b99c637d GIT binary patch literal 2051 zcmV+e2>kbnP)N;ejl&Z?ecHYT|-IN~R`)p(t3Em1W!X zU)r=dO*55_Ib%#Ssg0FRV>F{Akc{7c=ic+)yAY!HZM-{k=5a6g{?7T_@9&=TJLh*8 zv*CdtHVAqa039o*a-9A?N58*PX{B;clve4Q{J&=DUj7U{%be-JJT{mbrloR<8rep_ zu&~^r=ih~fX}Hb)1JW^fYRpFZy=iJ3S47V)QaM6@=TiwqB%4I%9+H}}q8`#U{y!Zn zpz}uYOqasWO-acRHp+28j18npbEyG;D;jc{eoGL}JT10M&yt-|vU6FX;$Ko-RHuER z^vs_sIxk@EQ#nJf6J`f*2$yX0I^?>(hnCH>7gQRRyW&m$LKTJB-8=MbnN*it=RZ`E zZRvUg$lw8m+nu0qWVpjzKa{yib(-tn&)Z~+9`9{o^j}gbwI4gHbg2z8+*=m+oRU(! z`<0>Ya=-8Qp+(D9m_7#`d&eT>=)rmuR3r;@nsHOdf~ZaHQronwPVK|Frg15XMKC8j zq<}ykGkF`c9_=9wn?pBuh&PhKob=#8!lT-$&9nNxIfl8=13!v4agsUt!P_X>dV#mS zuaC1>yoDPS35---(Ww|0G_9YDV`T<3mMq}sb`R^!Azk5v{MO49#A;cr>Pni*qtRS` z1IJ2%qs73HbyNzjp&@UHoqNi7q1tWg}RxQZSsy2SSd=r|=2&e>TECLP}0uA}V zYq>yuP6ui;1MS?Id@0&q*>fH>ObR$<@)uMYZ7!ZkDs`bzsC1YEtpyI{0Cicw!3>}_ z?K<`(x!KVrLq*$f(YH24DQB!8zNp%0W67In;7DPI>~?EqpgICNm`*^cz^lo?z9fQ*2VRLgZRc;TOsMvu z(hWPMi!0f9RmK|fR`lX_1jJS1KnVo28hAMtsEPU1&R`QvkrH=D9xe&e7S+b;bIMIB z)ux->ZeJn+kxF~w2+9ELUIn}qRpEe$^2c1D#5XpiJ}LM1&FZ5MV#8XOe;XA72QPWg>= zqG7?R4eec%EdlLSx}8v|S_@QZT2L7g%p7zO$5P>a=lIE0LFuO+EN-Eqb1=Fchw8-6 zNS(uDM|nj|TDst1x1^H@Hrk@tuqLKea=Tr6p;9EUGve!h35u7qF#_yQW}0qWxDrd> zQG=vXm4*WWmElyve(M*oa5hwUUk5XdVHU0-P;WO2RV(jf#|mJ37_coA*ct+C3XXC( zn7l^A73*ZuTDnZ>Zn442u#d2PxeT;rDX=*RcyVzHwg)+MJ)VC~#)VcU5(GTzm}s%V zir}f(64F7x1QbYWEe19&1UAgCbnwK}Pl$AtpL`{{d#mP6*u11d23kZw0l@nCK-sfE z@oa6c_h*sY&q`FEmldN(+NS%U1zSCHigWKIOq#{+3k04d{uHJ;U04A2>ZrO6yp=~%7Ru24ST z2c^&4M9EyP6tHdE|5O*&KDiB9-ougQGn0VYB%ll*0`dk@9|w}X2x=^lI2u?z z%3vW_ojIf;7qoOP)~oSi|K|v(9fdQ1g6TlsG!PV!GX6OoFJp7> z;fOK3(%U}$D%HXB*Kw|Ta=Xt-rB1Bsp_05^;xz9F9@!?Pip8_74-5A~pp3{~FC(lXnPVcBG`TnqRk8Yfy z$QmX(EtHn65p8UHqN)cZg z8^c}ab@8z;>$VY7Uia(15tAoHbnK5FHhA2((^eB-%VR!yKKFsuTW9rB035@oQO*?+ hsNd{-++LfV{{xgK{_d;wwfO)5002ovPDHLkV1hNV#y9`~ literal 0 HcmV?d00001 diff --git a/images/home/progress.png b/images/home/progress.png new file mode 100644 index 0000000000000000000000000000000000000000..6ee0036947bd931224798122c1e7813bad43f150 GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA#Rm9UcLVG_4|*XzkdJyH*dOvGEilPr;B5V#`(7w&G{M(cv=&Mt9oCy ze0o>!Gvz>%>YaxAjZgAFBy=4YUbI&AI?MVy2U%T}*miTCur+;<5_`&k;TiXbW`64( zVrMV#S-tmnOBGv@Ff+{Lfu+Dn<;;F@fm2PKZ}_>V>Q~n?GyaziVPC*<7-%Phr>mdK II;Vst0AH$Nwg3PC literal 0 HcmV?d00001 diff --git a/images/home/组 221@2x.png b/images/home/组 221@2x.png deleted file mode 100755 index 870f22185f36f399f599f12d485a05e62d789658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1284 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 literal 0 HcmV?d00001 diff --git a/images/no-order.png b/images/no-order.png new file mode 100644 index 0000000000000000000000000000000000000000..e895b1c855c02f662dba9d1f55bfb0739d538f37 GIT binary patch literal 39832 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

p1uh#U_(8AKQEjoQww@sDfA?v^ zsQ#N;qh0hvm)Jh3z|ybNl(MakwW#ejvbf*ida~M9M>jdqfM_=qqLmncN(kt>LqBK3 z!!IA@I+m?=X$-6RllaH z52l%@X8!q@HL0Ix^1_s;jsrZ=1^5r#h<=bL*b2JGEt=Z1z^r(KWIQfW8JOB7opvW+ zhdI?QK$p@+=n|+jovA=a=aVW_o~VZg%YAt>=VsoD3qmCX65dh{XX0jHBroPC(W}AC z!(E@*@Cvk_z}LyTrR5V!mSUJd1YDBsRqfyF2pKp8vslnH=V?0XyDe?bMrnVGx%DDx z2l*o6^*j^IFd<5oE3B3gY^}g)Lq^N&*WVAZOKjt|@D_`@t2aX#75hOLpNa9Kzh?yU zqc6(DDT5ZE35NI|+_==}9d2U3qZ=K&jfM-;_!e6~D%aA@v1=>U{6AFF&_kNZ#%*-O zDQA7`=WyxxMihd?Htk1<=^{zt;QDodQM3d^QVJL)-hsoV03$-hFZ(-^uf7vp@gY;S zm9cn07JhUv-=$nTK!6)DEB%OTCeo$%UpIZsfa~a`Xuvm z0A-l^M<55cLr+!J^I390yla6MpIPfiKXFlLL>PzBKUyQVQYOfRf^W6EXOGxEGw0*` z_vKJ>sC$be-9;HLZ=ABRT!(ynrdjtyD?W4qB<1D=pEv^wfya>dK@nmAL#!9TLTrz`f4d2E|KN0{BT*d_@(!^!Uw~M6v8&D ztRm>vs3B2MTMBg!HjEnc{r_OWnb0fcJxHNV^Z&!sB`%nKug@$8qYjLEB zlSFYVBIA=C9gIP-svXYc5EPfM5zmTyrlHAz^8f{a^%>A!gdlnh!v+bOV1t(KnuQjR z!`RG=OPKOl(OyyG-~qr5bT35UfLx%&#b?293?^>cOAd02G7h$(Kxxy867S;`>2lxQ z1J$cKcWvOue%@%hvKBD)96wX^eO{jxGYy!LIe)`>1cIU(@Yb*~!lFO^3$cwtZyVDF z9}78Bw257mv9gcf1d)>{rmLe^M2ZfPd5K8r+9+ftuEeGo)#+$(t0DtTehIGovL>7} z+sJo#(#P>*-!Lp#QX*x>-Q^scK+*!lLW)b1Avt0pzy2h+4%7tO61osGARb_2S9OZO z1Exp5iOaNv`wYX`rQ(R@jM#?zM8A@nuQr&Oq9O1sXe`bVZpO;~EsiU$SeE%dvC;7p zJV6d?K{o4NS|TeObR|wy(G^+Co^Bogfra1l*2DU@sSrKSgY($NYDT{QAOGhLysV4= YE8vDmSO_U=3;`~Oj;5hTwHhw!f1UQ%PXGV_ literal 0 HcmV?d00001 diff --git a/images/user/header.png b/images/user/header.png index d7be5a22666465838c0cf2d2cf5e7e4beb9d30a8..6e756a3fe38b7b3b942aff3dd090ba8d36a23e59 100644 GIT binary patch literal 4460 zcmX9?cRbbK|9_KlU85_y=DplY_A1#kE*WLZo|mXx$;imK3XzqJD>5=OZ`REUA6F!$ zxS3a0WM}8f`rUrtKh8Oi$Jvi_&g(f&f|<#6RxmFZ0034)1C#}|#QsYl25L^!bQ=Hw zc6me8HLDQk4JS+zUtef`@WcK#q15X?o~A7P&d*fFL>R0oC+yBCnx}UiZsDFmYj%t2 zUkFHBFf!Q-YYo#eK^P5Yg|)!K29Q4QC}Hg#A>Se73-^f%w?kdRCF3+{hr#}Yn2&vz zHbWN77t+)t*9RR~u7S%*5$i7+1|~ST1jXiV=ZDUC!3Td2w(qh%*9ei8m7SULQCy;# zg&M6$$3RXK;QCl6v#oH0sKLM+gt*J+W?pr=IU1l0Vn zb20Pd-`|FZExy-RpSLtRf4Nt)OO2mh*O@{ONXvkXR+xIn-K?!sMbrB$xiE*ZJO(r+ zq!lt`TQ_4k73e~std5aBXf?o9Xx^=N+!EMobmPXebf-j4vLpdeF0L6

X|kMjIsU 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 literal 28167 zcmV)lK%c*fP)Pz2!AV3xRCwC#y?K!B=~>_RdAHwo);`^R@9n$HojWs{8G*1i3kxC83W%i~V+=7S zIBSuV3ku9)(|zwn2m=NgV!G@H{S+c-%XG z86i3XIsrN&_zr|_zyo0pVu4@*dLe>Xc(@b1e>UKs@m@URUFX@K{NC5k{;Xdc@n`N6 zhakT7hu;4(AM6_t;!PmFND{U}2zc+~mlA>y0zwEN03JL9;XmW6hak@$A3}(~gZO;d zCGZ=9@XKC`U;U@w`L<83{`}_#{^R`lJ3sM(UQ@cS7a@E#f-m(UZ1@oH!Q+45FA?x~ zMDU2!<3bPw1VTze2)Gacao^upMqV8di9iI9Lg0fxAn>apgnwQ8`v3mP@BL3^e{SGE z;?LKA{m-ba*KdBAmf~*)_$xpj{V{r*4*?e(;nbmo_$&r?NCE^<9)c8jBtZxQV4XXA zt^_0kM0_6+;`5{rXI>uPD7m@(9-h+rwSAY^SUKAl9 z1cDEU@Zg1thF<+L0LX0-!aqlapZekNeA_4g+`zxb&$qtwSHA$q+X>+tBxvaa68FHT z41lxI(9uxf#me&d)lGs>@IVeeeN4P(!@V@>?z<2Q&_Y50@BL>O_MU+~LIy(c5Cjq# zKTNvAj4M$9|V95Ac9BYf7gWtf;tP)K?FSa z6;h`eS?Kt9@9$MaD}$eU{;AW4(~BTZFNlbt+OM9o^4M^{_lnc^i+`6W2=Xjd1PCJV z3&Hb0{m9$D;@AJ9H1Oa0;rBk4_~ai8!B<;p39E~B>NO!a@P2hcPYoduLB-4(+$vOy zGXqK?f1xm83=r63F5vqx(b7V7%HW_*UEVB z3Be*nEU<)-(bIxLctsErCmg|h5Hfme2*?nSQXzy`y~e%VDgvu;9*yY;*wftXL4<%j zJv4w10i-xHx)cHtRu4Y)Y$5L50+m+kA16-!kN@-ce8u8(dA;T5@-Th-5B|#E^tpa^ z@9zHhhF~+PJVN+;?a0cDoOk&9`r2?`&b-&Fh6nD8`_HNn4_4Je-~$97U-SN(wHD_b z-g}&LIPbAO2668_KKN+xRZDjN`-ihaYt=)qqQY79SiQc|Dq9<_y*(XvpZVKA@GF1g zbLm*0lQ;T~cYbI~`ueA3@LzIxw8!=9&++8vy_BLm03`R>FZQO+-3L_M^R9T|d<@_B z!yYu|1TZ;!iLpUu0!u@9_24#sq3(%)k zyOhy)vMghLv`ES7VQk7o!WKS1z*?FYW&t$TmwJ@{|G^Eba-`u5`lzQhCT>l+N$ z2Hd!L18ds{5v1SCQ$zS&x3hZptaF9a+#1^&zbdt(;bYk(P2~{MS$5_r&bhO&cvcMEmro@gsRF%T2j^OvwvI+P%YQL^OX-mWB;f(5 zQl7Oof#6~#9$hyel{$MrA;ei_EP}ZI3;eEp4>CxEh|iTuAf-eKkW!+x0RmN3($r1t zo24Srn&7>#p?UrJB)s+2ulu@x^`ZCu^x{vwfxqXSAAD3A`Cb7p4}Nv(5y&7Tv>1V1 zvLXQ_+qZYw*jPs?^*~W|f9Ss7z?o58IDd}3$Z6Y#rfK3A5g>`xwlR`4Q6z~Wgy^-W zzN`cY0zr6`lt`j6@+>9M8lx57TkwAMnvkYu)gr~VEVgV48B{zh!pGkV(8eH?M2dK% zj4=e~Xv%ukvrB}KD5Yp;u zx14tn0t$r)@(e+8!Xczb3P!_l#)juePjhgewGg^pvZH2MT%0AvZ|QOrdVeI zMIu$asKR3s&uBQJ==8XKXNUQsM4%veq>yN(2|^OQ#k=V7yR_cctY?PtqD$ITZa?@2Lz=-NeB|-7WCW+ zk9TLh^3rVQLVx^K=imJOANx~h;BWpP{>2;0<@{eh{P5M@sn^^CB1Eh;g;-(7HlF$* zX&TE%Kl(8qee@C5*4BUTTpR*Q3N|-3ND~DFCX)$^<&ws>D4{S)p@ahA==V}OoelxX z{=p&3vIZ~ET97DBkrlMg(J6Agt;ma%ixO*{bFAhg6dPq*IViQZlQ!numA;gn%7 zJ6SI0U%U3^|Mge@)EM}?e&qds<;CkS{GUmpQ>7#qE^OT!2*}gQHyT+WAlS3|Q%cG4 z@iCwJ)YH7`Rj(pR^3SNGC4pY2pi|_O)e`3%X__*h ^kB?VdvjMfxIj!^-GXEvM1 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 + if(res.data.success){ + this.setData({ + content: res.data.data + }) + } + }) + }, + getUserList(){ + // console.log(this.data.detail) + app.http('get','Communicate/communicateHeadList',{resourceId: this.data.detail.resourceInfo.resourceId}).then((res)=>{ + if(res.data.success){ + this.setData({ + userList: res.data.data, + communicateId: res.data.data[0].communicateId + }) + this.getApplyDetail(); + } + }) + }, + toNeedDetail(e){ + let id = e.currentTarget.dataset.id + wx.navigateTo({ + url: '/pages/demandHall/needsDetail/index?id=' + id, + }) + }, + //查看立项书 + toCreateProject(){ + let content = this.data.content + wx.navigateTo({ + url: '/pages/demandHall/createProject/index?state=' + content.comminuteState+ '&id=' + content.communicateId, + }) + }, + // 立项 + createProject(){ + let id = this.data.communicateId + wx.showModal({ + title: "提示!", + content: '是否确认发起项目?', + success(res){ + if(res.confirm){ + wx.navigateTo({ + url: '/pages/demandHall/createProject/index?id='+ id, + }) + } + } + }) + }, + call(){ + console.log() + wx.makePhoneCall({ + phoneNumber: this.data.content.phone, + }) + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + let data = JSON.parse(decodeURIComponent(options.data)); + this.setData({ + detail: data + }) + // console.log(this.data.detail) + this.getUserList() + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/demandHall/applyDetail/index.json b/pages/demandHall/applyDetail/index.json new file mode 100644 index 0000000..725e908 --- /dev/null +++ b/pages/demandHall/applyDetail/index.json @@ -0,0 +1,6 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "申请详情", + "navigationBarBackgroundColor": "#FF5100", + "navigationBarTextStyle": "white" +} \ No newline at end of file diff --git a/pages/demandHall/applyDetail/index.wxml b/pages/demandHall/applyDetail/index.wxml new file mode 100644 index 0000000..e2d8f09 --- /dev/null +++ b/pages/demandHall/applyDetail/index.wxml @@ -0,0 +1,66 @@ + + + + + + + {{detail.resourceInfo.name}} + + 网站建设 + + {{detail.resourceInfo.content}} + + + + + + + + + + + + + + + + + {{content.name}} + + {{content.demandInfo.content}} + + + {{content.demandInfo.name}} + 详情 + + + 场地租赁 + + + 需求预算 {{content.demandInfo.budget}} + {{content.createTime}} + + + + + {{content.projectListDto.projectName}} + 详情 + + + 场地租赁 + + + {{content.projectListDto.partner}} + {{content.createTime}} + + + + + + + 发起项目 + 立即沟通 + 忽略 + 项目已取消 + + \ No newline at end of file diff --git a/pages/demandHall/applyDetail/index.wxss b/pages/demandHall/applyDetail/index.wxss new file mode 100644 index 0000000..48b927b --- /dev/null +++ b/pages/demandHall/applyDetail/index.wxss @@ -0,0 +1,173 @@ +/* pages/demandHall/applyDetail/index.wxss */ +page{ + width: 100%; + height: 100%; +} +.applyDetail-page{ + height: 100%; +} +.top-box{ + width: 100%; + padding: 40rpx 40rpx 62rpx; + background: linear-gradient(180deg, #FF5100 0%, #FFA782 100%); +} +.company-card-box { + width: 100%; + padding: 30rpx 12rpx; + background: #FFFFFF; + box-shadow: 0rpx 6rpx 12rpx rgba(0, 0, 0, 0.16); + border-radius: 12rpx; +} +.info{ + width: 70%; +} +.company-logo{ + width: 154rpx; + height: 154rpx; + margin-right: 20rpx; +} +.company-name{ + font-size: 28rpx; + line-height: 56rpx; + font-weight: 500; + color: #1D1D1D; +} +.slogan{ + font-size: 24rpx; + line-height: 34rpx; + color: #666; + margin: 4rpx 0 12rpx; +} +.tags-box{ + margin: 6rpx 0 10rpx; +} +.tag-item{ + width: 112rpx; + height: 36rpx; + line-height: 34rpx; + text-align: center; + border: 1rpx solid #FFAA00; + color: #FFAA00; + border-radius: 4rpx; + margin-right: 8rpx; + font-size: 24rpx; +} +.content-box{ + width: 100%; + height: calc(100% - 490rpx); + overflow: hidden; +} +.content-l{ + width: 152rpx; + height: 100%; + padding-left: 22rpx; + background: #EEEEEE; + overflow: hidden; +} +.l-item{ + width: 100%; + height: 136rpx; + display: flex; + align-items: center; + justify-content: center; +} +.headerImg-box{ + border-radius: 50%; + overflow: hidden; + position: absolute; +} +.headerImg-box image{ + width: 92rpx; + height: 92rpx; +} +.l-item-a{ + background: #fff; + border-top-left-radius: 50px; + border-bottom-left-radius: 50px; +} +.content-r{ + width: calc(100% - 152rpx); + padding: 46rpx 30rpx; + font-size: 28rpx; +} +.apply-word{ + color: #666; + line-height: 44rpx; + margin-top: 24rpx; +} +.btn-box{ + width: 100%; + height: 160rpx; + padding-top: 24rpx; + position: absolute; + bottom: 0; +} +.btn-item{ + width: 190rpx; + height: 76rpx; + line-height: 76rpx; + text-align: center; + font-size: 32rpx; + color: #fff; + font-weight: 400; + background: #BFBFBF; + border-radius: 12rpx; + margin-right: 16rpx; +} +.bgO{ + background: linear-gradient(144deg, #FFA782 0%, #FF5100 100%); +} +.need-item{ + width: 100%; + padding: 10rpx 0; + background: #FFFFFF; + box-shadow: 0rpx 6rpx 12rpx rgba(0, 0, 0, 0.16); + border-radius: 12rpx; + margin: 32rpx 0; +} + +.n-title-box{ + padding: 0 26rpx 10rpx; + font-size: 28rpx; + color: #1D1D1D; + margin: 16rpx 0 12rpx; + border-bottom: 2px solid #E2E2E2; +} +.word{ + width: 340rpx; + font-size: 28rpx; +} +.colO{ + color: #FF5100; + font-size: 500; +} +.n-tags{ + padding: 0 26rpx; + margin-bottom: 10rpx; +} +.n-tag-item{ + width: 112rpx; + height: 36rpx; + line-height: 34rpx; + text-align: center; + border: 1rpx solid #FFAA00; + color: #FFAA00; + border-radius: 4rpx; + margin-right: 8rpx; + font-size: 24rpx; +} +.bgG{ + border: 1rpx solid #3A9EFA; + color: #3A9EFA; +} +.bgR{ + border: 1rpx solid #FC9367; + color: #FC9367; +} +.price-box{ + color: #707070; + padding: 0 20rpx; +} +.desc{ + width: 370rpx; +} \ No newline at end of file diff --git a/pages/demandHall/companyDetail/index.js b/pages/demandHall/companyDetail/index.js index 25da07d..27e5956 100644 --- a/pages/demandHall/companyDetail/index.js +++ b/pages/demandHall/companyDetail/index.js @@ -1,11 +1,13 @@ // pages/demandHall/companyDetail/index.js +const app = getApp(); Page({ - /** * 页面的初始数据 */ data: { - tabActive: 3, + id: '', + detail: {}, + tabActive: 1, swiperImgUrls: [ '../../../images/home/item-bg.png', '../../../images/home/company-top-bg.png' @@ -23,13 +25,42 @@ Page({ swiperIndex: e.detail.current, }) }, + toNeedsDetail(e){ + let id = e.currentTarget.dataset.id + wx.navigateTo({ + url: '/pages/demandHall/needsDetail/index?id='+ id, + }) + }, + toResourcesDetail(e){ + let id = e.currentTarget.dataset.id + wx.navigateTo({ + url: '/pages/demandHall/resourcesDetail/index?id='+ id, + }) + }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { - + console.log(options) + this.setData({ + id: options.id + }) + this.getDetail() + }, + getDetail(){ + app.http('get','Enterprise/enterpriseInfo',{id:this.data.id}).then((res)=>{ + if(res.data.success){ + this.setData({ + detail: res.data.data + }) + } + }) + }, + toWebview(){ + wx.navigateTo({ + url: '/pages/webview/index?src='+ this.data.detail.enterpriseNet, + }) }, - /** * 生命周期函数--监听页面初次渲染完成 */ diff --git a/pages/demandHall/companyDetail/index.wxml b/pages/demandHall/companyDetail/index.wxml index d0d5c54..92ff69d 100644 --- a/pages/demandHall/companyDetail/index.wxml +++ b/pages/demandHall/companyDetail/index.wxml @@ -1,14 +1,14 @@ - + - + - 楚牛科技 - 让全世界牛起来。 + {{detail.enterpriseName}} + {{detail.enterpriseTitle}} 网站建设 IT软件 @@ -18,23 +18,23 @@ - 武汉市CBD国际大厦A座 + {{detail.enterpriseAddress}} - 武汉市CBD国际大厦A座 + {{detail.enterpriseNet}} - 9466-9466 + {{detail.enterprisePhone}} 首页 - 资源 - 需求 + 资源({{detail.resourceList.length || 0}}) + 需求({{detail.demandList.length || 0}}) @@ -46,7 +46,7 @@ 企业名称 - 湖北楚牛科技有限公司 + {{detail.enterpriseName}} 所属类型 @@ -62,7 +62,7 @@ 经营范围 - 计算机系统服务;软件开发;游戏开发;会议会展服务;广告设计;设计服务;计算机软硬件及配件、电子产品设计。 + {{detail.businessNature}} @@ -71,7 +71,7 @@ 关于我们 - 湖北楚牛科技有限公司成立于2010年3月,核心团队成员均来自业内相关的顶尖公司。楚牛的愿景是让我们的技术和产品能与合作伙伴一起拥抱全球化!公司法定代表人为刘戴辉,注册资本为200万元人民币,统一社会信用代码为946946946694464T,企业地址位于湖北省武汉市江汉区东风路街道蚌塘街37号航线大厦2811号,所属行业为商务服务业,经营范围包含计算机系统服务;软件开发;游戏开发;会议会展服务;广告设计;设计服务;计算机软硬件及配件、电子产品设计。 + {{detail.resourceIntroduction}} @@ -81,7 +81,7 @@ - + @@ -89,12 +89,29 @@ - 更多信息请见官网> + 更多信息请见官网> - + + + + + {{item.title}} + 资金需求:{{item.capital}} + {{item.detailedDescription}} + + + + + 发布日期 {{item.resourceStartTime}} + {{item.enterpriseAddress}} + + 了解详情 + + + - + + + {{item.title}} + {{item.capital}} + + + 网站建设 + IT软件 + APP开发 + + {{item.detailedDescription}} + + {{item.resourceEndTime}}截止报名 + 了解详情 + + + diff --git a/pages/demandHall/companyDetail/index.wxss b/pages/demandHall/companyDetail/index.wxss index 15211b5..4115207 100644 --- a/pages/demandHall/companyDetail/index.wxss +++ b/pages/demandHall/companyDetail/index.wxss @@ -30,6 +30,7 @@ width: 150rpx; height: 150rpx; margin-right: 20rpx; + border-radius: 8rpx; } .name{ font-size: 32rpx; @@ -117,7 +118,7 @@ box-shadow: 0px -6px 20px rgba(0, 0, 0, 0.11); } .info-box,.about-box{ padding-bottom: 34rpx; - border-bottom: 2rpx solid #BFBFBF; + border-bottom: 2rpx solid #eee; } .title-box{ padding: 34rpx 40rpx; @@ -190,6 +191,7 @@ box-shadow: 0px -6px 20px rgba(0, 0, 0, 0.11); .resources-item{ width: 100%; background: #fff; + margin-bottom: 20rpx; } .item-top{ width: 100%; @@ -200,6 +202,7 @@ box-shadow: 0px -6px 20px rgba(0, 0, 0, 0.11); width: 196rpx; height: 196rpx; margin-right: 24rpx; + border-radius: 8rpx; } .info{ width: 370rpx; @@ -245,12 +248,13 @@ box-shadow: 0px -6px 20px rgba(0, 0, 0, 0.11); .company-list{ width: 100%; - background: #fff; } .company-item{ width: 100%; padding: 26rpx; + background: #fff; border-bottom: 2rpx solid #EEEEEE; + margin-bottom: 20rpx; } .company-item .title-box{ padding: 0; diff --git a/pages/demandHall/createProject/index.js b/pages/demandHall/createProject/index.js new file mode 100644 index 0000000..ce803fb --- /dev/null +++ b/pages/demandHall/createProject/index.js @@ -0,0 +1,254 @@ +// pages/demandHall/createProject/index.js +const app = getApp() +Page({ + + /** + * 页面的初始数据 + */ + data: { + state: 0, //未申请 + communicateId: null, + projectId: null, + detail: [], + projectInfo: {}, + modeList: [], + modeActive: 1, + projectName: '', + resultContent: '' , + totalMoney: '', + stageResultsDtoList: [] + }, + inpChange(e){ + let t = e.currentTarget.dataset.t + let value = e.detail.value + if(t == 'n'){ + this.setData({ + projectName: value + }) + } else if(t == 't'){ + this.setData({ + totalMoney: value + }) + } else if(t == 'c'){ + this.setData({ + resultContent: value + }) + } + }, + modeClick(e){ + let id = e.currentTarget.dataset.id + let nums = e.currentTarget.dataset.nums + if(this.data.state != 0){ + return + } + this.setData({ + stageResultsDtoList: [] + }) + let p = this.data.stageResultsDtoList + for(var j = 0; j < nums; j++){ + p.push({name: j+1, money: '', content: '' }) + } + this.setData({ + modeActive: id, + stageResultsDtoList: p + }) + }, + changePrice(e){ + let idx = Number(e.currentTarget.dataset.i) + let stageResultsDtoList = this.data.stageResultsDtoList + stageResultsDtoList[idx].money = e.detail.value + this.setData({ + stageResultsDtoList + }) + }, + changeContent(e){ + let idx = Number(e.currentTarget.dataset.i) + let stageResultsDtoList = this.data.stageResultsDtoList + stageResultsDtoList[idx].content = e.detail.value + this.setData({ + stageResultsDtoList + }) + }, + submit(){ + let data = { + resourcesId: this.data.projectInfo.projectResource.resourceId, + projectName: this.data.projectName, + projectCode: this.data.projectInfo.projectCode, + cooperationModeId: this.data.modeActive, + resultContent: this.data.resultContent, + stageResultsDtoList: this.data.stageResultsDtoList, + totalMoney: this.data.totalMoney, + providerId: this.data.projectInfo.projectProvider.prividerId, + receiverId: this.data.projectInfo.projectReceiver.receiverId, + communicateId: this.data.communicateId + } + if(data.projectName == ''){ + wx.showToast({ + title: '请填写项目名称!', + icon: 'none' + }) + return + } else if(data.totalMoney == ''){ + wx.showToast({ + title: '请填写项目总金额!', + icon: 'none' + }) + return + } else if(data.resultContent == ''){ + wx.showToast({ + title: '请描述交付成果!', + icon: 'none' + }) + return + } + app.http('post','Project/create',data).then((res)=>{ + if(res.data.success){ + wx.showToast({ + title: '操作成功!', + duration: 2000 + }) + setTimeout(()=>{ + wx.navigateBack({ + delta: 1, + }) + },2000) + } + }) + // console.log(this.data.stageResultsDtoList) + }, + //获取合作模式 + getModeList(){ + app.http('get','CooperationMode/listCooperationMode').then((res)=>{ + if(res.data.success){ + this.setData({ + modeList: res.data.data + }) + } + }) + }, + //获取资源信息 + getProjectInfo(){ + console.log(this.data.communicateId) + app.http('get','Project/toCreateProject',{communicateId:this.data.communicateId}).then((res)=>{ + if(res.data.success){ + this.setData({ + projectInfo: res.data.data + }) + } + }) + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + console.log(options) + let id = options.id // 立项 + let state = options.state // 项目书状态,1已申请,2等待立项,3已成立 + this.setData({ + communicateId: id, + state: state || 0 + }) + this.getModeList() + + if(state == 0 ){ + this.getProjectInfo() + } else{ + this.getProjectDetail() + } + }, + //获取立项书详情 + getProjectDetail(){ + app.http('get','Communicate/getProjectInfo',{ communicateId: this.data.communicateId }).then((res)=>{ + if(res.data.success){ + let data = res.data.data + this.setData({ + projectName: data.projectName, + stageResultsDtoList: data.stageResultsDtoList, + modeActive: data.stageResultsDtoList.length, + resultContent: data.resultContent, + totalMoney: data.totalMoney, + ['projectInfo.projectResource']: data.projectResource, + ['projectInfo.projectProvider']: data.projectProvider, + ['projectInfo.projectReceiver']: data.projectReceiver, + }) + } + }) + }, + confirm(){ + let that = this; + wx.showModal({ + title: '提示!', + content:'是否确认立项?', + success(res){ + if(res.confirm){ + app.http('get','Communicate/aggreProject',{projectId: that.data.projectId}).then((res)=>{ + if(res.data.success){ + wx.showToast({ + title: '操作成功!', + duration: 2000 + }) + setTimeout(()=>{ + wx.navigateBack({ + delta: 1, + }) + },2000) + } + }) + } + } + }) + }, + call(e){ + wx.makePhoneCall({ + phoneNumber: e.currentTarget.dataset.phone, + }) + }, + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/demandHall/createProject/index.json b/pages/demandHall/createProject/index.json new file mode 100644 index 0000000..ffb174c --- /dev/null +++ b/pages/demandHall/createProject/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "发布项目" +} \ No newline at end of file diff --git a/pages/demandHall/createProject/index.wxml b/pages/demandHall/createProject/index.wxml new file mode 100644 index 0000000..208e14c --- /dev/null +++ b/pages/demandHall/createProject/index.wxml @@ -0,0 +1,111 @@ + + + + 资源信息 + + + + {{projectInfo.projectResource.name}} + + 网站建设 + + {{projectInfo.projectResource.content}} + + + + + 项目名称 + + + + {{projectName}} + + + 项目编号 {{projectInfo.projectCode}} + + + + 合作模式 + + {{item.name}} + + + + 合作规则-定金尾款模式 + {{modeList[modeActive - 1].content}} + + + + 交付成果 + + + 总金额 + + + + + + + + 阶段{{index+1}} + + + + + + + + + + + 项目发起方(供方) + + {{projectInfo.projectProvider.name}} + + 银行账户 + {{projectInfo.projectProvider.bankNum}} + + + 开户信息 + {{projectInfo.projectProvider.bankInfo}} + + + + + 合作方 + + + + {{projectInfo.projectReceiver.name}} + + + + + + 确认并发起 + 待确认 + + \ No newline at end of file diff --git a/pages/demandHall/createProject/index.wxss b/pages/demandHall/createProject/index.wxss new file mode 100644 index 0000000..b976be9 --- /dev/null +++ b/pages/demandHall/createProject/index.wxss @@ -0,0 +1,188 @@ +/* pages/demandHall/createProject/index.wxss */ +.createProject-page{ + width: 100%; + padding: 0 40rpx 180rpx; + font-size: 28rpx; +} +.company-card-box { + width: 100%; + padding: 30rpx 12rpx; + background: #FFFFFF; + border: 2px solid #EEEEEE; + border-radius: 12rpx; + margin-bottom: 32rpx; +} +.info{ + width: 70%; +} +.company-logo{ + width: 154rpx; + height: 154rpx; + margin-right: 20rpx; +} +.company-name{ + font-size: 28rpx; + line-height: 56rpx; + font-weight: 500; + color: #1D1D1D; +} +.slogan{ + font-size: 24rpx; + line-height: 34rpx; + color: #666; + margin: 4rpx 0 12rpx; +} +.tags-box{ + margin: 6rpx 0 10rpx; +} +.tag-item{ + width: 112rpx; + height: 36rpx; + line-height: 34rpx; + text-align: center; + border: 1rpx solid #FFAA00; + color: #FFAA00; + border-radius: 4rpx; + margin-right: 8rpx; + font-size: 24rpx; +} +.title{ + margin-bottom: 26rpx; + font-weight: 500; + line-height: 40rpx; + color: #1D1D1D; +} +.num,.mode-box{ + margin-left: 38rpx; +} +.project-name-box{ + margin-bottom: 32rpx; +} +.inp-box{ + width: 100%; + height: 60rpx; + padding: 10rpx 20rpx; + background: #eee; +} +.inp-box input{ + width: 100%; + height: 100%; +} +.mode-item{ + width: 122rpx; + height: 40rpx; + border: 1rpx solid #707070; + text-align: center; + line-height: 38rpx; + font-size: 24rpx; + color: #707070; + border-radius: 8rpx; + margin-right: 10rpx; +} +.mode-item:nth-last-child(1){ + margin-right: 0; +} +.mode-item-a{ + border-color: #FF6D31; + color: #FF6D31; +} +.mode-detail{ + width: 670rpx; + height: 176rpx; + background: #FFF5F0; + border: 2rpx solid #FF5100; + border-radius: 12rpx; + font-size: 24rpx; + color: #666; + padding: 24rpx 20rpx; +} +.m-tit{ + font-weight: 500; + line-height: 34rpx; + color: #707070; + margin-bottom: 20rpx; +} +.area-box{ + width: 100%; + /* height: 446rpx; */ + background: #eee; + border-radius: 8rpx; + padding:28rpx 22rpx; + font-size: 24rpx; +} +.area-box textarea{ + width: 100%; + height: 116rpx; + border-bottom: 2rpx solid #BFBFBF; + margin-top: 24rpx; +} +.progress-item{ + width: 100%; + height: 138rpx; + border-bottom: 2rpx solid #BFBFBF; + padding: 24rpx 0; +} +.p-title input{ + width: 115rpx; + margin-left: 14rpx; + text-align: center; + border-bottom: 2rpx solid #BFBFBF; +} +.desc{ + width: 100%; + margin-top: 20rpx; +} + +.item{ + color: #666; + margin-bottom: 26rpx; +} +.item-r{ + width: 538rpx; + height: 60rpx; + padding: 10rpx 20rpx; + background: #eee; +} +.faqifang-box{ + color: #1D1D1D; +} +.f-item{ + margin-top: 22rpx; +} +.f-item-label{ + color: #707070; + margin-right: 28rpx; +} + +.header-box image{ + width: 92rpx; + height: 92rpx; + margin-right: 24rpx; +} +.call image{ + width: 54rpx; + height: 54rpx; +} +.btn-box{ + width: 750rpx; + height: 160rpx; + background: #FFFFFF; + box-shadow: 0px -6px 12px rgba(0, 0, 0, 0.04); + padding-top: 24rpx; + padding-right: 40rpx; + position: fixed; + bottom: 0; + left: 0; + z-index: 99; +} +.submit-btn{ + width: 223rpx; + height: 76rpx; + background: linear-gradient(144deg, #FFA782 0%, #FF5100 100%); + border-radius: 38rpx; + text-align: center; + line-height: 76rpx; + font-size: 32rpx; + color: #fff; + font-weight: 500; +} \ No newline at end of file diff --git a/pages/demandHall/index.js b/pages/demandHall/index.js index 544cab3..a998f54 100644 --- a/pages/demandHall/index.js +++ b/pages/demandHall/index.js @@ -1,25 +1,38 @@ // pages/demandHall/index.js const app = getApp(); Page({ - /** * 页面的初始数据 */ data: { tabbar: {}, - active: 2, - tabActive: 2, - showScreenDialog: false + active: '1', // 1资源供应,2需求广场 + tabActive: '1', // 1资源列表,2企业列表 + list: [], + showScreenDialog: false, + companyList: [], + pagesize: 10, + page: 1, + loading: true, //是否加载更多 + cagetoryList: [] , // 分类列表 }, topTabClick(e){ this.setData({ - active: e.currentTarget.dataset.i + active: e.currentTarget.dataset.i, + loading: true, + pagesize: 10, + page: 1, + list: [] }) + this.getPageData() }, tabClick(e){ this.setData({ tabActive: e.currentTarget.dataset.i }) + if(e.currentTarget.dataset.i == 2){ + this.getCompanyList() + } }, showDialog(){ this.setData({ @@ -31,20 +44,87 @@ Page({ showScreenDialog: false }) }, + toResourceDetail(e){ + let id = e.currentTarget.dataset.id; + wx.navigateTo({ + url: '/pages/demandHall/resourcesDetail/index?id='+id, + }) + }, + toCompanyDetail(e){ + let id = e.currentTarget.dataset.id; + wx.navigateTo({ + url: '/pages/demandHall/companyDetail/index?id='+id, + }) + }, + toNeedsDetail(e){ + let id = e.currentTarget.dataset.id; + wx.navigateTo({ + url: '/pages/demandHall/needsDetail/index?id='+id, + }) + }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { - app.editTabbar(); + app.editTabbar() + this.getPageData() + this.getCagetoryList() + }, + getCagetoryList(){ + app.http('get','ResourcesCagetory/listResourcesCagetory').then((res)=>{ + if(res.data.success){ + this.setData({ + cagetoryList: res.data.data + }) + } + }) + }, + cagetoryClick(e){ + let item = e.currentTarget.dataset.item + let i = e.currentTarget.dataset.i + this.setData({ + cagetoryActive: i + }) + }, + getPageData(){ + if(this.data.loading){ + app.http('post','Resources/listResources',{ + resourceType: this.data.active, + page: this.data.page, + pagesize:this.data.pagesize + }).then((res)=>{ + if(res.data.success){ + if(res.data.data.content.length < this.data.pagesize){ + this.setData({ + loading: false + }) + } + this.setData({ + list: this.data.list.concat(res.data.data.content) + }) + } + }) + } + + }, + getCompanyList(){ + app.http('post','Enterprise/listEnterprise',{}).then((res)=>{ + if(res.data.success){ + this.setData({ + companyList: res.data.data.content + }) + } + }) }, - /** - * 生命周期函数--监听页面初次渲染完成 + * 页面上拉触底事件的处理函数 */ - onReady: function () { - + onReachBottom: function () { + this.setData({ + page: this.data.page + 1 + }) + this.getPageData() }, - /** * 生命周期函数--监听页面显示 */ @@ -70,15 +150,10 @@ Page({ * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh: function () { - + }, - /** - * 页面上拉触底事件的处理函数 - */ - onReachBottom: function () { - - }, + /** * 用户点击右上角分享 diff --git a/pages/demandHall/index.wxml b/pages/demandHall/index.wxml index e6b4f49..e426385 100644 --- a/pages/demandHall/index.wxml +++ b/pages/demandHall/index.wxml @@ -16,14 +16,30 @@ 企业列表 - IT软件 · 企业网站 + 筛选 - + + + + {{item.title}} + + 网站建设 + + {{item.detailedDescription}} + ¥{{item.capital}} + + {{item.enterpriseName}} + + + 了解详情 + + + + + + + {{item.enterpriseName}} + + 网站建设 + IT软件 + APP开发 + + {{item.enterpriseTitle}} + + + + + + + + + - - + - - + + - IT软件 · 企业网站 + + 筛选 - + + + {{item.title}} + {{item.capital}} + + + 网站建设 + IT软件 + APP开发 + + {{item.detailedDescription}} + + {{item.resourceEndTime}}截止报名 + 了解详情 + + + @@ -98,29 +154,29 @@ 所有服务 - IT软件 + {{item.cagetoryName}} - + + + 商家身份(所有商家均实名认证) diff --git a/pages/demandHall/index.wxss b/pages/demandHall/index.wxss index 5c39ef7..0537784 100644 --- a/pages/demandHall/index.wxss +++ b/pages/demandHall/index.wxss @@ -1,4 +1,7 @@ /* pages/demandHall/index.wxss */ +image{ + border-radius: 8rpx; +} .dmandhall-page{ padding-bottom: 130rpx; min-height: 100vh; @@ -174,9 +177,9 @@ margin: 24rpx 0 20rpx; } .anli-item image{ - width: 222rpx; + width: 220rpx; height: 136rpx; - margin-right: 0rpx; + margin-right: 8rpx; } .comment{ font-size: 20rpx; @@ -220,18 +223,17 @@ position:fixed; top: 0; left: 0; + z-index: 9999; } .screen-dialog-box{ width: 602rpx; height: 100%; - padding-bottom: 160rpx; + /* padding-bottom: 160rpx; */ overflow-y: scroll; background-color: #fff; position: absolute; top: 0; right: 0rpx; - /* transform: translateX(800rpx); */ - /* transition: all 1000ms ease; */ animation: move 200ms ease; } /* .move{ @@ -275,6 +277,11 @@ .screen-item .item:nth-child(3n){ margin-right: 0; } +.screen-item .item-active{ + border: 2rpx solid #FF6E33; + color: #FE7D26; + background: #FDEFE6; +} .across-line{ width: 44rpx; height: 2rpx; @@ -297,9 +304,12 @@ color: #393939; } .submit-box{ - width: 100%; + width: 602rpx; height: 100rpx; box-shadow: 2rpx 0px 12rpx rgba(0, 0, 0, 0.16); + position: fixed; + bottom: 0; + right: 0; } .submit-box .btn{ width: 50%; diff --git a/pages/demandHall/needsContact/index.js b/pages/demandHall/needsContact/index.js new file mode 100644 index 0000000..bcd0de8 --- /dev/null +++ b/pages/demandHall/needsContact/index.js @@ -0,0 +1,119 @@ +// pages/demandHall/contact/index.js +const app = getApp(); +Page({ + /** + * 页面的初始数据 + */ + data: { + active: null, + needsDetail: {}, + needsList: [], + content: '', + + }, + needItemClick(e){ + let id = e.currentTarget.dataset.id + this.setData({ + active: e.currentTarget.dataset.id + }) + }, + inpChange(e){ + console.log(e) + this.setData({content: e.detail.value}) + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + // console.log(options) + let data = JSON.parse(decodeURIComponent(options.detail)); + this.setData({ + needsDetail: data + }) + console.log(this.data.needsDetail) + this.getList() + }, + getList(){ + app.http('post','Resources/listMyResourcesPublish',{ + resourceType: 2 + }).then((res)=>{ + if(res.data.success){ + res.data.data.content.length > 0 ? this.setData({active: res.data.data.content[0].id}) : this.setData({active: null}) + this.setData({ + needsList: res.data.data.content, + }) + } + }) + }, + submit(){ + if(this.data.content == '' && this.demandId == null){ + wx.showToast({ + title: '请填写您的申请内容!', + icon: 'none' + }) + return + } + let data = { + resourceId: this.data.active, + demandId: this.data.needsDetail.id, + content: this.data.content + } + + app.http('post','Communicate/create',data).then((res)=>{ + if(res.data.success){ + wx.showToast({ + title: '提交成功!', + duration: 2000 + }) + } + }) + }, + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/demandHall/needsContact/index.json b/pages/demandHall/needsContact/index.json new file mode 100644 index 0000000..7cb70cc --- /dev/null +++ b/pages/demandHall/needsContact/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "申请沟通" +} \ No newline at end of file diff --git a/pages/demandHall/needsContact/index.wxml b/pages/demandHall/needsContact/index.wxml new file mode 100644 index 0000000..cc1f4d1 --- /dev/null +++ b/pages/demandHall/needsContact/index.wxml @@ -0,0 +1,57 @@ + + + + + + + {{needsDetail.title}} + + + 场地租赁 + + 需求预算{{needsDetail.capital}} + + + + ! + 请明确您可提供的资源! + + + + + + 发送资源给企业(个人) + + + + + {{item.title}} + + 网站建设 + + {{item.enterprise.enterpriseName}} + + + + + + + + + 提交申请 + diff --git a/pages/demandHall/needsContact/index.wxss b/pages/demandHall/needsContact/index.wxss new file mode 100644 index 0000000..ae598a4 --- /dev/null +++ b/pages/demandHall/needsContact/index.wxss @@ -0,0 +1,175 @@ +/* pages/demandHall/contact/index.wxss */ +.contact-page{ + width: 100%; + min-height: 100vh; + padding: 40rpx; + background: #EFEFEF; +} +.company-card-box { + width: 100%; + height: 210rpx; + padding: 30rpx 12rpx; + background: #FFFFFF; + box-shadow: 0rpx 6rpx 12rpx rgba(0, 0, 0, 0.16); + border-radius: 12rpx; +} +.info{ + width: 70%; +} +.company-logo{ + width: 150rpx; + height: 150rpx; + margin-right: 20rpx; +} +.company-name{ + font-size: 36rpx; + line-height: 56rpx; + font-weight: 500; + color: #1D1D1D; +} +.slogan{ + font-size: 24rpx; + line-height: 34rpx; + color: #666; + margin: 4rpx 0 12rpx; +} +.tags-box{ + margin: 6rpx 0 10rpx; +} +.tag-item{ + width: 112rpx; + height: 36rpx; + display: inline-block; + line-height: 36rpx; + text-align: center; + font-size: 20rpx; + background: linear-gradient(314deg, #FF5100 0%, #FF8800 100%); + color: #fff; + border-radius: 8rpx; + margin-right: 8rpx; +} +.tips{ + margin: 32rpx 0; + font-size: 24rpx; + color: #1D1D1D; +} +.t-icon{ + width: 28rpx; + height: 28rpx; + border-radius: 50%; + border: 1px solid #1D1D1D; + text-align: center; + line-height: 25rpx; + color: #1D1D1D; + font-size: 24rpx; + font-weight: bold; + margin-right: 10rpx; +} +.needs-list{ + width: 100%; +} +.need-item{ + width: 100%; + padding: 20rpx 0; + background: #FFFFFF; + box-shadow: 0rpx 6rpx 12rpx rgba(0, 0, 0, 0.16); + border-radius: 12rpx; + margin-bottom: 32rpx; +} +.n-title{ + width: 100%; + padding: 18rpx 26rpx; + border-bottom: 2rpx solid #E2E2E2; + font-size: 24rpx; + color: #979797; + font-weight: 500; +} +.dot{ + width: 28rpx; + height: 28rpx; + border: 2rpx solid #979797; + border-radius: 50%; + margin-right: 6rpx; +} +.n-title-a .dot{ + position: relative; + border-color: #FF7E42; +} +.n-title-a .dot::before{ + content: ''; + display: inline-block; + width: 20rpx; + height: 20rpx; + border-radius: 50%; + border-color: #FF7E42; + background: #FF7E42; + position: absolute; + top: 2rpx; + left: 2rpx; +} +.n-title-a{ + color: #FF7E42; +} +.price{ + font-size: 28rpx; + color: #707070; + margin-top: 20rpx; +} +.n-title-box{ + /* padding: 0 26rpx; */ + font-size: 28rpx; + color: #1D1D1D; + margin: 16rpx 0 8rpx; +} +.colO{ + color: #FF5100; + font-size: 500; +} +.n-tags{ + /* padding: 0 26rpx; */ +} +.n-tag-item{ + width: 112rpx; + height: 36rpx; + line-height: 34rpx; + text-align: center; + border: 1rpx solid #FFAA00; + color: #FFAA00; + border-radius: 4rpx; + margin-right: 8rpx; + font-size: 24rpx; +} +.bgG{ + border: 1rpx solid #3A9EFA; + color: #3A9EFA; +} +.bgO{ + border: 1rpx solid #FC9367; + color: #FC9367; +} +.area-box{ + width: 100%; + height: 900rpx; + padding: 42rpx 24rpx; + background: #fff; + border-radius: 12rpx; +} +.area-box textarea{ + width: 100%; + height: 50%; +} +.submit-btn{ + width: 240rpx; + height: 88rpx; + line-height: 88rpx; + text-align: center; + background: linear-gradient(134deg, #FFA782 0%, #FF6D31 100%); + border-radius: 12rpx; + font-size: 32rpx; + color: #fff; + /* margin: 32rpx auto; */ + position: absolute; + bottom: 80rpx; + left: 50%; + margin-left: -120rpx; +} \ No newline at end of file diff --git a/pages/demandHall/needsDetail/index.js b/pages/demandHall/needsDetail/index.js index 2521cbc..f89a188 100644 --- a/pages/demandHall/needsDetail/index.js +++ b/pages/demandHall/needsDetail/index.js @@ -1,20 +1,45 @@ // pages/demandHall/needsDetail/index.js +const app = getApp(); Page({ /** * 页面的初始数据 */ data: { - isCompany: true + isCompany: true, + id: '', + detail: {}, }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { - + this.setData({ + id: options.id + }) + this.getDetail() + }, + toCompanyDetail(){ + wx.navigateTo({ + url: '/pages/demandHall/companyDetail/index?id=' + this.data.detail.enterprise.id, + }) + }, + getDetail(){ + app.http('get','Resources/resourceInfo',{id:this.data.id}).then((res)=>{ + if(res.data.success){ + this.setData({ + detail: res.data.data + }) + } + }) + }, + toNeedsContact(){ + let str = encodeURIComponent(JSON.stringify(this.data.detail)); + wx.navigateTo({ + url: '/pages/demandHall/needsContact/index?detail=' + str, + }) }, - /** * 生命周期函数--监听页面初次渲染完成 */ diff --git a/pages/demandHall/needsDetail/index.wxml b/pages/demandHall/needsDetail/index.wxml index 11a12e7..85b79fc 100644 --- a/pages/demandHall/needsDetail/index.wxml +++ b/pages/demandHall/needsDetail/index.wxml @@ -1,11 +1,11 @@ - 10天20小时60分60秒后截止报名 + 需求标题: - 我需要举办大型会议的场地 + {{detail.title}} 需求类型: @@ -13,24 +13,24 @@ 需求预算: - 10000元 + {{detail.capital}} 需求描述: - 本人于十一期间(10.1-10.4)需要武汉周边能够举办百人大型会议的场地。需要酒水食品供应与住宿供应。 + {{detail.detailedDescription}} - + 发布公司 - + - 楚牛科技 + {{detail.enterprise.enterpriseName}} 网站建设 IT软件 @@ -39,37 +39,51 @@ - + 发布人 - + - 禅易家人 - - + {{detail.user.name}} + + - 广州·能量大使 + {{detail.user.address}}·{{detail.user.level}} - + 补充内容 + + + + + + + + - + - 立即报名 + 立即报名 diff --git a/pages/demandHall/needsDetail/index.wxss b/pages/demandHall/needsDetail/index.wxss index aad7754..64cd949 100644 --- a/pages/demandHall/needsDetail/index.wxss +++ b/pages/demandHall/needsDetail/index.wxss @@ -1,7 +1,10 @@ /* pages/demandHall/needsDetail/index.wxss */ +.needsDetail-box{ + padding-bottom: 190rpx; +} .top-box{ width: 100%; - padding: 0 40rpx 40rpx; + padding: 40rpx 40rpx; background: linear-gradient(180deg, #FF5100 0%, #FFA782 100%); } .count-down-box{ @@ -33,7 +36,13 @@ } .content-box{ width: 100%; - padding: 40rpx; + padding: 40rpx 0; +} +.company-info-box{ + padding: 0 40rpx; +} +.add-content-box{ + padding-left: 40rpx; } .tag{ width: 216rpx; @@ -72,6 +81,7 @@ width: 150rpx; height: 150rpx; margin-right: 20rpx; + border-radius: 8rpx; } .name{ font-size: 32rpx; @@ -140,4 +150,49 @@ border-radius: 12rpx; font-size: 32rpx; color: #fff; +} + +.scroll-view_H{ + white-space: nowrap; + width: 100%; + margin-top: 28rpx; +} +.scroll-view_H view{ + display: inline-block; + width: 216rpx; + height: 216rpx; + margin-right: 10rpx; +} +.scroll-view_H view image{ + width: 100%; + height: 100%; + border-radius: 8rpx; +} + +.swiper-block { + height: 300rpx; + width: 100%; +} +.swiper-item { + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + overflow: unset; +} +.slide-image { + height: 250rpx; + width: 520rpx; + border-radius: 9rpx; + margin: 0rpx 30rpx; + z-index: 1; +} +.active { + /* transform: scale(1.14); + transition: all 0.2s ease-in 0s; + z-index: 20; */ +} + +.answer-box{ + padding: 0 40rpx; } \ No newline at end of file diff --git a/pages/demandHall/platform/index.js b/pages/demandHall/platform/index.js new file mode 100644 index 0000000..19ef40b --- /dev/null +++ b/pages/demandHall/platform/index.js @@ -0,0 +1,99 @@ +// pages/demandHall/platform/index.js +const util = require('../../../utils/util.js') +const app = getApp() +Page({ + + /** + * 页面的初始数据 + */ + data: { + projectId: '', + content: '', + imgPaths: [], + }, + contentChange(e){ + this.setData({ + content: e.detail.value + }) + }, + upImgs(){ + util.chooseImages2(img => { + let imgs = this.data.form.imgPaths + imgs.push(img) + this.setData({ + imgPaths: imgs + }) + }); + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + this.setData({ + projectCode: options.code + }) + }, + submit(){ + let data = { + projectCode: this.data.projectCode, + content: this.data.content, + imgPaths: this.data.imgPaths + } + app.http('post','Project/applyPlatform',data).then((res)=>{ + if(res.data.success){ + wx.showToast({ + title: '提交成功!', + duration: 2000 + }) + } + }) + }, + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/demandHall/platform/index.json b/pages/demandHall/platform/index.json new file mode 100644 index 0000000..27b4605 --- /dev/null +++ b/pages/demandHall/platform/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "平台介入" +} \ No newline at end of file diff --git a/pages/demandHall/platform/index.wxml b/pages/demandHall/platform/index.wxml new file mode 100644 index 0000000..a657df4 --- /dev/null +++ b/pages/demandHall/platform/index.wxml @@ -0,0 +1,10 @@ + + + + + + + + + 提交 + diff --git a/pages/demandHall/platform/index.wxss b/pages/demandHall/platform/index.wxss new file mode 100644 index 0000000..e568055 --- /dev/null +++ b/pages/demandHall/platform/index.wxss @@ -0,0 +1,36 @@ +/* pages/demandHall/platform/index.wxss */ +.page{ + width: 100%; + height: 100vh; + background: #EFEFEF; + padding: 40rpx; +} +.area-box{ + width: 100%; + background: #fff; + padding: 32rpx; + font-size: 32rpx; + border-radius: 12rpx; +} +.area-box textarea{ + width: 100%; + height: 300rpx; + color: #707070; + font-size: 28rpx; +} +.area-box image{ + width: 152rpx; + height: 152rpx; + margin-right: 12rpx; +} +.submit{ + width: 223rpx; + height: 76rpx; + background: linear-gradient(144deg, #FFA782 0%, #FF5100 100%); + border-radius: 38rpx; + font-size: 32rpx; + color: #fff; + line-height: 76rpx; + text-align: center; + margin: 90rpx auto; +} \ No newline at end of file diff --git a/pages/demandHall/resourcesContact/index.js b/pages/demandHall/resourcesContact/index.js new file mode 100644 index 0000000..092d722 --- /dev/null +++ b/pages/demandHall/resourcesContact/index.js @@ -0,0 +1,126 @@ +// pages/demandHall/contact/index.js +const app = getApp(); +Page({ + + /** + * 页面的初始数据 + */ + data: { + active: null, + resourcesDetail: {}, + resourcesList: [], + content: '', + + }, + needItemClick(e){ + let id = e.currentTarget.dataset.id + console.log(id) + this.setData({ + active: e.currentTarget.dataset.id + }) + }, + inpChange(e){ + console.log(e) + this.setData({content: e.detail.value}) + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + console.log(options) + let data = JSON.parse(decodeURIComponent(options.detail)); + this.setData({ + resourcesDetail: data + }) + console.log(this.data.resourcesDetail) + this.getList() + }, + getList(){ + app.http('post','Resources/listMyResourcesPublish',{ + resourceType: 1 + }).then((res)=>{ + if(res.data.success){ + res.data.data.content.length > 0 ? this.setData({active: res.data.data.content[0].id}) : this.setData({active: null}) + this.setData({ + resourcesList: res.data.data.content, + }) + } + }) + }, + submit(){ + if(this.data.content == '' && this.data.active == null){ + wx.showToast({ + title: '请填写您的申请内容!', + icon: 'none' + }) + return + } + let data = { + resourceId: this.data.resourcesDetail.id, + demandId: this.data.active, + content: this.data.content + } + + app.http('post','Communicate/create',data).then((res)=>{ + if(res.data.success){ + wx.showToast({ + title: '提交成功!', + duration: 2000 + }) + setTimeout(()=>{ + wx.navigateBack({ + delta: 1, + }) + },2000) + } + }) + }, + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/demandHall/resourcesContact/index.json b/pages/demandHall/resourcesContact/index.json new file mode 100644 index 0000000..7cb70cc --- /dev/null +++ b/pages/demandHall/resourcesContact/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "申请沟通" +} \ No newline at end of file diff --git a/pages/demandHall/resourcesContact/index.wxml b/pages/demandHall/resourcesContact/index.wxml new file mode 100644 index 0000000..d9c9574 --- /dev/null +++ b/pages/demandHall/resourcesContact/index.wxml @@ -0,0 +1,49 @@ + + + + + + {{resourcesDetail.title}} + + 网站建设 + + {{resourcesDetail.enterprise.enterpriseName}} + + + + ! + 请明确您的需求! + + + + + + 发送需求给企业(个人) + + + 我需要公司官网设计-网红餐饮网红餐饮 + 发布中 + + + 场地租赁 + + + + + + + + 提交申请 + diff --git a/pages/demandHall/resourcesContact/index.wxss b/pages/demandHall/resourcesContact/index.wxss new file mode 100644 index 0000000..350fb4a --- /dev/null +++ b/pages/demandHall/resourcesContact/index.wxss @@ -0,0 +1,171 @@ +/* pages/demandHall/contact/index.wxss */ +.contact-page{ + width: 100%; + min-height: 100vh; + padding: 40rpx; + background: #EFEFEF; +} +.company-card-box { + width: 100%; + height: 210rpx; + padding: 30rpx 12rpx; + background: #FFFFFF; + box-shadow: 0rpx 6rpx 12rpx rgba(0, 0, 0, 0.16); + border-radius: 12rpx; +} +.info{ + width: 70%; +} +.company-logo{ + width: 150rpx; + height: 150rpx; + margin-right: 20rpx; +} +.company-name{ + font-size: 36rpx; + line-height: 56rpx; + font-weight: 500; + color: #1D1D1D; +} +.slogan{ + font-size: 24rpx; + line-height: 34rpx; + color: #666; + margin: 4rpx 0 12rpx; +} +.tags-box{ + margin: 6rpx 0 10rpx; +} +.tag-item{ + width: 112rpx; + height: 36rpx; + display: inline-block; + line-height: 36rpx; + text-align: center; + font-size: 20rpx; + background: linear-gradient(314deg, #FF5100 0%, #FF8800 100%); + color: #fff; + border-radius: 8rpx; + margin-right: 8rpx; +} +.tips{ + margin: 32rpx 0; + font-size: 24rpx; + color: #1D1D1D; +} +.t-icon{ + width: 28rpx; + height: 28rpx; + border-radius: 50%; + border: 1px solid #1D1D1D; + text-align: center; + line-height: 25rpx; + color: #1D1D1D; + font-size: 24rpx; + font-weight: bold; + margin-right: 10rpx; +} +.needs-list{ + width: 100%; +} +.need-item{ + width: 100%; + padding: 20rpx 0; + background: #FFFFFF; + box-shadow: 0rpx 6rpx 12rpx rgba(0, 0, 0, 0.16); + border-radius: 12rpx; + margin-bottom: 32rpx; +} +.n-title{ + width: 100%; + padding: 18rpx 26rpx; + border-bottom: 2rpx solid #E2E2E2; + font-size: 24rpx; + color: #979797; + font-weight: 500; +} +.dot{ + width: 28rpx; + height: 28rpx; + border: 2rpx solid #979797; + border-radius: 50%; + margin-right: 6rpx; +} +.n-title-a .dot{ + position: relative; + border-color: #FF7E42; +} +.n-title-a .dot::before{ + content: ''; + display: inline-block; + width: 20rpx; + height: 20rpx; + border-radius: 50%; + border-color: #FF7E42; + background: #FF7E42; + position: absolute; + top: 2rpx; + left: 2rpx; +} +.n-title-a{ + color: #FF7E42; +} + +.n-title-box{ + padding: 0 26rpx; + font-size: 28rpx; + color: #1D1D1D; + margin: 16rpx 0 8rpx; +} +.colO{ + color: #FF5100; + font-size: 500; +} +.n-tags{ + padding: 0 26rpx; +} +.n-tag-item{ + width: 112rpx; + height: 36rpx; + line-height: 34rpx; + text-align: center; + border: 1rpx solid #FFAA00; + color: #FFAA00; + border-radius: 4rpx; + margin-right: 8rpx; + font-size: 24rpx; +} +.bgG{ + border: 1rpx solid #3A9EFA; + color: #3A9EFA; +} +.bgO{ + border: 1rpx solid #FC9367; + color: #FC9367; +} +.area-box{ + width: 100%; + height: 900rpx; + padding: 42rpx 24rpx; + background: #fff; + border-radius: 12rpx; +} +.area-box textarea{ + width: 100%; + height: 50%; +} +.submit-btn{ + width: 240rpx; + height: 88rpx; + line-height: 88rpx; + text-align: center; + background: linear-gradient(134deg, #FFA782 0%, #FF6D31 100%); + border-radius: 12rpx; + font-size: 32rpx; + color: #fff; + /* margin: 32rpx auto; */ + position: absolute; + bottom: 80rpx; + left: 50%; + margin-left: -120rpx; +} \ No newline at end of file diff --git a/pages/demandHall/resourcesDetail/index.js b/pages/demandHall/resourcesDetail/index.js index 2583f29..9cc51aa 100644 --- a/pages/demandHall/resourcesDetail/index.js +++ b/pages/demandHall/resourcesDetail/index.js @@ -1,20 +1,52 @@ // pages/demandHall/resourcesDetail/index.js +const app = getApp(); Page({ /** * 页面的初始数据 */ data: { - + id: '', + detail: {}, + swiperIndex: 0 }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { - + this.setData({ + id: options.id + }) + this.getDetail() + }, + toCompanyDetail(){ + wx.navigateTo({ + url: '/pages/demandHall/companyDetail/index?id=' + this.data.detail.enterprise.id, + }) + }, + getDetail(){ + app.http('get','Resources/resourceInfo',{id:this.data.id}).then((res)=>{ + if(res.data.success){ + this.setData({ + detail: res.data.data + }) + } + }) + }, + // 立即沟通 + toResourcesContact(e){ + let str = encodeURIComponent(JSON.stringify(this.data.detail)); + wx.navigateTo({ + url: '/pages/demandHall/resourcesContact/index?detail=' + str, + }) + }, + swiperChange(e) { + const that = this; + that.setData({ + swiperIndex: e.detail.current, + }) }, - /** * 生命周期函数--监听页面初次渲染完成 */ diff --git a/pages/demandHall/resourcesDetail/index.wxml b/pages/demandHall/resourcesDetail/index.wxml index 7dc2376..d53e334 100644 --- a/pages/demandHall/resourcesDetail/index.wxml +++ b/pages/demandHall/resourcesDetail/index.wxml @@ -1,10 +1,10 @@ - + - 教育类学校官网网站建设 + {{detail.title}} IT开发·网站建设 @@ -13,26 +13,26 @@ 标题 - 教育类学校官网网站建设 + {{detail.title}} 资金需求 - 100万~150万 + {{detail.capital}} 发布信息 - - + + - 楚牛科技 + {{detail.enterprise.enterpriseName}} 网站建设 IT软件 - 让全世界全世界牛起全世界牛起全世界牛起牛起来。 + {{detail.enterprise.enterpriseTitle}} @@ -40,14 +40,23 @@ 详细描述 - 湖北楚牛科技有限公司成立于2010年3月,核心团队成员均来自业内相关的顶尖公司。楚牛的愿景是让我们的技术和产品能与合作伙伴一起拥抱全球化!\n\n\n本项目仅为有网站建设需求的中小学教育机构、幼儿课外培训辅导机构提供服务,对网站业务人群存在要求。本公司也提供其他业务,请另咨询客服。 + {{detail.detailedDescription}} 补充内容 + + + + + + + + + - 立即沟通 + 立即沟通 diff --git a/pages/demandHall/resourcesDetail/index.wxss b/pages/demandHall/resourcesDetail/index.wxss index 2733756..4b51ae7 100644 --- a/pages/demandHall/resourcesDetail/index.wxss +++ b/pages/demandHall/resourcesDetail/index.wxss @@ -87,8 +87,12 @@ width: 150rpx; height: 150rpx; margin-right: 20rpx; + border-radius: 8rpx; +} +.info{ + width: 70%; } -.name{ +.company-name{ font-size: 32rpx; line-height: 44rpx; } @@ -124,4 +128,29 @@ font-size: 28rpx; color: #707070; line-height: 40rpx; +} + +.swiper-block { + height: 300rpx; + width: 100%; +} + +.swiper-item { + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + overflow: unset; +} +.slide-image { + height: 250rpx; + width: 520rpx; + border-radius: 9rpx; + margin: 0rpx 30rpx; + z-index: 1; +} +.active { + transform: scale(1.14); + transition: all 0.2s ease-in 0s; + z-index: 20; } \ No newline at end of file diff --git a/pages/index/index.js b/pages/index/index.js index 2999a77..e5eae1d 100644 --- a/pages/index/index.js +++ b/pages/index/index.js @@ -1,7 +1,8 @@ // index.js // 获取应用实例 const app = getApp() - +var QQMapWX = require('../../utils/qqmap-wx-jssdk.min.js'); +var qqmapsdk; Page({ data: { tabbar: {}, @@ -21,10 +22,19 @@ Page({ menuHeight: app.globalData.menuHeight, navHeight: app.globalData.navHeight, menuTop: app.globalData.menuTop, - active: 2 + active: 1, + demandList: [], + resourcesList: [], + province: '', + city: '', }, onLoad() { - app.editTabbar(); + app.editTabbar() + this.getCagetoryList() + qqmapsdk = new QQMapWX({ + key: 'UVEBZ-M3VRS-CO4OH-6F5QZ-X7FB7-SVFOX' //这里自己的key秘钥进行填充 + }); + this.getLocation() }, tabClick(e){ this.setData({ @@ -36,4 +46,78 @@ Page({ url: '/pages/demandHall/index', }) }, + getCagetoryList(){ + app.http('get','index').then((res)=>{ + if(res.data.success){ + this.setData({ + demandList: res.data.data.demandList, + resourcesList: res.data.data.resourcesDtos, + cagetoryList: res.data.data.cagetoryDtos + }) + } + }) + }, + toResourcesDetail(e){ + let id = e.currentTarget.dataset.id + wx.navigateTo({ + url: '/pages/demandHall/resourcesDetail/index?id='+id, + }) + }, + toCompanyDetail(e){ + let id = e.currentTarget.dataset.id + wx.navigateTo({ + url: '/pages/demandHall/companyDetail/index?id='+id, + }) + }, + toNeedDetail(e){ + let id = e.currentTarget.dataset.id + wx.navigateTo({ + url: '/pages/demandHall/needsDetail/index?id='+id, + }) + }, + getLocation(){ + let vm = this; + wx.getLocation({ + type: 'wgs84', + success: function (res) { + // console.log(JSON.stringify(res)) + var latitude = res.latitude + var longitude = res.longitude + var speed = res.speed + var accuracy = res.accuracy; + vm.getLocal(latitude, longitude) + }, + fail: function (res) { + console.log('fail' + JSON.stringify(res)) + } + }) + }, + // 获取当前地理位置 + getLocal: function (latitude, longitude) { + let vm = this; + qqmapsdk.reverseGeocoder({ + location: { + latitude: latitude, + longitude: longitude + }, + success: function (res) { + // console.log(JSON.stringify(res)); + let province = res.result.ad_info.province + let city = res.result.ad_info.city + vm.setData({ + province: province, + city: city, + latitude: latitude, + longitude: longitude + }) + // console.log(city) + }, + fail: function (res) { + console.log(res); + }, + complete: function (res) { + // console.log(res); + } + }); + }, }) diff --git a/pages/index/index.wxml b/pages/index/index.wxml index d0c52eb..457f330 100644 --- a/pages/index/index.wxml +++ b/pages/index/index.wxml @@ -6,7 +6,7 @@ - 定位 + {{city}} @@ -104,7 +104,31 @@ 金牌投资人 - + + + {{item.title}} + IT软件·网站建设 + {{item.detailedDescription}} + 了解详情 + + + + + {{item.enterpriseName}} + 成为奋斗者的家园 + + 网站建设 + 网站建设 + 网站建设 + + + + + 进入企业 + + + + - + + + {{item.title}} + {{item.detailedDescription}} + + 网站建设 + 网站建设 + 网站建设 + + {{item.capital}} + + + diff --git a/pages/index/index.wxss b/pages/index/index.wxss index a645204..34ecf8e 100644 --- a/pages/index/index.wxss +++ b/pages/index/index.wxss @@ -1,6 +1,6 @@ .home-page{ - padding-bottom: 130rpx; + padding-bottom: 190rpx; } .page-top-box{ width: 100%; @@ -62,8 +62,8 @@ font-size: 24rpx; } .menu-item{ - width: 98rpx; - margin-right:16rpx; + width: 20%; + /* margin-right:16rpx; */ margin-bottom: 34rpx; } .menu-item:nth-child(5n){ @@ -269,18 +269,23 @@ box-shadow: 0px 6rpx 12rpx rgba(190, 190, 190, 0.3); border-radius: 12rpx; padding: 28rpx 20rpx 18rpx; + margin-bottom: 32rpx; } .item-top{ padding-bottom: 24rpx; position: relative; } +.item-top .buy-btn{ + right: 0; +} .project-name{ width: 400rpx; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; - font-size: 28rpx; - line-height: 40rpx; + font-size: 32rpx; + font-weight: 500; + line-height: 58rpx; color: #1D1D1D; } .tags-box2{ @@ -303,11 +308,11 @@ font-size: 24rpx; line-height: 34rpx; color: #666666; + margin-top: 8rpx; } .company-box{ padding-top: 12rpx; position: relative; - border-top: 2rpx solid #ECECEC; } .company-box image{ diff --git a/pages/login/index.js b/pages/login/index.js new file mode 100644 index 0000000..0837d67 --- /dev/null +++ b/pages/login/index.js @@ -0,0 +1,172 @@ +// pages/login/index.js +const app = getApp() +Page({ + /** + * 页面的初始数据 + */ + data: { + login: false, + canIUseGetUserProfilefalse: false, + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + let userInfo = wx.getStorageSync('userInfo') + if(userInfo.phone && userInfo.phone != ''){ + this.setData({ + login: true + }) + } + if (wx.getUserProfile) { + this.setData({ + canIUseGetUserProfile: true + }) + } + wx.login({ + success: res => { + // 发送 res.code 到后台换取 openId, sessionKey, unionId + this.setData({ + code: res.code + }) + } + }) + }, + setUserInfo(){ + + }, + getUserProfile(e) { + // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认,开发者妥善保管用户快速填写的头像昵称,避免重复弹窗 + wx.getUserProfile({ + desc: '展示用户信息', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写 + success: (response) => { + wx.showLoading({ + title: '登陆中...', + }) + let data = { + code: this.data.code, + iv: response.iv, + encryptedData:response.encryptedData, + spread: 0, + login_type: 0 + } + app.http('POST','wxapp/auth',data).then( + result =>{ + if(result.data.success){ + wx.hideLoading() + wx.setStorageSync('token', 'Bearer '+ result.data.data.token) + wx.setStorageSync('userInfo', result.data.data.user) + wx.showToast({ + title: '授权成功!', + duration: 1500 + }) + if(!result.data.data.user.phone){ + this.setData({ + login: true + }) + } else{ + setTimeout(()=>{ + wx.navigateBack({ + delta: 1, + }) + },1500) + } + + } else{ + wx.showToast({ + title: result.data.msg, + icon : 'none' + }) + } + } + ) + } + }) + }, + getPhoneNumber(e) { + if(e.detail.errMsg == 'getPhoneNumber:ok'){ + app.http('post','wxapp/binding', + {encryptedData: e.detail.encryptedData, + iv: e.detail.iv + }).then((res)=>{ + if(res.data.success){ + app.getInfo(); + wx.showToast({ + title: res.data.msg, + duration: 1500 + }) + setTimeout(()=>{ + wx.navigateBack({ + delta: 1, + }) + },1500) + } else{ + wx.showToast({ + title: res.data.msg, + icon: 'none', + duration: 2000 + }) + setTimeout(()=>{ + wx.navigateBack({ + delta: 1, + }) + },2000) + } + }) + } + }, + back(){ + wx.navigateBack({ + delta: 1, + }) + }, + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/login/index.json b/pages/login/index.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/login/index.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/login/index.wxml b/pages/login/index.wxml new file mode 100644 index 0000000..38fe82a --- /dev/null +++ b/pages/login/index.wxml @@ -0,0 +1,17 @@ + + + + + + + + + + + diff --git a/pages/login/index.wxss b/pages/login/index.wxss new file mode 100644 index 0000000..30e9028 --- /dev/null +++ b/pages/login/index.wxss @@ -0,0 +1,46 @@ +/* pages/login/index.wxss */ +.authorization { + height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + box-sizing: border-box; + padding-top: 190rpx; +} + +.user-avatar { + width: 192rpx; + height: 192rpx; + border-radius: 50%; + overflow: hidden; +} +.user-name{ + margin: 40rpx 0; +} +.login-notice{ + font-size: 28rpx; + font-weight: 500; + line-height: 40rpx; + color: #000; + padding-bottom: 90rpx; +} + +.authorization .wx-btn { + width: 640rpx !important; + height: 86rpx!important; + background: linear-gradient(144deg, #FFA782 0%, #FF5100 100%) !important; + border-radius: 60rpx!important; + text-align: center!important; + line-height: 86rpx!important; + margin-bottom: 36rpx!important; + display: flex!important; + align-items: center!important; + justify-content: center!important; + color: #fff; + font-weight: 500 !important; +} +.authorization .btn{ + background: #fff !important; + border: 4rpx solid #FFA782; + color: #FFA782 !important; +} \ No newline at end of file diff --git a/pages/release/companyAuth/index.js b/pages/release/companyAuth/index.js index 80dead8..124100b 100644 --- a/pages/release/companyAuth/index.js +++ b/pages/release/companyAuth/index.js @@ -1,13 +1,30 @@ // pages/release/companyAuth/index.js +const util = require('../../../utils/util.js') +const app = getApp() Page({ - /** * 页面的初始数据 */ data: { - isLegal: 0, - form: { scale: '请选择'}, - scaleArr: [] + form: { + isLegalPerson: 0, //是否为企业法人 + authorizationPath: '', // 授权书图片 + enterpriseName: '', //企业名称 + creditCode: '', //信用代码 + enterpriseScale: '请选择', //企业规模 + businessLicense: '', //营业执照照片 + bankAccount: '', //银行账号 + bankName: '', // 开户银行 + bankBranch: '', // 开户网点 + legalPersonName: '', //法人姓名 + legalPhone: '', //法人手机号 + legalPersonIdcard: '', // 法人身份证 + idcardPicFront: '',// 法人身份证正面照 + idcardPicBehind: '',// 法人身份证背面照 + idcardPicHold: '',// 法人手持身份证 + + }, + scaleArr: ['0-25','25-99','99-200','200-500','500及以上'] }, /** @@ -16,12 +33,211 @@ Page({ onLoad: function (options) { }, - radioClick(e){ + checkBank(e){ console.log(e.detail.value) + app.http('get','EnterpriseAuthentication/getBankName',{bankAccount: e.detail.value}).then((res)=>{ + if(res.data.success){ + this.setData({ + ['form.bankName']: res.data.data + }) + } + }) + }, + inpChange(e){ + let type = e.currentTarget.dataset.type + let value = e.detail.value + switch (type){ + case 'enterpriseName': + this.setData({ + ['form.enterpriseName']: value + }) + break; + case 'creditCode': + this.setData({ + ['form.creditCode']: value + }) + break; + case 'bankAccount': + this.setData({ + ['form.bankAccount']: value + }) + break; + case 'bankName': + this.setData({ + ['form.bankName']: value + }) + break; + case 'bankBranch': + this.setData({ + ['form.bankBranch']: value + }) + break; + case 'name': + this.setData({ + ['form.legalPersonName']: value + }) + break; + case 'phone': + this.setData({ + ['form.legalPhone']: value + }) + break; + case 'idcard': + this.setData({ + ['form.legalPersonIdcard']: value + }) + break; + } + }, + upCard(e){ + let type = e.currentTarget.dataset.type; + util.chooseImages(img => { + if(type == 'f'){ + this.setData({ + ['form.idcardPicFront']: img + }) + } else if(type == 'b'){ + this.setData({ + ['form.idcardPicBehind']: img + }) + } else if(type == 'h'){ + this.setData({ + ['form.idcardPicHold']: img + }) + } else if(type == 'ap'){ + this.setData({ + ['form.authorizationPath']: img + }) + } else if(type == 'bl'){ + this.setData({ + ['form.businessLicense']: img + }) + } + }) + }, + bindPickerChange(e){ this.setData({ - isLegal: e.detail.value + ['form.enterpriseScale']: this.data.scaleArr[e.detail.value] }) }, + radioClick(e){ + this.setData({ + ['form.isLegalPerson']: e.detail.value + }) + }, + prevImg(e){ + // let url = e.currentTarget.dataset.url; + // wx.previewImage({ + // urls: [url], + // }) + }, + submit(){ + let form = this.data.form + if(form.isLegalPerson == 0 && form.authorizationPath == ''){ + wx.showToast({ + title: '请上传授权书!', + icon: 'none' + }) + return + } else if(form.enterpriseName == ''){ + wx.showToast({ + title: '请填写企业名称', + icon: 'none' + }) + return + } else if(form.creditCode == ''){ + wx.showToast({ + title: '请填写信用代码', + icon: 'none' + }) + return + } else if(form.enterpriseScale == '请选择'){ + wx.showToast({ + title: '请选择企业规模', + icon: 'none' + }) + return + } else if(form.businessLicense == ''){ + wx.showToast({ + title: '请上传营业执照', + icon: 'none' + }) + return + } else if(form.bankAccount == ''){ + wx.showToast({ + title: '请输入银行账号', + icon: 'none' + }) + return + } else if(form.bankName == ''){ + wx.showToast({ + title: '请输入银行名称', + icon: 'none' + }) + return + } else if(form.bankName == ''){ + wx.showToast({ + title: '请输入开户网点', + icon: 'none' + }) + return + } else if(form.legalPersonName == ''){ + wx.showToast({ + title: '请填写姓名', + icon: 'none' + }) + return + } else if(form.legalPhone == ''){ + wx.showToast({ + title: '请填写手机号', + icon: 'none' + }) + return + } else if(form.legalPersonIdcard == ''){ + wx.showToast({ + title: '请填写身份证号', + icon: 'none' + }) + return + } else if(form.idcardPicFront == ''){ + wx.showToast({ + title: '请上传身份证正面照', + icon: 'none' + }) + return + } else if(form.idcardPicBehind == ''){ + wx.showToast({ + title: '请上传身份证反面面照', + icon: 'none' + }) + return + } else if(form.idcardPicHold == ''){ + wx.showToast({ + title: '请上传手持身份证照', + icon: 'none' + }) + return + } else{ + app.http('post','EnterpriseAuthentication/createAuthenticInfoTwo',this.data.form).then((res)=>{ + if(res.data.success){ + wx.showModal({ + title: '提示!', + content: '提交成功!请等待审核', + success(res) { + wx.switchTab({ + url: '/pages/index/index', + }) + } + }) + } else{ + wx.showToast({ + title: res.data.msg, + icon: 'none' + }) + } + }) + } + }, /** * 生命周期函数--监听页面初次渲染完成 */ diff --git a/pages/release/companyAuth/index.wxml b/pages/release/companyAuth/index.wxml index 186ea7a..64066c3 100644 --- a/pages/release/companyAuth/index.wxml +++ b/pages/release/companyAuth/index.wxml @@ -5,18 +5,19 @@ 申请人是否为企业法人 - + 非法人申请需上传加盖公章的申请授权书 - - + + + @@ -32,13 +33,13 @@ 企业名称 - + 信用代码 - + @@ -50,15 +51,16 @@ 企业规模 - - {{form.scale}} + + {{form.enterpriseScale}} 营业执照 - + + @@ -68,21 +70,19 @@ 银行账号 - + 开户银行 - - {{form.scale}} - + 开户网点 - + @@ -92,38 +92,41 @@ 姓名 - + 手机号 - + 身份证号 - + 身份证 - + + - + + - + + - 保存并提交 + 保存并提交 diff --git a/pages/release/index.js b/pages/release/index.js index 63b5f94..3f296b3 100644 --- a/pages/release/index.js +++ b/pages/release/index.js @@ -1,32 +1,134 @@ // pages/release/index.js +const app = getApp(); + Page({ /** * 页面的初始数据 */ data: { - + userInfo: {}, + authStatus: 0, + authType: null, + completeState: null + }, + back(){ + wx.switchTab({ + url: '/pages/index/index', + }) + }, + toPersonlAuth(){ + if(this.data.authStatus == 0){ + wx.navigateTo({ + url: '/pages/release/personAuth/index', + }) + } else if(this.data.authStatus == 1){ + wx.showToast({ + title: '认证申请审核中,请等待!', + icon: 'none' + }) + } + }, + toCompanyAuth(){ + if(this.data.authStatus == 0){ + wx.navigateTo({ + url: '/pages/release/companyAuth/index', + }) + } else if(this.data.authStatus == 1){ + wx.showToast({ + title: '认证申请审核中,请等待!', + icon: 'none' + }) + } }, - /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { - + }, - - /** - * 生命周期函数--监听页面初次渲染完成 - */ - onReady: function () { - + isAuthentication(){ + app.http('get','user/isAuthentication').then((res)=>{ + console.log(res) + if(res.data.success){ + this.setData({ + authStatus: res.data.data.authenticationState, + authType: res.data.data.authorizationType, + completeState: res.data.data.completeState + }) + } + }) + }, + toResources(){ + let that = this; + if(this.data.authStatus == 2 && this.data.authType == 1 && this.data.completeState == true){ + wx.navigateTo({ + url: '/pages/user/editNeeds/index?type=1', + }) + } else if(this.data.authStatus == 2 && this.data.authType == 1 && this.data.completeState == false){ + wx.showModal({ + title: '提示!', + content: '您还未完善企业信息,点击确定去完善吧~', + success(res){ + if(res.confirm){ + wx.navigateTo({ + url: '/pages/release/perfectCompanyInfo/index?status=' + that.data.authStatus, + }) + } + + } + }) + } else if(this.data.authStatus == 3 && this.data.authType == 1 && this.data.completeState == false){ + wx.showModal({ + title: '提示!', + content: '您提交的企业信息未通过审核,点击确定去修改吧~', + success(res){ + wx.navigateTo({ + url: '/pages/release/perfectCompanyInfo/index?status=' + that.data.authStatus, + }) + } + }) + } + }, + toNeeds(){ + if(this.data.authStatus == 2 && (this.data.authType == 2 || this.data.authType == 1) && this.data.completeState == true){ + wx.navigateTo({ + url: '/pages/user/editNeeds/index?type=2', + }) + } else if((this.data.authStatus == 2 || this.data.authStatus == 3) && this.data.authType == 2 && this.data.completeState == false){ + wx.showModal({ + title: '提示!', + content: '您还未完善个人信息,点击确定去完善吧~', + success(res){ + wx.navigateTo({ + url: '/pages/release/perfectPersonInfo/index', + }) + } + }) + } else if((this.data.authStatus == 2 || this.data.authStatus == 3) && this.data.authType == 1 && this.data.completeState == false){ + wx.showModal({ + title: '提示!', + content: '您还未完善企业信息,点击确定去完善吧~', + success(res){ + wx.navigateTo({ + url: '/pages/release/perfectCompanyInfo/index', + }) + } + }) + } }, - /** * 生命周期函数--监听页面显示 */ onShow: function () { - + let userInfo = wx.getStorageSync('userInfo') + if(userInfo.phone && userInfo.phone != ''){ + this.isAuthentication(); + } else{ + wx.navigateTo({ + url: '/pages/login/index', + }) + } }, /** diff --git a/pages/release/index.wxml b/pages/release/index.wxml index 479a67d..c4886dc 100644 --- a/pages/release/index.wxml +++ b/pages/release/index.wxml @@ -1,8 +1,8 @@ - 企业认证 - 个人认证 + 企业认证 + 个人认证 @@ -16,13 +16,15 @@ - - + + 我能提供... + - - + + 我有需求... + - + diff --git a/pages/release/index.wxss b/pages/release/index.wxss index dd93da3..b621917 100644 --- a/pages/release/index.wxss +++ b/pages/release/index.wxss @@ -51,13 +51,34 @@ padding: 0 36rpx; margin-top: 28rpx; } +.btn{ + width: 320rpx; + height: 378rpx; + position: relative; +} .btn-box image{ width: 320rpx; height: 378rpx; + position: absolute; + left: 0; + top: 0; } .btn-box .default{ filter: grayscale(1); } +.btn .tip{ + color: #9C9C9C; + font-weight: 500; + font-size: 32rpx; + position: relative; + left: 0; + top: 70rpx; + text-align: center; + z-index: 3; +} +.btn .auth{ + color: #1D1D1D; +} .close { text-align: center; } diff --git a/pages/release/perfectCompanyInfo/index.js b/pages/release/perfectCompanyInfo/index.js index 8779562..e0d45e9 100644 --- a/pages/release/perfectCompanyInfo/index.js +++ b/pages/release/perfectCompanyInfo/index.js @@ -1,20 +1,160 @@ // pages/release/perfectCompanyInfo/index.js +const util = require('../../../utils/util.js') +const app = getApp() +import WxValidate from '../../../utils/WxValidate.js' Page({ /** * 页面的初始数据 */ data: { - + form: { + enterpriseType: 1, + enterpriseAddress: '', + latitude: '', + longitude: '', + enterpriseLogo: '', + enterpriseTitle: '', + enterpriseLabel: '', + enterpriseNet: '', + enterprisePhone: '', + aboutUs: '', + imgPaths:[], + } }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { - + this.initValidate()//验证规则函数 + }, + initValidate(){ + const rules = { + enterpriseAddress: { + required: true, + }, + enterpriseLogo: { + required: true, + }, + enterpriseTitle: { + required: true, + }, + businessNature: { + required: true, + }, + enterpriseNet: { + required: true, + }, + enterprisePhone:{ + required:true, + } + } + const messages = { + enterpriseAddress: { + required: '请选择或填写地址', + }, + enterpriseLogo: { + required: '请上传企业Logo', + }, + enterpriseTitle: { + required: '请填写企业slogan', + }, + businessNature: { + required: '请填写企业经营范围', + }, + enterpriseNet: { + required: '请填写企业网站', + }, + enterprisePhone:{ + required: '请填写客服电话', + } + } + this.WxValidate = new WxValidate(rules, messages) + }, + showMap(){ + let that = this; + wx.getLocation({ + type: 'gcj02', //返回可以用于wx.openLocation的经纬度 + success: function(res) { + wx.chooseLocation({ + latitude: res.latitude, + longitude: res.longitude, + scale: 28, + success: (result)=>{ + that.setData({ + ['form.enterpriseAddress']: result.address, + ['form.latitude']: result.latitude, + ['form.longitude']: result.longitude, + }) + } + }) + } + }) + }, + uploadImg(e){ + let type = e.currentTarget.dataset.type; + util.chooseImages(img => { + if(type == 'logo'){ + this.setData({ + ['form.enterpriseLogo']: img + }) + } + }); + }, + upImgs(){ + util.chooseImages2(img => { + let imgs = this.data.form.imgPaths + imgs.push(img) + this.setData({ + ['form.imgPaths']: imgs + }) + }); + }, + submit(e){ + let that = this; + console.log(e.detail.value) + wx.showModal({ + title: '提示!', + content: '是否确认提交?', + success(res){ + if(res.confirm){ + const params = e.detail.value + params.enterpriseType = 1 + params.latitude = that.data.form.latitude + params.longitude = that.data.form.longitude + params.enterpriseLogo = that.data.form.enterpriseLogo + params.imgPaths = that.data.form.imgPaths + if (!that.WxValidate.checkForm(params)) { + const error = that.WxValidate.errorList[0] + that.showModal(error) + return false + } + app.http('post','Enterprise/completeEnterprise',params).then((res)=>{ + if(res.data.success){ + wx.showToast({ + title: '提交成功', + duration: 2000 + }) + setTimeout(()=>{ + wx.navigateBack({ + delta: 1, + }) + },2000) + } + }) + } else{ + console.log('已取消') + } + } + }) + }, + showModal(error) { + wx.showModal({ + content: error.msg, + showCancel: false, + }) }, - /** * 生命周期函数--监听页面初次渲染完成 */ diff --git a/pages/release/perfectCompanyInfo/index.wxml b/pages/release/perfectCompanyInfo/index.wxml index eac4673..1f0d558 100644 --- a/pages/release/perfectCompanyInfo/index.wxml +++ b/pages/release/perfectCompanyInfo/index.wxml @@ -2,13 +2,15 @@ 企业简介 +

企业地址* - 去选择地址 + + - + @@ -16,7 +18,8 @@ 企业logo* - + + @@ -24,7 +27,23 @@ 企业slogan* - + + + + + + 企业经营范围* + + + + + + + + 企业网站* + + + @@ -32,7 +51,7 @@ 客服电话* - + @@ -40,7 +59,7 @@ 关于我们 - + @@ -48,9 +67,14 @@ 公司展示 - + + + + +
- 保存并提交 + + diff --git a/pages/release/perfectCompanyInfo/index.wxss b/pages/release/perfectCompanyInfo/index.wxss index cb839bb..123e29c 100644 --- a/pages/release/perfectCompanyInfo/index.wxss +++ b/pages/release/perfectCompanyInfo/index.wxss @@ -24,6 +24,15 @@ .form-item{ margin-top: 22rpx; } +.chose{ + padding: 0 !important; + margin: 0 !important; + width: auto !important; + background: #fff; + font-size: 26rpx; + color: #666; + font-weight: normal; +} .red{ color: #FF0000; } @@ -48,6 +57,7 @@ .upload-box image{ width: 120rpx; height: 120rpx; + margin-right: 20rpx; } .textarea-box{ width: 100%; @@ -63,13 +73,14 @@ line-height: 40rpx; } .submit-btn{ - width: 670rpx; - height: 76rpx; + width: 670rpx !important; + height: 76rpx !important; background: linear-gradient(144deg, #FFA782 0%, #FF5100 100%); border-radius: 38rpx; color: #fff; - font-size: 28rpx; - line-height: 76rpx; + font-size: 28rpx !important; + line-height: 76rpx !important; text-align: center; - margin:40rpx auto; + margin:40rpx auto !important; + padding: 0 !important; } \ No newline at end of file diff --git a/pages/release/perfectPersonInfo/index.js b/pages/release/perfectPersonInfo/index.js index 2cde96d..225d0ad 100644 --- a/pages/release/perfectPersonInfo/index.js +++ b/pages/release/perfectPersonInfo/index.js @@ -1,20 +1,142 @@ // pages/release/perfectPersonInfo/index.js +const util = require('../../../utils/util.js') +const app = getApp() +import WxValidate from '../../../utils/WxValidate.js' Page({ - /** * 页面的初始数据 */ data: { - + form: { + enterpriseType: 2, + enterpriseScale: '', + businessNature: '', + establishmentTime: '', + enterpriseAddress: '', + latitude: '', + longitude: '', + enterprisePhone: '', + imgPaths: [], + } + }, + showMap(){ + let that = this; + wx.getLocation({ + type: 'gcj02', //返回可以用于wx.openLocation的经纬度 + success: function(res) { + wx.chooseLocation({ + latitude: res.latitude, + longitude: res.longitude, + scale: 28, + success: (result)=>{ + console.log(result) + that.setData({ + ['form.enterpriseAddress']: result.address, + ['form.latitude']: result.latitude, + ['form.longitude']: result.longitude, + }) + } + }) + } + }) + }, + timeChange(e){ + this.setData({ + ['form.establishmentTime']: e.detail.value + }) }, - /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { - + this.initValidate()//验证规则函数 + }, + initValidate(){ + const rules = { + enterpriseScale: { + required: true, + }, + industryId: { + required: true, + }, + establishmentTime: { + required: true, + }, + enterpriseAddress: { + required: true, + }, + enterprisePhone:{ + required:true, + } + } + const messages = { + enterpriseAddress: { + required: '请选择或填写地址', + }, + enterpriseScale: { + required: '请填写团队规模', + }, + industryId: { + required: '请填写承接类型', + }, + establishmentTime: { + required: '请选择组建时间', + }, + enterprisePhone:{ + required: '请填写客服电话', + } + } + this.WxValidate = new WxValidate(rules, messages) + }, + upImgs(){ + util.chooseImages2(img => { + let imgs = this.data.form.imgPaths + imgs.push(img) + this.setData({ + ['form.imgPaths']: imgs + }) + }); + }, + submit(e){ + let that = this; + wx.showModal({ + title: '提示!', + content: '是否确认提交?', + success(res){ + if(res.confirm){ + const params = e.detail.value + params.enterpriseType = 2 + params.imgPaths = that.data.form.imgPaths + if (!that.WxValidate.checkForm(params)) { + const error = that.WxValidate.errorList[0] + that.showModal(error) + return false + } + app.http('post','Enterprise/completeEnterprise',params).then((res)=>{ + if(res.data.success){ + wx.showToast({ + title: '提交成功', + duration: 2000 + }) + setTimeout(()=>{ + wx.navigateBack({ + delta: 1, + }) + },2000) + } + }) + } else{ + console.log('已取消') + } + } + }) + }, + showModal(error) { + wx.showModal({ + content: error.msg, + showCancel: false, + }) }, - /** * 生命周期函数--监听页面初次渲染完成 */ diff --git a/pages/release/perfectPersonInfo/index.wxml b/pages/release/perfectPersonInfo/index.wxml index c64d6f6..6892b13 100644 --- a/pages/release/perfectPersonInfo/index.wxml +++ b/pages/release/perfectPersonInfo/index.wxml @@ -2,62 +2,68 @@ 个人(团队)简介 - - - 团队规模* - - - +
+ + + 团队规模* + + + + - - - 主要承接类型* - - - + + 主要承接类型* + + + + - - - 承接时间* - - - + + 组建时间* + + + {{form.establishmentTime || '请选择'}} + + + + - - - - 办公地址* - 去选择地址 - - - - - - - - 客服电话* - - - - - - - - 关于我们 + + + 办公地址* + 去选择地址 + + + + - - + + + 客服电话* + + + + - - - - 团队展示 + + + 关于我们 + + + + - - + + + 团队展示 + + + + + - + + - 保存并提交 diff --git a/pages/release/perfectPersonInfo/index.wxss b/pages/release/perfectPersonInfo/index.wxss index 644291d..529cc13 100644 --- a/pages/release/perfectPersonInfo/index.wxss +++ b/pages/release/perfectPersonInfo/index.wxss @@ -14,7 +14,7 @@ margin-top: 20rpx; } .introduction-item input{ - width: 100rpx; + /* width: 100rpx; */ text-align: right; } @@ -40,6 +40,10 @@ font-size: 28rpx; color: #666666; } +.picker{ + font-size: 28rpx; + color: #666666; +} .form-item{ margin-top: 22rpx; } @@ -67,6 +71,7 @@ .upload-box image{ width: 120rpx; height: 120rpx; + margin-right: 20rpx; } .textarea-box{ width: 100%; @@ -82,13 +87,14 @@ line-height: 40rpx; } .submit-btn{ - width: 670rpx; - height: 76rpx; + width: 670rpx !important; + height: 76rpx !important; background: linear-gradient(144deg, #FFA782 0%, #FF5100 100%); border-radius: 38rpx; color: #fff; - font-size: 28rpx; - line-height: 76rpx; + font-size: 28rpx !important; + line-height: 76rpx !important; text-align: center; - margin:40rpx auto; + margin:40rpx auto !important; + padding: 0 !important; } \ No newline at end of file diff --git a/pages/release/personAuth/index.js b/pages/release/personAuth/index.js index c20dbab..5f216d2 100644 --- a/pages/release/personAuth/index.js +++ b/pages/release/personAuth/index.js @@ -1,11 +1,20 @@ // pages/release/personAuth/index.js +const util = require('../../../utils/util.js') +const app = getApp() Page({ /** * 页面的初始数据 */ data: { - + form: { + legalPersonName: '', + legalPhone: '', + legalPersonIdcard: '', + idcardPicFront: '', + idcardPicBehind: '', + idcardPicHold: '' + } }, /** @@ -14,7 +23,100 @@ Page({ onLoad: function (options) { }, - + inpChange(e){ + let type = e.currentTarget.dataset.type + let value = e.detail.value + if(type == 'name'){ + this.setData({ + ['form.legalPersonName']: value + }) + } else if(type == 'phone'){ + this.setData({ + ['form.legalPhone']: value + }) + } else if(type == 'idcard'){ + this.setData({ + ['form.legalPersonIdcard']: value + }) + } + }, + upCard(e){ + let type = e.currentTarget.dataset.type; + util.chooseImages(img => { + if(type == 'f'){ + this.setData({ + ['form.idcardPicFront']: img + }) + } else if(type == 'b'){ + this.setData({ + ['form.idcardPicBehind']: img + }) + } else{ + this.setData({ + ['form.idcardPicHold']: img + }) + } + }); + }, + submit(){ + let form = this.data.form; + if(form.legalPersonName == ''){ + wx.showToast({ + title: '请填写姓名', + icon: 'none' + }) + return + } else if(form.legalPhone == ''){ + wx.showToast({ + title: '请填写手机号', + icon: 'none' + }) + return + } else if(form.legalPersonIdcard == ''){ + wx.showToast({ + title: '请填写身份证号', + icon: 'none' + }) + return + } else if(form.idcardPicFront == ''){ + wx.showToast({ + title: '请上传身份证正面照', + icon: 'none' + }) + return + } else if(form.idcardPicBehind == ''){ + wx.showToast({ + title: '请上传身份证反面面照', + icon: 'none' + }) + return + } else if(form.idcardPicHold == ''){ + wx.showToast({ + title: '请上传手持身份证照', + icon: 'none' + }) + return + } else{ + app.http('post','EnterpriseAuthentication/createAuthenticInfoOne',this.data.form).then((res)=>{ + if(res.data.success){ + wx.showModal({ + title: '提示!', + content: '提交成功!请等待审核', + success(res) { + wx.switchTab({ + url: '/pages/index/index', + }) + } + }) + } else{ + wx.showToast({ + title: res.data.msg, + icon: 'none' + }) + } + }) + } + }, /** * 生命周期函数--监听页面初次渲染完成 */ diff --git a/pages/release/personAuth/index.wxml b/pages/release/personAuth/index.wxml index 9bf9cdb..3db1f07 100644 --- a/pages/release/personAuth/index.wxml +++ b/pages/release/personAuth/index.wxml @@ -4,38 +4,41 @@ 姓名 - + 手机号 - + 身份证号 - + 身份证 - + + - + + - + + - 保存并提交 + 保存并提交 diff --git a/pages/user/agreement/index.js b/pages/user/agreement/index.js index 5c6d96a..620629d 100644 --- a/pages/user/agreement/index.js +++ b/pages/user/agreement/index.js @@ -39,13 +39,11 @@ Page({ }) } }).then(()=>{ - console.log(pages.length) - console.log(pages[0].route) if(pages[pages.length - 2]){ if(this.data.userInfo.isRecharge && pages[pages.length - 2].route !== 'pages/user/index'){ setTimeout(()=>{ wx.reLaunch({ - url: '/pages/user/index', + url: '/pages/user/mine/index', }) },3000) } @@ -54,7 +52,7 @@ Page({ if(this.data.userInfo.isRecharge == 1){ setTimeout(()=>{ wx.reLaunch({ - url: '/pages/user/index', + url: '/pages/user/mine/index', }) },3000) } @@ -63,7 +61,7 @@ Page({ if(this.data.userInfo.isRecharge){ setTimeout(()=>{ wx.reLaunch({ - url: '/pages/user/index', + url: '/pages/user/mine/index', }) },2000) } diff --git a/pages/user/agreement/index.wxml b/pages/user/agreement/index.wxml index a0d766c..f5a7ebe 100644 --- a/pages/user/agreement/index.wxml +++ b/pages/user/agreement/index.wxml @@ -1,21 +1,22 @@ - - - + + + + + + + + + + + + + + + 请使用1.4.4及以上版本基础库 + + - - - - - - - - - - 请使用1.4.4及以上版本基础库 - - - diff --git a/pages/user/editNeeds/index.js b/pages/user/editNeeds/index.js new file mode 100644 index 0000000..ff0cf9a --- /dev/null +++ b/pages/user/editNeeds/index.js @@ -0,0 +1,220 @@ +// pages/user/editNeeds/index.js +const util = require('../../../utils/util.js') +const app = getApp() +import WxValidate from '../../../utils/WxValidate.js' +Page({ + /** + * 页面的初始数据 + */ + data: { + form: { + resourceType: 0, + title: '', + detailedDescription: '', + resourceImgs: [], + capital:'', + resourceStartTime:'', + resourceEndTime: '', + }, + typeArr:['供应' , '需求'], + active: 1 + }, + tabClick(e){ + let i = e.currentTarget.dataset.i; + if(i == 2){ + this.setData({ + ['form.capital']: '价格可议' + }) + } + this.setData({ + active: e.currentTarget.dataset.i + }) + }, + startTimeChange(e){ + this.setData({ + ['form.resourceStartTime']: e.detail.value + }) + }, + endTimeChange(e){ + this.setData({ + ['form.resourceEndTime']: e.detail.value + }) + }, + bindPickerChange(e){ + this.setData({ + ['form.resourceType']: this.data.typeArr[e.detail.value] + }) + }, + upImgs(){ + util.chooseImages2(img => { + let imgs = this.data.form.imgPaths + imgs.push(img) + this.setData({ + ['form.resourceImgs']: imgs + }) + }); + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + console.log(options) + if(options.id){ + this.getDetail() + } + if(options.type){ + this.setData({ + ['form.resourceType']: Number(options.type) - 1 + }) + } + this.initValidate()//验证规则函数 + }, + // 重新发布,获取提交数据 + getDetail(){ + + }, + initValidate(){ + const rules = { + title: { + required: true, + }, + resourceCagetoryId: { + required: true, + }, + detailedDescription: { + required: true, + }, + resourceStartTime:{ + required:true, + }, + resourceEndTime:{ + required:true, + } + } + const messages = { + title: { + required: '请填写标题', + }, + resourceCagetoryId: { + required: '请填写需求类型', + }, + detailedDescription: { + required: '请填写内容', + }, + resourceEndTime:{ + required: '请设置展示开始时间', + }, + resourceEndTime:{ + required: '请设置展示结束时间', + } + } + this.WxValidate = new WxValidate(rules, messages) + }, + upImgs(){ + util.chooseImages2(img => { + let imgs = this.data.form.resourceImgs + imgs.push(img) + this.setData({ + ['form.resourceImgs']: imgs + }) + }); + }, + submit(e){ + let that = this + let type = e.currentTarget.dataset.type + wx.showModal({ + title: '提示!', + content: '是否确认提交?', + success(res){ + if(res.confirm){ + const params = e.detail.value + params.resourceType = that.data.form.resourceType + 1 + params.resourceImgs = that.data.form.resourceImgs + params.capital = that.data.form.capital + params.resourceAuditState = type + if (!that.WxValidate.checkForm(params)) { + const error = that.WxValidate.errorList[0] + that.showModal(error) + return false + } + app.http('post','Resources/create',params).then((res)=>{ + if(res.data.success){ + wx.showToast({ + title: '提交成功', + duration: 2000 + }) + setTimeout(()=>{ + wx.navigateBack({ + delta: 1, + }) + },2000) + } else{ + wx.showToast({ + title: '请求失败', + duration: 2000, + icon: 'none' + }) + } + }) + } else{ + console.log('已取消') + } + } + }) + }, + showModal(error) { + wx.showModal({ + content: error.msg, + showCancel: false, + }) + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/user/editNeeds/index.json b/pages/user/editNeeds/index.json new file mode 100644 index 0000000..cea84f9 --- /dev/null +++ b/pages/user/editNeeds/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "供应/需求编辑" +} \ No newline at end of file diff --git a/pages/user/editNeeds/index.wxml b/pages/user/editNeeds/index.wxml new file mode 100644 index 0000000..3e8f55a --- /dev/null +++ b/pages/user/editNeeds/index.wxml @@ -0,0 +1,77 @@ + + + +
+ + 我是供应/需求 + + + {{typeArr[form.resourceType]}} + + + + + 供应/需求标题* + + + + + + 供应/需求类型* + + + + + 供应/需求内容* + 看看别人怎么写> + + + + + + + 补充内容/添加图片 + + + + + + + + 供应/需求预算* + + 明确预算 + 价格可议 + + + + + + + + + + 展示时间 + + + + + {{form.resourceStartTime || '请选择'}} + + + + + + + {{form.resourceEndTime || '请选择'}} + + + + + + + +
+
+ +
diff --git a/pages/user/editNeeds/index.wxss b/pages/user/editNeeds/index.wxss new file mode 100644 index 0000000..59329fb --- /dev/null +++ b/pages/user/editNeeds/index.wxss @@ -0,0 +1,105 @@ +/* pages/user/editNeeds/index.wxss */ +.form-box{ + width: 100%; + padding: 32rpx 38rpx; + font-size: 28rpx; + color:#666666; +} +.form-item{ + margin-bottom: 60rpx; +} +.pick-box{ + color: #666; +} +.red{ + color: #FF0000; +} +.colO{ + color: #FF6D31; + font-size: 24rpx; +} +.inp-box{ + width: 100%; + padding: 10rpx 22rpx; + background: #eee; + color: #666; + margin-top: 36rpx; +} +.inp-box input{ + width: 90%; + height: 100%; +} +.area-box{ + width: 100%; + height: 290rpx; + padding: 24rpx 22rpx; + background: #eee; + color: #666; + margin-top: 36rpx; +} +.area-box textarea{ + width: 100%; + height: 100%; +} +.upload-box{ + width: 100%; + height: 140rpx; + margin-top: 26rpx; +} +.upload-box image{ + width: 140rpx; + height: 140rpx; + margin-right: 12rpx; +} + +.tab-item{ + width: 122rpx; + height: 40rpx; + text-align: center; + line-height: 40rpx; + border: 1px solid #707070; + border-radius: 8rpx; + color: #666; + font-size: 22rpx; + margin-left: 20rpx; +} +.tab-a{ + background: linear-gradient(341deg, #FF5100 0%, #FFA782 100%); + color: #fff; + border: none; +} +.time-box{ + margin-top: 24rpx; +} +.timepick-box{ + width: 308rpx; + height: 60rpx; + background: #eee; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 20rpx; +} +.timepick-box picker{ + width: 100%; +} +.timepick-box image{ + width: 14rpx; + height: 24rpx; + transform: rotate(90deg); +} +.m14{ + margin: 0 14rpx; +} +.submit-btn{ + width: 670rpx !important; + height: 76rpx !important; + background: linear-gradient(144deg, #FFA782 0%, #FF5100 100%); + border-radius: 38rpx; + color: #fff; + font-size: 28rpx !important; + line-height: 76rpx !important; + text-align: center; + margin:40rpx auto 20rpx !important; + padding: 0 !important; +} \ No newline at end of file diff --git a/pages/user/index.js b/pages/user/index.js index 17e71c7..add65a8 100644 --- a/pages/user/index.js +++ b/pages/user/index.js @@ -7,6 +7,7 @@ Page({ */ data: { tabbar: {}, + userInfo: {}, CustomBar: app.globalData.CustomBar, menuHeight: app.globalData.menuHeight, navHeight: app.globalData.navHeight, @@ -19,7 +20,52 @@ Page({ onLoad: function (options) { app.editTabbar(); }, - + getUser(){ + let userInfo = wx.getStorageSync('userInfo'); + this.setData({ + userInfo + }) + console.log(this.data.userInfo) + }, + // 跳转首席体验官 + toMine(){ + if(this.data.isRecharge){ + wx.navigateTo({ + url: '/pages/user/mine/index' + }) + } else{ + wx.navigateTo({ + url: '/pages/user/agreement/index' + }) + } + + }, + //跳转资源订单 + toResourcesOrder(){ + wx.navigateTo({ + url: '/pages/user/resourcesOrder/index' + }) + }, + //跳转需求订单 + toNeedsOrder(){ + wx.navigateTo({ + url: '/pages/user/needsOrder/index' + }) + }, + //跳转需求管理 + toNeedsManage(e){ + let type = e.currentTarget.dataset.type + wx.navigateTo({ + url: '/pages/user/needsManage/index?type=' + type, + }) + }, + //跳转资源管理 + toResourcesManage(e){ + let type = e.currentTarget.dataset.type + wx.navigateTo({ + url: '/pages/user/resourcesManage/index?type=' + type, + }) + }, /** * 生命周期函数--监听页面初次渲染完成 */ @@ -31,7 +77,7 @@ Page({ * 生命周期函数--监听页面显示 */ onShow: function () { - + app.getInfo(); }, /** diff --git a/pages/user/index.wxml b/pages/user/index.wxml index defb220..a984e82 100644 --- a/pages/user/index.wxml +++ b/pages/user/index.wxml @@ -2,8 +2,8 @@ 禅意云生态 - - + + 企业中心 @@ -11,30 +11,32 @@ - + - 刘海柱 + + {{userInfo.nickname || '微信用户'}} - - + {{userInfo.levelName || '普通会员'}} + + - - 20 + + 0 资源订单 - 203 + 0 我的审核 - - 2 + + 0 需求订单 - + @@ -44,30 +46,30 @@ 需求管理 - + - + 发布中 - + 审核中 - + 草稿箱 - + 已结束 - + 发布需求 @@ -78,19 +80,19 @@ 资源管理 - + 发布中 - + 审核中 - + 草稿箱 - + 已结束 diff --git a/pages/user/index.wxss b/pages/user/index.wxss index 7b7de75..7f4d046 100644 --- a/pages/user/index.wxss +++ b/pages/user/index.wxss @@ -58,6 +58,16 @@ font-size: 36rpx; line-height: 50rpx; } +.level{ + padding: 2rpx 20rpx; + font-size: 24rpx; + background: #FEC313; + text-align: center; + border-radius: 25px; +} +.img-tags { + margin-top: 14rpx; +} .userInfo-r image{ width: 132rpx; height: 48rpx; diff --git a/pages/user/needsManage/index.js b/pages/user/needsManage/index.js new file mode 100644 index 0000000..52f053b --- /dev/null +++ b/pages/user/needsManage/index.js @@ -0,0 +1,145 @@ +// pages/user/NeedsManage/index.js +const app = getApp(); +Page({ + + /** + * 页面的初始数据 + */ + data: { + tabActive: 1, + list: [], + resourceType: 2, + resourceState: null, + resourceAuditState: null, + }, + tabClick(e){ + let i = e.currentTarget.dataset.i + this.setParams(i) + }, + setParams(i){ + if(i == 1){ + this.setData({ + tabActive: i, + resourceState: 1, + resourceAuditState: [2], + }) + } else if(i == 2){ + this.setData({ + tabActive: i, + resourceState: 0, + resourceAuditState: [1], + }) + } else if(i == 3){ + this.setData({ + tabActive: i, + resourceState: 0, + resourceAuditState: [0,3], + }) + } else if(i == 4){ + this.setData({ + tabActive: i, + resourceState: 2, + resourceAuditState: [], + }) + } + this.getList() + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + this.setData({ + tabActive: options.type + }) + this.setParams(options.type) + }, + toRelease(){ + wx.navigateTo({ + url: '/pages/release/index', + }) + }, + getList(){ + app.http('post','Resources/listMyResources',{ + resourceType: this.data.resourceType, + resourceState: this.data.resourceState, + resourceAuditState : this.data.resourceAuditState + }).then((res)=>{ + if(res.data.success){ + this.setData({ + list: res.data.data.content + }) + } + }) + }, + // 下架 + xiajiaClick(e){ + let id = e.currentTarget.dataset.id; + console.log(id) + }, + // 撤回 + withdrawClick(e){ + let id = e.currentTarget.dataset.id; + console.log(id) + }, + // 编辑 + editClick(e){ + let id = e.currentTarget.dataset.id; + console.log(id) + wx.navigateTo({ + url: '/pages/user/editNeeds/index?id=' + id, + }) + }, + // 删除 + delClick(e){ + let id = e.currentTarget.dataset.id; + console.log(id) + }, + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/user/needsManage/index.json b/pages/user/needsManage/index.json new file mode 100644 index 0000000..2ef25bc --- /dev/null +++ b/pages/user/needsManage/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "需求管理" +} \ No newline at end of file diff --git a/pages/user/needsManage/index.wxml b/pages/user/needsManage/index.wxml new file mode 100644 index 0000000..7896395 --- /dev/null +++ b/pages/user/needsManage/index.wxml @@ -0,0 +1,74 @@ + + + + 发布中 + 审核中 + 草稿箱 + 已结束 + + + + + 暂无需求 + 去发布吧 + + + + + {{item.title}} + + 公司起名 + LOGO + + + + 发布中 + 审核中 + 编辑未完成 + 项目已圆满结束 + 展示至{{item.resourceEndTime}} + + + 需求预算{{item.capital}} + {{item.detailedDescription}} + + {{item.resourceStartTime}}申请 + + 下架需求 + 撤回审核 + 编辑发布 + 删除需求 + + + + + + \ No newline at end of file diff --git a/pages/user/needsManage/index.wxss b/pages/user/needsManage/index.wxss new file mode 100644 index 0000000..bd42230 --- /dev/null +++ b/pages/user/needsManage/index.wxss @@ -0,0 +1,116 @@ +/* pages/user/NeedsManage/index.wxss */ +.manage-page{ + width: 100%; + min-height: 100vh; + background: #EEEEEE; +} +.tabs-box{ + width: 100%; + padding: 18rpx 58rpx; + background: #fff; +} +.tab{ + text-align: center; + font-size: 28rpx; + color: #707070; + position: relative; +} +.tab::after{ + display: block; + content: ''; + width: 100%; + height: 8rpx; + border-radius: 8rpx; + background: #FF6D31; + position: absolute; + bottom: -22rpx; + left: 50%; + margin-left: -41rpx; + opacity: 0; + transform: scaleX(0); + transition: all .2s cubic-bezier(.18,.89,.17,.88),opacity .15s ease; +} +.tab-a::after{ + opacity: 1; + transform: scaleX(1); +} +.list{ + width: 100%; + padding: 32rpx 40rpx; +} +.list-item{ + width: 100%; + padding: 20rpx 20rpx 32rpx; + background: #fff; + border-radius: 12rpx; + margin-bottom: 20rpx; +} + +.n-title{ + font-size: 28rpx; + color: #1D1D1D; + font-weight: 500; + margin-bottom: 18rpx; +} +.tag-item{ + width: 114rpx; + height: 36rpx; + line-height: 34rpx; + text-align: center; + color: #FC9367; + border: 1rpx solid #FC9367; + background: #fff; + border-radius: 4rpx; + font-size: 24rpx; + margin-right: 8rpx; +} +.colG{ + color: #3A9EFA; + border-color: #3A9EFA; +} +.top-r{ + color: #FF5100; + font-size: 20rpx; + font-weight: 600; + line-height: 40rpx; +} +.status{ + font-size: 30rpx; +} +.fz28{ + color:#707070; + line-height: 40rpx; + margin: 18rpx 0 10rpx; +} +.colR{ + color: #FF5100; +} +.desc{ + font-size: 24rpx; + line-height: 34rpx; + color: #333; +} +.time{ + font-size: 24rpx; + color: #707070; +} +.btn-box{ + font-size: 30rpx; + font-weight: 500; + line-height: 40px; + color: #FF5100; +} +.btn{ + font-size: 28rpx; + width: 150rpx; + height: 56rpx; + line-height: 56rpx; + text-align: center; + background: linear-gradient(134deg, #FFA782 0%, #FF6D31 100%); + border-radius: 12rpx; + color: #fff; + margin-left: 16rpx; +} +.default{ + background: linear-gradient(134deg, #BFBFBF 0%, #BFBFBF 100%); +} \ No newline at end of file diff --git a/pages/user/needsOrder/index.js b/pages/user/needsOrder/index.js new file mode 100644 index 0000000..d8b83da --- /dev/null +++ b/pages/user/needsOrder/index.js @@ -0,0 +1,240 @@ +// pages/user/needsOrder/index.js +const app = getApp() +Page({ + + /** + * 页面的初始数据 + */ + data: { + tabActive: 1, + list: [] + }, + toDemandHall(){ + wx.switchTab({ + url: '/pages/demandHall/index', + }) + }, + tabClick(e){ + let i = e.currentTarget.dataset.i + this.setData({ + tabActive: i + }) + if(i == 1){ + this.getCommunicates() + } else{ + this.getProjectList() + } + }, + // 获取 沟通中 + getCommunicates(){ + app.http('get','Communicate/demandCommunicates').then((res)=>{ + if(res.data.success){ + if(res.data.data.length > 0){ + res.data.data.map((item)=>{ + item.open = false + }) + res.data.data[0].open = true + } + console.log(res.data.data) + this.setData({ + list: res.data.data + }) + } + }) + }, + //点击展开 + openClick(e){ + let idx = e.currentTarget.dataset.idx + console.log(idx) + let list = this.data.list + list[idx].open = !list[idx].open + this.setData({ + list: list + }) + }, + //获取进行中、已结束列表 + getProjectList(){ + app.http('get','Project/listProject',{projectState: this.data.tabActive -1, projectType: 2}).then((res)=>{ + if(res.data.success){ + res.data.data.map((item)=>{ + item.stageResultsDtoList.map((stage)=>{ + if(stage.state == 1){ + item.showBtn = true + } + }) + }) + this.setData({ + list: res.data.data + }) + } + }) + }, + //同意开启下一阶段 + agreenOpen(e){ + let item = e.currentTarget.dataset.item + console.log(item) + const stage = item.stageResultsDtoList.filter((item)=>{ + return item.state == 1 + }) + wx.showModal({ + title: '提示!', + content: '是否同意开启下阶段?', + success(res){ + if(res.confirm){ + app.http('get','Project/startNextStage',{stageResultId: stage[0].id}).then((res)=>{ + if(res.data.success){ + wx.showToast({ + title: '操作成功!', + duration: 2000 + }) + this.getProjectList() + } + }) + } + } + }) + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + this.getCommunicates() + }, + // 平台介入 + toPlatform(e){ + let code = e.currentTarget.dataset.item.projectCode + wx.navigateTo({ + url: '/pages/demandHall/platform/index?code=' + code, + }) + }, + // 取消沟通 + cancelCommunicate(e){ + let info = e.currentTarget.dataset.info + console.log(info) + let that = this; + wx.showModal({ + title: '提示!', + content:'是否取消沟通?', + success(res){ + if(res.confirm){ + app.http('get','Communicate/cancelCommunicates',{communicateId: info.communicateId}).then((res)=>{ + if(res.data.success){ + wx.showToast({ + title: '操作成功!', + duration: 1500 + }) + setTimeout(()=>{ + that.getCommunicates() + },1500) + } + }) + } + } + }) + }, + //查看立项书 + toCreateProject(e){ + let item = e.currentTarget.dataset.item + wx.navigateTo({ + url: '/pages/demandHall/createProject/index?state=' + item.comminuteState+ '&id=' + item.communicateId, + }) + }, + confirm(e){ + let item = e.currentTarget.dataset.item + let communicateId = e.currentTarget.dataset.id + let that = this; + wx.showModal({ + title: '提示!', + content:'是否确认立项?', + success(res){ + if(res.confirm){ + app.http('post','Communicate/aggreProject',{ + communicateId: communicateId, + partnerInfos: item.info + }).then((res)=>{ + if(res.data.success){ + wx.showToast({ + title: '操作成功!', + duration: 2000 + }) + that.getCommunicates() + } + }) + } + } + }) + }, + cancelProject(e){ + let item = e.currentTarget.dataset.item + let communicateId = e.currentTarget.dataset.id + let that = this; + wx.showModal({ + title: '提示!', + content:'是否确认取消立项?', + success(res){ + if(res.confirm){ + app.http('post','Communicate/cancelProject',{ + communicateId: communicateId, + partnerInfos: item.partnerInfos + }).then((res)=>{ + if(res.data.success){ + wx.showToast({ + title: '操作成功!', + duration: 2000 + }) + that.getCommunicates() + } + }) + } + } + }) + }, + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/user/needsOrder/index.json b/pages/user/needsOrder/index.json new file mode 100644 index 0000000..72dd29d --- /dev/null +++ b/pages/user/needsOrder/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "需求订单" +} \ No newline at end of file diff --git a/pages/user/needsOrder/index.wxml b/pages/user/needsOrder/index.wxml new file mode 100644 index 0000000..adb3671 --- /dev/null +++ b/pages/user/needsOrder/index.wxml @@ -0,0 +1,108 @@ + + + + 沟通中 + 进行中 + 已结束 + + + + + 暂无订单 + 去需求广场 + + + + + {{item.resourceInfo.name}} + + + 需求预算 {{item.resourceInfo.budget}} + {{item.resourceInfo.content}} + + + + {{!item.open ? '展开' : '收起'}} + + + + + + + + + + 合作方: + {{info.name}} + + 已申请 + 等待立项 + 项目成立中 + 已取消立项 + + 定金尾款 + + + + {{info.createTime}}项目开启 + + 取消沟通 + 查看立项书 + 确认立项 + 取消立项 + + + + + + + + + 项目编号 {{item.projectCode}} + + {{tabActive == 1 ? '沟通中' : tabActive == 2 ? '进行中' : '已结束'}} + 平台介入中 + + + + + {{item.resourcesDto.title || item.projectResource.name}} + 定金尾款 + {{item.resourcesDto.detailedDescription}} + + + 项目名称: + {{item.projectName}} + + + 合作方: + {{item.partner}} + + + + + + + + + {{progress.name}} ¥{{progress.money}} + + 未开始 + 申请开启 + 进行中 + 已结束 + + + + {{item.examineTime}}项目开启 + 项目已圆满结束 + + 同意开启 + 平台介入 + 同意交付 + + + + + + diff --git a/pages/user/needsOrder/index.wxss b/pages/user/needsOrder/index.wxss new file mode 100644 index 0000000..0cb09da --- /dev/null +++ b/pages/user/needsOrder/index.wxss @@ -0,0 +1,67 @@ +/* pages/user/needsOrder/index.wxss */ +@import '../resourcesOrder/index.wxss'; + +.needs-info-box{ + border: none !important; + margin-bottom: 0 !important; +} +.info2{ + width: calc(100% - 120rpx); +} +.info-item image{ + width: 90rpx; + height: 90rpx; + margin-right: 24rpx; +} +.info-item{ + font-size: 24rpx; + border-top: 2rpx solid #F0F0F0; + padding: 20rpx 0; +} +.projectinfo-box{ + font-size: 20rpx; + margin: 2rpx 0; +} +.tag-item{ + transform: scale(0.8); + margin: 0; +} + +.needs-info-box{ + /* padding-bottom: 22rpx; */ + border-bottom: 2rpx solid #F0F0F0; + margin-bottom: 22rpx; +} +.n-title{ + color: #1D1D1D; + font-size: 32rpx; + line-height: 44rpx; +} +.n-price{ + color: #707070; + font-size: 28rpx; + margin: 8rpx 0; +} +.n-desc{ + font-size: 24rpx; + line-height: 34rpx; + color: #333333; +} +.btn-box{ + margin-top: 10rpx; +} +.btn-item { + font-size: 24rpx; + width: 130rpx; + height: 50rpx; + line-height: 50rpx; + text-align: center; + background: linear-gradient(134deg, #FFA782 0%, #FF6D31 100%); + border-radius: 12rpx; + color: #fff; + margin-left: 8rpx; +} +.status { + min-width: 150rpx; + text-align: right; +} \ No newline at end of file diff --git a/pages/user/resourcesManage/index.js b/pages/user/resourcesManage/index.js new file mode 100644 index 0000000..79ca825 --- /dev/null +++ b/pages/user/resourcesManage/index.js @@ -0,0 +1,143 @@ +// pages/user/NeedsManage/index.js +const app = getApp(); +Page({ + + /** + * 页面的初始数据 + */ + data: { + tabActive: 1, + list: [], + resourceType: 1, + resourceState: null, + resourceAuditState: null, + }, + toRelease(){ + wx.navigateTo({ + url: '/pages/release/index', + }) + }, + tabClick(e){ + let i = e.currentTarget.dataset.i + this.setParams(i) + }, + setParams(i){ + if(i == 1){ + this.setData({ + tabActive: i, + resourceState: 1, + resourceAuditState: [2], + }) + } else if(i == 2){ + this.setData({ + tabActive: i, + resourceState: 0, + resourceAuditState: [1], + }) + } else if(i == 3){ + this.setData({ + tabActive: i, + resourceState: 0, + resourceAuditState: [0,3], + }) + } else if(i == 4){ + this.setData({ + tabActive: i, + resourceState: 2, + resourceAuditState: [], + }) + } + this.getList() + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + this.setData({ + tabActive: options.type + }) + this.setParams(options.type) + + }, + getList(){ + app.http('post','Resources/listMyResources',{ + resourceType: this.data.resourceType, + resourceState: this.data.resourceState, + resourceAuditState : this.data.resourceAuditState + }).then((res)=>{ + if(res.data.success){ + this.setData({ + list: res.data.data.content + }) + } + }) + }, + // 下架 + xiajiaClick(e){ + let id = e.currentTarget.dataset.id; + console.log(id) + }, + // 撤回 + withdrawClick(e){ + let id = e.currentTarget.dataset.id; + }, + // 编辑 + editClick(e){ + let id = e.currentTarget.dataset.id; + wx.navigateTo({ + url: '/pages/user/editNeeds/index?id=' + id, + }) + }, + // 删除 + delClick(e){ + let id = e.currentTarget.dataset.id; + }, + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/user/resourcesManage/index.json b/pages/user/resourcesManage/index.json new file mode 100644 index 0000000..1a1b914 --- /dev/null +++ b/pages/user/resourcesManage/index.json @@ -0,0 +1,5 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "资源管理" + +} \ No newline at end of file diff --git a/pages/user/resourcesManage/index.wxml b/pages/user/resourcesManage/index.wxml new file mode 100644 index 0000000..f1e839d --- /dev/null +++ b/pages/user/resourcesManage/index.wxml @@ -0,0 +1,70 @@ + + + + 发布中 + 审核中 + 草稿箱 + 已结束 + + + + + 暂无资源 + 去发布吧 + + + + 项目编号 17262626272727 + {{tabActive == 2 ? '等待审核' : '未编辑完成'}} + + + + + {{item.title}} + {{item.detailedDescription}} + + + 项目合作数量(6) + + 成交金额 50000元 + 赚取 50000元 + {{item.createTime}}申请 + + 下架资源 + 撤回审核 + 编辑发布 + 删除项目 + 项目已圆满结束 + + + + + + + + diff --git a/pages/user/resourcesManage/index.wxss b/pages/user/resourcesManage/index.wxss new file mode 100644 index 0000000..5ac980d --- /dev/null +++ b/pages/user/resourcesManage/index.wxss @@ -0,0 +1,113 @@ +/* pages/user/resourcesManage/index.wxss */ +.manage-page{ + width: 100%; + min-height: 100vh; + background: #EEEEEE; +} +.tabs-box{ + width: 100%; + padding: 18rpx 58rpx; + background: #fff; +} +.tab{ + text-align: center; + font-size: 28rpx; + color: #707070; + position: relative; +} +.tab::after{ + display: block; + content: ''; + width: 100%; + height: 8rpx; + border-radius: 8rpx; + background: #FF6D31; + position: absolute; + bottom: -22rpx; + left: 50%; + opacity: 0; + transform: translateX(-50%) scaleX(0); + transition: all .2s cubic-bezier(.18,.89,.17,.88),opacity .15s ease; +} +.tab-a::after{ + opacity: 1; + left: 0; + transform: translateX(0%) scaleX(1); +} +.list{ + width: 100%; + padding: 32rpx 40rpx; +} +.list-item{ + width: 100%; + padding: 20rpx 20rpx 32rpx; + background: #fff; + border-radius: 12rpx; + margin-bottom: 20rpx; +} +.number{ + margin-bottom: 24rpx; + color: #666666; + font-size: 28rpx; +} +.status{ + font-weight: 500; + font-size: 28rpx; + color: #FF5100; +} +.info-box image{ + width: 154rpx; + height: 154rpx; + border-radius: 8rpx; + margin-right: 12rpx; +} +.info{ + width: 450rpx; + font-size: 28rpx; +} +.i-title{ + font-weight: 500; + line-height: 40rpx; + color: #1D1D1D; +} +.i-desc{ + font-size: 24rpx; + font-weight: 400; + line-height: 34rpx; + color: #666666; + min-height: 112rpx; +} +.time{ + color: #A7A7A7; + font-size: 24rpx; +} +.colO{ + font-size: 28rpx; + margin: 24rpx 0 4rpx; + color: #FF5100; +} +.btn-box{ + font-size: 30rpx; + font-weight: 500; + line-height: 40px; + color: #FF5100; +} +.btn{ + font-size: 28rpx; + width: 150rpx; + height: 56rpx; + line-height: 56rpx; + text-align: center; + background: linear-gradient(134deg, #FFA782 0%, #FF6D31 100%); + border-radius: 12rpx; + color: #fff; + margin-left: 16rpx; +} +.default{ + background: linear-gradient(134deg, #BFBFBF 0%, #BFBFBF 100%); +} +.text{ + font-size: 28rpx; + color: #666; +} + diff --git a/pages/user/resourcesOrder/index.js b/pages/user/resourcesOrder/index.js new file mode 100644 index 0000000..b7986a6 --- /dev/null +++ b/pages/user/resourcesOrder/index.js @@ -0,0 +1,180 @@ +// pages/user/resourcesOrder/index.js +const app = getApp() +Page({ + + /** + * 页面的初始数据 + */ + data: { + tabActive: 1, + list: [] + }, + toDemandHall(){ + wx.switchTab({ + url: '/pages/demandHall/index', + }) + }, + tabClick(e){ + let i = e.currentTarget.dataset.i + this.setData({ + tabActive: i + }) + if(i == 1){ + this.getCommunicates() + } else{ + this.getProjectList() + } + }, + // 获取 沟通中 + getCommunicates(){ + app.http('get','Communicate/resourceCommunicates').then((res)=>{ + if(res.data.success){ + if(res.data.data.length > 0){ + res.data.data.map((item)=>{ + item.open = false + }) + res.data.data[0].open = true + } + this.setData({ + list: res.data.data + }) + } + }) + }, + //获取进行中、已结束列表 + getProjectList(){ + app.http('get','Project/listProject',{projectState: this.data.tabActive -1, projectType: 1}).then((res)=>{ + if(res.data.success){ + res.data.data.map((item)=>{ + item.stageResultsDtoList.map((stage)=>{ + if(stage.state == 1){ + item.showBtn = true + } + }) + }) + this.setData({ + list: res.data.data + }) + } + }) + }, + // 开启下一阶段 + openNextProgress(e){ + let item = e.currentTarget.dataset.item + console.log(item) + wx.showModal({ + title: '提示!', + content: '是否申请开启下阶段?', + success(res){ + if(res.confirm){ + app.http('get','Project/applyNextStage',{projectCode: item.projectCode}).then((res)=>{ + if(res.data.success){ + wx.showToast({ + title: '操作成功!', + duration: 2000 + }) + } + }) + } + } + }) + + }, + //点击展开 + openClick(e){ + let idx = e.currentTarget.dataset.idx + console.log(idx) + let list = this.data.list + list[idx].open = !list[idx].open + this.setData({ + list: list + }) + }, + // 跳转申请详情 + toApplyDetail(e){ + let data = encodeURIComponent(JSON.stringify(e.currentTarget.dataset.item)); + wx.navigateTo({ + url: '/pages/demandHall/applyDetail/index?data=' + data, + }) + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + this.getCommunicates() + }, + // 拨打电话 + call(e){ + console.log(e.currentTarget.dataset.item) + }, + // 立项 + createProject(e){ + let id = e.currentTarget.dataset.id + wx.showModal({ + title: "提示!", + content: '是否确认立项?', + success(res){ + if(res.confirm){ + wx.navigateTo({ + url: '/pages/demandHall/createProject/index?id='+ id, + }) + } + } + }) + }, + // 平台介入 + toPlatform(e){ + let code = e.currentTarget.dataset.item.projectCode + wx.navigateTo({ + url: '/pages/demandHall/platform/index?code=' + code, + }) + }, + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/user/resourcesOrder/index.json b/pages/user/resourcesOrder/index.json new file mode 100644 index 0000000..46fb35f --- /dev/null +++ b/pages/user/resourcesOrder/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "资源订单" +} \ No newline at end of file diff --git a/pages/user/resourcesOrder/index.wxml b/pages/user/resourcesOrder/index.wxml new file mode 100644 index 0000000..ef5ba88 --- /dev/null +++ b/pages/user/resourcesOrder/index.wxml @@ -0,0 +1,170 @@ + + + + 沟通中 + 进行中 + 已结束 + + + + + 暂无订单 + 去需求广场 + + + + + 项目编号 {{item.projectCode}} + {{tabActive == 1 ? '沟通中' : tabActive == 2 ? '进行中' : '已结束'}} + 平台介入中 + + + + + + {{item.resourceInfo.name || item.projectResource.name}} + 定金尾款 + {{item.resourceInfo.content}} + + + 项目名称: + {{item.projectName}} + + + 合作方: + {{item.partner}} + + + + + + + {{!item.open ? '展开' : '收起'}} + + + + + + + + {{c.name}} + + + {{c.content}} + + + 立项 + + + + + + + + {{progress.name}} ¥{{progress.money}} + + 未开始 + 申请开启 + 进行中 + 已结束 + + + + + {{item.examineTime}}项目开启 + 项目已圆满结束 + + 开启下阶段 + 平台介入 + 申请交付 + + + + + + diff --git a/pages/user/resourcesOrder/index.wxss b/pages/user/resourcesOrder/index.wxss new file mode 100644 index 0000000..e4c8065 --- /dev/null +++ b/pages/user/resourcesOrder/index.wxss @@ -0,0 +1,235 @@ +/* pages/user/resourcesOrder/index.wxss */ +.order-page{ + width: 100%; + min-height: 100vh; + background: #EEEEEE; +} +.tabs-box{ + width: 100%; + padding: 18rpx 72rpx; + background: #fff; +} +.tab{ + text-align: center; + font-size: 28rpx; + color: #707070; + position: relative; +} +.tab::after{ + display: block; + content: ''; + width: 100%; + height: 8rpx; + border-radius: 8rpx; + background: #FF6D31; + position: absolute; + bottom: -22rpx; + left: 50%; + opacity: 0; + transform: translateX(-50%) scaleX(0); + transition: all .2s cubic-bezier(.18,.89,.17,.88),opacity .15s ease; +} +.tab-a::after{ + opacity: 1; + left: 0; + transform: translateX(0%) scaleX(1); +} +.list{ + width: 100%; + padding: 32rpx 40rpx; +} +.no-order{ + text-align: center; + line-height: 50rpx; + font-size: 28rpx; + color: #666666; +} +.item{ + width: 100%; + padding: 20rpx 20rpx 32rpx; + background: #fff; + border-radius: 12rpx; + margin-bottom: 20rpx; +} +.number{ + margin-bottom: 24rpx; + color: #666666; + font-size: 28rpx; +} +.status{ + font-weight: 500; + font-size: 28rpx; + color: #FF5100; +} +.info-box image{ + width: 154rpx; + height: 154rpx; + border-radius: 8rpx; + margin-right: 12rpx; +} +.info{ + width: 450rpx; + font-size: 28rpx; +} +.i-title{ + font-weight: 500; + line-height: 40rpx; + color: #1D1D1D; +} +.i-desc{ + font-size: 24rpx; + font-weight: 400; + line-height: 34rpx; + color: #666666; +} +.projectinfo-box{ + font-size: 24rpx; + color: #1D1D1D; +} +.p-label{ + color: #666666; +} +.time{ + color: #A7A7A7; + font-size: 24rpx; +} +.colO{ + font-size: 28rpx; + margin: 24rpx 0 4rpx; + color: #FF5100; +} + +.tag-item{ + width: 114rpx; + height: 36rpx; + line-height: 34rpx; + text-align: center; + color: #FF5100; + border: 1rpx solid #FF5100; + background: #fff; + border-radius: 4rpx; + font-size: 24rpx; + margin: 12rpx 0; +} +.open-btn{ + color: #FF5100; + font-weight: 500; + font-size: 28rpx; + margin: 20rpx 0; +} +.arrow-down{ + width: 25rpx; + height: 14rpx; + margin-left: 12rpx; +} +.arrow-up{ + + transform: rotate(180deg); +} + +.concat-list{ + height: 0rpx; + padding-bottom: 0rpx; + margin-bottom: 0rpx; + overflow:hidden; + transition: height 200ms ease; +} +.list-open{ + height: 500rpx; + padding-bottom: 28rpx; + margin-bottom: 12rpx; + overflow-y: scroll; + transition: height 300ms ease; +} +.concat-item{ + width: 100%; + height: 154rpx; + border-top: 2px solid #EEEEEE; +} +.logo{ + width: 92rpx; + height: 92rpx; +} +.call{ + width: 54rpx; + height: 54rpx; +} +.name-box{ + width: 360rpx; + font-size: 28rpx; +} +.concat-status{ + font-size: 24rpx; + display: inline-block; + margin-left: 2rpx; + color: #FF5100; +} +.name{ + width: 100%; + font-weight: 500; + line-height: 40rpx; + color: #1D1D1D; +} +.company-name{ + width: 78%; +} +.desc{ + font-size: 20rpx; + color: #707070; + margin-top: 16rpx; +} +.create-btn{ + width: 92rpx; + height: 56rpx; + background: linear-gradient(134deg, #FFA782 0%, #FF6D31 100%); + border-radius: 12rpx; + text-align: center; + line-height: 56rpx; + color: #fff; + +} +.progress-box{ + margin-top: 32rpx; + padding-top: 32rpx; + border-top: 1px solid #EEEEEE; +} +.progress-item{ + width: 100%; + height: 54rpx; + background: #f8f8f8; + padding: 0rpx 20rpx; + font-size: 26rpx; + font-weight: 500; + margin-bottom: 16rpx; +} +.progress-item image{ + width: 24rpx; + height: 24rpx; + margin-right: 8rpx; +} +.colorO{ + color: #FF8350; +} + +.btn-box{ + margin-top: 20rpx; + color: #FF5100; +} +.btn-item{ + font-size: 28rpx; + width: 162rpx; + height: 56rpx; + line-height: 56rpx; + text-align: center; + background: linear-gradient(134deg, #FFA782 0%, #FF6D31 100%); + border-radius: 12rpx; + color: #fff; + margin-left: 16rpx; +} +.default{ + background: linear-gradient(134deg, #BFBFBF 0%, #BFBFBF 100%); +} +.btn-box .start-time{ + font-size: 22rpx; + color: #1D1D1D; +} \ No newline at end of file diff --git a/pages/webview/index.js b/pages/webview/index.js new file mode 100644 index 0000000..afc9fa9 --- /dev/null +++ b/pages/webview/index.js @@ -0,0 +1,68 @@ +// pages/webview/index.js +Page({ + + /** + * 页面的初始数据 + */ + data: { + src: '' + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + this.setData({ + src: `https://${options.src}` + }) + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/webview/index.json b/pages/webview/index.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/webview/index.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/webview/index.wxml b/pages/webview/index.wxml new file mode 100644 index 0000000..4102408 --- /dev/null +++ b/pages/webview/index.wxml @@ -0,0 +1,2 @@ + + diff --git a/pages/webview/index.wxss b/pages/webview/index.wxss new file mode 100644 index 0000000..5e3b696 --- /dev/null +++ b/pages/webview/index.wxss @@ -0,0 +1 @@ +/* pages/webview/index.wxss */ \ No newline at end of file diff --git a/project.config.json b/project.config.json index df036f9..ea400ec 100644 --- a/project.config.json +++ b/project.config.json @@ -30,7 +30,6 @@ "outputPath": "" }, "enableEngineNative": false, - "bundle": false, "useIsolateContext": true, "useCompilerModule": true, "userConfirmedUseCompilerModuleSwitch": false, @@ -40,7 +39,7 @@ "minifyWXSS": true }, "compileType": "miniprogram", - "libVersion": "2.17.0", + "libVersion": "2.19.1", "appid": "wx5348e39dcbbefe1e", "projectname": "zhaoshangMiniApp", "debugOptions": { diff --git a/project.private.config.json b/project.private.config.json index 1859cc4..ab36da8 100644 --- a/project.private.config.json +++ b/project.private.config.json @@ -53,6 +53,102 @@ "pathName": "pages/user/index", "query": "", "scene": null + }, + { + "name": "pages/demandHall/contact/index", + "pathName": "pages/demandHall/contact/index", + "query": "", + "scene": null + }, + { + "name": "pages/release/personAuth/index", + "pathName": "pages/release/personAuth/index", + "query": "", + "scene": null + }, + { + "name": "pages/release/companyAuth/index", + "pathName": "pages/release/companyAuth/index", + "query": "", + "scene": null + }, + { + "name": "pages/release/perfectCompanyInfo/index", + "pathName": "pages/release/perfectCompanyInfo/index", + "query": "", + "scene": null + }, + { + "name": "pages/release/perfectPersonInfo/index", + "pathName": "pages/release/perfectPersonInfo/index", + "query": "", + "scene": null + }, + { + "name": "pages/user/editNeeds/index", + "pathName": "pages/user/editNeeds/index", + "query": "", + "scene": null + }, + { + "name": "pages/demandHall/index", + "pathName": "pages/demandHall/index", + "query": "", + "scene": null + }, + { + "name": "pages/demandHall/resourcesDetail/index", + "pathName": "pages/demandHall/resourcesDetail/index", + "query": "id=1", + "scene": null + }, + { + "name": "pages/demandHall/needsDetail/index", + "pathName": "pages/demandHall/needsDetail/index", + "query": "id=2", + "scene": null + }, + { + "name": "pages/demandHall/needsDetail/index", + "pathName": "pages/demandHall/needsDetail/index", + "query": "id=9", + "scene": null + }, + { + "name": "pages/demandHall/createProject/index", + "pathName": "pages/demandHall/createProject/index", + "query": "item=%257B%2522resourcesDto%2522%253A%257B%2522id%2522%253A1%252C%2522resourceType%2522%253A1%252C%2522createUserId%2522%253A823%252C%2522title%2522%253A%2522%25E5%2590%2584%25E7%25A7%258D%25E7%25B1%25BB%25E5%259E%258B%25E7%25BD%2591%25E7%25AB%2599%25E3%2580%2581%25E5%25B0%258F%25E7%25A8%258B%25E5%25BA%258F%25E5%25BC%2580%25E5%258F%2591%2522%252C%2522resourceCagetoryId%2522%253A2%252C%2522capital%2522%253A%252230000%2522%252C%2522detailedDescription%2522%253A%2522%25E5%2590%2584%25E7%25A7%258D%25E7%25B1%25BB%25E5%259E%258B%25E7%25BD%2591%25E7%25AB%2599%25EF%25BC%258C%25E5%2590%2584%25E5%25B9%25B3%25E5%258F%25B0%25E5%25B0%258F%25E7%25A8%258B%25E5%25BA%258F%25E5%25BC%2580%25E5%258F%2591%25EF%25BC%258C%25E6%2595%2588%25E7%258E%2587%25E5%25BF%25AB%25EF%25BC%258C%25E5%258A%259F%25E8%2583%25BD%25E5%2585%25A8%25EF%25BC%258C%25E6%2580%25A7%25E4%25BB%25B7%25E6%25AF%2594%25E9%25AB%2598%2522%252C%2522createTime%2522%253A%25222021-08-31%252013%253A47%253A21%2522%252C%2522updateTime%2522%253Anull%252C%2522isDel%2522%253A0%252C%2522resourceStartTime%2522%253A%25222021-08-31%2522%252C%2522resourceEndTime%2522%253A%25222022-08-31%2522%252C%2522resourceAuditState%2522%253A2%252C%2522resourceState%2522%253A1%252C%2522resourceImgs%2522%253Anull%252C%2522enterpriseName%2522%253Anull%252C%2522enterpriseAddress%2522%253Anull%252C%2522enterprise%2522%253Anull%252C%2522questionsDtos%2522%253Anull%252C%2522user%2522%253Anull%257D%252C%2522communicateDtoList%2522%253A%255B%257B%2522id%2522%253A2%252C%2522type%2522%253Anull%252C%2522resourceId%2522%253A1%252C%2522demandId%2522%253A2%252C%2522content%2522%253Anull%252C%2522initiatorId%2522%253A823%252C%2522createTime%2522%253A%25222021-09-01%252015%253A44%253A33%2522%252C%2522updateTime%2522%253Anull%252C%2522isDel%2522%253A%25220%2522%257D%252C%257B%2522id%2522%253A7%252C%2522type%2522%253Anull%252C%2522resourceId%2522%253A1%252C%2522demandId%2522%253Anull%252C%2522content%2522%253A%2522%25E6%2588%2591%25E6%2583%25B3%25E5%25BC%2580%25E5%258F%2591%25E4%25B8%2580%25E6%25AC%25BE%25E5%25B0%258F%25E7%25A8%258B%25E5%25BA%258F%25EF%25BC%258C%2520%25E5%25B8%258C%25E6%259C%259B%25E8%2583%25BD%25E5%25A4%259F%25E5%25B0%25BD%25E5%25BF%25AB%25E4%25B8%258E%25E6%2582%25A8%25E6%25B2%259F%25E9%2580%259A%2522%252C%2522initiatorId%2522%253A823%252C%2522createTime%2522%253A%25222021-09-02%252010%253A13%253A57%2522%252C%2522updateTime%2522%253Anull%252C%2522isDel%2522%253A%25220%2522%257D%255D%252C%2522open%2522%253Atrue%257D", + "scene": null + }, + { + "name": "pages/demandHall/createProject/index", + "pathName": "pages/demandHall/createProject/index", + "query": "id=7", + "scene": null + }, + { + "name": "pages/user/needsOrder/index", + "pathName": "pages/user/needsOrder/index", + "query": "", + "scene": null + }, + { + "name": "pages/demandHall/applyDetail/index", + "pathName": "pages/demandHall/applyDetail/index", + "query": "data=%257B%2522resourceInfo%2522%253A%257B%2522resourceId%2522%253A12%252C%2522name%2522%253Anull%252C%2522content%2522%253A%2522%25E8%258C%2583%25E5%25BE%25B7%25E8%2590%25A8%25E8%258C%2583%25E5%25BE%25B7%25E8%2590%25A8%25E5%258F%2591%25E7%2594%259F%25E8%258C%2583%25E5%25BE%25B7%25E8%2590%25A8%25E8%258C%2583%25E5%25BE%25B7%25E8%2590%25A8%2522%252C%2522logo%2522%253Anull%252C%2522budget%2522%253Anull%257D%252C%2522partnerInfos%2522%253A%255B%257B%2522communicateId%2522%253A12%252C%2522comminuteState%2522%253A1%252C%2522createTime%2522%253A%25222021-09-07%2522%252C%2522name%2522%253A%2522%25E6%25A5%259A%25E8%25B1%25A1%25E7%25A7%2591%25E6%258A%2580%25E6%259C%2589%25E9%2599%2590%25E5%2585%25AC%25E5%258F%25B8%2522%252C%2522title%2522%253A%2522%25E6%259B%25B4%25E5%25BF%25AB%25EF%25BC%258C%25E6%259B%25B4%25E9%25AB%2598%25EF%25BC%258C%25E6%259B%25B4%25E5%25BC%25BA%2522%252C%2522logo%2522%253A%2522https%253A%252F%252Fqiniu.upload.gznl.top%252Fbc961e15-5030-4580-a273-1cdafe883520.png%2522%252C%2522phone%2522%253A%252207220324234%2522%257D%255D%252C%2522open%2522%253Atrue%257D", + "scene": null + }, + { + "name": "pages/index/index", + "pathName": "pages/index/index", + "query": "", + "scene": null + }, + { + "name": "pages/index/index", + "pathName": "pages/index/index", + "query": "", + "scene": null } ] } diff --git a/tabbarComponent/icon/组 1051@2x.png b/tabbarComponent/icon/home.png similarity index 100% rename from tabbarComponent/icon/组 1051@2x.png rename to tabbarComponent/icon/home.png diff --git a/tabbarComponent/icon/icon_release.png b/tabbarComponent/icon/icon_release.png index 198d9506d6f53b5f8da104496bbf66a8384b760d..52209e244503cb07d5a55b5f99760765c2f94e4b 100644 GIT binary patch literal 2718 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 diff --git a/tabbarComponent/icon/icon_release2.png b/tabbarComponent/icon/icon_release2.png new file mode 100644 index 0000000000000000000000000000000000000000..198d9506d6f53b5f8da104496bbf66a8384b760d GIT binary patch literal 729 zcmeAS@N?(olHy`uVBq!ia0vp^V9db`WPSKlyb?%F3-AeX1=9cjm;HYn`u}klhQuCxWG<-`q^8yOfFuX?&ThD01bd$TjI z$w7kU0i&4chgIge?O9jvJ^#HwCijwuNn}~0;mhv~ljpzLbbNmS$F$8SHM}NINSx%h z_+*acg5Iko0-s_mW~{s5BbUDAz4AfI&xjpokce9{qbe?JQ|Ng-PpC_L(*xVh6!T+ zu1n2tA7RP(95Hjp-o>u2Q)})|*;f~Aw)DCCt<^q9l;<(5v@qIxV$YTTw!iBCC}~fu z+k0jGt6zJc3t2CzlmBj)`(|7F*Pgt{-r`@E%l3Y^7k>I>s0^#;{9`9%02%2hS$qqFX#QTm$#PP?Y{b@^37jt&1=&G?(e@+9{F`|LhbRW`{Ccq oU%&hJzuBDYpm*1&z3%VX%`Mz^eim+U0;U88Pgg&ebxsLQ02M=S-T(jq literal 0 HcmV?d00001 diff --git a/tabbarComponent/icon/组 1048@2x.png b/tabbarComponent/icon/tab2-a.png similarity index 100% rename from tabbarComponent/icon/组 1048@2x.png rename to tabbarComponent/icon/tab2-a.png diff --git a/images/home/组 227@2x.png b/tabbarComponent/icon/tab2.png old mode 100755 new mode 100644 similarity index 100% rename from images/home/组 227@2x.png rename to tabbarComponent/icon/tab2.png diff --git a/tabbarComponent/icon/组 1049@2x.png b/tabbarComponent/icon/tab3-a.png similarity index 100% rename from tabbarComponent/icon/组 1049@2x.png rename to tabbarComponent/icon/tab3-a.png diff --git a/images/home/组 226@2x.png b/tabbarComponent/icon/tab3.png old mode 100755 new mode 100644 similarity index 100% rename from images/home/组 226@2x.png rename to tabbarComponent/icon/tab3.png diff --git a/tabbarComponent/icon/组 1050@2x.png b/tabbarComponent/icon/tab4-a.png similarity index 100% rename from tabbarComponent/icon/组 1050@2x.png rename to tabbarComponent/icon/tab4-a.png diff --git a/images/home/组 229@2x.png b/tabbarComponent/icon/tab4.png old mode 100755 new mode 100644 similarity index 100% rename from images/home/组 229@2x.png rename to tabbarComponent/icon/tab4.png diff --git a/tabbarComponent/icon/组 226@2x.png b/tabbarComponent/icon/组 226@2x.png deleted file mode 100755 index fbebe0ab14457a881759103d243fa671504e5936..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1609 zcmZ`)2~bm46b&G4NMLjV7TgNhh}fwkQUs9^NkN zR!SA6fMDFWFf=G60g^xh2@n!UKogJvic$qCAU*Vtj$_+9llSkt@0@d&|NexxJR;bR zGL=Fik?cZ4f+F$s8vl{4u=W@9Xz{Sv78%SST~SOolSr0FmoH(n5QL45jd3^}ti{E} z_wL=Rsj0!*+1XiAQX&ut8XFsBGFe4MMR|F-LZN7CYQm{hDn%S?b91vuB!YvZhK2^U zT8#)Cl}e@2Xj)oYKopC`U;z&wL2T>l>ac|%B9)bu9UUDKi3Aa_AO*TyE{6{XK~VI1 zeOp`Gg9i_cMkBze5C+ZG)>f#2i@YGhhh}wkH4278ZEdYmsYEV92f;Vuz#tA5C`dsl zAQ9?8JJ_NsV1Ng#zP=v02oZDy7{mdCJ^)xDqSb0qFo*;TxlkdFFczW)oFW||0yT($ zqSNUhh%Sf*+uPgGv(s2WJDCn!ot$hYJxSHLZ#81rp$15c5$V<&7KGI^70D^2w<{Uq2WuTSH`T_n6xQ5 zd24Fw4(@9^csPxBG&A$WFK1p`cFwuH!orJ1#e6>h>bTvwaidgtzg&WLsulGr_4q~m zZySF<I=Z@gp7!_m4-5_t4Gj;EzJkT=zx4_qS3zh{AUmW=A3ZCl+OSC^+MrL$lPg+gxs!V@NBqr< zx%L;Fi>@8m=f{+#g{5)wdz#A_l*p;YU!*A69O}G~EXsmY{`S`8HB8nil{;%$pyY!& zCx`OsUe>wc3TBx7O99WQN!Y3R)-$FmaZb1Ja^A%+OW3zf`v=VGD2K@>8ufmAy|>P$ zJAPXC8Pzp0hW@eIHT;a$(~>h}9EmGkf2f(yR-RgHN1oK9zM6O`@`uGMymmhuagAlp z40I!}elh#c7Mr<3`d_+@v5PnI#YIaqmRT1VRe9%IT%P>< zl69{ER1YKdo9rzp4bLk`i diff --git a/tabbarComponent/icon/组 227@2x.png b/tabbarComponent/icon/组 227@2x.png deleted file mode 100755 index 6209035a6cdc2bd952f49ad078f5e3bc50454bbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1362 zcmYjP4KSN`9DWt`QEhy**_E!9&8pS*(yqSNE5p)6y4F=>sckl_syC`1!`#&fMk_^k zbX`w-y3=8&Md`l6bVd+_XhMjHB0-u{RM!eBv1fa?+x~a&|9#%y`#jI@`Ty=OI2OWM zZ|iJJ5X5?RFoT1)=UpZ9XrB3gyQPItEs7}ySw|& zojceS3Pndp$MEnlaC>{ZR;vY&N~O)s&24RMVzIchvlA7GM1mp+_#^>TGMNmO-rnBU z)>e^71e#8#!wxMtU0q!;2Y?AUaD&OihYwXM6|~_0-ybymlFQ`-0|TIe58U714~N0Q z!J(lcBpewT866!RA0J1^$;nAb5C$fYV22!e$anxfJv}WgEo2uk$qM=+3=;PB^#PFi zApw9Ke}T~yfW%0GQ$P+0y5KK9abzsW(E>T41x5u9WOvd~sZ@fD@T3HWFoA?TCitk6 z6_}tYOaRb@jE#}vP-G)A4EV@HN)QQT^2itzjzi80a&$y%Obm0z(9~)*=Jx2(BaCir zYz))WXfzn$#Kc5IFH?YPaV3cp5=NMYiqY*1I5vC;c&wvBctOJ&Yb(~pOwt#Xa2V?P z2%*vF9_y!{%*;KVpPzsB{Kdk8!LYcvxU{tV5^H6}`1dlIOv(JiwYa!pY(^kASUkh~ zDBdY>qu)^WnS_0_s_-AUPN(-#FLSOPUU$ge=wtF;&7jz3Q9P#V(rQcX<($xngfO{h zj#eaIq2+h4317tNm~Rxl zR>32bsuvPNE5j?3!El)`H3eSfFTHy>MDDol!An(kV?j5*#_1&qq~REhO_=y@^A z#j*^!gX7MGB8BUeP4v$voX)pNg=+n-H`7jLULdT*`5z2AP_(f=uIX3WXEsGXj<&mL z8!-F8$eaF6$yhb&TV}Px-$w>qt?PRRp_D^uikyX-mbfPv@WO0Jis8(-{mJz{fCRc zHMlhXVzi%GR%kw__gjk6Sk_rFsWqa#u3LXH?M|{j!@NFzR5?)V=1yb>-e)>kx6I|% zgSQ7i!Nn)ohe8-NK~Y(M0<|JDbpQYW diff --git a/tabbarComponent/icon/组 229@2x.png b/tabbarComponent/icon/组 229@2x.png deleted file mode 100755 index d2c003ee47e6ee014b69c8369c81e8b22a529a9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1236 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 0 + }, + /** + * 验证电子邮箱格式 + */ + email(value) { + return that.optional(value) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(value) + }, + /** + * 验证手机格式 + */ + tel(value) { + return that.optional(value) || /^1[34578]\d{9}$/.test(value) + }, + /** + * 验证URL格式 + */ + url(value) { + return that.optional(value) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(value) + }, + /** + * 验证日期格式 + */ + date(value) { + return that.optional(value) || !/Invalid|NaN/.test(new Date(value).toString()) + }, + /** + * 验证ISO类型的日期格式 + */ + dateISO(value) { + return that.optional(value) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(value) + }, + /** + * 验证十进制数字 + */ + number(value) { + return that.optional(value) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value) + }, + /** + * 验证整数 + */ + digits(value) { + return that.optional(value) || /^\d+$/.test(value) + }, + /** + * 验证身份证号码 + */ + idcard(value) { + return that.optional(value) || /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value) + }, + /** + * 验证两个输入框的内容是否相同 + */ + equalTo(value, param) { + return that.optional(value) || value === that.data[param] + }, + /** + * 验证是否包含某个值 + */ + contains(value, param) { + return that.optional(value) || value.indexOf(param) >= 0 + }, + /** + * 验证最小长度 + */ + minlength(value, param) { + return that.optional(value) || value.length >= param + }, + /** + * 验证最大长度 + */ + maxlength(value, param) { + return that.optional(value) || value.length <= param + }, + /** + * 验证一个长度范围[min, max] + */ + rangelength(value, param) { + return that.optional(value) || (value.length >= param[0] && value.length <= param[1]) + }, + /** + * 验证最小值 + */ + min(value, param) { + return that.optional(value) || value >= param + }, + /** + * 验证最大值 + */ + max(value, param) { + return that.optional(value) || value <= param + }, + /** + * 验证一个值范围[min, max] + */ + range(value, param) { + return that.optional(value) || (value >= param[0] && value <= param[1]) + }, + } + } + + /** + * 添加自定义验证方法 + * @param {String} name 方法名 + * @param {Function} method 函数体,接收两个参数(value, param),value表示元素的值,param表示参数 + * @param {String} message 提示信息 + */ + addMethod(name, method, message) { + this.methods[name] = method + this.defaults.messages[name] = message !== undefined ? message : this.defaults.messages[name] + } + + /** + * 判断验证方法是否存在 + */ + isValidMethod(value) { + let methods = [] + for (let method in this.methods) { + if (method && typeof this.methods[method] === 'function') { + methods.push(method) + } + } + return methods.indexOf(value) !== -1 + } + + /** + * 格式化提示信息模板 + */ + formatTpl(source, params) { + const that = this + if (arguments.length === 1) { + return function() { + let args = Array.from(arguments) + args.unshift(source) + return that.formatTpl.apply(this, args) + } + } + if (params === undefined) { + return source + } + if (arguments.length > 2 && params.constructor !== Array) { + params = Array.from(arguments).slice(1) + } + if (params.constructor !== Array) { + params = [params] + } + params.forEach(function(n, i) { + source = source.replace(new RegExp("\\{" + i + "\\}", "g"), function() { + return n + }) + }) + return source + } + + /** + * 判断规则依赖是否存在 + */ + depend(param) { + switch (typeof param) { + case 'boolean': + param = param + break + case 'string': + param = !!param.length + break + case 'function': + param = param() + default: + param = !0 + } + return param + } + + /** + * 判断输入值是否为空 + */ + optional(value) { + return !this.methods.required(value) && 'dependency-mismatch' + } + + /** + * 获取自定义字段的提示信息 + * @param {String} param 字段名 + * @param {Object} rule 规则 + */ + customMessage(param, rule) { + const params = this.messages[param] + const isObject = typeof params === 'object' + if (params && isObject) return params[rule.method] + } + + /** + * 获取某个指定字段的提示信息 + * @param {String} param 字段名 + * @param {Object} rule 规则 + */ + defaultMessage(param, rule) { + let message = this.customMessage(param, rule) || this.defaults.messages[rule.method] + let type = typeof message + + if (type === 'undefined') { + message = `Warning: No message defined for ${rule.method}.` + } else if (type === 'function') { + message = message.call(this, rule.parameters) + } + + return message + } + + /** + * 缓存错误信息 + * @param {String} param 字段名 + * @param {Object} rule 规则 + * @param {String} value 元素的值 + */ + formatTplAndAdd(param, rule, value) { + let msg = this.defaultMessage(param, rule) + + this.errorList.push({ + param: param, + msg: msg, + value: value, + }) + } + + /** + * 验证某个指定字段的规则 + * @param {String} param 字段名 + * @param {Object} rules 规则 + * @param {Object} data 需要验证的数据对象 + */ + checkParam(param, rules, data) { + + // 缓存数据对象 + this.data = data + + // 缓存字段对应的值 + const value = data[param] !== null && data[param] !== undefined ? data[param] : '' + + // 遍历某个指定字段的所有规则,依次验证规则,否则缓存错误信息 + for (let method in rules) { + + // 判断验证方法是否存在 + if (this.isValidMethod(method)) { + + // 缓存规则的属性及值 + const rule = { + method: method, + parameters: rules[method] + } + + // 调用验证方法 + const result = this.methods[method](value, rule.parameters) + + // 若result返回值为dependency-mismatch,则说明该字段的值为空或非必填字段 + if (result === 'dependency-mismatch') { + continue + } + + this.setValue(param, method, result, value) + + // 判断是否通过验证,否则缓存错误信息,跳出循环 + if (!result) { + this.formatTplAndAdd(param, rule, value) + break + } + } + } + } + + /** + * 设置字段的默认验证值 + * @param {String} param 字段名 + */ + setView(param) { + this.form[param] = { + $name: param, + $valid: true, + $invalid: false, + $error: {}, + $success: {}, + $viewValue: ``, + } + } + + /** + * 设置字段的验证值 + * @param {String} param 字段名 + * @param {String} method 字段的方法 + * @param {Boolean} result 是否通过验证 + * @param {String} value 字段的值 + */ + setValue(param, method, result, value) { + const params = this.form[param] + params.$valid = result + params.$invalid = !result + params.$error[method] = !result + params.$success[method] = result + params.$viewValue = value + } + + /** + * 验证所有字段的规则,返回验证是否通过 + * @param {Object} data 需要验证数据对象 + */ + checkForm(data) { + this.__initData() + + for (let param in this.rules) { + this.setView(param) + this.checkParam(param, this.rules[param], data) + } + + return this.valid() + } + + /** + * 返回验证是否通过 + */ + valid() { + return this.size() === 0 + } + + /** + * 返回错误信息的个数 + */ + size() { + return this.errorList.length + } + + /** + * 返回所有错误信息 + */ + validationErrors() { + return this.errorList + } +} + +export default WxValidate \ No newline at end of file diff --git a/utils/checkLogin.js b/utils/checkLogin.js new file mode 100644 index 0000000..496ab47 --- /dev/null +++ b/utils/checkLogin.js @@ -0,0 +1,11 @@ +function isLogin(){ + if(wx.getStorageSync('token')){ + return true + } else{ + return false + } +} + +module.exports = { + isLogin +} \ No newline at end of file diff --git a/utils/qqmap-wx-jssdk.min.js b/utils/qqmap-wx-jssdk.min.js new file mode 100644 index 0000000..8fa1477 --- /dev/null +++ b/utils/qqmap-wx-jssdk.min.js @@ -0,0 +1 @@ +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 = { 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) { 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) }, 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 }, 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 }, 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 }, 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 }) }, 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 () { } }, 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 }, checkKeyword(param) { return !this.checkParamKeyEmpty(param, 'keyword') }, 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 }, buildErrorConfig(errCode, errMsg) { return { status: errCode, message: errMsg } }, 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) { 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) } }, 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 { constructor(options) { if (!options.key) { throw Error('key值不能为空') } this.key = options.key }; 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) }; 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")) } }; 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) }; 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')) }; 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')) }; 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')) }; 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) } }; direction(options) { var that = this; options = options || {}; Utils.polyfillParam(options); if (Utils.checkParamKeyEmpty(options, 'to')) { return } var requestParam = { output: 'json', key: that.key }; if (typeof options.to == 'string') { requestParam.to = options.to } else { requestParam.to = options.to.latitude + ',' + options.to.longitude } var SET_URL_DIRECTION = null; 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/utils/util.js b/utils/util.js index 764bc2c..11c9e5f 100644 --- a/utils/util.js +++ b/utils/util.js @@ -1,3 +1,4 @@ +const app = getApp() const formatTime = date => { const year = date.getFullYear() const month = date.getMonth() + 1 @@ -14,6 +15,106 @@ const formatNumber = n => { return n[1] ? n : `0${n}` } +function chooseImages(callback) { + wx.chooseImage({ + count: 1, + sourceType: ['album', 'camera'], + success: res => { + const tempFilePaths = res.tempFilePaths; + for(let i = 0;i < tempFilePaths.length; i++) { + wx.getImageInfo({ + src: tempFilePaths[i], + success: image => { + wx.showLoading({ title: '图片上传中', mask: true }) + wx.uploadFile({ + url: `${app.globalData.baseURL}api/upload`, + file: image, + filePath: image.path, + header: { + Authorization: wx.getStorageSync('token'), + }, + name: 'file', + success: res => { + if (callback) { + callback(JSON.parse(res.data).link) + } + }, + fail: err => { + wx.showToast({ + title: '上传图片失败', + icon: 'none', + duration: 2000, + }) + }, + complete: res => { + wx.hideLoading() + }, + }) + }, + fail: err => { + wx.showToast({ + title: '获取图片信息失败', + icon: 'none', + duration: 2000, + }) + }, + }) + } + } + }) +} + +function chooseImages2(callback) { + wx.chooseImage({ + count: 3, + sourceType: ['album', 'camera'], + success: res => { + const tempFilePaths = res.tempFilePaths; + for(let i = 0;i < tempFilePaths.length; i++) { + wx.getImageInfo({ + src: tempFilePaths[i], + success: image => { + wx.showLoading({ title: '图片上传中', mask: true }) + wx.uploadFile({ + url: `${app.globalData.baseURL}api/upload`, + file: image, + filePath: image.path, + header: { + Authorization: wx.getStorageSync('token'), + }, + name: 'file', + success: res => { + if (callback) { + callback(JSON.parse(res.data).link) + } + }, + fail: err => { + wx.showToast({ + title: '上传图片失败', + icon: 'none', + duration: 2000, + }) + }, + complete: res => { + wx.hideLoading() + }, + }) + }, + fail: err => { + wx.showToast({ + title: '获取图片信息失败', + icon: 'none', + duration: 2000, + }) + }, + }) + } + } + }) +} + module.exports = { - formatTime + formatTime, + chooseImages, + chooseImages2 }