解决merge

This commit is contained in:
2022-06-11 11:28:48 +08:00
117 changed files with 19519 additions and 13458 deletions

View File

@@ -4,7 +4,7 @@
"configurations": [{
"app-plus" :
{
"launchtype" : "local"
"launchtype" : "remote"
},
"default" :
{

View File

@@ -30,7 +30,7 @@ const request = (parameter, hideLoding = true) => {
// 注入header
config.header = {
'Accept': 'application/json',
'Authorization': store.getters.getToken || ''
'Authorization': store.getters.getToken || uni.getStorageSync('token')
}
// 加载提示
if(!hideLoding) uni.showLoading({
@@ -137,6 +137,8 @@ const errToast = (code) => {
// 更新token
const updateToken = (token) => {
store.commit('setToken', token)
// 清除退出登录标识
uni.removeStorageSync('isnew')
}
// 处理登录提示

View File

@@ -24,7 +24,70 @@ const recharge = (data) => {
})
}
// 充值订单信息
const payment = (data) => {
return request({
url: "user/transaction/recharge/payment",
method: "POST",
data
})
}
// 充值记录
const log = (data) => {
return request({
url: 'user/transaction/recharge/lists'
})
}
// 获取钱包地址
const code = () => {
return request({
url: 'chain/account/code'
})
}
// 转账初始化
const transfer = () => {
return request({
url: 'user/transaction/transfer'
})
}
// 设置支付密码
const setpassword = data => {
return request({
url: 'user/transaction/setpassword',
method: 'POST',
data
})
}
// 获取验证码
const getSms = data => {
return request({
url: 'user/transaction/setpassword/sms',
method: 'POST'
})
}
// 提交转账
const submitTransfer = data => {
return request({
url: 'user/transaction/transfer/store',
method: 'POST',
data
})
}
export {
dt,
recharge
recharge,
payment,
log,
code,
transfer,
setpassword,
getSms,
submitTransfer
}

View File

@@ -15,7 +15,22 @@ const life = () =>{
})
}
// 共分首页
const glz = () => {
return request({
url: 'user/glz/index'
})
}
// 签到
const sign = () => {
return request({
url: 'user/glz/sign'
})
}
export {
life
life,
glz,
sign
}

View File

@@ -21,16 +21,34 @@ const goods = id => {
})
}
// 套餐列表
const meals = (id, categoryId) => {
// 店铺列表
const shops = (categoryId) => {
return request({
url: 'mall/meals/' + id,
url: 'mall/shops',
data: {
category_id: categoryId
}
})
}
// 店铺详情
const shopsDetail = (shopId) => {
return request({
url: 'mall/shops/' + shopId,
})
}
// 店铺商品
const shopsGoods = (shop_id, category_id) => {
return request({
url: 'mall/goods',
data: {
shop_id,
category_id
}
})
}
// 商品列表
const lists = data => {
return request({
@@ -66,7 +84,9 @@ const classify = id => {
export {
mall,
goods,
meals,
shops,
shopsDetail,
shopsGoods,
lists,
buy,
verify,

21
apis/interfaces/team.js Normal file
View File

@@ -0,0 +1,21 @@
/**
* Web唐明明
* 匆匆数载恍如梦,岁月迢迢华发增。
* 碌碌无为枉半生,一朝惊醒万事空。
* moduleName: 团队
*/
import { request } from '../index'
// 团队
const relations = (data) => {
return request({
url: 'user/relations',
data
})
}
export {
relations
}

View File

@@ -14,7 +14,22 @@ const info = () =>{
})
}
// 导出助记词
const chainSeed = () => {
return request({
url: 'chain/safe/seed'
})
}
// 获取邀请码
const invitationCode = () => {
return request({
url: 'user/invite'
})
}
export {
info
info,
chainSeed,
invitationCode
}

View File

@@ -18,14 +18,14 @@ const vip = () =>{
// 开通会员
const vipPay = () => {
return request({
url: ''
url: 'user/identities/buyvip'
})
}
// 获取支付信息
const payInfo = () => {
const payInfo = (orderId) => {
return request({
url: ''
url: 'user/identities/pay/' + orderId + '/wechat'
})
}

View File

@@ -1,7 +1,7 @@
{
"name" : "ZH-HEALTH",
"name" : "共力生态",
"appid" : "__UNI__DE7B0E6",
"description" : "ZH-HEALTH您手上的健康管理专家",
"description" : "共力生态",
"versionName" : "1.0.22",
"versionCode" : 100,
"transformPx" : false,
@@ -78,7 +78,7 @@
"payment" : {
"weixin" : {
"__platform__" : [ "android" ],
"appid" : "wx74b2fcb478707364",
"appid" : "wxcb85e48d044bc5ee",
"UniversalLinks" : ""
},
"alipay" : {
@@ -87,14 +87,12 @@
},
"share" : {
"weixin" : {
"appid" : "wx74b2fcb478707364",
"appid" : "wxcb85e48d044bc5ee",
"UniversalLinks" : ""
}
},
"ad" : {},
"push" : {
"unipush" : {}
},
"push" : {},
"geolocation" : {
"system" : {
"__platform__" : [ "android" ]

View File

@@ -1,363 +1,408 @@
{
"pages" : [
{
"path" : "pages/auth/auth",
"name" : "Auth",
"style" : {
"navigationBarTitleText" : "登录",
"navigationStyle" : "custom"
"pages": [{
"path": "pages/auth/auth",
"name": "Auth",
"style": {
"navigationBarTitleText": "登录",
"navigationStyle": "custom"
}
},
{
"path" : "pages/auth/role",
"name" : "AuthRole",
"style" : {
"navigationBarTitleText" : "角色创建",
"navigationBarBackgroundColor" : "#FFF",
"app-plus" : {
"titleNView" : {
"buttons" : [
{
"text" : "退出登录",
"fontSize" : "14",
"width" : "80px",
"color" : "#34CE98"
"path": "pages/auth/role",
"name": "AuthRole",
"style": {
"navigationBarTitleText": "角色创建",
"navigationBarBackgroundColor": "#FFF",
"app-plus": {
"titleNView": {
"buttons": [{
"text": "退出登录",
"fontSize": "14",
"width": "80px",
"color": "#34CE98"
}]
}
]
}
}
}, {
"path": "pages/life/life",
"name": "Life",
"style": {
"navigationBarTitleText": "共力人生",
"navigationStyle": "custom",
"app-plus": {
"titleNView": {
"type": "transparent"
}
}
}
},
{
"path" : "pages/life/life",
"name" : "Life",
"style" : {
"navigationBarTitleText" : "共力人生",
"navigationStyle" : "custom"
}
},
{
"path" : "pages/store/index",
"name" : "Store",
"style" : {
"navigationBarTitleText" : "DT商城",
"enablePullDownRefresh" : true,
"app-plus" : {
"titleNView" : {
"backgroundColor" : "#FFFFFF",
"buttons" : [
{
"float" : "right",
"text" : "\ue603",
"fontSrc" : "/static/iconfont.ttf",
"color" : "#000",
"fontSize" : "20px"
}
]
"path": "pages/store/index",
"name": "Store",
"style": {
"navigationBarTitleText": "DT商城",
"enablePullDownRefresh": true,
"app-plus": {
"titleNView": {
"backgroundColor": "#FFFFFF",
"buttons": [{
"float": "right",
"text": "\ue603",
"fontSrc": "/static/iconfont.ttf",
"color": "#000",
"fontSize": "20px"
}]
}
}
}
},
{
"path" : "pages/user/index",
"name" : "User",
"style" : {
"navigationBarTitleText" : "我的",
"navigationStyle" : "custom"
}
},
{
"path" : "pages/setting/setting",
"name" : "Setting",
"style" : {
"navigationBarTitleText" : "设置中心",
"navigationBarBackgroundColor" : "#34CE98",
"navigationBarTextStyle" : "white"
}
},
{
"path" : "pages/store/goods",
"name" : "StoreGoods",
"style" : {
"navigationStyle" : "custom",
"navigationBarTitleText" : "详情",
"app-plus" : {
"titleNView" : {
"backgroundColor" : "#FFFFFF",
"type" : "transparent"
"path": "pages/user/index",
"name": "User",
"style": {
"navigationBarTitleText": "我的",
"navigationBarTextStyle": "white",
"app-plus": {
"titleNView": {
"backgroundColor": "#34CE98",
"type": "transparent"
}
}
}
},
{
"path" : "pages/store/buy",
"name" : "StoreBuy",
"style" : {
"navigationBarTitleText" : "确认订单",
"enablePullDownRefresh" : false
"path": "pages/setting/setting",
"name": "Setting",
"style": {
"navigationBarTitleText": "设置中心",
"navigationBarBackgroundColor": "#34CE98",
"navigationBarTextStyle": "white"
}
},
{
"path" : "pages/order/index",
"name" : "Order",
"style" : {
"navigationBarTitleText" : "我的订单",
"navigationBarBackgroundColor" : "#FFFFFF",
"enablePullDownRefresh" : false
}
},
{
"path" : "pages/order/details",
"name" : "OrderDetails",
"style" : {
"navigationBarTitleText" : "订单详情",
"enablePullDownRefresh" : false
}
},
{
"path" : "pages/order/logistics",
"name" : "OrderLogistics",
"style" : {
"navigationBarTitleText" : "物流信息",
"enablePullDownRefresh" : false
}
},
{
"path" : "pages/address/index",
"name" : "Address",
"style" : {
"navigationBarTitleText" : "收货地址"
}
},
{
"path" : "pages/address/edit",
"name" : "AddressEdit",
"style" : {
"navigationBarTitleText" : "编辑",
"enablePullDownRefresh" : false
}
},
{
"path" : "pages/pay/pay",
"name" : "Pay",
"style" : {
"navigationBarTitleText" : "收银台",
"navigationBarBackgroundColor" : "#FFFFFF"
}
},
{
"path" : "pages/store/list",
"name" : "StoreList",
"style" : {
"navigationBarTitleText" : "商品",
"navigationBarBackgroundColor" : "#FFFFFF",
"enablePullDownRefresh" : true
}
},
{
"path" : "pages/store/meals",
"name" : "StoreMeals",
"style" : {
"navigationBarTitleText" : "套餐",
"navigationBarBackgroundColor" : "#FFFFFF",
"enablePullDownRefresh" : true
}
},
{
"path" : "pages/store/search",
"name" : "StoreSearch",
"style" : {
"navigationBarTitleText" : "搜索",
"navigationBarBackgroundColor" : "#FFFFFF"
}
},
{
"path" : "pages/refund/list",
"name" : "OrderRefund",
"style" : {
"navigationBarTitleText" : "退款/售后",
"navigationBarBackgroundColor" : "#FFFFFF",
"enablePullDownRefresh" : true
}
},
{
"path" : "pages/refund/detail",
"name" : "OrderRefundDetail",
"style" : {
"navigationBarTitleText" : "退货退款详情",
"navigationBarBackgroundColor" : "#FFFFFF"
}
},
{
"path" : "pages/refund/aftersale",
"name" : "AfterSale",
"style" : {
"navigationBarTitleText" : " 选择售后类型",
"navigationBarBackgroundColor" : "#FFFFFF"
}
},
{
"path" : "pages/refund/refund_history",
"name" : "RefundHistory",
"style" : {
"navigationBarTitleText" : "售后历史",
"navigationBarBackgroundColor" : "#FFFFFF"
}
},
{
"path" : "pages/refund/deliver_form",
"name" : "DeliverForm",
"style" : {
"navigationBarTitleText" : "填写物流信息",
"navigationBarBackgroundColor" : "#FFFFFF"
}
},
{
"path" : "pages/refund/refund_or_exchange_apply",
"name" : "RefundOrExchangeApply",
"style" : {
"navigationBarTitleText" : "退换货申请",
"navigationBarBackgroundColor" : "#FFFFFF"
}
},
{
"path" : "pages/refund/exchange",
"name" : "Exchange",
"style" : {
"navigationBarTitleText" : "换货",
"navigationBarBackgroundColor" : "#FFFFFF"
}
},
{
"path" : "pages/refund/refund_money",
"name" : "RefundMoney",
"style" : {
"navigationBarTitleText" : "申请退款",
"navigationBarBackgroundColor" : "#FFFFFF"
}
},
{
"path" : "pages/account/integral",
"name" : "AccountIntegral",
"style" : {
"navigationBarTitleText" : "共力值",
"navigationBarBackgroundColor" : "#34CE98",
"navigationBarTextStyle" : "white"
}
},
{
"path" : "pages/account/dt",
"name" : "AccountDt",
"style" : {
"navigationBarTitleText" : "DT积分",
"navigationBarBackgroundColor" : "#34CE98",
"backgroundColorTop" : "#34CE98",
"navigationBarTextStyle" : "white",
"app-plus" : {
"titleNView" : {
"buttons" : [
{
"text" : "充值",
"width" : "60",
"fontSize" : "14"
}
]
"path": "pages/store/goods",
"name": "StoreGoods",
"style": {
"navigationStyle": "custom",
"navigationBarTitleText": "详情",
"app-plus": {
"titleNView": {
"backgroundColor": "#FFFFFF",
"type": "transparent"
}
}
}
},
{
"path" : "pages/account/recharge",
"name" : "AccountRecharge",
"style" : {
"navigationBarTitleText" : "DT积分充值",
"navigationBarBackgroundColor" : "#FFFFFF",
"app-plus" : {
"titleNView" : {
"buttons" : [
{
"text" : "充值记录",
"width" : "80",
"fontSize" : "14"
}
]
}
}
"path": "pages/store/buy",
"name": "StoreBuy",
"style": {
"navigationBarTitleText": "确认订单",
"enablePullDownRefresh": false
}
},
{
"path" : "pages/vip/vip",
"name" : "Vip",
"style" : {
"navigationBarTitleText" : "共力会员",
"navigationBarBackgroundColor" : "#242430",
"navigationBarTextStyle" : "white",
"backgroundColorTop" : "#242430"
"path": "pages/order/index",
"name": "Order",
"style": {
"navigationBarTitleText": "我的订单",
"navigationBarBackgroundColor": "#FFFFFF",
"enablePullDownRefresh": false
}
},{
"path": "pages/order/logistics",
"name": "OrderLogistics",
"style": {
"navigationBarTitleText": "物流进度",
"navigationBarBackgroundColor": "#FFFFFF",
"enablePullDownRefresh": false
}
},
{
"path" : "pages/vip/agreement",
"style" : {
"navigationBarTitleText" : "共力会员协议"
"path": "pages/order/details",
"name": "OrderDetails",
"style": {
"navigationBarTitleText": "订单详情",
"enablePullDownRefresh": false
}
},
{
"path" : "pages/team/index",
"name" : "Team",
"style" : {
"navigationBarTitleText" : "共力团队",
"enablePullDownRefresh" : false
"path": "pages/address/index",
"name": "Address",
"style": {
"navigationBarTitleText": "收货地址"
}
},
{
"path" : "pages/store/shop/shopDetail",
"name" : "ShopDetail",
"style" : {
"navigationStyle" : "custom"
"path": "pages/address/edit",
"name": "AddressEdit",
"style": {
"navigationBarTitleText": "编辑",
"enablePullDownRefresh": false
}
},
{
"path" : "pages/store/shop/shopList",
"name" : "ShopList",
"style" : {
"navigationBarTitleText" : "更多店铺",
"navigationBarBackgroundColor" : "#FFFFFF",
"enablePullDownRefresh" : true
"path": "pages/pay/pay",
"name": "Pay",
"style": {
"navigationBarTitleText": "收银台",
"navigationBarBackgroundColor": "#FFFFFF"
}
},
{
"path": "pages/store/list",
"name": "StoreList",
"style": {
"navigationBarTitleText": "商品",
"navigationBarBackgroundColor": "#FFFFFF",
"enablePullDownRefresh": true
}
},
{
"path": "pages/store/meals",
"name": "StoreMeals",
"style": {
"navigationBarTitleText": "套餐",
"navigationBarBackgroundColor": "#FFFFFF",
"enablePullDownRefresh": true
}
},
{
"path": "pages/store/search",
"name": "StoreSearch",
"style": {
"navigationBarTitleText": "搜索",
"navigationBarBackgroundColor": "#FFFFFF"
}
},
{
"path": "pages/refund/list",
"name": "OrderRefund",
"style": {
"navigationBarTitleText": "退换货",
"navigationBarBackgroundColor": "#FFFFFF"
}
}, {
"path": "pages/refund/exchange",
"name": "Exchange",
"style": {
"navigationBarTitleText": "换货",
"navigationBarBackgroundColor": "#FFFFFF"
}
},
{
"path": "pages/refund/detail",
"name": "OrderRefundDetail",
"style": {
"navigationBarTitleText": "退货退款详情",
"navigationBarBackgroundColor": "#FFFFFF"
}
},
{
"path": "pages/refund/aftersale",
"name": "AfterSale",
"style": {
"navigationBarTitleText": " 选择售后类型",
"navigationBarBackgroundColor": "#FFFFFF"
}
},
{
"path": "pages/refund/refund_history",
"name": "RefundHistory",
"style": {
"navigationBarTitleText": "售后历史",
"navigationBarBackgroundColor": "#FFFFFF"
}
},
{
"path": "pages/refund/deliver_form",
"name": "DeliverForm",
"style": {
"navigationBarTitleText": "填写物流信息",
"navigationBarBackgroundColor": "#FFFFFF"
}
},
{
"path": "pages/refund/refund_or_exchange_apply",
"name": "RefundOrExchangeApply",
"style": {
"navigationBarTitleText": "退换货申请",
"navigationBarBackgroundColor": "#FFFFFF"
}
},
{
"path": "pages/refund/refund_money",
"name": "RefundMoney",
"style": {
"navigationBarTitleText": "申请退款",
"navigationBarBackgroundColor": "#FFFFFF"
}
},
{
"path": "pages/account/integral",
"name": "AccountIntegral",
"style": {
"navigationBarTitleText": "共力值",
"navigationBarBackgroundColor": "#34CE98",
"navigationBarTextStyle": "white"
}
}, {
"path": "pages/account/dt",
"name": "AccountDt",
"style": {
"navigationBarTitleText": "DT积分",
"navigationBarBackgroundColor": "#34CE98",
"backgroundColorTop": "#34CE98",
"navigationBarTextStyle": "white",
"app-plus": {
"titleNView": {
"buttons": [{
"text": "充值",
"width": "60",
"fontSize": "14"
}]
}
}
}
}, {
"path": "pages/account/recharge",
"name": "AccountRecharge",
"style": {
"navigationBarTitleText": "充值",
"navigationBarBackgroundColor": "#FFFFFF",
"app-plus": {
"titleNView": {
"buttons": [{
"text": "充值记录",
"width": "80",
"fontSize": "14"
}]
}
}
}
}, {
"path": "pages/vip/vip",
"name": "Vip",
"style": {
"navigationBarTitleText": "共力会员",
"navigationBarBackgroundColor": "#242430",
"navigationBarTextStyle": "white",
"backgroundColorTop": "#242430"
}
}, {
"path": "pages/vip/agreement",
"style": {
"navigationBarTitleText": "共力会员协议"
}
}, {
"path": "pages/team/index",
"name": "Team",
"style": {
"navigationBarTitleText": "共力团队"
}
},
{
"path": "pages/store/shop/shopDetail",
"name": "ShopDetail",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/store/shop/shopList",
"name": "ShopList",
"style": {
"navigationBarTitleText": "店铺",
"navigationBarBackgroundColor": "#FFFFFF",
"enablePullDownRefresh": true
}
}, {
"path": "pages/account/log",
"name": "AccountLog",
"style": {
"navigationBarTitleText": "充值记录",
"navigationBarBackgroundColor": "#FFFFFF"
}
}, {
"path": "pages/account/transfer",
"name": "AccountTransfer",
"style": {
"navigationBarTitleText": "转账",
"navigationBarBackgroundColor": "#F3F6FB"
}
}, {
"path": "pages/account/resetPassword",
"name": "AccountResetPassword",
"style": {
"navigationBarTitleText": "钱包密码",
"navigationBarBackgroundColor": "#F3F6FB"
}
}, {
"path": "pages/account/results",
"name": "Accountresults",
"style": {
"navigationBarTitleText": "转账结果",
"navigationBarBackgroundColor": "#FFFFFF"
}
}, {
"path": "pages/account/code",
"name": "AccountCode",
"style": {
"navigationBarTitleText": "收款码",
"navigationBarBackgroundColor": "#34CE98",
"backgroundColorTop": "#34CE98",
"navigationBarTextStyle": "white"
}
}, {
"path": "pages/invitation/invitation",
"name": "Invitation",
"style": {
"navigationStyle": "custom",
"disableScroll": true
}
}, {
"path": "pages/life/capacity",
"name": "Capacity",
"style": {
"navigationBarTitleText": "-"
}
}
],
"tabBar" : {
"borderStyle" : "white",
"selectedColor" : "#34CE98",
"list" : [
{
"iconPath" : "static/tabBar/tabBar_02.png",
"selectedIconPath" : "static/tabBar/tabBar_show_02.png",
"pagePath" : "pages/life/life",
"text" : "共力人生"
"tabBar": {
"borderStyle": "white",
"selectedColor": "#34CE98",
"list": [{
"iconPath": "static/tabBar/tabBar_02.png",
"selectedIconPath": "static/tabBar/tabBar_show_02.png",
"pagePath": "pages/life/life",
"text": "共力人生"
}, {
"iconPath": "static/tabBar/tabBar_02.png",
"selectedIconPath": "static/tabBar/tabBar_show_02.png",
"pagePath": "pages/store/index",
"text": "DT商城"
}, {
"iconPath": "static/tabBar/tabBar_03.png",
"selectedIconPath": "static/tabBar/tabBar_show_03.png",
"pagePath": "pages/user/index",
"text": "我的"
}]
},
{
"iconPath" : "static/tabBar/tabBar_02.png",
"selectedIconPath" : "static/tabBar/tabBar_show_02.png",
"pagePath" : "pages/store/index",
"text" : "DT商城"
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "ZH健康",
"navigationBarBackgroundColor": "#F3F6FB",
"backgroundColorTop": "#F3F6FB",
"backgroundColorBottom": "#F3F6FB"
},
{
"iconPath" : "static/tabBar/tabBar_03.png",
"selectedIconPath" : "static/tabBar/tabBar_show_03.png",
"pagePath" : "pages/user/index",
"text" : "我的"
}
]
"easycom": {
"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
},
"globalStyle" : {
"navigationBarTextStyle" : "black",
"navigationBarTitleText" : "ZH健康",
"navigationBarBackgroundColor" : "#F3F6FB",
"backgroundColorTop" : "#F3F6FB",
"backgroundColorBottom" : "#F3F6FB"
},
"easycom" : {
"^u-(.*)" : "uview-ui/components/u-$1/u-$1.vue"
"condition": { //模式配置,仅开发期间生效
"current": 0 //当前激活的模式(list 的索引项)
}
}

124
pages/account/code.vue Normal file
View File

@@ -0,0 +1,124 @@
<template>
<view class="vertical code">
<view class="vertical code-content">
<view class="sub-title">扫码转入DT积分</view>
<view class="code-img">
<image :src="code" mode="widthFix" />
</view>
<view class="hr"></view>
<view class="sub-title">钱包地址</view>
<view class="hash">{{address || '-'}}</view>
<view class="buttons">
<button class="item greed" type="default" @click="copyAddress">复制</button>
</view>
</view>
<view class="footer">共力生态</view>
</view>
</template>
<script>
import { code } from '@/apis/interfaces/account'
export default {
data() {
return {
address: '',
code: ''
};
},
mounted() {
code().then(res=>{
this.code = res.image
this.address = res.address
}).catch(err=>{
uni.showToast({
icon: 'none',
title: err.message
})
})
},
methods:{
copyAddress(){
uni.setClipboardData({
data: this.address
})
}
}
}
</script>
<style lang="scss" scoped>
.code{
height: 100vh;
background:linear-gradient(to bottom, $main-color, #22ab98);
padding-bottom: env(safe-area-inset-bottom);
padding-bottom: constant(safe-area-inset-bottom);
box-sizing: border-box;
// 收款码
.code-content{
text-align: center;
background: white;
margin: 0 8vw;
border-radius: $radius;
padding: $padding * 2;
height: 70vh;
box-shadow: 0 0 6rpx 6rpx rgba($color: #000000, $alpha: .02);
box-sizing: border-box;
.sub-title{
font-size: $title-size;
}
.code-img{
width: 20vh;
height: 20vh;
margin: $margin * 3 0 $margin * 2;
display: inline-block;
background-image: url(../../static/background/wallet-code-background.png);
padding: $padding;
box-sizing: border-box;
background-position: center;
background-size: cover;
image{
width: 100%;
}
}
.hr{
height: 1rpx;
background: $border-color;
margin: $margin * 2 0;
}
.hash{
word-wrap: break-word;
font-size: 28rpx;
padding: $padding 0;
}
.buttons{
display: flex;
padding-top: $padding * 2;
.item{
width: 40%;
height: 80rpx;
line-height: 80rpx;
border-radius: 40rpx;
font-size: $title-size;
color: white;
&::after{
border: none;
}
&.red{
background: $text-price;
}
&.greed{
background: $main-color;
}
}
}
}
// 底部
.footer{
height: 10vh;
line-height: 10vh;
text-align: center;
font-size: 28rpx;
color: rgba(255, 255, 255, .5);
}
}
</style>

View File

@@ -1,20 +1,19 @@
<template>
<view class="content">
<view class="dt-header">
<view class="dt-header-number">
<view class="title">DT积分余额</view>
<view class="num">{{score}}</view>
</view>
<button class="transfer" size="mini" @click="onTransfer('AccountCode')">收款</button>
<button class="transfer" size="mini" @click="onTransfer('AccountTransfer')">转账</button>
</view>
<block v-if="logs.length > 0">
<view class="logs-title">账户记录</view>
<view class="logs-item">
<view class="logs-item-title">账户充值</view>
<view class="logs-item-time">2022-06-07 10:10:51</view>
<view class="logs-item-price add">+1000.0</view>
</view>
<view class="logs-item">
<view class="logs-item-title">账户充值</view>
<view class="logs-item-time">2022-06-07 10:10:51</view>
<view class="logs-item-price remove">-1000.0</view>
<view class="logs-item" v-for="(item,index) in logs" :key="index">
<view class="logs-item-title">{{item.remark}}</view>
<view class="logs-item-time">{{item.created_at}}</view>
<view class="logs-item-price" :class="item.amount > 0 ? 'add': 'remove'">{{item.amount}}</view>
</view>
</block>
<block v-else>
@@ -50,8 +49,15 @@
this.logs = res.lists.data
this.page = res.lists.page
}).catch(err => {
console.log(err)
uni.showToast({
title: err.message,
icon : 'none'
})
})
},
// 转账
onTransfer(name){
this.$Router.push({name})
}
},
onNavigationBarButtonTap() {
@@ -68,17 +74,40 @@
background: $window-color;
min-height: 100vh;
.dt-header{
display: flex;
justify-content: space-between;
flex-direction: row;
background: $main-color;
padding: $padding*3 $padding $padding*2;
align-items: center;
.dt-header-number{
width: calc(100% - 330rpx);
.title{
color: rgba(255, 255, 255, .9);
font-size: 28rpx;
@extend .nowrap;
}
.num{
font-weight: bold;
font-size: 60rpx;
padding-top: 10rpx;
color: white;
@extend .nowrap;
}
}
.transfer[size="mini"]{
width: 150rpx;
height: 80rpx;
border-radius: 40rpx;
line-height: 80rpx;
background: white;
font-size: 30rpx;
color: $main-color;
margin: 0;
font-weight: bold;
&::after{
display: none;
}
}
}
// 账户记录

90
pages/account/log.vue Normal file
View File

@@ -0,0 +1,90 @@
<template>
<view class="logs">
<block v-if="logs.length > 0">
<view class="logs-item" v-for="(item, index) in logs" :key="index">
<view class="logs-item-flex">
<view class="title">充值DT积分</view>
<view class="price">{{item.amount}}</view>
</view>
<view class="logs-item-flex">
<view class="time">{{item.created_at}}</view>
<view class="status">{{item.status_text}}</view>
</view>
</view>
</block>
<block v-else>
<view class="vertical pages-empty">
<u-empty
icon="http://cdn.uviewui.com/uview/empty/list.png"
textColor="#999"
text="暂无充值记录"
>
</u-empty>
</view>
</block>
</view>
</template>
<script>
import { log } from '@/apis/interfaces/account.js'
export default {
data() {
return {
logs: [],
pages: {}
};
},
created() {
log().then(res => {
this.logs = res.data
this.pages = res.pages
}).catch(err => {
uni.showToast({
title: err.message,
icon : 'none'
})
})
}
}
</script>
<style lang="scss">
// 数据为空
.pages-empty{
height: 80vh;
}
// 记录
.logs{
background-color: $window-color;
min-height: 100vh;
overflow: hidden;
box-sizing: border-box;
padding: 10rpx 0;
.logs-item{
border-radius: $radius;
background: white;
margin: ($margin - 10) $margin;
padding: $padding;
&-flex{
display: flex;
justify-content: space-between;
.title{
font-weight: bold;
font-size: 32rpx;
}
.price{
font-size: 30rpx;
font-weight: bold;
line-height: 40rpx;
color: $text-price;
}
.time,
.status{
font-size: 26rpx;
line-height: 40rpx;
color: gray;
}
}
}
}
</style>

View File

@@ -15,25 +15,25 @@
</view>
<view class="recharge-fast">
<view class="recharge-fast-item" @click="onRecharge(50)">
<view class="recharge-fast-price">50<text></text></view>
<view class="recharge-fast-numb">50<text>DT积分</text></view>
</view>
<view class="recharge-fast-item" @click="onRecharge(100)">
<view class="recharge-fast-price">100<text></text></view>
<view class="recharge-fast-numb">100<text>DT积分</text></view>
</view>
<view class="recharge-fast-item" @click="onRecharge(200)">
<view class="recharge-fast-item" @click="onRecharge(100)">
<view class="recharge-fast-price">200<text></text></view>
<view class="recharge-fast-numb">200<text>DT积分</text></view>
</view>
<view class="recharge-fast-item" @click="onRecharge(500)">
<view class="recharge-fast-item" @click="onRecharge(200)">
<view class="recharge-fast-price">500<text></text></view>
<view class="recharge-fast-numb">500<text>DT积分</text></view>
</view>
<view class="recharge-fast-item" @click="onRecharge(1000)">
<view class="recharge-fast-item" @click="onRecharge(500)">
<view class="recharge-fast-price">1000<text></text></view>
<view class="recharge-fast-numb">1000<text>DT积分</text></view>
</view>
<view class="recharge-fast-item" @click="onRecharge(1000)">
<view class="recharge-fast-price">3000<text></text></view>
<view class="recharge-fast-numb">3000<text>DT积分</text></view>
</view>
<view class="recharge-fast-item" @click="onRecharge(5000)">
<view class="recharge-fast-price">5000<text></text></view>
<view class="recharge-fast-numb">5000<text>DT积分</text></view>
@@ -48,7 +48,7 @@
</template>
<script>
import { recharge } from "@/apis/interfaces/account"
import { recharge, payment } from "@/apis/interfaces/account"
export default {
data() {
return {
@@ -68,21 +68,42 @@
// 充值
onRecharge(value){
uni.showLoading({
title: '加载中'
title: '提交订单'
})
recharge({
amount: typeof(value) === 'number' ? value: this.priceValue
}).then(res => {
console.log(res)
if(res.order_id){
uni.showLoading({
title: '获取支付信息'
})
this.getPayInfo(res.order_id)
}
}).catch(err => {
uni.showToast({
title: err.message,
icon : 'none'
})
})
},
// 获取充值信息
getPayInfo(order_id){
payment({order_id}).then(res => {
uni.requestPayment({
provider: 'wxpay',
orderInfo: res,
orderInfo: JSON.parse(res),
success: res => {
console.log(res)
uni.redirectTo({
url: './results?type=recharge'
})
},
fail(err) {
let showToast = err.errMsg
if(err.errMsg === 'requestPayment:fail [payment微信:-2]User canceled'){
showToast = '充值被取消'
}
uni.showToast({
title: err.errMsg,
title: showToast,
icon : 'none'
})
}
@@ -96,7 +117,7 @@
}
},
onNavigationBarButtonTap() {
console.log('充值记录')
this.$Router.push({name: 'AccountLog'})
}
}
</script>

View File

@@ -0,0 +1,203 @@
<template>
<view class="content">
<!-- 设置支付密码 -->
<view class="password">
<view class="prompt">
<view class="prompt-code">验证码已发送至{{phone}} <button size="mini" :disabled="getCodeState" @click="getCode">{{sendCode}}</button></view>
<view>请设置6位数字密码建议不要使用连续的数字</view>
</view>
<view class="group">
<view class="inputs">
<label>设密码</label>
<input type="number" v-model="password" maxlength="6" password placeholder="请设置支付密码" />
</view>
<view class="inputs">
<label>确认密码</label>
<input type="number" v-model="verify" maxlength="6" password placeholder="请确认支付密码" />
</view>
<view class="inputs">
<label>验证码</label>
<input type="number" v-model="code" maxlength="4" placeholder="请输入验证码" />
</view>
</view>
</view>
<!-- 按钮 -->
<view class="buttons">
<button type="default" form-type="submit" @click="createWallet">确认</button>
</view>
</view>
</template>
<script>
import { setpassword, getSms } from '@/apis/interfaces/account'
export default {
data() {
return {
sendCode : '',
getCodeState: false,
phone : '',
code : '',
password : '',
verify : ''
}
},
onLoad() {
this.phone = this.$Route.query.phone
this.getCode()
},
methods: {
// 获取验证码
getCode(){
let outTime;
let smsTime = 60;
getSms().then(res => {
uni.showToast({
title: res,
icon: "none",
});
this.getCodeState = true;
this.sendCode = smsTime + 's后重新获取';
outTime = setInterval(() => {
if (smsTime <= 1) {
this.getCodeState = false;
this.sendCode = '重新获取';
clearInterval(outTime);
return
}
this.sendCode = smsTime + 's后重新获取';
smsTime -= 1;
}, 1000);
}).catch((err) => {
uni.showToast({
title: err.message,
icon: "none",
});
});
},
// 激活钱包
createWallet() {
if (this.password === '' || this.verify === '') {
uni.showToast({
icon: 'none',
title: '请设置支付密码'
})
return
}
if (this.password !== this.verify) {
uni.showToast({
icon: 'none',
title: '两次输入密码不一致'
})
return
}
setpassword({
password: this.password,
password_confirmation: this.verify,
code: this.code
}).then(res => {
uni.showModal({
title: '提示',
content: '支付密码设置成功',
showCancel:false,
success: res=> {
uni.navigateBack()
}
})
}).catch(err => {
console.log(err)
uni.showToast({
icon: 'none',
title: err.message
})
})
}
}
}
</script>
<style lang="scss" scoped>
.content{
background: $window-color;
min-height: 100vh;
overflow: hidden;
}
// 副标题
.sub-title {
color: $text-gray;
text-align: center;
margin: $margin * 2 $margin;
font-size: $title-size-m;
}
// 设置密码
.password {
padding: 0 $padding;
.prompt {
margin-top: $margin * 2;
font-size: $title-size-m;
color: gray;
text-align: center;
&-code{
line-height: 50rpx;
button[size="mini"]{
vertical-align: top;
margin-left: 20rpx;
font-size: $title-size-m;
background: transparent;
color: $main-color;
height: 50rpx;
line-height: 50rpx;
width: auto;
padding: 0;
&::after{
display: none;
}
}
}
}
.group {
margin-top: $margin;
border-radius: $radius-m;
box-shadow: 0 0 4rpx 4rpx rgba($color: $text-color, $alpha: .02);
background-color: white;
.inputs {
padding: $padding $padding + 10;
border-bottom: solid 1rpx $border-color;
&:last-child {
border-bottom: none;
}
label {
color: $text-gray;
font-size: $title-size-m;
}
input {
height: 70rpx;
line-height: 70rpx;
font-size: $title-size;
}
}
}
}
// 按钮
.buttons {
padding: $padding*2 $padding;
button {
border-radius: 45rpx;
height: 90rpx;
line-height: 90rpx;
background-color: $main-color;
color: white;
font-weight: bold;
font-size: $title-size;
&::after{
display: none;
}
}
}
</style>

90
pages/account/results.vue Normal file
View File

@@ -0,0 +1,90 @@
<template>
<view>
<view class="vertical results">
<uni-icons type="checkbox-filled" size="88" color="#34CE98"></uni-icons>
<view class="title">{{type !== 'recharge' ? '转账交易已提交' : '充值信息已提交'}}</view>
<view class="sub-title">预计10秒内到账{{type !== 'recharge' ? '可在DT积分账户交易记录中查询以实际到账时间为准' : '可在DT积分账户交易记录中查询如充值失败充值金额原路退还'}}</view>
<view class="hash" v-if="type !== 'recharge'">
<view class="hash-title">交易哈希</view>
<view class="hash-text">{{hash}}</view>
</view>
<button class="results-button" type="default" @click="navBack">返回</button>
</view>
</view>
</template>
<script>
export default {
data() {
return {
type: 'recharge',
hash: ''
};
},
onLoad(e){
this.type = e.type
if(e.type === 'recharge'){
uni.setNavigationBarTitle({
title: '充值结果'
})
}
if(e.hash){
this.hash = e.hash
}
},
methods:{
navBack(){
uni.navigateBack()
}
}
}
</script>
<style lang="scss" scoped>
.results{
height: 100vh;
box-sizing: border-box;
text-align: center;
padding-left: $padding * 3;
padding-right: $padding * 3;
padding-bottom: 20vh;
.title{
font-size: $title-size + 8;
color: $text-color;
font-weight: bold;
line-height: 80rpx;
padding: $padding 0;
}
.sub-title{
color: $text-gray;
line-height: 40rpx;
}
.hash{
background-color: white;
padding: $padding * 2;
border-radius: $radius-lg;
margin-top: $margin * 2;
font-size: $title-size;
color: $text-color;
.hash-title{
padding-bottom: $padding;
}
.hash-text{
word-break:break-all;
}
}
.results-button{
margin-top: $margin * 3;
height: 90rpx;
line-height: 90rpx;
border-radius: 45rpx;
background-color: $main-color;
color: white;
font-size: $title-size;
font-weight: bold;
&::after{
display: none;
}
}
}
</style>

227
pages/account/transfer.vue Normal file
View File

@@ -0,0 +1,227 @@
<template>
<view class="transfer">
<!-- 账户余额 -->
<view class="transfer-block">
<view class="unit">DT积分</view>
<view class="transfer-flex">
<view class="item ellipsis">
<label>余额</label>{{balance || '0.00'}}
</view>
</view>
</view>
<view class="sub-title">
<text>请认真确认地址及数量地址错误无法找回</text>
</view>
<!-- 转账信息 -->
<view class="password">
<view class="group">
<view class="inputs input-scan">
<label>接收地址</label>
<input type="text" placeholder="请输入接收地址" v-model="address" />
<view class="input-scan-icon" @click="scanCode">
<uni-icons type="scan" size="22" color="#34CE98"></uni-icons>
</view>
</view>
<view class="inputs">
<label>转账数量</label>
<input type="number" placeholder="请输入转账数量" v-model="number" />
</view>
</view>
<view class="group">
<view class="inputs">
<label>交易密码</label>
<input type="password" placeholder="请输入安全密码" v-model="password" />
</view>
</view>
</view>
<!-- 按钮 -->
<view class="buttons">
<button type="default" @click="submitTransfer">转账</button>
</view>
</view>
</template>
<script>
import { transfer, submitTransfer } from '@/apis/interfaces/account'
export default {
data() {
return {
balance : '0.00',
address : '',
number : '',
password : ''
}
},
onLoad(e){
if(e.hashAddress) this.address = e.hashAddress
},
onShow() {
uni.showLoading({
title: '获取账户信息',
})
transfer().then(res => {
let phone = res.mobile
this.balance = res.balance
if(!res.has_transfer_password){
uni.showModal({
title : '提示',
content : '暂未设置账户密码,无法发起转账,请设置后重试',
cancelText : '稍后设置',
confirmText : '立即设置',
success : modalRes => {
if(modalRes.confirm){
this.$Router.push({name: 'AccountResetPassword', params: {phone}})
return
}
this.$Router.back()
}
})
}
uni.hideLoading()
}).catch(err => {
uni.showToast({
title: err.message,
icon : 'none'
})
})
},
methods: {
// 转账
submitTransfer(){
if(this.address === '' || this.number === '' || this.password === ''){
let messageText
if(this.address === '') messageText = '请输入接收地址'
else if(this.number === '') messageText = '请输入转账数量'
else if(this.password === '') messageText = '请输入支付密码'
uni.showToast({
icon: 'none',
title: messageText
})
return
}
// 提交转账信息
submitTransfer({
addr: this.address,
amount: this.number,
transfer_password: this.password
}).then(res => {
uni.redirectTo({
url: './results?hash=' + res.hash + '&number=' + this.amount
})
}).catch(err => {
uni.showToast({
icon: 'none',
title: err.message
})
})
},
// 扫码
scanCode(){
uni.scanCode({
scanType: ['qrCode'],
success: res=> {
this.address = res.result
}
})
}
}
}
</script>
<style lang="scss" scoped>
.transfer{
background: $window-color;
min-height: 100vh;
overflow: hidden;
}
// 账户余额
.transfer-block{
background-color: window-color;
margin: $margin;
border-radius: $radius;
box-shadow: 0 0 4rpx 4rpx rgba($color: $text-color, $alpha: .02);
background-color: white;
padding: $padding $padding + 10;
.unit{
font-weight: bold;
font-size: $title-size + 10;
line-height: 90rpx;
color: $text-color;
}
.transfer-flex{
display: flex;
padding: $padding 0;
border-top: solid 1rpx $border-color;
.item{
width: 100%;
font-size: $title-size-m;
& > label{
color: $text-gray;
padding-right: $padding/2;
}
}
}
}
// 提示信息
.sub-title{
color: $text-gray;
text-align: center;
margin: $margin*2 $margin $margin $margin;
font-size: $title-size-m;
}
// 转账信息
.password{
padding: 0 $padding;
.group{
margin-top: $margin;
border-radius: $radius;
box-shadow: 0 0 4rpx 4rpx rgba($color: $text-color, $alpha: .02);
background-color: white;
.inputs{
padding: $padding $padding + 10;
border-bottom: solid 1rpx $border-color;
&:last-child{
border-bottom: none;
}
label{
color: $text-gray;
font-size: $title-size-m;
}
input{
height: 70rpx;
line-height: 70rpx;
font-size: $title-size;
}
}
.input-scan{
position: relative;
padding-right: ($padding*2) + 70;
.input-scan-icon{
position: absolute;
bottom: $padding;
right: $padding;
height: 70rpx;
width: 70rpx;
line-height: 70rpx;
text-align: center;
}
}
}
}
// 按钮
.buttons{
padding: $padding*2 $padding;
button{
height: 90rpx;
line-height: 90rpx;
background-color: $main-color;
border-radius: 45rpx;
color: white;
font-weight: bold;
font-size: $title-size;
&::after{
display: none;
}
}
}
</style>

View File

@@ -13,6 +13,9 @@
<input v-model="code" type="number" maxlength="4" placeholder="输入验证码">
<button :disabled="getSms" size="mini" @click="getPhoneCode()">{{sendCode}}</button>
</view>
<view class="auth-input">
<input v-model="parentId" type="number" placeholder="输入邀请码">
</view>
<view class="auth-button">
<button @click="login('code')">登录</button>
</view>
@@ -36,6 +39,7 @@
return {
phone : '18245180131',
code : '',
parentId: '',
getSms : false,
sendCode: '获取验证码'
};
@@ -81,12 +85,13 @@
title: '登录中'
})
smsAuth({
mobileNo: this.phone,
mobileNo : this.phone,
code : this.code,
parent_id : this.parentId
}).then((res) => {
this.$store.commit('setToken', res.token_type + ' ' + res.access_token);
this.$store.commit('setIsNew', res.is_new ? 0 : 1)
if(res.is_new){
uni.setStorageSync('isnew', res.is_new ? 0 : 1)
this.$Router.replace({name: 'AuthRole'})
return
}

View File

@@ -0,0 +1,193 @@
<template>
<view class="invitation">
<view class="invitation-refund">
<view class="invitation-refund-btn" @click="onBack">
<uni-icons type="back" color="white" size="24"></uni-icons>
</view>
</view>
<image class="invitation-back" src="@/static/img/code_back.png" mode="aspectFill"></image>
<view class="invitation-content">
<view class="invitation-lay">
<image class="invitation-code" :src="code"></image>
<view class="invitation-text">
<view class="invitation-text-code" @click="copyInvite"><text>{{invite}}</text>点击复制</view>
<view class="invitation-text-sub">扫码下载共力生态App</view>
<view class="invitation-text-sub">邀请好友增加共力分增长</view>
</view>
</view>
<button class="invitation-btn" @click="onShare">分享邀请</button>
</view>
<!-- 分享 -->
<uni-popup ref="popupShare" type="share" background-color="#fff">
<uni-popup-share title="分享到" @select="select"></uni-popup-share>
</uni-popup>
</view>
</template>
<script>
import { invitationCode } from '@/apis/interfaces/user.js'
export default {
data() {
return {
invite: '',
code : '',
};
},
created() {
invitationCode().then(res => {
this.invite = res[0].invite
this.code = res[0].code
})
},
methods: {
// 返回
onBack(){
this.$Router.back()
},
// 复制邀请码
copyInvite(){
uni.setClipboardData({
data: this.invite,
success() {
uni.showToast({
title: '邀请码已复制',
icon : 'none'
})
}
})
},
// 分享
onShare(){
this.$refs.popupShare.open();
},
// 分享选项
select(e){
switch(e.item.name){
case 'wxchum':
uni.share({
provider: 'weixin',
scene : 'WXSceneSession',
type : 0,
href : 'https://www.baidu.com',
title : '共力生态',
summary : '共力生态 共力 共赢 共享 带你进入web3.0',
imageUrl: 'https://gl-ecological.oss-cn-zhangjiakou.aliyuncs.com/images/2022/06/10/e763ae96ce9d0b4407b68e66963c7cb2.jpg',
fail(err) {
uni.showToast({
title: err.errMsg,
icon : 'none'
})
}
})
break;
case 'wxcircle':
uni.share({
provider: 'weixin',
scene : 'WXSceneTimeline',
type : 0,
href : 'https://www.baidu.com',
title : '共力生态 共力 共赢 共享',
imageUrl: 'https://gl-ecological.oss-cn-zhangjiakou.aliyuncs.com/images/2022/06/10/e763ae96ce9d0b4407b68e66963c7cb2.jpg',
fail(err) {
uni.showToast({
title: err.errMsg,
icon : 'none'
})
}
})
break;
case 'qq':
uni.showToast({
title: 'qq好友分享近期开放敬请期待',
icon : 'none'
})
break;
}
},
}
}
</script>
<style lang="scss">
.invitation{
position: relative;
background: #1c2472;
min-height: 100vh;
.invitation-refund{
@extend .ios-top;
position: absolute;
top: 30rpx;
left: $margin*2;
z-index: 9;
.invitation-refund-btn{
border-radius: 50%;
line-height: 58rpx;
width: 58rpx;
height: 58rpx;
text-align: center;
font-weight: bold;
background: rgba(0, 0, 0, .5);
}
}
.invitation-back{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
}
.invitation-content{
padding: $padding*2;
position: absolute;
bottom: 5vh;
width: 100%;
box-sizing: border-box;
.invitation-lay{
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
background: rgba(0, 0, 0, .5);
border-radius: $radius;
padding: $padding;
margin-bottom: $margin;
color: white;
.invitation-code{
width: 168rpx;
height: 168rpx;
background: white;
}
.invitation-text{
width: calc(100% - 198rpx);
.invitation-text-code{
font-size: 26rpx;
line-height: 50rpx;
text{
font-weight: bold;
font-size: 40rpx;
margin-right: 10rpx;
text-decoration: underline;
}
}
.invitation-text-sub{
font-size: 26rpx;
line-height: 50rpx;
}
}
}
.invitation-btn{
height: 90rpx;
line-height: 90rpx;
border-radius: 45rpx;
font-size: 32rpx;
font-weight: bold;
background: linear-gradient(to top left, #2b307f, #83a8de);
color: white;
&::after{
display: none;
}
}
}
</style>

232
pages/life/capacity.vue Normal file
View File

@@ -0,0 +1,232 @@
<template>
<view class="capacity">
<view class="capacity-title">共力分总产率/小时<text>{{baseHour}}GLF/h</text></view>
<view class="capacity-sbutitle">总产率=角色产率+团队产率+共建产率+共力值产率</view>
<view class="capacity-block">
<view class="capacity-block-title">
<view class="title">我的角色</view>
<view class="nickname">{{nickname}}</view>
</view>
<view class="capacity-block-glf">{{identityText}}:{{base}}GLF/h</view>
</view>
<view class="capacity-block">
<view class="capacity-block-title">
<view class="title">成员产率({{group.effect}}/{{group.count}})<text>{{group.capacity}}GLF/h</text></view>
<view class="more" @click="onInvitation">邀请更多好友</view>
</view>
<view class="capacity-block-table">
<view class="header">
<view class="flex-item">家族成员产率</view>
</view>
<view class="flex">
<view class="flex-item">{{recommend.vip}}人在线(会员)</view>
<view class="flex-item">{{recommend.vip_text}}</view>
</view>
<view class="flex">
<view class="flex-item">{{recommend.novip}}人在线(普通用户)</view>
<view class="flex-item">{{recommend.novip_text}}</view>
</view>
</view>
<view class="capacity-block-table">
<view class="header">
<view class="flex-item">伙伴成员</view>
</view>
<view class="flex">
<view class="flex-item">{{partner.vip}}人在线(会员)</view>
<view class="flex-item">{{partner.vip_text}}</view>
</view>
<view class="flex">
<view class="flex-item">{{partner.novip}}人在线(会员)</view>
<view class="flex-item">{{partner.novip_text}}</view>
</view>
</view>
</view>
<view class="capacity-block">
<view class="capacity-block-title">
<view class="title">共建产率<text>0GLF/h</text></view>
<view class="subtitle">-/-</view>
</view>
<view class="capacity-block-text">产品当前设置共建者每日可以通过看广告获得共建值暂未开放敬请期待</view>
</view>
<view class="capacity-block">
<view class="capacity-block-title">
<view class="title">共力值产率<text>0GLF/h</text></view>
<view class="subtitle">-/-</view>
</view>
<view class="capacity-block-text">根据正常用户的使用在平台的使用习惯购物等行为产生对应共力值暂未开放敬请期待</view>
</view>
<view class="capacity-hint">
PS产品设置每100个共力值或共建值可以加速5%的角色产率
</view>
</view>
</template>
<script>
import { glz } from '@/apis/interfaces/life.js'
export default {
data() {
return {
identityText: '普通用户',
baseHour : 0,
base : 0,
group : {
count : 0,
effect : 0,
capacity: 0,
},
nickname : '',
recommend : {
vip : '-',
vip_count : '-',
novip : '-',
novip_count : '-',
vip_text : '-',
novip_text : '-',
},
partner : {
vip : '-',
vip_count : '-',
novip : '-',
novip_count : '-',
vip_text : '-',
novip_text : '-',
}
};
},
created() {
uni.showLoading({
title: '加载中...'
})
glz().then(res => {
this.nickname = res.nickname
this.identityText = res.identity_text
this.baseHour = res.base_hour
this.base = res.base
this.group = res.group
this.recommend = res.recommend
this.partner = res.partner
uni.setNavigationBarTitle({
title: res.glz + 'GLF'
})
uni.hideLoading()
}).catch(err => {
uni.showToast({
title: err.message,
icon : 'none'
})
})
},
methods: {
onInvitation(){
this.$Router.push({name: 'Invitation'})
}
}
}
</script>
<style lang="scss">
.capacity{
background: $window-color;
min-height: 100vh;
padding: $padding;
box-sizing: border-box;
&-hint{
font-size: 26rpx;
color: gray;
line-height: 40rpx;
padding: $padding 0;
}
&-title{
font-size: 38rpx;
font-weight: bold;
line-height: 60rpx;
text{
margin-left: 10rpx;
color: $main-color;
}
}
&-sbutitle{
font-size: 26rpx;
line-height: 40rpx;
}
&-block{
background: white;
margin-top: $margin;
border-radius: $radius;
padding: $padding;
&-glf{
color: $main-color;
font-size: 30rpx;
}
&-title{
font-weight: bold;
font-size: 34rpx;
padding-bottom: 30rpx;
line-height: 60rpx;
display: flex;
justify-content: space-between;
.title{
text{
color: $main-color;
font-weight: normal;
padding-left: 10rpx;
}
}
.more{
background: $main-color;
color: white;
font-weight: bold;
font-size: 28rpx;
border-radius: 25rpx;
line-height: 60rpx;
width: 230rpx;
text-align: center;
}
.subtitle{
font-weight: normal;
font-size: 24rpx;
color: $main-color;
}
.nickname{
color: gray;
font-size: 30rpx;
}
}
&-text{
font-size: 28rpx;
color: gray;
line-height: 40rpx;
}
&-table{
border:solid 1px $border-color;
margin-bottom: 20rpx;
&:last-child{
margin-top: 0;
}
.header{
background: $border-color;
line-height: 50rpx;
padding: 0 15rpx;
font-size: 26rpx;
color: gray;
}
.flex{
display: flex;
border-top: solid 1rpx $border-color;
color: gray;
.flex-item{
width: 50%;
box-sizing: border-box;
line-height: 50rpx;
padding: 0 15rpx;
font-size: 24rpx;
&:first-child{
border-right: solid 1rpx $border-color;
}
}
}
}
}
}
</style>

View File

@@ -3,11 +3,28 @@
<!-- 账户信息 -->
<view class="life-header">
<view class="life-header-flex">
<view class="life-header-item">0.00共力值</view>
<view class="life-header-item">{{glz}}<text>GLF</text></view>
</view>
</view>
<!-- 共力人生 -->
<view class="life-cover">
<view class="life-sign">
<view class="life-sign-icon number-float" @click="onSign">
<view class="life-sign-icon-text">{{isSign ? 'GLF': '签到'}}</view>
<image class="life-sign-icon-image" :src="require('@/static/icon/sign_btn.png')" alt="签到"></image>
</view>
<view class="life-sign-num">0</view>
<view class="life-sign-unit">GLF/h</view>
<view class="life-sign-time">
<u-count-down :time="nextSignAt" format="HH:mm:ss" @change="TimeDown">
<view class="time">
<text class="time__item">{{ timeData.hours > 9 ? timeData.hours: '0'+timeData.hours}}:</text>
<text class="time__item">{{ timeData.minutes > 9 ? timeData.minutes: '0'+timeData.minutes }}:</text>
<text class="time__item">{{ timeData.seconds > 9 ? timeData.seconds: '0'+timeData.seconds }}</text>
</view>
</u-count-down>
</view>
</view>
<image class="life-cover-back" :src="require('@/static/life/back.png')"></image>
<view class="life-role">
<image class="life-role-src" :src="figurePath" mode="widthFix"/>
@@ -55,7 +72,7 @@
<view class="other-subtitle">{{message > 0 ? message + '条未读消息': '暂无消息'}}</view>
<image class="other-back" src="../../static/life/icon_07.png"></image>
</view>
<view class="life-flex-item other">
<view class="life-flex-item other" @click="onNav({name: 'Invitation'}, '')">
<view class="other-title">
<image src="../../static/life/icon_03.png" mode="widthFix"></image>
邀请朋友
@@ -84,7 +101,10 @@
</template>
<script>
import { life } from '@/apis/interfaces/life.js'
import { life, sign } from '@/apis/interfaces/life.js'
var account;
export default {
data() {
return {
@@ -103,18 +123,72 @@
init: 0,
pay: 0,
delivered: 0
}
},
nextSignAt : 0,
glz : 0,
base_hour : 0,
base_seconds: 0,
timeData : {},
isSign : false,
};
},
created() {
onShow() {
this.getLife()
},
methods: {
// 倒计时
TimeDown(e){
this.timeData = e
},
// 共力人生
getLife(){
life().then(res => {
this.glz = res.account.glz
this.base_hour = res.account.base_hour
this.base_seconds = res.account.base_seconds
this.nextSignAt = res.next_sign_at * 1000
this.nickname = res.nickname
this.figurePath = res.figure_path
this.identity = res.identity
this.children = res.children
this.message = res.message
this.order = res.order
this.isSign = res.is_sign
if(res.is_sign){
this.outTime()
}
}).catch(err => {
uni.showToast({
title: err.message,
icon : 'none'
})
})
},
// 计时器
outTime(){
account = setInterval(() =>{
let newGlz = (Number(this.glz) + this.base_seconds)
this.glz = newGlz.toFixed(4)
}, 1000)
},
// 签到
onSign(){
console.log(this.isSign)
if(this.isSign){
this.$Router.push({name: 'Capacity'})
return
}
uni.showLoading({
title: '签到中..'
})
sign().then(res => {
uni.showToast({
title: '签到成功',
icon : 'none'
})
this.getLife()
}).catch(err => {
uni.showToast({
title: err.message,
@@ -122,7 +196,6 @@
})
})
},
methods: {
// 我的订单
onNav(name, type){
if(type){
@@ -138,10 +211,31 @@
icon : 'none'
})
}
},
onHide() {
clearInterval(account)
}
}
</script>
<style scoped>
/* 气泡漂浮 */
.number-float{
animation: 4s octfloat infinite;
}
@keyframes octfloat{
0%{
margin-top: 0;
}
50%{
margin-top: 15rpx;
}
100%{
margin-top: 0;
}
}
</style>
<style lang="scss" scoped>
.life{
min-height: 100vh;
@@ -347,7 +441,13 @@
border-radius: 35rpx;
padding: 0 20rpx;
margin-right: 20rpx;
font-size: 28rpx;
font-size: 42rpx;
font-weight: bold;
text{
font-weight: normal;
padding-left: 5rpx;
font-size: 70%;
}
}
}
}
@@ -357,6 +457,64 @@
width: 100%;
padding-top: 134%;
overflow: hidden;
.life-sign{
position: absolute;
top: 15vh;
right: $margin * 2;
z-index: 999;
text-align: center;
.life-sign-icon{
display: inline-block;
width: 98rpx;
height: 98rpx;
border-radius: 50%;
position: relative;
.life-sign-icon-image{
position: absolute;
top: 0;
left: 0;
width: 98rpx;
height: 98rpx;
}
.life-sign-icon-text{
position: absolute;
top: 0;
left: 0;
width: 98rpx;
height: 98rpx;
display: flex;
justify-content: space-around;
align-items: center;
z-index: 1;
font-size: 28rpx;
color: white;
}
}
.life-sign-num{
color: #f79824;
font-size: 36rpx;
line-height: 30rpx;
height: 30rpx;
text-shadow: 0 2rpx 2rpx rgba(0, 0, 0, .3);
}
.life-sign-unit{
font-weight: bold;
color: #f79824;
font-size: 30rpx;
line-height: 40rpx;
text-shadow: 0 2rpx 2rpx rgba(0, 0, 0, .3);
}
.life-sign-time{
.time{
@include flex;
align-items: center;
&__item {
color: #333;
font-size: 14px;
}
}
}
}
.life-cover-back{
position: absolute;
width: 100%;

View File

@@ -47,12 +47,12 @@
type: "paid",
},
{
name: "待收",
name: "待收",
type: "delivered",
},
{
name: "已完成",
type: "completed",
name: " 已签收",
type: "signed",
},
],
index: '0',
@@ -187,7 +187,7 @@
this.$Router.push({
name: 'OrderLogistics',
params: {
orderNo
orderNo: orderNo,
},
});
break;
@@ -259,7 +259,7 @@
})
break;
case 'shopsDetail':
this.$Router.push({ name: 'ShopDetail', params: {shopId: shopId}})
this.$Router.push({ name: 'ShopDetail', params: {ShopId: shopId}})
break;
case 'goodsDetail':
this.$Router.push({ name: 'StoreGoods', params: {id: goodsId}})
@@ -325,4 +325,5 @@
.pages-load {
padding-bottom: $padding;
}
</style>

View File

@@ -119,7 +119,7 @@
}
.afterSales {
background-color: #f9f9f9;
background-color: $window-color;
min-height: 100vh;
.service-content {

View File

@@ -7,7 +7,7 @@
<!-- 订单列表 -->
<view class="order--content" :class="[true ? 'chunk': 'broad']" v-for="(item, arrayIndex) in array"
:key="arrayIndex">
<view class="order--group--header" @click=" $Router.push({ name: 'ShopDetail', params: {shopId: item.shop.shop_id}})">
<view class="order--group--header" @click=" $Router.push({ name: 'ShopDetail', params: {ShopId: item.shop.shop_id}})">
<image class="logo" v-if="item.shop.cover != ''" :src="item.shop.cover" mode="aspectFill"></image>
<view class="store">
{{item.shop.name}}

View File

@@ -25,12 +25,12 @@
</view>
<!-- 店铺信息 -->
<view class="shopInfo" @click="toShop(2)" v-if="goods.shop">
<view class="shopInfo" @click="toShop(goods.shop.shop_id)" v-if="goods.shop">
<view class="shopInfo-title-left">
<image class="shop-logo" :src="goods.shop.cover" mode="aspectFill" />
<view class="shop-title">
<view class="shop-titl" >{{goods.shop.name}}</view>
<view> 商品质量:<span class='no'>5.0</span> <text style="padding-left: 20rpx;">服务态度:<span class='no'>5.0</span></text> </view>
<view> 店铺评分:<span class='no'>5.0</span> <text style="padding-left: 20rpx;">服务态度:<span class='no'>5.0</span></text> </view>
</view>
</view>
<view class="shopInfo-title-right" >全部商品 {{goods.shop.goods_count || 0}} <uni-icons type="right" color="grey"/></view>
@@ -45,7 +45,7 @@
</view>
<!-- 立即购买 -->
<view class="footer">
<view @click="toShop(2)" class=" shop"><uni-icons type="shop" size="26" color="grey"/>店铺</view>
<view @click="toShop(goods.shop.shop_id)" class=" shop"><uni-icons type="shop" size="26" color="grey"/>店铺</view>
<button type="default" hover-class="none" @click="buy">立即购买</button>
</view>
</view>
@@ -96,7 +96,7 @@
this.$Router.push({
name: 'ShopDetail',
params: {
shopId: id
ShopId: id
}
})
}

View File

@@ -15,6 +15,7 @@
</view>
</view>
</view>
<!-- 健康产品分类 -->
<u-scroll-list class="classify-box" indicatorColor="#ddd" indicatorActiveColor="#34CE98">
<view v-for="(item, index) in goodTabs" :key="index" class="classify-item" @click="$Router.push({name: 'StoreList', params: {id: item.category_id, title: item.name}})">
@@ -24,6 +25,7 @@
</view>
</view>
</u-scroll-list>
<!-- 每日上新 -->
<view class="new-box">
<view class="title">上新精选<text class="title-des"> | 精品上新新品推荐</text></view>
@@ -43,9 +45,9 @@
<view class="title">推荐店铺 <view class="more"><text class="title-des"> | 您身边的优质体验店</text> <text class="more-txt" @click="$Router.push({name: 'ShopList'})">更多></text></view></view>
<view class="card-box">
<block v-for="(item, index) in shops" :key="index">
<view class="card-box-item" style="{'backgrond': #FFF}" v-if="index<4" @click="$Router.push({name: 'ShopDetail', params: {id: item.shop_id}})">
<view class="card-box-item" style="{'backgrond': #FFF}" v-if="index < 4" @click="$Router.push({name: 'ShopDetail', params: {ShopId: item.shop_id}})">
<view class="card-title">{{item.name}}</view>
<view class="card-subtitle">距离1.5M</view>
<view class="card-subtitle"> </view>
<view class="card-btn">前往体验</view>
<image class="card-cover" :src="item.cover" mode="aspectFill" />
</view>
@@ -64,7 +66,6 @@
</block>
</view> -->
<!-- goods -->
<view class="goods-box">
<oct-goods
@@ -98,7 +99,6 @@
methods:{
getMall(){
mall().then(res => {
console.log(res);
this.banners = res.banners
this.goodsArr = res.goods
this.newGood = res.news
@@ -188,7 +188,8 @@
.card-subtitle{
font-size: 20rpx;
color: $text-gray;
line-height: 40rpx;
// line-height: 40rpx;
min-height: 20rpx;
@extend .nowrap;
}
.card-cover{

View File

@@ -9,18 +9,15 @@
</view>
<view class="shopInfo">
<view class="shopInfo-title-left">
<image class="shop-logo" src="/static/img/house_back.jpg" mode="aspectFill" />
<image class="shop-logo" :src="logo" mode="aspectFill" />
<view class="shop-title">
<view class="shop-titl">三只松鼠旗舰店</view>
<view> 商品质量:<span class='no'>5.0</span> <text style="padding-left: 20rpx;">服务态度:<span
class='no'>5.0</span></text> </view>
<view class="shop-titl">{{name}}</view>
<view>店铺评分:<span class='no'>5.0</span> 服务态度 :<span class='no'>5.0</span></view>
</view>
</view>
<view class="shopInfo-title-right"> +关注 </view>
<!-- <view class="shopInfo-title-right"> +关注 </view> -->
</view>
</view>
<view class="content">
<view class="left">
<scroll-view scroll-y="true" class="scroll-view-left">
@@ -32,7 +29,9 @@
</view>
<view class="right">
<scroll-view scroll-y="true" class="scroll-view-right">
<view class="goods-item" v-for="(item,index) in goods" :key="index" @click="onGoods(item.goods_id)">
<block v-if="goods.length > 0">
<view class="goods-item" v-for="(item,index) in goods" :key="index"
@click="onGoods(item.goods_id)">
<image :src="item.cover" mode="aspectFill" class="good-img" />
<view class="item--content">
<view class="title">{{item.name}}</view>
@@ -45,6 +44,13 @@
</view>
</view>
</view>
</block>
<block v-else>
<view class="vertical pages-empty">
<u-empty icon="http://cdn.uviewui.com/uview/empty/list.png" textColor="#999" text="暂无相关商品">
</u-empty>
</view>
</block>
</scroll-view>
</view>
</view>
@@ -52,266 +58,62 @@
</template>
<script>
import {
shopsDetail,
shopsGoods
} from "@/apis/interfaces/store"
export default {
data() {
return {
category_id: 1,
classify: [{
category_id: 1,
name: "全部商品",
cover: ""
}, {
category_id: 2,
name: "面部护理",
cover: ""
}, {
category_id: 3,
name: "香水彩妆",
cover: ""
}, {
category_id: 4,
name: "男装男鞋",
cover: ""
}, {
category_id: 5,
name: "儿童用品",
cover: ""
}],
goods: [{
"goods_id": 70,
"shop": {
"shop_id": 1,
"name": "平台自营店铺",
"cover": "",
"is_self": true
},
"is_self": true,
"name": "一口爆浆冰皮榴莲泡泡",
"description": "专注冰皮,苏丹王榴莲",
"cover": "http://storage.zh.shangkelian.cn/images/2022/01/11/ccd654bda2e3c95e190e941209e50c62.png",
"tags": [],
"original_price": 111,
"price": {
"show": "100",
"score": 1,
"price_min": 100,
"price_max": 100
},
"clicks": 0,
"sales": 3253
}, {
"goods_id": 56,
"shop": {
"shop_id": 1,
"name": "平台自营店铺",
"cover": "",
"is_self": true
},
"is_self": true,
"name": "铜锣烧蛋糕",
"description": "口感丰富,悠闲小食",
"cover": "http://storage.zh.shangkelian.cn/images/2022/01/11/37ecc570f9d7ad929a693d24118a0311.png",
"tags": [],
"original_price": 155,
"price": {
"show": "100",
"score": 1,
"price_min": 100,
"price_max": 100
},
"clicks": 0,
"sales": 7394
}, {
"goods_id": 54,
"shop": {
"shop_id": 1,
"name": "平台自营店铺",
"cover": "",
"is_self": true
},
"is_self": true,
"name": "雪麸蛋糕 香蕉牛奶风味",
"description": "北海道牛奶风味",
"cover": "http://storage.zh.shangkelian.cn/images/2022/01/11/9093c59ea5d513008926ac4233c20992.png",
"tags": [],
"original_price": 222,
"price": {
"show": "111",
"score": 1,
"price_min": 111,
"price_max": 111
},
"clicks": 1,
"sales": 202
}, {
"goods_id": 37,
"shop": {
"shop_id": 1,
"name": "平台自营店铺",
"cover": "",
"is_self": true
},
"is_self": true,
"name": "澳大利亚深海鱼油胶囊",
"description": "无腥味工艺,呵护全家健康",
"cover": "http://storage.zh.shangkelian.cn/images/2022/01/07/af4e0bab7e621d2bd6f1cb7052f1eb71.png",
"tags": [],
"original_price": 188,
"price": {
"show": "100",
"score": 1,
"price_min": 100,
"price_max": 100
},
"clicks": 2,
"sales": 5538
}, {
"goods_id": 28,
"shop": {
"shop_id": 1,
"name": "平台自营店铺",
"cover": "",
"is_self": true
},
"is_self": true,
"name": "冰淇淋威化饼干",
"description": "浓香醇厚,微甜不腻",
"cover": "http://storage.zh.shangkelian.cn/images/2022/01/06/f01d2ec7e73dff9371b71892957d85f0.png",
"tags": [],
"original_price": 155,
"price": {
"show": "111",
"score": 1,
"price_min": 111,
"price_max": 111
},
"clicks": 0,
"sales": 2707
}, {
"goods_id": 33,
"shop": {
"shop_id": 1,
"name": "平台自营店铺",
"cover": "",
"is_self": true
},
"is_self": true,
"name": "麦饭石天然矿泉水",
"description": "优选产地,多种矿物质",
"cover": "http://storage.zh.shangkelian.cn/images/2022/01/06/770afc8c293ff493c35d9a98dc3dbe97.png",
"tags": [],
"original_price": 122,
"price": {
"show": "100",
"score": 1,
"price_min": 100,
"price_max": 100
},
"clicks": 2,
"sales": 5257
}, {
"goods_id": 24,
"shop": {
"shop_id": 1,
"name": "平台自营店铺",
"cover": "",
"is_self": true
},
"is_self": true,
"name": "小米锅巴",
"description": "8%小米含量,松脆营养",
"cover": "http://storage.zh.shangkelian.cn/images/2022/01/06/5c6bbb8f1f50953c3d25b7a5c22a9865.png",
"tags": [],
"original_price": 155,
"price": {
"show": "111",
"score": 1,
"price_min": 111,
"price_max": 111
},
"clicks": 0,
"sales": 2653
}, {
"goods_id": 97,
"shop": {
"shop_id": 1,
"name": "平台自营店铺",
"cover": "",
"is_self": true
},
"is_self": true,
"name": "甜味浓郁低糖水果千禧玲珑小番茄",
"description": "甜味浓郁低糖水果千禧玲珑小番茄",
"cover": "http://storage.zh.shangkelian.cn/images/2022/01/11/8c44833a6d9477a9c01f8b4e06b2f748.png",
"tags": [],
"original_price": 0,
"price": {
"show": "89",
"score": 10,
"price_min": 89,
"price_max": 89
},
"clicks": 0,
"sales": 1347
}, {
"goods_id": 12,
"shop": {
"shop_id": 1,
"name": "平台自营店铺",
"cover": "",
"is_self": true
},
"is_self": true,
"name": "秘制手撕牛肉",
"description": "肉质紧致弹牙,细嚼口齿留香",
"cover": "http://storage.zh.shangkelian.cn/images/2022/01/06/bbd96a7724cb053e501b4ce2c34b5a0f.png",
"tags": [],
"original_price": 255,
"price": {
"show": "111",
"score": 1,
"price_min": 111,
"price_max": 111
},
"clicks": 0,
"sales": 1352
}, {
"goods_id": 58,
"shop": {
"shop_id": 1,
"name": "平台自营店铺",
"cover": "",
"is_self": true
},
"is_self": true,
"name": "挚爱巧克力",
"description": "黄金可可,瑞士工艺传承",
"cover": "http://storage.zh.shangkelian.cn/images/2022/01/11/ad5953e7f7ae60ca2f13f1313d67bb62.png",
"tags": [],
"original_price": 200,
"price": {
"show": "100",
"score": 1,
"price_min": 100,
"price_max": 100
},
"clicks": 0,
"sales": 5420
}],
name : '',
logo : '',
category_id : '',
classify : [],
goods : [],
pages : {}
}
},
onLoad(e) {
this.shopId = this.$Route.query.id;
this.ShopId = this.$Route.query.ShopId
shopsDetail(this.ShopId).then(res => {
this.classify = [{
category_id: '',
name: '全部商品',
}, ...res.categories]
this.name = res.name
this.logo = res.cover
this.getGoods()
}).catch(err => {
uni.showToast({
title: err.message,
icon: 'none'
})
})
},
methods: {
getGoods() {
uni.showLoading({
title: '加载中...'
})
shopsGoods(this.ShopId, this.category_id).then(res => {
this.goods = res.data
this.pages = res.page
uni.hideLoading()
}).catch(err => {
uni.showToast({
title: err.message,
icon: 'none'
})
})
},
selectClassify(id) {
if (id === this.category_id) return;
this.category_id = id;
this.getGoods()
},
search() {
console.log('search')
this.$Router.push({
'name': 'StoreSearch'
name: 'StoreSearch'
});
},
onGoods(id) {
@@ -327,6 +129,10 @@
</script>
<style lang="scss">
.pages-empty {
height: 70vh;
}
.shopDetail {
width: 100%;
height: 100vh;
@@ -414,6 +220,7 @@
.no {
color: $text-price;
padding-left: 4rpx;
padding-right: 10rpx;
}
.shop-titl {

View File

@@ -1,26 +1,32 @@
<template>
<view class="content">
<!-- banner -->
<view class="banner">
<image class="banner-cover"
src="http://storage.zh.shangkelian.cn/images/2022/01/11/7278de59f0817da7fbcaf6657dba7475.jpg"
mode="aspectFill" />
</view>
<!-- 分类 -->
<u-sticky bgColor="#fff" zIndex="99">
<u-tabs :list="classify" lineColor="#34CE98" @click="onTabs" />
</u-sticky>
<!-- 店铺列表 -->
<block v-for="(item,index) in 10" :key="index">
<view class="shopInfo" @click="toShop(2)">
<block v-if="shopsArr.length > 0">
<view class="shop-List">
<view class="shopInfo" v-for="(item,index) in shopsArr" :key="index" @click="toShop(item.shop_id)">
<view class="shopInfo-title-left">
<image class="shop-logo" src="/static/img/house_back.jpg" mode="aspectFill" />
<image class="shop-logo" :src="item.cover" mode="aspectFill" />
<view class="shop-title">
<view class="shop-titl">三只松鼠旗舰店</view>
<view> 商品质量:<span>5.0</span> <text style="padding-left: 20rpx;">服务态度:<span>5.0</span></text> </view>
<view class="shop-titl nowrap">{{item.name}}</view>
<view>店铺评分:<span>5.0</span></view>
</view>
</view>
<view class="shopInfo-title-right" >全部商品 723 <uni-icons type="right" color="grey" /></view>
<view class="shopInfo-title-right" >在售{{item.goods_count}}<uni-icons class="icons" type="right" size="14" color="grey" /></view>
</view>
</view>
</block>
<block v-else>
<view class="vertical pages-empty">
<u-empty
icon="http://cdn.uviewui.com/uview/empty/list.png"
textColor="#999"
text="暂无相关店铺"
>
</u-empty>
</view>
</block>
</view>
@@ -28,52 +34,25 @@
<script>
import {
meals
shops
} from "@/apis/interfaces/store"
export default {
data() {
return {
banner: "",
goodsArr: [],
// classify: [],
classify: [{
category_id: 1,
name: " 全部",
cover: ""
}, {
category_id: 2,
name: " 母婴",
cover: ""
}, {
category_id: 3,
name: "服饰",
cover: ""
}, {
category_id: 4,
name: "男装",
cover: ""
}, {
category_id: 5,
name: "男鞋",
cover: ""
}, {
category_id: 6,
name: "女装",
cover: ""
}]
shopsArr : [],
classify : [],
shopsPage: {},
};
},
mounted() {
// this.getMeals()
this.getShops()
},
methods: {
getMeals() {
meals(this.$Route.query.id, this.categoryId).then(res => {
uni.setNavigationBarTitle({
title: res.meal.subtitle
})
this.banner = res.meal.banner
this.goodsArr = res.goods
getShops() {
shops(this.categoryId).then(res => {
console.log(res)
this.shopsArr = res.shops.data
this.shopsPage= res.shops.page
this.classify = [{
name: "全部",
category_id: ""
@@ -83,10 +62,9 @@
},
onTabs(e) {
this.categoryId = e.category_id
this.getMeals()
this.getShops()
},
toShop(id) {
console.log('toShop/////.........');
this.$Router.push({
name: 'ShopDetail',
params: {
@@ -96,68 +74,59 @@
}
},
onPullDownRefresh() {
this.getMeals()
this.getShops()
},
}
</script>
<style lang="scss" scoped>
.pages-empty{
height: 70vh;
}
.content {
background: $window-color;
min-height: 100vh;
}
// banner
.banner {
position: relative;
width: 100%;
background-color: white;
padding-top: 40%;
&-text,
&-cover {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
}
}
// 筛选
.classify-tabs {
background: white;
}
.shop-List{
padding: $padding;
.shopInfo {
border-top: solid 1 #f9f9f9;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
width: 100%;
padding: $padding $padding - 10;
border-bottom: solid 10rpx #f9f9f9;
padding: $padding - 10;
background-color: #fff;
border-radius: $radius;
margin-top: 20rpx;
&:first-child{
margin-top: 0;
}
.shopInfo-title-left {
width: 500rpx;
width: 60%;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
position: relative;
padding-left: 90rpx;
min-height: 90rpx;
box-sizing: border-box;
.shop-logo {
width: 100rpx;
height: 100rpx;
position: absolute;
left: 0;
top: 0;
width: 90rpx;
height: 90rpx;
border-radius: 10rpx;
border: solid 1rpx #f9f9f9;
}
.shop-title {
display: flex;
flex-direction: column;
@@ -167,15 +136,13 @@
font-size: 26rpx;
margin-left: $margin;
color: #999;
width: 370rpx;
width: 100%;
span {
color: $text-price;
padding-left: 4rpx;
}
.shop-titl {
font-size: 34rpx;
font-size: 32rpx;
color: #333;
font-weight: bold;
margin-bottom: 6rpx;
@@ -186,16 +153,16 @@
}
}
}
.shopInfo-title-right {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
box-sizing: border-box;
font-size: 28rpx;
color: #222;
width: 40%;
text-align: right;
font-size: 26rpx;
color: gray;
.icons{
vertical-align: bottom;
margin-top: 2rpx;
}
}
}
}
</style>

View File

@@ -1,23 +1,251 @@
<template>
<view>
共力团队
<view>共力家族</view>
<view>共力伙伴</view>
<view>供应商</view>
<view class="team">
<!-- 统计信息 -->
<view class="team-hader">
<view class="team-hader-item">
<image class="team-hader-cover" src="@/static/vip/lv_03.png" mode="widthFix"></image>
<view class="team-hader-title">共力家族</view>
<view class="team-hader-number"><text>{{count.one}}</text></view>
</view>
<view class="team-hader-item">
<image class="team-hader-cover" src="@/static/vip/lv_04.png" mode="widthFix"></image>
<view class="team-hader-title">共力伙伴</view>
<view class="team-hader-number"><text>{{count.two}}</text></view>
</view>
<view class="team-hader-item">
<image class="team-hader-cover" src="@/static/vip/lv_06.png" mode="widthFix"></image>
<view class="team-hader-title">供应商</view>
<view class="team-hader-number"><text>{{count.supplier}}</text></view>
</view>
</view>
<!-- 邀请好友 -->
<view class="team-invite" @click="onInvitation">
<image src="@/static/img/team_00.png" mode="widthFix"></image>
</view>
<!-- 团队 -->
<view class="team-tabs">
<u-tabs
:list="teamTabs"
:scrollable="false"
lineColor="#34CE98"
@click="onTeamTab"
></u-tabs>
<view class="team-lists">
<view class="team-list-header">
<view class="team-list-header-item">用户</view>
<view class="team-list-header-item">手机号码</view>
<view class="team-list-header-item">{{tabsType === 'supplier' ? '业绩': '注册时间'}}</view>
</view>
<block v-if="users.length > 0">
<view class="team-list-flex" v-for="(item, index) in 10" :key="index">
<view class="team-list-flex-item user">
<image class="user-cover" src="" mode="aspectFill"></image>
<view class="user-nickname">唐明明</view>
</view>
<view class="team-list-flex-item number">182****0131</view>
<view class="team-list-flex-item number">2022/06/09</view>
</view>
</block>
<block v-else>
<view class="vertical pages-empty">
<u-empty
icon="http://cdn.uviewui.com/uview/empty/list.png"
textColor="#999"
text="暂无成员"
>
</u-empty>
</view>
</block>
</view>
</view>
</view>
</template>
<script>
import { relations } from '@/apis/interfaces/team.js'
export default {
data() {
return {
teamTabs: [
{ name: '共力家族', type: 'one'},
{ name: '共力伙伴', type: 'two'},
{ name: '供应商', type: 'supplier'},
],
tabsType: 'one',
count: {
all: 0,
one: 0,
two: 0,
supplier: 0
},
users: [],
page : {}
};
},
created() {
},
methods: {
// 共力团队
onTeamTab(e){
if(this.tabsType === e.type) return
this.tabsType = e.type
this.getRelations()
},
// 团队信息
getRelations(){
uni.showLoading({
title: '加载中...'
})
relations({
larer: this.tabsType
}).then(res => {
this.count = res.count
this.users = res.users.data
this.pages = res.users.page
uni.hideLoading()
}).catch(err => {
uni.showToast({
title: err.message
})
})
},
onInvitation(){
this.$Router.push({name: 'Invitation'})
}
}
}
</script>
<style lang="scss">
.team{
background: $window-color;
min-height: 100vh;
padding-bottom: $padding*2;
box-sizing: border-box;
}
// 用户数据
.pages-empty{
height: 45vh;
}
// 团队统计
.team-hader{
position: relative;
padding: 20rpx;
display: flex;
justify-content: space-between;
&-item{
position: relative;
display: flex;
flex-direction: column;
justify-content: space-between;
width: calc(33.33% - 20rpx);
background-color: white;
margin: 0 10rpx;
border-radius: $radius*2 $radius $radius*2 $radius;
height: 150rpx;
padding: 20rpx;
box-sizing: border-box;
color: white;
overflow: hidden;
&:nth-child(1){
background-image: linear-gradient(to bottom right, #f6d5c2, #edc0a1);
}
&:nth-child(2){
background-image: linear-gradient(to bottom right, #d5ddee, #b5c1d9);
}
&:nth-child(3){
background-image: linear-gradient(to bottom right, #f5cb8e, #efba6d);
}
}
&-title{
position: relative;
z-index: 1;
font-size: 26rpx;
@extend .nowrap;
}
&-number{
position: relative;
z-index: 1;
@extend .nowrap;
text{
font-size: 40rpx;
font-weight: bold;
padding-right: 6rpx;
}
font-size: 26rpx;
}
&-cover{
position: absolute;
width: 240rpx;
height: 240rpx;
right: -100rpx;
top: -30rpx;
opacity: .7;
}
}
// 邀请团队
.team-invite{
padding: 0 $padding;
image{
width: 100%;
}
}
// 团队列表
.team-tabs{
margin: 0 $margin $margin $margin;
padding-bottom: $padding;
.team-lists{
margin-top: $margin/2;
border-radius: $radius;
background: white;
padding: 20rpx $padding;
.team-list-header{
display: flex;
justify-content: space-between;
text-align: center;
border-bottom: solid 1px $border-color;
line-height: 70rpx;
padding-bottom: 15rpx;
text-align: center;
font-size: 28rpx;
color: $text-gray;
margin-bottom: 10rpx;
.team-list-header-item{
width: 33.33%;
}
}
.team-list-flex{
display: flex;
font-size: 28rpx;
padding: 10rpx 0;
&-item{
width: 33.33%;
height: 60rpx;
line-height: 60rpx;
color: #333;
&.user{
padding-left: 70rpx;
box-sizing: border-box;
position: relative;
.user-cover{
position: absolute;
left: 0;
top: 5rpx;
width: 50rpx;
height: 50rpx;
border-radius: 50%;
background: $window-color;
}
.user-nickname{
@extend .nowrap;
}
}
&.number{
text-align: center;
}
}
}
}
}
</style>

View File

@@ -4,33 +4,19 @@
<view class="info-box">
<image src="@/static/user/user_back.png" mode="aspectFill" />
<view class="user-flex">
<image class="cover" @click="goSetting" :src="userInfo.avatar || require('@/static/user/cover.png')"
<image class="cover" @click="onBtn('Setting', {})" :src="userInfo.avatar || require('@/static/user/cover.png')"
mode="aspectFill" />
<view class="user-content">
<block v-if="$store.state.token != ''">
<view class="name">{{ userInfo.nickname }}</view>
<view class="tabs" v-if="userInfo.identity.length !== 0">
<view class="tabs">
<view class="tabs-item">
<image src="@/static/user/icon_07.png" />
VIP会员
<image :src="identity.cover_url" mode="heightFix" />{{identity.identity_text}}
</view>
</view>
<view class="tabs" v-else>
<view class="tabs-item">
<image src="@/static/user/icon_07.png" />
普通用户
<view class="chainAddress" v-if="userInfo.addr">
<text @click="copy(userInfo.addr)">区块地址:{{userInfo.addr.substring(0,5) + '****' + userInfo.addr.substring(userInfo.addr.length - 5)}}</text>
</view>
</view>
<view class="chainAddress" v-if="userInfo.chain_address">
<!-- <u-icon labelPos="left" @click="copy(userInfo.chain_address)" labelSize="14"
labelColor="#fff" :label="userInfo.chain_address.substr(0, 20)+'...'" space="10"
:name="require('@/static/imgs/copy.png')" size="16" /> -->
</view>
</block>
<block v-else>
<view class="name">未登录</view>
</block>
</view>
</view>
</view>
@@ -38,25 +24,24 @@
<view class="vip-card">
<view class="title">
<image src="@/static/user/icon_06.png" mode="widthFix" />
会员
共力会员
</view>
<view class="subtitle">
<u-notice-bar :text="cardText" icon="" bgColor="" duration="3000" color="#fcc692" direction="column">
</u-notice-bar>
</view>
<!-- v-if="userInfo.identity.length === 0" -->
<view class="btn" @click="openVip">开通</view>
<view class="btn" @click="onBtn('Vip', {})">{{userInfo.isOpenVip ? '开通': '续费'}}</view>
</view>
<!-- 健康数据 -->
<view class="health-flex">
<view class="health-flex-item" @click="onBtn('AccountIntegral', {})">
<view class="title">共力值</view>
<view class="num">0.00</view>
<view class="num">{{account.glz}}</view>
</view>
<view class="health-flex-item" @click="onBtn('AccountDt', {})">
<view class="title">DT积分</view>
<view class="num">0.00</view>
<view class="num">{{account.dt}}</view>
</view>
</view>
<!-- 订单 -->
@@ -84,7 +69,7 @@
</view>
<!-- 功能块 -->
<view class="btns-box">
<view class="btns-box-item">
<view class="btns-box-item" @click="onMnemonic">
<image class="icon" src="@/static/user/userIcon_02.png" mode="widthFix" />
导出助记词
<uni-icons class="forward" type="forward" color="#999" />
@@ -94,19 +79,12 @@
地址管理
<uni-icons class="forward" type="forward" color="#999" />
</view>
<view class="btns-box-item">
<view class="btns-box-item" @click="onBtn('Invitation', {})">
<image class="icon" src="@/static/user/userIcon_03.png" mode="widthFix" />
分享邀请
<uni-icons class="forward" type="forward" color="#999" />
</view>
</view>
<view class="btns-box">
<view class="btns-box-item">
<image class="icon" src="@/static/user/userIcon_03.png" mode="widthFix" />
供应商申请
<uni-icons class="forward" type="forward" color="#999" />
</view>
</view>
<view class="btns-box">
<view class="btns-box-item">
<image class="icon" src="@/static/user/userIcon_03.png" mode="widthFix" />
@@ -128,24 +106,47 @@
<view>共力生态</view>
<view>The total force ecological</view>
</view>
<!-- 助记词弹出框 -->
<u-modal :show="wordsShow" :zoom="false" confirmText="复制" @confirm="copyWord" confirmColor="#34CE98">
<slot default>
<view class="wordsCont">
<view class="wordsCont-title">导出助记词</view>
<view class="wordsCont-tips">请务必抄下助记词并存在安全的地方若助记词丢失重装或换设备登录时将无法查看历史消息若助记词被他人获取将可能获取你的信息</view>
<view class="wordsCont-text">{{mnemonic}}</view>
<image class="wordsCont-close" @click="wordsShow = false" src="@/static/icon/userCloes.png" mode="widthFix"></image>
</view>
</slot>
</u-modal>
</view>
</template>
<script>
import {
info
info,
chainSeed
} from '@/apis/interfaces/user';
import userAuth from '@/public/userAuth';
export default {
data() {
return {
cardText: ['开通会员加速共力值增长', '前10000名用户专享阶段折扣价格'],
cardText: [],
userInfo: {
nickname: '',
avatar: '',
identity: []
}
nickname : '',
addr : '',
avatar : '',
isOpenVip : '',
},
identity : {
button_cover_url: '',
cover_url : '',
identity_text : ''
},
account : {
glz : 0.00,
dt : 0.00
},
mnemonic : '',
wordsShow: false
};
},
onShow() {
@@ -155,12 +156,19 @@
// 用户信息
getInfo() {
if (this.$store.state.token === '') return;
info()
.then(res => {
info().then(res => {
uni.setNavigationBarTitle({
title: res.nickname
});
this.userInfo = res;
this.cardText = res.identity_array
this.userInfo = {
nickname : res.nickname,
addr : res.addr,
avatar : res.avatar,
isOpenVip : res.is_open_vip,
}
this.identity = res.identity
this.account = res.account
})
.catch(err => {
uni.showToast({
@@ -169,9 +177,17 @@
});
});
},
// 开通会员
openVip() {
this.$Router.push({name: 'Vip'})
// 导出助记词
onMnemonic(){
chainSeed().then(res => {
this.mnemonic = res.seed
this.wordsShow = true
}).catch(err => {
uni.showToast({
title: err.message,
icon : 'none'
})
})
},
// 按钮导航
onBtn(name, params) {
@@ -180,17 +196,17 @@
params
});
},
goSetting() {
this.$Router.push({
name: 'Setting'
})
},
// 退出登录
logOut() {
uni.removeStorage({
key: 'isnew',
success: () =>{
this.$store.commit('setToken', '');
this.$store.commit('setIsNew', '');
this.$Router.replaceAll({name: 'Auth'})
}
})
},
// 复制
copy(data) {
uni.setClipboardData({
data: data,
@@ -203,7 +219,21 @@
})
}
});
},
// 复制助记词
copyWord() {
uni.setClipboardData({
data: this.mnemonic,
success: () => {
this.wordsShow = false
uni.showToast({
title: '助记词已复制',
icon: 'none',
mask: true
})
}
});
},
}
};
</script>
@@ -281,10 +311,8 @@
font-size: $title-size + 8;
@extend .nowrap;
}
.tabs {
padding-top: 10rpx;
&-item {
background: rgba($color: #000000, $alpha: 0.3);
font-size: $title-size-sm - 4;
@@ -294,8 +322,8 @@
border-radius: 20rpx;
image {
width: 26rpx;
height: 26rpx;
width: 38rpx;
height: 38rpx;
vertical-align: middle;
margin-bottom: 2rpx;
margin-right: 8rpx;
@@ -457,4 +485,37 @@
}
}
}
/* 助记词弹框 */
.wordsCont {
width: 100%;
position: relative;
text-align: center;
}
.wordsCont-title {
width: 100%;
font-weight: 600;
font-size: 44rpx;
}
.wordsCont-tips {
padding: 30rpx 0;
box-sizing: border-box;
color: #de5660;
line-height: 48rpx;
font-size: 30rpx;
}
.wordsCont-text {
font-weight: 500;
margin-top: 10rpx;
}
.wordsCont-close {
position: absolute;
top: 0;
right: 0;
width: 44rpx;
height: 44rpx;
}
</style>

View File

@@ -4,7 +4,7 @@
<view class="vip-user">
<image class="user-cover" :src="user.avatar" mode="aspectFill"></image>
<view class="user-nickname">{{user.nickname}}</view>
<view class="user-date">到期日期{{identity.ended_at}}</view>
<view class="user-date">到期日期{{endedAt}}</view>
<view class="vip-renewal" v-if="!isOpen">续费</view>
</view>
<view class="user-cards">
@@ -54,7 +54,7 @@
</template>
<script>
import { vip, vipPay, submitOrder } from '@/apis/interfaces/vip.js'
import { vip, vipPay, payInfo } from '@/apis/interfaces/vip.js'
export default {
data() {
return {
@@ -68,8 +68,9 @@
identity: {
identity_text: '',
cover_url: '',
ended_at: ''
},
// 到期时间
endedAt: '',
// 下级身份
nextIdentity:{
identity_text: ''
@@ -85,49 +86,81 @@
};
},
onShow() {
this.getVipInfo()
},
methods: {
// 获取会员信息
getVipInfo(){
vip().then(res =>{
console.log(res)
this.isOpen = res.is_open
this.prices = res.prices
this.rights = res.rights
this.secondRule = res.second_rule
this.nextIdentity = res.next_identity
this.identity = res.identity
this.endedAt = res.identity_ended_at
this.user = res.user
}).catch(err => {
console.log(err)
})
},
methods: {
onOpenVip(){
// 获取订单
vipPay().then(orderNo => {
// 支付参数
submitOrder({
orderNo
}).then(orderInfo => {
uni.requestPayment({
provider : "wxpay",
orderInfo,
success: res => {
console.log(res)
},
fail: err=> {
console.log(err)
}
})
}).catch(err =>{
uni.showToast({
title: err.message,
icon : 'none'
})
})
},
// 提交订单
onOpenVip(){
// 获取订单
uni.showLoading({
title: '提交订单'
})
vipPay().then(res => {
// 支付参数
if(res.id) {
uni.showLoading({
title: '获取支付信息'
})
this.wxPay(res.id)
}
}).catch(err => {
uni.showToast({
title: err.message,
icon : 'none'
})
})
},
// 微信支付
wxPay(orderId){
payInfo(orderId).then(orderInfo => {
uni.requestPayment({
provider : "wxpay",
orderInfo: JSON.parse(orderInfo),
success: res => {
uni.showModal({
title: '提示',
content: '开通成功',
showCancel: false,
success: ()=> {
this.getVipInfo()
}
})
},
fail(err) {
let showToast = err.message
if(err.errMsg === 'requestPayment:fail [payment微信:-2]User canceled'){
showToast = '支付被取消'
}
uni.showToast({
title: showToast,
icon : 'none'
})
}
})
}).catch(err =>{
uni.showToast({
title: err.message,
icon : 'none'
})
})
}
}
}

View File

@@ -4,25 +4,15 @@ import {
} from 'uni-simple-router';
import store from '@/store/index'
// CALL 页面必须是nvue但是NVUE 不支持webpack的 ROUTES 注入
// https://github.com/SilurianYang/uni-read-pages/issues/20
// #ifdef APP-NVUE
const ROUTES = [{
"path": "/pages/im/private/call"
}];
// #endif
const router = createRouter({
platform: process.env.VUE_APP_PLATFORM,
routes: [...ROUTES]
});
// console.log(...ROUTES)
//全局路由前置守卫
router.beforeEach((to, from, next) => {
if(to.name === 'Auth' && store.getters.getToken != '' && uni.getStorageSync('token') != ''){
if(store.getters.getIsNew === 0 || uni.getStorageSync('isnew') === 0){
if(uni.getStorageSync('isnew') === 0){
next({
name: 'AuthRole',
NAVTYPE: 'replace'

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

BIN
static/icon/sign_btn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
static/icon/userCloes.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
static/img/code_back.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

BIN
static/img/team_00.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

BIN
static/vip/lv_03.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

After

Width:  |  Height:  |  Size: 195 KiB

BIN
static/vip/lv_06.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

View File

@@ -12,8 +12,7 @@ Vue.use(Vuex)
export default new Vuex.Store({
state: {
token: uni.getStorageSync('token') || '',
address: {},
isnew: uni.getStorageSync('isNew') || 0
address: {}
},
getters: {
getToken: state => {
@@ -21,9 +20,6 @@ export default new Vuex.Store({
},
getAddress: state => {
return state.address
},
getIsNew: state => {
return state.isnew
}
},
mutations: {
@@ -33,10 +29,6 @@ export default new Vuex.Store({
},
setAddress(state, value) {
state.address = value
},
setIsNew(state, isNew) {
state.isnew = isNew
uni.setStorageSync('isnew', isNew)
}
}
})

View File

@@ -1,12 +0,0 @@
## 5.1.152022-01-10
* 更新 SDK
## 1.0.42022-01-06
* 修复初始化问题
## 1.0.32022-01-06
* 更新插件内容
## 1.0.22022-01-06
* 添加枚举值
## 1.0.12022-01-05
* 更新目录结构
## 1.0.02022-01-05
* 支持 Calllib JS 层

View File

@@ -1,377 +0,0 @@
/*
* RCCallUni - v5.1.14-release.1
* CommitId - a184e82065a309fc565be987321c44e9da02abbb
* Thu Jan 06 2022 16:03:36 GMT+0800 (中国标准时间)
* ©2020 RongCloud, Inc. All rights reserved.
*/
declare enum RCCallIWCamera {
NONE = -1,
FRONT = 0,
BACK = 1
}
/**
* 通话媒体类型
*/
declare enum RCCallIWMediaType {
/**
* 音频通话
*/
AUDIO = 0,
/**
* 视频通话
*/
AUDIO_VIDEO = 1
}
declare enum RCUNICallErrorCode {
SUCCESS = 0,
ENGINE_NOT_FOUND = 1,
NETWORK_UNAVAILABLE = 2,
ONE_CALL_EXISTED = 3,
OPERATION_UNAVAILABLE = 4,
INVALID_PARAM = 5,
NETWORK_UNSTABLE = 6,
MEDIA_REQUEST_FAILED = 7,
MEDIA_SERVER_NOT_READY = 8,
MEDIA_SERVER_NOT_INITIALIZED = 9,
MEDIA_REQUEST_TIMEOUT = 10,
MEDIA_UNKOWN_ERROR = 11,
MEDIA_KICKED_BY_SERVER_ERROR = 12,
MEDIA_SERVER_CLOSED_ERROR = 13,
MEDIA_SERVER_PUBLISH_ERROR = 14,
MEDIA_SERVER_SUBSCRIBE_ERROR = 15,
MEDIA_JOIN_ROOM_REFUSE_ERROR = 16
}
declare enum RCCallIWCallDisconnectedReason {
CANCEL = 0,
REJECT = 1,
HANGUP = 2,
BUSY_LINE = 3,
NO_RESPONSE = 4,
ENGINE_UNSUPPORTED = 5,
NETWORK_ERROR = 6,
RESOURCE_GET_ERROR = 7,
RESOURCE_PUBLISH_ERROR = 8,
RESOURCE_SUBSCRIBE_ERROR = 9,
REMOTE_CANCEL = 10,
REMOTE_REJECT = 11,
REMOTE_HANGUP = 12,
REMOTE_BUSY_LINE = 13,
REMOTE_NO_RESPONSE = 14,
REMOTE_ENGINE_UNSUPPORTED = 15,
REMOTE_NETWORK_ERROR = 16,
REMOTE_RESOURCE_GET_ERROR = 17,
REMOTE_RESOURCE_PUBLISH_ERROR = 18,
REMOTE_RESOURCE_SUBSCRIBE_ERROR = 19,
KICKED_BY_OTHER_CALL = 20,
IN_OTHER_CALL = 21,
KICKED_BY_SERVER = 22,
REMOTE_KICKED_BY_OTHER_CALL = 23,
REMOTE_IN_OTHER_CALL = 24,
REMOTE_KICKED_BY_SERVER = 25,
ACCEPT_BY_OTHER_CLIENT = 26,
HANGUP_BY_OTHER_CLIENT = 27,
REJECTED_BY_BLACKLIST = 28,
SERVICE_NOT_OPENED = 29,
DROP_TO_OBSERVER = 30,
INIT_VIDEO_ERROR = 31,
OTHER_DEVICE_HAD_ACCEPTED = 32,
SERVICE_DISCONNECTED = 33
}
declare enum RCCallIWBeautyFilterType {
NONE = 0,
ESTHETIC = 1,
FRESH = 2,
ROMANTIC = 3
}
interface UniListenerResult<T> {
module: string;
type: string;
data: T;
}
interface usersParams {
userId: string;
mediaType: string;
enableCamera: string;
userType: string;
enableMicrophone: string;
mediaId?: string;
}
interface ReceivedListenerResult {
mine: usersParams;
inviter: usersParams;
startTime: number;
caller: usersParams;
mediaType: number;
callType: number;
endTime: number;
extra: string;
targetId: string;
connectedTime: number;
users: usersParams[];
callId: string;
}
interface ListenerResultRes {
reason?: RCCallIWCallDisconnectedReason;
}
interface ListenerResultError {
reason?: RCUNICallErrorCode;
}
interface ListenerResultData {
userId?: string;
user?: usersParams;
mediaType?: string;
}
interface RCCallIWBeautyOption {
whitenessLevel: number;
smoothLevel: number;
ruddyLevel: number;
brightLevel: number;
}
/**
* 初始化 SDK只需要调用一次
*
* calllib初始化默认不传参数
*/
declare function init(): void;
/**
* 注销calllib
*
* 注销calllib默认不传参数
*/
declare function unInit(): void;
/**
* 添加接收监听函数
*
* @param listener 回调函数
*/
declare function onCallReceived(listener: (result: UniListenerResult<ReceivedListenerResult>) => void): void;
/**
* 添加挂断监听函数
*
* @param listener 回调函数
*/
declare function onCallDisconnected(listener: (result: UniListenerResult<ListenerResultRes>) => void): void;
/**
* 添加连接监听函数
*
* @param listener 回调函数
*/
declare function onCallConnected(listener: (result: UniListenerResult<ListenerResultRes>) => void): void;
/**
* 通话中的某一个参与者,邀请好友加入通话
*
* @param listener 回调函数
*/
declare function onRemoteUserInvited(listener: (result: UniListenerResult<ListenerResultRes>) => void): void;
/**
* 对端用户加入了通话
* @param listener 回调函数
*/
declare function onRemoteUserJoined(listener: (result: UniListenerResult<usersParams>) => void): void;
/**
* 对端用户挂断 (实际测试,只在群聊时用触发)
* @param listener 回调函数
*/
declare function onRemoteUserLeft(listener: (result: UniListenerResult<ListenerResultRes>) => void): void;
/**
* 电话已拨出 主叫端拨出电话后,通过回调 onCallOutgoing 通知当前 call 的详细信息
* @param listener 回调函数
*/
declare function onCallOutgoing(listener: (result: UniListenerResult<ListenerResultRes>) => void): void;
/**
* 被叫端正在振铃,主叫端拨出电话,被叫端收到请求,发出振铃响应时监听
* @param listener 回调函数
*/
declare function onRemoteUserRinging(listener: (result: UniListenerResult<ListenerResultRes>) => void): void;
/**
* 通话出现错误的回调
* @param listener 回调函数
*/
declare function onError(listener: (result: UniListenerResult<ListenerResultError>) => void): void;
/**
* 对端用户切换了媒体类型
* @param listener 回调函数
*/
declare function onRemoteUserMediaTypeChanged(listener: (result: UniListenerResult<ListenerResultData>) => void): void;
/**
* 对端用户关闭了摄像头
* @param listener 回调函数
*/
declare function onRemoteUserCameraStateChanged(listener: (result: UniListenerResult<ListenerResultData>) => void): void;
/**
* 对端用户关闭了麦克风
* @param listener 回调函数
*/
declare function onRemoteUserMicrophoneStateChanged(listener: (result: UniListenerResult<ListenerResultData>) => void): void;
/**
* 邀请用户
* @param userIds 被邀请用户id列表
* @param observerUserIds 被邀请观察者id列表 (只能听或看,不能推流的用户)
*/
declare function inviteUsers(userIds: string[], observerUserIds: string[]): void;
/**
* 移除监听-接收到通话呼入
*/
declare function removeCallReceivedListener(): void;
/**
* 移除监听-通话已接通
*/
declare function removeCallConnectedListener(): void;
/**
* 移除监听-通话已结束
* @param 挂断原因
*/
declare function removeCallDisconnectedListener(): void;
/**
* 移除监听-对端用户加入了通话
*/
declare function removeRemoteUserJoinedListener(): void;
/**
* 移除监听-对端用户挂断
*/
declare function removeRemoteUserLeftListener(): void;
/**
* 移除监听-有用户被邀请加入通话
*/
declare function removeRemoteUserInvited(): void;
/**
* 移除监听-开启或关闭摄像头的回调
*/
declare function removeEnableCameraListener(): void;
/**
* 移除监听-切换摄像头回调
*/
declare function removeSwitchCameraListener(): void;
/**
* 移除监听-通话出现错误的回调
*/
declare function removeErrorListener(): void;
/**
* 移除监听-开始呼叫通话的回调
*/
declare function removeCallOutgoingListener(): void;
/**
* 移除监听-对端用户正在振铃
*/
declare function removeRemoteUserRingingListener(): void;
/**
* 移除监听-对端用户切换了媒体类型
*/
declare function removeRemoteUserMediaTypeChangedListener(): void;
/**
* 获取当前calllib本地存储信息
*
* 默认不传参数
*/
declare function getCurrentCallSession(): any;
/**
* 挂断calllib
*
* 默认不传参数
*/
declare function hangup(): void;
/**
* 接收calllib
*
* 默认不传参数
*/
declare function accept(): void;
/**
* 发起单聊呼叫
*
* @param targetId 目标ID
* @param type 呼叫类型0:音频 1:音视频)
* @param extra 默认传''
*
*/
declare function startSingleCall(targetId: string, type: number, extra: null): void;
/**
* 发起组呼呼叫
*
* @param groupId 组ID
* @param userIds 群组成员
* @param observerUserIds 观察者ID默认为空数组
* @param type 呼叫类型0:音频 1:音视频)
* @param extra 默认传''
*
*/
declare function startGroupCall(groupId: string, userIds: Array<string>, observerUserIds: Array<string>, type: number, extra: string): void;
/**
* 设置预览窗口,此方法需要在视图更新渲染完成后执行
*
* @param userId 用户id
* @param ref ref ID 对应组件的标识
* @param type 视频显示模式 0 铺满 1 自适应
* @param isZOrderOnTop android only 是否置顶
*/
declare function setVideoView(userId: string, ref: string, type: number, isZOrderOnTop?: boolean): void;
/**
* 设置callib是否开启扬声器
*
* @param isOpen 默认开启
*
*/
declare function enableSpeaker(isOpen: boolean): void;
/**
* 设置callib是否开启麦克风
*
* @param isOPen 默认开启
*
*/
declare function enableMicrophone(isOpen: boolean): void;
/**
* 切换摄像头
*
* 默认不传参数
*
*/
declare function switchCamera(): void;
/**
* 获取当前摄像头方式
*
* 默认不传参数
*/
declare function currentCamera(): any;
/**
* 开启摄像头摄像头
*
* @param isOpen 是否开启
* @param RCCallIWCamera 对端还是本端
*
*/
declare function enableCamera(isOpen: boolean, camera: RCCallIWCamera): void;
/**
* 修改通话类型
* @param type
*/
declare function changeMediaType(type: RCCallIWMediaType): void;
/**
* 设置滤镜
* @param filter
*/
declare function setBeautyFilter(filter: RCCallIWBeautyFilterType): void;
/**
* 获取当前的滤镜
* 默认不传参数
*/
declare function getCurrentBeautyFilter(): any;
/**
* 设置美颜参数
* @param enable 默认关闭
* @param RCCallIWBeautyOption 美颜参数
*/
declare function setBeautyOption(enable: boolean | undefined, option: RCCallIWBeautyOption): void;
/**
* 获取当前的美颜参数
* 默认不传参数
*/
declare function getCurrentBeautyOption(): any;
/**
* 重置美颜参数和滤镜
* 默认不传参数
*/
declare function resetBeauty(): void;
export { RCCallIWBeautyFilterType, RCCallIWCallDisconnectedReason, RCCallIWCamera, RCCallIWMediaType, RCUNICallErrorCode, accept, changeMediaType, currentCamera, enableCamera, enableMicrophone, enableSpeaker, getCurrentBeautyFilter, getCurrentBeautyOption, getCurrentCallSession, hangup, init, inviteUsers, onCallConnected, onCallDisconnected, onCallOutgoing, onCallReceived, onError, onRemoteUserCameraStateChanged, onRemoteUserInvited, onRemoteUserJoined, onRemoteUserLeft, onRemoteUserMediaTypeChanged, onRemoteUserMicrophoneStateChanged, onRemoteUserRinging, removeCallConnectedListener, removeCallDisconnectedListener, removeCallOutgoingListener, removeCallReceivedListener, removeEnableCameraListener, removeErrorListener, removeRemoteUserInvited, removeRemoteUserJoinedListener, removeRemoteUserLeftListener, removeRemoteUserMediaTypeChangedListener, removeRemoteUserRingingListener, removeSwitchCameraListener, resetBeauty, setBeautyFilter, setBeautyOption, setVideoView, startGroupCall, startSingleCall, switchCamera, unInit };

View File

@@ -1,286 +0,0 @@
/*
* RCCallUni - v5.1.14-release.1
* CommitId - a184e82065a309fc565be987321c44e9da02abbb
* Thu Jan 06 2022 16:03:36 GMT+0800 (中国标准时间)
* ©2020 RongCloud, Inc. All rights reserved.
*/
class Logger {
tag;
constructor(tag) {
this.tag = tag;
}
log(str) {
console.log(`[${this.tag}] ${new Date().toISOString()} ${str}`);
}
}
const logger = new Logger('RCUNICallLib');
var RCCallIWCamera;
(function (RCCallIWCamera) {
RCCallIWCamera[RCCallIWCamera["NONE"] = -1] = "NONE";
RCCallIWCamera[RCCallIWCamera["FRONT"] = 0] = "FRONT";
RCCallIWCamera[RCCallIWCamera["BACK"] = 1] = "BACK";
})(RCCallIWCamera || (RCCallIWCamera = {}));
var RCCallIWMediaType;
(function (RCCallIWMediaType) {
RCCallIWMediaType[RCCallIWMediaType["AUDIO"] = 0] = "AUDIO";
RCCallIWMediaType[RCCallIWMediaType["AUDIO_VIDEO"] = 1] = "AUDIO_VIDEO";
})(RCCallIWMediaType || (RCCallIWMediaType = {}));
var RCUNICallErrorCode;
(function (RCUNICallErrorCode) {
RCUNICallErrorCode[RCUNICallErrorCode["SUCCESS"] = 0] = "SUCCESS";
RCUNICallErrorCode[RCUNICallErrorCode["ENGINE_NOT_FOUND"] = 1] = "ENGINE_NOT_FOUND";
RCUNICallErrorCode[RCUNICallErrorCode["NETWORK_UNAVAILABLE"] = 2] = "NETWORK_UNAVAILABLE";
RCUNICallErrorCode[RCUNICallErrorCode["ONE_CALL_EXISTED"] = 3] = "ONE_CALL_EXISTED";
RCUNICallErrorCode[RCUNICallErrorCode["OPERATION_UNAVAILABLE"] = 4] = "OPERATION_UNAVAILABLE";
RCUNICallErrorCode[RCUNICallErrorCode["INVALID_PARAM"] = 5] = "INVALID_PARAM";
RCUNICallErrorCode[RCUNICallErrorCode["NETWORK_UNSTABLE"] = 6] = "NETWORK_UNSTABLE";
RCUNICallErrorCode[RCUNICallErrorCode["MEDIA_REQUEST_FAILED"] = 7] = "MEDIA_REQUEST_FAILED";
RCUNICallErrorCode[RCUNICallErrorCode["MEDIA_SERVER_NOT_READY"] = 8] = "MEDIA_SERVER_NOT_READY";
RCUNICallErrorCode[RCUNICallErrorCode["MEDIA_SERVER_NOT_INITIALIZED"] = 9] = "MEDIA_SERVER_NOT_INITIALIZED";
RCUNICallErrorCode[RCUNICallErrorCode["MEDIA_REQUEST_TIMEOUT"] = 10] = "MEDIA_REQUEST_TIMEOUT";
RCUNICallErrorCode[RCUNICallErrorCode["MEDIA_UNKOWN_ERROR"] = 11] = "MEDIA_UNKOWN_ERROR";
RCUNICallErrorCode[RCUNICallErrorCode["MEDIA_KICKED_BY_SERVER_ERROR"] = 12] = "MEDIA_KICKED_BY_SERVER_ERROR";
RCUNICallErrorCode[RCUNICallErrorCode["MEDIA_SERVER_CLOSED_ERROR"] = 13] = "MEDIA_SERVER_CLOSED_ERROR";
RCUNICallErrorCode[RCUNICallErrorCode["MEDIA_SERVER_PUBLISH_ERROR"] = 14] = "MEDIA_SERVER_PUBLISH_ERROR";
RCUNICallErrorCode[RCUNICallErrorCode["MEDIA_SERVER_SUBSCRIBE_ERROR"] = 15] = "MEDIA_SERVER_SUBSCRIBE_ERROR";
RCUNICallErrorCode[RCUNICallErrorCode["MEDIA_JOIN_ROOM_REFUSE_ERROR"] = 16] = "MEDIA_JOIN_ROOM_REFUSE_ERROR";
})(RCUNICallErrorCode || (RCUNICallErrorCode = {}));
var RCCallIWCallDisconnectedReason;
(function (RCCallIWCallDisconnectedReason) {
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["CANCEL"] = 0] = "CANCEL";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REJECT"] = 1] = "REJECT";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["HANGUP"] = 2] = "HANGUP";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["BUSY_LINE"] = 3] = "BUSY_LINE";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["NO_RESPONSE"] = 4] = "NO_RESPONSE";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["ENGINE_UNSUPPORTED"] = 5] = "ENGINE_UNSUPPORTED";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["NETWORK_ERROR"] = 6] = "NETWORK_ERROR";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["RESOURCE_GET_ERROR"] = 7] = "RESOURCE_GET_ERROR";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["RESOURCE_PUBLISH_ERROR"] = 8] = "RESOURCE_PUBLISH_ERROR";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["RESOURCE_SUBSCRIBE_ERROR"] = 9] = "RESOURCE_SUBSCRIBE_ERROR";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_CANCEL"] = 10] = "REMOTE_CANCEL";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_REJECT"] = 11] = "REMOTE_REJECT";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_HANGUP"] = 12] = "REMOTE_HANGUP";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_BUSY_LINE"] = 13] = "REMOTE_BUSY_LINE";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_NO_RESPONSE"] = 14] = "REMOTE_NO_RESPONSE";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_ENGINE_UNSUPPORTED"] = 15] = "REMOTE_ENGINE_UNSUPPORTED";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_NETWORK_ERROR"] = 16] = "REMOTE_NETWORK_ERROR";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_RESOURCE_GET_ERROR"] = 17] = "REMOTE_RESOURCE_GET_ERROR";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_RESOURCE_PUBLISH_ERROR"] = 18] = "REMOTE_RESOURCE_PUBLISH_ERROR";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_RESOURCE_SUBSCRIBE_ERROR"] = 19] = "REMOTE_RESOURCE_SUBSCRIBE_ERROR";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["KICKED_BY_OTHER_CALL"] = 20] = "KICKED_BY_OTHER_CALL";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["IN_OTHER_CALL"] = 21] = "IN_OTHER_CALL";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["KICKED_BY_SERVER"] = 22] = "KICKED_BY_SERVER";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_KICKED_BY_OTHER_CALL"] = 23] = "REMOTE_KICKED_BY_OTHER_CALL";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_IN_OTHER_CALL"] = 24] = "REMOTE_IN_OTHER_CALL";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_KICKED_BY_SERVER"] = 25] = "REMOTE_KICKED_BY_SERVER";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["ACCEPT_BY_OTHER_CLIENT"] = 26] = "ACCEPT_BY_OTHER_CLIENT";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["HANGUP_BY_OTHER_CLIENT"] = 27] = "HANGUP_BY_OTHER_CLIENT";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REJECTED_BY_BLACKLIST"] = 28] = "REJECTED_BY_BLACKLIST";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["SERVICE_NOT_OPENED"] = 29] = "SERVICE_NOT_OPENED";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["DROP_TO_OBSERVER"] = 30] = "DROP_TO_OBSERVER";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["INIT_VIDEO_ERROR"] = 31] = "INIT_VIDEO_ERROR";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["OTHER_DEVICE_HAD_ACCEPTED"] = 32] = "OTHER_DEVICE_HAD_ACCEPTED";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["SERVICE_DISCONNECTED"] = 33] = "SERVICE_DISCONNECTED";
})(RCCallIWCallDisconnectedReason || (RCCallIWCallDisconnectedReason = {}));
var RCCallIWBeautyFilterType;
(function (RCCallIWBeautyFilterType) {
RCCallIWBeautyFilterType[RCCallIWBeautyFilterType["NONE"] = 0] = "NONE";
RCCallIWBeautyFilterType[RCCallIWBeautyFilterType["ESTHETIC"] = 1] = "ESTHETIC";
RCCallIWBeautyFilterType[RCCallIWBeautyFilterType["FRESH"] = 2] = "FRESH";
RCCallIWBeautyFilterType[RCCallIWBeautyFilterType["ROMANTIC"] = 3] = "ROMANTIC";
})(RCCallIWBeautyFilterType || (RCCallIWBeautyFilterType = {}));
const call = uni.requireNativePlugin('RongCloud-Call-RCUniCall');
const Platform = uni.getSystemInfoSync().platform;
logger.log('已进入index.js');
function init() {
logger.log(`init Platform->${Platform}`);
call.init({});
}
function unInit() {
logger.log(`unInit Platform->${Platform}`);
call.unInit();
}
function onCallReceived(listener) {
logger.log(`Engine:OnCallReceived 监听通话呼入 Platform->${Platform}`);
call.addEventListener("Engine:OnCallReceived", listener);
}
function onCallDisconnected(listener) {
logger.log(`Engine:OnCallDisconnected 监听通话结束 Platform->${Platform}`);
call.addEventListener("Engine:OnCallDisconnected", listener);
}
function onCallConnected(listener) {
logger.log(`Engine:OnCallConnected 已建立通话通话接通 Platform->${Platform}`);
call.addEventListener("Engine:OnCallConnected", listener);
}
function onRemoteUserInvited(listener) {
logger.log(`Engine:OnRemoteUserInvited 通话中的某一个参与者,邀请好友加入通话 Platform->${Platform}`);
call.addEventListener("Engine:OnRemoteUserInvited", listener);
}
function onRemoteUserJoined(listener) {
logger.log(`Engine:OnRemoteUserJoined 对端用户加入通话 Platform->${Platform}`);
call.addEventListener("Engine:OnRemoteUserJoined", listener);
}
function onRemoteUserLeft(listener) {
logger.log(`Engine:OnRemoteUserLeft 对端用户挂断(群聊触发) Platform->${Platform}`);
call.addEventListener("Engine:OnRemoteUserLeft", listener);
}
function onCallOutgoing(listener) {
logger.log(`Engine:OnCallOutgoing 电话已拨出,通知当前 call 的详细信息 Platform->${Platform}`);
call.addEventListener("Engine:OnCallOutgoing", listener);
}
function onRemoteUserRinging(listener) {
logger.log(`Engine:OnRemoteUserRinging 被叫端收到请求,发出振铃响应时监听 Platform->${Platform}`);
call.addEventListener("Engine:OnRemoteUserRinging", listener);
}
function onError(listener) {
logger.log(`Engine:OnError 通话出现错误 Platform->${Platform}`);
call.addEventListener("Engine:OnError", listener);
}
function onRemoteUserMediaTypeChanged(listener) {
logger.log(`Engine:OnRemoteUserMediaTypeChanged 对端用户切换了媒体类型 Platform->${Platform}`);
call.addEventListener("Engine:OnRemoteUserMediaTypeChanged", listener);
}
function onRemoteUserCameraStateChanged(listener) {
logger.log(`Engine:OnRemoteUserCameraStateChanged 对端用户关闭了摄像头 Platform->${Platform}`);
call.addEventListener("Engine:OnRemoteUserCameraStateChanged", listener);
}
function onRemoteUserMicrophoneStateChanged(listener) {
logger.log(`Engine:OnRemoteUserMicrophoneStateChanged 对端用户关闭了麦克风 Platform->${Platform}`);
call.addEventListener("Engine:OnRemoteUserMicrophoneStateChanged", listener);
}
function inviteUsers(userIds, observerUserIds) {
logger.log(`inviteUsers 邀请用户->${userIds} Platform->${Platform}`);
call.inviteUsers(userIds, observerUserIds);
}
function removeCallReceivedListener() {
logger.log(`removeCallReceivedListener`);
call.removeAllEventListeners('Engine:OnCallReceived');
}
function removeCallConnectedListener() {
logger.log(`removeCallConnectedListener`);
call.removeAllEventListeners('Engine:OnCallConnected');
}
function removeCallDisconnectedListener() {
logger.log(`removeCallDisconnectedListener`);
call.removeAllEventListeners('Engine:OnCallDisconnected');
}
function removeRemoteUserJoinedListener() {
logger.log(`removeRemoteUserJoinedListener`);
call.removeAllEventListeners('Engine:OnRemoteUserJoined');
}
function removeRemoteUserLeftListener() {
logger.log(`removeRemoteUserLeftListener`);
call.removeAllEventListeners('Engine:OnRemoteUserLeft');
}
function removeRemoteUserInvited() {
logger.log(`removeRemoteUserInvited`);
call.removeAllEventListeners('Engine:OnRemoteUserInvited');
}
function removeEnableCameraListener() {
logger.log(`removeEnableCameraListener`);
call.removeAllEventListeners('Engine:OnEnableCamera');
}
function removeSwitchCameraListener() {
logger.log(`removeSwitchCameraListener`);
call.removeAllEventListeners('Engine:OnSwitchCamera');
}
function removeErrorListener() {
logger.log(`removeErrorListener`);
call.removeAllEventListeners('Engine:OnError');
}
function removeCallOutgoingListener() {
logger.log(`removeCallOutgoingListener`);
call.removeAllEventListeners('Engine:OnCallOutgoing');
}
function removeRemoteUserRingingListener() {
logger.log(`removeRemoteUserRingingListener`);
call.removeAllEventListeners('Engine:OnRemoteUserRinging');
}
function removeRemoteUserMediaTypeChangedListener() {
logger.log(`removeRemoteUserMediaTypeChangedListener`);
call.removeAllEventListeners('Engine:OnRemoteUserMediaTypeChanged');
}
function getCurrentCallSession() {
logger.log(`getCurrentCallSession Platform->${Platform}`);
return call.getCurrentCallSession();
}
function hangup() {
logger.log(`hangup Platform->${Platform}`);
call.hangup();
}
function accept() {
logger.log(`accept Platform->${Platform}`);
call.accept();
}
function startSingleCall(targetId, type, extra) {
logger.log(`startSingleCall targetId->${targetId} type=>${type} extra=>${extra} Platform->${Platform}`);
call.startSingleCall(targetId, type, extra);
}
function startGroupCall(groupId, userIds, observerUserIds, type, extra) {
logger.log(`startGroupCall groupId->${groupId} userIds=>${userIds} observerUserIds=>${observerUserIds} type=>${type} extra=>${extra} Platform->${Platform}`);
call.startGroupCall(groupId, userIds, observerUserIds, type, extra);
}
function setVideoView(userId, ref, type, isZOrderOnTop = false) {
logger.log(`setVideoView userId->${userId} ref=>${ref} type=>${type} isZOrderOnTop=>${isZOrderOnTop} Platform->${Platform}`);
Platform === 'android' ? call.setVideoView(userId, ref, type, isZOrderOnTop) : call.setVideoView(userId, ref, type);
}
function enableSpeaker(isOpen) {
logger.log(`enableSpeaker isOPen->${isOpen} Platform->${Platform}`);
call.enableSpeaker(isOpen);
}
function enableMicrophone(isOpen) {
logger.log(`enableMicrophone isOPen->${isOpen} Platform->${Platform}`);
call.enableMicrophone(isOpen);
}
function switchCamera() {
logger.log(`switchCamera Platform->${Platform}`);
call.switchCamera();
}
function currentCamera() {
logger.log(`currentCamera Platform->${Platform}`);
return call.currentCamera();
}
function enableCamera(isOpen, camera) {
logger.log(`enableCamera isOpen=>${isOpen} camera=>${camera} Platform->${Platform}`);
call.enableCamera(isOpen, camera);
}
function changeMediaType(type) {
logger.log(`changeMediaType type=>${type} Platform->${Platform}`);
call.changeMediaType(type);
}
function setBeautyFilter(filter) {
logger.log(`setBeautyFilter filter=>${filter} Platform->${Platform}`);
call.setBeautyFilter(filter);
}
function getCurrentBeautyFilter() {
logger.log(`getCurrentBeautyFilter Platform->${Platform}`);
return call.getCurrentBeautyFilter();
}
function setBeautyOption(enable = false, option) {
logger.log(`setBeautyOption enable=>${enable} option=>${option} Platform->${Platform}`);
call.setBeautyOption(enable, option);
}
function getCurrentBeautyOption() {
logger.log(`getCurrentBeautyOption Platform->${Platform}`);
return call.getCurrentBeautyOption();
}
function resetBeauty() {
logger.log(`resetBeauty Platform->${Platform}`);
call.resetBeauty();
}
export { RCCallIWBeautyFilterType, RCCallIWCallDisconnectedReason, RCCallIWCamera, RCCallIWMediaType, RCUNICallErrorCode, accept, changeMediaType, currentCamera, enableCamera, enableMicrophone, enableSpeaker, getCurrentBeautyFilter, getCurrentBeautyOption, getCurrentCallSession, hangup, init, inviteUsers, onCallConnected, onCallDisconnected, onCallOutgoing, onCallReceived, onError, onRemoteUserCameraStateChanged, onRemoteUserInvited, onRemoteUserJoined, onRemoteUserLeft, onRemoteUserMediaTypeChanged, onRemoteUserMicrophoneStateChanged, onRemoteUserRinging, removeCallConnectedListener, removeCallDisconnectedListener, removeCallOutgoingListener, removeCallReceivedListener, removeEnableCameraListener, removeErrorListener, removeRemoteUserInvited, removeRemoteUserJoinedListener, removeRemoteUserLeftListener, removeRemoteUserMediaTypeChangedListener, removeRemoteUserRingingListener, removeSwitchCameraListener, resetBeauty, setBeautyFilter, setBeautyOption, setVideoView, startGroupCall, startSingleCall, switchCamera, unInit };

View File

@@ -1,333 +0,0 @@
/*
* RCCallUni - v5.1.14-release.1
* CommitId - a184e82065a309fc565be987321c44e9da02abbb
* Thu Jan 06 2022 16:03:36 GMT+0800 (中国标准时间)
* ©2020 RongCloud, Inc. All rights reserved.
*/
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
class Logger {
tag;
constructor(tag) {
this.tag = tag;
}
log(str) {
console.log(`[${this.tag}] ${new Date().toISOString()} ${str}`);
}
}
const logger = new Logger('RCUNICallLib');
exports.RCCallIWCamera = void 0;
(function (RCCallIWCamera) {
RCCallIWCamera[RCCallIWCamera["NONE"] = -1] = "NONE";
RCCallIWCamera[RCCallIWCamera["FRONT"] = 0] = "FRONT";
RCCallIWCamera[RCCallIWCamera["BACK"] = 1] = "BACK";
})(exports.RCCallIWCamera || (exports.RCCallIWCamera = {}));
exports.RCCallIWMediaType = void 0;
(function (RCCallIWMediaType) {
RCCallIWMediaType[RCCallIWMediaType["AUDIO"] = 0] = "AUDIO";
RCCallIWMediaType[RCCallIWMediaType["AUDIO_VIDEO"] = 1] = "AUDIO_VIDEO";
})(exports.RCCallIWMediaType || (exports.RCCallIWMediaType = {}));
exports.RCUNICallErrorCode = void 0;
(function (RCUNICallErrorCode) {
RCUNICallErrorCode[RCUNICallErrorCode["SUCCESS"] = 0] = "SUCCESS";
RCUNICallErrorCode[RCUNICallErrorCode["ENGINE_NOT_FOUND"] = 1] = "ENGINE_NOT_FOUND";
RCUNICallErrorCode[RCUNICallErrorCode["NETWORK_UNAVAILABLE"] = 2] = "NETWORK_UNAVAILABLE";
RCUNICallErrorCode[RCUNICallErrorCode["ONE_CALL_EXISTED"] = 3] = "ONE_CALL_EXISTED";
RCUNICallErrorCode[RCUNICallErrorCode["OPERATION_UNAVAILABLE"] = 4] = "OPERATION_UNAVAILABLE";
RCUNICallErrorCode[RCUNICallErrorCode["INVALID_PARAM"] = 5] = "INVALID_PARAM";
RCUNICallErrorCode[RCUNICallErrorCode["NETWORK_UNSTABLE"] = 6] = "NETWORK_UNSTABLE";
RCUNICallErrorCode[RCUNICallErrorCode["MEDIA_REQUEST_FAILED"] = 7] = "MEDIA_REQUEST_FAILED";
RCUNICallErrorCode[RCUNICallErrorCode["MEDIA_SERVER_NOT_READY"] = 8] = "MEDIA_SERVER_NOT_READY";
RCUNICallErrorCode[RCUNICallErrorCode["MEDIA_SERVER_NOT_INITIALIZED"] = 9] = "MEDIA_SERVER_NOT_INITIALIZED";
RCUNICallErrorCode[RCUNICallErrorCode["MEDIA_REQUEST_TIMEOUT"] = 10] = "MEDIA_REQUEST_TIMEOUT";
RCUNICallErrorCode[RCUNICallErrorCode["MEDIA_UNKOWN_ERROR"] = 11] = "MEDIA_UNKOWN_ERROR";
RCUNICallErrorCode[RCUNICallErrorCode["MEDIA_KICKED_BY_SERVER_ERROR"] = 12] = "MEDIA_KICKED_BY_SERVER_ERROR";
RCUNICallErrorCode[RCUNICallErrorCode["MEDIA_SERVER_CLOSED_ERROR"] = 13] = "MEDIA_SERVER_CLOSED_ERROR";
RCUNICallErrorCode[RCUNICallErrorCode["MEDIA_SERVER_PUBLISH_ERROR"] = 14] = "MEDIA_SERVER_PUBLISH_ERROR";
RCUNICallErrorCode[RCUNICallErrorCode["MEDIA_SERVER_SUBSCRIBE_ERROR"] = 15] = "MEDIA_SERVER_SUBSCRIBE_ERROR";
RCUNICallErrorCode[RCUNICallErrorCode["MEDIA_JOIN_ROOM_REFUSE_ERROR"] = 16] = "MEDIA_JOIN_ROOM_REFUSE_ERROR";
})(exports.RCUNICallErrorCode || (exports.RCUNICallErrorCode = {}));
exports.RCCallIWCallDisconnectedReason = void 0;
(function (RCCallIWCallDisconnectedReason) {
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["CANCEL"] = 0] = "CANCEL";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REJECT"] = 1] = "REJECT";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["HANGUP"] = 2] = "HANGUP";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["BUSY_LINE"] = 3] = "BUSY_LINE";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["NO_RESPONSE"] = 4] = "NO_RESPONSE";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["ENGINE_UNSUPPORTED"] = 5] = "ENGINE_UNSUPPORTED";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["NETWORK_ERROR"] = 6] = "NETWORK_ERROR";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["RESOURCE_GET_ERROR"] = 7] = "RESOURCE_GET_ERROR";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["RESOURCE_PUBLISH_ERROR"] = 8] = "RESOURCE_PUBLISH_ERROR";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["RESOURCE_SUBSCRIBE_ERROR"] = 9] = "RESOURCE_SUBSCRIBE_ERROR";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_CANCEL"] = 10] = "REMOTE_CANCEL";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_REJECT"] = 11] = "REMOTE_REJECT";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_HANGUP"] = 12] = "REMOTE_HANGUP";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_BUSY_LINE"] = 13] = "REMOTE_BUSY_LINE";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_NO_RESPONSE"] = 14] = "REMOTE_NO_RESPONSE";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_ENGINE_UNSUPPORTED"] = 15] = "REMOTE_ENGINE_UNSUPPORTED";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_NETWORK_ERROR"] = 16] = "REMOTE_NETWORK_ERROR";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_RESOURCE_GET_ERROR"] = 17] = "REMOTE_RESOURCE_GET_ERROR";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_RESOURCE_PUBLISH_ERROR"] = 18] = "REMOTE_RESOURCE_PUBLISH_ERROR";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_RESOURCE_SUBSCRIBE_ERROR"] = 19] = "REMOTE_RESOURCE_SUBSCRIBE_ERROR";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["KICKED_BY_OTHER_CALL"] = 20] = "KICKED_BY_OTHER_CALL";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["IN_OTHER_CALL"] = 21] = "IN_OTHER_CALL";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["KICKED_BY_SERVER"] = 22] = "KICKED_BY_SERVER";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_KICKED_BY_OTHER_CALL"] = 23] = "REMOTE_KICKED_BY_OTHER_CALL";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_IN_OTHER_CALL"] = 24] = "REMOTE_IN_OTHER_CALL";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REMOTE_KICKED_BY_SERVER"] = 25] = "REMOTE_KICKED_BY_SERVER";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["ACCEPT_BY_OTHER_CLIENT"] = 26] = "ACCEPT_BY_OTHER_CLIENT";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["HANGUP_BY_OTHER_CLIENT"] = 27] = "HANGUP_BY_OTHER_CLIENT";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["REJECTED_BY_BLACKLIST"] = 28] = "REJECTED_BY_BLACKLIST";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["SERVICE_NOT_OPENED"] = 29] = "SERVICE_NOT_OPENED";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["DROP_TO_OBSERVER"] = 30] = "DROP_TO_OBSERVER";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["INIT_VIDEO_ERROR"] = 31] = "INIT_VIDEO_ERROR";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["OTHER_DEVICE_HAD_ACCEPTED"] = 32] = "OTHER_DEVICE_HAD_ACCEPTED";
RCCallIWCallDisconnectedReason[RCCallIWCallDisconnectedReason["SERVICE_DISCONNECTED"] = 33] = "SERVICE_DISCONNECTED";
})(exports.RCCallIWCallDisconnectedReason || (exports.RCCallIWCallDisconnectedReason = {}));
exports.RCCallIWBeautyFilterType = void 0;
(function (RCCallIWBeautyFilterType) {
RCCallIWBeautyFilterType[RCCallIWBeautyFilterType["NONE"] = 0] = "NONE";
RCCallIWBeautyFilterType[RCCallIWBeautyFilterType["ESTHETIC"] = 1] = "ESTHETIC";
RCCallIWBeautyFilterType[RCCallIWBeautyFilterType["FRESH"] = 2] = "FRESH";
RCCallIWBeautyFilterType[RCCallIWBeautyFilterType["ROMANTIC"] = 3] = "ROMANTIC";
})(exports.RCCallIWBeautyFilterType || (exports.RCCallIWBeautyFilterType = {}));
const call = uni.requireNativePlugin('RongCloud-Call-RCUniCall');
const Platform = uni.getSystemInfoSync().platform;
logger.log('已进入index.js');
function init() {
logger.log(`init Platform->${Platform}`);
call.init({});
}
function unInit() {
logger.log(`unInit Platform->${Platform}`);
call.unInit();
}
function onCallReceived(listener) {
logger.log(`Engine:OnCallReceived 监听通话呼入 Platform->${Platform}`);
call.addEventListener("Engine:OnCallReceived", listener);
}
function onCallDisconnected(listener) {
logger.log(`Engine:OnCallDisconnected 监听通话结束 Platform->${Platform}`);
call.addEventListener("Engine:OnCallDisconnected", listener);
}
function onCallConnected(listener) {
logger.log(`Engine:OnCallConnected 已建立通话通话接通 Platform->${Platform}`);
call.addEventListener("Engine:OnCallConnected", listener);
}
function onRemoteUserInvited(listener) {
logger.log(`Engine:OnRemoteUserInvited 通话中的某一个参与者,邀请好友加入通话 Platform->${Platform}`);
call.addEventListener("Engine:OnRemoteUserInvited", listener);
}
function onRemoteUserJoined(listener) {
logger.log(`Engine:OnRemoteUserJoined 对端用户加入通话 Platform->${Platform}`);
call.addEventListener("Engine:OnRemoteUserJoined", listener);
}
function onRemoteUserLeft(listener) {
logger.log(`Engine:OnRemoteUserLeft 对端用户挂断(群聊触发) Platform->${Platform}`);
call.addEventListener("Engine:OnRemoteUserLeft", listener);
}
function onCallOutgoing(listener) {
logger.log(`Engine:OnCallOutgoing 电话已拨出,通知当前 call 的详细信息 Platform->${Platform}`);
call.addEventListener("Engine:OnCallOutgoing", listener);
}
function onRemoteUserRinging(listener) {
logger.log(`Engine:OnRemoteUserRinging 被叫端收到请求,发出振铃响应时监听 Platform->${Platform}`);
call.addEventListener("Engine:OnRemoteUserRinging", listener);
}
function onError(listener) {
logger.log(`Engine:OnError 通话出现错误 Platform->${Platform}`);
call.addEventListener("Engine:OnError", listener);
}
function onRemoteUserMediaTypeChanged(listener) {
logger.log(`Engine:OnRemoteUserMediaTypeChanged 对端用户切换了媒体类型 Platform->${Platform}`);
call.addEventListener("Engine:OnRemoteUserMediaTypeChanged", listener);
}
function onRemoteUserCameraStateChanged(listener) {
logger.log(`Engine:OnRemoteUserCameraStateChanged 对端用户关闭了摄像头 Platform->${Platform}`);
call.addEventListener("Engine:OnRemoteUserCameraStateChanged", listener);
}
function onRemoteUserMicrophoneStateChanged(listener) {
logger.log(`Engine:OnRemoteUserMicrophoneStateChanged 对端用户关闭了麦克风 Platform->${Platform}`);
call.addEventListener("Engine:OnRemoteUserMicrophoneStateChanged", listener);
}
function inviteUsers(userIds, observerUserIds) {
logger.log(`inviteUsers 邀请用户->${userIds} Platform->${Platform}`);
call.inviteUsers(userIds, observerUserIds);
}
function removeCallReceivedListener() {
logger.log(`removeCallReceivedListener`);
call.removeAllEventListeners('Engine:OnCallReceived');
}
function removeCallConnectedListener() {
logger.log(`removeCallConnectedListener`);
call.removeAllEventListeners('Engine:OnCallConnected');
}
function removeCallDisconnectedListener() {
logger.log(`removeCallDisconnectedListener`);
call.removeAllEventListeners('Engine:OnCallDisconnected');
}
function removeRemoteUserJoinedListener() {
logger.log(`removeRemoteUserJoinedListener`);
call.removeAllEventListeners('Engine:OnRemoteUserJoined');
}
function removeRemoteUserLeftListener() {
logger.log(`removeRemoteUserLeftListener`);
call.removeAllEventListeners('Engine:OnRemoteUserLeft');
}
function removeRemoteUserInvited() {
logger.log(`removeRemoteUserInvited`);
call.removeAllEventListeners('Engine:OnRemoteUserInvited');
}
function removeEnableCameraListener() {
logger.log(`removeEnableCameraListener`);
call.removeAllEventListeners('Engine:OnEnableCamera');
}
function removeSwitchCameraListener() {
logger.log(`removeSwitchCameraListener`);
call.removeAllEventListeners('Engine:OnSwitchCamera');
}
function removeErrorListener() {
logger.log(`removeErrorListener`);
call.removeAllEventListeners('Engine:OnError');
}
function removeCallOutgoingListener() {
logger.log(`removeCallOutgoingListener`);
call.removeAllEventListeners('Engine:OnCallOutgoing');
}
function removeRemoteUserRingingListener() {
logger.log(`removeRemoteUserRingingListener`);
call.removeAllEventListeners('Engine:OnRemoteUserRinging');
}
function removeRemoteUserMediaTypeChangedListener() {
logger.log(`removeRemoteUserMediaTypeChangedListener`);
call.removeAllEventListeners('Engine:OnRemoteUserMediaTypeChanged');
}
function getCurrentCallSession() {
logger.log(`getCurrentCallSession Platform->${Platform}`);
return call.getCurrentCallSession();
}
function hangup() {
logger.log(`hangup Platform->${Platform}`);
call.hangup();
}
function accept() {
logger.log(`accept Platform->${Platform}`);
call.accept();
}
function startSingleCall(targetId, type, extra) {
logger.log(`startSingleCall targetId->${targetId} type=>${type} extra=>${extra} Platform->${Platform}`);
call.startSingleCall(targetId, type, extra);
}
function startGroupCall(groupId, userIds, observerUserIds, type, extra) {
logger.log(`startGroupCall groupId->${groupId} userIds=>${userIds} observerUserIds=>${observerUserIds} type=>${type} extra=>${extra} Platform->${Platform}`);
call.startGroupCall(groupId, userIds, observerUserIds, type, extra);
}
function setVideoView(userId, ref, type, isZOrderOnTop = false) {
logger.log(`setVideoView userId->${userId} ref=>${ref} type=>${type} isZOrderOnTop=>${isZOrderOnTop} Platform->${Platform}`);
Platform === 'android' ? call.setVideoView(userId, ref, type, isZOrderOnTop) : call.setVideoView(userId, ref, type);
}
function enableSpeaker(isOpen) {
logger.log(`enableSpeaker isOPen->${isOpen} Platform->${Platform}`);
call.enableSpeaker(isOpen);
}
function enableMicrophone(isOpen) {
logger.log(`enableMicrophone isOPen->${isOpen} Platform->${Platform}`);
call.enableMicrophone(isOpen);
}
function switchCamera() {
logger.log(`switchCamera Platform->${Platform}`);
call.switchCamera();
}
function currentCamera() {
logger.log(`currentCamera Platform->${Platform}`);
return call.currentCamera();
}
function enableCamera(isOpen, camera) {
logger.log(`enableCamera isOpen=>${isOpen} camera=>${camera} Platform->${Platform}`);
call.enableCamera(isOpen, camera);
}
function changeMediaType(type) {
logger.log(`changeMediaType type=>${type} Platform->${Platform}`);
call.changeMediaType(type);
}
function setBeautyFilter(filter) {
logger.log(`setBeautyFilter filter=>${filter} Platform->${Platform}`);
call.setBeautyFilter(filter);
}
function getCurrentBeautyFilter() {
logger.log(`getCurrentBeautyFilter Platform->${Platform}`);
return call.getCurrentBeautyFilter();
}
function setBeautyOption(enable = false, option) {
logger.log(`setBeautyOption enable=>${enable} option=>${option} Platform->${Platform}`);
call.setBeautyOption(enable, option);
}
function getCurrentBeautyOption() {
logger.log(`getCurrentBeautyOption Platform->${Platform}`);
return call.getCurrentBeautyOption();
}
function resetBeauty() {
logger.log(`resetBeauty Platform->${Platform}`);
call.resetBeauty();
}
exports.accept = accept;
exports.changeMediaType = changeMediaType;
exports.currentCamera = currentCamera;
exports.enableCamera = enableCamera;
exports.enableMicrophone = enableMicrophone;
exports.enableSpeaker = enableSpeaker;
exports.getCurrentBeautyFilter = getCurrentBeautyFilter;
exports.getCurrentBeautyOption = getCurrentBeautyOption;
exports.getCurrentCallSession = getCurrentCallSession;
exports.hangup = hangup;
exports.init = init;
exports.inviteUsers = inviteUsers;
exports.onCallConnected = onCallConnected;
exports.onCallDisconnected = onCallDisconnected;
exports.onCallOutgoing = onCallOutgoing;
exports.onCallReceived = onCallReceived;
exports.onError = onError;
exports.onRemoteUserCameraStateChanged = onRemoteUserCameraStateChanged;
exports.onRemoteUserInvited = onRemoteUserInvited;
exports.onRemoteUserJoined = onRemoteUserJoined;
exports.onRemoteUserLeft = onRemoteUserLeft;
exports.onRemoteUserMediaTypeChanged = onRemoteUserMediaTypeChanged;
exports.onRemoteUserMicrophoneStateChanged = onRemoteUserMicrophoneStateChanged;
exports.onRemoteUserRinging = onRemoteUserRinging;
exports.removeCallConnectedListener = removeCallConnectedListener;
exports.removeCallDisconnectedListener = removeCallDisconnectedListener;
exports.removeCallOutgoingListener = removeCallOutgoingListener;
exports.removeCallReceivedListener = removeCallReceivedListener;
exports.removeEnableCameraListener = removeEnableCameraListener;
exports.removeErrorListener = removeErrorListener;
exports.removeRemoteUserInvited = removeRemoteUserInvited;
exports.removeRemoteUserJoinedListener = removeRemoteUserJoinedListener;
exports.removeRemoteUserLeftListener = removeRemoteUserLeftListener;
exports.removeRemoteUserMediaTypeChangedListener = removeRemoteUserMediaTypeChangedListener;
exports.removeRemoteUserRingingListener = removeRemoteUserRingingListener;
exports.removeSwitchCameraListener = removeSwitchCameraListener;
exports.resetBeauty = resetBeauty;
exports.setBeautyFilter = setBeautyFilter;
exports.setBeautyOption = setBeautyOption;
exports.setVideoView = setVideoView;
exports.startGroupCall = startGroupCall;
exports.startSingleCall = startSingleCall;
exports.switchCamera = switchCamera;
exports.unInit = unInit;

View File

@@ -1,80 +0,0 @@
{
"id": "RongCloud-CallWrapper",
"displayName": "RongCloud-CallWrapper",
"version": "5.1.15",
"description": "RongCloud-CallWrapper",
"keywords": [
"RongCloud-CallWrapper"
],
"repository": "",
"engines": {
"HBuilderX": "^3.1.0"
},
"dcloudext": {
"category": [
"JS SDK",
"通用 SDK"
],
"sale": {
"regular": {
"price": "0.00"
},
"sourcecode": {
"price": "0.00"
}
},
"contact": {
"qq": ""
},
"declaration": {
"ads": "无",
"data": "插件不采集任何数据",
"permissions": "无"
},
"npmurl": ""
},
"uni_modules": {
"dependencies": [],
"encrypt": [],
"platforms": {
"cloud": {
"tcb": "y",
"aliyun": "y"
},
"client": {
"Vue": {
"vue2": "y",
"vue3": "y"
},
"App": {
"app-vue": "y",
"app-nvue": "y"
},
"H5-mobile": {
"Safari": "n",
"Android Browser": "n",
"微信浏览器(Android)": "n",
"QQ浏览器(Android)": "n"
},
"H5-pc": {
"Chrome": "n",
"IE": "n",
"Edge": "n",
"Firefox": "n",
"Safari": "n"
},
"小程序": {
"微信": "n",
"阿里": "n",
"百度": "n",
"字节跳动": "n",
"QQ": "n"
},
"快应用": {
"华为": "n",
"联盟": "n"
}
}
}
}
}

View File

@@ -1 +0,0 @@
# RongCloud-CallWrapper

View File

@@ -1,4 +0,0 @@
## 5.1.3-72022-01-19
调整私聊已读回执回调参数
## 0.0.12022-01-19
从npm迁入插件市场

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,80 +0,0 @@
{
"id": "RongCloud-IMWrapper",
"displayName": "RongCloud-IMWrapper",
"version": "5.1.3-7",
"description": "融云IM原生插件包装层",
"keywords": [
"RongCloud-IMWrapper"
],
"repository": "",
"engines": {
"HBuilderX": "^3.1.0"
},
"dcloudext": {
"category": [
"JS SDK",
"通用 SDK"
],
"sale": {
"regular": {
"price": "0.00"
},
"sourcecode": {
"price": "0.00"
}
},
"contact": {
"qq": ""
},
"declaration": {
"ads": "无",
"data": "插件不采集任何数据",
"permissions": "无"
},
"npmurl": ""
},
"uni_modules": {
"dependencies": [],
"encrypt": [],
"platforms": {
"cloud": {
"tcb": "y",
"aliyun": "y"
},
"client": {
"Vue": {
"vue2": "n",
"vue3": "n"
},
"App": {
"app-vue": "y",
"app-nvue": "y"
},
"H5-mobile": {
"Safari": "n",
"Android Browser": "n",
"微信浏览器(Android)": "n",
"QQ浏览器(Android)": "n"
},
"H5-pc": {
"Chrome": "n",
"IE": "n",
"Edge": "n",
"Firefox": "n",
"Safari": "n"
},
"小程序": {
"微信": "n",
"阿里": "n",
"百度": "n",
"字节跳动": "n",
"QQ": "n"
},
"快应用": {
"华为": "n",
"联盟": "n"
}
}
}
}
}

View File

@@ -1 +0,0 @@
# RongCloud-IMWrapper

View File

@@ -0,0 +1,60 @@
## 1.7.92022-04-02
- 修复 弹出层内部无法滚动的bug
## 1.7.82022-03-28
- 修复 小程序中高度错误的bug
## 1.7.72022-03-17
- 修复 快速调用open出现问题的Bug
## 1.7.62022-02-14
- 修复 safeArea 属性不能设置为false的bug
## 1.7.52022-01-19
- 修复 isMaskClick 失效的bug
## 1.7.42022-01-19
- 新增 cancelText \ confirmText 属性 ,可自定义文本
- 新增 maskBackgroundColor 属性 ,可以修改蒙版颜色
- 优化 maskClick属性 更新为 isMaskClick ,解决微信小程序警告的问题
## 1.7.32022-01-13
- 修复 设置 safeArea 属性不生效的bug
## 1.7.22021-11-26
- 优化 组件示例
## 1.7.12021-11-26
- 修复 vuedoc 文字错误
## 1.7.02021-11-19
- 优化 组件UI并提供设计资源详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-popup](https://uniapp.dcloud.io/component/uniui/uni-popup)
## 1.6.22021-08-24
- 新增 支持国际化
## 1.6.12021-07-30
- 优化 vue3下事件警告的问题
## 1.6.02021-07-13
- 组件兼容 vue3如何创建vue3项目详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
## 1.5.02021-06-23
- 新增 mask-click 遮罩层点击事件
## 1.4.52021-06-22
- 修复 nvue 平台中间弹出后点击内容再点击遮罩无法关闭的Bug
## 1.4.42021-06-18
- 修复 H5平台中间弹出后点击内容再点击遮罩无法关闭的Bug
## 1.4.32021-06-08
- 修复 错误的 watch 字段
- 修复 safeArea 属性不生效的问题
- 修复 点击内容再点击遮罩无法关闭的Bug
## 1.4.22021-05-12
- 新增 组件示例地址
## 1.4.12021-04-29
- 修复 组件内放置 input 、textarea 组件,无法聚焦的问题
## 1.4.0 2021-04-29
- 新增 type 属性的 left\right 值,支持左右弹出
- 新增 open(String:type) 方法参数 ,可以省略 type 属性 ,直接传入类型打开指定弹窗
- 新增 backgroundColor 属性,可定义主窗口背景色,默认不显示背景色
- 新增 safeArea 属性,是否适配底部安全区
- 修复 App\h5\微信小程序底部安全区占位不对的Bug
- 修复 App 端弹出等待的Bug
- 优化 提升低配设备性能,优化动画卡顿问题
- 优化 更简单的组件自定义方式
## 1.2.92021-02-05
- 优化 组件引用关系通过uni_modules引用组件
## 1.2.82021-02-05
- 调整为uni_modules目录规范
## 1.2.72021-02-05
- 调整为uni_modules目录规范
- 新增 支持 PC 端
- 新增 uni-popup-message 、uni-popup-dialog扩展组件支持 PC 端

View File

@@ -0,0 +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

View File

@@ -0,0 +1,271 @@
<template>
<view class="uni-popup-dialog">
<view class="uni-dialog-title">
<text class="uni-dialog-title-text" :class="['uni-popup__'+dialogType]">{{titleText}}</text>
</view>
<view v-if="mode === 'base'" class="uni-dialog-content">
<slot>
<text class="uni-dialog-content-text">{{content}}</text>
</slot>
</view>
<view v-else class="uni-dialog-content">
<slot>
<input class="uni-dialog-input" v-model="val" type="text" :placeholder="placeholderText" :focus="focus" >
</slot>
</view>
<view class="uni-dialog-button-group">
<view class="uni-dialog-button" @click="closeDialog">
<text class="uni-dialog-button-text">{{closeText}}</text>
</view>
<view class="uni-dialog-button uni-border-left" @click="onOk">
<text class="uni-dialog-button-text uni-button-color">{{okText}}</text>
</view>
</view>
</view>
</template>
<script>
import popup from '../uni-popup/popup.js'
import {
initVueI18n
} from '@dcloudio/uni-i18n'
import messages from '../uni-popup/i18n/index.js'
const { t } = initVueI18n(messages)
/**
* PopUp 弹出层-对话框样式
* @description 弹出层-对话框样式
* @tutorial https://ext.dcloud.net.cn/plugin?id=329
* @property {String} value input 模式下的默认值
* @property {String} placeholder input 模式下输入提示
* @property {String} type = [success|warning|info|error] 主题样式
* @value success 成功
* @value warning 提示
* @value info 消息
* @value error 错误
* @property {String} mode = [base|input] 模式、
* @value base 基础对话框
* @value input 可输入对话框
* @property {String} content 对话框内容
* @property {Boolean} beforeClose 是否拦截取消事件
* @event {Function} confirm 点击确认按钮触发
* @event {Function} close 点击取消按钮触发
*/
export default {
name: "uniPopupDialog",
mixins: [popup],
emits:['confirm','close'],
props: {
value: {
type: [String, Number],
default: ''
},
placeholder: {
type: [String, Number],
default: ''
},
type: {
type: String,
default: 'error'
},
mode: {
type: String,
default: 'base'
},
title: {
type: String,
default: ''
},
content: {
type: String,
default: ''
},
beforeClose: {
type: Boolean,
default: false
},
cancelText:{
type: String,
default: ''
},
confirmText:{
type: String,
default: ''
}
},
data() {
return {
dialogType: 'error',
focus: false,
val: ""
}
},
computed: {
okText() {
return this.confirmText || t("uni-popup.ok")
},
closeText() {
return this.cancelText || t("uni-popup.cancel")
},
placeholderText() {
return this.placeholder || t("uni-popup.placeholder")
},
titleText() {
return this.title || t("uni-popup.title")
}
},
watch: {
type(val) {
this.dialogType = val
},
mode(val) {
if (val === 'input') {
this.dialogType = 'info'
}
},
value(val) {
this.val = val
}
},
created() {
// 对话框遮罩不可点击
this.popup.disableMask()
// this.popup.closeMask()
if (this.mode === 'input') {
this.dialogType = 'info'
this.val = this.value
} else {
this.dialogType = this.type
}
},
mounted() {
this.focus = true
},
methods: {
/**
* 点击确认按钮
*/
onOk() {
if (this.mode === 'input'){
this.$emit('confirm', this.val)
}else{
this.$emit('confirm')
}
if(this.beforeClose) return
this.popup.close()
},
/**
* 点击取消按钮
*/
closeDialog() {
this.$emit('close')
if(this.beforeClose) return
this.popup.close()
},
close(){
this.popup.close()
}
}
}
</script>
<style lang="scss" >
.uni-popup-dialog {
width: 300px;
border-radius: 11px;
background-color: #fff;
}
.uni-dialog-title {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
justify-content: center;
padding-top: 25px;
}
.uni-dialog-title-text {
font-size: 16px;
font-weight: 500;
}
.uni-dialog-content {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
justify-content: center;
align-items: center;
padding: 20px;
}
.uni-dialog-content-text {
font-size: 14px;
color: #6C6C6C;
}
.uni-dialog-button-group {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
border-top-color: #f5f5f5;
border-top-style: solid;
border-top-width: 1px;
}
.uni-dialog-button {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex: 1;
flex-direction: row;
justify-content: center;
align-items: center;
height: 45px;
}
.uni-border-left {
border-left-color: #f0f0f0;
border-left-style: solid;
border-left-width: 1px;
}
.uni-dialog-button-text {
font-size: 16px;
color: #333;
}
.uni-button-color {
color: #007aff;
}
.uni-dialog-input {
flex: 1;
font-size: 14px;
border: 1px #eee solid;
height: 40px;
padding: 0 10px;
border-radius: 5px;
color: #555;
}
.uni-popup__success {
color: #4cd964;
}
.uni-popup__warn {
color: #f0ad4e;
}
.uni-popup__error {
color: #dd524d;
}
.uni-popup__info {
color: #909399;
}
</style>

View File

@@ -0,0 +1,143 @@
<template>
<view class="uni-popup-message">
<view class="uni-popup-message__box fixforpc-width" :class="'uni-popup__'+type">
<slot>
<text class="uni-popup-message-text" :class="'uni-popup__'+type+'-text'">{{message}}</text>
</slot>
</view>
</view>
</template>
<script>
import popup from '../uni-popup/popup.js'
/**
* PopUp 弹出层-消息提示
* @description 弹出层-消息提示
* @tutorial https://ext.dcloud.net.cn/plugin?id=329
* @property {String} type = [success|warning|info|error] 主题样式
* @value success 成功
* @value warning 提示
* @value info 消息
* @value error 错误
* @property {String} message 消息提示文字
* @property {String} duration 显示时间,设置为 0 则不会自动关闭
*/
export default {
name: 'uniPopupMessage',
mixins:[popup],
props: {
/**
* 主题 success/warning/info/error 默认 success
*/
type: {
type: String,
default: 'success'
},
/**
* 消息文字
*/
message: {
type: String,
default: ''
},
/**
* 显示时间,设置为 0 则不会自动关闭
*/
duration: {
type: Number,
default: 3000
},
maskShow:{
type:Boolean,
default:false
}
},
data() {
return {}
},
created() {
this.popup.maskShow = this.maskShow
this.popup.messageChild = this
},
methods: {
timerClose(){
if(this.duration === 0) return
clearTimeout(this.timer)
this.timer = setTimeout(()=>{
this.popup.close()
},this.duration)
}
}
}
</script>
<style lang="scss" >
.uni-popup-message {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
justify-content: center;
}
.uni-popup-message__box {
background-color: #e1f3d8;
padding: 10px 15px;
border-color: #eee;
border-style: solid;
border-width: 1px;
flex: 1;
}
@media screen and (min-width: 500px) {
.fixforpc-width {
margin-top: 20px;
border-radius: 4px;
flex: none;
min-width: 380px;
/* #ifndef APP-NVUE */
max-width: 50%;
/* #endif */
/* #ifdef APP-NVUE */
max-width: 500px;
/* #endif */
}
}
.uni-popup-message-text {
font-size: 14px;
padding: 0;
}
.uni-popup__success {
background-color: #e1f3d8;
}
.uni-popup__success-text {
color: #67C23A;
}
.uni-popup__warn {
background-color: #faecd8;
}
.uni-popup__warn-text {
color: #E6A23C;
}
.uni-popup__error {
background-color: #fde2e2;
}
.uni-popup__error-text {
color: #F56C6C;
}
.uni-popup__info {
background-color: #F2F6FC;
}
.uni-popup__info-text {
color: #909399;
}
</style>

View File

@@ -0,0 +1,191 @@
<template>
<view class="uni-popup-share">
<view class="uni-share-title"><text class="uni-share-title-text">{{shareTitleText}}</text></view>
<view class="uni-share-content">
<view class="uni-share-content-box">
<view class="uni-share-content-item" v-for="(item,index) in bottomData" :key="index" @click.stop="select(item,index)">
<image class="uni-share-image" :src="item.icon" mode="aspectFill"></image>
<text class="uni-share-text">{{item.text}}</text>
</view>
</view>
</view>
<view class="uni-share-button-box">
<button class="uni-share-button" @click="close">{{cancelText}}</button>
</view>
</view>
</template>
<script>
import popup from '../uni-popup/popup.js'
import {
initVueI18n
} from '@dcloudio/uni-i18n'
import messages from '../uni-popup/i18n/index.js'
const { t } = initVueI18n(messages)
export default {
name: 'UniPopupShare',
mixins:[popup],
emits:['select'],
props: {
title: {
type: String,
default: ''
},
beforeClose: {
type: Boolean,
default: false
}
},
data() {
return {
bottomData: [{
text: '微信好友',
icon: require('@/static/icon/share_icon_01.png'),
name: 'wxchum'
},
{
text: '朋友圈',
icon: require('@/static/icon/share_icon_00.png'),
name: 'wxcircle'
},
{
text: 'QQ',
icon: require('@/static/icon/share_icon_02.png'),
name: 'qq'
},
// {
// text: '新浪',
// icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/0dacdbe0-50bf-11eb-8ff1-d5dcf8779628.png',
// name: 'sina'
// },
// {
// text: '百度',
// icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/1ec6e920-50bf-11eb-8a36-ebb87efcf8c0.png',
// name: 'copy'
// },
// {
// text: '其他',
// icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/2e0fdfe0-50bf-11eb-b997-9918a5dda011.png',
// name: 'more'
// }
]
}
},
created() {},
computed: {
cancelText() {
return t("uni-popup.cancel")
},
shareTitleText() {
return this.title || t("uni-popup.shareTitle")
}
},
methods: {
/**
* 选择内容
*/
select(item, index) {
this.$emit('select', {
item,
index
})
this.close()
},
/**
* 关闭窗口
*/
close() {
if(this.beforeClose) return
this.popup.close()
}
}
}
</script>
<style lang="scss" >
.uni-popup-share {
background-color: #fff;
border-top-left-radius: 11px;
border-top-right-radius: 11px;
}
.uni-share-title {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
align-items: center;
justify-content: center;
height: 40px;
}
.uni-share-title-text {
font-size: 14px;
color: #666;
}
.uni-share-content {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
justify-content: center;
padding-top: 10px;
}
.uni-share-content-box {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
flex-wrap: wrap;
width: 360px;
}
.uni-share-content-item {
width: 33.33%;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
justify-content: center;
padding: 10px 0;
align-items: center;
}
.uni-share-content-item:active {
background-color: #f5f5f5;
}
.uni-share-image {
width: 30px;
height: 30px;
}
.uni-share-text {
margin-top: 10px;
font-size: 14px;
color: #3B4144;
}
.uni-share-button-box {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
padding: 10px 15px;
}
.uni-share-button {
flex: 1;
border-radius: 45rpx;
height: 90rpx;
line-height: 90rpx;
color: white;
font-size: 16px;
background: #34CE98;
}
.uni-share-button::after {
border-radius: 50px;
display: none;
}
</style>

View File

@@ -0,0 +1,7 @@
{
"uni-popup.cancel": "cancel",
"uni-popup.ok": "ok",
"uni-popup.placeholder": "pleace enter",
"uni-popup.title": "Hint",
"uni-popup.shareTitle": "Share to"
}

View File

@@ -0,0 +1,8 @@
import en from './en.json'
import zhHans from './zh-Hans.json'
import zhHant from './zh-Hant.json'
export default {
en,
'zh-Hans': zhHans,
'zh-Hant': zhHant
}

View File

@@ -0,0 +1,7 @@
{
"uni-popup.cancel": "取消",
"uni-popup.ok": "确定",
"uni-popup.placeholder": "请输入",
"uni-popup.title": "提示",
"uni-popup.shareTitle": "分享到"
}

View File

@@ -0,0 +1,7 @@
{
"uni-popup.cancel": "取消",
"uni-popup.ok": "確定",
"uni-popup.placeholder": "請輸入",
"uni-popup.title": "提示",
"uni-popup.shareTitle": "分享到"
}

View File

@@ -0,0 +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

View File

@@ -0,0 +1,26 @@
export default {
data() {
return {
}
},
created(){
this.popup = this.getParent()
},
methods:{
/**
* 获取父元素实例
*/
getParent(name = 'uniPopup') {
let parent = this.$parent;
let parentName = parent.$options.name;
while (parentName !== name) {
parent = parent.$parent;
if (!parent) return false
parentName = parent.$options.name;
}
return parent;
},
}
}

View File

@@ -0,0 +1,474 @@
<template>
<view v-if="showPopup" class="uni-popup" :class="[popupstyle, isDesktop ? 'fixforpc-z-index' : '']">
<view @touchstart="touchstart">
<uni-transition key="1" v-if="maskShow" name="mask" mode-class="fade" :styles="maskClass"
:duration="duration" :show="showTrans" @click="onTap" />
<uni-transition key="2" :mode-class="ani" name="content" :styles="transClass" :duration="duration"
:show="showTrans" @click="onTap">
<view class="uni-popup__wrapper" :style="{ backgroundColor: bg }" :class="[popupstyle]" @click="clear">
<slot />
</view>
</uni-transition>
</view>
<!-- #ifdef H5 -->
<keypress v-if="maskShow" @esc="onTap" />
<!-- #endif -->
</view>
</template>
<script>
// #ifdef H5
import keypress from './keypress.js'
// #endif
/**
* PopUp 弹出层
* @description 弹出层组件,为了解决遮罩弹层的问题
* @tutorial https://ext.dcloud.net.cn/plugin?id=329
* @property {String} type = [top|center|bottom|left|right|message|dialog|share] 弹出方式
* @value top 顶部弹出
* @value center 中间弹出
* @value bottom 底部弹出
* @value left 左侧弹出
* @value right 右侧弹出
* @value message 消息提示
* @value dialog 对话框
* @value share 底部分享示例
* @property {Boolean} animation = [true|false] 是否开启动画
* @property {Boolean} maskClick = [true|false] 蒙版点击是否关闭弹窗(废弃)
* @property {Boolean} isMaskClick = [true|false] 蒙版点击是否关闭弹窗
* @property {String} backgroundColor 主窗口背景色
* @property {String} maskBackgroundColor 蒙版颜色
* @property {Boolean} safeArea 是否适配底部安全区
* @event {Function} change 打开关闭弹窗触发e={show: false}
* @event {Function} maskClick 点击遮罩触发
*/
export default {
name: 'uniPopup',
components: {
// #ifdef H5
keypress
// #endif
},
emits: ['change', 'maskClick'],
props: {
// 开启动画
animation: {
type: Boolean,
default: true
},
// 弹出层类型可选值top: 顶部弹出层bottom底部弹出层center全屏弹出层
// message: 消息提示 ; dialog : 对话框
type: {
type: String,
default: 'center'
},
// maskClick
isMaskClick: {
type: Boolean,
default: null
},
// TODO 2 个版本后废弃属性 ,使用 isMaskClick
maskClick: {
type: Boolean,
default: null
},
backgroundColor: {
type: String,
default: 'none'
},
safeArea: {
type: Boolean,
default: true
},
maskBackgroundColor: {
type: String,
default: 'rgba(0, 0, 0, 0.4)'
},
},
watch: {
/**
* 监听type类型
*/
type: {
handler: function(type) {
if (!this.config[type]) return
this[this.config[type]](true)
},
immediate: true
},
isDesktop: {
handler: function(newVal) {
if (!this.config[newVal]) return
this[this.config[this.type]](true)
},
immediate: true
},
/**
* 监听遮罩是否可点击
* @param {Object} val
*/
maskClick: {
handler: function(val) {
this.mkclick = val
},
immediate: true
},
isMaskClick: {
handler: function(val) {
this.mkclick = val
},
immediate: true
},
// H5 下禁止底部滚动
showPopup(show) {
// #ifdef H5
// fix by mehaotian 处理 h5 滚动穿透的问题
document.getElementsByTagName('body')[0].style.overflow = show ? 'hidden' : 'visible'
// #endif
}
},
data() {
return {
duration: 300,
ani: [],
showPopup: false,
showTrans: false,
popupWidth: 0,
popupHeight: 0,
config: {
top: 'top',
bottom: 'bottom',
center: 'center',
left: 'left',
right: 'right',
message: 'top',
dialog: 'center',
share: 'bottom'
},
maskClass: {
position: 'fixed',
bottom: 0,
top: 0,
left: 0,
right: 0,
backgroundColor: 'rgba(0, 0, 0, 0.4)'
},
transClass: {
position: 'fixed',
left: 0,
right: 0
},
maskShow: true,
mkclick: true,
popupstyle: this.isDesktop ? 'fixforpc-top' : 'top'
}
},
computed: {
isDesktop() {
return this.popupWidth >= 500 && this.popupHeight >= 500
},
bg() {
if (this.backgroundColor === '' || this.backgroundColor === 'none') {
return 'transparent'
}
return this.backgroundColor
}
},
mounted() {
const fixSize = () => {
const {
windowWidth,
windowHeight,
windowTop,
safeArea,
screenHeight,
safeAreaInsets
} = uni.getSystemInfoSync()
this.popupWidth = windowWidth
this.popupHeight = windowHeight + (windowTop || 0)
// TODO fix by mehaotian 是否适配底部安全区 ,目前微信ios 、和 app ios 计算有差异,需要框架修复
if (safeArea && this.safeArea) {
// #ifdef MP-WEIXIN
this.safeAreaInsets = screenHeight - safeArea.bottom
// #endif
// #ifndef MP-WEIXIN
this.safeAreaInsets = safeAreaInsets.bottom
// #endif
} else {
this.safeAreaInsets = 0
}
}
fixSize()
// #ifdef H5
// window.addEventListener('resize', fixSize)
// this.$once('hook:beforeDestroy', () => {
// window.removeEventListener('resize', fixSize)
// })
// #endif
},
// #ifndef VUE3
// TODO vue2
destroyed() {
this.setH5Visible()
},
// #endif
// #ifdef VUE3
// TODO vue3
unmounted() {
this.setH5Visible()
},
// #endif
created() {
// this.mkclick = this.isMaskClick || this.maskClick
if (this.isMaskClick === null && this.maskClick === null) {
this.mkclick = true
} else {
this.mkclick = this.isMaskClick !== null ? this.isMaskClick : this.maskClick
}
if (this.animation) {
this.duration = 300
} else {
this.duration = 0
}
// TODO 处理 message 组件生命周期异常的问题
this.messageChild = null
// TODO 解决头条冒泡的问题
this.clearPropagation = false
this.maskClass.backgroundColor = this.maskBackgroundColor
},
methods: {
setH5Visible() {
// #ifdef H5
// fix by mehaotian 处理 h5 滚动穿透的问题
document.getElementsByTagName('body')[0].style.overflow = 'visible'
// #endif
},
/**
* 公用方法,不显示遮罩层
*/
closeMask() {
this.maskShow = false
},
/**
* 公用方法,遮罩层禁止点击
*/
disableMask() {
this.mkclick = false
},
// TODO nvue 取消冒泡
clear(e) {
// #ifndef APP-NVUE
e.stopPropagation()
// #endif
this.clearPropagation = true
},
open(direction) {
// fix by mehaotian 处理快速打开关闭的情况
if (this.showPopup) {
clearTimeout(this.timer)
this.showPopup = false
}
let innerType = ['top', 'center', 'bottom', 'left', 'right', 'message', 'dialog', 'share']
if (!(direction && innerType.indexOf(direction) !== -1)) {
direction = this.type
}
if (!this.config[direction]) {
console.error('缺少类型:', direction)
return
}
this[this.config[direction]]()
this.$emit('change', {
show: true,
type: direction
})
},
close(type) {
this.showTrans = false
this.$emit('change', {
show: false,
type: this.type
})
clearTimeout(this.timer)
// // 自定义关闭事件
// this.customOpen && this.customClose()
this.timer = setTimeout(() => {
this.showPopup = false
}, 300)
},
// TODO 处理冒泡事件,头条的冒泡事件有问题 ,先这样兼容
touchstart() {
this.clearPropagation = false
},
onTap() {
if (this.clearPropagation) {
// fix by mehaotian 兼容 nvue
this.clearPropagation = false
return
}
this.$emit('maskClick')
if (!this.mkclick) return
this.close()
},
/**
* 顶部弹出样式处理
*/
top(type) {
this.popupstyle = this.isDesktop ? 'fixforpc-top' : 'top'
this.ani = ['slide-top']
this.transClass = {
position: 'fixed',
left: 0,
right: 0,
backgroundColor: this.bg
}
// TODO 兼容 type 属性 ,后续会废弃
if (type) return
this.showPopup = true
this.showTrans = true
this.$nextTick(() => {
if (this.messageChild && this.type === 'message') {
this.messageChild.timerClose()
}
})
},
/**
* 底部弹出样式处理
*/
bottom(type) {
this.popupstyle = 'bottom'
this.ani = ['slide-bottom']
this.transClass = {
position: 'fixed',
left: 0,
right: 0,
bottom: 0,
paddingBottom: this.safeAreaInsets + 'px',
backgroundColor: this.bg
}
// TODO 兼容 type 属性 ,后续会废弃
if (type) return
this.showPopup = true
this.showTrans = true
},
/**
* 中间弹出样式处理
*/
center(type) {
this.popupstyle = 'center'
this.ani = ['zoom-out', 'fade']
this.transClass = {
position: 'fixed',
/* #ifndef APP-NVUE */
display: 'flex',
flexDirection: 'column',
/* #endif */
bottom: 0,
left: 0,
right: 0,
top: 0,
justifyContent: 'center',
alignItems: 'center'
}
// TODO 兼容 type 属性 ,后续会废弃
if (type) return
this.showPopup = true
this.showTrans = true
},
left(type) {
this.popupstyle = 'left'
this.ani = ['slide-left']
this.transClass = {
position: 'fixed',
left: 0,
bottom: 0,
top: 0,
backgroundColor: this.bg,
/* #ifndef APP-NVUE */
display: 'flex',
flexDirection: 'column'
/* #endif */
}
// TODO 兼容 type 属性 ,后续会废弃
if (type) return
this.showPopup = true
this.showTrans = true
},
right(type) {
this.popupstyle = 'right'
this.ani = ['slide-right']
this.transClass = {
position: 'fixed',
bottom: 0,
right: 0,
top: 0,
backgroundColor: this.bg,
/* #ifndef APP-NVUE */
display: 'flex',
flexDirection: 'column'
/* #endif */
}
// TODO 兼容 type 属性 ,后续会废弃
if (type) return
this.showPopup = true
this.showTrans = true
}
}
}
</script>
<style lang="scss">
.uni-popup {
position: fixed;
/* #ifndef APP-NVUE */
z-index: 99;
/* #endif */
&.top,
&.left,
&.right {
/* #ifdef H5 */
top: var(--window-top);
/* #endif */
/* #ifndef H5 */
top: 0;
/* #endif */
}
.uni-popup__wrapper {
/* #ifndef APP-NVUE */
display: block;
/* #endif */
position: relative;
/* iphonex 等安全区设置,底部安全区适配 */
/* #ifndef APP-NVUE */
// padding-bottom: constant(safe-area-inset-bottom);
// padding-bottom: env(safe-area-inset-bottom);
/* #endif */
&.left,
&.right {
/* #ifdef H5 */
padding-top: var(--window-top);
/* #endif */
/* #ifndef H5 */
padding-top: 0;
/* #endif */
flex: 1;
}
}
}
.fixforpc-z-index {
/* #ifndef APP-NVUE */
z-index: 999;
/* #endif */
}
.fixforpc-top {
top: 0;
}
</style>

View File

@@ -0,0 +1,90 @@
{
"id": "uni-popup",
"displayName": "uni-popup 弹出层",
"version": "1.7.9",
"description": " Popup 组件,提供常用的弹层",
"keywords": [
"uni-ui",
"弹出层",
"弹窗",
"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-scss",
"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"
},
"Vue": {
"vue2": "y",
"vue3": "y"
}
}
}
}
}

View File

@@ -0,0 +1,17 @@
## Popup 弹出层
> **组件名uni-popup**
> 代码块: `uPopup`
> 关联组件:`uni-transition`
弹出层组件,在应用中弹出一个消息提示窗口、提示框等
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-popup)
#### 如使用过程中有任何问题或者您对uni-ui有一些好的建议欢迎加入 uni-ui 交流群871950839

View File

@@ -0,0 +1,20 @@
## 1.3.12021-11-23
- 修复 init 方法初始化问题
## 1.3.02021-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.12021-09-27
- 修复 init 方法不生效的 Bug
## 1.2.02021-07-30
- 组件兼容 vue3如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
## 1.1.12021-05-12
- 新增 示例地址
- 修复 示例项目缺少组件的 Bug
## 1.1.02021-04-22
- 新增 通过方法自定义动画
- 新增 custom-class 非 NVUE 平台支持自定义 class 定制样式
- 优化 动画触发逻辑,使动画更流畅
- 优化 支持单独的动画类型
- 优化 文档示例
## 1.0.22021-02-05
- 调整为 uni_modules 目录规范

View File

@@ -0,0 +1,128 @@
// 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
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) {
// #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)
}

View File

@@ -0,0 +1,277 @@
<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 {}
}
},
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 = {}) {
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()
}
}
}
</script>
<style></style>

View File

@@ -0,0 +1,87 @@
{
"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"
}
}
}
}
}

View File

@@ -0,0 +1,11 @@
## Transition 过渡动画
> **组件名uni-transition**
> 代码块: `uTransition`
元素过渡动画
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-transition)
#### 如使用过程中有任何问题或者您对uni-ui有一些好的建议欢迎加入 uni-ui 交流群871950839

Binary file not shown.

View File

@@ -1,8 +1,8 @@
var isReady=false;var onReadyCallbacks=[];
var isServiceReady=false;var onServiceReadyCallbacks=[];
var __uniConfig = {"pages":["pages/auth/auth","pages/auth/role","pages/life/life","pages/store/index","pages/user/index","pages/setting/setting","pages/store/goods","pages/store/buy","pages/order/index","pages/order/details","pages/address/index","pages/address/edit","pages/pay/pay","pages/store/list","pages/store/meals","pages/store/search","pages/refund/index","pages/account/integral","pages/account/dt","pages/account/recharge","pages/vip/vip","pages/vip/agreement","pages/team/index","pages/store/shop/shopDetail","pages/store/shop/shopList"],"window":{"navigationBarTextStyle":"black","navigationBarTitleText":"ZH健康","navigationBarBackgroundColor":"#F3F6FB","backgroundColorTop":"#F3F6FB","backgroundColorBottom":"#F3F6FB"},"tabBar":{"borderStyle":"white","selectedColor":"#34CE98","list":[{"iconPath":"static/tabBar/tabBar_02.png","selectedIconPath":"static/tabBar/tabBar_show_02.png","pagePath":"pages/life/life","text":"共力人生"},{"iconPath":"static/tabBar/tabBar_02.png","selectedIconPath":"static/tabBar/tabBar_show_02.png","pagePath":"pages/store/index","text":"DT商城"},{"iconPath":"static/tabBar/tabBar_03.png","selectedIconPath":"static/tabBar/tabBar_show_03.png","pagePath":"pages/user/index","text":"我的"}]},"nvueCompiler":"uni-app","nvueStyleCompiler":"uni-app","renderer":"auto","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":false},"appname":"ZH-HEALTH","compilerVersion":"3.4.14","entryPagePath":"pages/auth/auth","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000}};
var __uniRoutes = [{"path":"/pages/auth/auth","meta":{"isQuit":true},"window":{"navigationBarTitleText":"登录","navigationStyle":"custom"}},{"path":"/pages/auth/role","meta":{},"window":{"navigationBarTitleText":"角色创建","navigationBarBackgroundColor":"#FFF","titleNView":{"buttons":[{"text":"退出登录","fontSize":"14","width":"80px","color":"#34CE98"}]}}},{"path":"/pages/life/life","meta":{"isQuit":true,"isTabBar":true},"window":{"navigationBarTitleText":"共力人生","navigationStyle":"custom"}},{"path":"/pages/store/index","meta":{"isQuit":true,"isTabBar":true},"window":{"navigationBarTitleText":"DT商城","enablePullDownRefresh":true,"titleNView":{"backgroundColor":"#FFFFFF","buttons":[{"float":"right","text":"","fontSrc":"/static/iconfont.ttf","color":"#000","fontSize":"20px"}]}}},{"path":"/pages/user/index","meta":{"isQuit":true,"isTabBar":true},"window":{"navigationBarTitleText":"我的","navigationStyle":"custom"}},{"path":"/pages/setting/setting","meta":{},"window":{"navigationBarTitleText":"设置中心","navigationBarBackgroundColor":"#34CE98","navigationBarTextStyle":"white"}},{"path":"/pages/store/goods","meta":{},"window":{"navigationStyle":"custom","navigationBarTitleText":"详情","titleNView":{"backgroundColor":"#FFFFFF","type":"transparent"}}},{"path":"/pages/store/buy","meta":{},"window":{"navigationBarTitleText":"确认订单","enablePullDownRefresh":false}},{"path":"/pages/order/index","meta":{},"window":{"navigationBarTitleText":"我的订单","navigationBarBackgroundColor":"#FFFFFF","enablePullDownRefresh":false}},{"path":"/pages/order/details","meta":{},"window":{"navigationBarTitleText":"订单详情","enablePullDownRefresh":false}},{"path":"/pages/address/index","meta":{},"window":{"navigationBarTitleText":"收货地址"}},{"path":"/pages/address/edit","meta":{},"window":{"navigationBarTitleText":"编辑","enablePullDownRefresh":false}},{"path":"/pages/pay/pay","meta":{},"window":{"navigationBarTitleText":"收银台","navigationBarBackgroundColor":"#FFFFFF"}},{"path":"/pages/store/list","meta":{},"window":{"navigationBarTitleText":"商品","navigationBarBackgroundColor":"#FFFFFF","enablePullDownRefresh":true}},{"path":"/pages/store/meals","meta":{},"window":{"navigationBarTitleText":"套餐","navigationBarBackgroundColor":"#FFFFFF","enablePullDownRefresh":true}},{"path":"/pages/store/search","meta":{},"window":{"navigationBarTitleText":"搜索","navigationBarBackgroundColor":"#FFFFFF"}},{"path":"/pages/refund/index","meta":{},"window":{"navigationBarTitleText":"退换货","navigationBarBackgroundColor":"#FFFFFF"}},{"path":"/pages/account/integral","meta":{},"window":{"navigationBarTitleText":"共力值","navigationBarBackgroundColor":"#34CE98","navigationBarTextStyle":"white"}},{"path":"/pages/account/dt","meta":{},"window":{"navigationBarTitleText":"DT积分","navigationBarBackgroundColor":"#34CE98","backgroundColorTop":"#34CE98","navigationBarTextStyle":"white","titleNView":{"buttons":[{"text":"充值","width":"60","fontSize":"14"}]}}},{"path":"/pages/account/recharge","meta":{},"window":{"navigationBarTitleText":"DT积分充值","navigationBarBackgroundColor":"#FFFFFF","titleNView":{"buttons":[{"text":"充值记录","width":"80","fontSize":"14"}]}}},{"path":"/pages/vip/vip","meta":{},"window":{"navigationBarTitleText":"共力会员","navigationBarBackgroundColor":"#242430","navigationBarTextStyle":"white","backgroundColorTop":"#242430"}},{"path":"/pages/vip/agreement","meta":{},"window":{"navigationBarTitleText":"共力会员协议"}},{"path":"/pages/team/index","meta":{},"window":{"navigationBarTitleText":"共力团队","enablePullDownRefresh":false}},{"path":"/pages/store/shop/shopDetail","meta":{},"window":{"navigationStyle":"custom"}},{"path":"/pages/store/shop/shopList","meta":{},"window":{"navigationBarTitleText":"更多店铺","navigationBarBackgroundColor":"#FFFFFF","enablePullDownRefresh":true}}];
var __uniConfig = {"pages":["pages/auth/auth","pages/auth/role","pages/life/life","pages/store/index","pages/user/index","pages/setting/setting","pages/store/goods","pages/store/buy","pages/order/index","pages/order/details","pages/address/index","pages/address/edit","pages/pay/pay","pages/store/list","pages/store/meals","pages/store/search","pages/refund/list","pages/refund/aftersale","pages/refund/refund_or_exchange_apply","pages/refund/exchange","pages/account/integral","pages/account/dt","pages/account/recharge","pages/vip/vip","pages/vip/agreement","pages/team/index","pages/store/shop/shopDetail","pages/store/shop/shopList"],"window":{"navigationBarTextStyle":"black","navigationBarTitleText":"ZH健康","navigationBarBackgroundColor":"#F3F6FB","backgroundColorTop":"#F3F6FB","backgroundColorBottom":"#F3F6FB"},"tabBar":{"borderStyle":"white","selectedColor":"#34CE98","list":[{"iconPath":"static/tabBar/tabBar_02.png","selectedIconPath":"static/tabBar/tabBar_show_02.png","pagePath":"pages/life/life","text":"共力人生"},{"iconPath":"static/tabBar/tabBar_02.png","selectedIconPath":"static/tabBar/tabBar_show_02.png","pagePath":"pages/store/index","text":"DT商城"},{"iconPath":"static/tabBar/tabBar_03.png","selectedIconPath":"static/tabBar/tabBar_show_03.png","pagePath":"pages/user/index","text":"我的"}]},"nvueCompiler":"uni-app","nvueStyleCompiler":"uni-app","renderer":"auto","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":false},"appname":"共力生态","compilerVersion":"3.4.14","entryPagePath":"pages/auth/auth","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000}};
var __uniRoutes = [{"path":"/pages/auth/auth","meta":{"isQuit":true},"window":{"navigationBarTitleText":"登录","navigationStyle":"custom"}},{"path":"/pages/auth/role","meta":{},"window":{"navigationBarTitleText":"角色创建","navigationBarBackgroundColor":"#FFF","titleNView":{"buttons":[{"text":"退出登录","fontSize":"14","width":"80px","color":"#34CE98"}]}}},{"path":"/pages/life/life","meta":{"isQuit":true,"isTabBar":true},"window":{"navigationBarTitleText":"共力人生","navigationStyle":"custom"}},{"path":"/pages/store/index","meta":{"isQuit":true,"isTabBar":true},"window":{"navigationBarTitleText":"DT商城","enablePullDownRefresh":true,"titleNView":{"backgroundColor":"#FFFFFF","buttons":[{"float":"right","text":"","fontSrc":"/static/iconfont.ttf","color":"#000","fontSize":"20px"}]}}},{"path":"/pages/user/index","meta":{"isQuit":true,"isTabBar":true},"window":{"navigationBarTitleText":"我的","navigationStyle":"custom"}},{"path":"/pages/setting/setting","meta":{},"window":{"navigationBarTitleText":"设置中心","navigationBarBackgroundColor":"#34CE98","navigationBarTextStyle":"white"}},{"path":"/pages/store/goods","meta":{},"window":{"navigationStyle":"custom","navigationBarTitleText":"详情","titleNView":{"backgroundColor":"#FFFFFF","type":"transparent"}}},{"path":"/pages/store/buy","meta":{},"window":{"navigationBarTitleText":"确认订单","enablePullDownRefresh":false}},{"path":"/pages/order/index","meta":{},"window":{"navigationBarTitleText":"我的订单","navigationBarBackgroundColor":"#FFFFFF","enablePullDownRefresh":false}},{"path":"/pages/order/details","meta":{},"window":{"navigationBarTitleText":"订单详情","enablePullDownRefresh":false}},{"path":"/pages/address/index","meta":{},"window":{"navigationBarTitleText":"收货地址"}},{"path":"/pages/address/edit","meta":{},"window":{"navigationBarTitleText":"编辑","enablePullDownRefresh":false}},{"path":"/pages/pay/pay","meta":{},"window":{"navigationBarTitleText":"收银台","navigationBarBackgroundColor":"#FFFFFF"}},{"path":"/pages/store/list","meta":{},"window":{"navigationBarTitleText":"商品","navigationBarBackgroundColor":"#FFFFFF","enablePullDownRefresh":true}},{"path":"/pages/store/meals","meta":{},"window":{"navigationBarTitleText":"套餐","navigationBarBackgroundColor":"#FFFFFF","enablePullDownRefresh":true}},{"path":"/pages/store/search","meta":{},"window":{"navigationBarTitleText":"搜索","navigationBarBackgroundColor":"#FFFFFF"}},{"path":"/pages/refund/list","meta":{},"window":{"navigationBarTitleText":"退换货","navigationBarBackgroundColor":"#FFFFFF"}},{"path":"/pages/refund/aftersale","meta":{},"window":{"navigationBarTitleText":" 选择售后类型","navigationBarBackgroundColor":"#FFFFFF"}},{"path":"/pages/refund/refund_or_exchange_apply","meta":{},"window":{"navigationBarTitleText":"退换货申请","navigationBarBackgroundColor":"#FFFFFF"}},{"path":"/pages/refund/exchange","meta":{},"window":{"navigationBarTitleText":"换货","navigationBarBackgroundColor":"#FFFFFF"}},{"path":"/pages/account/integral","meta":{},"window":{"navigationBarTitleText":"共力值","navigationBarBackgroundColor":"#34CE98","navigationBarTextStyle":"white"}},{"path":"/pages/account/dt","meta":{},"window":{"navigationBarTitleText":"DT积分","navigationBarBackgroundColor":"#34CE98","backgroundColorTop":"#34CE98","navigationBarTextStyle":"white","titleNView":{"buttons":[{"text":"充值","width":"60","fontSize":"14"}]}}},{"path":"/pages/account/recharge","meta":{},"window":{"navigationBarTitleText":"DT积分充值","navigationBarBackgroundColor":"#FFFFFF","titleNView":{"buttons":[{"text":"充值记录","width":"80","fontSize":"14"}]}}},{"path":"/pages/vip/vip","meta":{},"window":{"navigationBarTitleText":"共力会员","navigationBarBackgroundColor":"#242430","navigationBarTextStyle":"white","backgroundColorTop":"#242430"}},{"path":"/pages/vip/agreement","meta":{},"window":{"navigationBarTitleText":"共力会员协议"}},{"path":"/pages/team/index","meta":{},"window":{"navigationBarTitleText":"共力团队"}},{"path":"/pages/store/shop/shopDetail","meta":{},"window":{"navigationStyle":"custom"}},{"path":"/pages/store/shop/shopList","meta":{},"window":{"navigationBarTitleText":"更多店铺","navigationBarBackgroundColor":"#FFFFFF","enablePullDownRefresh":true}}];
__uniConfig.onReady=function(callback){if(__uniConfig.ready){callback()}else{onReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"ready",{get:function(){return isReady},set:function(val){isReady=val;if(!isReady){return}const callbacks=onReadyCallbacks.slice(0);onReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
__uniConfig.onServiceReady=function(callback){if(__uniConfig.serviceReady){callback()}else{onServiceReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"serviceReady",{get:function(){return isServiceReady},set:function(val){isServiceReady=val;if(!isServiceReady){return}const callbacks=onServiceReadyCallbacks.slice(0);onServiceReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
service.register("uni-app-config",{create(a,b,c){if(!__uniConfig.viewport){var d=b.weex.config.env.scale,e=b.weex.config.env.deviceWidth,f=Math.ceil(e/d);Object.assign(__uniConfig,{viewport:f,defaultFontSize:Math.round(f/20)})}return{instance:{__uniConfig:__uniConfig,__uniRoutes:__uniRoutes,global:void 0,window:void 0,document:void 0,frames:void 0,self:void 0,location:void 0,navigator:void 0,localStorage:void 0,history:void 0,Caches:void 0,screen:void 0,alert:void 0,confirm:void 0,prompt:void 0,fetch:void 0,XMLHttpRequest:void 0,WebSocket:void 0,webkit:void 0,print:void 0}}}});

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

Some files were not shown because too many files have changed in this diff Show More