diff --git a/api/knowledge.js b/api/knowledge.js
index 040f275..29e6966 100644
--- a/api/knowledge.js
+++ b/api/knowledge.js
@@ -62,7 +62,7 @@ export function enterStudyList(data) {
* 获取榜单打榜进度
*/
export function myProgress(data) {
- return request.get("/StudyList/myProgress?studyListId="+data);
+ return request.get("/StudyList/myProgress",data);
}
/**
@@ -72,6 +72,13 @@ export function studyListPublish(data) {
return request.post("/StudyList/studyListPublish",data);
}
+/**
+ * 补卡打榜分享
+ */
+export function studyListRepublish(data) {
+ return request.post("/StudyList/studyListRepublish",data);
+}
+
/**
* 发布打榜点赞
*/
@@ -104,14 +111,14 @@ export function getCourseDetail(data) {
* 报名
*/
export function enterCourse(data) {
- return request.post("/user/enterCourse",data);
+ return request.post("/lession/enterCourse",data);
}
/**
* 课程扫码签到
*/
export function signCourse(data) {
- return request.get("/user/signCourse?courseId="+data);
+ return request.get("/lession/signCourse?lessionId="+data);
}
/**
diff --git a/api/user.js b/api/user.js
index 885a438..f418ddc 100644
--- a/api/user.js
+++ b/api/user.js
@@ -1,5 +1,16 @@
import request from '@/utils/request'
+
+/**
+ * 获取我参与的课程和学习榜
+ */
+export function myLession(data) {
+ return request.get('/user/myLession', data, {
+ // return request.get("/citys", data, {
+ login: true,
+ })
+}
+
/**
* 省市区
*/
@@ -439,7 +450,7 @@ export function getRechargeApi() {
* 获取我的课程列表
* */
export function getMyCourseList(q) {
- return request.get('/Course/listCoursesByMemberId?type='+q)
+ return request.get('/lession/myLessionList?type='+q)
}
/*
@@ -461,3 +472,24 @@ export function integral(q) {
export function signIntegral(q) {
return request.post('/sign/integral')
}
+
+/*
+ * 获取我的团队
+ * */
+export function getMyTeam(){
+ return request.post('user/myTeam')
+}
+
+/*
+ * 提现
+ * */
+export function cash(data){
+ return request.post('extract/cash',data)
+}
+
+/*
+ * 绑定银行卡
+ * */
+export function bingCard(data){
+ return request.post('userBank/saveBankInfo',data)
+}
\ No newline at end of file
diff --git a/components/ProductConSwiper.vue b/components/ProductConSwiper.vue
index fb3a1dd..5051d35 100644
--- a/components/ProductConSwiper.vue
+++ b/components/ProductConSwiper.vue
@@ -3,11 +3,14 @@
-
+
@@ -16,7 +19,7 @@
-->
- {{ currents || 1 }}/{{ imgUrls.length || 1 }}
+
+
\ No newline at end of file
diff --git a/components/ProductWindow.vue b/components/ProductWindow.vue
index f8d87bd..117fcde 100644
--- a/components/ProductWindow.vue
+++ b/components/ProductWindow.vue
@@ -140,6 +140,6 @@ export default {
diff --git a/components/sSwiper.vue b/components/sSwiper.vue
new file mode 100644
index 0000000..823793c
--- /dev/null
+++ b/components/sSwiper.vue
@@ -0,0 +1,95 @@
+
+
+
+
+
+ {{item.title}}
+ {{item.synopsis}}
+
+
+
+
+
+
+
+
diff --git a/components/uni-easyinput/common.js b/components/uni-easyinput/common.js
index df9abe1..1c2ae54 100644
--- a/components/uni-easyinput/common.js
+++ b/components/uni-easyinput/common.js
@@ -8,9 +8,10 @@ export const debounce = function(func, wait = 1000, immediate = true) {
let timer;
console.log(1);
return function() {
- console.log(123);
+ console.log(timer,'timer');
let context = this,
args = arguments;
+ console.log(args,'argsargs')
if (timer) clearTimeout(timer);
if (immediate) {
let callNow = !timer;
diff --git a/config/index.js b/config/index.js
index 89a11db..ba3e051 100644
--- a/config/index.js
+++ b/config/index.js
@@ -1,9 +1,10 @@
// export const VUE_APP_API_URL = 'http://natapp.xinxintuan.co/api';
// export const VUE_APP_API_URL = 'https://wxapi.yixiang.co/api'
// export const VUE_APP_API_URL = 'http://192.168.0.112:8088/api'
-export const VUE_APP_API_URL = 'http://192.168.68.126:8088/api'
-// export const VUE_APP_API_URL = 'https://www.cyjyyjy.com/api'
+// export const VUE_APP_API_URL = 'http://192.168.68.126:8088/api'
+export const VUE_APP_API_URL = 'https://www.cyjyyjy.com/api'
// export const VUE_APP_API_URL = 'http://natapp.xinxintuan.co/api';
// export const VUE_APP_API_URL = 'https://thapi.xinxintuan.co/api'
// export const VUE_APP_API_URL = 'https://h5api.xinxintuan.co/api';
-// export const VUE_APP_API_URL = 'https://h5api.xinxintuan.co/api';
\ No newline at end of file
+// export const VUE_APP_API_URL = 'https://h5api.xinxintuan.co/api';
+export const VUE_APP_RESOURCES_URL = 'https://h5.yixiang.co/static'
\ No newline at end of file
diff --git a/main.js b/main.js
index af82e52..c976ced 100644
--- a/main.js
+++ b/main.js
@@ -40,6 +40,7 @@ Object.defineProperty(Vue.prototype, '$yroute', {
})
Vue.prototype.$VUE_APP_API_URL = VUE_APP_API_URL
+Vue.prototype.$VUE_APP_RESOURCES_URL = VUE_APP_RESOURCES_URL
Vue.component('cu-custom', cuCustom)
let deviceType = ''
diff --git a/pages.json b/pages.json
index 580e7be..8dc7a40 100644
--- a/pages.json
+++ b/pages.json
@@ -11,6 +11,12 @@
"style": {
"navigationBarTitleText": "微信授权"
}
+ },
+ {
+ "path": "pages/authorization/agreementPage",
+ "style": {
+ "navigationBarTitleText": "用户协议"
+ }
},
// {
// "path": "pages/user/Login/index",
@@ -50,20 +56,6 @@
"enablePullDownRefresh": true
}
},
- // {
- // "path": "pages/diandeng/index",
- // "style": {
- // "navigationBarTitleText": "",
- // "navigationStyle": "custom"
- // }
- // },
- // {
- // "path": "pages/diandeng/lighting",
- // "style": {
- // "navigationBarTitleText": "",
- // "navigationStyle": "custom"
- // }
- // },
{
"path": "pages/course/index",
"style": {
@@ -305,7 +297,34 @@
// "navigationBarTitleText": "商家订单统计"
// }
// }
- ],
+ ,{
+ "path" : "pages/user/myTeam/index",
+ "style" :
+ {
+ "navigationBarTitleText": "我的团队",
+ "enablePullDownRefresh": true
+ }
+
+ }
+ ,{
+ "path" : "pages/user/cashOut/index",
+ "style" :
+ {
+ "navigationBarTitleText": "提现",
+ "enablePullDownRefresh": false
+ }
+
+ }
+ ,{
+ "path" : "pages/user/bindCard/index",
+ "style" :
+ {
+ "navigationBarTitleText": "绑定银行卡",
+ "enablePullDownRefresh": false
+ }
+
+ }
+ ],
"subPackages": [
{
"root": "pagesB",
diff --git a/pages/Loading/index.vue b/pages/Loading/index.vue
index 3ab16d8..c5d46fd 100644
--- a/pages/Loading/index.vue
+++ b/pages/Loading/index.vue
@@ -1,7 +1,7 @@
-
+
@@ -23,13 +23,12 @@ export default {
return {}
},
onShow() {
- console.log('getUser',this.userInfo)
var url = handleQrCode()
if (!url) {
url = handleUrlParam(getCurrentPageUrlWithArgs())
}
- console.log(url)
- console.log('判断是否是分销')
+ // console.log(url)
+ // console.log('判断是否是分销')
// 判断是否是分销
if (url) {
let urlSpread = parseInt(url.spread)
@@ -109,7 +108,8 @@ export default {
}
#lottie {
- width: 35%;
+ width: 42rpx;
+ height: 42rpx;
display: block;
overflow: hidden;
transform: translate3d(0, 0, 0);
diff --git a/pages/authorization/agreementPage.vue b/pages/authorization/agreementPage.vue
new file mode 100644
index 0000000..df84492
--- /dev/null
+++ b/pages/authorization/agreementPage.vue
@@ -0,0 +1,162 @@
+
+
+ 用户协议:
+ 本隐私政策介绍本公司的隐私数据相关政策和惯例,这将涵盖我们如何收集、使用、处理、存储和/或披露那些通过本公司的移动App收集的关于您的个人信息。请你仔细阅读我们的隐私政策。
+ 一、本公司如何收集您的个人信息
+ 个人信息是可用于唯一地识别或联系某人的数据。
+ 当您使用本公司的系统,注册用户过程中我们将会收集您的个人信息,如:电子邮件地址、电话号码。为了保护个人隐私,您不应提供除本公司特别要求之外的任何其它信息。
+ 二、本公司如何使用您的个人信息
+ 1、通过您的个人信息,向您发送本公司移动App的服务信息。
+ 2、通过您的个人信息实现密码找回功能。
+ 3、除本公司发生重组、合并或出售,可将我们收集的一切个人信息转让给相关第三方外,本公司不会向任何无关第三方提供、出售、出租、分享或交易您的个人信息,除非事先得到您的许可,或该第三方和本公司单独或共同为您提供服务,且在该服务结束后,其将被禁止访问包括其以前能够访问的所有这些信息。
+ 三、个人信息安全
+ 保证您的个人数据的安全对我们来说至关重要。当您在本公司的移动App中注册输入个人数据时,我们会利用安全套接字层技术 (SSL) 对这些信息进行加密。
+ 在数据传输和数据保管两个阶段里,我们会通过广为接受的行业标准(如防火墙、加密和数据隐私法律要求)来保护您向我们提交的信息。
+ 然而,没有任何一种互联网传输或电子存储方法是100%安全的。因此,尽管我们通过商业上可接受的方式来保护您的个人信息,但仍无法保证信息的绝对安全。
+ 四、本公司会将个人信息保存多久
+ 一般来说,本公司仅保留您的个人信息至履行收集目的所需的期限,同时将遵守适用法律规定的数据保留期限。
+ 五、法律免责声明
+ 在法律要求的情况下,以及本公司认为必须披露与您有关的信息来保护本公司的法定权益和/或遵守司法程序、法院指令或适用于本公司的系统的法律程序时,我们有权透露您的个人信息。
+ 如果本公司确定为了执行本公司的条款和条件或保护我们的经营,披露是合理必须的,则我们可披露与您有关的信息。
+ 六、本隐私政策的更改
+ 如果决定更改隐私政策,我们会在本政策中、本公司网站中以及我们认为适当的位置发布这些更改,以便您了解我们如何收集、使用您的个人信息,哪些人可以访问这些信息,以及在什么情况下我们会透露这些信息。
+ 本公司保留随时修改本政策的权利,因此请经常查看。如对本政策作出重大更改,本公司会通过网站通知的形式告知。
+
+ 用户协议
+ 特别提示
+ 禅易精舍在此特别提醒您(用户)在注册成为用户之前,请认真阅读本《用户协议》(以下简称“协议”),确保您充分理解本协议中各条款。请您审慎阅读并选择接受或不接受本协议。除非您接受本协议所有条款,否则您无权注册、登录或使用本协议所涉服务。您的注册、登录、使用等行为将视为对本协议的接受,并同意接受本协议各项条款的约束。
+ 本协议约定禅易精舍与用户之间关于“禅易精舍软件服务(以下简称“服务”)的权利义务。“用户”是指注册、登录、使用本服务的个人。本协议可由禅易精舍随时更新,更新后的协议条款一旦公布即代替原来的协议条款,恕不再另行通知,用户可在本网站查阅最新版协议条款。在禅易精舍修改协议条款后,如果用户不接受修改后的条款,请立即停止使用禅易精舍提供的服务,用户继续使用禅易精舍提供的服务将被视为接受修改后的协议。
+ 一、用户个人信息保护
+ 1、用户在注册帐号或使用本服务的过程中,可能需要填写或提交一些必要的个人信息,如法律法规、规章规范性文件(以下称“法律法规”)规定的需要填写的身份信息。如用户提交的信息不完整或不符合法律法规的规定,则用户可能无法使用本服务或在使用本服务的过程中受到限制。
+ 2、用户个人信息包括:
+ 1)用户自行提供的用户个人信息(如注册时填写的手机号码,电子邮件等个人信息,使用服务时提供的共享信息等);
+ 2)其他方分享的用户个人信息;
+ 3)禅易精舍为提供服务而合法收集的用户必要个人信息(如使用服务时系统自动采集的设备或软件信息,浏览历史信息,通讯时间信息等技术信息,用户开启定位功能并使用服务时的地理位置信息等)。
+ 其中个人隐私信息是指涉及用户个人身份或个人隐私的信息,比如,用户真实姓名、身份证号、手机号码、手机设备识别码、IP地址、用户聊天记录。非个人隐私信息是指用户对本服务的操作状态以及使用习惯等明确且客观反映在禅易精舍服务器端的基本记录信息、个人隐私信息范围外的其它普通信息,以及用户同意公开的上述隐私信息。禅易精舍保证在取得用户书面同意的情况下收集、使用或公开用户的个人隐私信息,用户同意禅易精舍无需获得用户的另行确认与授权即可收集、使用或公开用户的非个人隐私信息。
+ 3、尊重用户个人信息的私有性是禅易精舍的一贯制度,禅易精舍将采取技术措施和其他必要措施,确保用户个人信息安全,防止在本服务中收集的用户个人信息泄露、毁损或丢失。在发生前述情形或者禅易精舍发现存在发生前述情形的可能时,禅易精舍将及时采取补救措施并告知用户,用户如发现存在前述情形亦需立即与禅易精舍联系。
+ 4、禅易精舍未经用户同意不向任何第三方公开、 透露用户个人隐私信息。但以下特定情形除外:
+ (1) 禅易精舍根据法律法规规定或有权机关的指示提供用户的个人隐私信息;
+ (2) 由于用户将其用户密码告知他人或与他人共享注册帐户与密码,由此导致的任何个人信息的泄漏,或其他非因禅易精舍原因导致的个人隐私信息的泄露;
+ (3) 用户自行向第三方公开其个人隐私信息;
+ (4) 用户与禅易精舍及合作单位之间就用户个人隐私信息的使用公开达成约定,禅易精舍因此向合作单位公开用户个人隐私信息;
+ (5) 任何由于黑客攻击、电脑病毒侵入及其他不可抗力事件导致用户个人隐私信息的泄露;
+ (6) 用户个人信息已经经过处理无法识别特定个人且不能复原。
+ 5、用户同意禅易精舍可在以下事项中使用用户的个人隐私信息:
+ (1) 禅易精舍向用户及时发送重要通知,如软件更新、本协议条款的变更;
+ (2) 禅易精舍内部进行审计、数据分析和研究等,以改进禅易精舍的产品、服务和与用户之间的沟通;
+ (3) 依本协议约定,禅易精舍管理、审查用户信息及进行处理措施;
+ (4) 适用法律法规规定的其他事项。
+ 除上述事项外,如未取得用户事先同意,禅易精舍不会将用户个人隐私信息使用于任何其他用途。
+ 四、内容规范
+ 1、本条所述内容是指用户使用本服务过程中所制作、上载、复制、发布、传播的任何内容,包括但不限于帐号头像、名称、用户说明等注册信息及认证资料,或文字、语音、图片、视频、图文等发送、回复或自动回复消息和相关链接页面,以及其他使用帐号或本服务所产生的内容。
+ 2、用户不得利用“禅易精舍”帐号或本服务制作、上载、复制、发布、传播如下法律、法规和政策禁止的内容:
+ (1) 反对宪法所确定的基本原则的;
+ (2) 危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的;
+ (3) 损害国家荣誉和利益的;
+ (4) 煽动民族仇恨、民族歧视,破坏民族团结的;
+ (5) 破坏国家宗教政策,宣扬邪教和封建迷信的;
+ (6) 散布谣言,扰乱社会秩序,破坏社会稳定的;
+ (7) 散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;
+ (8) 侮辱或者诽谤他人,侵害他人合法权益的;
+ (9) 不遵守法律法规底线、社会主义制度底线、国家利益底线、公民合法权益底线、社会公共秩序底线、道德风尚底线和信息真实性底线的“七条底线”要求的;
+ (10) 含有法律、行政法规禁止的其他内容的信息。
+ 3、用户不得利用“禅易精舍”帐号或本服务制作、上载、复制、发布、传播如下干扰“禅易精舍”正常运营,以及侵犯其他用户或第三方合法权益的内容:
+ (1) 含有任何性或性暗示的;
+ (2) 含有辱骂、恐吓、威胁内容的;
+ (3) 含有骚扰、垃圾广告、恶意信息、诱骗信息的;
+ (4) 涉及他人隐私、个人信息或资料的;
+ (5) 侵害他人名誉权、肖像权、知识产权、商业秘密等合法权利的;
+ (6) 含有其他干扰本服务正常运营和侵犯其他用户或第三方合法权益内容的信息。
+ 五、使用规则
+ 1、用户在本服务中或通过本服务所传送、发布的任何内容并不反映或代表,也不得被视为反映或代表禅易精舍的观点、立场或政策,禅易精舍对此不承担任何责任。
+ 2、用户不得利用“禅易精舍”帐号或本服务进行如下行为:
+ (1) 提交、发布虚假信息,或盗用他人头像或资料,冒充、利用他人名义的;
+ (2) 强制、诱导其他用户关注、点击链接页面或分享信息的;
+ (3) 虚构事实、隐瞒真相以误导、欺骗他人的;
+ (4) 利用技术手段批量建立虚假帐号的;
+ (5) 利用“禅易精舍”帐号或本服务从事任何违法犯罪活动的;
+ (6) 制作、发布与以上行为相关的方法、工具,或对此类方法、工具进行运营或传播,无论这些行为是否为商业目的;
+ (7) 其他违反法律法规规定、侵犯其他用户合法权益、干扰“禅易精舍”正常运营或禅易精舍未明示授权的行为。
+ 3、用户须对利用“禅易精舍”帐号或本服务传送信息的真实性、合法性、无害性、准确性、有效性等全权负责,与用户所传播的信息相关的任何法律责任由用户自行承担,与禅易精舍无关。如因此给禅易精舍或第三方造成损害的,用户应当依法予以赔偿。
+ 4、禅易精舍提供的服务中可能包括广告,用户同意在使用过程中显示禅易精舍和第三方供应商、合作伙伴提供的广告。除法律法规明确规定外,用户应自行对依该广告信息进行的交易负责,对用户因依该广告信息进行的交易或前述广告商提供的内容而遭受的损失或损害,禅易精舍不承担任何责任。
+ 5、除非禅易精舍书面许可,用户不得从事下列任一行为:
+ (1) 删除软件及其副本上关于著作权的信息;
+ (2) 对软件进行反向工程、反向汇编、反向编译,或者以其他方式尝试发现软件的源代码;
+ (3) 对禅易精舍拥有知识产权的内容进行使用、出租、出借、复制、修改、链接、转载、汇编、发表、出版、建立镜像站点等;
+ (4) 对软件或者软件运行过程中释放到任何终端内存中的数据、软件运行过程中客户端与服务器端的交互数据,以及软件运行所必需的系统数据,进行复制、修改、增加、删除、挂接运行或创作任何衍生作品,形式包括但不限于使用插件、外挂或非经禅易精舍授权的第三方工具/服务接入软件和相关系统;
+ (5) 通过修改或伪造软件运行中的指令、数据,增加、删减、变动软件的功能或运行效果,或者将用于上述用途的软件、方法进行运营或向公众传播,无论这些行为是否为商业目的;
+ (6) 通过非禅易精舍开发、授权的第三方软件、插件、外挂、系统,登录或使用禅易精舍软件及服务,或制作、发布、传播非禅易精舍开发、授权的第三方软件、插件、外挂、系统。
+ 六、账户管理
+ 1、 “禅易精舍”帐号的所有权归禅易精舍所有,用户完成申请注册手续后,获得“禅易精舍”帐号的使用权,该使用权仅属于初始申请注册人,禁止赠与、借用、租用、转让或售卖。禅易精舍因经营需要,有权回收用户的“禅易精舍”帐号。
+ 2、用户可以通过
+ 1)查看与编辑个人资料页,
+ 2)“设置”页面里的“账号与安全”页面来查询、更改、删除、注销“禅易精舍”帐户上的个人资料、注册信息及传送内容等,但需注意,删除有关信息的同时也会删除用户储存在系统中的文字和图片。用户需承担该风险。
+ 3、用户有责任妥善保管注册帐号信息及帐号密码的安全,因用户保管不善可能导致遭受盗号或密码失窃,责任由用户自行承担。用户需要对注册帐号以及密码下的行为承担法律责任。用户同意在任何情况下不使用其他用户的帐号或密码。在用户怀疑他人使用其帐号或密码时,用户同意立即通知禅易精舍。
+ 4、用户应遵守本协议的各项条款,正确、适当地使用本服务,如因用户违反本协议中的任何条款,禅易精舍在通知用户后有权依据协议中断或终止对违约用户“禅易精舍”帐号提供服务。同时,禅易精舍保留在任何时候收回“禅易精舍”帐号、用户名的权利。
+ 5、如用户注册“禅易精舍”帐号后一年不登录,通知用户后,禅易精舍可以收回该帐号,以免造成资源浪费,由此造成的不利后果由用户自行承担。
+ 6、用户可以通过“设置”页面里的“账号与安全”页面来进行账号注销服务,用户确认注销账号是不可恢复的操作,用户应自行备份与禅易精舍账号相关的信息和数据,用户确认操作之前与禅易精舍账号相关的所有服务均已进行妥善处理。用户确认并同意注销账号后并不代表本禅易精舍账号注销前的账号行为和相关责任得到豁免或减轻,如在注销期间,用户的账号被他人投诉、被国家机关调查或者正处于诉讼、仲裁程序中,禅易精舍有限自行终止用户的账号注销并无需另行得到用户的同意。
+ 八、数据储存
+ 1、禅易精舍不对用户在本服务中相关数据的删除或储存失败负责。
+ 2、禅易精舍可以根据实际情况自行决定用户在本服务中数据的最长储存期限,并在服务器上为其分配数据最大存储空间等。用户可根据自己的需要自行备份本服务中的相关数据。
+ 3、如用户停止使用本服务或本服务终止,禅易精舍可以从服务器上永久地删除用户的数据。本服务停止、终止后,禅易精舍没有义务向用户返还任何数据。
+ 九、风险承担
+ 1、用户理解并同意,“禅易精舍”仅为用户提供信息分享、传送及获取的平台,用户必须为自己注册帐号下的一切行为负责,包括用户所传送的任何内容以及由此产生的任何后果。用户应对“禅易精舍”及本服务中的内容自行加以判断,并承担因使用内容而引起的所有风险,包括因对内容的正确性、完整性或实用性的依赖而产生的风险。禅易精舍无法且不会对因用户行为而导致的任何损失或损害承担责任。
+ 2、用户理解并同意,因业务发展需要,禅易精舍保留单方面对本服务的全部或部分服务内容变更、暂停、终止或撤销的权利,用户需承担此风险。
+ 十、知识产权声明
+ 1、除本服务中涉及广告的知识产权由相应广告商享有外,禅易精舍在本服务中提供的内容(包括但不限于网页、文字、图片、音频、视频、图表等)的知识产权均归禅易精舍所有,但用户在使用本服务前对自己发布的内容已合法取得知识产权的除外。
+ 2、除另有特别声明外,禅易精舍提供本服务时所依托软件的著作权、专利权及其他知识产权均归禅易精舍所有。
+ 3、禅易精舍在本服务中所涉及的图形、文字或其组成,以及其他禅易精舍标志及产品、服务名称(以下统称“禅易精舍标识”),其著作权或商标权归禅易精舍所有。未经禅易精舍事先书面同意,用户不得将禅易精舍标识以任何方式展示或使用或作其他处理,也不得向他人表明用户有权展示、使用、或其他有权处理禅易精舍标识的行为。
+ 4、上述及其他任何禅易精舍或相关广告商依法拥有的知识产权均受到法律保护,未经禅易精舍或相关广告商书面许可,用户不得以任何形式进行使用或创造相关衍生作品。
+ 5、用户在使用禅易精舍服务时发表上传的文字、图片、视频、音频、软件以及表演等信息,此部分信息的知识产权归用户,责任由用户承担。但用户的发表、上传行为视为对禅易精舍的授权,用户理解并同意授予禅易精舍及其关联公司全球范围内完全免费、不可撤销、独家、永久、可转授权和可再许可的权利,包括但不限于:复制权、发行权、出租权、展览权、表演权、放映权、广播权、信息网络传播权、摄制权、改编权、翻译权、汇编权以及《著作权法》规定的由著作权人享有的其他著作财产权利及邻接权利。禅易精舍可自行选择是否使用以及使用方式,包括但不限于将前述信息在禅易精舍旗下的服务平台上使用与传播,将上述信息再次编辑后使用,以及由禅易精舍授权给合作方使用、编辑与传播等。
+ 十一、法律责任
+ 1、如果禅易精舍发现或收到他人举报或投诉用户违反本协议约定的,禅易精舍有权不经通知随时对相关内容,包括但不限于用户资料、聊天记录进行审查、删除,并视情节轻重对违规帐号处以包括但不限于警告、帐号封禁 、设备封禁 、功能封禁 的处罚,且通知用户处理结果。
+ 2、因违反用户协议被封禁的用户,在封禁期限届满后自助解封。其中,被实施功能封禁的用户会在封禁期届满后自动恢复被封禁功能。被封禁用户可向禅易精舍网站相关页面提交申诉,禅易精舍将对申诉进行审查,并自行合理判断决定是否变更处罚措施。
+ 3、用户理解并同意,禅易精舍有权依合理判断对违反有关法律法规或本协议规定的行为进行处罚,对违法违规的任何用户采取适当的法律行动,并依据法律法规保存有关信息向有关部门报告等,用户应承担由此而产生的一切法律责任。
+ 4、用户理解并同意,因用户违反本协议约定,导致或产生的任何第三方主张的任何索赔、要求或损失,包括合理的律师费,用户应当赔偿禅易精舍与合作公司、关联公司,并使之免受损害。
+ 十二、不可抗力及其他免责事由
+ 1、用户理解并确认,在使用本服务的过程中,可能会遇到不可抗力等风险因素,使本服务发生中断。不可抗力是指不能预见、不能克服并不能避免且对一方或双方造成重大影响的客观事件,包括但不限于自然灾害如洪水、地震、瘟疫流行和风暴等以及社会事件如战争、动乱、政府行为等。出现上述情况时,禅易精舍将努力在第一时间与相关单位配合,及时进行修复,但是由此给用户或第三方造成的损失,禅易精舍及合作单位在法律允许的范围内免责。
+ 2、本服务同大多数互联网服务一样,受包括但不限于用户原因、网络服务质量、社会环境等因素的差异影响,可能受到各种安全问题的侵扰,如他人利用用户的资料,造成现实生活中的骚扰;用户下载安装的其它软件或访问的其他网站中含有“特洛伊木马”等病毒,威胁到用户的计算机信息和数据的安全,继而影响本服务的正常使用等等。用户应加强信息安全及使用者资料的保护意识,要注意加强密码保护,以免遭致损失和骚扰。
+ 3、用户理解并确认,本服务存在因不可抗力、计算机病毒或黑客攻击、系统不稳定、用户所在位置、用户关机以及其他任何技术、互联网络、通信线路原因等造成的服务中断或不能满足用户要求的风险,因此导致的用户或第三方任何损失,禅易精舍不承担任何责任。
+ 4、用户理解并确认,在使用本服务过程中存在来自任何他人的包括误导性的、欺骗性的、威胁性的、诽谤性的、令人反感的或非法的信息,或侵犯他人权利的匿名或冒名的信息,以及伴随该等信息的行为,因此导致的用户或第三方的任何损失,禅易精舍不承担任何责任。
+ 5、用户理解并确认,禅易精舍需要定期或不定期地对“禅易精舍”平台或相关的设备进行检修或者维护,如因此类情况而造成服务在合理时间内的中断,禅易精舍无需为此承担任何责任,但禅易精舍应事先进行通告。
+ 6、禅易精舍重视对未成年人的保护。禅易精舍将依赖用户提供的个人信息判断用户是否为未成年人。任何18岁以下的未成年人均不得注册帐号或使用本服务
+ 7、因禅易精舍提供的服务系基于地理位置提供的移动社交服务,用户确认,其地理位置信息为非个人隐私信息,用户成功注册“禅易精舍”帐号视为确认授权禅易精舍提取、公开及使用用户的地理位置信息。
用户地理位置信息将作为用户公开资料之一,由禅易精舍向其他用户公开以便禅易精舍向用户提供基于地理位置的移动社交服务。如用户需要终止向其他用户公开其地理位置信息,可随时自行设置为隐身状态。
+ 8、为了改善禅易精舍的技术和服务,向用户提供更好的服务体验,禅易精舍或可会自行收集使用或向第三方提供用户的非个人隐私信息。
+ 9、禅易精舍保证在合法、正当与必要的原则下收集、使用或者公开用户个人信息且不会收集与提供的服务无关的用户个人信息。
+ 10、禅易精舍十分注重保护用户的个人隐私,并制定了《禅易精舍隐私权政策》,用户亦可以通过“设置”页面里的“帮助”来进行具体查看,用户确认并同意使用禅易精舍提供的服务将被视为接受《禅易精舍隐私权政策》。
+ 2、如发生下列任何一种情形,禅易精舍有权变更、中断或终止向用户提供的免费服务或收费服务,而无需对用户或任何第三方承担任何责任:
+ (1) 根据法律规定用户应提交真实信息,而用户提供的个人资料不真实、或与注册时信息不一致又未能提供合理证明;
+ (2) 用户违反相关法律法规或本协议的约定;
+ (3) 按照法律规定或有权机关的要求;
+ (4) 出于安全的原因或其他必要的情形。
+ 十四、“活动”服务说明与免责条款
+ 1、禅易精舍“活动”功能板块,是以地理位置为基础、发布用户周边文化活动信息的活动信息共享平台(下称“本平台”)。
+
+
+ 2、本平台发布之全部文化活动信息,包括但不限于活动地理位置信息,均直接或者间接来自于文化活动主办方。
+ 3、本平台发布文化活动信息,意在宣传文化活动、丰富用户文化生活。本平台用户于本平台“活动”功能板块发布的留言、评论等信息,均系用户自行发布。本平台不对上述信息的真实性、准确性,或及时性、完整性负责。
+ 十五、其他
+ 1、禅易精舍郑重提醒用户注意本协议中免除禅易精舍责任和限制用户权利的条款,请用户仔细阅读,自主考虑风险
+ 2、本协议的效力、解释及纠纷的解决,适用于中华人民共和国法律。若用户和禅易精舍之间发生任何纠纷或争议,首先应友好协商解决,协商不成的,用户同意将纠纷或争议提交禅易精舍住所地有管辖权的人民法院管辖。
+ 3、本协议的任何条款无论因何种原因无效或不具可执行性,其余条款仍有效,对双方具有约束力。
+ 4、由于互联网高速发展,您与禅易精舍签署的本协议列明的条款可能并不能完整罗列并覆盖您禅易精舍所有权利与义务,现有的约定也不能保证完全符合未来发展的需求。因此,禅易精舍隐私权政策、禅易精舍平台行为规范等均为本协议的补充协议,与本协议不可分割且具有同等法律效力。如您使用禅易精舍平台服务,视为您同意上述补充协议。
+
+
+
+
+
+
diff --git a/pages/course/detail.vue b/pages/course/detail.vue
index f7f68c1..a505b2a 100644
--- a/pages/course/detail.vue
+++ b/pages/course/detail.vue
@@ -38,8 +38,8 @@
- {{item.name}}
- 禪易能量高级讲师
+ {{item.realName}}
+
{{item.introduction}}
@@ -50,7 +50,7 @@
课程简介
-
+
@@ -91,7 +91,6 @@
课程安排
-
{{item}}
@@ -113,11 +112,7 @@
{{item.courseStartTime.split(' ')[0]}}-{{item.courseEndTime.split(' ')[0]}}
{{item.coursePlace}}
-
-
-
去报名
@@ -128,10 +123,9 @@
-
+
{{ userInfo.nickname }}
@@ -40,7 +40,6 @@
推广人数
- 20人
+ {{userInfo.spreadCount || 0}}人
今日收益
- 20人
+ {{userInfo.todaySpreadNum || 0}}人
- 我的团队
+ 我的团队
-
+
我参与的
- {{item.courseName}}
- {{item.courseStartTime.split(' ')[0]}}~{{item.courseEndTime.split(' ')[0]}}
+ {{item.courseName}}
+ {{item.courseStartTime}}~{{item.courseEndTime}}
地点:{{item.coursePlace}}
-
- 已签到
+
+
-
- {{item.listName}}
+
+ {{item.listName}}
- 已连续{{item.signTimes}}天
- {{item.enterState ? '已打卡' : '立即打卡'}}
+ 已打卡{{item.signTimes || 0}}天
+
+ {{item.enterState ? '已打卡' : '立即打卡'}}
@@ -116,100 +117,83 @@
-
-
-
- 我的订单
-
- 全部订单
-
-
-
-
-
-
-
-
-
+
+
+ 我的订单
+
+ 全部订单
+
+
+
+
+
+
+
+
{{ userInfo.orderStatusNum.unpaidCount }}
-
- 待付款
-
-
-
-
-
+
+ 待付款
+
+
+
+
+
{{ userInfo.orderStatusNum.unshippedCount }}
-
- 待发货
-
-
-
-
-
+
+ 待发货
+
+
+
+
+
{{ userInfo.orderStatusNum.receivedCount }}
-
- 待收货
-
-
-
-
- {{ userInfo.orderStatusNum.evaluatedCount }}
-
- 待评价
-
-
-
-
- {{ userInfo.orderStatusNum.refundCount }}
-
- 售后/退款
-
-
-
-
-
-
+
+ 待收货
+
+
+
+
+ {{ userInfo.orderStatusNum.evaluatedCount }}
+
+ 待评价
+
+
+
+
+ {{ userInfo.orderStatusNum.refundCount }}
+
+ 售后/退款
+
+
+
+
+
+
-
-
-
- 我的课程
-
+
+
+
+ 我的课程
+
-
-
-
- 打卡榜打卡
-
+
+
+
+ 打卡榜打卡
+
-
-
-
- 建议反馈
-
+
+
+
+ 建议反馈
+
-
-
-
- 收货地址
-
-
-
-
-
-
- 我是服务老师
-
+
+
+
+ 收货地址
+
-
+
-
-
-
-
-
-
-
+
+
+
diff --git a/pages/user/cashOut/index.vue b/pages/user/cashOut/index.vue
new file mode 100644
index 0000000..9d3e494
--- /dev/null
+++ b/pages/user/cashOut/index.vue
@@ -0,0 +1,167 @@
+
+
+
+
+
+ 当前可提现积分(积分比例为1:1)
+ {{userInfo.brokeragePrice || 0}}
+
+
+ 注:提现需在每月20-26日进行,其他时间不可提现
+
+ 提现金额
+
+ ¥
+
+ 全部提现
+
+
+ 提现
+
+
+
+
+
+
+
diff --git a/pages/user/myCourses/index.vue b/pages/user/myCourses/index.vue
index 374a718..c902342 100644
--- a/pages/user/myCourses/index.vue
+++ b/pages/user/myCourses/index.vue
@@ -17,17 +17,15 @@
时间:{{item.courseStartTime.split(' ')[0]}}至{{item.courseEndTime.split(' ')[0]}}
地点:{{item.coursePlace}}
- 座位号:{{item.seat || '暂未安排座位'}}
-
-
-
- {{item.signState == 1 ? '已签到' : '扫一扫'}}
+
+
+ 已签到
-
已结束
@@ -39,7 +37,7 @@
-
+
{{item.courseName}}
diff --git a/pages/user/myTeam/index.vue b/pages/user/myTeam/index.vue
new file mode 100644
index 0000000..f46783e
--- /dev/null
+++ b/pages/user/myTeam/index.vue
@@ -0,0 +1,114 @@
+
+
+
+
+ 今日新增
+ {{teamInfo.todayNum}}人
+
+
+ 一级
+ {{teamInfo.firstNum}}人
+
+
+ 二级
+ {{teamInfo.secondNum}}人
+
+
+
+
+
+
+ {{item.name}}
+ {{item.firstNum}}积分
+ {{item.secondNum}}积分
+
+
+ {{loadingStatus}}
+
+
+
+
+
+
+
diff --git a/static/car-icon.png b/static/car-icon.png
new file mode 100644
index 0000000..b24af67
Binary files /dev/null and b/static/car-icon.png differ
diff --git a/static/gwd.png b/static/gwd.png
new file mode 100644
index 0000000..4b10765
Binary files /dev/null and b/static/gwd.png differ
diff --git a/static/gwd.zip b/static/gwd.zip
new file mode 100644
index 0000000..a070b49
Binary files /dev/null and b/static/gwd.zip differ
diff --git a/static/img1.png b/static/img1.png
deleted file mode 100644
index 531eb30..0000000
Binary files a/static/img1.png and /dev/null differ
diff --git a/static/loading.gif b/static/loading.gif
new file mode 100644
index 0000000..915c198
Binary files /dev/null and b/static/loading.gif differ
diff --git a/static/myorder-icon1.png b/static/myorder-icon1.png
index e197d3d..054b924 100644
Binary files a/static/myorder-icon1.png and b/static/myorder-icon1.png differ
diff --git a/static/myorder-icon2.png b/static/myorder-icon2.png
index 83e9866..51e8f98 100644
Binary files a/static/myorder-icon2.png and b/static/myorder-icon2.png differ
diff --git a/static/myorder-icon3.png b/static/myorder-icon3.png
index 8c73715..c61a13b 100644
Binary files a/static/myorder-icon3.png and b/static/myorder-icon3.png differ
diff --git a/static/myorder-icon4.png b/static/myorder-icon4.png
index 0c459d3..d43162e 100644
Binary files a/static/myorder-icon4.png and b/static/myorder-icon4.png differ
diff --git a/static/myorder-icon5.png b/static/myorder-icon5.png
index 1bbbca0..ea0428e 100644
Binary files a/static/myorder-icon5.png and b/static/myorder-icon5.png differ
diff --git a/static/profit.png b/static/profit.png
new file mode 100644
index 0000000..6e18241
Binary files /dev/null and b/static/profit.png differ
diff --git a/static/template.png b/static/template.png
deleted file mode 100644
index 409ec9b..0000000
Binary files a/static/template.png and /dev/null differ
diff --git a/static/templateHL.png b/static/templateHL.png
deleted file mode 100644
index 4018448..0000000
Binary files a/static/templateHL.png and /dev/null differ
diff --git a/static/templateIndex.png b/static/templateIndex.png
deleted file mode 100644
index 7c986ea..0000000
Binary files a/static/templateIndex.png and /dev/null differ
diff --git a/static/user-menu1.png b/static/user-menu1.png
index fe7b0c4..42e2d34 100644
Binary files a/static/user-menu1.png and b/static/user-menu1.png differ
diff --git a/static/user-menu2.png b/static/user-menu2.png
index b6c1937..2510639 100644
Binary files a/static/user-menu2.png and b/static/user-menu2.png differ
diff --git a/static/user-menu3.png b/static/user-menu3.png
index ef48580..6cdd4eb 100644
Binary files a/static/user-menu3.png and b/static/user-menu3.png differ
diff --git a/static/user-menu4.png b/static/user-menu4.png
deleted file mode 100644
index b504df9..0000000
Binary files a/static/user-menu4.png and /dev/null differ
diff --git a/static/user-menu5.png b/static/user-menu5.png
index f640025..f4dc0d4 100644
Binary files a/static/user-menu5.png and b/static/user-menu5.png differ
diff --git a/static/user-menu6.png b/static/user-menu6.png
deleted file mode 100644
index 8769066..0000000
Binary files a/static/user-menu6.png and /dev/null differ
diff --git a/store/index.js b/store/index.js
index 8cc1518..f29affc 100644
--- a/store/index.js
+++ b/store/index.js
@@ -25,9 +25,12 @@ const vuexStore = new Vuex.Store({
longitude: '',
},
storeItems: cookie.get('storeItems') || null,
- goName: cookie.get('goName') || '',
+ goName: cookie.get('goName') || ''
},
mutations: {
+ setNewMsg(state,msg){
+ state.newMsg = msg
+ },
login(state, token, expires_time) {
state.token = token
cookie.set(loginKey, token, expires_time)
diff --git a/utils/index.js b/utils/index.js
index 31c9d7f..5be029f 100644
--- a/utils/index.js
+++ b/utils/index.js
@@ -1,1133 +1,1157 @@
-import Vue from 'vue'
-
-// import MpvueRouterPatch from 'mpvue-router-patch'
-// Vue.use(MpvueRouterPatch)
-import { wxappAuth, getUserInfo } from '@/api/user'
-import store from '@/store'
-import dayjs from 'dayjs'
-import cookie from '@/utils/store/cookie'
-import stringify from '@/utils/querystring'
-import { VUE_APP_API_URL } from '@/config'
-import { wechat, auth, oAuth, toAuth } from '@/libs/wechat'
-
-export function dataFormat(time, option) {
- time = +time * 1000
- const d = new Date(time)
- const now = new Date().getTime()
-
- const diff = (now - d) / 1000
- if (diff < 30) {
- return '刚刚'
- } else if (diff < 3600) {
- // less 1 hour
- return Math.ceil(diff / 60) + '分钟前'
- } else if (diff < 3600 * 24) {
- return Math.ceil(diff / 3600) + '小时前'
- } else if (diff < 3600 * 24 * 2) {
- return '1天前'
- }
- if (option) {
- // return parseTime(time, option);
- } else {
- let timeStr = d.getFullYear() + '年' + (d.getMonth() + 1) + '月' + d.getDate() + '日' + d.getHours() + '时' + d.getMinutes() + '分'
- return timeStr
- }
-}
-// 年月日,时分秒
-// "YYYY-mm-dd HH:MM"
-export function dateFormatL(fmt, date) {
- let ret
- const opt = {
- 'Y+': date.getFullYear().toString(), // 年
- 'm+': (date.getMonth() + 1).toString(), // 月
- 'd+': date.getDate().toString(), // 日
- 'H+': date.getHours().toString(), // 时
- 'M+': date.getMinutes().toString(), // 分
- 'S+': date.getSeconds().toString(), // 秒
- // 有其他格式化字符需求可以继续添加,必须转化成字符串
- }
- for (let k in opt) {
- ret = new RegExp('(' + k + ')').exec(fmt)
- if (ret) {
- fmt = fmt.replace(ret[1], ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, '0'))
- }
- }
- return fmt
-}
-export function dateFormatT(time) {
- time = +time * 1000
- const d = new Date(time)
-
- return d.getFullYear() + '/' + (d.getMonth() + parseInt(1)) + '/' + d.getDate()
-}
-
-export function trim(str) {
- return String.prototype.trim.call(str)
-}
-
-export function isType(arg, type) {
- return Object.prototype.toString.call(arg) === '[object ' + type + ']'
-}
-
-export function isWeixin() {
- if (navigator && navigator.userAgent && navigator.userAgent.toLowerCase().indexOf('micromessenger') !== -1) {
- return true
- }
- return false
-}
-
-export function parseQuery() {
- let res = {}
-
- // #ifdef H5
- const query = (location.href.split('?')[1] || '').trim().replace(/^(\?|#|&)/, '')
-
- if (!query) {
- return res
- }
-
- 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]
- }
- })
- // #endif
- // #ifndef H5
- var pages = getCurrentPages() //获取加载的页面
- var currentPage = pages[pages.length - 1] //获取当前页面的对象
- var url = currentPage.route //当前页面url
- res = currentPage.options //如果要获取url中所带的参数可以查看options
- // #endif
-
- return res
-}
-
-/*获取当前页url*/
-export function getCurrentPageUrl() {
- var pages = getCurrentPages() //获取加载的页面
- var currentPage = pages[pages.length - 1] //获取当前页面的对象
- var url = currentPage.route //当前页面url
- return url
-}
-
-/*获取当前页带参数的url*/
-export function getCurrentPageUrlWithArgs() {
- var pages = getCurrentPages() //获取加载的页面
- var currentPage = pages[pages.length - 1] //获取当前页面的对象
- var url = currentPage.route //当前页面url
- var options = currentPage.options //如果要获取url中所带的参数可以查看options
- //拼接url的参数
- var urlWithArgs = url + '?'
- for (var key in options) {
- var value = options[key]
- urlWithArgs += key + '=' + value + '&'
- }
- urlWithArgs = urlWithArgs.substring(0, urlWithArgs.length - 1)
- return urlWithArgs
-}
-
-// 复制到剪切板
-export const copyClipboard = data => {
- uni.setClipboardData({
- data: data,
- success: res => {
- uni.showToast({
- title: '复制成功',
- icon: 'success',
- duration: 2000,
- })
- },
- })
-}
-
-export const getProvider = service => {
- return new Promise((resolve, reject) => {
- // 获取当前环境的服务商
- uni.getProvider({
- service: service || 'oauth',
- success: function(res) {
- // 此处可以排除h5
- if (res.provider) {
- resolve(res.provider[0])
- }
- },
- fail() {
- reject('获取环境服务商失败')
- },
- })
- }).catch(error => {
- console.log(error)
- })
-}
-
-export const authorize = authorizeStr => {
- return new Promise((resolve, reject) => {
- console.log('检验授权', `scope.${authorizeStr}`)
- uni.getSetting({
- success(res) {
- console.log(res.authSetting)
- if (res.authSetting[`scope.${authorizeStr}`]) {
- resolve(true)
- } else {
- resolve(false)
- }
- },
- fail() {
- resolve(false)
- },
- })
- })
-}
-
-export const login = loginInfo => {
- return new Promise((resolve, reject) => {
- if (Vue.prototype.$deviceType == 'weixin') {
- // 微信授权登录
- const { code } = parseQuery()
- if (code) {
- auth(code)
- .then(() => {
- let redirect = cookie.get('redirect').replace(/\ /g, '')
- console.log(redirect)
- if (redirect) {
- redirect = redirect.split('/pages')[1]
- if (!redirect) {
- redirect = '/Loading/index'
- }
- reLaunch({
- path: '/pages' + redirect,
- })
- cookie.remove('redirect')
- } else {
- reLaunch({
- path: '/pages/home/index',
- })
- }
- })
- .catch(() => {
- reject('当前运行环境为微信浏览器')
- reLaunch({
- path: '/pages/home/index',
- })
- })
- } else {
- }
- return
- }
- if (Vue.prototype.$deviceType == 'weixinh5') {
- console.log('当前运行环境为H5')
- reject('当前运行环境为H5')
- return
- }
- if (Vue.prototype.$deviceType == 'app') {
- console.log('当前运行环境为app')
- reject('当前运行环境为app')
- return
- }
- console.log('————————————————————')
- console.log('开始登录')
- console.log('————————————————————')
- console.log('获取环境商')
- getProvider()
- .then(provider => {
- console.log('当前的环境商')
- console.log(provider)
- if (!provider) {
- reject()
- }
- // 调用登录接口
- console.log('调用登录接口')
- uni.login({
- provider: provider,
- success: async function(loginRes) {
- console.log(loginRes)
- // 微信登录
- console.log('登录接口调用成功')
- console.log('开始检查用户信息授权')
- let code = loginRes.code
- cookie.set('wxLoginCode', loginRes.code)
-
- let authorizeRes = await authorize('userInfo')
- if (!wx.getUserProfile && !authorizeRes) {
- reject('用户未授权')
- return
- }
- if (wx.getUserProfile) {
- if (loginInfo) {
- wxappAuth({
- encryptedData: loginInfo.encryptedData,
- iv: loginInfo.iv,
- code: code,
- spread: cookie.get('spread'),
- })
- .then(({ data }) => {
- console.log('登录接口调用成功')
- console.log('开始处理登录信息保存,并获取用户详情')
- uni.hideLoading()
- store.commit('login', data.token, dayjs(data.expires_time))
- store.dispatch('userInfo', true)
- getUserInfo()
- .then(user => {
- console.log('获取用户信息成功')
- uni.setStorageSync('uid', user.data.uid)
- store.dispatch('setUserInfo', user.data)
- resolve(user)
- })
- .catch(error => {
- console.log('获取用户信息失败')
- reject('获取用户信息失败')
- })
- })
- .catch(error => {
- console.log(error)
- console.log('登录接口调用失败')
- reject('登录接口调用失败')
- })
- } else {
- reject('用户未授权')
- return
- }
- } else {
- uni.getUserInfo({
- provider: provider,
- success: function(user) {
- console.log(user)
- console.log('获取用户信息成功')
- console.log('开始调用登录接口')
- wxappAuth({
- encryptedData: user.encryptedData,
- iv: user.iv,
- code: code,
- spread: cookie.get('spread'),
- })
- .then(({ data }) => {
- console.log('登录接口调用成功')
- console.log('开始处理登录信息保存,并获取用户详情')
- uni.hideLoading()
- store.commit('login', data.token, dayjs(data.expires_time))
- store.dispatch('userInfo', true)
- getUserInfo()
- .then(user => {
- console.log('获取用户信息成功')
- uni.setStorageSync('uid', user.data.uid)
- store.dispatch('setUserInfo', user.data)
- resolve(user)
- })
- .catch(error => {
- console.log('获取用户信息失败')
- reject('获取用户信息失败')
- })
- })
- .catch(error => {
- console.log(error)
- console.log('登录接口调用失败')
- reject('登录接口调用失败')
- })
- },
- fail() {
- console.log('获取用户信息失败')
- reject('获取用户信息失败')
- },
- })
- }
- },
- fail() {
- console.log('调用登录接口失败')
- reject('调用登录接口失败')
- },
- })
- })
- .catch(error => {
- reject('获取环境服务商失败')
- })
- })
-}
-
-export const handleGetUserInfo = () => {
- getUserInfo().then(res => {
- console.log('获取用户信息')
- store.dispatch('setUserInfo', res.data)
- console.log('获取用户信息后跳转回显的页面')
-
- let redirect = cookie.get('redirect').replace(/\ /g, '')
- if (redirect) {
- reLaunch({
- path: redirect,
- // query
- })
- return
- }
- back()
- // reLaunch({
- // path: '/pages/home/index',
- // // query
- // })
-
- // var pages = getCurrentPages() //获取加载的页面
- // var currentPage = pages[pages.length - 1] //获取当前页面的对象
- // let url = "/pages/home/index"
- // let query = {}
- // if (currentPage) {
- // const {
- // redirect,
- // ...querys
- // } = currentPage.options
- // // 获取到最后一个页面
- // if (
- // currentPage.route != 'pages/Loading/index' &&
- // currentPage.route != 'pages/user/Login/index'
- // ) {
- // url = currentPage.route
- // query = {
- // ...querys
- // }
- // }
- // if (currentPage.route == 'pages/authorization/index') {
-
- // url = redirect
- // query = {
- // ...querys
- // }
- // }
-
- // }
- // console.log(url)
- // if (url == '/pages/home/index' || url == '/pages/shop/GoodsClass/index' || url == '/pages/shop/ShoppingCart/index' || url == '/pages/user/User/index') {
- // switchTab({
- // path: `${url}`,
- // query
- // });
- // } else {
- // let redirect = cookie.get('redirect')
- // if (redirect) {
-
- // reLaunch({
- // path: redirect,
- // // query
- // });
- // return
- // }
- // console.log('获取用户信息后跳转回显的页面')
- // // 为了防止返回上一页是授权页面,先重定向到首页,再跳转
- // console.log({
- // path: `/${url}`,
- // query
- // })
- // reLaunch({
- // path: '/pages/home/index',
- // // query
- // });
-
- // setTimeout(() => {
- // if (url.indexOf('/') == 0) {
- // url = url.slice(1)
- // }
- // push({
- // path: `/${url}`,
- // query
- // })
- // })
-
- // // push({
- // // path: `${url}`,
- // // query
- // // })
- // }
- })
-}
-
-export function parseUrl(location) {
- if (typeof location === 'string') return location
- const { path, query } = location
-
- const queryStr = stringify(query)
-
- if (!queryStr) {
- return path
- }
-
- return `${path}?${queryStr}`
-}
-
-export function parseRoute($mp) {
- const _$mp = $mp || {}
- const path = _$mp.page && _$mp.page.route
- return {
- path: `/${path}`,
- params: {},
- query: _$mp.query || _$mp.page.options,
- hash: '',
- fullPath: parseUrl({
- path: `/${path}`,
- query: _$mp.query || _$mp.page.options,
- }),
- name: path && path.replace(/\/(\w)/g, ($0, $1) => $1.toUpperCase()),
- }
-}
-
-export function handleAuth() {
- /**
- * 如何判断权限?
- * 用户如果登录了系统,会留下两个东西,一个是token,一个是userInfo
- * token存在会过期的问题,如果长时间没有打开小程序,会导致登录失效,出现打开一个页面瞬间跳转到授权页面的问题
- * 解决办法,保存token的时候加上过期时间,每次请求都取一下缓存里的token
- * userInfo只是用来限时用户信息,作用并不是很大
- * ps:只需要判断 token 是否存在即可
- */
- if (cookie.get('login_status')) {
- return true
- }
- return false
-}
-
-export const handleLoginStatus = (location, complete, fail, success) => {
- // 不登录可访问的页面
- let page = [
- {
- path: '/pages/Loading/index',
- name: 'loading页面',
- },
- {
- path: '/pages/home/index',
- name: '首页',
- },
- {
- path: '/pages/shop/HotNewGoods/index',
- name: '热门榜单',
- },
- {
- path: '/pages/activity/GoodsGroup/index',
- name: '超值拼团',
- },
- {
- path: '/pages/shop/Live/LiveList/index',
- name: '热门直播',
- },
- {
- path: '/pages/shop/GoodsClass/index',
- name: '商品分类',
- },
- {
- path: '/pages/user/Login/index',
- name: '登录页面',
- },
- {
- path: '/pages/authorization/index',
- name: '授权页面',
- },
- {
- path: '/pages/course/index',
- name: '课程首页',
- },
-
- ]
-
- // 是否可以访问
- let isAuth = false
- console.log('即将跳转', location, parseUrl(location))
-
- // 从 location 中获取当前url,location typeof string || object
- let path = ''
- if (typeof location === 'string') {
- path = location
- } else {
- path = location.path
- }
- console.log(path)
- // 判断用户是否有token
- if (!handleAuth()) {
- page.map(item => {
- if (item.path == path) {
- isAuth = true
- }
- })
- } else {
- isAuth = true
- }
- console.log(isAuth)
- return new Promise((resolve, reject) => {
- resolve({
- url: parseUrl(location),
- complete,
- fail,
- success,
- })
- // if (isAuth) {
- // // 有token
- // if (path == '/pages/home/index' || path == '/pages/shop/GoodsClass/index' || path == '/pages/shop/ShoppingCart/index' || path == '/pages/user/User/index') {
- // // switchTab({
- // // path: parseUrl(location),
- // // })
- // // return
- // }
-
- // resolve({
- // url: parseUrl(location),
- // complete,
- // fail,
- // success,
- // })
- // } else {
- // // 没有token,先校验用户是否授权,如果授权了,进行自动登录
- // routerPermissions(parseUrl(location))
- // reject()
- // }
- }).catch(error => {
- console.log(error)
- })
-}
-
-// export function checkPermissions(){
-
-// }
-
-export function routerPermissions(url, type) {
- console.log('routerPermissions', url)
- console.log('————————')
- console.log(url, type, 'routerPermissions')
- console.log('————————')
- let path = url
- if (!path) {
- path = '/' + getCurrentPageUrlWithArgs()
- }
- console.log(Vue.prototype.$deviceType)
- if (Vue.prototype.$deviceType == 'routine') {
- console.log('————————')
- console.log('当前是微信小程序,开始处理小程序登录方法')
- console.log('————————')
- // 如果是微信小程序,跳转到授权页
- // 先校验用户是否授权,如果授权了,进行自动登录
- console.log('————————')
- console.log('开始校验权限')
- console.log('————————')
- authorize('userInfo')
- .then(() => {
- // 自动登录
- console.log('————————')
- console.log('自动登录')
- console.log('————————')
- login()
- .then(res => {
- // 登录成功,跳转到需要跳转的页面
- console.log('————————')
- console.log('登录成功,跳转页面')
- console.log('————————')
- store.commit('updateAuthorizationPage', false)
- if (path == '/pages/shop/ShoppingCart/index' || path == '/pages/user/User/index') {
- console.log('————————')
- console.log('当前是购物车,或者个人中心')
- console.log('————————')
- return
- }
- if (type == 'reLaunch') {
- reLaunch({
- path,
- })
- return
- }
- if (type == 'replace') {
- replace({
- path,
- })
- return
- }
- push({
- path,
- })
- })
- .catch(error => {
- console.log('————————')
- console.log('自动登录失败,跳转到授权页面')
- console.log('————————')
- uni.showToast({
- title: error,
- icon: 'none',
- duration: 2000,
- })
- reLaunch({
- path: '/pages/authorization/index',
- })
- cookie.set('redirect', path)
- })
- })
- .catch(error => {
- // 跳转到登录页面或者授权页面
- if (path == '/pages/shop/ShoppingCart/index' || path == '/pages/user/User/index') {
- switchTab({
- path,
- })
- store.commit('updateAuthorizationPage', false)
- return
- }
- reLaunch({
- path: '/pages/authorization/index',
- })
- cookie.set('redirect', path)
- })
- } else if (Vue.prototype.$deviceType == 'weixin') {
- wechat().then(() => oAuth())
- if (!type) {
- push({
- path: url,
- })
- }
- } else {
- console.log(path)
- // 如果不是小程序跳转到登录页
- cookie.set('redirect', path)
- push({
- path: '/pages/user/Login/index',
- })
- }
-}
-
-export function push(location, complete, fail, success) {
- handleLoginStatus(location, complete, fail, success)
- .then(params => {
- uni.navigateTo(params)
- })
- .catch(error => {
- // 没有权限
- })
-}
-
-export function replace(location, complete, fail, success) {
- handleLoginStatus(location, complete, fail, success)
- .then(params => {
- console.log(params)
- uni.redirectTo(params)
- })
- .catch(error => {
- // 没有权限
- })
-}
-
-export function reLaunch(location, complete, fail, success) {
- handleLoginStatus(location, complete, fail, success)
- .then(params => {
- console.log(params)
- uni.reLaunch(params)
- })
- .catch(error => {
- // 没有权限
- console.log(error)
- })
-}
-
-export function go(delta) {
- uni.navigateBack({
- delta,
- })
-}
-
-export function back() {
- uni.navigateBack({
- delta: 1,
- success: function(e) {},
- fail: function(e) {},
- })
-}
-
-export function switchTab(location, complete, fail, success) {
- handleLoginStatus(location, complete, fail, success)
-
- .then(params => {
- console.log('params',params)
- uni.switchTab(params)
- })
- .catch(error => {
- // 没有权限
- })
-}
-
-export const _router = {
- mode: 'history',
- switchTab,
- push,
- replace,
- go,
- back,
- reLaunch,
-}
-
-export function handleQrCode() {
- var urlSpread = parseQuery()['q']
- if (urlSpread) {
- if (urlSpread.indexOf('%3F') != -1) {
- // 通过海报二维码进来
- urlSpread = urlSpread
- .split('%3F')[1]
- .replace(/%3D/g, ':')
- .replace(/%26/g, ',')
- .split(',')
- .map((item, index) => {
- item = item.split(':')
- return `"${item[0]}":"${item[1]}"`
- })
- .join(',')
- urlSpread = JSON.parse('{' + urlSpread + '}')
- return urlSpread
- } else {
- return handleUrlParam(urlSpread)
- }
- }
- return null
-}
-
-export function handleUrlParam(path) {
- var url = path.split('?')[1] //获取url中"?"符后的字串
- var theRequest = new Object()
- if (path.includes('?')) {
- var url = path.split('?')[1] //获取url中"?"符后的字串
- let strs = url.split('&')
- for (var i = 0; i < strs.length; i++) {
- theRequest[strs[i].split('=')[0]] = unescape(strs[i].split('=')[1])
- }
- }
- return theRequest
-}
-
-const getImageInfo = images => {
- return new Promise((resolve, reject) => {
- let imageAry = {}
- images.map((item, index) => {
- uni.getImageInfo({
- src: item,
- fail: function(res) {
- imageAry[index] = null
- if (imageAry.length == images.length) {
- resolve(imageAry)
- }
- },
- success: function(res) {
- imageAry[index] = res
- if (Object.keys(imageAry).length == images.length) {
- resolve(imageAry)
- }
- },
- })
- })
- })
-}
-
-/**
- * 获取分享海报
- * @param array store 海报素材
- * @param string store_name 素材文字
- * @param string price 价格
- * @param function successFn 回调函数
- *
- *
- */
-export const PosterCanvas = (store, successCallBack) => {
- uni.showLoading({
- title: '海报生成中',
- mask: true,
- })
- getImageInfo([store.image, store.code]).then(res => {
- let contentHh = 48 * 1.3
- const ctx = uni.createCanvasContext('myCanvas')
- ctx.clearRect(0, 0, 0, 0)
- const WIDTH = 747
- const HEIGHT = 1326
- ctx.fillStyle = '#FFFFFF'
- ctx.fillRect(0, 0, WIDTH, HEIGHT)
- ctx.drawImage(res[0].path, 0, 0, WIDTH, WIDTH)
- ctx.drawImage(res[1].path, 40, 1064, 200, 200)
- ctx.save()
- let r = 90
- let d = r * 2
- let cx = 40
- let cy = 990
- ctx.arc(cx + r, cy + r, r, 0, 2 * Math.PI)
- ctx.clip()
- ctx.restore()
- ctx.setTextAlign('center')
- ctx.setFontSize(48)
- ctx.setFillStyle('#000')
- ctx.fillText(store.title, WIDTH / 2, 810 + contentHh)
- ctx.setTextAlign('center')
- ctx.setFontSize(32)
- ctx.setFillStyle('red')
- ctx.fillText('¥' + store.price, WIDTH / 2, 985)
- ctx.setTextAlign('center')
- ctx.setFontSize(22)
- ctx.setFillStyle('#333333')
- ctx.fillText('长按识别二维码立即购买', WIDTH / 2, 1167)
- ctx.save()
- ctx.draw(true, () => {
- uni.canvasToTempFilePath({
- canvasId: 'myCanvas',
- fileType: 'png',
- destWidth: WIDTH,
- destHeight: HEIGHT,
- success: function(res) {
- uni.hideLoading()
- successCallBack && successCallBack(res.tempFilePath)
- },
- fail: function(error) {
- console.log(error)
- },
- })
- })
- })
-
- // uni.getImageInfo({
- // src: store.image,
- // fail: function (res) {
- // uni.showToast({
- // title: '海报生成失败',
- // icon: "none",
- // duration: 2000
- // });
- // },
- // success: function (res) {
-
- // }
- // })
-}
-
-export const handleLoginFailure = () => {
- console.log('————————')
- console.log('退出登录,标记当前页面为授权页面,防止多次跳转')
- console.log('————————')
-
- store.commit('logout')
- // 改为授权取消
- store.commit('updateAuthorization', false)
-
- let currentPageUrl = getCurrentPageUrl()
- if (store.state.$deviceType == 'weixin') {
- // 如果不是授权页面,
- if (!store.getters.isAuthorizationPage) {
- // 标识当前为授权页面
- store.commit('updateAuthorizationPage', true)
- toAuth()
- }
- return
- } else {
- // token 失效
- // 判断当前是不是已经在登录页面或者授权页,防止二次跳转
- if (store.getters.isAuthorizationPage || currentPageUrl == '/pages/user/Login/index') {
- console.log(store.getters.isAuthorizationPage, currentPageUrl, '已经是登录页面或者授权页面,跳出方法')
- return
- }
- }
-
- console.log('————————')
- console.log('当前是授权页面')
- console.log(store.getters)
- console.log('————————')
- store.commit('updateAuthorizationPage', true)
-
- let path = '/' + getCurrentPageUrlWithArgs()
-
- let qrCode = handleQrCode()
-
- if (qrCode) {
- // 当前是通过海报扫描进入的
-
- // 判断是不是拼团进来的
- if (currentPageUrl == 'pages/activity/GroupRule/index') {
- console.log('————————')
- console.log('是拼团进来的')
- console.log('————————')
- if (qrCode.pinkId) {
- path = parseUrl({
- path: `/ ${currentPageUrl} `,
- query: {
- id: qrCode.pinkId,
- },
- })
- if (qrCode.spread) {
- cookie.set('spread', qrCode.spread || 0)
- }
- } else {
- console.log('————————')
- console.log('是拼团进来的,但是没有获取到参数')
- console.log('————————')
- handleNoParameters()
- }
- }
-
- // 判断是不是扫描的砍价海报进来的
- if (currentPageUrl == 'pages/activity/DargainDetails/index') {
- console.log('————————')
- console.log('是扫描的砍价海报进来的')
- console.log('————————')
-
- if (qrCode.bargainId) {
- path = parseUrl({
- path: `/ ${currentPageUrl} `,
- query: {
- id: qrCode.bargainId,
- partake: qrCode.uid,
- },
- })
- if (qrCode.spread) {
- cookie.set('spread', qrCode.spread || 0)
- }
- } else {
- handleNoParameters()
- console.log('————————')
- console.log('是扫描的砍价海报进来的,但是没有获取到参数')
- console.log('————————')
- }
- }
-
- if (currentPageUrl == 'pages/shop/GoodsCon/index') {
- console.log('————————')
- console.log('是扫描的商品详情')
- console.log('————————')
-
- if (qrCode.productId) {
- path = parseUrl({
- path: `/ ${currentPageUrl} `,
- query: {
- id: qrCode.productId,
- },
- })
- if (qrCode.spread) {
- cookie.set('spread', qrCode.spread || 0)
- }
- } else {
- handleNoParameters()
- console.log('————————')
- console.log('是扫描的商品详情进来的,但是没有获取到参数')
- console.log('————————')
- }
- }
- }
-
- console.log('————————')
- console.log(path, '重定向页面地址')
- console.log('————————')
- routerPermissions(path, 'reLaunch')
-}
-
-const handleNoParameters = () => {
- uni.showToast({
- title: '未获取到必要参数,即将跳转首页',
- icon: 'success',
- duration: 2000,
- })
- setTimeout(() => {
- clearTimeout()
- switchTab({
- path: '/pages/home/index',
- })
- }, 1500)
-}
-
-export function chooseImage(callback) {
- uni.chooseImage({
- count: 1,
- sourceType: ['album'],
- success: res => {
- uni.getImageInfo({
- src: res.tempFilePaths[0],
- success: image => {
- console.log(image)
- uni.showLoading({ title: '图片上传中', mask: true })
- uni.uploadFile({
- url: `${VUE_APP_API_URL}/api/upload`,
- file: image,
- filePath: image.path,
- header: {
- Authorization: 'Bearer ' + store.getters.token,
- },
- name: 'file',
- success: res => {
- if (callback) {
- callback(JSON.parse(res.data).link)
- }
- },
- fail: err => {
- uni.showToast({
- title: '上传图片失败',
- icon: 'none',
- duration: 2000,
- })
- },
- complete: res => {
- uni.hideLoading()
- },
- })
- },
- fail: err => {
- uni.showToast({
- title: '获取图片信息失败',
- icon: 'none',
- duration: 2000,
- })
- },
- })
- },
- })
-}
-export function chooseImages(callback) {
- uni.chooseImage({
- count: 9,
- sourceType: ['album'],
- success: res => {
- const tempFilePaths = res.tempFilePaths;
- for(let i = 0;i < tempFilePaths.length; i++) {
- uni.getImageInfo({
- src: tempFilePaths[i],
- success: image => {
- uni.showLoading({ title: '图片上传中', mask: true })
- uni.uploadFile({
- url: `${VUE_APP_API_URL}/api/upload`,
- file: image,
- filePath: image.path,
- header: {
- Authorization: 'Bearer ' + store.getters.token,
- },
- name: 'file',
- success: res => {
- if (callback) {
- callback(JSON.parse(res.data).link)
- }
- },
- fail: err => {
- uni.showToast({
- title: '上传图片失败',
- icon: 'none',
- duration: 2000,
- })
- },
- complete: res => {
- uni.hideLoading()
- },
- })
- },
- fail: err => {
- uni.showToast({
- title: '获取图片信息失败',
- icon: 'none',
- duration: 2000,
- })
- },
- })
- }
- },
- })
-}
-
-export function handleErrorMessage(err) {
- console.log(err)
- uni.hideLoading()
- uni.showToast({
- title: err.msg || err.response.data.msg || err.response.data.message || '创建订单失败',
- icon: 'none',
- duration: 2000,
- })
+import Vue from 'vue'
+
+// import MpvueRouterPatch from 'mpvue-router-patch'
+// Vue.use(MpvueRouterPatch)
+import {
+ wxappAuth,
+ getUserInfo
+} from '@/api/user'
+import store from '@/store'
+import dayjs from 'dayjs'
+import cookie from '@/utils/store/cookie'
+import stringify from '@/utils/querystring'
+import {
+ VUE_APP_API_URL
+} from '@/config'
+import {
+ wechat,
+ auth,
+ oAuth,
+ toAuth
+} from '@/libs/wechat'
+
+export function dataFormat(time, option) {
+ time = +time * 1000
+ const d = new Date(time)
+ const now = new Date().getTime()
+
+ const diff = (now - d) / 1000
+ if (diff < 30) {
+ return '刚刚'
+ } else if (diff < 3600) {
+ // less 1 hour
+ return Math.ceil(diff / 60) + '分钟前'
+ } else if (diff < 3600 * 24) {
+ return Math.ceil(diff / 3600) + '小时前'
+ } else if (diff < 3600 * 24 * 2) {
+ return '1天前'
+ }
+ if (option) {
+ // return parseTime(time, option);
+ } else {
+ let timeStr = d.getFullYear() + '年' + (d.getMonth() + 1) + '月' + d.getDate() + '日' + d.getHours() + '时' + d.getMinutes() +
+ '分'
+ return timeStr
+ }
+}
+// 年月日,时分秒
+// "YYYY-mm-dd HH:MM"
+export function dateFormatL(fmt, date) {
+ let ret
+ const opt = {
+ 'Y+': date.getFullYear().toString(), // 年
+ 'm+': (date.getMonth() + 1).toString(), // 月
+ 'd+': date.getDate().toString(), // 日
+ 'H+': date.getHours().toString(), // 时
+ 'M+': date.getMinutes().toString(), // 分
+ 'S+': date.getSeconds().toString(), // 秒
+ // 有其他格式化字符需求可以继续添加,必须转化成字符串
+ }
+ for (let k in opt) {
+ ret = new RegExp('(' + k + ')').exec(fmt)
+ if (ret) {
+ fmt = fmt.replace(ret[1], ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, '0'))
+ }
+ }
+ return fmt
+}
+export function dateFormatT(time) {
+ time = +time * 1000
+ const d = new Date(time)
+
+ return d.getFullYear() + '/' + (d.getMonth() + parseInt(1)) + '/' + d.getDate()
+}
+
+export function trim(str) {
+ return String.prototype.trim.call(str)
+}
+
+export function isType(arg, type) {
+ return Object.prototype.toString.call(arg) === '[object ' + type + ']'
+}
+
+export function isWeixin() {
+ if (navigator && navigator.userAgent && navigator.userAgent.toLowerCase().indexOf('micromessenger') !== -1) {
+ return true
+ }
+ return false
+}
+
+export function parseQuery() {
+ let res = {}
+
+ // #ifdef H5
+ const query = (location.href.split('?')[1] || '').trim().replace(/^(\?|#|&)/, '')
+
+ if (!query) {
+ return res
+ }
+
+ 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]
+ }
+ })
+ // #endif
+ // #ifndef H5
+ var pages = getCurrentPages() //获取加载的页面
+ var currentPage = pages[pages.length - 1] //获取当前页面的对象
+ var url = currentPage.route //当前页面url
+ res = currentPage.options //如果要获取url中所带的参数可以查看options
+ // #endif
+
+ return res
+}
+
+/*获取当前页url*/
+export function getCurrentPageUrl() {
+ var pages = getCurrentPages() //获取加载的页面
+ var currentPage = pages[pages.length - 1] //获取当前页面的对象
+ var url = currentPage.route //当前页面url
+ return url
+}
+
+/*获取当前页带参数的url*/
+export function getCurrentPageUrlWithArgs() {
+ var pages = getCurrentPages() //获取加载的页面
+ var currentPage = pages[pages.length - 1] //获取当前页面的对象
+ var url = currentPage.route //当前页面url
+ var options = currentPage.options //如果要获取url中所带的参数可以查看options
+ //拼接url的参数
+ var urlWithArgs = url + '?'
+ for (var key in options) {
+ var value = options[key]
+ urlWithArgs += key + '=' + value + '&'
+ }
+ urlWithArgs = urlWithArgs.substring(0, urlWithArgs.length - 1)
+ return urlWithArgs
+}
+
+// 复制到剪切板
+export const copyClipboard = data => {
+ uni.setClipboardData({
+ data: data,
+ success: res => {
+ uni.showToast({
+ title: '复制成功',
+ icon: 'success',
+ duration: 2000,
+ })
+ },
+ })
+}
+
+export const getProvider = service => {
+ return new Promise((resolve, reject) => {
+ // 获取当前环境的服务商
+ uni.getProvider({
+ service: service || 'oauth',
+ success: function(res) {
+ // 此处可以排除h5
+ if (res.provider) {
+ resolve(res.provider[0])
+ }
+ },
+ fail() {
+ reject('获取环境服务商失败')
+ },
+ })
+ }).catch(error => {
+ console.log(error)
+ })
+}
+
+export const authorize = authorizeStr => {
+ return new Promise((resolve, reject) => {
+ console.log('检验授权', `scope.${authorizeStr}`)
+ uni.getSetting({
+ success(res) {
+ console.log(res.authSetting)
+ if (res.authSetting[`scope.${authorizeStr}`]) {
+ resolve(true)
+ } else {
+ resolve(false)
+ }
+ },
+ fail() {
+ resolve(false)
+ },
+ })
+ })
+}
+
+export const login = loginInfo => {
+ return new Promise((resolve, reject) => {
+ if (Vue.prototype.$deviceType == 'weixin') {
+ // 微信授权登录
+ const {
+ code
+ } = parseQuery()
+ if (code) {
+ auth(code)
+ .then(() => {
+ let redirect = cookie.get('redirect').replace(/\ /g, '')
+ console.log(redirect)
+ if (redirect) {
+ redirect = redirect.split('/pages')[1]
+ if (!redirect) {
+ redirect = '/Loading/index'
+ }
+ reLaunch({
+ path: '/pages' + redirect,
+ })
+ cookie.remove('redirect')
+ } else {
+ reLaunch({
+ path: '/pages/home/index',
+ })
+ }
+ })
+ .catch(() => {
+ reject('当前运行环境为微信浏览器')
+ reLaunch({
+ path: '/pages/home/index',
+ })
+ })
+ } else {}
+ return
+ }
+ if (Vue.prototype.$deviceType == 'weixinh5') {
+ console.log('当前运行环境为H5')
+ reject('当前运行环境为H5')
+ return
+ }
+ if (Vue.prototype.$deviceType == 'app') {
+ console.log('当前运行环境为app')
+ reject('当前运行环境为app')
+ return
+ }
+ console.log('————————————————————')
+ console.log('开始登录')
+ console.log('————————————————————')
+ console.log('获取环境商')
+ getProvider()
+ .then(provider => {
+ console.log('当前的环境商')
+ console.log(provider)
+ if (!provider) {
+ reject()
+ }
+ // 调用登录接口
+ console.log('调用登录接口')
+ uni.login({
+ provider: provider,
+ success: async function(loginRes) {
+ console.log(loginRes)
+ // 微信登录
+ console.log('登录接口调用成功')
+ console.log('开始检查用户信息授权')
+ let code = loginRes.code
+ cookie.set('wxLoginCode', loginRes.code)
+
+ let authorizeRes = await authorize('userInfo')
+ if (!wx.getUserProfile && !authorizeRes) {
+ reject('用户未授权')
+ return
+ }
+ if (wx.getUserProfile) {
+ if (loginInfo) {
+ wxappAuth({
+ encryptedData: loginInfo.encryptedData,
+ iv: loginInfo.iv,
+ code: code,
+ spread: cookie.get('spread'),
+ })
+ .then(({
+ data
+ }) => {
+ console.log('登录接口调用成功')
+ console.log('开始处理登录信息保存,并获取用户详情')
+ uni.hideLoading()
+ store.commit('login', data.token, dayjs(data.expires_time))
+ store.dispatch('userInfo', true)
+ getUserInfo()
+ .then(user => {
+ console.log('获取用户信息成功')
+ uni.setStorageSync('uid', user.data.uid)
+ store.dispatch('setUserInfo', user.data)
+ resolve(user)
+ })
+ .catch(error => {
+ console.log('获取用户信息失败')
+ reject('获取用户信息失败')
+ })
+ })
+ .catch(error => {
+ console.log(error)
+ console.log('登录接口调用失败')
+ reject('登录接口调用失败')
+ })
+ } else {
+ reject('用户未授权')
+ return
+ }
+ } else {
+ uni.getUserInfo({
+ provider: provider,
+ success: function(user) {
+ console.log(user)
+ console.log('获取用户信息成功')
+ console.log('开始调用登录接口')
+ wxappAuth({
+ encryptedData: user.encryptedData,
+ iv: user.iv,
+ code: code,
+ spread: cookie.get('spread'),
+ })
+ .then(({
+ data
+ }) => {
+ console.log('登录接口调用成功')
+ console.log('开始处理登录信息保存,并获取用户详情')
+ uni.hideLoading()
+ store.commit('login', data.token, dayjs(data.expires_time))
+ store.dispatch('userInfo', true)
+ getUserInfo()
+ .then(user => {
+ console.log('获取用户信息成功')
+ uni.setStorageSync('uid', user.data.uid)
+ store.dispatch('setUserInfo', user.data)
+ resolve(user)
+ })
+ .catch(error => {
+ console.log('获取用户信息失败')
+ reject('获取用户信息失败')
+ })
+ })
+ .catch(error => {
+ console.log(error)
+ console.log('登录接口调用失败')
+ reject('登录接口调用失败')
+ })
+ },
+ fail() {
+ console.log('获取用户信息失败')
+ reject('获取用户信息失败')
+ },
+ })
+ }
+ },
+ fail() {
+ console.log('调用登录接口失败')
+ reject('调用登录接口失败')
+ },
+ })
+ })
+ .catch(error => {
+ reject('获取环境服务商失败')
+ })
+ })
+}
+
+export const handleGetUserInfo = () => {
+ getUserInfo().then(res => {
+ console.log('获取用户信息')
+ store.dispatch('setUserInfo', res.data)
+ console.log('获取用户信息后跳转回显的页面')
+
+ let redirect = cookie.get('redirect').replace(/\ /g, '')
+ if (redirect) {
+ reLaunch({
+ path: redirect,
+ // query
+ })
+ return
+ }
+ back()
+ // reLaunch({
+ // path: '/pages/home/index',
+ // // query
+ // })
+
+ // var pages = getCurrentPages() //获取加载的页面
+ // var currentPage = pages[pages.length - 1] //获取当前页面的对象
+ // let url = "/pages/home/index"
+ // let query = {}
+ // if (currentPage) {
+ // const {
+ // redirect,
+ // ...querys
+ // } = currentPage.options
+ // // 获取到最后一个页面
+ // if (
+ // currentPage.route != 'pages/Loading/index' &&
+ // currentPage.route != 'pages/user/Login/index'
+ // ) {
+ // url = currentPage.route
+ // query = {
+ // ...querys
+ // }
+ // }
+ // if (currentPage.route == 'pages/authorization/index') {
+
+ // url = redirect
+ // query = {
+ // ...querys
+ // }
+ // }
+
+ // }
+ // console.log(url)
+ // if (url == '/pages/home/index' || url == '/pages/shop/GoodsClass/index' || url == '/pages/shop/ShoppingCart/index' || url == '/pages/user/User/index') {
+ // switchTab({
+ // path: `${url}`,
+ // query
+ // });
+ // } else {
+ // let redirect = cookie.get('redirect')
+ // if (redirect) {
+
+ // reLaunch({
+ // path: redirect,
+ // // query
+ // });
+ // return
+ // }
+ // console.log('获取用户信息后跳转回显的页面')
+ // // 为了防止返回上一页是授权页面,先重定向到首页,再跳转
+ // console.log({
+ // path: `/${url}`,
+ // query
+ // })
+ // reLaunch({
+ // path: '/pages/home/index',
+ // // query
+ // });
+
+ // setTimeout(() => {
+ // if (url.indexOf('/') == 0) {
+ // url = url.slice(1)
+ // }
+ // push({
+ // path: `/${url}`,
+ // query
+ // })
+ // })
+
+ // // push({
+ // // path: `${url}`,
+ // // query
+ // // })
+ // }
+ })
+}
+
+export function parseUrl(location) {
+ if (typeof location === 'string') return location
+ const {
+ path,
+ query
+ } = location
+
+ const queryStr = stringify(query)
+
+ if (!queryStr) {
+ return path
+ }
+
+ return `${path}?${queryStr}`
+}
+
+export function parseRoute($mp) {
+ const _$mp = $mp || {}
+ const path = _$mp.page && _$mp.page.route
+ return {
+ path: `/${path}`,
+ params: {},
+ query: _$mp.query || _$mp.page.options,
+ hash: '',
+ fullPath: parseUrl({
+ path: `/${path}`,
+ query: _$mp.query || _$mp.page.options,
+ }),
+ name: path && path.replace(/\/(\w)/g, ($0, $1) => $1.toUpperCase()),
+ }
+}
+
+export function handleAuth() {
+ /**
+ * 如何判断权限?
+ * 用户如果登录了系统,会留下两个东西,一个是token,一个是userInfo
+ * token存在会过期的问题,如果长时间没有打开小程序,会导致登录失效,出现打开一个页面瞬间跳转到授权页面的问题
+ * 解决办法,保存token的时候加上过期时间,每次请求都取一下缓存里的token
+ * userInfo只是用来限时用户信息,作用并不是很大
+ * ps:只需要判断 token 是否存在即可
+ */
+ if (cookie.get('login_status')) {
+ return true
+ }
+ return false
+}
+
+export const handleLoginStatus = (location, complete, fail, success) => {
+ // 不登录可访问的页面
+ let page = [{
+ path: '/pages/Loading/index',
+ name: 'loading页面',
+ },
+ {
+ path: '/pages/home/index',
+ name: '首页',
+ },
+ {
+ path: '/pages/shop/HotNewGoods/index',
+ name: '热门榜单',
+ },
+ {
+ path: '/pages/activity/GoodsGroup/index',
+ name: '超值拼团',
+ },
+ {
+ path: '/pages/shop/Live/LiveList/index',
+ name: '热门直播',
+ },
+ {
+ path: '/pages/shop/GoodsClass/index',
+ name: '商品分类',
+ },
+ {
+ path: '/pages/user/Login/index',
+ name: '登录页面',
+ },
+ {
+ path: '/pages/authorization/index',
+ name: '授权页面',
+ },
+ {
+ path: '/pages/course/index',
+ name: '课程首页',
+ },
+
+ ]
+
+ // 是否可以访问
+ let isAuth = false
+ console.log('即将跳转', location, parseUrl(location))
+
+ // 从 location 中获取当前url,location typeof string || object
+ let path = ''
+ if (typeof location === 'string') {
+ path = location
+ } else {
+ path = location.path
+ }
+ console.log(path)
+ // 判断用户是否有token
+ if (!handleAuth()) {
+ page.map(item => {
+ if (item.path == path) {
+ isAuth = true
+ }
+ })
+ } else {
+ isAuth = true
+ }
+ console.log(isAuth)
+ return new Promise((resolve, reject) => {
+ resolve({
+ url: parseUrl(location),
+ complete,
+ fail,
+ success,
+ })
+ // if (isAuth) {
+ // // 有token
+ // if (path == '/pages/home/index' || path == '/pages/shop/GoodsClass/index' || path == '/pages/shop/ShoppingCart/index' || path == '/pages/user/User/index') {
+ // // switchTab({
+ // // path: parseUrl(location),
+ // // })
+ // // return
+ // }
+
+ // resolve({
+ // url: parseUrl(location),
+ // complete,
+ // fail,
+ // success,
+ // })
+ // } else {
+ // // 没有token,先校验用户是否授权,如果授权了,进行自动登录
+ // routerPermissions(parseUrl(location))
+ // reject()
+ // }
+ }).catch(error => {
+ console.log(error)
+ })
+}
+
+// export function checkPermissions(){
+
+// }
+
+export function routerPermissions(url, type) {
+ console.log('routerPermissions', url)
+ console.log('————————')
+ console.log(url, type, 'routerPermissions')
+ console.log('————————')
+ let path = url
+ if (!path) {
+ path = '/' + getCurrentPageUrlWithArgs()
+ }
+ console.log(Vue.prototype.$deviceType)
+ if (Vue.prototype.$deviceType == 'routine') {
+ console.log('————————')
+ console.log('当前是微信小程序,开始处理小程序登录方法')
+ console.log('————————')
+ // 如果是微信小程序,跳转到授权页
+ // 先校验用户是否授权,如果授权了,进行自动登录
+ console.log('————————')
+ console.log('开始校验权限')
+ console.log('————————')
+ authorize('userInfo')
+ .then(() => {
+ // 自动登录
+ console.log('————————')
+ console.log('自动登录')
+ console.log('————————')
+ login()
+ .then(res => {
+ // 登录成功,跳转到需要跳转的页面
+ console.log('————————')
+ console.log('登录成功,跳转页面')
+ console.log('————————')
+ store.commit('updateAuthorizationPage', false)
+ if (path == '/pages/shop/ShoppingCart/index' || path == '/pages/user/User/index') {
+ console.log('————————')
+ console.log('当前是购物车,或者个人中心')
+ console.log('————————')
+ return
+ }
+ if (type == 'reLaunch') {
+ reLaunch({
+ path,
+ })
+ return
+ }
+ if (type == 'replace') {
+ replace({
+ path,
+ })
+ return
+ }
+ push({
+ path,
+ })
+ })
+ .catch(error => {
+ console.log('————————')
+ console.log('自动登录失败,跳转到授权页面')
+ console.log('————————')
+ uni.showToast({
+ title: error,
+ icon: 'none',
+ duration: 2000,
+ })
+ reLaunch({
+ path: '/pages/authorization/index',
+ })
+ cookie.set('redirect', path)
+ })
+ })
+ .catch(error => {
+ // 跳转到登录页面或者授权页面
+ if (path == '/pages/shop/ShoppingCart/index' || path == '/pages/user/User/index') {
+ switchTab({
+ path,
+ })
+ store.commit('updateAuthorizationPage', false)
+ return
+ }
+ reLaunch({
+ path: '/pages/authorization/index',
+ })
+ cookie.set('redirect', path)
+ })
+ } else if (Vue.prototype.$deviceType == 'weixin') {
+ wechat().then(() => oAuth())
+ if (!type) {
+ push({
+ path: url,
+ })
+ }
+ } else {
+ console.log(path)
+ // 如果不是小程序跳转到登录页
+ cookie.set('redirect', path)
+ push({
+ path: '/pages/user/Login/index',
+ })
+ }
+}
+
+export function push(location, complete, fail, success) {
+ handleLoginStatus(location, complete, fail, success)
+ .then(params => {
+ uni.navigateTo(params)
+ })
+ .catch(error => {
+ // 没有权限
+ })
+}
+
+export function replace(location, complete, fail, success) {
+ handleLoginStatus(location, complete, fail, success)
+ .then(params => {
+ console.log(params)
+ uni.redirectTo(params)
+ })
+ .catch(error => {
+ // 没有权限
+ })
+}
+
+export function reLaunch(location, complete, fail, success) {
+ handleLoginStatus(location, complete, fail, success)
+ .then(params => {
+ console.log(params)
+ uni.reLaunch(params)
+ })
+ .catch(error => {
+ // 没有权限
+ console.log(error)
+ })
+}
+
+export function go(delta) {
+ uni.navigateBack({
+ delta,
+ })
+}
+
+export function back() {
+ uni.navigateBack({
+ delta: 1,
+ success: function(e) {},
+ fail: function(e) {},
+ })
+}
+
+export function switchTab(location, complete, fail, success) {
+ handleLoginStatus(location, complete, fail, success)
+
+ .then(params => {
+ console.log('params', params)
+ uni.switchTab(params)
+ })
+ .catch(error => {
+ // 没有权限
+ })
+}
+
+export const _router = {
+ mode: 'history',
+ switchTab,
+ push,
+ replace,
+ go,
+ back,
+ reLaunch,
+}
+
+export function handleQrCode() {
+ var urlSpread = parseQuery()['q']
+ if (urlSpread) {
+ if (urlSpread.indexOf('%3F') != -1) {
+ // 通过海报二维码进来
+ urlSpread = urlSpread
+ .split('%3F')[1]
+ .replace(/%3D/g, ':')
+ .replace(/%26/g, ',')
+ .split(',')
+ .map((item, index) => {
+ item = item.split(':')
+ return `"${item[0]}":"${item[1]}"`
+ })
+ .join(',')
+ urlSpread = JSON.parse('{' + urlSpread + '}')
+ return urlSpread
+ } else {
+ return handleUrlParam(urlSpread)
+ }
+ }
+ return null
+}
+
+export function handleUrlParam(path) {
+ var url = path.split('?')[1] //获取url中"?"符后的字串
+ var theRequest = new Object()
+ if (path.includes('?')) {
+ var url = path.split('?')[1] //获取url中"?"符后的字串
+ let strs = url.split('&')
+ for (var i = 0; i < strs.length; i++) {
+ theRequest[strs[i].split('=')[0]] = unescape(strs[i].split('=')[1])
+ }
+ }
+ return theRequest
+}
+
+const getImageInfo = images => {
+ return new Promise((resolve, reject) => {
+ let imageAry = {}
+ images.map((item, index) => {
+ uni.getImageInfo({
+ src: item,
+ fail: function(res) {
+ imageAry[index] = null
+ if (imageAry.length == images.length) {
+ resolve(imageAry)
+ }
+ },
+ success: function(res) {
+ imageAry[index] = res
+ if (Object.keys(imageAry).length == images.length) {
+ resolve(imageAry)
+ }
+ },
+ })
+ })
+ })
+}
+
+/**
+ * 获取分享海报
+ * @param array store 海报素材
+ * @param string store_name 素材文字
+ * @param string price 价格
+ * @param function successFn 回调函数
+ *
+ *
+ */
+export const PosterCanvas = (store, successCallBack) => {
+ uni.showLoading({
+ title: '海报生成中',
+ mask: true,
+ })
+ getImageInfo([store.image, store.code]).then(res => {
+ let contentHh = 48 * 1.3
+ const ctx = uni.createCanvasContext('myCanvas')
+ ctx.clearRect(0, 0, 0, 0)
+ const WIDTH = 747
+ const HEIGHT = 1326
+ ctx.fillStyle = '#FFFFFF'
+ ctx.fillRect(0, 0, WIDTH, HEIGHT)
+ ctx.drawImage(res[0].path, 0, 0, WIDTH, WIDTH)
+ ctx.drawImage(res[1].path, 40, 1064, 200, 200)
+ ctx.save()
+ let r = 90
+ let d = r * 2
+ let cx = 40
+ let cy = 990
+ ctx.arc(cx + r, cy + r, r, 0, 2 * Math.PI)
+ ctx.clip()
+ ctx.restore()
+ ctx.setTextAlign('center')
+ ctx.setFontSize(48)
+ ctx.setFillStyle('#000')
+ ctx.fillText(store.title, WIDTH / 2, 810 + contentHh)
+ ctx.setTextAlign('center')
+ ctx.setFontSize(32)
+ ctx.setFillStyle('red')
+ ctx.fillText('¥' + store.price, WIDTH / 2, 985)
+ ctx.setTextAlign('center')
+ ctx.setFontSize(22)
+ ctx.setFillStyle('#333333')
+ ctx.fillText('长按识别二维码立即购买', WIDTH / 2, 1167)
+ ctx.save()
+ ctx.draw(true, () => {
+ uni.canvasToTempFilePath({
+ canvasId: 'myCanvas',
+ fileType: 'png',
+ destWidth: WIDTH,
+ destHeight: HEIGHT,
+ success: function(res) {
+ uni.hideLoading()
+ successCallBack && successCallBack(res.tempFilePath)
+ },
+ fail: function(error) {
+ console.log(error)
+ },
+ })
+ })
+ })
+
+ // uni.getImageInfo({
+ // src: store.image,
+ // fail: function (res) {
+ // uni.showToast({
+ // title: '海报生成失败',
+ // icon: "none",
+ // duration: 2000
+ // });
+ // },
+ // success: function (res) {
+
+ // }
+ // })
+}
+
+export const handleLoginFailure = () => {
+ console.log('————————')
+ console.log('退出登录,标记当前页面为授权页面,防止多次跳转')
+ console.log('————————')
+
+ store.commit('logout')
+ // 改为授权取消
+ store.commit('updateAuthorization', false)
+
+ let currentPageUrl = getCurrentPageUrl()
+ if (store.state.$deviceType == 'weixin') {
+ // 如果不是授权页面,
+ if (!store.getters.isAuthorizationPage) {
+ // 标识当前为授权页面
+ store.commit('updateAuthorizationPage', true)
+ toAuth()
+ }
+ return
+ } else {
+ // token 失效
+ // 判断当前是不是已经在登录页面或者授权页,防止二次跳转
+ if (store.getters.isAuthorizationPage || currentPageUrl == '/pages/user/Login/index') {
+ console.log(store.getters.isAuthorizationPage, currentPageUrl, '已经是登录页面或者授权页面,跳出方法')
+ return
+ }
+ }
+
+ console.log('————————')
+ console.log('当前是授权页面')
+ console.log(store.getters)
+ console.log('————————')
+ store.commit('updateAuthorizationPage', true)
+
+ let path = '/' + getCurrentPageUrlWithArgs()
+
+ let qrCode = handleQrCode()
+
+ if (qrCode) {
+ // 当前是通过海报扫描进入的
+
+ // 判断是不是拼团进来的
+ if (currentPageUrl == 'pages/activity/GroupRule/index') {
+ console.log('————————')
+ console.log('是拼团进来的')
+ console.log('————————')
+ if (qrCode.pinkId) {
+ path = parseUrl({
+ path: `/ ${currentPageUrl} `,
+ query: {
+ id: qrCode.pinkId,
+ },
+ })
+ if (qrCode.spread) {
+ cookie.set('spread', qrCode.spread || 0)
+ }
+ } else {
+ console.log('————————')
+ console.log('是拼团进来的,但是没有获取到参数')
+ console.log('————————')
+ handleNoParameters()
+ }
+ }
+
+ // 判断是不是扫描的砍价海报进来的
+ if (currentPageUrl == 'pages/activity/DargainDetails/index') {
+ console.log('————————')
+ console.log('是扫描的砍价海报进来的')
+ console.log('————————')
+
+ if (qrCode.bargainId) {
+ path = parseUrl({
+ path: `/ ${currentPageUrl} `,
+ query: {
+ id: qrCode.bargainId,
+ partake: qrCode.uid,
+ },
+ })
+ if (qrCode.spread) {
+ cookie.set('spread', qrCode.spread || 0)
+ }
+ } else {
+ handleNoParameters()
+ console.log('————————')
+ console.log('是扫描的砍价海报进来的,但是没有获取到参数')
+ console.log('————————')
+ }
+ }
+
+ if (currentPageUrl == 'pages/shop/GoodsCon/index') {
+ console.log('————————')
+ console.log('是扫描的商品详情')
+ console.log('————————')
+
+ if (qrCode.productId) {
+ path = parseUrl({
+ path: `/ ${currentPageUrl} `,
+ query: {
+ id: qrCode.productId,
+ },
+ })
+ if (qrCode.spread) {
+ cookie.set('spread', qrCode.spread || 0)
+ }
+ } else {
+ handleNoParameters()
+ console.log('————————')
+ console.log('是扫描的商品详情进来的,但是没有获取到参数')
+ console.log('————————')
+ }
+ }
+ }
+
+ console.log('————————')
+ console.log(path, '重定向页面地址')
+ console.log('————————')
+ routerPermissions(path, 'reLaunch')
+}
+
+const handleNoParameters = () => {
+ uni.showToast({
+ title: '未获取到必要参数,即将跳转首页',
+ icon: 'success',
+ duration: 2000,
+ })
+ setTimeout(() => {
+ clearTimeout()
+ switchTab({
+ path: '/pages/home/index',
+ })
+ }, 1500)
+}
+
+export function chooseImage(callback) {
+ uni.chooseImage({
+ count: 1,
+ sourceType: ['album'],
+ success: res => {
+ uni.getImageInfo({
+ src: res.tempFilePaths[0],
+ success: image => {
+ console.log(image)
+ uni.showLoading({
+ title: '图片上传中',
+ mask: true
+ })
+ uni.uploadFile({
+ url: `${VUE_APP_API_URL}/api/upload`,
+ file: image,
+ filePath: image.path,
+ header: {
+ Authorization: 'Bearer ' + store.getters.token,
+ },
+ name: 'file',
+ success: res => {
+ if (callback) {
+ callback(JSON.parse(res.data).link)
+ }
+ },
+ fail: err => {
+ uni.showToast({
+ title: '上传图片失败',
+ icon: 'none',
+ duration: 2000,
+ })
+ },
+ complete: res => {
+ uni.hideLoading()
+ },
+ })
+ },
+ fail: err => {
+ uni.showToast({
+ title: '获取图片信息失败',
+ icon: 'none',
+ duration: 2000,
+ })
+ },
+ })
+ },
+ })
+}
+export function chooseImages(callback) {
+ uni.chooseImage({
+ count: 9,
+ sourceType: ['album'],
+ success: res => {
+ const tempFilePaths = res.tempFilePaths;
+ for (let i = 0; i < tempFilePaths.length; i++) {
+ uni.getImageInfo({
+ src: tempFilePaths[i],
+ success: image => {
+ uni.showLoading({
+ title: '图片上传中',
+ mask: true
+ })
+ uni.uploadFile({
+ url: `${VUE_APP_API_URL}/api/upload`,
+ file: image,
+ filePath: image.path,
+ header: {
+ Authorization: 'Bearer ' + store.getters.token,
+ },
+ name: 'file',
+ success: res => {
+ if (callback) {
+ callback(JSON.parse(res.data).link)
+ }
+ },
+ fail: err => {
+ uni.showToast({
+ title: '上传图片失败',
+ icon: 'none',
+ duration: 2000,
+ })
+ },
+ complete: res => {
+ uni.hideLoading()
+ },
+ })
+ },
+ fail: err => {
+ uni.showToast({
+ title: '获取图片信息失败',
+ icon: 'none',
+ duration: 2000,
+ })
+ },
+ })
+ }
+ },
+ })
+}
+
+export function handleErrorMessage(err) {
+ console.log(err)
+ uni.hideLoading()
+ uni.showToast({
+ title: err.msg || err.response.data.msg || err.response.data.message || '创建订单失败',
+ icon: 'none',
+ duration: 2000,
+ })
}
diff --git a/wxcomponents/vant/button/index.vue b/wxcomponents/vant/button/index.vue
new file mode 100644
index 0000000..082a862
--- /dev/null
+++ b/wxcomponents/vant/button/index.vue
@@ -0,0 +1,96 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wxcomponents/vant/common/index.css b/wxcomponents/vant/common/index.css
new file mode 100644
index 0000000..6e6891f
--- /dev/null
+++ b/wxcomponents/vant/common/index.css
@@ -0,0 +1 @@
+.van-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical}.van-multi-ellipsis--l3{-webkit-line-clamp:3}.van-clearfix:after{display:table;clear:both;content:""}.van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{position:absolute;box-sizing:border-box;-webkit-transform-origin:center;transform-origin:center;content:" ";pointer-events:none;top:-50%;right:-50%;bottom:-50%;left:-50%;border:0 solid #eee;-webkit-transform:scale(.5);transform:scale(.5)}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px}
\ No newline at end of file
diff --git a/wxcomponents/vant/common/style/clearfix.css b/wxcomponents/vant/common/style/clearfix.css
new file mode 100644
index 0000000..a0ca838
--- /dev/null
+++ b/wxcomponents/vant/common/style/clearfix.css
@@ -0,0 +1 @@
+.van-clearfix:after{display:table;clear:both;content:""}
\ No newline at end of file
diff --git a/wxcomponents/vant/common/style/ellipsis.css b/wxcomponents/vant/common/style/ellipsis.css
new file mode 100644
index 0000000..1e9dbc9
--- /dev/null
+++ b/wxcomponents/vant/common/style/ellipsis.css
@@ -0,0 +1 @@
+.van-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical}.van-multi-ellipsis--l3{-webkit-line-clamp:3}
\ No newline at end of file
diff --git a/wxcomponents/vant/common/style/hairline.css b/wxcomponents/vant/common/style/hairline.css
new file mode 100644
index 0000000..f64e2f8
--- /dev/null
+++ b/wxcomponents/vant/common/style/hairline.css
@@ -0,0 +1 @@
+.van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{position:absolute;box-sizing:border-box;-webkit-transform-origin:center;transform-origin:center;content:" ";pointer-events:none;top:-50%;right:-50%;bottom:-50%;left:-50%;border:0 solid #eee;-webkit-transform:scale(.5);transform:scale(.5)}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px}
\ No newline at end of file
diff --git a/wxcomponents/vant/common/style/mixins/clearfix.css b/wxcomponents/vant/common/style/mixins/clearfix.css
new file mode 100644
index 0000000..e69de29
diff --git a/wxcomponents/vant/common/style/mixins/ellipsis.css b/wxcomponents/vant/common/style/mixins/ellipsis.css
new file mode 100644
index 0000000..e69de29
diff --git a/wxcomponents/vant/common/style/mixins/hairline.css b/wxcomponents/vant/common/style/mixins/hairline.css
new file mode 100644
index 0000000..e69de29
diff --git a/wxcomponents/vant/common/style/theme.css b/wxcomponents/vant/common/style/theme.css
new file mode 100644
index 0000000..e69de29
diff --git a/wxcomponents/vant/common/style/var.css b/wxcomponents/vant/common/style/var.css
new file mode 100644
index 0000000..e69de29
diff --git a/wxcomponents/vant/icon/index.vue b/wxcomponents/vant/icon/index.vue
new file mode 100644
index 0000000..d104ccb
--- /dev/null
+++ b/wxcomponents/vant/icon/index.vue
@@ -0,0 +1,1012 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wxcomponents/vant/info/index.vue b/wxcomponents/vant/info/index.vue
new file mode 100644
index 0000000..212bccc
--- /dev/null
+++ b/wxcomponents/vant/info/index.vue
@@ -0,0 +1,20 @@
+
+{{ dot ? '' : info }}
+
+
+
+
\ No newline at end of file
diff --git a/wxcomponents/vant/loading/index.vue b/wxcomponents/vant/loading/index.vue
new file mode 100644
index 0000000..c7051ff
--- /dev/null
+++ b/wxcomponents/vant/loading/index.vue
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file