diff --git a/components/menubar/menubar.vue b/components/menubar/menubar.vue index 1d31f51..2f8b42d 100644 --- a/components/menubar/menubar.vue +++ b/components/menubar/menubar.vue @@ -23,17 +23,15 @@ - - - {{item.title}} + + {{item.title}}{{current}} {{item.times}} - @@ -45,7 +43,7 @@ props:{ tabs:{ type: Array, - default: ()=>[[],[],[],[],[],[]] + default: ()=>[[],[],[],[],[],[],[],[]] }, currentPage:{ type:Number, @@ -72,6 +70,10 @@ }, { name: '综合新闻' }, { + name: '市局通知' + },{ + name: '市局文件' + },{ name: '各地警讯' }, { name: '机关动态' @@ -144,10 +146,13 @@ } .titles{ - width:70%; + width:100%; display: inline-block; vertical-align: top; } + .titles100{ + width:70%; + } /deep/ .titles .u-body-item-title{ height:96rpx; } diff --git a/main.js b/main.js index 1311212..6fa8f05 100644 --- a/main.js +++ b/main.js @@ -27,9 +27,11 @@ Vue.prototype.util = util; -import subtabBar from 'components/tabbar/subtabbar.vue' -Vue.component('subtabBar', subtabBar) +// import subtabBar from 'components/tabbar/subtabbar.vue' +// Vue.component('subtabBar', subtabBar) +import tabBar from 'components/tabbar/tabbar.vue' +Vue.component('tabBar', tabBar) import top from 'components/top/top.vue' Vue.component('topBar', top) import menubar from 'components/menubar/menubar.vue' -Vue.component('menuBar', menubar) \ No newline at end of file +Vue.component('menuBar', menubar) diff --git a/manifest.json b/manifest.json index d7913c1..999745d 100644 --- a/manifest.json +++ b/manifest.json @@ -1,72 +1,89 @@ -{ - "name" : "常州公安-手机端", - "appid" : "__UNI__EDB3F98", - "description" : "", - "versionName" : "1.0.0", - "versionCode" : "100", - "transformPx" : false, - /* 5+App特有相关 */ - "app-plus" : { - "usingComponents" : true, - "nvueStyleCompiler" : "uni-app", - "compilerVersion" : 3, - "splashscreen" : { - "alwaysShowBeforeRender" : true, - "waiting" : true, - "autoclose" : true, - "delay" : 0 - }, - /* 模块配置 */ - "modules" : {}, - /* 应用发布信息 */ - "distribute" : { - /* android打包配置 */ - "android" : { - "permissions" : [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - /* ios打包配置 */ - "ios" : {}, - /* SDK配置 */ - "sdkConfigs" : {} - } - }, - /* 快应用特有相关 */ - "quickapp" : {}, - /* 小程序特有相关 */ - "mp-weixin" : { - "appid" : "", - "setting" : { - "urlCheck" : false - }, - "usingComponents" : true - }, - "mp-alipay" : { - "usingComponents" : true - }, - "mp-baidu" : { - "usingComponents" : true - }, - "mp-toutiao" : { - "usingComponents" : true - }, - "uniStatistics" : { - "enable" : false - }, - "vueVersion" : "2" +{ + "name": "常州公安-手机端", + "appid": "__UNI__EDB3F98", + "description": "", + "versionName": "1.0.0", + "versionCode": "100", + "transformPx": false, + /* 5+App特有相关 */ + "app-plus": { + "usingComponents": true, + "nvueStyleCompiler": "uni-app", + "compilerVersion": 3, + "splashscreen": { + "alwaysShowBeforeRender": true, + "waiting": true, + "autoclose": true, + "delay": 0 + }, + /* 模块配置 */ + "modules": {}, + /* 应用发布信息 */ + "distribute": { + /* android打包配置 */ + "android": { + "permissions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + /* ios打包配置 */ + "ios": {}, + /* SDK配置 */ + "sdkConfigs": {} + } + }, + /* 快应用特有相关 */ + "quickapp": {}, + /* 小程序特有相关 */ + "mp-weixin": { + "appid": "", + "setting": { + "urlCheck": false + }, + "usingComponents": true + }, + "mp-alipay": { + "usingComponents": true + }, + "mp-baidu": { + "usingComponents": true + }, + "mp-toutiao": { + "usingComponents": true + }, + "uniStatistics": { + "enable": false + }, + "vueVersion": "2", + "h5":{ + "devServer": { + "port" : 8081, //端口号 + "disableHostCheck" : true, + "proxy": { + "": { + "target":"http://czga.langye.net/e/extend/api/index.php", + "changeOrigin": true,//是否跨域 + "secure": false + } + } + }, + "router" : { + "base" : "/" + } + } + } diff --git a/pages/index/index.vue b/pages/index/index.vue index bee1b76..d8786bf 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -6,7 +6,7 @@ - + {{item.title}} @@ -57,11 +57,7 @@ diff --git a/static/images/sjtz.png b/static/images/sjtz.png new file mode 100644 index 0000000..e445768 Binary files /dev/null and b/static/images/sjtz.png differ diff --git a/static/images/sjwj.png b/static/images/sjwj.png new file mode 100644 index 0000000..27241b0 Binary files /dev/null and b/static/images/sjwj.png differ diff --git a/utils/util.js b/utils/util.js index e69de29..5ce85c2 100644 --- a/utils/util.js +++ b/utils/util.js @@ -0,0 +1,559 @@ + +const HOSTARR = { + 'development': 'http://czga.langye.net/e/extend/api/index.php', + // 'development': 'http://patrol.115.langye.net', + 'production': 'http://czga.langye.net/e/extend/api/index.php' +}; // 审核状态 + +const HOST = HOSTARR[process.env + .NODE_ENV]; //"https://tiantianxinye.365care.langye.net/";//HOSTARR[process.env.NODE_ENV];// + + +const formatTime = date => { + const year = date.getFullYear(); + const month = date.getMonth() + 1; + const day = date.getDate(); + return [year, month, day].map(formatNumber).join('-'); +}; + +const user_info_key = "userInfo_token"; +const user_key = "userInfo"; + +const getUserInfo = (cb, refresh) => { + cb = cb || function() {} + refresh = refresh || false + if (!refresh) { + let user_info = uni.getStorageSync(user_key) + if (!isNull(user_info)) { + cb(user_info) + return + } + } + request({ + api: '/api/mobile/user/show', + utilSuccess: function(res) { + uni.setStorageSync(user_key, res) + cb(res) + }, + utilFail: function(res) {} + }) +} + +const getOpenidInfo = (cb, refresh) => { + cb = cb || function() {} + refresh = refresh || false + if (!refresh) { + let user_info = uni.getStorageSync(user_info_key) + if (!isNull(user_info)) { + cb(user_info) + return + } + } + + uni.login({ + provider: 'weixin', + success: (res) => { + console.log(res.code); + let url = HOST + '/api/mobile/user/login?code=' + res.code; + uni.request({ + url: url, + method: 'GET', + success: result => { + let user_info = result.data + uni.setStorageSync(user_info_key, user_info) + cb(user_info) + } + }); + } + }); +} + + + +const getUserProfile = (cb) => { + cb = cb || function() {} + + wx.getUserProfile({ + desc: '用于完善会员资料', + success: (res) => { + uni.setStorageSync('user_profile', res.userInfo) + cb(res.userInfo) + } + }) +} + + + + + + +const formatTimeAll = date => { + const year = date.getFullYear(); + const month = date.getMonth() + 1; + const day = date.getDate(); + const hour = date.getHours(); + const minute = date.getMinutes(); + const second = date.getSeconds(); + return [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute, second].map(formatNumber).join( + ':'); +}; + +const formatNumber = n => { + n = n.toString(); + return n[1] ? n : '0' + n; +}; // 快捷显示alert + + +const alert = msg => { + uni.showModal({ + title: '', + content: msg, + showCancel: false + }); +}; // 订单状态 + +const toast = msg => { + // setTimeout(function() { + // uni.showToast({ + // icon: "none", + // title: msg, + // duration: 2000 + // }) + // }, 2000) + + uni.showModal({ + title: '', + content: msg, + showCancel: false + }); + +}; // 订单状态 + + +const orderStatusDic = { + '0': '待确认', + '10': '待派单', + '20': '进行中', + '100': '已完成' +}; // 审核状态 + +const auditStatusDic = { + '0': '待审核', + '1': '已审核', + '-1': '已拒绝' +}; // 请求封装 + +const request = options => { + if (!options.customLoading) { + uni.showLoading({ + title: '正在加载' + }); + } else { + // 当前页面请求数量+1 + if (options.bindThis) { + options.bindThis.setData({ + //loadingCount: options.bindThis.data.loadingCount + 1 + }); + } + } + + options.url = HOST + options.api; + options.header = { + ...options.header, + //'Accept': 'application/json', + //'Connection': 'keep-alive' + //'content-type': 'application/json' + }; // 如果已登录,请求中拼openId + + // var access_token = uni.getStorageSync(user_info_key).access_token; + + if (isLogin()) { + options.data = { + ...options.data, + // 'token': access_token + }; + } // 如果是POST方法 + + + // if (options.method == 'POST' && !isNull(access_token)) { + // // 拼时间戳 + // options.data.ts = new Date().getTime(); + // } + + uni.request({ + ...options, + success: function(res) { + uni.hideLoading(); + if (res.statusCode != 200) { + if (options.utilFail != undefined) { + if (res.statusCode == 401) { + uni.clearStorageSync(); + uni.navigateTo({ + url: '/pages/login/login' + }); + } else { + options.utilFail('TODO: 特殊处理非200错误(' + res.statusCode + ')'); + } + } + } else { + + if (res.data.hasOwnProperty("errcode")) { + if (options.utilFail != undefined) { + options.utilFail(res.data.errmsg || '接口发生未知错误'); + } else { + options.utilFail(res.data.errmsg); + } + } else { + if (options.utilSuccess != undefined) { + options.utilSuccess(res.data); + } + } + } + }, + fail: options.utilFail, + complete: function(res) { + if (!options.customLoading) { + uni.hideNavigationBarLoading(); + + } else { + // 当前页面请求数量-1 + if (options.bindThis) { + options.bindThis.setData({ + loadingCount: options.bindThis.data.loadingCount - 1 + }); + } + } + } + }); +}; // 提交formID封装 + + + +const payOrder = (orderID, orderType, success, fail) => { + uni.request({ + url: HOST + 'WxPay/ToPay?openId=' + uni.getStorageSync(user_info_key).WeChatOpenID + + '&orderId=' + + orderID + '&OrderType=' + orderType, + method: 'GET', + header: { + 'content-type': 'application/json' + }, + success: function(res) { + // 内容为空, 代表失败 + if (res.data == '') { + fail('当前网络状况不好'); + return; + } // 去掉转义字符 + + + var pureStr = res.data.replace(/\\/g, ''); + res.data = JSON.parse(pureStr); + var index = res.data.package.indexOf('=') + 1; + var prepayId = res.data.package.substring(index); // wxpay + + uni.requestPayment({ + timeStamp: res.data.timeStamp, + nonceStr: res.data.nonceStr, + package: res.data.package, + signType: res.data.signType, + paySign: res.data.paySign, + success: function(res) { + success(res); // 发送成功通知 + + request({ + api: 'WxPay/PayTemplateMsg', + data: { + prepay_id: prepayId, + orderId: orderID, + isSuccess: 1, + failMsg: '', + xType: orderType + } + }); + }, + fail: function(res) { + fail(res); + var errMsg = res == 'requestPayment:fail cancel' ? '用户取消支付' : + res; // 发送失败通知 + + request({ + api: 'WxPay/PayTemplateMsg', + data: { + prepay_id: prepayId, + orderId: orderID, + isSuccess: 0, + failMsg: errMsg, + xType: orderType + } + }); + } + }); + }, + fail: function(err) { + fail('当前网络状况不好'); + } + }); +}; // 判断是否已登录(同时有open-id和PhoneNum, 则认为已登录) + +const isLogin = () => { + // var userInfo = uni.getStorageSync(user_info_key); + // return !isNull(userInfo.access_token); +}; // 判断是否为空 + + +const isNull = p => { + return p == '' || p == undefined || p == null || p == 'undefined' || p == 'null'; +}; // 正则 + +const phoneRegex = /^1\d{10}$/; +const idCardRegex = /^\d{17}([0-9]|X)$/; // 去掉特殊字符 + +const filterSpecialChars = str => { + return str.replace(/[^\u4e00-\u9fa5a-zA-Z0-9\w]/g, ''); +}; // 生成随机字符串 + + +const randomStr = length => { + var ret = ''; + var arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', + 'i', 'j', + 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', + 'D', 'E', + 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', + 'Y', 'Z' + ]; + + for (var i = 0; i < length; i++) { + var randomIndex = Math.round(Math.random() * (arr.length - 1)); + ret += arr[randomIndex]; + } + + return ret; +}; // proType对应的中文描述 + +const weekdayArr = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']; // 是否合法的身份证 + +const isValidCardID = cardID => { + // Step1: 先判断格式 + if (!idCardRegex.test(cardID)) return false; // Step2: 校验最后一位 + + var code = cardID.split(''); //加权因子 + + var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; //校验位 + + var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]; + var sum = 0; + var ai = 0; + var wi = 0; + + for (var i = 0; i < 17; i++) { + ai = code[i]; + wi = factor[i]; + sum += ai * wi; + } + + var last = parity[sum % 11]; + return parity[sum % 11] == code[17]; +}; +/** + * UTF16和UTF8转换对照表 + * U+00000000 – U+0000007F 0xxxxxxx + * U+00000080 – U+000007FF 110xxxxx 10xxxxxx + * U+00000800 – U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxx + * U+00010000 – U+001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + * U+00200000 – U+03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx + * U+04000000 – U+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx + */ + + +var Base64 = { + // 转码表 + table: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', + 'T', 'U', + 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', + 'o', 'p', + 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', + '9', '+', + '/' + ], + UTF16ToUTF8: function(str) { + var res = [], + len = str.length; + + for (var i = 0; i < len; i++) { + var code = str.charCodeAt(i); + + if (code > 0x0000 && code <= 0x007F) { + // 单字节,这里并不考虑0x0000,因为它是空字节 + // U+00000000 – U+0000007F 0xxxxxxx + res.push(str.charAt(i)); + } else if (code >= 0x0080 && code <= 0x07FF) { + // 双字节 + // U+00000080 – U+000007FF 110xxxxx 10xxxxxx + // 110xxxxx + var byte1 = 0xC0 | code >> 6 & 0x1F; // 10xxxxxx + + var byte2 = 0x80 | code & 0x3F; + res.push(String.fromCharCode(byte1), String.fromCharCode(byte2)); + } else if (code >= 0x0800 && code <= 0xFFFF) { + // 三字节 + // U+00000800 – U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxx + // 1110xxxx + var byte1 = 0xE0 | code >> 12 & 0x0F; // 10xxxxxx + + var byte2 = 0x80 | code >> 6 & 0x3F; // 10xxxxxx + + var byte3 = 0x80 | code & 0x3F; + res.push(String.fromCharCode(byte1), String.fromCharCode(byte2), String.fromCharCode( + byte3)); + } else if (code >= 0x00010000 && code <= 0x001FFFFF) { // 四字节 + // U+00010000 – U+001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + } else if (code >= 0x00200000 && code <= 0x03FFFFFF) { // 五字节 + // U+00200000 – U+03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx + } else + /** if (code >= 0x04000000 && code <= 0x7FFFFFFF)*/ + { // 六字节 + // U+04000000 – U+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx + } + } + + return res.join(''); + }, + UTF8ToUTF16: function(str) { + var res = [], + len = str.length; + var i = 0; + + for (var i = 0; i < len; i++) { + var code = str.charCodeAt(i); // 对第一个字节进行判断 + + if ((code >> 7 & 0xFF) == 0x0) { + // 单字节 + // 0xxxxxxx + res.push(str.charAt(i)); + } else if ((code >> 5 & 0xFF) == 0x6) { + // 双字节 + // 110xxxxx 10xxxxxx + var code2 = str.charCodeAt(++i); + var byte1 = (code & 0x1F) << 6; + var byte2 = code2 & 0x3F; + var utf16 = byte1 | byte2; + res.push(Sting.fromCharCode(utf16)); + } else if ((code >> 4 & 0xFF) == 0xE) { + // 三字节 + // 1110xxxx 10xxxxxx 10xxxxxx + var code2 = str.charCodeAt(++i); + var code3 = str.charCodeAt(++i); + var byte1 = code << 4 | code2 >> 2 & 0x0F; + var byte2 = (code2 & 0x03) << 6 | code3 & 0x3F; + utf16 = (byte1 & 0x00FF) << 8 | byte2; + res.push(String.fromCharCode(utf16)); + } else if ((code >> 3 & 0xFF) == 0x1E) { // 四字节 + // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + } else if ((code >> 2 & 0xFF) == 0x3E) { // 五字节 + // 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx + } else + /** if (((code >> 1) & 0xFF) == 0x7E)*/ + { // 六字节 + // 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx + } + } + + return res.join(''); + }, + encode: function(str) { + if (!str) { + return ''; + } + + var utf8 = this.UTF16ToUTF8(str); // 转成UTF8 + + var i = 0; // 遍历索引 + + var len = utf8.length; + var res = []; + + while (i < len) { + var c1 = utf8.charCodeAt(i++) & 0xFF; + res.push(this.table[c1 >> 2]); // 需要补2个= + + if (i == len) { + res.push(this.table[(c1 & 0x3) << 4]); + res.push('=='); + break; + } + + var c2 = utf8.charCodeAt(i++); // 需要补1个= + + if (i == len) { + res.push(this.table[(c1 & 0x3) << 4 | c2 >> 4 & 0x0F]); + res.push(this.table[(c2 & 0x0F) << 2]); + res.push('='); + break; + } + + var c3 = utf8.charCodeAt(i++); + res.push(this.table[(c1 & 0x3) << 4 | c2 >> 4 & 0x0F]); + res.push(this.table[(c2 & 0x0F) << 2 | (c3 & 0xC0) >> 6]); + res.push(this.table[c3 & 0x3F]); + } + + return res.join(''); + }, + decode: function(str) { + if (!str) { + return ''; + } + + var len = str.length; + var i = 0; + var res = []; + + while (i < len) { + var code1 = this.table.indexOf(str.charAt(i++)); + var code2 = this.table.indexOf(str.charAt(i++)); + var code3 = this.table.indexOf(str.charAt(i++)); + var code4 = this.table.indexOf(str.charAt(i++)); + var c1 = code1 << 2 | code2 >> 4; + var c2 = (code2 & 0xF) << 4 | code3 >> 2; + var c3 = (code3 & 0x3) << 6 | code4; + res.push(String.fromCharCode(c1)); + + if (code3 != 64) { + res.push(String.fromCharCode(c2)); + } + + if (code4 != 64) { + res.push(String.fromCharCode(c3)); + } + } + + return this.UTF8ToUTF16(res.join('')); + } +}; + +module.exports = { + HOST: HOST, + formatTime: formatTime, + formatTimeAll: formatTimeAll, + formatNumber: formatNumber, + alert: alert, + getOpenidInfo: getOpenidInfo, + request: request, + payOrder: payOrder, + isLogin: isLogin, + isNull: isNull, + phoneRegex: phoneRegex, + idCardRegex: idCardRegex, + filterSpecialChars: filterSpecialChars, + randomStr: randomStr, + weekdayArr: weekdayArr, + Base64: Base64, + orderStatusDic: orderStatusDic, + auditStatusDic: auditStatusDic, + getUserProfile: getUserProfile, + getUserInfo: getUserInfo, + toast: toast, + isValidCardID:isValidCardID, + +};