diff --git a/App.vue b/App.vue
new file mode 100644
index 0000000..b449c4b
--- /dev/null
+++ b/App.vue
@@ -0,0 +1,73 @@
+
+
\ No newline at end of file
diff --git a/androidPrivacy.json b/androidPrivacy.json
new file mode 100644
index 0000000..12df862
--- /dev/null
+++ b/androidPrivacy.json
@@ -0,0 +1,3 @@
+{
+ "prompt": "template"
+}
diff --git a/main.js b/main.js
new file mode 100644
index 0000000..ab2fc91
--- /dev/null
+++ b/main.js
@@ -0,0 +1,79 @@
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team
+// +----------------------------------------------------------------------
+import Vue from 'vue'
+import App from './App'
+import store from './store'
+import Cache from './utils/cache'
+import util from 'utils/util'
+import {
+ HTTP_REQUEST_URL
+} from '@/config/app';
+
+import uView from '@/uni_modules/uview-ui'
+Vue.use(uView)
+
+Vue.prototype.$util = util;
+Vue.prototype.$Cache = Cache;
+Vue.config.productionTip = false
+Vue.prototype.$bus = new Vue();
+// #ifdef H5
+import {
+ parseQuery
+} from "./utils";
+
+import {
+ SPREAD
+} from './config/cache';
+// import wx from '@/node_modules/jweixin-module/lib/index'
+var __s = document.createElement('script');
+__s.src = HTTP_REQUEST_URL + "/api/script";
+document.head.appendChild(__s);
+
+
+
+
+// 注册全局防抖指令
+Vue.directive('debounce', {
+ inserted: (el, binding) => {
+ let debounceTime = binding.value || 2000
+ let timer
+ el.addEventListener('click', e => {
+ el.style.pointerEvents = 'none';
+ if (!el.disabled) {
+ timer = setTimeout(() => {
+ el.style.pointerEvents = 'auto'
+ }, debounceTime)
+ }
+ }, true)
+ }
+})
+
+// if(!!!Auth.isAndroid() && Auth.isWeixin()){
+// Auth.wechat()
+// }
+
+// Auth.isWeixin() && Auth.oAuth();
+
+// #endif
+
+let appInfo = uni.getSystemInfo().then(res => {
+ Vue.prototype.$appInfo = res[1];
+});
+
+
+App.mpType = 'app'
+
+
+const app = new Vue({
+ ...App,
+ store,
+ Cache
+})
+app.$mount();
\ No newline at end of file
diff --git a/manifest.json b/manifest.json
new file mode 100644
index 0000000..b0fb733
--- /dev/null
+++ b/manifest.json
@@ -0,0 +1,216 @@
+{
+ "name" : "惠农直播",
+ "appid" : "__UNI__0E46DAD",
+ "description" : "",
+ "versionName" : "1.1.0",
+ "versionCode" : 110,
+ "transformPx" : false,
+ /* 5+App特有相关 */
+ "app-plus" : {
+ "titleNView" : true,
+ "usingComponents" : true,
+ "nvueCompiler" : "uni-app",
+ "nvueStyleCompiler" : "uni-app",
+ "compilerVersion" : 3,
+ "splashscreen" : {
+ "alwaysShowBeforeRender" : true,
+ "waiting" : true,
+ "autoclose" : true,
+ "delay" : 0
+ },
+ /* 模块配置 */
+ "modules" : {
+ "VideoPlayer" : {},
+ "iBeacon" : {},
+ "Barcode" : {},
+ "Camera" : {},
+ "Payment" : {},
+ "Share" : {},
+ "OAuth" : {},
+ "UniMP" : {
+ "description" : "uni小程序"
+ },
+ "Push" : {},
+ "LivePusher" : {}
+ },
+ "safearea" : {
+ "bottom" : {
+ "offset" : "none"
+ }
+ },
+ /* 应用发布信息 */
+ "distribute" : {
+ /* android打包配置 */
+ "android" : {
+ "resizeableActivity" : true,
+ "permissions" : [
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ],
+ "abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ],
+ "permissionExternalStorage" : {
+ "request" : "none",
+ "prompt" : "应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。"
+ },
+ "permissionPhoneState" : {
+ "request" : "none" //拨打电话权限关闭
+ }
+ },
+ /* ios打包配置 */
+ "ios" : {
+ "privacyDescription" : {
+ "NSPhotoLibraryUsageDescription" : "上传用户头像保存分享海报",
+ "NSPhotoLibraryAddUsageDescription" : "上传用户头像保存分享海报",
+ "NSCameraUsageDescription" : "上传用户头像保存分享海报",
+ "NSLocationWhenInUseUsageDescription" : "根据客户地理位置推荐最近门店",
+ "NSLocationAlwaysUsageDescription" : "根据客户地理位置推荐最近门店",
+ "NSLocationAlwaysAndWhenInUseUsageDescription" : "根据客户地理位置推荐最近门店"
+ },
+ "idfa" : false,
+ "dSYMs" : false
+ },
+ /* SDK配置 */
+ "sdkConfigs" : {
+ "maps" : {
+ "amap" : {
+ "appkey_ios" : "82af93ec51139c712c4118d84ba684ee",
+ "appkey_android" : "0799f37420c0784f1e6cba230a68bdb1"
+ }
+ },
+ "payment" : {
+ "weixin" : {
+ "__platform__" : [ "ios", "android" ],
+ "appid" : "wx9d68c92b550ddd1e",
+ "UniversalLinks" : "https://shop.lihaink.cn/"
+ }
+ },
+ "share" : {
+ "weixin" : {
+ "appid" : "wx9d68c92b550ddd1e",
+ "UniversalLinks" : "https://shop.lihaink.cn/"
+ }
+ },
+ "geolocation" : {
+ "amap" : {
+ "__platform__" : [ "ios", "android" ],
+ "appkey_ios" : "82af93ec51139c712c4118d84ba684ee",
+ "appkey_android" : "0799f37420c0784f1e6cba230a68bdb1"
+ }
+ },
+ "oauth" : {},
+ "ad" : {},
+ "push" : {}
+ },
+ "icons" : {
+ "android" : {
+ "hdpi" : "",
+ "xhdpi" : "",
+ "xxhdpi" : "",
+ "xxxhdpi" : ""
+ },
+ "ios" : {
+ "appstore" : "",
+ "ipad" : {
+ "app" : "",
+ "app@2x" : "",
+ "notification" : "",
+ "notification@2x" : "",
+ "proapp@2x" : "",
+ "settings" : "",
+ "settings@2x" : "",
+ "spotlight" : "",
+ "spotlight@2x" : ""
+ },
+ "iphone" : {
+ "app@2x" : "",
+ "app@3x" : "",
+ "notification@2x" : "",
+ "notification@3x" : "",
+ "settings@2x" : "",
+ "settings@3x" : "",
+ "spotlight@2x" : "",
+ "spotlight@3x" : ""
+ }
+ }
+ },
+ "splashscreen" : {
+ "useOriginalMsgbox" : true
+ }
+ },
+ "nativePlugins" : {}
+ },
+ /* 快应用特有相关 */
+ "quickapp" : {},
+ /* 小程序特有相关 */
+ "mp-weixin" : {
+ "appid" : "wxfb4695444ab8d0d0",
+ "setting" : {
+ "urlCheck" : false,
+ "minified" : true,
+ "postcss" : true,
+ "es6" : true
+ },
+ "permission" : {
+ "scope.userLocation" : {
+ "desc" : "获取您的位置"
+ }
+ },
+ "requiredPrivateInfos" : [ "getLocation", "chooseAddress" ],
+ "usingComponents" : true
+ },
+ "mp-alipay" : {
+ "usingComponents" : true
+ },
+ "mp-baidu" : {
+ "usingComponents" : true
+ },
+ "mp-toutiao" : {
+ "usingComponents" : true
+ },
+ "h5" : {
+ "devServer" : {
+ "https" : false
+ },
+ "router" : {
+ "mode" : "history",
+ "base" : ""
+ },
+ "domain" : "",
+ "sdkConfigs" : {
+ "maps" : {
+ "qqmap" : {
+ "key" : "SMJBZ-WCHK4-ZPZUA-DSIXI-XDDVQ-XWFX7"
+ }
+ }
+ },
+ "title" : "加载中...",
+ "template" : "template.html"
+ }
+}
+//拨打电话权限关闭
+/* ios打包配置 */
+
diff --git a/pages.json b/pages.json
new file mode 100644
index 0000000..23b3db5
--- /dev/null
+++ b/pages.json
@@ -0,0 +1,55 @@
+{
+ "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+ {
+ "path": "pages/room/room_list",
+ "style": {
+ "navigationBarTitleText": "直播列表"
+ // "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/room/create_room",
+ "style": {
+ "navigationBarTitleText": "创建直播间"
+
+
+ }
+ },
+ {
+ "path": "pages/live/anchor",
+ "style": {
+ "navigationBarTitleText": "",
+ "navigationStyle": "custom"
+
+ }
+ },
+ {
+ "path": "pages/live/spectator",
+ "style": {
+ "navigationBarTitleText": "观众直播间",
+ "navigationStyle": "custom"
+ }
+ },{
+ "path": "pages/live/histroyroom",
+ "style": {
+ "navigationBarTitleText": "历史直播间",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/login/login",
+ "style": {
+ "navigationBarTitleText": "登录",
+ "navigationStyle": "custom"
+ }
+ }
+
+ ],
+ "globalStyle": {
+ "navigationBarTextStyle": "black",
+ "navigationBarTitleText": "uni-app",
+ "navigationBarBackgroundColor": "#F8F8F8",
+ "backgroundColor": "#F8F8F8"
+ },
+ "uniIdRouter": {}
+}
diff --git a/project.private.config.json b/project.private.config.json
new file mode 100644
index 0000000..ff905cb
--- /dev/null
+++ b/project.private.config.json
@@ -0,0 +1,9 @@
+{
+ "libVersion": "2.32.1",
+ "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
+ "projectname": "nk-shop2.0",
+ "setting": {
+ "compileHotReLoad": true,
+ "urlCheck": false
+ }
+}
\ No newline at end of file
diff --git a/sitemap.json b/sitemap.json
new file mode 100644
index 0000000..52f2d27
--- /dev/null
+++ b/sitemap.json
@@ -0,0 +1,6 @@
+{
+ "rules": [{
+ "action": "allow",
+ "page": "*"
+ }]
+}
\ No newline at end of file
diff --git a/template.html b/template.html
new file mode 100644
index 0000000..50798a8
--- /dev/null
+++ b/template.html
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+ <%= htmlWebpackPlugin.options.title %>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni.scss b/uni.scss
new file mode 100644
index 0000000..45776b4
--- /dev/null
+++ b/uni.scss
@@ -0,0 +1,78 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+@import '@/uni_modules/uview-ui/theme.scss';
+/* 颜色变量 */
+$uni-theme-color: #f45846;
+$uni-theme-bg-color: linear-gradient(180deg, #f98649 0%, #f34e45 100%);
+
+/* 行为相关颜色 */
+$uni-color-primary: #007aff;
+$uni-color-success: #4cd964;
+$uni-color-warning: #f0ad4e;
+$uni-color-error: #dd524d;
+
+$uni-nothing-text: #999; //空白页文字
+
+$theme-color: #e93323;
+$theme-color-opacity: rgba(233, 51, 35, 0.6);
+$bg-star: #f62c2c;
+$bg-end: #f96e29;
+
+/* 背景颜色 */
+$uni-bg-color: #ffffff;
+$uni-bg-color-grey: #f8f8f8;
+$uni-bg-color-hover: #f1f1f1; //点击状态颜色
+$uni-bg-color-mask: rgba(0, 0, 0, 0.4); //遮罩颜色
+
+/* 边框颜色 */
+$uni-border-color: #c8c7cc;
+
+/* 尺寸变量 */
+
+/* 文字尺寸 */
+$uni-font-size-sm: 24upx;
+$uni-font-size-base: 28upx;
+$uni-font-size-lg: 32upx;
+
+/* 图片尺寸 */
+$uni-img-size-sm: 40upx;
+$uni-img-size-base: 52upx;
+$uni-img-size-lg: 80upx;
+
+/* Border Radius */
+$uni-border-radius-sm: 4upx;
+$uni-border-radius-base: 6upx;
+$uni-border-radius-lg: 12upx;
+$uni-border-radius-circle: 50%;
+
+/* 水平间距 */
+$uni-spacing-row-sm: 10px;
+$uni-spacing-row-base: 20upx;
+$uni-spacing-row-lg: 30upx;
+
+/* 垂直间距 */
+$uni-spacing-col-sm: 8upx;
+$uni-spacing-col-base: 16upx;
+$uni-spacing-col-lg: 24upx;
+
+/* 透明度 */
+$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
+
+/* 文章场景相关 */
+$uni-color-title: #2c405a; // 文章标题颜色
+$uni-font-size-title: 40upx;
+$uni-color-subtitle: #555555; // 二级标题颜色
+$uni-font-size-subtitle: 36upx;
+$uni-color-paragraph: #3f536e; // 文章段落颜色
+$uni-font-size-paragraph: 30upx;
diff --git a/utils/cache.js b/utils/cache.js
new file mode 100644
index 0000000..f4e5c3c
--- /dev/null
+++ b/utils/cache.js
@@ -0,0 +1,155 @@
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team
+// +----------------------------------------------------------------------
+import { EXPIRE } from '../config/app';
+
+class Cache {
+
+ constructor(handler) {
+ this.cacheSetHandler = uni.setStorageSync;
+ this.cacheGetHandler = uni.getStorageSync;
+ this.cacheClearHandler = uni.removeStorageSync;
+ this.cacheExpire = '_expire_2019_12_17_18_44';
+ }
+
+ /**
+ * 获取当前时间戳
+ */
+ time()
+ {
+ return Math.round(new Date() / 1000);
+ }
+
+ /**
+ * 设置过期时间缓存
+ * @param {Object} key
+ * @param {Object} expire
+ */
+ setExpireCahe(key,expire)
+ {
+ expire = expire !== undefined ? expire : EXPIRE;
+ if (expire) {
+ this.cacheSetHandler(key + this.cacheExpire,this.time() + expire)
+ }
+ }
+
+ /**
+ * 缓存是否过期,过期自动删除
+ * @param {Object} key
+ * @param {Object} $bool true = 删除,false = 不删除
+ */
+ getExpireCahe(key,$bool)
+ {
+ try{
+ let time = this.cacheGetHandler(key + this.cacheExpire);
+ if (time) {
+ let newTime = parseInt(time);
+ if (time && time < this.time() && !Number.isNaN(newTime)) {
+ if ($bool === undefined || $bool === true) {
+ this.cacheClearHandler(key);
+ this.cacheClearHandler(key + this.cacheExpire);
+ }
+ return false;
+ } else
+ return true;
+ } else {
+ return !!this.cacheGetHandler(key);
+ }
+ }catch(e){
+ return false;
+ }
+ }
+
+ /**
+ * 设置缓存
+ * @param {Object} key
+ * @param {Object} data
+ */
+ set(key,data,expire){
+ if(typeof data === 'object')
+ data = JSON.stringify(data);
+ try{
+ this.setExpireCahe(key,expire);
+ return this.cacheSetHandler(key,data);
+ }catch(e){
+ return false;
+ }
+ }
+
+ /**
+ * 检测缓存是否存在
+ * @param {Object} key
+ */
+ has(key)
+ {
+ return this.getExpireCahe(key);
+ }
+
+ /**
+ * 获取缓存
+ * @param {Object} key
+ * @param {Object} $default
+ * @param {Object} expire
+ */
+ get(key,$default,expire){
+ try{
+ let isBe = this.getExpireCahe(key);
+ let data = this.cacheGetHandler(key);
+ if (data && isBe) {
+ if (typeof $default === 'boolean')
+ return JSON.parse(data);
+ else
+ return data;
+ } else {
+ if (typeof $default === 'function') {
+ let value = $default();
+ this.set(key,value,expire);
+ return value;
+ } else {
+ this.set(key,$default,expire);
+ return $default;
+ }
+ }
+ }catch(e){
+ return null;
+ }
+ }
+
+ /**
+ * 删除缓存
+ * @param {Object} key
+ */
+ clear(key)
+ {
+ try{
+ let cahceValue = this.cacheGetHandler(key + this.cacheExpire);
+ if(cahceValue)
+ this.cacheClearHandler(key + this.cacheExpire);
+ return this.cacheClearHandler(key);
+ }catch(e){
+ return false;
+ }
+ }
+
+ /**
+ * 清除过期缓存
+ */
+ clearOverdue()
+ {
+ // let cacheList = uni.getStorageInfoSync(),that = this;
+ // if (typeof cacheList.keys === 'object'){
+ // cacheList.keys.forEach(item=>{
+ // that.getExpireCahe(item);
+ // })
+ // }
+ }
+}
+
+
+export default new Cache;
\ No newline at end of file
diff --git a/utils/dayjs.min.js b/utils/dayjs.min.js
new file mode 100644
index 0000000..47ebdde
--- /dev/null
+++ b/utils/dayjs.min.js
@@ -0,0 +1 @@
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.dayjs=e()}(this,function(){"use strict";var t="millisecond",e="second",n="minute",r="hour",i="day",s="week",u="month",o="quarter",a="year",h=/^(\d{4})-?(\d{1,2})-?(\d{0,2})[^0-9]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?.?(\d{1,3})?$/,f=/\[([^\]]+)]|Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,c=function(t,e,n){var r=String(t);return!r||r.length>=e?t:""+Array(e+1-r.length).join(n)+t},d={s:c,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?"+":"-")+c(r,2,"0")+":"+c(i,2,"0")},m:function(t,e){var n=12*(e.year()-t.year())+(e.month()-t.month()),r=t.clone().add(n,u),i=e-r<0,s=t.clone().add(n+(i?-1:1),u);return Number(-(n+(e-r)/(i?r-s:s-r))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(h){return{M:u,y:a,w:s,d:i,D:"date",h:r,m:n,s:e,ms:t,Q:o}[h]||String(h||"").toLowerCase().replace(/s$/,"")},u:function(t){return void 0===t}},$={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_")},l="en",m={};m[l]=$;var y=function(t){return t instanceof v},M=function(t,e,n){var r;if(!t)return l;if("string"==typeof t)m[t]&&(r=t),e&&(m[t]=e,r=t);else{var i=t.name;m[i]=t,r=i}return!n&&r&&(l=r),r||!n&&l},g=function(t,e){if(y(t))return t.clone();var n="object"==typeof e?e:{};return n.date=t,n.args=arguments,new v(n)},D=d;D.l=M,D.i=y,D.w=function(t,e){return g(t,{locale:e.$L,utc:e.$u,$offset:e.$offset})};var v=function(){function c(t){this.$L=this.$L||M(t.locale,null,!0),this.parse(t)}var d=c.prototype;return d.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(D.u(e))return new Date;if(e instanceof Date)return new Date(e);if("string"==typeof e&&!/Z$/i.test(e)){var r=e.match(h);if(r)return n?new Date(Date.UTC(r[1],r[2]-1,r[3]||1,r[4]||0,r[5]||0,r[6]||0,r[7]||0)):new Date(r[1],r[2]-1,r[3]||1,r[4]||0,r[5]||0,r[6]||0,r[7]||0)}return new Date(e)}(t),this.init()},d.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},d.$utils=function(){return D},d.isValid=function(){return!("Invalid Date"===this.$d.toString())},d.isSame=function(t,e){var n=g(t);return this.startOf(e)<=n&&n<=this.endOf(e)},d.isAfter=function(t,e){return g(t){
+ i[v] = () => Store.getters.globalData[v];
+ return i;
+ }, init || {})
+ }else{
+ return Object.keys(args).reduce((i, v)=>{
+ i[v] = () => {
+ const val = Store.getters.globalData[v];
+ return (val === undefined || val === null || val === '') ? args[v] : val;
+ };
+ return i;
+ }, init || {})
+ }
+}
+
+export function redirect(url){
+ uni.switchTab({
+ url,
+ fail(){
+ uni.redirectTo({
+ url
+ })
+ }
+ })
+}
+
+/**
+ * 转换商户跳转链接, 自动追加商户 id
+ * @param {string} path
+ * @param {int} mer_id
+ * @param {string} name 商户id 参数名, 默认 mer_id
+ */
+export function merPath(path, mer_id, name){
+ if(!mer_id) return path;
+ path += ((path.indexOf('?') > -1 ? '&' : '?') + (name || 'mer_id') + '=' + mer_id);
+ return path;
+}
+
+/**
+ * 绑定用户授权
+ * @param {Object} puid
+ */
+export function silenceBindingSpread() {
+
+ //#ifdef H5
+ let puid = Cache.get('spread');
+ //#endif
+
+ //#ifdef MP || APP-PLUS
+ let puid = getApp().globalData.spid;
+ if (!puid) {
+ puid = getApp().globalData.code;
+ }
+ //#endif
+
+ puid = parseInt(puid);
+ if (Number.isNaN(puid)) {
+ puid = 0;
+ }
+ if (puid) {
+
+ //#ifdef H5
+ Cache.clear('spread');
+ //#endif
+
+ //#ifdef MP || APP-PLUS
+ getApp().globalData.spid = 0;
+ getApp().globalData.code = 0;
+ //#endif
+
+
+ }
+}
+
+export function isWeixin() {
+ return navigator.userAgent.toLowerCase().indexOf("micromessenger") !== -1;
+}
+
+export function parseQuery() {
+ const res = {};
+
+ const query = (location.href.split("?")[1] || "")
+ .trim()
+ .replace(/^(\?|#|&)/, "");
+
+ if (!query) {
+ return res;
+ }
+ // const VUE_APP_WS_URL = process.env.VUE_APP_WS_URL || `ws://${location.hostname}:20003`;
+ // const ishttps = 'https:' == document.location.protocol ? true : false;
+ // const VUE_APP_WS_URL = ishttps ? `wss://mer.crmeb.net?type=user&token=${token}` : `ws://mer.crmeb.net?type=user&token=${token}`;
+ // export { VUE_APP_WS_URL }
+
+
+ query.split("&").forEach(param => {
+ const parts = param.replace(/\+/g, " ").split("=");
+ const key = decodeURIComponent(parts.shift());
+ const val = parts.length > 0 ? decodeURIComponent(parts.join("=")) : null;
+
+ if (res[key] === undefined) {
+ res[key] = val;
+ } else if (Array.isArray(res[key])) {
+ res[key].push(val);
+ } else {
+ res[key] = [res[key], val];
+ }
+ });
+
+ return res;
+}
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team
+// +----------------------------------------------------------------------
+let token = ''
+try {
+ token = uni.getStorageSync('LOGIN_STATUS_TOKEN')
+ // console.log(token, 'this')
+} catch (error) {
+
+}
+// const VUE_APP_WS_URL = process.env.VUE_APP_WS_URL || `ws://${location.hostname}?type=user&token=${token}`;
+// const VUE_APP_WS_URL = `wss://mer.crmeb.net?type=user&token=${token}`
+export default parseQuery;
diff --git a/utils/request.js b/utils/request.js
new file mode 100644
index 0000000..583102e
--- /dev/null
+++ b/utils/request.js
@@ -0,0 +1,76 @@
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team
+// +----------------------------------------------------------------------
+import {
+ HTTP_REQUEST_URL_ONE,
+ HEADER,
+ TOKENNAME
+} from '@/config/app';
+import store from '../store';
+
+
+/**
+ * 发送请求
+ */
+function baseRequest(url, method, data, {
+ noAuth = false,
+ noVerify = false
+}) {
+ let Url = HTTP_REQUEST_URL_ONE,
+ header = HEADER;
+
+
+
+ if (store.state.app.token) header[TOKENNAME] = 'Bearer ' + store.state.app.token;
+
+ return new Promise((reslove, reject) => {
+ uni.request({
+ url: Url + '/api/' + url,
+ method: method || 'GET',
+ header: header,
+ data: data || {},
+ success: (res) => {
+ // #ifdef APP-PLUS
+ // console.log('app', Url + '/api/' + url, method);
+ // #endif
+ if (noVerify)
+ reslove(res.data, res);
+ else if (res.data.status == 200)
+ reslove(res.data, res);
+ else if ([410000, 410001, 410002, 40000].indexOf(res.data.status) !== -1) {
+
+ reject(res.data);
+ } else if (res.data.code==0||res.data.code==1) {
+
+ reslove(res.data, res);
+ }else if (res.data.status == 501) {
+ uni.reLaunch({
+ url: '/pages/error/index'
+ })
+ reject(res.data);
+ } else
+ reject(res.data.message || '系统错误');
+ },
+ fail: (message) => {
+ console.log(url, method, data)
+ reject('请求失败',message);
+ }
+ })
+ });
+}
+
+const request = {};
+
+['options', 'get', 'post', 'put', 'head', 'delete', 'trace', 'connect'].forEach((method) => {
+ request[method] = (api, data, opt) => baseRequest(api, method, data, opt || {})
+});
+
+
+
+export default request;
\ No newline at end of file
diff --git a/utils/requesta.js b/utils/requesta.js
new file mode 100644
index 0000000..09907d2
--- /dev/null
+++ b/utils/requesta.js
@@ -0,0 +1,70 @@
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team
+// +----------------------------------------------------------------------
+import {
+ HTTP_REQUEST_URL,
+ HEADER,
+ TOKENNAME
+} from '@/config/app';
+import store from '../store';
+
+
+/**
+ * 发送请求
+ */
+function baseRequest(url, method, data, {
+ noAuth = false,
+ noVerify = false
+}) {
+ let Url = HTTP_REQUEST_URL,
+ header = HEADER;
+
+ if (store.state.app.token) header[TOKENNAME] = 'Bearer ' + store.state.app.token;
+
+ return new Promise((reslove, reject) => {
+ uni.request({
+ url: Url + '/api/' + url,
+ method: method || 'GET',
+ header: header,
+ data: data || {},
+ success: (res) => {
+ // #ifdef APP-PLUS
+ // console.log('app', Url + '/api/' + url, method);
+ // #endif
+ if (noVerify)
+ reslove(res.data, res);
+ else if (res.data.status == 200)
+ reslove(res.data, res);
+ else if ([410000, 410001, 410002, 40000].indexOf(res.data.status) !== -1) {
+
+ reject(res.data);
+ } else if (res.data.code==0||res.data.code==1) {
+ reslove(res.data, res);
+ }else if (res.data.status == 501) {
+ reject(res.data);
+ } else
+ reject(res.data.message || '系统错误');
+ },
+ fail: (message) => {
+ console.log(url, method, data)
+ reject('请求失败',message);
+ }
+ })
+ });
+}
+
+const request = {};
+
+['options', 'get', 'post', 'put', 'head', 'delete', 'trace', 'connect'].forEach((method) => {
+ request[method] = (api, data, opt) => baseRequest(api, method, data, opt || {})
+});
+
+
+
+export default request;
\ No newline at end of file
diff --git a/utils/util.js b/utils/util.js
new file mode 100644
index 0000000..1fe09f3
--- /dev/null
+++ b/utils/util.js
@@ -0,0 +1,192 @@
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team
+// +----------------------------------------------------------------------
+import {
+ TOKENNAME,
+ HTTP_REQUEST_URL
+} from '../config/app.js';
+
+export default {
+ /*
+ * 合并数组
+ */
+ SplitArray(list, sp) {
+ if (typeof list != 'object') return [];
+ if (sp === undefined) sp = [];
+ for (var i = 0; i < list.length; i++) {
+ sp.push(list[i]);
+ }
+ return sp;
+ },
+ /**
+ * opt object | string
+ * to_url object | string
+ * 例:
+ * this.Tips('/pages/test/test'); 跳转不提示
+ * this.Tips({title:'提示'},'/pages/test/test'); 提示并跳转
+ * this.Tips({title:'提示'},{tab:1,url:'/pages/index/index'}); 提示并跳转值table上
+ * tab=1 一定时间后跳转至 table上
+ * tab=2 一定时间后跳转至非 table上
+ * tab=3 一定时间后返回上页面
+ * tab=4 关闭所有页面跳转至非table上
+ * tab=5 关闭当前页面跳转至table上
+ */
+ Tips: function(opt, to_url) {
+ if (typeof opt == 'string') {
+ to_url = opt;
+ opt = {};
+ }
+ let title = opt.title || '',
+ icon = opt.icon || 'none',
+ endtime = opt.endtime || 2000,
+ success = opt.success;
+ if (title) uni.showToast({
+ title: title,
+ icon: icon,
+ duration: endtime,
+ success
+ })
+ if (to_url != undefined) {
+ if (typeof to_url == 'object') {
+ let tab = to_url.tab || 1,
+ url = to_url.url || '';
+ switch (tab) {
+ case 1:
+ //一定时间后跳转至 table
+ setTimeout(function() {
+ uni.switchTab({
+ url: url
+ })
+ }, endtime);
+ break;
+ case 2:
+ //跳转至非table页面
+ setTimeout(function() {
+ uni.navigateTo({
+ url: url,
+ })
+ }, endtime);
+ break;
+ case 3:
+ //返回上页面
+ setTimeout(function() {
+ // #ifndef H5
+ uni.navigateBack({
+ delta: parseInt(url),
+ })
+ // #endif
+ // #ifdef H5
+ history.back();
+ // #endif
+ }, endtime);
+ break;
+ case 4:
+ //关闭当前所有页面跳转至非table页面
+ setTimeout(function() {
+ uni.reLaunch({
+ url: url,
+ })
+ }, endtime);
+ break;
+ case 5:
+ //关闭当前页面跳转至非table页面
+ setTimeout(function() {
+ uni.redirectTo({
+ url: url,
+ })
+ }, endtime);
+ break;
+ }
+
+ } else if (typeof to_url == 'function') {
+ setTimeout(function() {
+ to_url && to_url();
+ }, endtime);
+ } else {
+ //没有提示时跳转不延迟
+ setTimeout(function() {
+ uni.navigateTo({
+ url: to_url,
+ })
+ }, title ? endtime : 0);
+ }
+ }
+ },
+ /*
+ * 单图上传
+ * @param object opt
+ * @param callable successCallback 成功执行方法 data
+ * @param callable errorCallback 失败执行方法
+ */
+ uploadImageOne: function(opt, successCallback, errorCallback) {
+ let that = this;
+ if (typeof opt === 'string') {
+ let url = opt;
+ opt = {};
+ opt.url = url;
+ }
+ let count = opt.count || 1,
+ sizeType = opt.sizeType || ['compressed'],
+ sourceType = opt.sourceType || ['album', 'camera'],
+ is_load = opt.is_load || true,
+ uploadUrl = opt.url || '',
+ inputName = opt.name || 'field';
+ uni.chooseImage({
+ count: count, //最多可以选择的图片总数
+ sizeType: sizeType, // 可以指定是原图还是压缩图,默认二者都有
+ sourceType: sourceType, // 可以指定来源是相册还是相机,默认二者都有
+ success: function(res) {
+ //启动上传等待中...
+ uni.showLoading({
+ title: '图片上传中',
+ });
+ uni.uploadFile({
+ url: HTTP_REQUEST_URL + '/api/' + uploadUrl + '/' + inputName,
+ filePath: res.tempFilePaths[0],
+ name: inputName,
+ formData: {
+ 'filename': inputName
+ },
+ header: {
+ // #ifdef MP
+ "Content-Type": "multipart/form-data",
+ // #endif
+ [TOKENNAME]: 'Bearer ' + uni.getStorageSync('APP_token')
+ },
+ success: function(res) {
+ uni.hideLoading();
+ if (res.statusCode == 403) {
+ that.Tips({
+ title: res.data
+ });
+ } else {
+ let data = res.data ? JSON.parse(res.data) : {};
+ if (data.status == 200) {
+ successCallback && successCallback(data)
+ } else {
+ errorCallback && errorCallback(data);
+ that.Tips({
+ title: data.message
+ });
+ }
+ }
+ },
+ fail: function(res) {
+ uni.hideLoading();
+ that.Tips({
+ title: '上传图片失败'
+ });
+ }
+ })
+ }
+ })
+ }
+
+
+}
diff --git a/utils/validate.js b/utils/validate.js
new file mode 100644
index 0000000..e07b0a4
--- /dev/null
+++ b/utils/validate.js
@@ -0,0 +1,47 @@
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team
+// +----------------------------------------------------------------------
+/**
+ * 验证小数点后两位及多个小数
+ * money 金额
+ */
+
+export function isMoney(money) {
+ var reg = /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/
+ if (reg.test(money)) {
+ return true
+ } else {
+ return false
+ }
+}
+
+/**
+ * 验证手机号码
+ */
+export function checkPhone(phone) {
+ var reg = /^1(3|4|5|6|7|8|9)\d{9}$/
+ if (reg.test(phone)) {
+ return true
+ } else {
+ return false
+ }
+}
+
+
+/**
+ * 验证邮箱
+ */
+export function isEmailAvailable(emailInput) {
+ var myreg = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;
+ if (!myreg.test(emailInput)) {
+ return false;
+ } else {
+ return true;
+ }
+}
diff --git a/vue.config.js b/vue.config.js
new file mode 100644
index 0000000..3612e93
--- /dev/null
+++ b/vue.config.js
@@ -0,0 +1,11 @@
+module.exports = {
+ productionSourceMap: false, // 生产打包时不输出map文件,增加打包速度
+ configureWebpack: config => {
+ if (process.env.NODE_ENV === 'production') {
+ config.optimization.minimizer[0].options.terserOptions.compress.warnings = false
+ config.optimization.minimizer[0].options.terserOptions.compress.drop_console = true
+ config.optimization.minimizer[0].options.terserOptions.compress.drop_debugger = true
+ config.optimization.minimizer[0].options.terserOptions.compress.pure_funcs = ['console.log']
+ }
+ }
+}