Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DCloud
uni-ai-chat
提交
02819006
U
uni-ai-chat
项目概览
DCloud
/
uni-ai-chat
通知
893
Star
11
Fork
8
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
2
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
uni-ai-chat
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
2
Issue
2
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
02819006
编写于
6月 07, 2023
作者:
DCloud_JSON
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
更新依赖的modules版本
上级
0defac42
变更
30
隐藏空白更改
内联
并排
Showing
30 changed file
with
763 addition
and
740 deletion
+763
-740
uni_modules/uni-id-pages/changelog.md
uni_modules/uni-id-pages/changelog.md
+16
-5
uni_modules/uni-id-pages/common/check-id-card.js
uni_modules/uni-id-pages/common/check-id-card.js
+3
-1
uni_modules/uni-id-pages/common/store.js
uni_modules/uni-id-pages/common/store.js
+9
-9
uni_modules/uni-id-pages/components/uni-id-pages-fab-login/uni-id-pages-fab-login.vue
...ponents/uni-id-pages-fab-login/uni-id-pages-fab-login.vue
+17
-8
uni_modules/uni-id-pages/config.js
uni_modules/uni-id-pages/config.js
+7
-17
uni_modules/uni-id-pages/package.json
uni_modules/uni-id-pages/package.json
+2
-2
uni_modules/uni-id-pages/pages/login/login-withpwd.vue
uni_modules/uni-id-pages/pages/login/login-withpwd.vue
+5
-5
uni_modules/uni-id-pages/pages/userinfo/realname-verify/realname-verify.vue
...-pages/pages/userinfo/realname-verify/realname-verify.vue
+2
-1
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/common/error.js
...d-pages/uniCloud/cloudfunctions/uni-id-co/common/error.js
+70
-70
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/index.obj.js
...i-id-pages/uniCloud/cloudfunctions/uni-id-co/index.obj.js
+7
-2
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/lib/utils/login.js
...ages/uniCloud/cloudfunctions/uni-id-co/lib/utils/login.js
+3
-3
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/middleware/verify-request-sign.js
...loudfunctions/uni-id-co/middleware/verify-request-sign.js
+82
-82
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/admin/add-user.js
...niCloud/cloudfunctions/uni-id-co/module/admin/add-user.js
+11
-1
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/facial-recognition-verify/get-auth-result.js
...id-co/module/facial-recognition-verify/get-auth-result.js
+1
-0
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/login/login-by-qq.js
...loud/cloudfunctions/uni-id-co/module/login/login-by-qq.js
+2
-1
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/login/login-by-weixin.js
.../cloudfunctions/uni-id-co/module/login/login-by-weixin.js
+2
-1
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/unbind-qq.js
...Cloud/cloudfunctions/uni-id-co/module/relate/unbind-qq.js
+1
-14
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/unbind-weixin.js
...d/cloudfunctions/uni-id-co/module/relate/unbind-weixin.js
+2
-4
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/utils/set-push-cid.js
...oud/cloudfunctions/uni-id-co/module/utils/set-push-cid.js
+9
-18
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/verify/create-captcha.js
.../cloudfunctions/uni-id-co/module/verify/create-captcha.js
+3
-2
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/verify/refresh-captcha.js
...cloudfunctions/uni-id-co/module/verify/refresh-captcha.js
+4
-2
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/package.json
...i-id-pages/uniCloud/cloudfunctions/uni-id-co/package.json
+1
-1
uni_modules/uni-open-bridge-common/changelog.md
uni_modules/uni-open-bridge-common/changelog.md
+2
-0
uni_modules/uni-open-bridge-common/package.json
uni_modules/uni-open-bridge-common/package.json
+1
-1
uni_modules/uni-open-bridge-common/uniCloud/cloudfunctions/common/uni-open-bridge-common/weixin-server.js
...dfunctions/common/uni-open-bridge-common/weixin-server.js
+3
-3
uni_modules/uni-transition/changelog.md
uni_modules/uni-transition/changelog.md
+17
-15
uni_modules/uni-transition/components/uni-transition/createAnimation.js
...i-transition/components/uni-transition/createAnimation.js
+114
-111
uni_modules/uni-transition/components/uni-transition/uni-transition.vue
...i-transition/components/uni-transition/uni-transition.vue
+274
-265
uni_modules/uni-transition/package.json
uni_modules/uni-transition/package.json
+83
-86
uni_modules/uni-transition/readme.md
uni_modules/uni-transition/readme.md
+10
-10
未找到文件。
uni_modules/uni-id-pages/changelog.md
浏览文件 @
02819006
## 1.1.11(2023-03-24)
-
修复 tabbar页面因为token无效而强制跳转至登录页面(url参数包含
`uniIdRedirectUrl`
)后无法返回的问题
## 1.1.10(2023-03-24)
-
修复 PC微信扫码登录跳转地址错误
-
uni-id-co 新增 请求鉴权支持 uni-cloud-s2s 模块验证签名
[
uni-cloud-s2s文档
](
https://uniapp.dcloud.net.cn/uniCloud/uni-cloud-s2s.html
)
## 1.1.14(2023-05-19)
-
修复 退出登录不会跳转至登录页的问题
## 1.1.13(2023-05-10)
-
修复 启用摇树优化 报错的问题
## 1.1.12(2023-05-05)
-
uni-id-co 新增 调用 add-user 接口创建用户时允许触发 beforeRegister 钩子方法,beforeRegister 钩子
[
详见
](
https://uniapp.dcloud.net.cn/uniCloud/uni-id-summary.html#before-register
)
-
uni-id-co 新增 自无 unionid 到有 unionid 状态进行登录时为用户补充 unionid 字段
-
uni-id-co 修复 i18n 在特定场景下报错的 bug
-
uni-id-co 修复 跨平台解绑微信/QQ时无法解绑的 bug
-
uni-id-co 修复 微信小程序等平台创建验证码时无法展示的 bug
-
uni-id-co 修复 更新 push_clientid 时因 device_id 没有变化导致无法更新
## 1.1.11(2023-03-24)
-
修复 tabbar页面因为token无效而强制跳转至登录页面(url参数包含
`uniIdRedirectUrl`
)后无法返回的问题
## 1.1.10(2023-03-24)
-
修复 PC微信扫码登录跳转地址错误
-
uni-id-co 新增 请求鉴权支持 uni-cloud-s2s 模块验证签名
[
uni-cloud-s2s文档
](
https://uniapp.dcloud.net.cn/uniCloud/uni-cloud-s2s.html
)
## 1.1.9(2023-03-24)
-
修复 跳转至登录页面的url参数包含
`uniIdRedirectUrl`
后无法返回的问题
## 1.1.8(2023-03-02)
...
...
uni_modules/uni-id-pages/common/check-id-card.js
浏览文件 @
02819006
export
default
function
checkIdCard
(
idCardNumber
)
{
function
checkIdCard
(
idCardNumber
)
{
if
(
!
idCardNumber
||
typeof
idCardNumber
!==
'
string
'
||
idCardNumber
.
length
!==
18
)
return
false
const
coefficient
=
[
7
,
9
,
10
,
5
,
8
,
4
,
2
,
1
,
6
,
3
,
7
,
9
,
10
,
5
,
8
,
4
,
2
]
...
...
@@ -12,3 +12,5 @@ export default function checkIdCard (idCardNumber) {
return
checkCode
[
sum
%
11
].
toString
()
===
code
.
toLowerCase
()
}
export
default
checkIdCard
uni_modules/uni-id-pages/common/store.js
浏览文件 @
02819006
...
...
@@ -79,7 +79,7 @@ export const mutations = {
uni
.
removeStorageSync
(
'
uni_id_token
'
);
uni
.
setStorageSync
(
'
uni_id_token_expired
'
,
0
)
uni
.
redirectTo
({
url
:
`/
${
pagesJson
.
uniIdRouter
&&
pagesJson
.
uniIdRouter
.
loginPage
?
'
uni_modules/uni-id-pages/pages/login/login-withoutpwd
'
:
'
'
}
`
,
url
:
`/
${
pagesJson
.
uniIdRouter
&&
pagesJson
.
uniIdRouter
.
loginPage
?
pagesJson
.
uniIdRouter
.
loginPage
:
'
uni_modules/uni-id-pages/pages/login/login-withoutpwd
'
}
`
,
});
uni
.
$emit
(
'
uni-id-pages-logout
'
)
this
.
setUserInfo
({},{
cover
:
true
})
...
...
@@ -98,14 +98,14 @@ export const mutations = {
// console.log('判断需要返回几层:', delta);
if
(
uniIdRedirectUrl
)
{
return
uni
.
redirectTo
({
url
:
uniIdRedirectUrl
,
fail
:
(
err1
)
=>
{
uni
.
switchTab
({
url
:
uniIdRedirectUrl
,
fail
:
(
err2
)
=>
{
console
.
log
(
err1
,
err2
)
}
})
url
:
uniIdRedirectUrl
,
fail
:
(
err1
)
=>
{
uni
.
switchTab
({
url
:
uniIdRedirectUrl
,
fail
:
(
err2
)
=>
{
console
.
log
(
err1
,
err2
)
}
})
}
})
}
...
...
uni_modules/uni-id-pages/components/uni-id-pages-fab-login/uni-id-pages-fab-login.vue
浏览文件 @
02819006
...
...
@@ -202,7 +202,6 @@
return
'
/
'
+
pages
[
pages
.
length
-
n
].
route
},
toPage
(
path
,
index
=
0
)
{
let
type
=
[
'
navigateTo
'
,
'
redirectTo
'
][
index
]
//console.log('比较', this.getRoute(1),this.getRoute(2), path)
if
(
this
.
getRoute
(
1
)
==
path
.
split
(
'
?
'
)[
0
]
&&
this
.
getRoute
(
1
)
==
'
/uni_modules/uni-id-pages/pages/login/login-withoutpwd
'
)
{
...
...
@@ -212,13 +211,23 @@
}
else
if
(
this
.
getRoute
(
2
)
==
path
)
{
// 如果上一个页面就是,马上要打开的页面,直接返回。防止重复开启
uni
.
navigateBack
();
}
else
if
(
this
.
getRoute
(
1
)
!=
path
)
{
uni
[
type
]({
url
:
path
,
animationType
:
'
slide-in-left
'
,
complete
(
e
)
{
// console.log(e);
}
})
if
(
index
===
0
){
uni
.
navigateTo
({
url
:
path
,
animationType
:
'
slide-in-left
'
,
complete
(
e
)
{
// console.log(e);
}
})
}
else
{
uni
.
redirectTo
({
url
:
path
,
animationType
:
'
slide-in-left
'
,
complete
(
e
)
{
// console.log(e);
}
})
}
}
else
{
console
.
log
(
'
出乎意料的情况,path:
'
+
path
);
}
...
...
uni_modules/uni-id-pages/config.js
浏览文件 @
02819006
...
...
@@ -17,24 +17,14 @@ export default {
// "douyin",
// #ifdef APP
// 'univerify',
// #endif
// #ifdef MP-WEIXIN
'
weixin
'
,
// #endif
// #ifndef MP-WEIXIN
'
username
'
,
// #endif
'
univerify
'
,
// #endif
'
weixin
'
,
'
username
'
,
// #ifdef APP
'
apple
'
,
// #endif
// #ifndef MP-WEIXIN
'
smsCode
'
,
// #endif
// #endif
'
smsCode
'
],
// 政策协议
agreements
:
{
...
...
@@ -62,7 +52,7 @@ export default {
* weak(弱:密码必须包含字母和数字,长度范围:6-16位之间)
* 为空或false则不验证密码强度
*/
//
passwordStrength: 'medium',
passwordStrength
:
'
medium
'
,
/**
* 登录后允许用户设置密码(只针对未设置密码得用户)
* 开启此功能将 setPasswordAfterLogin 设置为 true 即可
...
...
uni_modules/uni-id-pages/package.json
浏览文件 @
02819006
{
"id"
:
"uni-id-pages"
,
"displayName"
:
"uni-id-pages"
,
"version"
:
"1.1.1
1
"
,
"version"
:
"1.1.1
4
"
,
"description"
:
"云端一体简单、统一、可扩展的用户中心页面模版"
,
"keywords"
:
[
"用户管理"
,
...
...
@@ -48,7 +48,7 @@
"uni-popup"
,
"uni-scss"
,
"uni-transition"
,
"uni-open-bridge-common"
,
"uni-open-bridge-common"
,
"uni-cloud-s2s"
],
"encrypt"
:
[],
...
...
uni_modules/uni-id-pages/pages/login/login-withpwd.vue
浏览文件 @
02819006
...
...
@@ -84,7 +84,7 @@
this
.
focusPassword
=
true
return
uni
.
showToast
({
title
:
'
请输入密码
'
,
icon
:
'
none
'
,
icon
:
'
none
'
,
duration
:
3000
});
}
...
...
@@ -92,7 +92,7 @@
this
.
focusUsername
=
true
return
uni
.
showToast
({
title
:
'
请输入手机号/用户名/邮箱
'
,
icon
:
'
none
'
,
icon
:
'
none
'
,
duration
:
3000
});
}
...
...
@@ -100,7 +100,7 @@
this
.
$refs
.
captcha
.
getImageCaptcha
()
return
uni
.
showToast
({
title
:
'
请输入验证码
'
,
icon
:
'
none
'
,
icon
:
'
none
'
,
duration
:
3000
});
}
...
...
@@ -152,7 +152,7 @@
@media
screen
and
(
min-width
:
690px
)
{
.uni-content
{
height
:
600px
;
height
:
auto
;
}
}
...
...
@@ -173,4 +173,4 @@
.link
{
font-size
:
12px
;
}
</
style
>
</
style
>
uni_modules/uni-id-pages/pages/userinfo/realname-verify/realname-verify.vue
浏览文件 @
02819006
...
...
@@ -40,8 +40,9 @@
</template>
<
script
>
import
checkIdCard
from
'
@/uni_modules/uni-id-pages/common/check-id-card.js
'
import
checkIdCard
from
'
@/uni_modules/uni-id-pages/common/check-id-card.js
'
;
import
mixin
from
'
@/uni_modules/uni-id-pages/common/login-page.mixin.js
'
;
import
{
store
,
mutations
...
...
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/common/error.js
浏览文件 @
02819006
const
ERROR
=
{
ACCOUNT_EXISTS
:
'
uni-id-account-exists
'
,
ACCOUNT_NOT_EXISTS
:
'
uni-id-account-not-exists
'
,
ACCOUNT_NOT_EXISTS_IN_CURRENT_APP
:
'
uni-id-account-not-exists-in-current-app
'
,
ACCOUNT_CONFLICT
:
'
uni-id-account-conflict
'
,
ACCOUNT_BANNED
:
'
uni-id-account-banned
'
,
ACCOUNT_AUDITING
:
'
uni-id-account-auditing
'
,
ACCOUNT_AUDIT_FAILED
:
'
uni-id-account-audit-failed
'
,
ACCOUNT_CLOSED
:
'
uni-id-account-closed
'
,
CAPTCHA_REQUIRED
:
'
uni-id-captcha-required
'
,
PASSWORD_ERROR
:
'
uni-id-password-error
'
,
PASSWORD_ERROR_EXCEED_LIMIT
:
'
uni-id-password-error-exceed-limit
'
,
INVALID_USERNAME
:
'
uni-id-invalid-username
'
,
INVALID_PASSWORD
:
'
uni-id-invalid-password
'
,
INVALID_PASSWORD_SUPER
:
'
uni-id-invalid-password-super
'
,
INVALID_PASSWORD_STRONG
:
'
uni-id-invalid-password-strong
'
,
INVALID_PASSWORD_MEDIUM
:
'
uni-id-invalid-password-medium
'
,
INVALID_PASSWORD_WEAK
:
'
uni-id-invalid-password-weak
'
,
INVALID_MOBILE
:
'
uni-id-invalid-mobile
'
,
INVALID_EMAIL
:
'
uni-id-invalid-email
'
,
INVALID_NICKNAME
:
'
uni-id-invalid-nickname
'
,
INVALID_PARAM
:
'
uni-id-invalid-param
'
,
PARAM_REQUIRED
:
'
uni-id-param-required
'
,
GET_THIRD_PARTY_ACCOUNT_FAILED
:
'
uni-id-get-third-party-account-failed
'
,
GET_THIRD_PARTY_USER_INFO_FAILED
:
'
uni-id-get-third-party-user-info-failed
'
,
MOBILE_VERIFY_CODE_ERROR
:
'
uni-id-mobile-verify-code-error
'
,
EMAIL_VERIFY_CODE_ERROR
:
'
uni-id-email-verify-code-error
'
,
ADMIN_EXISTS
:
'
uni-id-admin-exists
'
,
PERMISSION_ERROR
:
'
uni-id-permission-error
'
,
SYSTEM_ERROR
:
'
uni-id-system-error
'
,
SET_INVITE_CODE_FAILED
:
'
uni-id-set-invite-code-failed
'
,
INVALID_INVITE_CODE
:
'
uni-id-invalid-invite-code
'
,
CHANGE_INVITER_FORBIDDEN
:
'
uni-id-change-inviter-forbidden
'
,
BIND_CONFLICT
:
'
uni-id-bind-conflict
'
,
UNBIND_FAIL
:
'
uni-id-unbind-failed
'
,
UNBIND_NOT_SUPPORTED
:
'
uni-id-unbind-not-supported
'
,
UNBIND_UNIQUE_LOGIN
:
'
uni-id-unbind-unique-login
'
,
UNBIND_PASSWORD_NOT_EXISTS
:
'
uni-id-unbind-password-not-exists
'
,
UNBIND_MOBILE_NOT_EXISTS
:
'
uni-id-unbind-mobile-not-exists
'
,
UNSUPPORTED_REQUEST
:
'
uni-id-unsupported-request
'
,
ILLEGAL_REQUEST
:
'
uni-id-illegal-request
'
,
CONFIG_FIELD_REQUIRED
:
'
uni-id-config-field-required
'
,
CONFIG_FIELD_INVALID
:
'
uni-id-config-field-invalid
'
,
FRV_FAIL
:
'
uni-id-frv-fail
'
,
FRV_PROCESSING
:
'
uni-id-frv-processing
'
,
REAL_NAME_VERIFIED
:
'
uni-id-realname-verified
'
,
ID_CARD_EXISTS
:
'
uni-id-idcard-exists
'
,
INVALID_ID_CARD
:
'
uni-id-invalid-idcard
'
,
INVALID_REAL_NAME
:
'
uni-id-invalid-realname
'
,
UNKNOWN_ERROR
:
'
uni-id-unknown-error
'
,
REAL_NAME_VERIFY_UPPER_LIMIT
:
'
uni-id-realname-verify-upper-limit
'
}
function
isUniIdError
(
errCode
)
{
return
Object
.
values
(
ERROR
).
includes
(
errCode
)
}
class
UniCloudError
extends
Error
{
constructor
(
options
)
{
super
(
options
.
message
)
this
.
errMsg
=
options
.
message
||
''
this
.
errCode
=
options
.
code
}
}
module
.
exports
=
{
ERROR
,
isUniIdError
,
UniCloudError
}
const
ERROR
=
{
ACCOUNT_EXISTS
:
'
uni-id-account-exists
'
,
ACCOUNT_NOT_EXISTS
:
'
uni-id-account-not-exists
'
,
ACCOUNT_NOT_EXISTS_IN_CURRENT_APP
:
'
uni-id-account-not-exists-in-current-app
'
,
ACCOUNT_CONFLICT
:
'
uni-id-account-conflict
'
,
ACCOUNT_BANNED
:
'
uni-id-account-banned
'
,
ACCOUNT_AUDITING
:
'
uni-id-account-auditing
'
,
ACCOUNT_AUDIT_FAILED
:
'
uni-id-account-audit-failed
'
,
ACCOUNT_CLOSED
:
'
uni-id-account-closed
'
,
CAPTCHA_REQUIRED
:
'
uni-id-captcha-required
'
,
PASSWORD_ERROR
:
'
uni-id-password-error
'
,
PASSWORD_ERROR_EXCEED_LIMIT
:
'
uni-id-password-error-exceed-limit
'
,
INVALID_USERNAME
:
'
uni-id-invalid-username
'
,
INVALID_PASSWORD
:
'
uni-id-invalid-password
'
,
INVALID_PASSWORD_SUPER
:
'
uni-id-invalid-password-super
'
,
INVALID_PASSWORD_STRONG
:
'
uni-id-invalid-password-strong
'
,
INVALID_PASSWORD_MEDIUM
:
'
uni-id-invalid-password-medium
'
,
INVALID_PASSWORD_WEAK
:
'
uni-id-invalid-password-weak
'
,
INVALID_MOBILE
:
'
uni-id-invalid-mobile
'
,
INVALID_EMAIL
:
'
uni-id-invalid-email
'
,
INVALID_NICKNAME
:
'
uni-id-invalid-nickname
'
,
INVALID_PARAM
:
'
uni-id-invalid-param
'
,
PARAM_REQUIRED
:
'
uni-id-param-required
'
,
GET_THIRD_PARTY_ACCOUNT_FAILED
:
'
uni-id-get-third-party-account-failed
'
,
GET_THIRD_PARTY_USER_INFO_FAILED
:
'
uni-id-get-third-party-user-info-failed
'
,
MOBILE_VERIFY_CODE_ERROR
:
'
uni-id-mobile-verify-code-error
'
,
EMAIL_VERIFY_CODE_ERROR
:
'
uni-id-email-verify-code-error
'
,
ADMIN_EXISTS
:
'
uni-id-admin-exists
'
,
PERMISSION_ERROR
:
'
uni-id-permission-error
'
,
SYSTEM_ERROR
:
'
uni-id-system-error
'
,
SET_INVITE_CODE_FAILED
:
'
uni-id-set-invite-code-failed
'
,
INVALID_INVITE_CODE
:
'
uni-id-invalid-invite-code
'
,
CHANGE_INVITER_FORBIDDEN
:
'
uni-id-change-inviter-forbidden
'
,
BIND_CONFLICT
:
'
uni-id-bind-conflict
'
,
UNBIND_FAIL
:
'
uni-id-unbind-failed
'
,
UNBIND_NOT_SUPPORTED
:
'
uni-id-unbind-not-supported
'
,
UNBIND_UNIQUE_LOGIN
:
'
uni-id-unbind-unique-login
'
,
UNBIND_PASSWORD_NOT_EXISTS
:
'
uni-id-unbind-password-not-exists
'
,
UNBIND_MOBILE_NOT_EXISTS
:
'
uni-id-unbind-mobile-not-exists
'
,
UNSUPPORTED_REQUEST
:
'
uni-id-unsupported-request
'
,
ILLEGAL_REQUEST
:
'
uni-id-illegal-request
'
,
CONFIG_FIELD_REQUIRED
:
'
uni-id-config-field-required
'
,
CONFIG_FIELD_INVALID
:
'
uni-id-config-field-invalid
'
,
FRV_FAIL
:
'
uni-id-frv-fail
'
,
FRV_PROCESSING
:
'
uni-id-frv-processing
'
,
REAL_NAME_VERIFIED
:
'
uni-id-realname-verified
'
,
ID_CARD_EXISTS
:
'
uni-id-idcard-exists
'
,
INVALID_ID_CARD
:
'
uni-id-invalid-idcard
'
,
INVALID_REAL_NAME
:
'
uni-id-invalid-realname
'
,
UNKNOWN_ERROR
:
'
uni-id-unknown-error
'
,
REAL_NAME_VERIFY_UPPER_LIMIT
:
'
uni-id-realname-verify-upper-limit
'
}
function
isUniIdError
(
errCode
)
{
return
Object
.
values
(
ERROR
).
includes
(
errCode
)
}
class
UniCloudError
extends
Error
{
constructor
(
options
)
{
super
(
options
.
message
)
this
.
errMsg
=
options
.
message
||
''
this
.
errCode
=
options
.
code
}
}
module
.
exports
=
{
ERROR
,
isUniIdError
,
UniCloudError
}
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/index.obj.js
浏览文件 @
02819006
...
...
@@ -212,11 +212,16 @@ module.exports = {
}
// 国际化
const
messages
=
require
(
'
./lang/index
'
)
const
fallbackLocale
=
'
zh-Hans
'
const
i18n
=
uniCloud
.
initI18n
({
locale
:
clientInfo
.
locale
,
fallbackLocale
:
'
zh-Hans
'
,
messages
:
require
(
'
./lang/index
'
)
fallbackLocale
,
messages
:
JSON
.
parse
(
JSON
.
stringify
(
messages
)
)
})
if
(
!
messages
[
i18n
.
locale
])
{
i18n
.
setLocale
(
fallbackLocale
)
}
this
.
t
=
i18n
.
t
.
bind
(
i18n
)
this
.
response
=
{}
...
...
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/lib/utils/login.js
浏览文件 @
02819006
...
...
@@ -173,8 +173,8 @@ async function thirdPartyLogin (params = {}) {
user
}
=
params
return
{
mobileCo
mfirmd
:
user
.
mobile_comfirm
d
,
emailCo
mfirmd
:
user
.
email_comfirm
d
mobileCo
nfirmed
:
!!
user
.
mobile_confirme
d
,
emailCo
nfirmed
:
!!
user
.
email_confirme
d
}
}
...
...
@@ -194,7 +194,7 @@ async function postLogin (params = {}) {
last_login_ip
:
clientIP
,
...
extraData
}
const
createTokenRes
=
await
this
.
uniIdCommon
.
createToken
({
const
createTokenRes
=
await
this
.
uniIdCommon
.
createToken
({
uid
})
...
...
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/middleware/verify-request-sign.js
浏览文件 @
02819006
const
crypto
=
require
(
'
crypto
'
)
const
createConfig
=
require
(
'
uni-config-center
'
)
const
{
verifyHttpInfo
}
=
require
(
'
uni-cloud-s2s
'
)
const
{
ERROR
}
=
require
(
'
../common/error
'
)
const
s2sConfig
=
createConfig
({
pluginId
:
'
uni-cloud-s2s
'
})
const
needSignFunctions
=
new
Set
([
'
externalRegister
'
,
'
externalLogin
'
,
'
updateUserInfoByExternal
'
])
module
.
exports
=
function
()
{
const
methodName
=
this
.
getMethodName
()
const
{
source
}
=
this
.
getUniversalClientInfo
()
// 指定接口需要鉴权
if
(
!
needSignFunctions
.
has
(
methodName
))
return
// 非 HTTP 方式请求拒绝访问
if
(
source
!==
'
http
'
)
{
throw
{
errCode
:
ERROR
.
ILLEGAL_REQUEST
}
}
// 支持 uni-cloud-s2s 验证请求
if
(
s2sConfig
.
hasFile
(
'
config.json
'
))
{
try
{
if
(
!
verifyHttpInfo
(
this
.
getHttpInfo
()))
{
throw
{
errCode
:
ERROR
.
ILLEGAL_REQUEST
}
}
}
catch
(
e
)
{
if
(
e
.
errSubject
===
'
uni-cloud-s2s
'
)
{
throw
{
errCode
:
ERROR
.
ILLEGAL_REQUEST
,
errMsg
:
e
.
errMsg
}
}
throw
e
}
return
}
if
(
!
this
.
config
.
requestAuthSecret
||
typeof
this
.
config
.
requestAuthSecret
!==
'
string
'
)
{
throw
{
errCode
:
ERROR
.
CONFIG_FIELD_REQUIRED
,
errMsgValue
:
{
field
:
'
requestAuthSecret
'
}
}
}
const
timeout
=
20
*
1000
// 请求超过20秒不能再请求,防止重放攻击
const
{
headers
,
body
:
_body
}
=
this
.
getHttpInfo
()
const
{
'
uni-id-nonce
'
:
nonce
,
'
uni-id-timestamp
'
:
timestamp
,
'
uni-id-signature
'
:
signature
}
=
headers
const
body
=
JSON
.
parse
(
_body
).
params
||
{}
const
bodyStr
=
Object
.
keys
(
body
)
.
sort
()
.
filter
(
item
=>
typeof
body
[
item
]
!==
'
object
'
)
.
map
(
item
=>
`
${
item
}
=
${
body
[
item
]}
`
)
.
join
(
'
&
'
)
if
(
isNaN
(
Number
(
timestamp
))
||
(
Number
(
timestamp
)
+
timeout
)
<
Date
.
now
())
{
throw
{
errCode
:
ERROR
.
ILLEGAL_REQUEST
}
}
const
reSignature
=
crypto
.
createHmac
(
'
sha256
'
,
`
${
this
.
config
.
requestAuthSecret
+
nonce
}
`
).
update
(
`
${
timestamp
}${
bodyStr
}
`
).
digest
(
'
hex
'
)
if
(
signature
!==
reSignature
.
toUpperCase
())
{
throw
{
errCode
:
ERROR
.
ILLEGAL_REQUEST
}
}
}
const
crypto
=
require
(
'
crypto
'
)
const
createConfig
=
require
(
'
uni-config-center
'
)
const
{
verifyHttpInfo
}
=
require
(
'
uni-cloud-s2s
'
)
const
{
ERROR
}
=
require
(
'
../common/error
'
)
const
s2sConfig
=
createConfig
({
pluginId
:
'
uni-cloud-s2s
'
})
const
needSignFunctions
=
new
Set
([
'
externalRegister
'
,
'
externalLogin
'
,
'
updateUserInfoByExternal
'
])
module
.
exports
=
function
()
{
const
methodName
=
this
.
getMethodName
()
const
{
source
}
=
this
.
getUniversalClientInfo
()
// 指定接口需要鉴权
if
(
!
needSignFunctions
.
has
(
methodName
))
return
// 非 HTTP 方式请求拒绝访问
if
(
source
!==
'
http
'
)
{
throw
{
errCode
:
ERROR
.
ILLEGAL_REQUEST
}
}
// 支持 uni-cloud-s2s 验证请求
if
(
s2sConfig
.
hasFile
(
'
config.json
'
))
{
try
{
if
(
!
verifyHttpInfo
(
this
.
getHttpInfo
()))
{
throw
{
errCode
:
ERROR
.
ILLEGAL_REQUEST
}
}
}
catch
(
e
)
{
if
(
e
.
errSubject
===
'
uni-cloud-s2s
'
)
{
throw
{
errCode
:
ERROR
.
ILLEGAL_REQUEST
,
errMsg
:
e
.
errMsg
}
}
throw
e
}
return
}
if
(
!
this
.
config
.
requestAuthSecret
||
typeof
this
.
config
.
requestAuthSecret
!==
'
string
'
)
{
throw
{
errCode
:
ERROR
.
CONFIG_FIELD_REQUIRED
,
errMsgValue
:
{
field
:
'
requestAuthSecret
'
}
}
}
const
timeout
=
20
*
1000
// 请求超过20秒不能再请求,防止重放攻击
const
{
headers
,
body
:
_body
}
=
this
.
getHttpInfo
()
const
{
'
uni-id-nonce
'
:
nonce
,
'
uni-id-timestamp
'
:
timestamp
,
'
uni-id-signature
'
:
signature
}
=
headers
const
body
=
JSON
.
parse
(
_body
).
params
||
{}
const
bodyStr
=
Object
.
keys
(
body
)
.
sort
()
.
filter
(
item
=>
typeof
body
[
item
]
!==
'
object
'
)
.
map
(
item
=>
`
${
item
}
=
${
body
[
item
]}
`
)
.
join
(
'
&
'
)
if
(
isNaN
(
Number
(
timestamp
))
||
(
Number
(
timestamp
)
+
timeout
)
<
Date
.
now
())
{
throw
{
errCode
:
ERROR
.
ILLEGAL_REQUEST
}
}
const
reSignature
=
crypto
.
createHmac
(
'
sha256
'
,
`
${
this
.
config
.
requestAuthSecret
+
nonce
}
`
).
update
(
`
${
timestamp
}${
bodyStr
}
`
).
digest
(
'
hex
'
)
if
(
signature
!==
reSignature
.
toUpperCase
())
{
throw
{
errCode
:
ERROR
.
ILLEGAL_REQUEST
}
}
}
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/admin/add-user.js
浏览文件 @
02819006
...
...
@@ -113,7 +113,17 @@ module.exports = async function (params = {}) {
data
.
mobile_confirmed
=
1
}
await
userCollection
.
add
(
data
)
// 触发 beforeRegister 钩子
const
beforeRegister
=
this
.
hooks
.
beforeRegister
let
userRecord
=
data
if
(
beforeRegister
)
{
userRecord
=
await
beforeRegister
({
userRecord
,
clientInfo
:
this
.
getUniversalClientInfo
()
})
}
await
userCollection
.
add
(
userRecord
)
return
{
errCode
:
0
,
errMsg
:
''
...
...
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/facial-recognition-verify/get-auth-result.js
浏览文件 @
02819006
...
...
@@ -70,6 +70,7 @@ module.exports = async function (params) {
status
:
REAL_NAME_STATUS
.
CERTIFY_FAILED
})
console
.
log
(
ERROR
.
FRV_FAIL
,
'
error:
'
,
res
)
throw
{
errCode
:
ERROR
.
FRV_FAIL
}
...
...
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/login/login-by-qq.js
浏览文件 @
02819006
...
...
@@ -108,7 +108,8 @@ module.exports = async function (params = {}) {
const
extraData
=
{
qq_openid
:
{
[
`
${
qqPlatform
}
_
${
appId
}
`
]:
openid
}
},
qq_unionid
:
unionid
}
if
(
type
===
'
register
'
&&
qqPlatform
!==
'
mp
'
)
{
const
{
...
...
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/login/login-by-weixin.js
浏览文件 @
02819006
...
...
@@ -110,7 +110,8 @@ module.exports = async function (params = {}) {
const
extraData
=
{
wx_openid
:
{
[
`
${
weixinPlatform
}
_
${
appId
}
`
]:
openid
}
},
wx_unionid
:
unionid
}
if
(
type
===
'
register
'
&&
weixinPlatform
!==
'
mp
'
)
{
const
{
...
...
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/unbind-qq.js
浏览文件 @
02819006
...
...
@@ -5,10 +5,6 @@ const {
const
{
LOG_TYPE
,
dbCmd
}
=
require
(
'
../../common/constants
'
)
const
{
getQQPlatform
}
=
require
(
'
../../lib/utils/qq
'
)
/**
* 解绑QQ
* @tutorial https://uniapp.dcloud.net.cn/uniCloud/uni-id-pages.html#unbind-qq
...
...
@@ -16,20 +12,11 @@ const {
*/
module
.
exports
=
async
function
()
{
const
{
uid
}
=
this
.
authInfo
const
{
appId
}
=
this
.
getUniversalClientInfo
()
const
qqPlatform
=
getQQPlatform
.
call
(
this
)
await
preUnBind
.
call
(
this
,
{
uid
,
unBindAccount
:
{
qq_openid
:
dbCmd
.
or
([
{
[
qqPlatform
]:
dbCmd
.
exists
(
true
)
},
{
[
`
${
qqPlatform
}
_
${
appId
}
`
]:
dbCmd
.
exists
(
true
)
}
]),
qq_openid
:
dbCmd
.
exists
(
true
),
qq_unionid
:
dbCmd
.
exists
(
true
)
},
logType
:
LOG_TYPE
.
UNBIND_QQ
...
...
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/relate/unbind-weixin.js
浏览文件 @
02819006
...
...
@@ -16,14 +16,12 @@ const {
*/
module
.
exports
=
async
function
()
{
const
{
uid
}
=
this
.
authInfo
const
weixinPlatform
=
getWeixinPlatform
.
call
(
this
)
//
const weixinPlatform = getWeixinPlatform.call(this)
await
preUnBind
.
call
(
this
,
{
uid
,
unBindAccount
:
{
wx_openid
:
{
[
weixinPlatform
]:
dbCmd
.
exists
(
true
)
},
wx_openid
:
dbCmd
.
exists
(
true
),
wx_unionid
:
dbCmd
.
exists
(
true
)
},
logType
:
LOG_TYPE
.
UNBIND_WEIXIN
...
...
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/utils/set-push-cid.js
浏览文件 @
02819006
...
...
@@ -117,25 +117,16 @@ module.exports = async function (params = {}) {
errCode
:
0
}
}
// 同一用户允许更新token_expired,不同用户在token_expired小于Date.now()时允许更新。搭配逻辑:用户退出登录时将token_expired置0
if
(
deviceRecord
.
user_id
===
uid
||
(
deviceRecord
.
token_expired
<
Date
.
now
())
)
{
await
deviceCollection
.
where
({
device_id
:
deviceId
}).
update
({
user_id
:
uid
,
token_expired
:
tokenExpired
,
push_clientid
:
pushClientId
,
appid
:
appId
})
return
{
errCode
:
0
}
}
await
deviceCollection
.
where
({
device_id
:
deviceId
}).
update
({
user_id
:
uid
,
token_expired
:
tokenExpired
,
push_clientid
:
pushClientId
,
appid
:
appId
})
return
{
errCode
:
ERROR
.
SYSTEM_ERROR
errCode
:
0
}
}
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/verify/create-captcha.js
浏览文件 @
02819006
...
...
@@ -18,7 +18,7 @@ module.exports = async function (params = {}) {
}
this
.
middleware
.
validate
(
params
,
schema
)
const
deviceId
=
this
.
getUniversalClientInfo
().
deviceId
const
{
deviceId
,
platform
}
=
this
.
getUniversalClientInfo
()
const
{
scene
}
=
params
...
...
@@ -29,6 +29,7 @@ module.exports = async function (params = {}) {
}
return
this
.
uniCaptcha
.
create
({
deviceId
,
scene
scene
,
uniPlatform
:
platform
})
}
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/module/verify/refresh-captcha.js
浏览文件 @
02819006
...
...
@@ -18,7 +18,8 @@ module.exports = async function (params = {}) {
}
this
.
middleware
.
validate
(
params
,
schema
)
const
deviceId
=
this
.
getUniversalClientInfo
().
deviceId
const
{
deviceId
,
platform
}
=
this
.
getUniversalClientInfo
()
const
{
scene
}
=
params
...
...
@@ -29,6 +30,7 @@ module.exports = async function (params = {}) {
}
return
this
.
uniCaptcha
.
refresh
({
deviceId
,
scene
scene
,
uniPlatform
:
platform
})
}
uni_modules/uni-id-pages/uniCloud/cloudfunctions/uni-id-co/package.json
浏览文件 @
02819006
{
"name"
:
"uni-id-co"
,
"version"
:
"1.1.1
0
"
,
"version"
:
"1.1.1
4
"
,
"description"
:
""
,
"main"
:
"index.js"
,
"keywords"
:
[],
...
...
uni_modules/uni-open-bridge-common/changelog.md
浏览文件 @
02819006
## 1.2.0(2023-04-27)
-
优化 微信小程序平台 使用微信新增 API getStableAccessToken 获取 access_token, access_token 有效期内重复调用该接口不会更新 access_token,
[
详情
](
https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-access-token/getStableAccessToken.html
)
## 1.1.5(2023-03-27)
-
修复 微信小程序平台 某些情况下 encrypt_key 插入错误的问题
## 1.1.4(2023-03-13)
...
...
uni_modules/uni-open-bridge-common/package.json
浏览文件 @
02819006
{
"id"
:
"uni-open-bridge-common"
,
"displayName"
:
"uni-open-bridge-common"
,
"version"
:
"1.
1.5
"
,
"version"
:
"1.
2.0
"
,
"description"
:
"统一接管微信等三方平台认证凭据"
,
"keywords"
:
[
"uni-open-bridge-common"
,
...
...
uni_modules/uni-open-bridge-common/uniCloud/cloudfunctions/common/uni-open-bridge-common/weixin-server.js
浏览文件 @
02819006
...
...
@@ -20,8 +20,8 @@ class WeixinServer {
getAccessToken
()
{
return
uniCloud
.
httpclient
.
request
(
WeixinServer
.
AccessToken_Url
,
{
dataType
:
'
json
'
,
method
:
'
GE
T
'
,
dataAsQueryString
:
true
,
method
:
'
POS
T
'
,
contentType
:
'
json
'
,
data
:
{
appid
:
this
.
_appid
,
secret
:
this
.
_secret
,
...
...
@@ -106,7 +106,7 @@ class WeixinServer {
}
}
WeixinServer
.
AccessToken_Url
=
'
https://api.weixin.qq.com/cgi-bin/token
'
WeixinServer
.
AccessToken_Url
=
'
https://api.weixin.qq.com/cgi-bin/
stable_
token
'
WeixinServer
.
Code2Session_Url
=
'
https://api.weixin.qq.com/sns/jscode2session
'
WeixinServer
.
User_Encrypt_Key_Url
=
'
https://api.weixin.qq.com/wxa/business/getuserencryptkey
'
WeixinServer
.
AccessToken_H5_Url
=
'
https://api.weixin.qq.com/cgi-bin/token
'
...
...
uni_modules/uni-transition/changelog.md
浏览文件 @
02819006
## 1.3.2(2023-05-04)
-
修复 NVUE 平台报错的问题
## 1.3.1(2021-11-23)
-
修复 init 方法初始化问题
## 1.3.0(2021-11-19)
-
优化 组件UI,并提供设计资源,详见:
[
https://uniapp.dcloud.io/component/uniui/resource
](
https://uniapp.dcloud.io/component/uniui/resource
)
-
文档迁移,详见:
[
https://uniapp.dcloud.io/component/uniui/uni-transition
](
https://uniapp.dcloud.io/component/uniui/uni-transition
)
## 1.2.1(2021-09-27)
-
修复 init 方法不生效的 Bug
## 1.2.0(2021-07-30)
-
组件兼容 vue3,如何创建 vue3 项目,详见
[
uni-app 项目支持 vue3 介绍
](
https://ask.dcloud.net.cn/article/37834
)
## 1.1.1(2021-05-12)
-
新增 示例地址
-
修复 示例项目缺少组件的 Bug
## 1.1.0(2021-04-22)
-
新增 通过方法自定义动画
-
新增 custom-class 非 NVUE 平台支持自定义 class 定制样式
-
优化 动画触发逻辑,使动画更流畅
-
优化 支持单独的动画类型
-
优化 文档示例
## 1.0.2(2021-02-05)
-
调整为 uni_modules 目录规范
## 1.2.1(2021-09-27)
-
修复 init 方法不生效的 Bug
## 1.2.0(2021-07-30)
-
组件兼容 vue3,如何创建 vue3 项目,详见
[
uni-app 项目支持 vue3 介绍
](
https://ask.dcloud.net.cn/article/37834
)
## 1.1.1(2021-05-12)
-
新增 示例地址
-
修复 示例项目缺少组件的 Bug
## 1.1.0(2021-04-22)
-
新增 通过方法自定义动画
-
新增 custom-class 非 NVUE 平台支持自定义 class 定制样式
-
优化 动画触发逻辑,使动画更流畅
-
优化 支持单独的动画类型
-
优化 文档示例
## 1.0.2(2021-02-05)
-
调整为 uni_modules 目录规范
uni_modules/uni-transition/components/uni-transition/createAnimation.js
浏览文件 @
02819006
// 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
=
''
// 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
// 在iOS10+QQ小程序平台下,传给原生的对象一定是个普通对象而不是Proxy对象,否则会报parameter should be Object instead of ProxyObject的错误
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
}
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
}
}
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
.
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
)
{
this
.
next
++
// #endif
return
this
}
run
(
fn
)
{
// #ifndef APP-NVUE
this
.
$
.
animationData
=
this
.
animation
.
export
()
this
.
$
.
animationData
=
this
.
animation
.
export
()
this
.
$
.
timer
=
setTimeout
(()
=>
{
typeof
fn
===
'
function
'
&&
fn
()
},
this
.
$
.
durationTime
)
// #endif
// #ifdef APP-NVUE
typeof
fn
===
'
function
'
&&
fn
()
},
this
.
$
.
durationTime
)
// #endif
// #ifdef APP-NVUE
this
.
isEnd
=
false
let
ref
=
this
.
$
.
$refs
[
'
ani
'
]
&&
this
.
$
.
$refs
[
'
ani
'
].
ref
if
(
!
ref
)
return
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
)
{
if
(
!
ref
)
return
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
}
})
// #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
)
if
(
!
_this
)
return
clearTimeout
(
_this
.
timer
)
return
new
MPAnimation
(
option
,
_this
)
}
uni_modules/uni-transition/components/uni-transition/uni-transition.vue
浏览文件 @
02819006
<
template
>
<view
v-if=
"isShow"
ref=
"ani"
:animation=
"animationData"
:class=
"customClass"
:style=
"transformStyles"
@
click=
"onClick"
><slot></slot></view>
</
template
>
<
script
>
import
{
createAnimation
}
from
'
./createAnimation
'
/**
* Transition 过渡动画
* @description 简单过渡动画组件
* @tutorial https://ext.dcloud.net.cn/plugin?id=985
* @property {Boolean} show = [false|true] 控制组件显示或隐藏
* @property {Array|String} modeClass = [fade|slide-top|slide-right|slide-bottom|slide-left|zoom-in|zoom-out] 过渡动画类型
* @value fade 渐隐渐出过渡
* @value slide-top 由上至下过渡
* @value slide-right 由右至左过渡
* @value slide-bottom 由下至上过渡
* @value slide-left 由左至右过渡
* @value zoom-in 由小到大过渡
* @value zoom-out 由大到小过渡
* @property {Number} duration 过渡动画持续时间
* @property {Object} styles 组件样式,同 css 样式,注意带’-‘连接符的属性需要使用小驼峰写法如:`backgroundColor:red`
*/
export
default
{
name
:
'
uniTransition
'
,
emits
:[
'
click
'
,
'
change
'
],
props
:
{
show
:
{
type
:
Boolean
,
default
:
false
},
modeClass
:
{
type
:
[
Array
,
String
],
default
()
{
return
'
fade
'
}
},
duration
:
{
type
:
Number
,
default
:
300
},
styles
:
{
type
:
Object
,
default
()
{
return
{}
}
<
template
>
<!-- #ifndef APP-NVUE -->
<view
v-show=
"isShow"
ref=
"ani"
:animation=
"animationData"
:class=
"customClass"
:style=
"transformStyles"
@
click=
"onClick"
><slot></slot></view>
<!-- #endif -->
<!-- #ifdef APP-NVUE -->
<view
v-if=
"isShow"
ref=
"ani"
:animation=
"animationData"
:class=
"customClass"
:style=
"transformStyles"
@
click=
"onClick"
><slot></slot></view>
<!-- #endif -->
</
template
>
<
script
>
import
{
createAnimation
}
from
'
./createAnimation
'
/**
* Transition 过渡动画
* @description 简单过渡动画组件
* @tutorial https://ext.dcloud.net.cn/plugin?id=985
* @property {Boolean} show = [false|true] 控制组件显示或隐藏
* @property {Array|String} modeClass = [fade|slide-top|slide-right|slide-bottom|slide-left|zoom-in|zoom-out] 过渡动画类型
* @value fade 渐隐渐出过渡
* @value slide-top 由上至下过渡
* @value slide-right 由右至左过渡
* @value slide-bottom 由下至上过渡
* @value slide-left 由左至右过渡
* @value zoom-in 由小到大过渡
* @value zoom-out 由大到小过渡
* @property {Number} duration 过渡动画持续时间
* @property {Object} styles 组件样式,同 css 样式,注意带’-‘连接符的属性需要使用小驼峰写法如:`backgroundColor:red`
*/
export
default
{
name
:
'
uniTransition
'
,
emits
:[
'
click
'
,
'
change
'
],
props
:
{
show
:
{
type
:
Boolean
,
default
:
false
},
modeClass
:
{
type
:
[
Array
,
String
],
default
()
{
return
'
fade
'
}
},
duration
:
{
type
:
Number
,
default
:
300
},
styles
:
{
type
:
Object
,
default
()
{
return
{}
}
},
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
),
this
)
},
/**
* 点击组件触发回调
*/
onClick
()
{
this
.
$emit
(
'
click
'
,
{
detail
:
this
.
isShow
})
},
/**
* ref 触发 动画分组
* @param {Object} obj
*/
step
(
obj
,
config
=
{})
{
},
onceRender
:{
type
:
Boolean
,
default
:
false
},
},
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
),
this
)
},
/**
* 点击组件触发回调
*/
onClick
()
{
this
.
$emit
(
'
click
'
,
{
detail
:
this
.
isShow
})
},
/**
* ref 触发 动画分组
* @param {Object} obj
*/
step
(
obj
,
config
=
{})
{
if
(
!
this
.
animation
)
return
for
(
let
i
in
obj
)
{
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
}
不存在`
)
}
}
}
}
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
()
}
}
}
</
script
>
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
()
}
}
}
</
script
>
<
style
></
style
>
uni_modules/uni-transition/package.json
浏览文件 @
02819006
{
"id"
:
"uni-transition"
,
"displayName"
:
"uni-transition 过渡动画"
,
"version"
:
"1.3.1"
,
"description"
:
"元素的简单过渡动画"
,
"keywords"
:
[
"uni-ui"
,
"uniui"
,
"动画"
,
"过渡"
,
"过渡动画"
],
"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-scss"
],
"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"
},
"Vue"
:
{
"vue2"
:
"y"
,
"vue3"
:
"y"
}
}
}
}
{
"id"
:
"uni-transition"
,
"displayName"
:
"uni-transition 过渡动画"
,
"version"
:
"1.3.2"
,
"description"
:
"元素的简单过渡动画"
,
"keywords"
:
[
"uni-ui"
,
"uniui"
,
"动画"
,
"过渡"
,
"过渡动画"
],
"repository"
:
"https://github.com/dcloudio/uni-ui"
,
"engines"
:
{
"HBuilderX"
:
""
},
"directories"
:
{
"example"
:
"../../temps/example_temps"
},
"dcloudext"
:
{
"sale"
:
{
"regular"
:
{
"price"
:
"0.00"
},
"sourcecode"
:
{
"price"
:
"0.00"
}
},
"contact"
:
{
"qq"
:
""
},
"declaration"
:
{
"ads"
:
"无"
,
"data"
:
"无"
,
"permissions"
:
"无"
},
"npmurl"
:
"https://www.npmjs.com/package/@dcloudio/uni-ui"
,
"type"
:
"component-vue"
},
"uni_modules"
:
{
"dependencies"
:
[
"uni-scss"
],
"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"
},
"Vue"
:
{
"vue2"
:
"y"
,
"vue3"
:
"y"
}
}
}
}
}
\ No newline at end of file
uni_modules/uni-transition/readme.md
浏览文件 @
02819006
## Transition 过渡动画
> **组件名:uni-transition**
> 代码块: `uTransition`
元素过渡动画
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-transition)
## Transition 过渡动画
> **组件名:uni-transition**
> 代码块: `uTransition`
元素过渡动画
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-transition)
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录