HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

uni-app+vue3+pinia+Nvue+vite4多端直播App实例|uniapp仿微信直播商城

前段时间有给大家分享一个Electron27+react18跨平台mateOs桌面系统后台框架,这次带来全新研发的uniapp+vue3+Nvue+pinia跨端仿抖音直播商城项目uni-welive。

https://ask.dcloud.net.cn/article/40867

编译到H5+小程序+App端效果

img

uniapp-vue3-welive全新基于uniapp+vue3+pinia+nvue+uv-ui等技术跨多端仿制抖音/微信直播商城App项目。支持全屏上下滑动切换小视频,支持编译到兼容H5+小程序+App端。

img

使用技术

  • 开发工具:HbuilderX 3.98
  • 技术框架:Uniapp+Vue3+Vite4+Nvue+Pinia
  • UI组件库:uv-ui+vk-uview
  • 弹框组件:uaPopup(uniapp封装多端弹框组件)
  • 自定义组件:uaNavbar+uaTabbar组件
  • 本地缓存:pinia-plugin-unistorage
  • 编译支持:H5+小程序+APP端

img

img

项目结构目录

img

![img](https://image-static.segmentfault.com/420/845/4208453913-6593668e44dd0_fix7320

img

img

img

入口main.js

/**  
 * 入口配置  
 */  

import { createSSRApp } from 'vue'  
import App from './App'  

// 引入Pinia状态管理  
import Pinia from '@/store'  

// 引入vk-uview-ui组件库  
import VKuview from '@/uni_modules/vk-uview-ui'  

export function createApp() {  
    const app = createSSRApp(App)  
    app.use(Pinia)  
    app.use(VKuview)  
    return {  
        app,  
        Pinia  
    }  
}

App.vue模板

<script>  
    export default {  
        globalData: {  
            // 全局设置状态栏和导航栏高度  
            statusBarH: 0,  
            customBarH: 0,  
            screenWidth: 0,  
            screenHeight: 0,  
            menuBar: null  
        },  
        onLaunch: function() {  
            console.log('App Launch')  

            // 隐藏系统tabbar  
            uni.hideTabBar()  
            this.appInit()  
        },  
        onShow: function() {  
            console.log('App Show')  
        },  
        onHide: function() {  
            console.log('App Hide')  
        },  
        onPageNotFound: function() {  
            console.log('Page Not Found', e.path)  
            uni.redirectTo({  
                url: '/pages/index/index'  
            })  
        },  
        methods: {  
            appInit: function() {  
                uni.getSystemInfo({  
                    success: (e) => {  
                        // 获取手机状态栏信息  
                        let statusBar = e.statusBarHeight || 0  
                        let customBar  
                        let menuBar  

                        // #ifndef MP  
                        customBar = statusBar + (e.osName === 'android' ? 50 : 45)  
                        // #endif  

                        // #ifdef MP-WEIXIN  
                        // 获取微信小程序胶囊按钮信息  
                        let menu = wx.getMenuButtonBoundingClientRect()  
                        // 导航栏高度 = 胶囊下距离 + 胶囊上距离 - 状态栏高度  
                        customBar = menu.bottom + menu.top - statusBar  
                        menuBar = menu  
                        // #endif  

                        // // #ifdef MP-ALIPAY  
                        customBar = statusBar + e.titleBarHeight  
                        // #endif  

                        // 兼容nvue写法(H5/小程序/APP/APP-Nvue)  
                        this.globalData.statusBarH = statusBar  
                        this.globalData.customBarH = customBar  
                        this.globalData.screenWidth = e.screenWidth  
                        this.globalData.screenHeight = e.screenHeight  
                        this.globalData.menuBar = menuBar  
                    }  
                })  
            }  
        }  
    }  
</script>  

<style>  
    /* #ifndef APP-NVUE */  
    @import 'static/fonts/iconfont.css';  
    /* #endif */  
    .nvueicon {font-family: nvueicon;}  
</style>  
<style lang="scss">  
    // 引入vk-uview-ui基础样式  
    @import 'uni_modules/vk-uview-ui/index.scss';  

    @import 'styles/reset.scss';  
    @import 'styles/layout.scss';  
</style>

img

img

img

img

img

img

img

img

img

img

img

img

uniapp+vue3直播模板

img

<ua-layout>  
    <view class="ua__swipervideo flex1">  
        <swiper  
            class="ua__swipervideo-wrap flex1"  
            :current="currentLive"  
            vertical  
            @change="handleChange"  
        >  
            <swiper-item v-for="(item, index) in liveList" :key="index">  
                <video  
                    class="ua__swipervideo-player flex1"  
                    :id="'uplayer' + index"  
                    :src="item.src"  
                    :controls="false"  
                    :loop="true"  
                    :autoplay="index == currentLive"  
                    :show-center-play-btn="false"  
                    object-fit="contain"  
                    :style="{'width': `${winWidth}px`, 'height': `${winHeight}px`}"  
                >  
                </video>  

                <!-- 浮层模块 -->  
                <swiper class="ulive__swiperscreen flex1" :current="1">  
                    <swiper-item>  
                        第一屏  
                    </swiper-item>  
                    <swiper-item>  
                        <!-- 顶部区域 -->  
                        <view class="ulive__headlayer" :style="{'top': menuBarT+'px'}">  
                            <!-- logo+关注 -->  
                            <view class="ulive__hd-liveinfo flexbox flex-row flex-alignc">  
                                <view class="ulive__hd-avatar ulive__mask flex-alignc">  
                                    <image class="logo" :src="item.logo" mode="widthFix" />  
                                    <view class="flex1 flexbox flex-col ml-10">  
                                        <text class="name">{{item.name}}</text>  
                                        <text class="zan">{{item.likeNum}}本场点赞</text>  
                                    </view>  
                                    <view class="btn flexbox flex-row flex-alignc" :class="{'active': item.isFollow}" @click="handleFollow(index)"><text class="btntext" :class="{'active': item.isFollow}">{{item.isFollow ? '已关注' : '关注'}}</text></view>  
                                </view>  
                                <view class="ulive__hd-onlineuser flex1">  
                                    <uv-icon name="close" color="#fff" @click="handleLiveQuit" />  
                                </view>  
                            </view>  
                            <view class="ulive__hd-livewrap flexbox flex-row">  
                                <view class="ulive__hd-livewrap__left flex1 flexbox flex-col">  
                                    <view class="ulive__hd-livewrap__tags flexbox flex-row">  
                                        <view class="ulive__roundwrap ulive__mask">  
                                            <uv-icon name="shopping-cart" color="#ffdd1a" /><text class="ulive__roundtext">服饰鞋包榜第1名</text>  
                                        </view>  
                                        <view class="ulive__roundwrap ulive__mask ml-10">  
                                            <uv-icon name="level" color="#ffdd1a" /><text class="ulive__roundtext">小时榜</text>  
                                        </view>  
                                    </view>  
                                    <!-- 红包+福袋倒计时 -->  
                                    <view class="ulive__hd-livewrap__redpacket flexbox flex-row">  
                                        <view class="ulive__redpacket-item ulive__mask" @click="handleOpenRedpacket(1)">  
                                            <image class="ulive__redpacket-image" src="/static/icon-fudai.png" mode="widthFix" /><text class="ulive__redpacket-time">04:49</text>  
                                        </view>  
                                        <view class="ulive__redpacket-item ulive__mask" @click="handleOpenRedpacket(2)">  
                                            <image class="ulive__redpacket-image" src="/static/icon-hb.png" mode="widthFix" /><text class="ulive__redpacket-time">04:49</text>  
                                        </view>  
                                        <view class="ulive__redpacket-item ulive__mask center">  
                                            <image class="ulive__redpacket-image" src="/static/icon-rotate.png" mode="widthFix" /><text class="ulive__redpacket-time">04:49</text>  
                                        </view>  
                                    </view>  
                                </view>  
                                <view class="ulive__hd-livewrap__right flexbox flex-col">  
                                    <view class="ulive__roundwrap ulive__mask mr-20">  
                                        <uv-icon name="kefu-ermai" color="#fff" /><text class="ulive__roundtext ml-5">后台</text>  
                                    </view>  
                                </view>  
                            </view>  
                        </view>  

                        <!-- 底部区域 -->  
                        <view class="ulive__footlayer">  
                            <!-- 商品提示层 -->  
                            <view class="ulive__ft-livewrap-placeholder animated fadeIn">  
                                <view class="ulive__ft-livewrap-hotbuy flexbox flex-row">  
                                    <image class="gimg" :src="item.poster" mode="aspectFill" />  
                                    <view class="ginfo flex1">  
                                        <view class="flexbox flex-row"><text class="user c-ffdd1a">Andy</text><text class="c-fff">等{{item.saleNum}}人在购买</text></view>  
                                        <text class="gdesc clamp1">{{item.desc}}</text>  
                                    </view>  
                                    <view class="btn"><text class="btntext">去购买</text></view>  
                                </view>  
                            </view>  
                            <!-- 加入直播间/送礼物提示 -->  
                            <view class="ulive__ft-livewrap-animateview flexbox flex-col">  
                                <view class="ulive__ft-livewrap-animatejoin ulive__ft-livewrap-placeholder">  
                                    <view v-if="joinRoomData" class="ulive__ft-livewrap-joinroom"><text class="ulive__ft-livewrap-joinroom__text">欢迎{{joinRoomData}}加入了直播间</text></view>  
                                </view>  

                                <!-- 送礼物 -->  
                                <view class="ulive__ft-livewrap-animategift ulive__ft-livewrap-placeholder">  
                                    <view v-if="!isEmpty(sendGiftData)" class="ulive__ft-livewrap-activegift flexbox flex-row flex-alignc">  
                                        <image class="avatar" :src="sendGiftData.avatar" />  
                                        <view class="info flex1"><text class="name">{{sendGiftData.user}}</text><text class="desc">送出</text></view>  
                                        <image class="gift" :src="sendGiftData.pic" />  
                                    </view>  
                                </view>  
                            </view>  
                            <!-- 聊天浮层+商品讲解 -->  
                            <view class="ulive__ft-livewrap-mixinview flexbox flex-row">  
                                <!-- 聊天消息 -->  
                                <view class="ulive__ft-livewrap-chats flex1">  
                                    <scroll-view class="ulive__ft-livewrap-chats__scrollview flex1" scroll-y show-scrollbar="false" :scroll-into-view="scrollToView" :lower-threshold="5" @scroll="handleMsgScroll" @scrolltolower="handleMsgScrollLower">  
                                        <block v-for="(msgitem, msgidx) in item.message" :key="msgidx">  
                                            <view v-if="msgitem.type == 'notice'" class="notice" :id="`msg-${msgitem.id}`"><view class="item"><text class="noticetext">{{msgitem.content}}</text></view></view>  
                                            <view v-else-if="msgitem.type == 'gift'" class="gift" :id="`msg-${msgitem.id}`">  
                                                <view class="item">  
                                                    <text class="giftuser">{{msgitem.user}}</text>  
                                                    <text class="gifttext">送出了{{msgitem.content}}</text>  
                                                    <image class="giftimg" :src="msgitem.img" mode="widthFix" />  
                                                    <text class="giftnum">x{{msgitem.num}}</text>  
                                                </view>  
                                            </view>  
                                            <view v-else class="msg" :id="`msg-${msgitem.id}`">  
                                                <view class="item">  
                                                    <text v-if="msgitem.tag" class="tag">{{msgitem.tag}}</text>  
                                                    <text class="user">{{msgitem.user}}</text>  
                                                    <text class="text" :style="[fixTextStyle]">{{msgitem.isbuy ? '正在购买' : msgitem.content}}</text>  
                                                    <text v-if="msgitem.isbuy" class="tag tag-buy">去购买</text>  
                                                </view>  
                                            </view>  
                                        </block>  
                                    </scroll-view>  
                                    <view v-if="!isEmpty(msgUnread)" class="ulive__ft-livewrap-chats__unread" @click="handleMsgIsRead"><text class="c-eb4868 fs-24">{{msgUnread.length}}条新消息</text></view>  
                                </view>  
                                <!-- 商品讲解 -->  
                                <view v-if="isVisibleGoodsTalk" class="ulive__ft-livewrap-activegoods animated fadeInRight" id="goodsTalkID">  
                                    <view class="ulive__ft-livewrap-activegoods__hotsale flexbox flex-row">  
                                        <image class="fimg" src="/static/icon-hot.png" mode="widthFix" /><text class="c-fff fs-32">热卖 x{{item.saleNum}}</text>  
                                    </view>  
                                    <swiper class="ulive__ft-livewrap-activegoods__swiper">  
                                        <swiper-item>  
                                            <view class="ulive__ft-livewrap-activegoods__card">  
                                                <view class="gwrap" @click="toGoodsDetail">  
                                                    <image class="gimg" :src="item.poster" mode="aspectFill" />  
                                                    <view class="waves"><text class="c-fff fs-24">讲解中</text></view>  
                                                    <view class="close" @click.stop="isVisibleGoodsTalk=false"><uv-icon name="close-circle-fill" color="rgba(0, 0, 0, .3)" size="14" /></view>  
                                                </view>  
                                                <view class="ginfo flexbox flex-col">  
                                                    <text class="clamp1 fs-24">{{item.desc}}</text>  
                                                    <text class="clamp1 fs-24 c-eb4868">7天无理由退货</text>  
                                                </view>  
                                                <view class="btn flexbox flex-row"><text class="flex1 c-fff fs-28">¥79.00</text><text class="qiang">抢</text></view>  
                                            </view>  
                                        </swiper-item>  
                                    </swiper>  
                                </view>  
                            </view>  
                            <!-- 工具栏 -->  
                            <view class="ulive__ft-livewrap-toolbar flexbox flex-row">  
                                <view class="editorwrap flex1 flexbox flex-row flex-alignc">  
                                    <view class="flex1" @click="handleOpenChatbox"><text class="editorwrap-text">说点什么...</text></view>  
                                </view>  
                                <view class="btnwrap flexbox flex-row">  
                                    <view class="btn flexbox" @click="handleOpenMenus"><uv-icon name="grid" color="#3c9cff" size="22" /></view>  
                                    <view class="btn flexbox" @click="handleOpenGoods(item)"><uv-icon name="shopping-cart-fill" color="#ffaa00" size="24" /></view>  
                                    <view class="btn flexbox" @click="handleOpenGifts"><uv-icon name="gift" color="#ff0ad3" size="22" /></view>  
                                    <view class="btn flexbox"><uv-icon name="more-dot-fill" color="#efe9ff" size="18" /></view>  
                                </view>  
                            </view>  
                        </view>  
                    </swiper-item>  
                </swiper>  
            </swiper-item>  
        </swiper>  
    </view>  
</ua-layout>

OK,综上就是uni-app+vue3+nvue开发多端直播商城实例的一些分享。

作者:xiaoyan2015
链接: https://segmentfault.com/a/1190000044519351
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

继续阅读 »

前段时间有给大家分享一个Electron27+react18跨平台mateOs桌面系统后台框架,这次带来全新研发的uniapp+vue3+Nvue+pinia跨端仿抖音直播商城项目uni-welive。

https://ask.dcloud.net.cn/article/40867

编译到H5+小程序+App端效果

img

uniapp-vue3-welive全新基于uniapp+vue3+pinia+nvue+uv-ui等技术跨多端仿制抖音/微信直播商城App项目。支持全屏上下滑动切换小视频,支持编译到兼容H5+小程序+App端。

img

使用技术

  • 开发工具:HbuilderX 3.98
  • 技术框架:Uniapp+Vue3+Vite4+Nvue+Pinia
  • UI组件库:uv-ui+vk-uview
  • 弹框组件:uaPopup(uniapp封装多端弹框组件)
  • 自定义组件:uaNavbar+uaTabbar组件
  • 本地缓存:pinia-plugin-unistorage
  • 编译支持:H5+小程序+APP端

img

img

项目结构目录

img

![img](https://image-static.segmentfault.com/420/845/4208453913-6593668e44dd0_fix7320

img

img

img

入口main.js

/**  
 * 入口配置  
 */  

import { createSSRApp } from 'vue'  
import App from './App'  

// 引入Pinia状态管理  
import Pinia from '@/store'  

// 引入vk-uview-ui组件库  
import VKuview from '@/uni_modules/vk-uview-ui'  

export function createApp() {  
    const app = createSSRApp(App)  
    app.use(Pinia)  
    app.use(VKuview)  
    return {  
        app,  
        Pinia  
    }  
}

App.vue模板

<script>  
    export default {  
        globalData: {  
            // 全局设置状态栏和导航栏高度  
            statusBarH: 0,  
            customBarH: 0,  
            screenWidth: 0,  
            screenHeight: 0,  
            menuBar: null  
        },  
        onLaunch: function() {  
            console.log('App Launch')  

            // 隐藏系统tabbar  
            uni.hideTabBar()  
            this.appInit()  
        },  
        onShow: function() {  
            console.log('App Show')  
        },  
        onHide: function() {  
            console.log('App Hide')  
        },  
        onPageNotFound: function() {  
            console.log('Page Not Found', e.path)  
            uni.redirectTo({  
                url: '/pages/index/index'  
            })  
        },  
        methods: {  
            appInit: function() {  
                uni.getSystemInfo({  
                    success: (e) => {  
                        // 获取手机状态栏信息  
                        let statusBar = e.statusBarHeight || 0  
                        let customBar  
                        let menuBar  

                        // #ifndef MP  
                        customBar = statusBar + (e.osName === 'android' ? 50 : 45)  
                        // #endif  

                        // #ifdef MP-WEIXIN  
                        // 获取微信小程序胶囊按钮信息  
                        let menu = wx.getMenuButtonBoundingClientRect()  
                        // 导航栏高度 = 胶囊下距离 + 胶囊上距离 - 状态栏高度  
                        customBar = menu.bottom + menu.top - statusBar  
                        menuBar = menu  
                        // #endif  

                        // // #ifdef MP-ALIPAY  
                        customBar = statusBar + e.titleBarHeight  
                        // #endif  

                        // 兼容nvue写法(H5/小程序/APP/APP-Nvue)  
                        this.globalData.statusBarH = statusBar  
                        this.globalData.customBarH = customBar  
                        this.globalData.screenWidth = e.screenWidth  
                        this.globalData.screenHeight = e.screenHeight  
                        this.globalData.menuBar = menuBar  
                    }  
                })  
            }  
        }  
    }  
</script>  

<style>  
    /* #ifndef APP-NVUE */  
    @import 'static/fonts/iconfont.css';  
    /* #endif */  
    .nvueicon {font-family: nvueicon;}  
</style>  
<style lang="scss">  
    // 引入vk-uview-ui基础样式  
    @import 'uni_modules/vk-uview-ui/index.scss';  

    @import 'styles/reset.scss';  
    @import 'styles/layout.scss';  
</style>

img

img

img

img

img

img

img

img

img

img

img

img

uniapp+vue3直播模板

img

<ua-layout>  
    <view class="ua__swipervideo flex1">  
        <swiper  
            class="ua__swipervideo-wrap flex1"  
            :current="currentLive"  
            vertical  
            @change="handleChange"  
        >  
            <swiper-item v-for="(item, index) in liveList" :key="index">  
                <video  
                    class="ua__swipervideo-player flex1"  
                    :id="'uplayer' + index"  
                    :src="item.src"  
                    :controls="false"  
                    :loop="true"  
                    :autoplay="index == currentLive"  
                    :show-center-play-btn="false"  
                    object-fit="contain"  
                    :style="{'width': `${winWidth}px`, 'height': `${winHeight}px`}"  
                >  
                </video>  

                <!-- 浮层模块 -->  
                <swiper class="ulive__swiperscreen flex1" :current="1">  
                    <swiper-item>  
                        第一屏  
                    </swiper-item>  
                    <swiper-item>  
                        <!-- 顶部区域 -->  
                        <view class="ulive__headlayer" :style="{'top': menuBarT+'px'}">  
                            <!-- logo+关注 -->  
                            <view class="ulive__hd-liveinfo flexbox flex-row flex-alignc">  
                                <view class="ulive__hd-avatar ulive__mask flex-alignc">  
                                    <image class="logo" :src="item.logo" mode="widthFix" />  
                                    <view class="flex1 flexbox flex-col ml-10">  
                                        <text class="name">{{item.name}}</text>  
                                        <text class="zan">{{item.likeNum}}本场点赞</text>  
                                    </view>  
                                    <view class="btn flexbox flex-row flex-alignc" :class="{'active': item.isFollow}" @click="handleFollow(index)"><text class="btntext" :class="{'active': item.isFollow}">{{item.isFollow ? '已关注' : '关注'}}</text></view>  
                                </view>  
                                <view class="ulive__hd-onlineuser flex1">  
                                    <uv-icon name="close" color="#fff" @click="handleLiveQuit" />  
                                </view>  
                            </view>  
                            <view class="ulive__hd-livewrap flexbox flex-row">  
                                <view class="ulive__hd-livewrap__left flex1 flexbox flex-col">  
                                    <view class="ulive__hd-livewrap__tags flexbox flex-row">  
                                        <view class="ulive__roundwrap ulive__mask">  
                                            <uv-icon name="shopping-cart" color="#ffdd1a" /><text class="ulive__roundtext">服饰鞋包榜第1名</text>  
                                        </view>  
                                        <view class="ulive__roundwrap ulive__mask ml-10">  
                                            <uv-icon name="level" color="#ffdd1a" /><text class="ulive__roundtext">小时榜</text>  
                                        </view>  
                                    </view>  
                                    <!-- 红包+福袋倒计时 -->  
                                    <view class="ulive__hd-livewrap__redpacket flexbox flex-row">  
                                        <view class="ulive__redpacket-item ulive__mask" @click="handleOpenRedpacket(1)">  
                                            <image class="ulive__redpacket-image" src="/static/icon-fudai.png" mode="widthFix" /><text class="ulive__redpacket-time">04:49</text>  
                                        </view>  
                                        <view class="ulive__redpacket-item ulive__mask" @click="handleOpenRedpacket(2)">  
                                            <image class="ulive__redpacket-image" src="/static/icon-hb.png" mode="widthFix" /><text class="ulive__redpacket-time">04:49</text>  
                                        </view>  
                                        <view class="ulive__redpacket-item ulive__mask center">  
                                            <image class="ulive__redpacket-image" src="/static/icon-rotate.png" mode="widthFix" /><text class="ulive__redpacket-time">04:49</text>  
                                        </view>  
                                    </view>  
                                </view>  
                                <view class="ulive__hd-livewrap__right flexbox flex-col">  
                                    <view class="ulive__roundwrap ulive__mask mr-20">  
                                        <uv-icon name="kefu-ermai" color="#fff" /><text class="ulive__roundtext ml-5">后台</text>  
                                    </view>  
                                </view>  
                            </view>  
                        </view>  

                        <!-- 底部区域 -->  
                        <view class="ulive__footlayer">  
                            <!-- 商品提示层 -->  
                            <view class="ulive__ft-livewrap-placeholder animated fadeIn">  
                                <view class="ulive__ft-livewrap-hotbuy flexbox flex-row">  
                                    <image class="gimg" :src="item.poster" mode="aspectFill" />  
                                    <view class="ginfo flex1">  
                                        <view class="flexbox flex-row"><text class="user c-ffdd1a">Andy</text><text class="c-fff">等{{item.saleNum}}人在购买</text></view>  
                                        <text class="gdesc clamp1">{{item.desc}}</text>  
                                    </view>  
                                    <view class="btn"><text class="btntext">去购买</text></view>  
                                </view>  
                            </view>  
                            <!-- 加入直播间/送礼物提示 -->  
                            <view class="ulive__ft-livewrap-animateview flexbox flex-col">  
                                <view class="ulive__ft-livewrap-animatejoin ulive__ft-livewrap-placeholder">  
                                    <view v-if="joinRoomData" class="ulive__ft-livewrap-joinroom"><text class="ulive__ft-livewrap-joinroom__text">欢迎{{joinRoomData}}加入了直播间</text></view>  
                                </view>  

                                <!-- 送礼物 -->  
                                <view class="ulive__ft-livewrap-animategift ulive__ft-livewrap-placeholder">  
                                    <view v-if="!isEmpty(sendGiftData)" class="ulive__ft-livewrap-activegift flexbox flex-row flex-alignc">  
                                        <image class="avatar" :src="sendGiftData.avatar" />  
                                        <view class="info flex1"><text class="name">{{sendGiftData.user}}</text><text class="desc">送出</text></view>  
                                        <image class="gift" :src="sendGiftData.pic" />  
                                    </view>  
                                </view>  
                            </view>  
                            <!-- 聊天浮层+商品讲解 -->  
                            <view class="ulive__ft-livewrap-mixinview flexbox flex-row">  
                                <!-- 聊天消息 -->  
                                <view class="ulive__ft-livewrap-chats flex1">  
                                    <scroll-view class="ulive__ft-livewrap-chats__scrollview flex1" scroll-y show-scrollbar="false" :scroll-into-view="scrollToView" :lower-threshold="5" @scroll="handleMsgScroll" @scrolltolower="handleMsgScrollLower">  
                                        <block v-for="(msgitem, msgidx) in item.message" :key="msgidx">  
                                            <view v-if="msgitem.type == 'notice'" class="notice" :id="`msg-${msgitem.id}`"><view class="item"><text class="noticetext">{{msgitem.content}}</text></view></view>  
                                            <view v-else-if="msgitem.type == 'gift'" class="gift" :id="`msg-${msgitem.id}`">  
                                                <view class="item">  
                                                    <text class="giftuser">{{msgitem.user}}</text>  
                                                    <text class="gifttext">送出了{{msgitem.content}}</text>  
                                                    <image class="giftimg" :src="msgitem.img" mode="widthFix" />  
                                                    <text class="giftnum">x{{msgitem.num}}</text>  
                                                </view>  
                                            </view>  
                                            <view v-else class="msg" :id="`msg-${msgitem.id}`">  
                                                <view class="item">  
                                                    <text v-if="msgitem.tag" class="tag">{{msgitem.tag}}</text>  
                                                    <text class="user">{{msgitem.user}}</text>  
                                                    <text class="text" :style="[fixTextStyle]">{{msgitem.isbuy ? '正在购买' : msgitem.content}}</text>  
                                                    <text v-if="msgitem.isbuy" class="tag tag-buy">去购买</text>  
                                                </view>  
                                            </view>  
                                        </block>  
                                    </scroll-view>  
                                    <view v-if="!isEmpty(msgUnread)" class="ulive__ft-livewrap-chats__unread" @click="handleMsgIsRead"><text class="c-eb4868 fs-24">{{msgUnread.length}}条新消息</text></view>  
                                </view>  
                                <!-- 商品讲解 -->  
                                <view v-if="isVisibleGoodsTalk" class="ulive__ft-livewrap-activegoods animated fadeInRight" id="goodsTalkID">  
                                    <view class="ulive__ft-livewrap-activegoods__hotsale flexbox flex-row">  
                                        <image class="fimg" src="/static/icon-hot.png" mode="widthFix" /><text class="c-fff fs-32">热卖 x{{item.saleNum}}</text>  
                                    </view>  
                                    <swiper class="ulive__ft-livewrap-activegoods__swiper">  
                                        <swiper-item>  
                                            <view class="ulive__ft-livewrap-activegoods__card">  
                                                <view class="gwrap" @click="toGoodsDetail">  
                                                    <image class="gimg" :src="item.poster" mode="aspectFill" />  
                                                    <view class="waves"><text class="c-fff fs-24">讲解中</text></view>  
                                                    <view class="close" @click.stop="isVisibleGoodsTalk=false"><uv-icon name="close-circle-fill" color="rgba(0, 0, 0, .3)" size="14" /></view>  
                                                </view>  
                                                <view class="ginfo flexbox flex-col">  
                                                    <text class="clamp1 fs-24">{{item.desc}}</text>  
                                                    <text class="clamp1 fs-24 c-eb4868">7天无理由退货</text>  
                                                </view>  
                                                <view class="btn flexbox flex-row"><text class="flex1 c-fff fs-28">¥79.00</text><text class="qiang">抢</text></view>  
                                            </view>  
                                        </swiper-item>  
                                    </swiper>  
                                </view>  
                            </view>  
                            <!-- 工具栏 -->  
                            <view class="ulive__ft-livewrap-toolbar flexbox flex-row">  
                                <view class="editorwrap flex1 flexbox flex-row flex-alignc">  
                                    <view class="flex1" @click="handleOpenChatbox"><text class="editorwrap-text">说点什么...</text></view>  
                                </view>  
                                <view class="btnwrap flexbox flex-row">  
                                    <view class="btn flexbox" @click="handleOpenMenus"><uv-icon name="grid" color="#3c9cff" size="22" /></view>  
                                    <view class="btn flexbox" @click="handleOpenGoods(item)"><uv-icon name="shopping-cart-fill" color="#ffaa00" size="24" /></view>  
                                    <view class="btn flexbox" @click="handleOpenGifts"><uv-icon name="gift" color="#ff0ad3" size="22" /></view>  
                                    <view class="btn flexbox"><uv-icon name="more-dot-fill" color="#efe9ff" size="18" /></view>  
                                </view>  
                            </view>  
                        </view>  
                    </swiper-item>  
                </swiper>  
            </swiper-item>  
        </swiper>  
    </view>  
</ua-layout>

OK,综上就是uni-app+vue3+nvue开发多端直播商城实例的一些分享。

作者:xiaoyan2015
链接: https://segmentfault.com/a/1190000044519351
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

收起阅读 »

FreePlus-二次美化

FreePlus-二次美化
这是一款适用于论坛、软件库、圈子、社群等用途,功能也是十分强大


继续阅读 »

FreePlus-二次美化
这是一款适用于论坛、软件库、圈子、社群等用途,功能也是十分强大


收起阅读 »

FreePlus-二次美化版

论坛

这是一款APP程序源码,适用于论坛、软件库、圈子、社群等用途,功能也是十分强大


继续阅读 »

这是一款APP程序源码,适用于论坛、软件库、圈子、社群等用途,功能也是十分强大


收起阅读 »

FreePlus-二次美化版

这是一款APP程序源码,适用于论坛、软件库、圈子、社群等用途,功能也是十分强大
全新UI
板块需增加的出格文章
主页去掉了多余的功能

  • 邮箱联系方式uffyfctvu@163.com
继续阅读 »

这是一款APP程序源码,适用于论坛、软件库、圈子、社群等用途,功能也是十分强大
全新UI
板块需增加的出格文章
主页去掉了多余的功能

  • 邮箱联系方式uffyfctvu@163.com
收起阅读 »

ios厂商推送的P12证书过期后,重新生成的推送证书上传失败

推送 iOS证书 unipush

ios厂商推送的P12证书过期后,重新生成的推送证书上传失败
附图:

  1. 上传失败
  2. 控制台信息
  3. 网络响应信息
继续阅读 »

ios厂商推送的P12证书过期后,重新生成的推送证书上传失败
附图:

  1. 上传失败
  2. 控制台信息
  3. 网络响应信息
收起阅读 »

一定要用真的ChatGPT

ChatGPT

各种AI乌烟瘴气,大部分打着ChatGPT的幌子,全都是假的,验证很简单,你只需要提问:‘你是ChatGPT吗’

各种AI乌烟瘴气,大部分打着ChatGPT的幌子,全都是假的,验证很简单,你只需要提问:‘你是ChatGPT吗’

User Friendly大会 | 每日互动刘宇分享AIGC时代的数智营销变革

近日,第十九届暨2023年User Friendly国际用户体验大会在深圳召开。本次大会以“开智启能,体验无界”为主题,邀请了各行业领袖精英齐聚,分享前沿新观点,碰撞体验新思潮。每日互动高级副总裁刘宇作为业内资深专家,受邀出席大会并在数据智能论坛发表主题演讲,分享AIGC时代的数智营销变革及发展机遇。


▲每日互动高级副总裁刘宇现场发表主题演讲

                                                                                                                               1  

                                                                                                           AIGC带来全新用户体验变革  

以AIGC和大模型为代表的新一代技术浪潮,给很多行业和领域都带了巨大变革。以用户的人机交互体验举例,历经点击时代、触摸时代,现在我们已经进入到了全新的自然语言时代。我们能够和Siri等AI应用以及chatGPT等大模型产品直接进行自然语言对话,开启智能、高效的人机协作模式。

同样,AIGC和大模型也给营销行业带来了深刻的体验变革。AI创意生成、数字人直播、AI智能外呼……这些创新应用使得整个营销行业的生产效率有了质的飞跃。刘宇表示,“虽然AI生成的创意素材可能是快餐式的,内容的质量目前还比不上专业的设计师和创意人员,但是AI生成的创意内容是真正意义上的‘数字原生’内容,这个意义是巨大的”。

刘宇讲到,“以前,我们要探究某个广告创意为什么点击率很高,需要投入非常复杂的工作,首先需要对该广告创意进行标签化,通过OCR技术、识图软件等进行模式识别,分析该广告创意在相应的维度上具备哪些属性,根据这些属性构建出一个数据空间,然后我们再从这个数据空间中挖掘规律,分析原因,根据这些规律指导后续广告创意的优化和制作。而现在AI生成的创意内容由于其本身是‘数字原生’的,因此我们能够非常容易地使用算法、模型等数据化的方式来分析其点击率高低背后的原因,再加上AIGC带来的指数级效率提升,都有力驱动着数智营销行业的深层次变革”。

                                                                                                                                2  

                                                                                                                AI不止GC,更有TA  

“AIGC和大模型给数智营销行业带来的红利,不仅体现在广告创意的生成方面”。活动现场,刘宇表示,“每日互动最新推出的一款叫做“AITA智选人群”的大模型应用产品,让AI不仅能够GC,还能TA”。

“TA即Targeting Audience”。刘宇介绍,在品牌营销领域,人群定向一直是备受关注的课题。如何从茫茫人海中定向找到目标消费者,把广告投给对的TA?针对品牌主的切实需求,每日互动发挥自身能力优势,从2019年起就面向品牌主提供第三方DMP数智营销服务。依托海量的三方数据积累,每日互动帮助品牌广告主进行人群洞察和广告投放的前验,通过标签、联合建模等方式,帮助品牌主智能圈选和定向目标TA。

但是,在具体的实施过程中,这两种人群定向的方式都存在一定门槛。“标签定向”方式,需要由品牌营销人员根据自己对消费者的认知以及对每日互动数据的理解,来进行标签的勾选、组合,对于营销人员的专业性有一定要求,而且还可能涉及到较多与咨询团队、数据分析团队的人工沟通。

另一种“联合建模”的方式则需要品牌提供一方种子数据作为前提,每日互动通过机器学习为其进行分析并扩量。然而在新品推广等一些特定的营销场景下,品牌主通常缺少种子用户,也并不清楚自己的目标消费人群。

“AITA就能够很好地解决这一问题”。刘宇介绍,在AITA这款产品中,每日互动使用了大模型去赋予它对自然语义的理解,并使用了数据编织技术去实现数据空间的语义化,让市场营销等领域从业者的奇思妙想,都能够通过与大模型对话的方式,转化到数据空间的数据实体、数据标签,进而对应到目标人群,实现了“无种子洞察”和“对话式提人”等创新功能。

刘宇介绍,“与AI大模型的使用体验类似,用户通过自然语言对话就可以快速上手,通过AITA进入到数据智能的世界。AITA同时也融入了更为严谨的人群定义和预估功能,让客户在使用AITA时,既有轻松活泼的对话过程,也有严谨高效的定量部分,能够更为丝滑地完成市场分析、洞察和媒体对接等过程,也让营销领域能够更早地享受到AI大模型带来的红利”。

刘宇讲到,“因此,不仅仅是在产品和体验本身,用户体验设计从更大的社会层面和人文层面来讲,都有重大意义”。如今,数据成为重要的生产要素,AI极大提升了社会生产力,而用户体验更加关注人本身,三者的有机融合将更加有效地促进经济社会发展,帮助企业赢得商业成功。每日互动也将持续探索AI大模型和数据智能在行业里的应用落地,用数据和技术的力量推动社会持续进步。

继续阅读 »

近日,第十九届暨2023年User Friendly国际用户体验大会在深圳召开。本次大会以“开智启能,体验无界”为主题,邀请了各行业领袖精英齐聚,分享前沿新观点,碰撞体验新思潮。每日互动高级副总裁刘宇作为业内资深专家,受邀出席大会并在数据智能论坛发表主题演讲,分享AIGC时代的数智营销变革及发展机遇。


▲每日互动高级副总裁刘宇现场发表主题演讲

                                                                                                                               1  

                                                                                                           AIGC带来全新用户体验变革  

以AIGC和大模型为代表的新一代技术浪潮,给很多行业和领域都带了巨大变革。以用户的人机交互体验举例,历经点击时代、触摸时代,现在我们已经进入到了全新的自然语言时代。我们能够和Siri等AI应用以及chatGPT等大模型产品直接进行自然语言对话,开启智能、高效的人机协作模式。

同样,AIGC和大模型也给营销行业带来了深刻的体验变革。AI创意生成、数字人直播、AI智能外呼……这些创新应用使得整个营销行业的生产效率有了质的飞跃。刘宇表示,“虽然AI生成的创意素材可能是快餐式的,内容的质量目前还比不上专业的设计师和创意人员,但是AI生成的创意内容是真正意义上的‘数字原生’内容,这个意义是巨大的”。

刘宇讲到,“以前,我们要探究某个广告创意为什么点击率很高,需要投入非常复杂的工作,首先需要对该广告创意进行标签化,通过OCR技术、识图软件等进行模式识别,分析该广告创意在相应的维度上具备哪些属性,根据这些属性构建出一个数据空间,然后我们再从这个数据空间中挖掘规律,分析原因,根据这些规律指导后续广告创意的优化和制作。而现在AI生成的创意内容由于其本身是‘数字原生’的,因此我们能够非常容易地使用算法、模型等数据化的方式来分析其点击率高低背后的原因,再加上AIGC带来的指数级效率提升,都有力驱动着数智营销行业的深层次变革”。

                                                                                                                                2  

                                                                                                                AI不止GC,更有TA  

“AIGC和大模型给数智营销行业带来的红利,不仅体现在广告创意的生成方面”。活动现场,刘宇表示,“每日互动最新推出的一款叫做“AITA智选人群”的大模型应用产品,让AI不仅能够GC,还能TA”。

“TA即Targeting Audience”。刘宇介绍,在品牌营销领域,人群定向一直是备受关注的课题。如何从茫茫人海中定向找到目标消费者,把广告投给对的TA?针对品牌主的切实需求,每日互动发挥自身能力优势,从2019年起就面向品牌主提供第三方DMP数智营销服务。依托海量的三方数据积累,每日互动帮助品牌广告主进行人群洞察和广告投放的前验,通过标签、联合建模等方式,帮助品牌主智能圈选和定向目标TA。

但是,在具体的实施过程中,这两种人群定向的方式都存在一定门槛。“标签定向”方式,需要由品牌营销人员根据自己对消费者的认知以及对每日互动数据的理解,来进行标签的勾选、组合,对于营销人员的专业性有一定要求,而且还可能涉及到较多与咨询团队、数据分析团队的人工沟通。

另一种“联合建模”的方式则需要品牌提供一方种子数据作为前提,每日互动通过机器学习为其进行分析并扩量。然而在新品推广等一些特定的营销场景下,品牌主通常缺少种子用户,也并不清楚自己的目标消费人群。

“AITA就能够很好地解决这一问题”。刘宇介绍,在AITA这款产品中,每日互动使用了大模型去赋予它对自然语义的理解,并使用了数据编织技术去实现数据空间的语义化,让市场营销等领域从业者的奇思妙想,都能够通过与大模型对话的方式,转化到数据空间的数据实体、数据标签,进而对应到目标人群,实现了“无种子洞察”和“对话式提人”等创新功能。

刘宇介绍,“与AI大模型的使用体验类似,用户通过自然语言对话就可以快速上手,通过AITA进入到数据智能的世界。AITA同时也融入了更为严谨的人群定义和预估功能,让客户在使用AITA时,既有轻松活泼的对话过程,也有严谨高效的定量部分,能够更为丝滑地完成市场分析、洞察和媒体对接等过程,也让营销领域能够更早地享受到AI大模型带来的红利”。

刘宇讲到,“因此,不仅仅是在产品和体验本身,用户体验设计从更大的社会层面和人文层面来讲,都有重大意义”。如今,数据成为重要的生产要素,AI极大提升了社会生产力,而用户体验更加关注人本身,三者的有机融合将更加有效地促进经济社会发展,帮助企业赢得商业成功。每日互动也将持续探索AI大模型和数据智能在行业里的应用落地,用数据和技术的力量推动社会持续进步。

收起阅读 »

安卓系统获取海拔高度

function getAltitudeFromAndroidSystem() {  
    let LocationManager = plus.android.importClass("android.location.LocationManager");  
    let Context = plus.android.importClass("android.content.Context");  
    let main = plus.android.runtimeMainActivity();  
    let locationManager = main.getSystemService(Context.LOCATION_SERVICE);  
    let location = locationManager.getLastKnownLocation(LocationManager  
        .GPS_PROVIDER);  
    let altitude = plus.android.invoke(location, "getAltitude");  
    let hasAltitude = plus.android.invoke(location, "hasAltitude");  
    plus.android.deleteObject(LocationManager);  
    plus.android.deleteObject(Context);  
    if(hasAltitude) {  
        return altitude;  
    } else {  
        return 0;  
    }  
}
继续阅读 »
function getAltitudeFromAndroidSystem() {  
    let LocationManager = plus.android.importClass("android.location.LocationManager");  
    let Context = plus.android.importClass("android.content.Context");  
    let main = plus.android.runtimeMainActivity();  
    let locationManager = main.getSystemService(Context.LOCATION_SERVICE);  
    let location = locationManager.getLastKnownLocation(LocationManager  
        .GPS_PROVIDER);  
    let altitude = plus.android.invoke(location, "getAltitude");  
    let hasAltitude = plus.android.invoke(location, "hasAltitude");  
    plus.android.deleteObject(LocationManager);  
    plus.android.deleteObject(Context);  
    if(hasAltitude) {  
        return altitude;  
    } else {  
        return 0;  
    }  
}
收起阅读 »

这种复杂的聚合查询有什么优化建议吗?

uniCloud

let q_filter = await db.collection('queen-group').aggregate().match({
_id: queen_id
}).project({
_id: true,
openid: true
})
.lookup({
from: 'queen-group-admin',
let: {
queen_id: '$_id'
},
pipeline: $.pipeline()
.match(
dbCmd.expr($.and([$.eq(['$queen_id', '$$queen_id']), $.eq(['$admin_is_delete',
false
]), $.eq(['$admin_status', true])]))
).project({
admin_openid: 1,
admin_name: 1
}).lookup({
from: 'queen-user',
let: {
admin_openid: '$admin_openid'
},
pipeline: $.pipeline()
.match(
dbCmd.expr($.eq(['$openid', '$$admin_openid']))
).project({
nickName: 1,
p_openid: 1,
subscribe: 1
}).done(),
as: 'user_info',
}).done(),
as: 'q_admin'
})
.lookup({
from: 'queen-group-business',
let: {
queen_id: '$_id'
},
pipeline: $.pipeline()
.match(
dbCmd.expr($.and([$.eq(['$queen_id', '$$queen_id']), $.eq(['$b_is_delete',
false
]), $.eq(['$b_status', true])]))
)
.sort({
sort: -1
})
.project({
b_name: 1,
})
.done(),
as: 'q_business',
})
.lookup({
from: 'queen-group-window',
let: {
queen_id: '$_id'
},
pipeline: $.pipeline()
.match(
dbCmd.expr($.and([$.eq(['$$queen_id', '$queen_id']), $.eq(['$w_is_delete',
false
])]))
)
.sort({
sort: -1
})
.project({
w_name: 1,
w_include: 1
})
.done(),
as: 'q_window',
})
.lookup({
from: 'queen-user',
let: {
openid: '$openid'
},
pipeline: $.pipeline()
.match(
dbCmd.expr(($.eq(['$openid', '$$openid'])))
)
.project({
nickName: 1,
avatarUrl: 1,
openid: 1
})
.done(),
as: 'q_create_user',
})
.end()

let q_order = await db.collection('queen-call-order').aggregate()
.match(dbCmd.and(match_list, dbCmd.or([{
order_pre_num: search ? new RegExp(search, 'gi') : search
}, {
'user_info.value': search ? new RegExp(search, 'gi') : search
}])))
.sort({
order_time: _sort
})
.skip(pagination.current * pagination.pageSize)
.limit(pagination.pageSize)
.lookup({
from: 'queen-group-business',
let: {
work_id: '$work_id'
},
pipeline: $.pipeline()
.match(
dbCmd.expr($.eq(['$_id', '$$work_id']))
)
.sort({
sort: -1
})
.project({
b_name: 1,
})
.done(),
as: 'business_info',
})
.lookup({
from: 'queen-call-order-log',
let: {
log_id: '$_id'
},
pipeline: $.pipeline()
.match(
dbCmd.expr(($.eq(['$order_id', '$$log_id'])))
)
.project({
create_time: 1,
current_state: 1
})
.done(),
as: 'q_order_log',
})
.lookup({
from: 'queen-user',
let: {
openid: '$openid'
},
pipeline: $.pipeline()
.match(
dbCmd.expr(($.eq(['$openid', '$$openid'])))
)
.project({
nickName: 1,
avatarUrl: 1,
cid: 1,
p_openid: 1,
subscribe: 1
})
.done(),
as: 'order_user',
})
.lookup({
from: 'queen-group-admin',
let: {
complete_openid: '$complete_openid',
queen_id: '$queen_id'
},
pipeline: $.pipeline()
.match(
dbCmd.expr(($.and([$.eq(['$admin_openid', '$$complete_openid']), $.eq(['$queen_id',
'$$queen_id'
]), $.eq(['$admin_is_delete', false])])))
)
.lookup({
from: 'queen-user',
let: {
admin_openid: '$admin_openid'
},
pipeline: $.pipeline()
.match(
dbCmd.expr(($.eq(['$openid', '$$admin_openid'])))
)
.project({
nickName: 1,
avatarUrl: 1,
cid: 1,
p_openid: 1,

继续阅读 »

let q_filter = await db.collection('queen-group').aggregate().match({
_id: queen_id
}).project({
_id: true,
openid: true
})
.lookup({
from: 'queen-group-admin',
let: {
queen_id: '$_id'
},
pipeline: $.pipeline()
.match(
dbCmd.expr($.and([$.eq(['$queen_id', '$$queen_id']), $.eq(['$admin_is_delete',
false
]), $.eq(['$admin_status', true])]))
).project({
admin_openid: 1,
admin_name: 1
}).lookup({
from: 'queen-user',
let: {
admin_openid: '$admin_openid'
},
pipeline: $.pipeline()
.match(
dbCmd.expr($.eq(['$openid', '$$admin_openid']))
).project({
nickName: 1,
p_openid: 1,
subscribe: 1
}).done(),
as: 'user_info',
}).done(),
as: 'q_admin'
})
.lookup({
from: 'queen-group-business',
let: {
queen_id: '$_id'
},
pipeline: $.pipeline()
.match(
dbCmd.expr($.and([$.eq(['$queen_id', '$$queen_id']), $.eq(['$b_is_delete',
false
]), $.eq(['$b_status', true])]))
)
.sort({
sort: -1
})
.project({
b_name: 1,
})
.done(),
as: 'q_business',
})
.lookup({
from: 'queen-group-window',
let: {
queen_id: '$_id'
},
pipeline: $.pipeline()
.match(
dbCmd.expr($.and([$.eq(['$$queen_id', '$queen_id']), $.eq(['$w_is_delete',
false
])]))
)
.sort({
sort: -1
})
.project({
w_name: 1,
w_include: 1
})
.done(),
as: 'q_window',
})
.lookup({
from: 'queen-user',
let: {
openid: '$openid'
},
pipeline: $.pipeline()
.match(
dbCmd.expr(($.eq(['$openid', '$$openid'])))
)
.project({
nickName: 1,
avatarUrl: 1,
openid: 1
})
.done(),
as: 'q_create_user',
})
.end()

let q_order = await db.collection('queen-call-order').aggregate()
.match(dbCmd.and(match_list, dbCmd.or([{
order_pre_num: search ? new RegExp(search, 'gi') : search
}, {
'user_info.value': search ? new RegExp(search, 'gi') : search
}])))
.sort({
order_time: _sort
})
.skip(pagination.current * pagination.pageSize)
.limit(pagination.pageSize)
.lookup({
from: 'queen-group-business',
let: {
work_id: '$work_id'
},
pipeline: $.pipeline()
.match(
dbCmd.expr($.eq(['$_id', '$$work_id']))
)
.sort({
sort: -1
})
.project({
b_name: 1,
})
.done(),
as: 'business_info',
})
.lookup({
from: 'queen-call-order-log',
let: {
log_id: '$_id'
},
pipeline: $.pipeline()
.match(
dbCmd.expr(($.eq(['$order_id', '$$log_id'])))
)
.project({
create_time: 1,
current_state: 1
})
.done(),
as: 'q_order_log',
})
.lookup({
from: 'queen-user',
let: {
openid: '$openid'
},
pipeline: $.pipeline()
.match(
dbCmd.expr(($.eq(['$openid', '$$openid'])))
)
.project({
nickName: 1,
avatarUrl: 1,
cid: 1,
p_openid: 1,
subscribe: 1
})
.done(),
as: 'order_user',
})
.lookup({
from: 'queen-group-admin',
let: {
complete_openid: '$complete_openid',
queen_id: '$queen_id'
},
pipeline: $.pipeline()
.match(
dbCmd.expr(($.and([$.eq(['$admin_openid', '$$complete_openid']), $.eq(['$queen_id',
'$$queen_id'
]), $.eq(['$admin_is_delete', false])])))
)
.lookup({
from: 'queen-user',
let: {
admin_openid: '$admin_openid'
},
pipeline: $.pipeline()
.match(
dbCmd.expr(($.eq(['$openid', '$$admin_openid'])))
)
.project({
nickName: 1,
avatarUrl: 1,
cid: 1,
p_openid: 1,

收起阅读 »

【解决】ios端video,seek定位到之前位置,显示播放的进度为00:00

video iOS

来源:https://ask.dcloud.net.cn/question/80013的“CLP”的评论
seek api 只有播放时才会更改视频轴的位置。

this.videoContext = uni.createVideoContext('myVideo', this);  
this.videoContext.play();  
this.videoContext.seek(10);  
this.videoContext.pause();

↓↓↓ 各位大佬点点赞

继续阅读 »

来源:https://ask.dcloud.net.cn/question/80013的“CLP”的评论
seek api 只有播放时才会更改视频轴的位置。

this.videoContext = uni.createVideoContext('myVideo', this);  
this.videoContext.play();  
this.videoContext.seek(10);  
this.videoContext.pause();

↓↓↓ 各位大佬点点赞

收起阅读 »

如何将uniapp转uniapp x?

uniapp x挺好,不过我怎么将已有的项目转到uniapp x上?我们经过研究,认为无法完成转换,下面是一些主要困难。

  1. 引用的三方npm js库,这个是最难的,基本无解,我们引用的三方库大部分没有ts版的,少部分有ts版的,就算是有ts版的,也无法使用,因为uts的语法只是ts的子集,等你编译的时候,你会发现n多语法错误。由于这些都是第三方的,我们基本无法修改,唯一的解决办法,就是用uts重写一套,这基本上是不可能做到的。
  2. 引用的三方UI库,由于使用了三方UI,如果要转X,就必须重新做所有的UI,这个可以实现,就是从头再做一遍UI,重新开发
  3. 自己的业务代码,这个是最好解决的 ,就是将JS转成UTS代码,不过也需要大量的时间去做,然后重新做测试。

综上所述,对于已有的项目转uniapp x基本上就是重做,有可能就算想重做也做不出来,因为依赖了一些核心js库,这个js库我们无法自己写,又找不到UTS版的。不知道各位大神有什么好的解决方案!

另外,对于uniapp x的发展,提一些建议,就是不要放弃uniapp的发展,一定要支持鸿蒙next,否则会流失大量的用户。先不说老用户难以将uniapp转为uniapp x,就算是新用户,开发一个新的app,不能不用第三方库,而现在uts三方库基本为0,难道都要重新发明轮子?不要觉得ts库可以拿来用,uts有很多的ts语法都不支持,而现有的ts库,如果不做修改,你都用不了,除非现在的ts库作者再出一版uts版。而UI和业务代码,对于新用户而言,倒是可以克服的。

总之,从一个开发者角度讲,我认为uniapp x从发展到成熟时间不会短。我不是很理解,uniapp已经趋向成熟了,随着未来硬件发展,性能将不成问题,要知道基本上小厂才会使用uniapp,不那么在意性能。对于大厂,就算你搞了X,人家也不用。

现在搞个uniapp x,从头开始再玩一次?等你成熟了,发现已经进入云时代了,所有的应用都变成云应用了,性能已经不那么重要了。还有,你不玩uniapp,人家微信愿意玩,donut正在如火如荼的搞,我相信donut一定会适配鸿蒙的,现在我也不得不开始学习一下donut了,一旦uniapp不适配鸿蒙,还有个后路啊。

继续阅读 »

uniapp x挺好,不过我怎么将已有的项目转到uniapp x上?我们经过研究,认为无法完成转换,下面是一些主要困难。

  1. 引用的三方npm js库,这个是最难的,基本无解,我们引用的三方库大部分没有ts版的,少部分有ts版的,就算是有ts版的,也无法使用,因为uts的语法只是ts的子集,等你编译的时候,你会发现n多语法错误。由于这些都是第三方的,我们基本无法修改,唯一的解决办法,就是用uts重写一套,这基本上是不可能做到的。
  2. 引用的三方UI库,由于使用了三方UI,如果要转X,就必须重新做所有的UI,这个可以实现,就是从头再做一遍UI,重新开发
  3. 自己的业务代码,这个是最好解决的 ,就是将JS转成UTS代码,不过也需要大量的时间去做,然后重新做测试。

综上所述,对于已有的项目转uniapp x基本上就是重做,有可能就算想重做也做不出来,因为依赖了一些核心js库,这个js库我们无法自己写,又找不到UTS版的。不知道各位大神有什么好的解决方案!

另外,对于uniapp x的发展,提一些建议,就是不要放弃uniapp的发展,一定要支持鸿蒙next,否则会流失大量的用户。先不说老用户难以将uniapp转为uniapp x,就算是新用户,开发一个新的app,不能不用第三方库,而现在uts三方库基本为0,难道都要重新发明轮子?不要觉得ts库可以拿来用,uts有很多的ts语法都不支持,而现有的ts库,如果不做修改,你都用不了,除非现在的ts库作者再出一版uts版。而UI和业务代码,对于新用户而言,倒是可以克服的。

总之,从一个开发者角度讲,我认为uniapp x从发展到成熟时间不会短。我不是很理解,uniapp已经趋向成熟了,随着未来硬件发展,性能将不成问题,要知道基本上小厂才会使用uniapp,不那么在意性能。对于大厂,就算你搞了X,人家也不用。

现在搞个uniapp x,从头开始再玩一次?等你成熟了,发现已经进入云时代了,所有的应用都变成云应用了,性能已经不那么重要了。还有,你不玩uniapp,人家微信愿意玩,donut正在如火如荼的搞,我相信donut一定会适配鸿蒙的,现在我也不得不开始学习一下donut了,一旦uniapp不适配鸿蒙,还有个后路啊。

收起阅读 »

每日互动智能文案推荐算法获评2023年“数据+”行业应用优秀案例

数据交互

12月27日,2024中国信通院ICT深度观察报告会“用户权益保护分论坛”在北京开幕。来自工信部、信通院、泰尔终端实验室、电信终端产业协会等主管部门和行业协会机构的专家领导,以及产业上下游的企业代表共聚一堂,深度交流和探讨个人信息安全、用户权益保护以及数据要素价值流通等相关热点话题。

论坛现场还重磅发布了用户权益保护系列标准以及“智御”个人信息保护大模型,为产业健康发展注入新力量。每日互动(个推)、阿里云、百度等头部企业共同参与了“智御”大模型的共建共享仪式。同时,每日互动高级副总裁刘宇也受邀出席本次活动,并发表主题演讲,分享了公司在数据安全合规、数据要素价值提取等方面的最新探索与实践。


▲每日互动高级副总裁金岩(左一)上台参与个人信息保护“智御”大模型共建共享仪式


▲每日互动高级副总裁刘宇现场发表主题演讲
随着“互联网+”与各行业的深度融合及数字经济的快速发展,个人信息保护已经成为用户最关心最直接最现实的利益问题之一。如何在保障个人信息安全、切实维护好用户合法权益的同时,充分挖掘和释放数据要素价值,成为当前数字经济高质量发展亟需解决的难题。

针对此问题,刘宇在现场演讲中表示,“个人信息保护和数字经济产业的健康发展需要行业各方协同发力。每日互动一直高度重视个人信息保护和数据安全。我们建立了全链路的数据安全防护机制,不断夯实产品和服务的安全合规能力,同时还结合新技术和新模式,对如何高效提取和释放数据价值、让数据价值安全流转等课题进行了大量的研究、探索。尤其是在数据匿名化和多方数据的联合计算方向,我们和行业伙伴一起进行了深度共创,在具体的业务场景中对相关技术和模式进行了充分验证,取得了一定的实践成果”。

                                                                                                                 1  

                                                                                      采用数据匿名化技术和中立国模式,  

                                                                                                        护航数据安全  

“数据匿名化能够防止数据被追踪,是数据安全使用的核心基础,而完善的标识体系则是实现数据匿名化的可行路径”。刘宇介绍,为了进一步落实“数安法”“个保法”等相关法律法规要求,每日互动已经在使用新一代的标识体系开展业务,“这种全新的标识体系由权威机构提供服务,它设置了严格的受控机制、过期机制和匿名机制,实现了数据的匿名化和模糊化,能够防止数据被追踪,符合个人信息保护规范,使用户隐私权益得到有效保护,也进一步提升了公司业务的合规水平”。

同时,标识体系也是数据价值流通的载体。为了实现数据价值提取和流通过程中的安全、合规,“我们还采用了一种叫做‘大数据联合计算(中立国)’的模式,在可信的中立计算环境中生成匿名化ID,与行业客户开展多方数据的融合计算,让‘数据价值流转而数据不流转’”。刘宇强调,这其中监管方、业务方、技术方之间做到了“三隔离”,在可信环境中生成的匿名化ID也只适用当前计算场景,模型、算法等数据计算结果经严格审核后输出,原始数据消除,让“数据可用不可拥”,使得数据价值提取和流通的整个链路做到了边界清晰、高度可控。

                                                                                                          2  

                                                                            创新数据场景应用,让数好用,把数用好  

刘宇还对整个数据要素市场和产业链进行了全局分析,他表示,“在从数据资源到数据资产再到数据要素的大循环当中,数据经历了从采集到加工、处理、流通再到分析、应用等各个环节,包括数据源方、数据处理方、数据应用方等在内的产业链上下游企业均参与其中。因此,要释放数据要素价值,需要各方力量从各个层面、各个环节共同发力”。

数据智能服务商每日互动作为产业链中的重要角色,一方面通过数据匿名化技术和“中立国”模式提供的可信计算环境,与其他数据源方实现数据融合;另一方面也打造数据智能操作系统,输出数据治理、加工能力和数据应用经验、Domain Know-how,帮助相关政府部门和行业客户等数据需求方更加便捷、高效地进行数据治理和挖掘,加速数据应用创新。

刘宇介绍,“目前,我们已经与互联网、品牌营销、智慧交通等行业的众多客户和伙伴合作,基于数据匿名化技术和中立国模式等,在安全、合规的前提下实现‘让数好用,把数用好’,推动数据要素价值释放和数字经济产业发展。”

比如,在品牌营销行业,每日互动在筑牢安全基石的前提下,携手快消、美妆、母婴等行业客户,开展多方画像联合统计、联合建模、多触点投放归因分析等数智营销实践。“每日互动拥有海量的三方数据,和品牌广告主的一方数据安全融合后,进行联合建模,搭建购买预测模型,从而帮助品牌主从茫茫人海中找到高潜力购买人群;同时,通过与媒体投放回流数据等进行融合计算、多方验证,还可以帮助品牌主更加清晰、透明地量化投放效果。另外,在每日互动数据能力的加持下,品牌广告主能够从更多的维度深入洞察细分人群的兴趣偏好和内在需求,制定出更加有效的营销策略,有数可依地科学改进产品体验、优化广告创意,帮助提升品牌营销效能的同时,切实保障好消费者权益”。

值得一提的是,2024中国信通院ICT深度观察报告会·深圳分会场也同期举办。分会场上发布了“2023年‘数据+’行业应用优秀案例”,每日互动申报的「智能文案推荐算法」「大数据赋能蒙牛乳制品品牌精准投放」两个案例双双获评“2023年‘数据+’行业应用优秀案例”。


▲案例获奖证书

这两个案例正是每日互动结合数据匿名化等新技术和大数据联合计算(中立国)等新模式,让数好用,把数用好,安全提取、充分释放数据要素价值,增能垂直行业发展的生动实践。

“大数据有大责任”。每日互动深知个人信息保护和数据安全责任重大,未来公司将持续落实相关法律法规要求,同时加强技术研究和创新,积极与生态伙伴展开交流合作,在充分保障用户权益与数据安全合规的前提下,进一步发挥出数据要素乘数效应,推动数字经济高质量发展。

继续阅读 »

12月27日,2024中国信通院ICT深度观察报告会“用户权益保护分论坛”在北京开幕。来自工信部、信通院、泰尔终端实验室、电信终端产业协会等主管部门和行业协会机构的专家领导,以及产业上下游的企业代表共聚一堂,深度交流和探讨个人信息安全、用户权益保护以及数据要素价值流通等相关热点话题。

论坛现场还重磅发布了用户权益保护系列标准以及“智御”个人信息保护大模型,为产业健康发展注入新力量。每日互动(个推)、阿里云、百度等头部企业共同参与了“智御”大模型的共建共享仪式。同时,每日互动高级副总裁刘宇也受邀出席本次活动,并发表主题演讲,分享了公司在数据安全合规、数据要素价值提取等方面的最新探索与实践。


▲每日互动高级副总裁金岩(左一)上台参与个人信息保护“智御”大模型共建共享仪式


▲每日互动高级副总裁刘宇现场发表主题演讲
随着“互联网+”与各行业的深度融合及数字经济的快速发展,个人信息保护已经成为用户最关心最直接最现实的利益问题之一。如何在保障个人信息安全、切实维护好用户合法权益的同时,充分挖掘和释放数据要素价值,成为当前数字经济高质量发展亟需解决的难题。

针对此问题,刘宇在现场演讲中表示,“个人信息保护和数字经济产业的健康发展需要行业各方协同发力。每日互动一直高度重视个人信息保护和数据安全。我们建立了全链路的数据安全防护机制,不断夯实产品和服务的安全合规能力,同时还结合新技术和新模式,对如何高效提取和释放数据价值、让数据价值安全流转等课题进行了大量的研究、探索。尤其是在数据匿名化和多方数据的联合计算方向,我们和行业伙伴一起进行了深度共创,在具体的业务场景中对相关技术和模式进行了充分验证,取得了一定的实践成果”。

                                                                                                                 1  

                                                                                      采用数据匿名化技术和中立国模式,  

                                                                                                        护航数据安全  

“数据匿名化能够防止数据被追踪,是数据安全使用的核心基础,而完善的标识体系则是实现数据匿名化的可行路径”。刘宇介绍,为了进一步落实“数安法”“个保法”等相关法律法规要求,每日互动已经在使用新一代的标识体系开展业务,“这种全新的标识体系由权威机构提供服务,它设置了严格的受控机制、过期机制和匿名机制,实现了数据的匿名化和模糊化,能够防止数据被追踪,符合个人信息保护规范,使用户隐私权益得到有效保护,也进一步提升了公司业务的合规水平”。

同时,标识体系也是数据价值流通的载体。为了实现数据价值提取和流通过程中的安全、合规,“我们还采用了一种叫做‘大数据联合计算(中立国)’的模式,在可信的中立计算环境中生成匿名化ID,与行业客户开展多方数据的融合计算,让‘数据价值流转而数据不流转’”。刘宇强调,这其中监管方、业务方、技术方之间做到了“三隔离”,在可信环境中生成的匿名化ID也只适用当前计算场景,模型、算法等数据计算结果经严格审核后输出,原始数据消除,让“数据可用不可拥”,使得数据价值提取和流通的整个链路做到了边界清晰、高度可控。

                                                                                                          2  

                                                                            创新数据场景应用,让数好用,把数用好  

刘宇还对整个数据要素市场和产业链进行了全局分析,他表示,“在从数据资源到数据资产再到数据要素的大循环当中,数据经历了从采集到加工、处理、流通再到分析、应用等各个环节,包括数据源方、数据处理方、数据应用方等在内的产业链上下游企业均参与其中。因此,要释放数据要素价值,需要各方力量从各个层面、各个环节共同发力”。

数据智能服务商每日互动作为产业链中的重要角色,一方面通过数据匿名化技术和“中立国”模式提供的可信计算环境,与其他数据源方实现数据融合;另一方面也打造数据智能操作系统,输出数据治理、加工能力和数据应用经验、Domain Know-how,帮助相关政府部门和行业客户等数据需求方更加便捷、高效地进行数据治理和挖掘,加速数据应用创新。

刘宇介绍,“目前,我们已经与互联网、品牌营销、智慧交通等行业的众多客户和伙伴合作,基于数据匿名化技术和中立国模式等,在安全、合规的前提下实现‘让数好用,把数用好’,推动数据要素价值释放和数字经济产业发展。”

比如,在品牌营销行业,每日互动在筑牢安全基石的前提下,携手快消、美妆、母婴等行业客户,开展多方画像联合统计、联合建模、多触点投放归因分析等数智营销实践。“每日互动拥有海量的三方数据,和品牌广告主的一方数据安全融合后,进行联合建模,搭建购买预测模型,从而帮助品牌主从茫茫人海中找到高潜力购买人群;同时,通过与媒体投放回流数据等进行融合计算、多方验证,还可以帮助品牌主更加清晰、透明地量化投放效果。另外,在每日互动数据能力的加持下,品牌广告主能够从更多的维度深入洞察细分人群的兴趣偏好和内在需求,制定出更加有效的营销策略,有数可依地科学改进产品体验、优化广告创意,帮助提升品牌营销效能的同时,切实保障好消费者权益”。

值得一提的是,2024中国信通院ICT深度观察报告会·深圳分会场也同期举办。分会场上发布了“2023年‘数据+’行业应用优秀案例”,每日互动申报的「智能文案推荐算法」「大数据赋能蒙牛乳制品品牌精准投放」两个案例双双获评“2023年‘数据+’行业应用优秀案例”。


▲案例获奖证书

这两个案例正是每日互动结合数据匿名化等新技术和大数据联合计算(中立国)等新模式,让数好用,把数用好,安全提取、充分释放数据要素价值,增能垂直行业发展的生动实践。

“大数据有大责任”。每日互动深知个人信息保护和数据安全责任重大,未来公司将持续落实相关法律法规要求,同时加强技术研究和创新,积极与生态伙伴展开交流合作,在充分保障用户权益与数据安全合规的前提下,进一步发挥出数据要素乘数效应,推动数字经济高质量发展。

收起阅读 »