From 1882983fc9ddba6a912d2ded3fc8e1842838e8fb Mon Sep 17 00:00:00 2001 From: linju-json Date: Fri, 23 Apr 2021 22:00:23 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=BB=93=E6=9E=84=EF=BC=8C?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=AA=E4=BA=BA=E8=B5=84=E6=96=99=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App.vue | 183 +++-- baseapp.config.js | 79 ++- common/appInit.js | 224 +++--- .../auth-btn/auth-btn.vue | 0 .../login-action-sheet/login-action-sheet.vue | 0 .../login-ikonw/login-ikonw.vue | 0 .../login-short-code/login-short-code.vue | 0 .../uni-quick-login/uni-quick-login.vue | 273 ++++++++ js_sdk/request.js | 22 +- pages.json | 85 ++- pages/list/detail.vue | 13 +- pages/networkErr/networkErr.vue | 68 -- pages/test/test.vue | 12 +- .../ucenter/edit/bind-mobile/bind-mobile.vue | 95 +++ pages/ucenter/edit/edit.vue | 195 ++++++ .../ucenter/login-page}/common/loginPage.css | 1 - .../login-page}/common/loginPage.mixin.js | 0 .../login-page}/common/loginSuccess.js | 0 .../ucenter/login-page}/index/index.vue | 4 +- .../login-page}/phone-code/phone-code.vue | 4 +- .../login-page}/pwd-login/pwd-login.vue | 23 +- .../login-page}/pwd-retrieve/pwd-retrieve.vue | 11 +- .../ucenter/login-page}/register/register.vue | 29 +- .../ucenter/login-page}/register/validator.js | 0 pages/ucenter/settings/dc-push/push.js | 1 - pages/ucenter/settings/settings.vue | 91 +-- pages/ucenter/ucenter.vue | 111 +-- static/uni-quick-login/apple.png | Bin 0 -> 9709 bytes static/uni-quick-login/sms.png | Bin 0 -> 9153 bytes static/uni-quick-login/univerify.png | Bin 0 -> 6793 bytes static/uni-quick-login/user.png | Bin 0 -> 6307 bytes static/uni-quick-login/wechat.png | Bin 0 -> 8754 bytes store/modules/user.js | 14 +- .../cloudfunctions/user-center/index.js | 58 +- .../user-center/package-lock.json | 58 ++ .../cloudfunctions/user-center/package.json | 16 + .../cloudfunctions/user/index.js | 0 .../cloudfunctions/user/package-lock.json | 59 ++ .../cloudfunctions/user/package.json | 0 .../cloudfunctions/user/user.param.json | 0 .../database/opendb-news-articles.schema.json | 2 +- .../uni-id-users/pages/uni-id-users/edit.vue | 4 +- uni_modules/uni-login-page/changelog.md | 0 .../uni-quick-login/uni-quick-login.vue | 237 ------- uni_modules/uni-login-page/package.json | 76 --- uni_modules/uni-login-page/readme.md | 1 - .../uni-login-page/static/login/db.png | Bin 7059 -> 0 bytes .../uni-login-page/static/login/qq.png | Bin 9480 -> 0 bytes .../uni-login-page/static/login/smsCode.png | Bin 8923 -> 0 bytes .../uni-login-page/static/login/univerify.png | Bin 8366 -> 0 bytes .../uni-login-page/static/login/username.png | Bin 11780 -> 0 bytes .../uni-login-page/static/login/weibo.png | Bin 8469 -> 0 bytes .../uni-login-page/static/login/weixin.png | Bin 5656 -> 0 bytes .../user-center/package-lock.json | 25 - .../cloudfunctions/user-center/package.json | 16 - .../cloudfunctions/user/package-lock.json | 25 - uni_modules/uni-popup/changelog.md | 18 +- .../components/uni-popup-dialog/keypress.js | 90 +-- .../uni-popup-dialog/uni-popup-dialog.vue | 530 +++++++-------- .../uni-popup-message/uni-popup-message.vue | 276 ++++---- .../uni-popup-share/uni-popup-share.vue | 320 ++++----- .../components/uni-popup/keypress.js | 90 +-- .../uni-popup/components/uni-popup/message.js | 44 +- .../uni-popup/components/uni-popup/popup.js | 100 +-- .../uni-popup/components/uni-popup/share.js | 32 +- .../components/uni-popup/uni-popup.vue | 642 +++++++++--------- uni_modules/uni-popup/package.json | 166 ++--- uni_modules/uni-popup/readme.md | 588 ++++++++-------- uni_modules/uni-transition/changelog.md | 6 + .../uni-transition/createAnimation.js | 126 ++++ .../uni-transition/uni-transition.vue | 554 ++++++++------- uni_modules/uni-transition/package.json | 2 +- uni_modules/uni-transition/readme.md | 377 +++++++++- 73 files changed, 3385 insertions(+), 2691 deletions(-) rename {uni_modules/uni-login-page/components => components}/auth-btn/auth-btn.vue (100%) rename {uni_modules/uni-login-page/components => components}/login-action-sheet/login-action-sheet.vue (100%) rename {uni_modules/uni-login-page/components => components}/login-ikonw/login-ikonw.vue (100%) rename {uni_modules/uni-login-page/components => components}/login-short-code/login-short-code.vue (100%) create mode 100644 components/uni-quick-login/uni-quick-login.vue delete mode 100644 pages/networkErr/networkErr.vue create mode 100644 pages/ucenter/edit/bind-mobile/bind-mobile.vue create mode 100644 pages/ucenter/edit/edit.vue rename {uni_modules/uni-login-page => pages/ucenter/login-page}/common/loginPage.css (94%) rename {uni_modules/uni-login-page => pages/ucenter/login-page}/common/loginPage.mixin.js (100%) rename {uni_modules/uni-login-page => pages/ucenter/login-page}/common/loginSuccess.js (100%) rename {uni_modules/uni-login-page/pages => pages/ucenter/login-page}/index/index.vue (94%) rename {uni_modules/uni-login-page/pages => pages/ucenter/login-page}/phone-code/phone-code.vue (95%) rename {uni_modules/uni-login-page/pages => pages/ucenter/login-page}/pwd-login/pwd-login.vue (81%) rename {uni_modules/uni-login-page/pages => pages/ucenter/login-page}/pwd-retrieve/pwd-retrieve.vue (83%) rename {uni_modules/uni-login-page/pages => pages/ucenter/login-page}/register/register.vue (60%) rename {uni_modules/uni-login-page/pages => pages/ucenter/login-page}/register/validator.js (100%) create mode 100644 static/uni-quick-login/apple.png create mode 100644 static/uni-quick-login/sms.png create mode 100644 static/uni-quick-login/univerify.png create mode 100644 static/uni-quick-login/user.png create mode 100644 static/uni-quick-login/wechat.png rename {uni_modules/uni-login-page/uniCloud => uniCloud-aliyun}/cloudfunctions/user-center/index.js (81%) create mode 100644 uniCloud-aliyun/cloudfunctions/user-center/package-lock.json create mode 100644 uniCloud-aliyun/cloudfunctions/user-center/package.json rename {uni_modules/uni-login-page/uniCloud => uniCloud-aliyun}/cloudfunctions/user/index.js (100%) create mode 100644 uniCloud-aliyun/cloudfunctions/user/package-lock.json rename {uni_modules/uni-login-page/uniCloud => uniCloud-aliyun}/cloudfunctions/user/package.json (100%) rename {uni_modules/uni-login-page/uniCloud => uniCloud-aliyun}/cloudfunctions/user/user.param.json (100%) delete mode 100644 uni_modules/uni-login-page/changelog.md delete mode 100644 uni_modules/uni-login-page/components/uni-quick-login/uni-quick-login.vue delete mode 100644 uni_modules/uni-login-page/package.json delete mode 100644 uni_modules/uni-login-page/readme.md delete mode 100644 uni_modules/uni-login-page/static/login/db.png delete mode 100644 uni_modules/uni-login-page/static/login/qq.png delete mode 100644 uni_modules/uni-login-page/static/login/smsCode.png delete mode 100644 uni_modules/uni-login-page/static/login/univerify.png delete mode 100644 uni_modules/uni-login-page/static/login/username.png delete mode 100644 uni_modules/uni-login-page/static/login/weibo.png delete mode 100644 uni_modules/uni-login-page/static/login/weixin.png delete mode 100644 uni_modules/uni-login-page/uniCloud/cloudfunctions/user-center/package-lock.json delete mode 100644 uni_modules/uni-login-page/uniCloud/cloudfunctions/user-center/package.json delete mode 100644 uni_modules/uni-login-page/uniCloud/cloudfunctions/user/package-lock.json create mode 100644 uni_modules/uni-transition/components/uni-transition/createAnimation.js diff --git a/App.vue b/App.vue index e7c79a7..baa7332 100644 --- a/App.vue +++ b/App.vue @@ -1,75 +1,114 @@ - - - diff --git a/baseapp.config.js b/baseapp.config.js index 467b0d6..b642c10 100644 --- a/baseapp.config.js +++ b/baseapp.config.js @@ -1,40 +1,39 @@ -module.exports = { - "h5":{ - "url":"https://static-76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e.bspapp.com",// 前端网页托管的域名 - "openApp":{ // 在h5端全局悬浮引导用户下载app的功能 更多自定义要求在/common/openApp.js中修改 - "openUrl":'https://sj.qq.com/myapp/detail.htm?apkName=com.tencent.android.qqdownloader&info=6646FD239A6EBA9E2DEE5DFC7E18D867', - "appname": 'base-app', - "logo": './static/logo.png', - } - }, - "mp":{ - "weixin":{ - "id":"gh_33446d7f7a26" - } - }, - "router":{ - "needLogin":[ //配置需要路由拦截的页面地址,在打开这些页面之前会自动检查(不联网)uni_id_token的值是否存在/过期等 - "/uni_modules/uni-id-users/pages/uni-id-users/edit", - "/uni_modules/uni-news-favorite/pages/uni-news-favorite/list", - "/pages/ucenter/edit/uploadCutImageToUnicloud" - ], - "login":["univerify","smsCode","username","weixin","apple"] //默认就是短信验证码登陆 - }, - "about":{ - "appName":"base-app", - "logo":"/static/logo.png", - "company":"数字天堂(北京)网络技术有限公司", - "slogan":"为开发而生", - "agreements":[ - { - "title":"用户服务协议", - "url":"https://ask.dcloud.net.cn/protocol.html" - }, - { - "title":"隐私政策", - "url":"https://ask.dcloud.net.cn/protocol.html" - } - ], - "download":"https://m3w.cn/uniapp" - } -} \ No newline at end of file +module.exports = { + "h5": { + "url": "https://static-76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e.bspapp.com", // 前端网页托管的域名 + "openApp": { // 在h5端全局悬浮引导用户下载app的功能 更多自定义要求在/common/openApp.js中修改 + "openUrl": 'https://sj.qq.com/myapp/detail.htm?apkName=com.tencent.android.qqdownloader&info=6646FD239A6EBA9E2DEE5DFC7E18D867', + "appname": 'base-app', + "logo": './static/logo.png', + } + }, + "mp": { + "weixin": { + "id": "gh_33446d7f7a26" + } + }, + "router": { + "needLogin": [ //配置需要路由拦截的页面地址,在打开这些页面之前会自动检查(不联网)uni_id_token的值是否存在/过期等 + "/pages/ucenter/edit/edit", + "/uni_modules/uni-news-favorite/pages/uni-news-favorite/list", + "/pages/ucenter/edit/uploadCutImageToUnicloud" + ], + "login": ["univerify", "smsCode", "username", "weixin", "apple"] //默认就是短信验证码登陆 + }, + "about": { + "appName": "base-app", + "logo": "/static/logo.png", + "company": "数字天堂(北京)网络技术有限公司", + "slogan": "为开发而生", + "agreements": [{ + "title": "用户服务协议", + "url": "https://ask.dcloud.net.cn/protocol.html" + }, + { + "title": "隐私政策", + "url": "https://ask.dcloud.net.cn/protocol.html" + } + ], + "download": "https://m3w.cn/uniapp" + } +} diff --git a/common/appInit.js b/common/appInit.js index 7b5c233..ef3362f 100644 --- a/common/appInit.js +++ b/common/appInit.js @@ -31,12 +31,12 @@ export default function() { icon: 'none' }) uni.navigateTo({ - url: "/uni_modules/uni-login-page/pages/index/index" + url: "/pages/ucenter/login-page/index/index" }) return false } //控制登陆优先级 - if (url == '/uni_modules/uni-login-page/pages/index/index') { + if (url == '/pages/ucenter/login-page/index/index') { //一键登录(univerify)、密码登陆(username)、快捷登录&验证码登陆(!univerify&password) if (login[0] == 'univerify') { // console.log(e.url,url); @@ -45,7 +45,7 @@ export default function() { } e.url += "univerify_first=true" } else if (login[0] == 'username') { - e.url = "/uni_modules/uni-login-page/pages/pwd-login/pwd-login" + e.url = "/pages/ucenter/login-page/pwd-login/pwd-login" } else { //默认即是 } @@ -62,40 +62,40 @@ export default function() { uni.addInterceptor('chooseImage', { fail(e) { // 失败回调拦截 console.log(e); - if ( - e.errCode === 11 && uni.getSystemInfoSync().platform == "android" || - e.errCode === 2 && uni.getSystemInfoSync().platform == "ios" - ){ - uni.showModal({ - title:"无法访问摄像头", - content: "当前无摄像头访问权限,建议前往设置", - confirmText: "前往设置", - success(e) { - if (e.confirm) { - openAppPermissionSetting() - } - } - }); - } - if(e.errCode === 12 && uni.getSystemInfoSync().platform == "android"){ - uni.showModal({ - title:"无法访问相册", - content: "当前无系统相册访问权限,建议前往设置", - confirmText: "前往设置", - success(e) { - if (e.confirm) { - openAppPermissionSetting() - } - } - }); - } + if ( + e.errCode === 11 && uni.getSystemInfoSync().platform == "android" || + e.errCode === 2 && uni.getSystemInfoSync().platform == "ios" + ){ + uni.showModal({ + title:"无法访问摄像头", + content: "当前无摄像头访问权限,建议前往设置", + confirmText: "前往设置", + success(e) { + if (e.confirm) { + openAppPermissionSetting() + } + } + }); + } + if(e.errCode === 12 && uni.getSystemInfoSync().platform == "android"){ + uni.showModal({ + title:"无法访问相册", + content: "当前无系统相册访问权限,建议前往设置", + confirmText: "前往设置", + success(e) { + if (e.confirm) { + openAppPermissionSetting() + } + } + }); + } } - }) - -// #ifdef APP-PLUS + }) + +// #ifdef APP-PLUS // 设备网络状态变化事件 - eventListenerNetwork() -// #endif + eventListenerNetwork() +// #endif } /** @@ -132,83 +132,85 @@ function initAppVersion() { // 设备网络状态变化事件 function eventListenerNetwork() { - //网络掉线 - uni.getNetworkType({ - success:res=>{ - console.log(res); - if(res.networkType=='none'){ - showNetworkErrPage() - } - uni.showToast({ - title:'当前网络类型:'+res.networkType, - icon:'none', - duration:3000 - }) - } - }); - //监听网络变化 - uni.onNetworkStatusChange(res=> { - console.log(res.isConnected); - console.log(res.networkType); - if(res.networkType!='none'){ - uni.showToast({ - title:'当前网络类型:'+res.networkType, - icon:'none', - duration:3000 - }) - }else{ - showNetworkErrPage() - uni.showToast({ - title:'网络类型:'+res.networkType, - icon:'none', - duration:3000 - }) - } - }); - - function showNetworkErrPage(){ - let pages = getCurrentPages(); - console.log('pages.length',pages.length); - if(pages.length===0|| pages[pages.length - 1].route!='/pages/networkErr/networkErr.vue'){ - uni.navigateTo({ - url:'/pages/networkErr/networkErr' - }) - }else{ - console.log('已经打开'); - } - } +/* + //网络掉线 + uni.getNetworkType({ + success:res=>{ + console.log(res); + if(res.networkType=='none'){ + showNetworkErrPage() + } + uni.showToast({ + title:'当前网络类型:'+res.networkType, + icon:'none', + duration:3000 + }) + } + }); + //监听网络变化 + uni.onNetworkStatusChange(res=> { + console.log(res.isConnected); + console.log(res.networkType); + if(res.networkType!='none'){ + uni.showToast({ + title:'当前网络类型:'+res.networkType, + icon:'none', + duration:3000 + }) + }else{ + showNetworkErrPage() + uni.showToast({ + title:'网络类型:'+res.networkType, + icon:'none', + duration:3000 + }) + } + }); + + function showNetworkErrPage(){ + let pages = getCurrentPages(); + console.log('pages.length',pages.length); + if(pages.length===0 || pages[pages.length - 1].route!='/pages/networkErr/networkErr.vue'){ + uni.navigateTo({ + url:'/pages/networkErr/networkErr' + }) + }else{ + console.log('已经打开'); + } + } -} - -function openAppPermissionSetting(){ - // 跳转到**应用**的权限页面 - if (uni.getSystemInfoSync().platform == "ios") { - var UIApplication = plus.ios.import("UIApplication"); - var application2 = UIApplication.sharedApplication(); - var NSURL2 = plus.ios.import("NSURL"); - // var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES"); - var setting2 = NSURL2.URLWithString("app-settings:"); - application2.openURL(setting2); - plus.ios.deleteObject(setting2); - plus.ios.deleteObject(NSURL2); - plus.ios.deleteObject(application2); - } else { - // console.log(plus.device.vendor); - var Intent = plus.android.importClass("android.content.Intent"); - var Settings = plus.android.importClass("android.provider.Settings"); - var Uri = plus.android.importClass("android.net.Uri"); - var mainActivity = plus.android.runtimeMainActivity(); - var intent = new Intent(); - intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); - var uri = Uri.fromParts("package", mainActivity.getPackageName(), null); - intent.setData(uri); - mainActivity.startActivity(intent); - } -} -/* +} + +function openAppPermissionSetting(){ + // 跳转到**应用**的权限页面 + if (uni.getSystemInfoSync().platform == "ios") { + var UIApplication = plus.ios.import("UIApplication"); + var application2 = UIApplication.sharedApplication(); + var NSURL2 = plus.ios.import("NSURL"); + // var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES"); + var setting2 = NSURL2.URLWithString("app-settings:"); + application2.openURL(setting2); + plus.ios.deleteObject(setting2); + plus.ios.deleteObject(NSURL2); + plus.ios.deleteObject(application2); + } else { + // console.log(plus.device.vendor); + var Intent = plus.android.importClass("android.content.Intent"); + var Settings = plus.android.importClass("android.provider.Settings"); + var Uri = plus.android.importClass("android.net.Uri"); + var mainActivity = plus.android.runtimeMainActivity(); + var intent = new Intent(); + intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + var uri = Uri.fromParts("package", mainActivity.getPackageName(), null); + intent.setData(uri); + mainActivity.startActivity(intent); + } +*/ +} +/* uni.addInterceptor(item, { - invoke(e) { // 调用前拦截 - }, + invoke(e) { // 调用前拦截 + }, success() { // 成功回调拦截 }, fail(err) { // 失败回调拦截 @@ -219,5 +221,5 @@ function openAppPermissionSetting(){ }, returnValue() { // 返回结果拦截 } - }) // 移除拦截器API removeInterceptor('request') + }) // 移除拦截器API removeInterceptor('request') */ \ No newline at end of file diff --git a/uni_modules/uni-login-page/components/auth-btn/auth-btn.vue b/components/auth-btn/auth-btn.vue similarity index 100% rename from uni_modules/uni-login-page/components/auth-btn/auth-btn.vue rename to components/auth-btn/auth-btn.vue diff --git a/uni_modules/uni-login-page/components/login-action-sheet/login-action-sheet.vue b/components/login-action-sheet/login-action-sheet.vue similarity index 100% rename from uni_modules/uni-login-page/components/login-action-sheet/login-action-sheet.vue rename to components/login-action-sheet/login-action-sheet.vue diff --git a/uni_modules/uni-login-page/components/login-ikonw/login-ikonw.vue b/components/login-ikonw/login-ikonw.vue similarity index 100% rename from uni_modules/uni-login-page/components/login-ikonw/login-ikonw.vue rename to components/login-ikonw/login-ikonw.vue diff --git a/uni_modules/uni-login-page/components/login-short-code/login-short-code.vue b/components/login-short-code/login-short-code.vue similarity index 100% rename from uni_modules/uni-login-page/components/login-short-code/login-short-code.vue rename to components/login-short-code/login-short-code.vue diff --git a/components/uni-quick-login/uni-quick-login.vue b/components/uni-quick-login/uni-quick-login.vue new file mode 100644 index 0000000..077a8df --- /dev/null +++ b/components/uni-quick-login/uni-quick-login.vue @@ -0,0 +1,273 @@ + + + + diff --git a/js_sdk/request.js b/js_sdk/request.js index 003edb5..74fe3e6 100644 --- a/js_sdk/request.js +++ b/js_sdk/request.js @@ -20,20 +20,20 @@ export default function request(name,params,callback=false,{showLoading=false,lo return new Promise((resolve,reject)=>{ uniCloud.callFunction({name,data:{action,params}, success(e){ - // console.log(e); + console.log(e); const {result:{data,code}} = e console.log(data,code); - if (code === 0 ) { - resolve(e) - return callback(data,e.result,e) - } - if(debug){ - uni.showModal({ - content: JSON.stringify(e), - showCancel: false, - confirmText: '知道了' - }) + if (code != 0 ) { + if(debug){ + uni.showModal({ + content: JSON.stringify(e), + showCancel: false, + confirmText: '知道了' + }) + } } + resolve(e) + return callback(data,e.result,e) }, fail(err){ reject(err) diff --git a/pages.json b/pages.json index 4cfd79f..f93fd4b 100644 --- a/pages.json +++ b/pages.json @@ -7,30 +7,16 @@ //#endif "enablePullDownRefresh": true } - }, - // #ifdef APP-PLUS - { - "path": "pages/networkErr/networkErr", - "style": { - "navigationStyle": "custom", - "backgroundColor": "transparent", - "app-plus": { - "animationType": "fade-in", - "background": "transparent", - "popGesture": "none" - } - } - }, - // #endif - { - "path": "pages/list/news-list", - "style": { - //#ifndef MP - "navigationStyle": "custom", - //#endif - "enablePullDownRefresh": true - } - }, + }, + { + "path": "pages/list/news-list", + "style": { + //#ifndef MP + "navigationStyle": "custom", + //#endif + "enablePullDownRefresh": true + } + }, { "path": "pages/grid/grid", "style": { @@ -39,7 +25,7 @@ //#endif } }, { - "path": "uni_modules/uni-login-page/pages/index/index", + "path": "pages/ucenter/login-page/index/index", "style": { "navigationBarTitleText": "", "app-plus": { @@ -73,13 +59,18 @@ }, "navigationBarTitleText": "文章详情" } - }, { - "path": "pages/ucenter/ucenter", + "path": "pages/ucenter/edit/bind-mobile/bind-mobile", "style": { "navigationStyle": "custom" } - }, { + }, + { + "path": "pages/ucenter/ucenter", + "style": { + "navigationStyle": "custom" + } + },{ "path": "uni_modules/uni-feedback/pages/opendb-feedback/list", "style": { "navigationBarTitleText": "常见问题" @@ -144,10 +135,10 @@ } } }, { - "path": "uni_modules/uni-agree/pages/uni-agree/uni-agree", - "style": { - "navigationStyle": "custom", - "app-plus":{"popGesture": "none"} + "path": "uni_modules/uni-agree/pages/uni-agree/uni-agree", + "style": { + "navigationStyle": "custom", + "app-plus":{"popGesture": "none"} } }, { "path": "pages/ucenter/settings/settings", @@ -156,9 +147,9 @@ } }, { - "path": "uni_modules/uni-id-users/pages/uni-id-users/edit", + "path": "pages/ucenter/edit/edit", "style": { - "navigationBarTitleText": "编辑资料" + "navigationBarTitleText": "个人资料" } }, { "path": "pages/ucenter/edit/uploadCutImageToUnicloud", @@ -166,17 +157,17 @@ "navigationStyle": "custom" } }, { - "path": "uni_modules/uni-login-page/pages/pwd-login/pwd-login", + "path": "pages/ucenter/login-page/pwd-login/pwd-login", "style": { "navigationBarTitleText": "" } }, { - "path": "uni_modules/uni-login-page/pages/pwd-retrieve/pwd-retrieve", + "path": "pages/ucenter/login-page/pwd-retrieve/pwd-retrieve", "style": { "navigationBarTitleText": "" } }, { - "path": "uni_modules/uni-login-page/pages/phone-code/phone-code", + "path": "pages/ucenter/login-page/phone-code/phone-code", "style": { "navigationBarTitleText": "" } @@ -196,19 +187,19 @@ } }, { - "path": "uni_modules/uni-login-page/pages/register/register", + "path": "pages/ucenter/login-page/register/register", "style": { "navigationBarTitleText": "注册", "enablePullDownRefresh": false } - }, - { - "path":"uni_modules/uni-news-favorite/pages/uni-news-favorite/list", - "style":{ - "navigationBarTitleText": "阅读记录", - "enablePullDownRefresh": false - } + }, + { + "path":"uni_modules/uni-news-favorite/pages/uni-news-favorite/list", + "style":{ + "navigationBarTitleText": "阅读记录", + "enablePullDownRefresh": false + } } ], "globalStyle": { @@ -222,7 +213,7 @@ "path": "pages/list/list" }, { - "path": "uni_modules/uni-login-page/pages/index/index" + "path": "pages/ucenter/login-page/index/index" }, { "path": "pages/test/test" @@ -255,4 +246,4 @@ "text": "我的" }] } -} +} diff --git a/pages/list/detail.vue b/pages/list/detail.vue index 722315c..f0b12e4 100644 --- a/pages/list/detail.vue +++ b/pages/list/detail.vue @@ -53,7 +53,7 @@ import uParse from '@/components/u-parse/parse.vue'; const db = uniCloud.database(); - const dbCollectionName = 'opendb-news-favorite'; + const newsFavoriteTable = db.collection('opendb-news-favorite') import { mapGetters } from 'vuex'; export default { components: { @@ -80,7 +80,8 @@ return `_id =="${this.id}"` }, ...mapGetters({ - 'userInfo':'user/info' + 'userInfo':'user/info', + 'hasLogin':'user/hasLogin' }) }, onLoad(event) { @@ -114,8 +115,8 @@ }, methods: { setFavorite(){ - if(!this.userInfo)return - db.collection(dbCollectionName).where({ + if(!this.has)return + newsFavoriteTable.where({ article_id:this.id, user_id:this.userInfo._id }) @@ -128,9 +129,9 @@ update_date:Date.now() } if(res.result.data.length == 0){ - return db.collection(dbCollectionName).add(value) + return newsFavoriteTable.add(value) } else { - return db.collection(dbCollectionName).where({ + return newsFavoriteTable.where({ article_id:this.id, user_id:this.userInfo._id }) diff --git a/pages/networkErr/networkErr.vue b/pages/networkErr/networkErr.vue deleted file mode 100644 index 6c594f5..0000000 --- a/pages/networkErr/networkErr.vue +++ /dev/null @@ -1,68 +0,0 @@ - - - - - diff --git a/pages/test/test.vue b/pages/test/test.vue index 83eb34d..355faab 100644 --- a/pages/test/test.vue +++ b/pages/test/test.vue @@ -8,22 +8,26 @@ 应用相关权限 --> - + + - + + diff --git a/pages/ucenter/edit/edit.vue b/pages/ucenter/edit/edit.vue new file mode 100644 index 0000000..fbc18fd --- /dev/null +++ b/pages/ucenter/edit/edit.vue @@ -0,0 +1,195 @@ + + + diff --git a/uni_modules/uni-login-page/common/loginPage.css b/pages/ucenter/login-page/common/loginPage.css similarity index 94% rename from uni_modules/uni-login-page/common/loginPage.css rename to pages/ucenter/login-page/common/loginPage.css index 21fc2bb..bf95a2f 100644 --- a/uni_modules/uni-login-page/common/loginPage.css +++ b/pages/ucenter/login-page/common/loginPage.css @@ -5,7 +5,6 @@ page { flex: 1; height: 100%; } - /* #endif */ .wrap { /* #ifndef APP-NVUE */ diff --git a/uni_modules/uni-login-page/common/loginPage.mixin.js b/pages/ucenter/login-page/common/loginPage.mixin.js similarity index 100% rename from uni_modules/uni-login-page/common/loginPage.mixin.js rename to pages/ucenter/login-page/common/loginPage.mixin.js diff --git a/uni_modules/uni-login-page/common/loginSuccess.js b/pages/ucenter/login-page/common/loginSuccess.js similarity index 100% rename from uni_modules/uni-login-page/common/loginSuccess.js rename to pages/ucenter/login-page/common/loginSuccess.js diff --git a/uni_modules/uni-login-page/pages/index/index.vue b/pages/ucenter/login-page/index/index.vue similarity index 94% rename from uni_modules/uni-login-page/pages/index/index.vue rename to pages/ucenter/login-page/index/index.vue index 0ecb84b..4686059 100644 --- a/uni_modules/uni-login-page/pages/index/index.vue +++ b/pages/ucenter/login-page/index/index.vue @@ -41,7 +41,7 @@ + diff --git a/pages/ucenter/ucenter.vue b/pages/ucenter/ucenter.vue index dfca1db..f15a88d 100644 --- a/pages/ucenter/ucenter.vue +++ b/pages/ucenter/ucenter.vue @@ -1,9 +1,9 @@ @@ -83,16 +83,17 @@ }, { title: '设置', to: '/pages/ucenter/settings/settings' - }, { + }], + [{ title: '关于', to: '/pages/ucenter/about/about' }] ] } }, - onLoad() { + onLoad() { //#ifdef APP-PLUS - this.ucenterList[this.ucenterList.length - 1].unshift({ + this.ucenterList[this.ucenterList.length - 2].unshift({ title: '检查更新', rightText: this.appVersion.version + '-' + this.appVersion.versionCode, event: 'checkVersion', @@ -106,14 +107,15 @@ login: 'user/hasLogin' }) // #ifdef APP-PLUS - ,appVersion() { + , + appVersion() { return getApp().appVersion } // #endif }, - methods: { - ...mapMutations({ - setUserInfo: 'user/login' + methods: { + ...mapMutations({ + setUserInfo: 'user/login' }), toSettings() { uni.navigateTo({ @@ -129,64 +131,20 @@ } }, async checkVersion() { - let res = await callCheckVersion() - console.log(res); - if(res.result.code == 0){ - uni.showToast({ - title: res.result.message, - icon: 'none' - }); + let res = await callCheckVersion() + console.log(res); + if (res.result.code == 0) { + uni.showToast({ + title: res.result.message, + icon: 'none' + }); } checkUpdate() }, - toEdit() { - console.log('点击编辑信息'); - // uni.navigateTo({ - // url: '/uni_modules/uni-id-users/pages/uni-id-users/edit' - // }) - const token = uni.getStorageSync('uni_id_token') - if(token){ - uni.chooseImage({ - count:1, - success:(res)=> { - // 头像剪裁尺寸 - let options = { - width:600, - height:600 - } - // 剪裁并上传头像 - uni.navigateTo({ - url:'/pages/ucenter/edit/uploadCutImageToUnicloud?path=' + res.tempFilePaths[0] + `&options=${JSON.stringify(options)}`, - animationType:"fade-in", - events:{ - uploadAvatarAfter:({url})=>{ - console.log(url); - // 使用 clientDB 提交数据 - db.collection('uni-id-users').where('_id==$env.uid').update({avatar:url}).then((res) => { - console.log(res); - uni.showToast({ - icon: 'none', - title: '修改成功' - }) - this.setUserInfo({avatar:url}); - }).catch((err) => { - uni.showModal({ - content: err.message || '请求服务失败', - showCancel: false - }) - }).finally(() => { - uni.hideLoading() - }) - } - } - }); - } - }) - }else{ - uni.navigateTo({ - url:'/uni_modules/uni-login-page/pages/index/index' - }) - } + toUserInfo() { + uni.navigateTo({ + url: '/pages/ucenter/edit/edit' + }) }, tapGrid(index) { uni.showToast({ @@ -233,11 +191,6 @@ title: msg, icon: 'none' }); - }).catch((err) => { - uni.showModal({ - content: err.message || '请求服务失败', - showCancel: false - }) }).finally(() => { uni.hideLoading() }) @@ -254,11 +207,9 @@ font-style: normal; src: url('~@/static/text-icon.ttf') format('truetype'); } - page { background-color: #f8f8f8; } - /* #endif*/ /* 解决头条小程序字体图标不显示问题,因为头条运行时自动插入了span标签,且有全局字体 */ @@ -266,15 +217,12 @@ text :not(view) { font-family: texticons; } - /* #endif */ - .center { flex: 1; flex-direction: column; background-color: #f8f8f8; } - .userInfo { width: 750rpx; padding: 20rpx; @@ -283,25 +231,18 @@ flex-direction: column; align-items: center; } - - /* .logo-hover { - opacity: 0.8; - } */ - .logo-img { width: 150rpx; height: 150rpx; border-radius: 150rpx; border: solid 1px #FFFFFF; } - .logo-title { height: 150rpx; flex: 1; align-items: center; justify-content: space-between; flex-direction: row; - margin-left: 20rpx; } .uer-name { @@ -383,6 +324,6 @@ /* #ifdef APP-NVUE */ border-radius: 10rpx; /* #endif */ - background-color: #DD524D; + background-color: #DD524D; } - + diff --git a/static/uni-quick-login/apple.png b/static/uni-quick-login/apple.png new file mode 100644 index 0000000000000000000000000000000000000000..1d4b1334ff3c1ee81488d9c8cb05df232ec3b652 GIT binary patch literal 9709 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 AQ~&?~ literal 0 HcmV?d00001 diff --git a/static/uni-quick-login/univerify.png b/static/uni-quick-login/univerify.png new file mode 100644 index 0000000000000000000000000000000000000000..00909a84976e151fdfcb7b000e52ed46dc2c6e33 GIT binary patch literal 6793 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 literal 0 HcmV?d00001 diff --git a/static/uni-quick-login/user.png b/static/uni-quick-login/user.png new file mode 100644 index 0000000000000000000000000000000000000000..57153d320f4eec453d8cb7ffe042a95e81347622 GIT binary patch literal 6307 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 V#vVy5&u2jZ3U5_qYNgFT{68%Qxi0_! literal 0 HcmV?d00001 diff --git a/store/modules/user.js b/store/modules/user.js index 66f102b..3f15a9b 100644 --- a/store/modules/user.js +++ b/store/modules/user.js @@ -1,10 +1,8 @@ // 上次启动时的用户信息 -let userHistory = uni.getStorageSync('userInfo') || null; +let userHistory = uni.getStorageSync('userInfo') || {}; let state = { - /** - * 是否需要强制登录 - */ + /* 是否需要强制登录 */ forcedLogin: false, hasLogin: Boolean(userHistory), info: userHistory @@ -22,20 +20,18 @@ let state = { let _info = state.info; state.info = Object.assign({}, _info, info); state.hasLogin = true; - uni.setStorageSync('userInfo', info); + uni.setStorageSync('userInfo', state.info); }, logout(state) { - state.info = null; + state.info = {}; state.hasLogin = false; - uni.setStorageSync('userInfo', null); + uni.setStorageSync('userInfo', {}); uni.setStorageSync('uni_id_token', ''); } }, actions = { } - - export default { state, getters, diff --git a/uni_modules/uni-login-page/uniCloud/cloudfunctions/user-center/index.js b/uniCloud-aliyun/cloudfunctions/user-center/index.js similarity index 81% rename from uni_modules/uni-login-page/uniCloud/cloudfunctions/user-center/index.js rename to uniCloud-aliyun/cloudfunctions/user-center/index.js index 0918d7d..f07c82c 100644 --- a/uni_modules/uni-login-page/uniCloud/cloudfunctions/user-center/index.js +++ b/uniCloud-aliyun/cloudfunctions/user-center/index.js @@ -1,6 +1,10 @@ 'use strict'; let uniID = require('uni-id') const uniCaptcha = require('uni-captcha') +const createConfig = require('uni-config-center') +const uniIdConfig = createConfig({ + pluginId: 'uni-id' +})._config const db = uniCloud.database() const dbCmd = db.command exports.main = async (event, context) => { @@ -84,8 +88,8 @@ exports.main = async (event, context) => { } : { state: 0 }) - if(res.type == 'register'){ - await registerSuccess(res.uid) + if (res.type == 'register') { + await registerSuccess(res.uid) } return await uniIdLogCollection.add(logData) } @@ -94,6 +98,46 @@ exports.main = async (event, context) => { let res = {} switch (event.action) { + case 'bind_mobile_by_univerify': + let { + appid, apiKey, apiSecret + } = uniIdConfig.service.univerify + let univerifyRes = await uniCloud.getPhoneNumber({ + provider: 'univerify', + appid, + apiKey, + apiSecret, + access_token: params.access_token, + openid: params.openid + }) + if (univerifyRes.code === 0) { + res = await uniID.bindMobile({ + uid: params.uid, + mobile: univerifyRes.phoneNumber + }) + res.mobile = univerifyRes.phoneNumber + } + break; + case 'bind_mobile_by_sms': + console.log({ + uid: params.uid, + mobile: params.mobile, + code: params.code + }); + let verifyCode = await uniID.verifyCode({ + mobile: params.mobile, + code: params.code + }) + if (verifyCode.code === 0) { + res = await uniID.bindMobile({ + uid: params.uid, + mobile: params.mobile + }) + } else { + res = verifyCode + } + console.log(res, verifyCode); + break; case 'register': let { username, password, gender, nickname @@ -164,7 +208,15 @@ exports.main = async (event, context) => { case 'logout': res = await uniID.logout(event.uniIdToken) break; - case 'sendSmsCode': + case 'sendSmsCode': + + //123546 + return uniID.setVerifyCode({ + mobile: params.mobile, + code:'123456' + }) + + // 简单限制一下客户端调用频率 const ipLimit = await db.collection('uni-verify').where({ ip: context.CLIENTIP, diff --git a/uniCloud-aliyun/cloudfunctions/user-center/package-lock.json b/uniCloud-aliyun/cloudfunctions/user-center/package-lock.json new file mode 100644 index 0000000..bcc23fb --- /dev/null +++ b/uniCloud-aliyun/cloudfunctions/user-center/package-lock.json @@ -0,0 +1,58 @@ +{ + "name": "user-center", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "uni-captcha": "file:../../../uni_modules/uni-captcha/uniCloud/cloudfunctions/common/uni-captcha", + "uni-config-center": "file:../../../uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center", + "uni-id": "file:../../../uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id" + } + }, + "../../../uni_modules/uni-captcha/uniCloud/cloudfunctions/common/uni-captcha": { + "version": "0.1.0", + "license": "Apache-2.0" + }, + "../../../uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center": { + "version": "0.0.2", + "license": "Apache-2.0" + }, + "../../../uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id": { + "version": "3.0.12", + "license": "Apache-2.0", + "dependencies": { + "uni-config-center": "file:../../../../../uni-config-center/uniCloud/cloudfunctions/common/uni-config-center" + } + }, + "node_modules/uni-captcha": { + "resolved": "../../../uni_modules/uni-captcha/uniCloud/cloudfunctions/common/uni-captcha", + "link": true + }, + "node_modules/uni-config-center": { + "resolved": "../../../uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center", + "link": true + }, + "node_modules/uni-id": { + "resolved": "../../../uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id", + "link": true + } + }, + "dependencies": { + "uni-captcha": { + "version": "file:../../../uni_modules/uni-captcha/uniCloud/cloudfunctions/common/uni-captcha" + }, + "uni-config-center": { + "version": "file:../../../uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center" + }, + "uni-id": { + "version": "file:../../../uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id", + "requires": { + "uni-config-center": "file:../../../../../uni-config-center/uniCloud/cloudfunctions/common/uni-config-center" + } + } + } +} diff --git a/uniCloud-aliyun/cloudfunctions/user-center/package.json b/uniCloud-aliyun/cloudfunctions/user-center/package.json new file mode 100644 index 0000000..927edab --- /dev/null +++ b/uniCloud-aliyun/cloudfunctions/user-center/package.json @@ -0,0 +1,16 @@ +{ + "name": "user-center", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "uni-captcha": "file:../../../uni_modules/uni-captcha/uniCloud/cloudfunctions/common/uni-captcha", + "uni-config-center": "file:../../../uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center", + "uni-id": "file:../../../uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id" + } +} diff --git a/uni_modules/uni-login-page/uniCloud/cloudfunctions/user/index.js b/uniCloud-aliyun/cloudfunctions/user/index.js similarity index 100% rename from uni_modules/uni-login-page/uniCloud/cloudfunctions/user/index.js rename to uniCloud-aliyun/cloudfunctions/user/index.js diff --git a/uniCloud-aliyun/cloudfunctions/user/package-lock.json b/uniCloud-aliyun/cloudfunctions/user/package-lock.json new file mode 100644 index 0000000..7764eaf --- /dev/null +++ b/uniCloud-aliyun/cloudfunctions/user/package-lock.json @@ -0,0 +1,59 @@ +{ + "name": "user", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "uni-captcha": "file:../../../../uni-captcha/uniCloud/cloudfunctions/common/uni-captcha", + "uni-config-center": "file:../../../../uni-config-center/uniCloud/cloudfunctions/common/uni-config-center", + "uni-id": "file:../../../../uni-id/uniCloud/cloudfunctions/common/uni-id" + } + }, + "../../../../uni-captcha/uniCloud/cloudfunctions/common/uni-captcha": {}, + "../../../../uni-config-center/uniCloud/cloudfunctions/common/uni-config-center": {}, + "../../../../uni-id/uniCloud/cloudfunctions/common/uni-id": { + "dependencies": { + "uni-config-center": "file:../../../../uni-config-center/uniCloud/cloudfunctions/common/uni-config-center" + } + }, + "../../../../uni-id/uniCloud/cloudfunctions/common/uni-id/node_modules/uni-config-center": { + "resolved": "../../../../uni-config-center/uniCloud/cloudfunctions/common/uni-config-center", + "link": true + }, + "node_modules/uni-captcha": { + "resolved": "../../../../uni-captcha/uniCloud/cloudfunctions/common/uni-captcha", + "link": true + }, + "node_modules/uni-config-center": { + "resolved": "../../../../uni-config-center/uniCloud/cloudfunctions/common/uni-config-center", + "link": true + }, + "node_modules/uni-id": { + "resolved": "../../../../uni-id/uniCloud/cloudfunctions/common/uni-id", + "link": true + } + }, + "dependencies": { + "uni-captcha": { + "version": "file:../../../../uni-captcha/uniCloud/cloudfunctions/common/uni-captcha" + }, + "uni-config-center": { + "version": "file:../../../../uni-config-center/uniCloud/cloudfunctions/common/uni-config-center" + }, + "uni-id": { + "version": "file:../../../../uni-id/uniCloud/cloudfunctions/common/uni-id", + "requires": { + "uni-config-center": "file:../../../../uni-config-center/uniCloud/cloudfunctions/common/uni-config-center" + }, + "dependencies": { + "uni-config-center": { + "version": "file:../../../../uni-config-center/uniCloud/cloudfunctions/common/uni-config-center" + } + } + } + } +} diff --git a/uni_modules/uni-login-page/uniCloud/cloudfunctions/user/package.json b/uniCloud-aliyun/cloudfunctions/user/package.json similarity index 100% rename from uni_modules/uni-login-page/uniCloud/cloudfunctions/user/package.json rename to uniCloud-aliyun/cloudfunctions/user/package.json diff --git a/uni_modules/uni-login-page/uniCloud/cloudfunctions/user/user.param.json b/uniCloud-aliyun/cloudfunctions/user/user.param.json similarity index 100% rename from uni_modules/uni-login-page/uniCloud/cloudfunctions/user/user.param.json rename to uniCloud-aliyun/cloudfunctions/user/user.param.json diff --git a/uniCloud-aliyun/database/opendb-news-articles.schema.json b/uniCloud-aliyun/database/opendb-news-articles.schema.json index 74d18a4..fd6ffff 100644 --- a/uniCloud-aliyun/database/opendb-news-articles.schema.json +++ b/uniCloud-aliyun/database/opendb-news-articles.schema.json @@ -2,7 +2,7 @@ "bsonType": "object", "required": ["user_id", "title", "content"], "permission": { - "read": "doc.uid == auth.uid && doc.article_status == 0 || doc.article_status == 1", + "read": "doc.article_status == 0 || doc.article_status == 1", "create": "auth.uid != null", "update": "doc.uid == auth.uid", "delete": "doc.uid == auth.uid" diff --git a/uni_modules/uni-id-users/pages/uni-id-users/edit.vue b/uni_modules/uni-id-users/pages/uni-id-users/edit.vue index 1493cc5..14d7c7d 100644 --- a/uni_modules/uni-id-users/pages/uni-id-users/edit.vue +++ b/uni_modules/uni-id-users/pages/uni-id-users/edit.vue @@ -8,9 +8,9 @@ - + diff --git a/uni_modules/uni-login-page/changelog.md b/uni_modules/uni-login-page/changelog.md deleted file mode 100644 index e69de29..0000000 diff --git a/uni_modules/uni-login-page/components/uni-quick-login/uni-quick-login.vue b/uni_modules/uni-login-page/components/uni-quick-login/uni-quick-login.vue deleted file mode 100644 index aa2864c..0000000 --- a/uni_modules/uni-login-page/components/uni-quick-login/uni-quick-login.vue +++ /dev/null @@ -1,237 +0,0 @@ - - - - \ No newline at end of file diff --git a/uni_modules/uni-login-page/package.json b/uni_modules/uni-login-page/package.json deleted file mode 100644 index 1c5fbf5..0000000 --- a/uni_modules/uni-login-page/package.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "id": "uni-login-page", - "displayName": "uni-login-page", - "version": "1.0.0", - "description": "uni-login-page", - "keywords": [ - "uni-login-page" -], - "repository": "", - "engines": { - "HBuilderX": "^3.1.0" - }, - "dcloudext": { - "category": [ - "前端页面模板", - "前端页面模板" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "", - "data": "", - "permissions": "" - }, - "npmurl": "" - }, - "uni_modules": { - "dependencies": [], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "u", - "aliyun": "u" - }, - "client": { - "App": { - "app-vue": "u", - "app-nvue": "u" - }, - "H5-mobile": { - "Safari": "u", - "Android Browser": "u", - "微信浏览器(Android)": "u", - "QQ浏览器(Android)": "u" - }, - "H5-pc": { - "Chrome": "u", - "IE": "u", - "Edge": "u", - "Firefox": "u", - "Safari": "u" - }, - "小程序": { - "微信": "u", - "阿里": "u", - "百度": "u", - "字节跳动": "u", - "QQ": "u" - }, - "快应用": { - "华为": "u", - "联盟": "u" - } - } - } - } -} \ No newline at end of file diff --git a/uni_modules/uni-login-page/readme.md b/uni_modules/uni-login-page/readme.md deleted file mode 100644 index b97c7e2..0000000 --- a/uni_modules/uni-login-page/readme.md +++ /dev/null @@ -1 +0,0 @@ -# uni-login-page \ No newline at end of file diff --git a/uni_modules/uni-login-page/static/login/db.png b/uni_modules/uni-login-page/static/login/db.png deleted file mode 100644 index b6f5aa57d2d9f03d529271f1864cee010dc08328..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7059 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 diff --git a/uni_modules/uni-login-page/static/login/qq.png b/uni_modules/uni-login-page/static/login/qq.png deleted file mode 100644 index 677195fff07b170a0d36ed9c574c79ba81939fdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9480 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 diff --git a/uni_modules/uni-login-page/static/login/smsCode.png b/uni_modules/uni-login-page/static/login/smsCode.png deleted file mode 100644 index fd5b859feb7db2d516bf024ae5a46cc82bbe6fd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8923 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 diff --git a/uni_modules/uni-login-page/static/login/username.png b/uni_modules/uni-login-page/static/login/username.png deleted file mode 100644 index d7c0878c901bfb99b91895d956a98b858b1ec3d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11780 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 MR@YanRIv^DU&P2BQUCw| diff --git a/uni_modules/uni-login-page/static/login/weixin.png b/uni_modules/uni-login-page/static/login/weixin.png deleted file mode 100644 index f392b33485d14e6e125daf12789dc306a7c4b1e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5656 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 diff --git a/uni_modules/uni-login-page/uniCloud/cloudfunctions/user-center/package-lock.json b/uni_modules/uni-login-page/uniCloud/cloudfunctions/user-center/package-lock.json deleted file mode 100644 index 6630381..0000000 --- a/uni_modules/uni-login-page/uniCloud/cloudfunctions/user-center/package-lock.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "user-center", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "uni-captcha": { - "version": "file:../../../../uni-captcha/uniCloud/cloudfunctions/common/uni-captcha" - }, - "uni-config-center": { - "version": "file:../../../../uni-config-center/uniCloud/cloudfunctions/common/uni-config-center" - }, - "uni-id": { - "version": "file:../../../../uni-id/uniCloud/cloudfunctions/common/uni-id", - "requires": { - "uni-config-center": "file:../../../../uni-config-center/uniCloud/cloudfunctions/common/uni-config-center" - }, - "dependencies": { - "uni-config-center": { - "version": "file:../../../../uni-config-center/uniCloud/cloudfunctions/common/uni-config-center" - } - } - } - } -} diff --git a/uni_modules/uni-login-page/uniCloud/cloudfunctions/user-center/package.json b/uni_modules/uni-login-page/uniCloud/cloudfunctions/user-center/package.json deleted file mode 100644 index 0d50d88..0000000 --- a/uni_modules/uni-login-page/uniCloud/cloudfunctions/user-center/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "user-center", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "dependencies": { - "uni-captcha": "file:../../../../uni-captcha/uniCloud/cloudfunctions/common/uni-captcha", - "uni-config-center": "file:../../../../uni-config-center/uniCloud/cloudfunctions/common/uni-config-center", - "uni-id": "file:../../../../uni-id/uniCloud/cloudfunctions/common/uni-id" - } -} diff --git a/uni_modules/uni-login-page/uniCloud/cloudfunctions/user/package-lock.json b/uni_modules/uni-login-page/uniCloud/cloudfunctions/user/package-lock.json deleted file mode 100644 index d8a3cee..0000000 --- a/uni_modules/uni-login-page/uniCloud/cloudfunctions/user/package-lock.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "user", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "uni-captcha": { - "version": "file:../../../../uni-captcha/uniCloud/cloudfunctions/common/uni-captcha" - }, - "uni-config-center": { - "version": "file:../../../../uni-config-center/uniCloud/cloudfunctions/common/uni-config-center" - }, - "uni-id": { - "version": "file:../../../../uni-id/uniCloud/cloudfunctions/common/uni-id", - "requires": { - "uni-config-center": "file:../../../../uni-config-center/uniCloud/cloudfunctions/common/uni-config-center" - }, - "dependencies": { - "uni-config-center": { - "version": "file:../../../../uni-config-center/uniCloud/cloudfunctions/common/uni-config-center" - } - } - } - } -} diff --git a/uni_modules/uni-popup/changelog.md b/uni_modules/uni-popup/changelog.md index e508de0..4e14176 100644 --- a/uni_modules/uni-popup/changelog.md +++ b/uni_modules/uni-popup/changelog.md @@ -1,8 +1,10 @@ -## 1.2.9(2021-02-05) -- 优化 组件引用关系,通过uni_modules引用组件 -## 1.2.8(2021-02-05) -- 调整为uni_modules目录规范 -## 1.2.7(2021-02-05) -- 调整为uni_modules目录规范 -- 新增 支持 PC 端 -- 新增 uni-popup-message 、uni-popup-dialog扩展组件支持 PC 端 +## 1.3.0(2021-04-13) +修复某些情况下uni-popup-dialog输入框的值获取失败的问题 +## 1.2.9(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 +## 1.2.8(2021-02-05) +- 调整为uni_modules目录规范 +## 1.2.7(2021-02-05) +- 调整为uni_modules目录规范 +- 新增 支持 PC 端 +- 新增 uni-popup-message 、uni-popup-dialog扩展组件支持 PC 端 diff --git a/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js b/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js index 6ef26a2..a747b9f 100644 --- a/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js +++ b/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js @@ -1,45 +1,45 @@ -// #ifdef H5 -export default { - name: 'Keypress', - props: { - disable: { - type: Boolean, - default: false - } - }, - mounted () { - const keyNames = { - esc: ['Esc', 'Escape'], - tab: 'Tab', - enter: 'Enter', - space: [' ', 'Spacebar'], - up: ['Up', 'ArrowUp'], - left: ['Left', 'ArrowLeft'], - right: ['Right', 'ArrowRight'], - down: ['Down', 'ArrowDown'], - delete: ['Backspace', 'Delete', 'Del'] - } - const listener = ($event) => { - if (this.disable) { - return - } - const keyName = Object.keys(keyNames).find(key => { - const keyName = $event.key - const value = keyNames[key] - return value === keyName || (Array.isArray(value) && value.includes(keyName)) - }) - if (keyName) { - // 避免和其他按键事件冲突 - setTimeout(() => { - this.$emit(keyName, {}) - }, 0) - } - } - document.addEventListener('keyup', listener) - this.$once('hook:beforeDestroy', () => { - document.removeEventListener('keyup', listener) - }) - }, - render: () => {} -} -// #endif +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + this.$once('hook:beforeDestroy', () => { + document.removeEventListener('keyup', listener) + }) + }, + render: () => {} +} +// #endif diff --git a/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue b/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue index 5163bec..8932683 100644 --- a/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue +++ b/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue @@ -1,290 +1,244 @@ - - - - - + } + }, + /** + * 点击取消按钮 + */ + close() { + if (this.beforeClose) { + this.$emit('close', () => { + this.popup.close() + }) + return + } + this.popup.close() + } + } + } + + + \ No newline at end of file diff --git a/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue b/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue index 17b0211..54f21a2 100644 --- a/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue +++ b/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue @@ -1,138 +1,138 @@ - - - - + + + + diff --git a/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue b/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue index 7383a5c..9926e2b 100644 --- a/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue +++ b/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue @@ -1,155 +1,165 @@ - - - - + + + + diff --git a/uni_modules/uni-popup/components/uni-popup/keypress.js b/uni_modules/uni-popup/components/uni-popup/keypress.js index 6ef26a2..a747b9f 100644 --- a/uni_modules/uni-popup/components/uni-popup/keypress.js +++ b/uni_modules/uni-popup/components/uni-popup/keypress.js @@ -1,45 +1,45 @@ -// #ifdef H5 -export default { - name: 'Keypress', - props: { - disable: { - type: Boolean, - default: false - } - }, - mounted () { - const keyNames = { - esc: ['Esc', 'Escape'], - tab: 'Tab', - enter: 'Enter', - space: [' ', 'Spacebar'], - up: ['Up', 'ArrowUp'], - left: ['Left', 'ArrowLeft'], - right: ['Right', 'ArrowRight'], - down: ['Down', 'ArrowDown'], - delete: ['Backspace', 'Delete', 'Del'] - } - const listener = ($event) => { - if (this.disable) { - return - } - const keyName = Object.keys(keyNames).find(key => { - const keyName = $event.key - const value = keyNames[key] - return value === keyName || (Array.isArray(value) && value.includes(keyName)) - }) - if (keyName) { - // 避免和其他按键事件冲突 - setTimeout(() => { - this.$emit(keyName, {}) - }, 0) - } - } - document.addEventListener('keyup', listener) - this.$once('hook:beforeDestroy', () => { - document.removeEventListener('keyup', listener) - }) - }, - render: () => {} -} -// #endif +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + this.$once('hook:beforeDestroy', () => { + document.removeEventListener('keyup', listener) + }) + }, + render: () => {} +} +// #endif diff --git a/uni_modules/uni-popup/components/uni-popup/message.js b/uni_modules/uni-popup/components/uni-popup/message.js index 0ff9a02..0c0c88d 100644 --- a/uni_modules/uni-popup/components/uni-popup/message.js +++ b/uni_modules/uni-popup/components/uni-popup/message.js @@ -1,22 +1,22 @@ -export default { - created() { - if (this.type === 'message') { - // 不显示遮罩 - this.maskShow = false - // 获取子组件对象 - this.childrenMsg = null - } - }, - methods: { - customOpen() { - if (this.childrenMsg) { - this.childrenMsg.open() - } - }, - customClose() { - if (this.childrenMsg) { - this.childrenMsg.close() - } - } - } -} +export default { + created() { + if (this.type === 'message') { + // 不显示遮罩 + this.maskShow = false + // 获取子组件对象 + this.childrenMsg = null + } + }, + methods: { + customOpen() { + if (this.childrenMsg) { + this.childrenMsg.open() + } + }, + customClose() { + if (this.childrenMsg) { + this.childrenMsg.close() + } + } + } +} diff --git a/uni_modules/uni-popup/components/uni-popup/popup.js b/uni_modules/uni-popup/components/uni-popup/popup.js index 8e02434..794954c 100644 --- a/uni_modules/uni-popup/components/uni-popup/popup.js +++ b/uni_modules/uni-popup/components/uni-popup/popup.js @@ -1,50 +1,50 @@ -import message from './message.js'; -// 定义 type 类型:弹出类型:top/bottom/center -const config = { - // 顶部弹出 - top: 'top', - // 底部弹出 - bottom: 'bottom', - // 居中弹出 - center: 'center', - // 消息提示 - message: 'top', - // 对话框 - dialog: 'center', - // 分享 - share: 'bottom', -} - -export default { - data() { - return { - config: config, - popupWidth: 0, - popupHeight: 0 - } - }, - mixins: [message], - computed: { - isDesktop() { - return this.popupWidth >= 500 && this.popupHeight >= 500 - } - }, - mounted() { - const fixSize = () => { - const { - windowWidth, - windowHeight, - windowTop - } = uni.getSystemInfoSync() - this.popupWidth = windowWidth - this.popupHeight = windowHeight + windowTop - } - fixSize() - // #ifdef H5 - window.addEventListener('resize', fixSize) - this.$once('hook:beforeDestroy', () => { - window.removeEventListener('resize', fixSize) - }) - // #endif - }, -} +import message from './message.js'; +// 定义 type 类型:弹出类型:top/bottom/center +const config = { + // 顶部弹出 + top: 'top', + // 底部弹出 + bottom: 'bottom', + // 居中弹出 + center: 'center', + // 消息提示 + message: 'top', + // 对话框 + dialog: 'center', + // 分享 + share: 'bottom', +} + +export default { + data() { + return { + config: config, + popupWidth: 0, + popupHeight: 0 + } + }, + mixins: [message], + computed: { + isDesktop() { + return this.popupWidth >= 500 && this.popupHeight >= 500 + } + }, + mounted() { + const fixSize = () => { + const { + windowWidth, + windowHeight, + windowTop + } = uni.getSystemInfoSync() + this.popupWidth = windowWidth + this.popupHeight = windowHeight + windowTop + } + fixSize() + // #ifdef H5 + window.addEventListener('resize', fixSize) + this.$once('hook:beforeDestroy', () => { + window.removeEventListener('resize', fixSize) + }) + // #endif + }, +} diff --git a/uni_modules/uni-popup/components/uni-popup/share.js b/uni_modules/uni-popup/components/uni-popup/share.js index 462bb83..930a6cf 100644 --- a/uni_modules/uni-popup/components/uni-popup/share.js +++ b/uni_modules/uni-popup/components/uni-popup/share.js @@ -1,16 +1,16 @@ -export default { - created() { - if (this.type === 'share') { - // 关闭点击 - this.mkclick = false - } - }, - methods: { - customOpen() { - console.log('share 打开了'); - }, - customClose() { - console.log('share 关闭了'); - } - } -} +export default { + created() { + if (this.type === 'share') { + // 关闭点击 + this.mkclick = false + } + }, + methods: { + customOpen() { + console.log('share 打开了'); + }, + customClose() { + console.log('share 关闭了'); + } + } +} diff --git a/uni_modules/uni-popup/components/uni-popup/uni-popup.vue b/uni_modules/uni-popup/components/uni-popup/uni-popup.vue index e1e8d11..0d0c813 100644 --- a/uni_modules/uni-popup/components/uni-popup/uni-popup.vue +++ b/uni_modules/uni-popup/components/uni-popup/uni-popup.vue @@ -1,321 +1,321 @@ - - - - + + + + diff --git a/uni_modules/uni-popup/package.json b/uni_modules/uni-popup/package.json index 31f711a..c15c743 100644 --- a/uni_modules/uni-popup/package.json +++ b/uni_modules/uni-popup/package.json @@ -1,84 +1,84 @@ -{ - "id": "uni-popup", - "displayName": "PopUp 弹出层", - "version": "1.2.9", - "description": " Popup 组件,提供常用的弹层", - "keywords": [ - "popup", - "uni-ui", - "弹出层", - "uni-popup" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": [ - "uni-transition" - ], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "y" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "u", - "联盟": "u" - } - } - } - } +{ + "id": "uni-popup", + "displayName": "PopUp 弹出层", + "version": "1.3.0", + "description": " Popup 组件,提供常用的弹层", + "keywords": [ + "popup", + "uni-ui", + "弹出层", + "uni-popup" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-transition" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } } \ No newline at end of file diff --git a/uni_modules/uni-popup/readme.md b/uni_modules/uni-popup/readme.md index 2a73557..85c5e4d 100644 --- a/uni_modules/uni-popup/readme.md +++ b/uni_modules/uni-popup/readme.md @@ -1,294 +1,294 @@ - - -## Popup 弹出层 -> 代码块: `uPopup` -> 关联组件:`uni-transition`,`uni-popup-dialog`,`uni-popup-message`,`uni-popup-share` - - -弹出层组件,在应用中弹出一个消息提示窗口、提示框等 - - -> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 -> - 组件需要依赖 `sass` 插件 ,请自行手动安装 -> - `uni-popup-message` 、 `uni-popup-dialog` 等扩展ui组件,需要和 `uni-popup` 配套使用,暂不支持单独使用 -> - `nvue` 中使用 `uni-popup` 时,尽量将组件置于其他元素后面,避免出现层级问题 -> - `uni-popup` 并不能完全阻止页面滚动,可在打开 `uni-popup` 的时候手动去做一些处理,禁止页面滚动 -> - 如果需要在子扩展组件内关闭 `uni-popup` ,请使用扩展(provide/inject)方式,其他方式可能会出现不可预知问题 -> - 如果想在页面渲染完毕后就打开 `uni-popup` ,请在 `onReady` 或 `mounted` 生命周期内调用,确保组件渲染完毕 -> - 在微信小程序开发者工具中,启用真机调试,popup 会延时出现,是因为 setTimeout 在真机调试中的延时问题导致的,预览和发布小程序不会出现此问题 -> - 使用 `npm` 方式引入组件,如果确认引用正确,但是提示未注册组件或显示不正常,请尝试重新编译项目 -> - `uni-popup` 中尽量不要使用 `scroll-view` 嵌套过多的内容,可能会影响组件的性能,导致组件无法打开或者打开卡顿 -> - `uni-popup` 不会覆盖原生 tabbar 和原生导航栏 - - - -### 安装方式 - -本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 - -如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) - - -## 基本用法 - -```html - -底部弹出 Popup -``` - -```javascript -export default { - methods:{ - open(){ - // 通过组件定义的ref调用uni-popup方法 - this.$refs.popup.open() - } - } - -} - -``` - -## API - -### Popup Props - -| 属性名 | 类型 | 默认值 | 说明 | -| :-: | :-: | :-: | :-: | -| animation | Boolean |true | 是否开启动画 | -| type | String |center | 弹出方式 | -| maskClick | Boolean |true | 蒙版点击是否关闭弹窗 | - -#### Type Options - -| 属性名 | 说明 | -| :-: | :-: | -| top | 顶部弹出 | -| center | 居中弹出 | -| bottom | 底部弹出 | -| message | 预置样式 :消息提示 | -| dialog | 预置样式 :对话框 | -| share | 预置样式 :底部弹出分享示例 | - - -### Popup Methods - -|方法称名 |说明 |参数| -|:-: |:-: |:-:| -|open |打开弹出层 |- | -|close |关闭弹出层 |- | - - -### Popup Events - -|事件称名 |说明 |返回值 | -|:-: |:-: |:-: | -|change |组件状态发生变化触发 |e={show: true|false,type:当前模式} | - - -## 扩展组件说明 -`uni-popup` 其实并没有任何样式,只提供基础的动画效果,给用户一个弹出层解决方案,仅仅是这样并不能满足开发需求,所以我们提供了三种基础扩展样式 - -### uni-popup-message 提示信息 - -将 `uni-popup` 的`type`属性改为 `message`,并引入对应组件即可使用消息提示 ,*该组件不支持单独使用* - -**示例** - -```html - - - -``` - -### uni-popup-message 属性说明 - -| 属性名 | 类型 | 默认值 | 说明 | -| :-: | :-: | :-: | :-: | -| type | String |success| 消息提示主题,可选值: success/warn/info/error | -| message | String |- | 消息提示文字 | -| duration | Number |3000 | 消息显示时间,超过显示时间组件自动关闭,设置为0 将不会关闭,需手动调用 close 方法关闭 | - -### uni-popup-dialog 对话框 - -将 `uni-popup` 的`type`属性改为 `dialog`,并引入对应组件即可使用对话框 ,*该组件不支持单独使用* - -**示例** - -```html - - - -``` - -```javascript -export default { - methods:{ - /** - * 点击取消按钮触发 - * @param {Object} done - */ - close(done){ - // TODO 做一些其他的事情,before-close 为true的情况下,手动执行 done 才会关闭对话框 - // ... - done() - }, - /** - * 点击确认按钮触发 - * @param {Object} done - * @param {Object} value - */ - confirm(done,value){ - // 输入框的值 - console.log(value) - // TODO 做一些其他的事情,手动执行 done 才会关闭对话框 - // ... - done() - } - } -} -``` - -### uni-popup-dialog 属性说明 - -| 属性名 | 类型 | 默认值 | 说明 | -| :-: | :-: | :-: | :-: | -| type | String |success| 对话框标题主题,可选值: success/warn/info/error | -| mode | String |base | 对话框模式,可选值:base(提示对话框)/input(可输入对话框) | -| title | String |- | 对话框标题 | -| content | String |- | 对话框内容,base模式下生效 | -| value | String\Number |- | 输入框默认值,input模式下生效 | -| placeholder | String |- | 输入框提示文字,input模式下生效 | -| before-close | Boolean |false | 是否拦截取消按钮,如为true,则不会关闭对话框,关闭需要监听 dialog 的 close 事件,并执行 done()| - -#### dialog 事件说明 - -|事件称名 |说明 |返回值 | -|:-: |:-: |:-: | -|close |点击dialog取消按钮触发 |done:执行关闭对话框 | -|confirm |点击dialog确定按钮触发 |done:执行关闭对话框:value:input模式下输入框的值 | - - -### uni-popup-share 分享示例 - -分享示例,不作为最终可使用的组件,将 `uni-popup` 的 `type` 属性改为 `share`,并引入对应组件即可使用 ,*该组件不支持单独使用* - -**示例** - -```html - - - -``` - -### uni-popup-share 属性说明 - -| 属性名| 类型 | 默认值 | 说明 | -| :-: | :-: | :-: | :-: | -| title | String | | 分享弹窗标题 | - -### uni-popup-share 事件说明 - -|事件称名 |说明 |返回值 | -|:-: |:-: |:-: | -|select |选择触发 |e = {item,index}:所选参数,done:执行关闭窗口 | - -**Tips** -- share 分享组件,只是作为一个扩展示例,如果需要修改数据源,请到组件内修改 - -## 如何扩展自己的 uni-popup 弹出层样式? -`uni-popup` 组件内容是通过 `slot` 插槽的方式去实现的,所以这极大的方便了我们的扩展。 - -现在我们可以在不改动 `uni-popup` 组件主体的情况下,方便的去扩展我们自己的弹出层样式。 - -### 添加自定义类型 -如果要去扩展 `uni-popup`,我们需要把组件*引入本地*,才能去进行扩展。 - -组件放到本地后,在组件目录找到 `popup.js` ,在 `config` 变量中定义自己的类型,key 为当前要定义的类型,value 为弹出类型(top/bottom/center) -我们以 `uni-popup-share` 为例,看如何扩展一个`share` 底部分享的一个 `uni-popup` 子组件,代码参考 `uni-popup-share.vue`。 - -```javascript - -// popup.js -const config = { - // ... - // 分享 key:share 为我们定义的类型 value : 'bottom' 为弹出方向(top/bottom/center) - // 这样配置好之后,我们自定义的弹出层就会从底部弹出 - share:'bottom', -} - -``` - -### 创建扩展组件 - -在组件目录创建文件 ,例 `uni-popup-share/uni-popup-share.vue`,结构与其他组件没有区别。 - -在组件内直接编写样式逻辑即可,如需自定义效果更强,可以通过 props 接受页面参数。 - - -### 与父组件 `uni-popup` 进行通讯 - -组件通讯我们使用了 `provide/inject` , 具体逻辑我们不需要关心,只要在子组件配置 `inject` ,即可获取父组件方法变量等。 - -```javascript - -// uni-popup-share.vue -export default { - name: 'UniPopupShare', - props: { - title: { - type: String, - default: '分享到' - } - }, - // 直接把下面这一行代码,放到自己的组件内 - inject: ['popup'], - // ... - methons:{ - /** - * 定义的选择事件,选择内容后触发 - */ - select(item, index) { - // 将事件发送到页面,在页面进行监听 - this.$emit('select', { - item, - index - }, () => { - // 延迟操作,执行父组件的close事件,关闭弹出层 - this.popup.close() - }) - }, - /** - * 关闭窗口 - */ - close() { - // 执行父组件的close事件,关闭弹出层 - this.popup.close() - } - } -} -``` - - -### 使用自定义组件 - -通过上面几个步骤 ,我们就可以使用这个组件了,只需要把我们自定义的组件放置到 `uni-popup` 组件内即可 ,指定 `uni-popup` 的 `type` 为我们第一步定义好的 `share` - -```html - - - -``` - -之后就可以按照 `uni-popup` 的使用方式去打开关闭弹出层了。更多细节可以参考 `uni-popup-message` 和 `uni-popup-dialog`。 - - -**Tips** -- 如果扩展组件目录名和组件名不一致,可能不会被 `easycom` 正确引用,请配置`easycom`规则或修改组件名称 - -### 分享你的组件 - -通过组件扩展,你可以扩展出更丰富的弹出层样式,如果您想让更多人使用你定制的组件,或者您有更好的点子或更好的实现方式,欢迎给我们提交 [PR](https://github.com/dcloudio/uni-ui/pulls),如被采用,会合并到示例中。 - -在使用中如遇到无法解决的问题,请提 [Issues](https://github.com/dcloudio/uni-ui/issues) 给我们。 - + + +## Popup 弹出层 +> 代码块: `uPopup` +> 关联组件:`uni-transition`,`uni-popup-dialog`,`uni-popup-message`,`uni-popup-share` + + +弹出层组件,在应用中弹出一个消息提示窗口、提示框等 + + +> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 +> - 组件需要依赖 `sass` 插件 ,请自行手动安装 +> - `uni-popup-message` 、 `uni-popup-dialog` 等扩展ui组件,需要和 `uni-popup` 配套使用,暂不支持单独使用 +> - `nvue` 中使用 `uni-popup` 时,尽量将组件置于其他元素后面,避免出现层级问题 +> - `uni-popup` 并不能完全阻止页面滚动,可在打开 `uni-popup` 的时候手动去做一些处理,禁止页面滚动 +> - 如果需要在子扩展组件内关闭 `uni-popup` ,请使用扩展(provide/inject)方式,其他方式可能会出现不可预知问题 +> - 如果想在页面渲染完毕后就打开 `uni-popup` ,请在 `onReady` 或 `mounted` 生命周期内调用,确保组件渲染完毕 +> - 在微信小程序开发者工具中,启用真机调试,popup 会延时出现,是因为 setTimeout 在真机调试中的延时问题导致的,预览和发布小程序不会出现此问题 +> - 使用 `npm` 方式引入组件,如果确认引用正确,但是提示未注册组件或显示不正常,请尝试重新编译项目 +> - `uni-popup` 中尽量不要使用 `scroll-view` 嵌套过多的内容,可能会影响组件的性能,导致组件无法打开或者打开卡顿 +> - `uni-popup` 不会覆盖原生 tabbar 和原生导航栏 + + + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + + +## 基本用法 + +```html + +底部弹出 Popup +``` + +```javascript +export default { + methods:{ + open(){ + // 通过组件定义的ref调用uni-popup方法 + this.$refs.popup.open() + } + } + +} + +``` + +## API + +### Popup Props + +| 属性名 | 类型 | 默认值 | 说明 | +| :-: | :-: | :-: | :-: | +| animation | Boolean |true | 是否开启动画 | +| type | String |center | 弹出方式 | +| maskClick | Boolean |true | 蒙版点击是否关闭弹窗 | + +#### Type Options + +| 属性名 | 说明 | +| :-: | :-: | +| top | 顶部弹出 | +| center | 居中弹出 | +| bottom | 底部弹出 | +| message | 预置样式 :消息提示 | +| dialog | 预置样式 :对话框 | +| share | 预置样式 :底部弹出分享示例 | + + +### Popup Methods + +|方法称名 |说明 |参数| +|:-: |:-: |:-:| +|open |打开弹出层 |- | +|close |关闭弹出层 |- | + + +### Popup Events + +|事件称名 |说明 |返回值 | +|:-: |:-: |:-: | +|change |组件状态发生变化触发 |e={show: true|false,type:当前模式} | + + +## 扩展组件说明 +`uni-popup` 其实并没有任何样式,只提供基础的动画效果,给用户一个弹出层解决方案,仅仅是这样并不能满足开发需求,所以我们提供了三种基础扩展样式 + +### uni-popup-message 提示信息 + +将 `uni-popup` 的`type`属性改为 `message`,并引入对应组件即可使用消息提示 ,*该组件不支持单独使用* + +**示例** + +```html + + + +``` + +### uni-popup-message 属性说明 + +| 属性名 | 类型 | 默认值 | 说明 | +| :-: | :-: | :-: | :-: | +| type | String |success| 消息提示主题,可选值: success/warn/info/error | +| message | String |- | 消息提示文字 | +| duration | Number |3000 | 消息显示时间,超过显示时间组件自动关闭,设置为0 将不会关闭,需手动调用 close 方法关闭 | + +### uni-popup-dialog 对话框 + +将 `uni-popup` 的`type`属性改为 `dialog`,并引入对应组件即可使用对话框 ,*该组件不支持单独使用* + +**示例** + +```html + + + +``` + +```javascript +export default { + methods:{ + /** + * 点击取消按钮触发 + * @param {Object} done + */ + close(done){ + // TODO 做一些其他的事情,before-close 为true的情况下,手动执行 done 才会关闭对话框 + // ... + done() + }, + /** + * 点击确认按钮触发 + * @param {Object} done + * @param {Object} value + */ + confirm(done,value){ + // 输入框的值 + console.log(value) + // TODO 做一些其他的事情,手动执行 done 才会关闭对话框 + // ... + done() + } + } +} +``` + +### uni-popup-dialog 属性说明 + +| 属性名 | 类型 | 默认值 | 说明 | +| :-: | :-: | :-: | :-: | +| type | String |success| 对话框标题主题,可选值: success/warn/info/error | +| mode | String |base | 对话框模式,可选值:base(提示对话框)/input(可输入对话框) | +| title | String |- | 对话框标题 | +| content | String |- | 对话框内容,base模式下生效 | +| value | String\Number |- | 输入框默认值,input模式下生效 | +| placeholder | String |- | 输入框提示文字,input模式下生效 | +| before-close | Boolean |false | 是否拦截取消按钮,如为true,则不会关闭对话框,关闭需要监听 dialog 的 close 事件,并执行 done()| + +#### dialog 事件说明 + +|事件称名 |说明 |返回值 | +|:-: |:-: |:-: | +|close |点击dialog取消按钮触发 |done:执行关闭对话框 | +|confirm |点击dialog确定按钮触发 |done:执行关闭对话框:value:input模式下输入框的值 | + + +### uni-popup-share 分享示例 + +分享示例,不作为最终可使用的组件,将 `uni-popup` 的 `type` 属性改为 `share`,并引入对应组件即可使用 ,*该组件不支持单独使用* + +**示例** + +```html + + + +``` + +### uni-popup-share 属性说明 + +| 属性名| 类型 | 默认值 | 说明 | +| :-: | :-: | :-: | :-: | +| title | String | | 分享弹窗标题 | + +### uni-popup-share 事件说明 + +|事件称名 |说明 |返回值 | +|:-: |:-: |:-: | +|select |选择触发 |e = {item,index}:所选参数,done:执行关闭窗口 | + +**Tips** +- share 分享组件,只是作为一个扩展示例,如果需要修改数据源,请到组件内修改 + +## 如何扩展自己的 uni-popup 弹出层样式? +`uni-popup` 组件内容是通过 `slot` 插槽的方式去实现的,所以这极大的方便了我们的扩展。 + +现在我们可以在不改动 `uni-popup` 组件主体的情况下,方便的去扩展我们自己的弹出层样式。 + +### 添加自定义类型 +如果要去扩展 `uni-popup`,我们需要把组件*引入本地*,才能去进行扩展。 + +组件放到本地后,在组件目录找到 `popup.js` ,在 `config` 变量中定义自己的类型,key 为当前要定义的类型,value 为弹出类型(top/bottom/center) +我们以 `uni-popup-share` 为例,看如何扩展一个`share` 底部分享的一个 `uni-popup` 子组件,代码参考 `uni-popup-share.vue`。 + +```javascript + +// popup.js +const config = { + // ... + // 分享 key:share 为我们定义的类型 value : 'bottom' 为弹出方向(top/bottom/center) + // 这样配置好之后,我们自定义的弹出层就会从底部弹出 + share:'bottom', +} + +``` + +### 创建扩展组件 + +在组件目录创建文件 ,例 `uni-popup-share/uni-popup-share.vue`,结构与其他组件没有区别。 + +在组件内直接编写样式逻辑即可,如需自定义效果更强,可以通过 props 接受页面参数。 + + +### 与父组件 `uni-popup` 进行通讯 + +组件通讯我们使用了 `provide/inject` , 具体逻辑我们不需要关心,只要在子组件配置 `inject` ,即可获取父组件方法变量等。 + +```javascript + +// uni-popup-share.vue +export default { + name: 'UniPopupShare', + props: { + title: { + type: String, + default: '分享到' + } + }, + // 直接把下面这一行代码,放到自己的组件内 + inject: ['popup'], + // ... + methons:{ + /** + * 定义的选择事件,选择内容后触发 + */ + select(item, index) { + // 将事件发送到页面,在页面进行监听 + this.$emit('select', { + item, + index + }, () => { + // 延迟操作,执行父组件的close事件,关闭弹出层 + this.popup.close() + }) + }, + /** + * 关闭窗口 + */ + close() { + // 执行父组件的close事件,关闭弹出层 + this.popup.close() + } + } +} +``` + + +### 使用自定义组件 + +通过上面几个步骤 ,我们就可以使用这个组件了,只需要把我们自定义的组件放置到 `uni-popup` 组件内即可 ,指定 `uni-popup` 的 `type` 为我们第一步定义好的 `share` + +```html + + + +``` + +之后就可以按照 `uni-popup` 的使用方式去打开关闭弹出层了。更多细节可以参考 `uni-popup-message` 和 `uni-popup-dialog`。 + + +**Tips** +- 如果扩展组件目录名和组件名不一致,可能不会被 `easycom` 正确引用,请配置`easycom`规则或修改组件名称 + +### 分享你的组件 + +通过组件扩展,你可以扩展出更丰富的弹出层样式,如果您想让更多人使用你定制的组件,或者您有更好的点子或更好的实现方式,欢迎给我们提交 [PR](https://github.com/dcloudio/uni-ui/pulls),如被采用,会合并到示例中。 + +在使用中如遇到无法解决的问题,请提 [Issues](https://github.com/dcloudio/uni-ui/issues) 给我们。 + diff --git a/uni_modules/uni-transition/changelog.md b/uni_modules/uni-transition/changelog.md index 9274bef..b9b64fe 100644 --- a/uni_modules/uni-transition/changelog.md +++ b/uni_modules/uni-transition/changelog.md @@ -1,2 +1,8 @@ +## 1.1.0(2021-04-22) +- 新增 通过方法自定义动画 +- 新增 custom-class 非 NVUE 平台支持自定义 class 定制样式 +- 优化 动画触发逻辑,使动画更流畅 +- 优化 支持单独的动画类型 +- 优化 文档示例 ## 1.0.2(2021-02-05) - 调整为uni_modules目录规范 diff --git a/uni_modules/uni-transition/components/uni-transition/createAnimation.js b/uni_modules/uni-transition/components/uni-transition/createAnimation.js new file mode 100644 index 0000000..3c5f05e --- /dev/null +++ b/uni_modules/uni-transition/components/uni-transition/createAnimation.js @@ -0,0 +1,126 @@ +// const defaultOption = { +// duration: 300, +// timingFunction: 'linear', +// delay: 0, +// transformOrigin: '50% 50% 0' +// } +// #ifdef APP-NVUE +const nvueAnimation = uni.requireNativePlugin('animation') +// #endif +class MPAnimation { + constructor(options, _this) { + this.options = options + this.animation = uni.createAnimation(options) + this.currentStepAnimates = {} + this.next = 0 + this.$ = _this + + } + + _nvuePushAnimates(type, args) { + let aniObj = this.currentStepAnimates[this.next] + let styles = {} + if (!aniObj) { + styles = { + styles: {}, + config: {} + } + } else { + styles = aniObj + } + if (animateTypes1.includes(type)) { + if (!styles.styles.transform) { + styles.styles.transform = '' + } + let unit = '' + if(type === 'rotate'){ + unit = 'deg' + } + styles.styles.transform += `${type}(${args+unit}) ` + } else { + styles.styles[type] = `${args}` + } + this.currentStepAnimates[this.next] = styles + } + _animateRun(styles = {}, config = {}) { + let ref = this.$.$refs['ani'].ref + if (!ref) return + return new Promise((resolve, reject) => { + nvueAnimation.transition(ref, { + styles, + ...config + }, res => { + resolve() + }) + }) + } + + _nvueNextAnimate(animates, step = 0, fn) { + let obj = animates[step] + if (obj) { + let { + styles, + config + } = obj + this._animateRun(styles, config).then(() => { + step += 1 + this._nvueNextAnimate(animates, step, fn) + }) + } else { + this.currentStepAnimates = {} + typeof fn === 'function' && fn() + this.isEnd = true + } + } + + step(config = {}) { + // #ifndef APP-NVUE + this.animation.step(config) + // #endif + // #ifdef APP-NVUE + this.currentStepAnimates[this.next].config = Object.assign({}, this.options, config) + this.currentStepAnimates[this.next].styles.transformOrigin = this.currentStepAnimates[this.next].config.transformOrigin + this.next++ + // #endif + return this + } + + run(fn) { + // #ifndef APP-NVUE + this.$.animationData = this.animation.export() + this.$.timer = setTimeout(() => { + typeof fn === 'function' && fn() + }, this.$.durationTime) + // #endif + // #ifdef APP-NVUE + this.isEnd = false + this._nvueNextAnimate(this.currentStepAnimates, 0, fn) + this.next = 0 + // #endif + } +} + + +const animateTypes1 = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d', + 'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY', + 'translateZ' +] +const animateTypes2 = ['opacity', 'backgroundColor'] +const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom'] +animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => { + MPAnimation.prototype[type] = function(...args) { + // #ifndef APP-NVUE + this.animation[type](...args) + // #endif + // #ifdef APP-NVUE + this._nvuePushAnimates(type, args) + // #endif + return this + } +}) + +export function createAnimation(option, _this) { + if(!_this) return + clearTimeout(_this.timer) + return new MPAnimation(option, _this) +} diff --git a/uni_modules/uni-transition/components/uni-transition/uni-transition.vue b/uni_modules/uni-transition/components/uni-transition/uni-transition.vue index 1161634..77d9a49 100644 --- a/uni_modules/uni-transition/components/uni-transition/uni-transition.vue +++ b/uni_modules/uni-transition/components/uni-transition/uni-transition.vue @@ -1,280 +1,276 @@ - - - - - + customClass:{ + type: String, + default: '' + } + }, + data() { + return { + isShow: false, + transform: '', + opacity: 1, + animationData: {}, + durationTime: 300, + config: {} + } + }, + watch: { + show: { + handler(newVal) { + if (newVal) { + this.open() + } else { + // 避免上来就执行 close,导致动画错乱 + if (this.isShow) { + this.close() + } + } + }, + immediate: true + } + }, + computed: { + // 生成样式数据 + stylesObject() { + let styles = { + ...this.styles, + 'transition-duration': this.duration / 1000 + 's' + } + let transform = '' + for (let i in styles) { + let line = this.toLine(i) + transform += line + ':' + styles[i] + ';' + } + return transform + }, + // 初始化动画条件 + transformStyles() { + return 'transform:' + this.transform + ';' + 'opacity:' + this.opacity + ';' + this.stylesObject + } + }, + created() { + // 动画默认配置 + this.config = { + duration: this.duration, + timingFunction: 'ease', + transformOrigin: '50% 50%', + delay: 0 + } + this.durationTime = this.duration + }, + methods: { + /** + * ref 触发 初始化动画 + */ + init(obj = {}) { + if (obj.duration) { + this.durationTime = obj.duration + } + this.animation = createAnimation(Object.assign(this.config, obj)) + }, + /** + * 点击组件触发回调 + */ + onClick() { + this.$emit('click', { + detail: this.isShow + }) + }, + /** + * ref 触发 动画分组 + * @param {Object} obj + */ + step(obj, config = {}) { + if (!this.animation) return + for (let i in obj) { + try { + if(typeof obj[i] === 'object'){ + this.animation[i](...obj[i]) + }else{ + this.animation[i](obj[i]) + } + } catch (e) { + console.error(`方法 ${i} 不存在`) + } + } + this.animation.step(config) + return this + }, + /** + * ref 触发 执行动画 + */ + run(fn) { + if (!this.animation) return + this.animation.run(fn) + }, + // 开始过度动画 + open() { + clearTimeout(this.timer) + this.transform = '' + this.isShow = true + let { opacity, transform } = this.styleInit(false) + if (typeof opacity !== 'undefined') { + this.opacity = opacity + } + this.transform = transform + // 确保动态样式已经生效后,执行动画,如果不加 nextTick ,会导致 wx 动画执行异常 + this.$nextTick(() => { + // TODO 定时器保证动画完全执行,目前有些问题,后面会取消定时器 + this.timer = setTimeout(() => { + this.animation = createAnimation(this.config, this) + this.tranfromInit(false).step() + this.animation.run() + this.$emit('change', { + detail: this.isShow + }) + }, 20) + }) + }, + // 关闭过度动画 + close(type) { + if (!this.animation) return + this.tranfromInit(true) + .step() + .run(() => { + this.isShow = false + this.animationData = null + this.animation = null + let { opacity, transform } = this.styleInit(false) + this.opacity = opacity || 1 + this.transform = transform + this.$emit('change', { + detail: this.isShow + }) + }) + }, + // 处理动画开始前的默认样式 + styleInit(type) { + let styles = { + transform: '' + } + let buildStyle = (type, mode) => { + if (mode === 'fade') { + styles.opacity = this.animationType(type)[mode] + } else { + styles.transform += this.animationType(type)[mode] + ' ' + } + } + if (typeof this.modeClass === 'string') { + buildStyle(type, this.modeClass) + } else { + this.modeClass.forEach(mode => { + buildStyle(type, mode) + }) + } + return styles + }, + // 处理内置组合动画 + tranfromInit(type) { + let buildTranfrom = (type, mode) => { + let aniNum = null + if (mode === 'fade') { + aniNum = type ? 0 : 1 + } else { + aniNum = type ? '-100%' : '0' + if (mode === 'zoom-in') { + aniNum = type ? 0.8 : 1 + } + if (mode === 'zoom-out') { + aniNum = type ? 1.2 : 1 + } + if (mode === 'slide-right') { + aniNum = type ? '100%' : '0' + } + if (mode === 'slide-bottom') { + aniNum = type ? '100%' : '0' + } + } + this.animation[this.animationMode()[mode]](aniNum) + } + if (typeof this.modeClass === 'string') { + buildTranfrom(type, this.modeClass) + } else { + this.modeClass.forEach(mode => { + buildTranfrom(type, mode) + }) + } + + return this.animation + }, + animationType(type) { + return { + fade: type ? 1 : 0, + 'slide-top': `translateY(${type ? '0' : '-100%'})`, + 'slide-right': `translateX(${type ? '0' : '100%'})`, + 'slide-bottom': `translateY(${type ? '0' : '100%'})`, + 'slide-left': `translateX(${type ? '0' : '-100%'})`, + 'zoom-in': `scaleX(${type ? 1 : 0.8}) scaleY(${type ? 1 : 0.8})`, + 'zoom-out': `scaleX(${type ? 1 : 1.2}) scaleY(${type ? 1 : 1.2})` + } + }, + // 内置动画类型与实际动画对应字典 + animationMode() { + return { + fade: 'opacity', + 'slide-top': 'translateY', + 'slide-right': 'translateX', + 'slide-bottom': 'translateY', + 'slide-left': 'translateX', + 'zoom-in': 'scale', + 'zoom-out': 'scale' + } + }, + // 驼峰转中横线 + toLine(name) { + return name.replace(/([A-Z])/g, '-$1').toLowerCase() + } + } +} + + + diff --git a/uni_modules/uni-transition/package.json b/uni_modules/uni-transition/package.json index 368bb85..c0dca47 100644 --- a/uni_modules/uni-transition/package.json +++ b/uni_modules/uni-transition/package.json @@ -1,7 +1,7 @@ { "id": "uni-transition", "displayName": "Transition 过渡动画", - "version": "1.0.2", + "version": "1.1.0", "description": "元素的简单过渡动画", "keywords": [ "动画", diff --git a/uni_modules/uni-transition/readme.md b/uni_modules/uni-transition/readme.md index 2809bd0..dbc48fd 100644 --- a/uni_modules/uni-transition/readme.md +++ b/uni_modules/uni-transition/readme.md @@ -1,10 +1,21 @@ ## Transition 过渡动画 +> **组件名:uni-transition** > 代码块: `uTransition` -元素的简单过渡动画,组件名:`uni-transition` +元素过渡动画 + +> **注意事项** +> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 +> - 组件需要依赖 `sass` 插件 ,请自行手动安装 +> - rotate 旋转动画不需要填写 deg 单位,在小程序上填写单位动画不会执行 +> - NVUE 下修改宽高动画,不能定位到中心点 +> - 百度小程序下修改宽高 ,可能会影响其他动画,需注意 +> - nvue 不支持 costom-class , 请使用 styles +> - 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + ### 安装方式 @@ -19,48 +30,156 @@ ```html -``` -``` javascript -import uniTransition from '@/components/uni-transition/uni-transition.vue' + +``` + +### 样式覆盖 + +**注意:`nvue` 不支持 `custom-class` 属性 ,需要使用 `styles` 属性进行兼容** + +使用 `custom-class` 属性绑定样式,可以自定义 `uni-transition` 的样式 + +```html + + + + +``` + + +如果使用 `styles` 注意带’-‘连接符的属性需要使用小驼峰写法如:`backgroundColor:red` + +```html + + +``` + +### 自定义动画 +当内置动画类型不能满足需求的时候 ,可以使用 `step()` 和 `run()` 自定义动画,入参以及具体用法参考下方属性说明 + +`init()` 方法可以覆盖默认配置 + + +```html + + + ``` + ## API ### Transition Props |属性名 |类型 |默认值 |说明 | |:-: |:-: |:-: |:-:| -|show |Boolean|false |控制组件显示或隐藏, | -|modeClass |Array |- |过渡动画类型 | -|duration |Number |300 |过渡动画持续时间 | -|styles |Object |- |组件样式,同 css 样式,注意带’-‘连接符的属性需要使用小驼峰写法如:`backgroundColor:red` | +|show |Boolean|false |控制组件显示或隐藏 | +|mode-class |Array/String |- |内置过渡动画类型 | +|custom-class |String |- |自定义类名 | +|duration |Number |300 |过渡动画持续时间 | +|styles |Object |- |组件样式,同 css 样式,注意带’-‘连接符的属性需要使用小驼峰写法如:`backgroundColor:red` | -#### modeClass 类型说明 -**格式为** :`['fade','slide-top']` +#### mode-class 内置过渡动画类型说明 +**格式为** :`'fade'` 或者 `['fade','slide-top']` |属性名 |说明 | |:-: |:-: | @@ -78,7 +197,211 @@ export default { ### Transition Events -|事件称名 |说明 |返回值 | -|:-: |:-: |:-: | +|事件名 |说明 |返回值 | +|:-: |:-: |:-: | |click |点击组件触发 |- | |change |过渡动画结束时触发 | e = {detail:true} | + +### Transition Methons + +|方法名|说明|参数| +|:-:|:-:|:-:| +|init()|手动初始化配置|Function(OBJECT:config)| +|step()|动画队列|Function(OBJECT:type,OBJECT:config)| +|run()|执行动画|Function(FUNCTION:callback) | + +### init(OBJECT:config) +**通过 ref 调用方法** + +手动设置动画配置,需要在页面渲染完毕后调用 + +```javascript +this.$refs.ani.init({ + duration: 1000, + timingFunction:'ease', + delay:500, + transformOrigin:'left center' +}) +``` + +### step(OBJECT:type,OBJECT:config) 动画队列 +**通过 ref 调用方法** + +调用 `step()` 来表示一组动画完成,`step` 第一个参数可以传入任意多个动画方法,一组动画中的所有动画会同时开始,一组动画完成后才会进行下一组动画。`step` 第二个参数可以传入一个跟 `uni.createAnimation()` 一样的配置参数用于指定当前组动画的配置。 + +Tips +- 第一个参数支持的动画参考下面的 `支持的动画` +- 第二个参数参考下面的 `动画配置`,可省略,如果省略继承`init`的配置 + + +```javascript +this.$refs.ani.step({ + translateX: '100px' +},{ + duration: 1000, + timingFunction:'ease', + delay:500, + transformOrigin:'left center' +}) +``` + +### run(FUNCTION:callback) 执行动画 +**通过 ref 调用方法** + +在执行 `step()` 后,需要调用 `run()` 来运行动画 ,否则动画会一直等待 + +`run()` 方法可以传入一个 `callback` 函数 ,会在所有动画执行完毕后回调 + +```javascript +this.$refs.ani.step({ + translateX: '100px' +}) +this.$refs.ani.run(()=>{ + console.log('动画执行完毕') +}) + +``` + +### 动画配置 +动画配置 , `init()` 与 `step()` 第二个参数配置相同 ,如果配置`step() `第二个参数,将会覆盖 `init()` 的配置 + +|属性名|值|必填|默认值|说明|平台差异| +|:-:|:-:|:-:|:-:|:-:|:-:| +|duration|Number|否|400|动画持续时间,单位ms|-| +|timingFunction|String|否|"linear"|定义动画的效果|-| +|delay|Number|否|0|动画延迟时间,单位 ms|-| +|needLayout|Boolean|否|false |动画执行是否影响布局|仅 nvue 支持| +|transformOrigin|String |否|"center center"|设置 [transform-origin](https://developer.mozilla.org/en-US/docs/Web/CSS/transform-origin)|-| + + +### timingFunction 属性说明 + +|值|说明|平台差异| +|:-:|:-:|:-:| +|linear|动画从头到尾的速度是相同的|-| +|ease|动画以低速开始,然后加快,在结束前变慢|-| +|ease-in| 动画以低速开始|-| +|ease-in-out| 动画以低速开始和结束|-| +|ease-out|动画以低速结束|-| +|step-start|动画第一帧就跳至结束状态直到结束|nvue不支持| +|step-end|动画一直保持开始状态,最后一帧跳到结束状态|nvue不支持| + +```javascript +// init 配置 +this.$refs.ani.init({ + duration: 1000, + timingFunction:'ease', + delay:500, + transformOrigin:'left center' +}) +// step 配置 +this.$refs.ani.step({ + translateX: '100px' +},{ + duration: 1000, + timingFunction:'ease', + delay:500, + transformOrigin:'left center' +}) +``` + +### 支持的动画 +动画方法 + +如果同一个动画方法有多个值,多个值使用数组分隔 + +```javascript +this.$refs.ani.step({ + width:'100px', + scale: [1.2,0.8], +}) +``` + +**样式:** + +|属性名|值|说明|平台差异| +|:-:|:-:|:-:|:-:| +|opacity|value|透明度,参数范围 0~1|-| +|backgroundColor|color|颜色值|-| +|width|length|长度值,如果传入 Number 则默认使用 px,可传入其他自定义单位的长度值|-| +|height|length|长度值,如果传入 Number 则默认使用 px,可传入其他自定义单位的长度值|-| +|top|length|长度值,如果传入 Number 则默认使用 px,可传入其他自定义单位的长度值|nvue 不支持| +|left|length|长度值,如果传入 Number 则默认使用 px,可传入其他自定义单位的长度值|nvue 不支持| +|bottom|length|长度值,如果传入 Number 则默认使用 px,可传入其他自定义单位的长度值|nvue 不支持| +|right|length|长度值,如果传入 Number 则默认使用 px,可传入其他自定义单位的长度值|nvue 不支持| + +```javascript +this.$refs.ani.step({ + opacity: 1, + backgroundColor: '#ff5a5f', + widht:'100px', + height:'50rpx', +}) +``` + +**旋转:** + +旋转属性的值不需要填写单位 + +|属性名|值|说明|平台差异 | +|:-:|:-:|:-:|:-:| +|rotate|deg|deg的范围-180~180,从原点顺时针旋转一个deg角度 |-| +|rotateX|deg|deg的范围-180~180,在X轴旋转一个deg角度 |-| +|rotateY|deg|deg的范围-180~180,在Y轴旋转一个deg角度 |-| +|rotateZ|deg|deg的范围-180~180,在Z轴旋转一个deg角度 |nvue不支持| +|rotate3d|x,y,z,deg| 同 [transform-function rotate3d](https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/rotate3d()) |nvue不支持| + +```javascript +this.$refs.ani.step({ + rotateX: 45, + rotateY: 45 +}) +``` + +**缩放:** + +|属性名|值|说明|平台差异| +|:-:|:-:|:-: |:-:| +|scale|sx,[sy]|一个参数时,表示在X轴、Y轴同时缩放sx倍数;两个参数时表示在X轴缩放sx倍数,在Y轴缩放sy倍数|-| +|scaleX|sx|在X轴缩放sx倍数|-| +|scaleY|sy|在Y轴缩放sy倍数|-| +|scaleZ|sz|在Z轴缩放sy倍数|nvue不支持| +|scale3d|sx,sy,sz|在X轴缩放sx倍数,在Y轴缩放sy倍数,在Z轴缩放sz倍数|nvue不支持| + +```javascript +this.$refs.ani.step({ + scale: [1.2,0.8] +}) +``` + +**偏移:** + +|属性名|值|说明|平台差异| +|:-:|:-:|:-:|:-:| +|translate|tx,[ty]|一个参数时,表示在X轴偏移tx,单位px;两个参数时,表示在X轴偏移tx,在Y轴偏移ty,单位px。|-| +|translateX|tx| 在X轴偏移tx,单位px|-| +|translateY|ty| 在Y轴偏移tx,单位px|-| +|translateZ|tz| 在Z轴偏移tx,单位px|nvue不支持| +|translate3d|tx,ty,tz| 在X轴偏移tx,在Y轴偏移ty,在Z轴偏移tz,单位px|nvue不支持| + +```javascript +this.$refs.ani.step({ + translateX: '100px' +}) +``` + +**倾斜:** + +|属性名|值|说明|平台差异| +|:-:|:-:|:-:|:-:| +|skew|ax,[ay]|参数范围-180~180;一个参数时,Y轴坐标不变,X轴坐标延顺时针倾斜ax度;两个参数时,分别在X轴倾斜ax度,在Y轴倾斜ay度|nvue不支持| +|skewX|ax| 参数范围-180~180;Y轴坐标不变,X轴坐标延顺时针倾斜ax度|nvue不支持| +|skewY|ay| 参数范围-180~180;X轴坐标不变,Y轴坐标延顺时针倾斜ay度|nvue不支持| + + +**矩阵变形:** + +|属性名|值|说明|平台差异| +|:-:|:-:|:-:|:-:| +|matrix|(a,b,c,d,tx,ty)|同 [transform-function matrix](https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix())|nvue不支持| +|matrix3d|同 [transform-function matrix3d](https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d())|nvue不支持| \ No newline at end of file -- GitLab