zhaojs
2023-07-28 2f38d31c7f7a1ee071dfa2226c3936fdd7906c3f
no message
已添加47个文件
已修改2个文件
5720 ■■■■■ 文件已修改
h5/apph5/manifest.json 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/pages.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/pages/backmanage/shortlink.vue 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/h-datetime-picker/changelog.md 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/h-datetime-picker/components/h-datetime-picker/h-datetime-picker.vue 648 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/h-datetime-picker/js/timeFormat.js 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/h-datetime-picker/package.json 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/h-datetime-picker/readme.md 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-icons/changelog.md 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-icons/components/uni-icons/icons.js 1169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-icons/components/uni-icons/uni-icons.vue 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-icons/components/uni-icons/uniicons.css 663 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-icons/components/uni-icons/uniicons.ttf 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-icons/package.json 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-icons/readme.md 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-popup/changelog.md 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue 275 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-popup/components/uni-popup/i18n/en.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-popup/components/uni-popup/i18n/index.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-popup/components/uni-popup/keypress.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-popup/components/uni-popup/popup.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-popup/components/uni-popup/uni-popup.vue 473 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-popup/package.json 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-popup/readme.md 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-scss/changelog.md 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-scss/index.scss 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-scss/package.json 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-scss/readme.md 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-scss/styles/index.scss 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-scss/styles/setting/_border.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-scss/styles/setting/_color.scss 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-scss/styles/setting/_radius.scss 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-scss/styles/setting/_space.scss 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-scss/styles/setting/_styles.scss 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-scss/styles/setting/_text.scss 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-scss/styles/setting/_variables.scss 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-scss/styles/tools/functions.scss 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-scss/theme.scss 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-scss/variables.scss 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-transition/changelog.md 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-transition/components/uni-transition/createAnimation.js 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-transition/components/uni-transition/uni-transition.vue 286 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-transition/package.json 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/uni_modules/uni-transition/readme.md 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/apph5/manifest.json
@@ -77,6 +77,12 @@
            "public" : "0.0.0.0",
            "proxy" : {
                //配置代理服务器来解决跨域问题,uniapp不适用CORS方案和设置JSONP方案
                "/openwize/" : {
                    //映射域名
                    "target" : "http://vx8.cc", //测试环境
                    "changeOrigin" : true, //是否跨域
                    "secure" : true // æ˜¯å¦æ”¯æŒ https åè®®çš„代理
                },
                "/api/" : {
                    //映射域名
                    "target" : "http://dfg.shop.com", //测试环境
h5/apph5/pages.json
@@ -27,6 +27,13 @@
                "navigationStyle":"custom",//不显示头部
                "navigationBarTitleText": "微信客服"
            }
        },
        {
            "path": "pages/backmanage/shortlink",
            "style": {
                "navigationStyle":"custom",//不显示头部
                "navigationBarTitleText": "短链统计"
            }
        }
    ],
    "globalStyle": {
h5/apph5/pages/backmanage/shortlink.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,129 @@
<!-- æœ¬ç¤ºä¾‹æœªåŒ…含完整css,获取外链css请参考上文,在hello uni-app项目中查看 -->
<template>
    <view>
        <view>
            <view class="uni-form-item">
                <view class="title">链接key:</view>
                <view>
                    <input v-model="keyname" style="height: 2.4rem; border: 1px solid;" placeholder="输入短链key" />
                </view>
            </view>
            <view class="uni-form-item">
                <view class="title">时间:</view>
                <view>
                    <view style="line-height: 2.3rem;" @click="datetimeshow()">{{showtime}}</view>
                    <h-datetime-picker :startTime="startTime" :endTime="endTime" mode="multiple" ref="pickerDate"
                        @reset="reset" @confirm="confirm"></h-datetime-picker>
                </view>
            </view>
            <view class="uni-form-item">
                <view class="title">发送数量:</view>
                <view>
                    <input v-model="sendcount" style="height: 2.4rem; border: 1px solid;" placeholder="请输入发送数量" />
                </view>
            </view>
            <view class="uni-btn-v">
                <button @click="formSubmit()">查询</button>
            </view>
            <view class="resshowtxt" v-if="res_key">
                <view>
                    é“¾æŽ¥key:{{res_key}}
                </view>
                <view>
                    Pv:{{res_pv}}------{{pvrate}}
                </view>
                <view>
                    Uv:{{res_uv}}-------{{uvrate}}
                </view>
            </view>
        </view>
    </view>
</template>
<script>
    import timeFormat from "@/uni_modules/h-datetime-picker/js/timeFormat.js"
    export default {
        data() {
            return {
                timeFormat,
                sendcount:10000,
                keyname: '',
                startTime: '',
                endTime: '',
                showtime: '点击选择时间',
                res_key: '',
                res_pv: '',
                res_uv: '',
                pvrate:0,
                uvrate:0
            }
        },
        onLoad() {
            let end_time = new Date();
            let startdate = end_time.setDate(new Date(end_time).getDate() - 3);
            this.startTime = this.timeFormat(startdate, 'yyyy-mm-dd');
            this.endTime = this.timeFormat(new Date(), 'yyyy-mm-dd');
        },
        methods: {
            datetimeshow() {
                this.$refs.pickerDate.open()
            },
            reset() {
                this.showtime = '';
                this.startTime = '';
                this.endTime = '';
            },
            confirm(e) {
                this.showtime = e.start_time.time + "至" + e.end_time.time;
                this.startTime = e.start_time.time;
                this.endTime = e.end_time.time;
            },
            formSubmit() {
                let data = {
                    key: this.keyname,
                    MinCreateTime: this.startTime,
                    MaxCreateTime: this.endTime
                }
                console.log(data);
                uni.showLoading({
                    title: '查询中',
                    mask: true
                });
                var that = this;
                this.$http.post('/openwize/Top/GePvUvByKey', data).then(e => {
                    uni.hideLoading();
                    this.res_key = e.result.key;
                    this.res_pv = e.result.pv;
                    this.res_uv = e.result.uv;
                    if(this.sendcount>0)
                    {//计算点击率
                        this.pvrate=((e.result.pv/this.sendcount).toFixed(2))*100+"%";
                        this.uvrate=((e.result.uv/this.sendcount).toFixed(2))*100+"%";
                    }
                }).catch(function(err) {
                    console.log(err);
                })
            }
        }
    }
</script>
<style>
    .resshowtxt {
        margin-top: 1rem;
        font-size: 1.5rem;
    }
    .uni-form-item {
        display: flex;
        margin: 0.4rem;
    }
    .uni-form-item .title {
        padding: 20rpx 0;
        margin-right: 1.6rem;
    }
</style>
h5/apph5/uni_modules/h-datetime-picker/changelog.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
## 1.1.3(2023-07-11)
bug修复
## 1.1.2(2023-07-11)
bug修复
## 1.1.1(2023-07-05)
修复年月切换后日不更新bug
## 1.1.0(2023-06-20)
修复mode初始化问题
## 1.0.10(2023-05-18)
样式优化
## 1.0.9(2023-05-18)
补充效果图
## 1.0.8(2023-05-18)
文档说明调整
## 1.0.7(2023-05-18)
新增选择器显示模式
## 1.0.6(2023-05-18)
h5端样式问题修复
## 1.0.5(2023-05-16)
细节优化
## 1.0.3(2023-05-16)
细节优化
## 1.0.2(2023-05-12)
bug修复
## 1.0.1(2023-05-12)
修复已知问题
## 1.0.0(2023-05-12)
1.0.0
h5/apph5/uni_modules/h-datetime-picker/components/h-datetime-picker/h-datetime-picker.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,648 @@
<template>
    <view>
        <uni-popup ref="popup">
            <view class="popup-box">
                <view class="title">
                    <view class="tabs-box" v-if="mode=='all'">
                        <view v-for="(item,index) in tabs" :key="index" class="tabs-item" @click="tabChange(index)"
                            :class="{'tabs-check':index==tabIndex}">
                            <text class="item-text">{{item}}</text>
                        </view>
                    </view>
                    <view class="title-text" v-else>
                        {{mode=='multiple'?'日期筛选':'月份选择'}}
                    </view>
                    <uni-icons type="closeempty" class="close" size="16" @click="close"></uni-icons>
                </view>
                <view class="options-box" v-if="tabIndex">
                    <view class="flex row-between">
                        <view v-for="(item,index) in options" :key="index" class="option" @click="optionSelect(index)"
                            :class="{'option-check':opIndex==index}">
                            <text class="option-text">{{item}}</text>
                        </view>
                    </view>
                    <view class="flex row-between" style="margin-top: 40rpx;">
                        <view class="option" :class="{'option-check':op1Index==0}"
                            style="width: 320rpx;padding-left: 0;padding-right: 0;" @click="optionChange(0)">
                            <text class="option-text">{{timeFormat(getTimestamp(start_time),fmt)}}</text>
                        </view>
                        <view style="width: 18rpx;height: 2rpx;background: #7B8686;"></view>
                        <view class="option" :class="{'option-check':op1Index==1}"
                            style="width: 320rpx;padding-left: 0;padding-right: 0;" @click="optionChange(1)">
                            <text class="option-text">{{timeFormat(getTimestamp(end_time),fmt)}}</text>
                        </view>
                    </view>
                </view>
                <view class="picker-body">
                    <picker-view class="picker-view"
                        indicator-style="height: 76rpx;background: rgba(0,0,0,.03);border:none;" :value="valueArr"
                        @change="change" @touchend="touchend">
                        <picker-view-column v-if="params.year">
                            <view class="column-item" v-for="(item,index) in years" :key="index">
                                <text class="column-item-text">{{item}}å¹´</text>
                            </view>
                        </picker-view-column>
                        <picker-view-column v-if="params.month">
                            <view class="column-item" v-for="(item,index) in months" :key="index">
                                <text class="column-item-text">{{formatNumber(item)}}月</text>
                            </view>
                        </picker-view-column>
                        <picker-view-column v-if="params.day">
                            <view class="column-item" v-for="(item,index) in days" :key="index">
                                <text class="column-item-text">{{formatNumber(item)}}日</text>
                            </view>
                        </picker-view-column>
                        <picker-view-column v-if="params.hour">
                            <view class="column-item" v-for="(item,index) in hours" :key="index">
                                <text class="column-item-text">{{formatNumber(item)}}时</text>
                            </view>
                        </picker-view-column>
                        <picker-view-column v-if="params.minute">
                            <view class="column-item" v-for="(item,index) in minutes" :key="index">
                                <text class="column-item-text">{{formatNumber(item)}}分</text>
                            </view>
                        </picker-view-column>
                        <picker-view-column v-if="params.second">
                            <view class="column-item" v-for="(item,index) in seconds" :key="index">
                                <text class="column-item-text">{{formatNumber(item)}}秒</text>
                            </view>
                        </picker-view-column>
                    </picker-view>
                </view>
                <view class="bottom">
                    <view class="h-btn h-btn-line" @click="reset">
                        <text style="color: #333;">重置</text>
                    </view>
                    <view class="h-btn" @click="getResult">
                        <text style="color: #fff;">确定</text>
                    </view>
                </view>
            </view>
        </uni-popup>
    </view>
</template>
<script>
    import timeFormat from "../../js/timeFormat.js"
    export default {
        props: {
            // picker中需要显示的参数
            params: {
                type: Object,
                default () {
                    return {
                        year: true,
                        month: true,
                        day: true,
                        hour: true,
                        minute: true,
                        second: false,
                        timestamp: true,
                    };
                }
            },
            // é»˜è®¤æ˜¾ç¤ºçš„æ—¶é—´ï¼Œ2025-07-02 || 2025-07-02 13:01:00 || 2025/07/02
            defaultTime: {
                type: String,
                default: ''
            },
            // å¹´ä»½å¼€å§‹æ—¶é—´
            startYear: {
                type: [String, Number],
                default: 1950
            },
            // å¹´ä»½ç»“束时间
            endYear: {
                type: [String, Number],
                default: 2050
            },
            // æœˆä»½ç»“束时间
            endMonth: {
                type: [String, Number],
                default: 12
            },
            // è‡ªå®šä¹‰æ—¶é—´é€‰é¡¹æ¨¡å¼month:月 day:天
            optionMode: {
                type: String,
                default: 'month'
            },
            //选择器模式 single:单月 multiple:多月 all:都包括
            mode: {
                type: String,
                default: 'all'
            },
            startTime: {
                type: String,
                default: ''
            },
            endTime: {
                type: String,
                default: ''
            }
        },
        data() {
            return {
                timeFormat,
                years: [],
                months: [],
                days: [],
                hours: [],
                minutes: [],
                seconds: [],
                valueArr: [],
                yearKey: 0,
                monthKey: 0,
                dayKey: 0,
                hourKey: 0,
                minuteKey: 0,
                secondy: 0,
                time: {},
                start_time: {},
                end_time: {},
                tabs: ['月份选择', '自定义时间'],
                tabIndex: 0,
                opIndex: -1,
                op1Index: 0,
                options: ['近三月', '近半年', '近一年'],
                itemIndex: 0,
                fmt: 'yyyy-mm-dd',
                isClick: false
            }
        },
        mounted() {
            this.init();
        },
        watch: {
            'time.year'(val) {
                if(this.params.day){
                    this.setDays(this.time)
                }
            },
            'time.month'(val) {
                if(this.params.day){
                    this.setDays(this.time)
                }
            },
            'start_time.year'(val) {
                this.setDays(this.start_time)
            },
            'start_time.month'(val) {
                this.setDays(this.start_time)
            },
            'end_time.year'(val) {
                this.setDays(this.end_time)
            },
            'end_time.month'(val) {
                this.setDays(this.end_time)
            },
        },
        methods: {
            open() {
                this.$refs.popup.open('bottom')
            },
            close() {
                this.$refs.popup.close()
            },
            //点击重置
            reset() {
                this.close();
                this.$emit('reset');
            },
            // ç‚¹å‡»ç¡®å®š
            getResult() {
                let result = {};
                if (this.tabIndex) {
                    let start_time = {}
                    let end_time = {}
                    if (this.params.year) {
                        start_time.year = this.formatNumber(this.start_time.year || 0);
                        end_time.year = this.formatNumber(this.end_time.year || 0);
                    }
                    if (this.params.month) {
                        start_time.month = this.formatNumber(this.start_time.month || 0);
                        end_time.month = this.formatNumber(this.end_time.month || 0);
                    }
                    if (this.params.day) {
                        start_time.day = this.formatNumber(this.start_time.day || 0);
                        end_time.day = this.formatNumber(this.end_time.day || 0);
                    }
                    if (this.params.hour) {
                        start_time.hour = this.formatNumber(this.start_time.hour || 0);
                        end_time.hour = this.formatNumber(this.end_time.hour || 0);
                    }
                    if (this.params.minute) {
                        start_time.minute = this.formatNumber(this.start_time.minute || 0);
                        end_time.minute = this.formatNumber(this.end_time.minute || 0);
                    }
                    if (this.params.second) {
                        start_time.second = this.formatNumber(this.start_time.second || 0);
                        end_time.second = this.formatNumber(this.end_time.second || 0);
                    }
                    if (this.params.timestamp) {
                        start_time.timestamp = this.getTimestamp(this.start_time);
                        end_time.timestamp = this.getTimestamp(this.end_time);
                    }
                    start_time.time = this.timeFormat(this.getTimestamp(this.start_time), this.fmt);
                    end_time.time = this.timeFormat(this.getTimestamp(this.end_time), this.fmt);
                    result = {
                        start_time,
                        end_time
                    }
                } else {
                    if (this.params.year) result.year = this.formatNumber(this.time.year || 0);
                    if (this.params.month) result.month = this.formatNumber(this.time.month || 0);
                    if (this.params.day) result.day = this.formatNumber(this.time.day || 0);
                    if (this.params.hour) result.hour = this.formatNumber(this.time.hour || 0);
                    if (this.params.minute) result.minute = this.formatNumber(this.time.minute || 0);
                    if (this.params.second) result.second = this.formatNumber(this.time.second || 0);
                    if (this.params.timestamp) result.timestamp = this.getTimestamp(this.time);
                    result.time = this.timeFormat(this.getTimestamp(this.time), this.fmt);
                }
                this.$emit('confirm', result);
                this.close();
            },
            init() {
                this.valueArr = [];
                this.tabIndex = this.mode == 'multiple' ? 1 : 0
                //初始化时间
                if (this.startTime) {
                    this.start_time = this.time = this.initTimeValue(this.startTime);
                } else {
                    this.start_time = this.time = this.initTimeValue(this.defaultTime);
                }
                if (this.endTime) {
                    this.end_time = this.initTimeValue(this.endTime);
                } else {
                    this.end_time = this.initTimeValue(this.defaultTime);
                }
                let fmt = ''
                if (this.optionMode == 'day') {
                    this.options = ['近3天', '近7天', '近15天']
                }
                if (this.params.year) {
                    this.valueArr.push(0);
                    this.yearKey = this.valueArr.length - 1
                    this.setYears(this.time);
                    fmt = 'yyyy'
                }
                if (this.params.month) {
                    this.valueArr.push(0);
                    this.monthKey = this.valueArr.length - 1
                    this.setMonths(this.time);
                    fmt += '-mm'
                }
                if (this.params.day) {
                    this.valueArr.push(0);
                    this.dayKey = this.valueArr.length - 1
                    this.setDays(this.time);
                    fmt += '-dd'
                }
                if (this.params.hour) {
                    this.valueArr.push(0);
                    this.hourKey = this.valueArr.length - 1
                    this.setHours(this.time);
                    fmt += ' hh'
                }
                if (this.params.minute) {
                    this.valueArr.push(0);
                    this.minuteKey = this.valueArr.length - 1
                    this.setMinutes(this.time);
                    fmt += ':MM'
                }
                if (this.params.second) {
                    this.valueArr.push(0);
                    this.secondKey = this.valueArr.length - 1
                    this.setSeconds(this.time);
                    fmt += ':ss'
                }
                this.fmt = fmt
                this.$forceUpdate();
            },
            // è®¾ç½®picker的某一列值
            setYears(date) {
                // èŽ·å–å¹´ä»½é›†åˆ
                this.years = this.generateArray(this.startYear, this.endYear);
                // è®¾ç½®this.valueArr某一项的值,是为了让picker预选中某一个值
                this.valueArr.splice(this.yearKey, 1, this.getIndex(this.years, date.year));
            },
            setMonths(date) {
                if (this.endYear == this.year) {
                    this.months = this.generateArray(1, this.endMonth);
                } else {
                    this.months = this.generateArray(1, 12);
                }
                this.valueArr.splice(this.monthKey, 1, this.getIndex(this.months, date.month));
            },
            setDays(date) {
                let totalDays = new Date(date.year, date.month, 0).getDate();
                this.days = this.generateArray(1, totalDays);
                // let index = 0;
                // è¿™é‡Œä¸èƒ½ä½¿ç”¨ç±»ä¼¼setMonths()中的this.valueArr.splice(this.valueArr.length - 1, xxx)做法
                // å› ä¸ºthis.month和this.year变化时,会触发watch中的this.setDays(),导致this.valueArr.length计算有误
                // if (this.params.year && this.params.month) index = 2;
                // else if (this.params.month) index = 1;
                // else if (this.params.year) index = 1;
                // else index = 0;
                // å½“月份变化时,会导致日期的天数也会变化,如果原来选的天数大于变化后的天数,则重置为变化后的最大值
                // æ¯”如原来选中3月31日,调整为2月后,日期变为最大29,这时如果day值继续为31显然不合理,于是将其置为29(picker-column从1开始)
                if (this.day > this.days.length) this.day = this.days.length;
                this.valueArr.splice(this.dayKey, 1, this.getIndex(this.days, date.day));
            },
            setHours() {
                this.hours = this.generateArray(0, 23);
                this.valueArr.splice(this.hourKey, 1, this.getIndex(this.hours, this.time.hour));
            },
            setMinutes() {
                this.minutes = this.generateArray(0, 59);
                this.valueArr.splice(this.minuteKey, 1, this.getIndex(this.minutes, this.time.minute));
            },
            setSeconds() {
                this.seconds = this.generateArray(0, 59);
                this.valueArr.splice(this.secondKey, 1, this.getIndex(this.seconds, this.time.second));
            },
            // ç”Ÿæˆé€’进的数组
            generateArray: function(start, end) {
                // è½¬ä¸ºæ•°å€¼æ ¼å¼ï¼Œå¦åˆ™ç”¨æˆ·ç»™end-year等传递字符串值时,下面的end+1会导致字符串拼接,而不是相加
                start = Number(start);
                end = Number(end);
                end = end > start ? end : start;
                // ç”Ÿæˆæ•°ç»„,获取其中的索引,并剪出来
                return [...Array(end + 1).keys()].slice(start);
            },
            getIndex: function(arr, val) {
                let index = arr.indexOf(val);
                // å¦‚æžœindex为-1(即找不到index值),~(-1)=-(-1)-1=0,导致条件不成立
                return ~index ? index : 0;
            },
            //日期时间处理
            initTimeValue(defaultTime) {
                // æ ¼å¼åŒ–时间,在IE浏览器(uni不存在此情况),无法识别日期间的"-"间隔符号
                let fdate = defaultTime.replace(/\-/g, '/');
                fdate = fdate && fdate.indexOf('/') == -1 ? `2020/01/01 ${fdate}` : fdate;
                let time = null;
                if (fdate) time = new Date(fdate);
                else time = new Date();
                // èŽ·å–å¹´æ—¥æœˆæ—¶åˆ†ç§’
                return {
                    year: time.getFullYear(),
                    month: Number(time.getMonth()) + 1,
                    day: time.getDate(),
                    hour: time.getHours(),
                    minute: time.getMinutes(),
                    second: time.getSeconds(),
                }
            },
            // å°äºŽ10前面补0,用于月份,日期,时分秒等
            formatNumber(num) {
                return +num < 10 ? '0' + num : String(num);
            },
            // èŽ·å–æ—¶é—´æˆ³
            getTimestamp(date) {
                // yyyy-mm-dd为安卓写法,不支持iOS,需要使用"/"分隔,才能二者兼容
                let time = date.year + '/' + date.month + '/' + date.day + ' ' + date.hour + ':' + date.minute + ':' + date
                    .second;
                return new Date(time).getTime();
            },
            touchend(e) {
                this.opIndex = -1
            },
            // ç”¨æˆ·æ›´æ”¹picker的列选项
            change(e) {
                this.itemIndex = e.detail.value[0]
                this.valueArr = e.detail.value;
                let i = 0;
                let time = {
                    year: 0,
                    month: 0,
                    day: 0,
                    hour: 0,
                    minute: 0,
                    second: 0,
                }
                if (this.params.year) time.year = this.years[this.valueArr[i++]];
                if (this.params.month) time.month = this.months[this.valueArr[i++]];
                if (this.params.day) time.day = this.days[this.valueArr[i++]];
                if (this.params.hour) time.hour = this.hours[this.valueArr[i++]];
                if (this.params.minute) time.minute = this.minutes[this.valueArr[i++]];
                if (this.params.second) time.second = this.seconds[this.valueArr[i++]];
                //自定义时间段
                if (this.tabIndex) {
                    if (this.op1Index) {
                        this.end_time = time
                    } else {
                        this.start_time = time
                    }
                } else { //月份选择
                    this.time = time
                }
            },
            tabChange(i) {
                this.tabIndex = i
                if (!i) {
                    this.setYears(this.time)
                    this.setMonths(this.time)
                    this.setDays(this.time)
                } else {
                    this.optionChange(this.op1Index)
                }
            },
            //选择快捷时间段
            optionSelect(i) {
                this.opIndex = i;
                let end_time = new Date()
                let date;
                switch (i) {
                    case 0: //近三月,近三天
                        if (this.optionMode == 'day') {
                            date = end_time.setDate(new Date(end_time).getDate() - 3)
                        } else {
                            date = end_time.setMonth(new Date(end_time).getMonth() - 3)
                        }
                        break;
                    case 1: //近半年,近七天
                        if (this.optionMode == 'day') {
                            date = end_time.setDate(new Date(end_time).getDate() - 7)
                        } else {
                            date = end_time.setMonth(new Date(end_time).getMonth() - 6)
                        }
                        break;
                    case 2: //近一年,近十五天
                        if (this.optionMode == 'day') {
                            date = end_time.setDate(new Date(end_time).getDate() - 15)
                        } else {
                            date = end_time.setMonth(new Date(end_time).getMonth() - 12)
                        }
                        break;
                }
                this.start_time = this.initTimeValue(this.timeFormat(date, this.fmt))
                this.end_time = this.initTimeValue(this.timeFormat(new Date(), this.fmt))
                if (this.op1Index) {
                    this.setYears(this.end_time)
                    this.setMonths(this.end_time)
                    this.setDays(this.end_time)
                } else {
                    this.setYears(this.start_time)
                    this.setMonths(this.start_time)
                    this.setDays(this.start_time)
                }
            },
            //起始时间、截至时间切换
            optionChange(i) {
                this.op1Index = i
                let date = i ? this.end_time : this.start_time
                this.setYears(date)
                this.setMonths(date)
                this.setDays(date)
            }
        }
    }
</script>
<style lang="scss">
    .flex {
        display: flex;
        flex-direction: row;
        align-items: center;
    }
    .row-between {
        justify-content: space-between;
    }
    .popup-box {
        background-color: #fff;
        border-radius: 24rpx 24rpx 0 0;
    }
    .picker-body {
        overflow: hidden;
        padding: 32rpx 40rpx;
    }
    .picker-view {
        height: 380rpx;
        width: 670rpx;
    }
    .column-item {
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: 32rpx;
        color: #888;
        height: 76rpx;
    }
    .column-item-text {
        // line-height: 100rpx;
        font-size: 32rpx;
    }
    .title {
        display: flex;
        align-items: center;
        justify-content: space-between;
        flex-direction: row;
        position: relative;
        .close {
            position: absolute;
            right: 50rpx;
        }
        .title-text {
            width: 100%;
            text-align: center;
            padding: 24rpx 0;
            font-size: 32rpx;
            font-weight: 600;
        }
    }
    .tabs-box {
        width: 100%;
        display: flex;
        flex-direction: row;
        padding: 0 50rpx 0 32rpx;
        align-items: center;
        border-bottom: 2rpx solid rgba(225, 225, 225, 0.5);
        .tabs-item {
            padding: 24rpx 0 22rpx 0;
            margin-right: 84rpx;
            border-bottom: 4rpx solid #fff;
        }
    }
    .tabs-check {
        border-bottom: 4rpx solid #1DAA9F !important;
        .item-text {
            color: #1DAA9F;
        }
    }
    .bottom {
        padding: 0 32rpx 32rpx;
        display: flex;
        align-items: center;
        flex-direction: row;
        .h-btn {
            flex: 1;
            height: 80rpx;
            background: #0BC7B9;
            border-radius: 16rpx;
            display: flex;
            align-items: center;
            border: 2rpx solid #0BC7B9;
            justify-content: center;
        }
        .h-btn-line {
            background: #fff;
            border: 2rpx solid #E1E7EC;
            margin-right: 42rpx;
        }
    }
    .option {
        padding: 14rpx 58rpx;
        font-size: 28rpx;
        border-radius: 16rpx;
        background: #F4F7F8;
        border: 3rpx solid #F4F7F8;
        display: flex;
        justify-content: center;
        flex-direction: row;
        .option-text {
            font-size: 28rpx;
            font-weight: 500;
            color: #333333;
            line-height: 40rpx;
        }
    }
    .option-check {
        background: #F5FFFF;
        border-radius: 16rpx;
        border: 3rpx solid #1DAA9F;
        .option-text {
            color: #1DAA9F;
        }
    }
    .options-box {
        padding: 32rpx;
        transition-property: height;
        transition-duration: .4s;
    }
</style>
h5/apph5/uni_modules/h-datetime-picker/js/timeFormat.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
// padStart çš„ polyfill,因为某些机型或情况,还无法支持es7的padStart,比如电脑版的微信小程序
// æ‰€ä»¥è¿™é‡Œåšä¸€ä¸ªå…¼å®¹polyfill的兼容处理
if (!String.prototype.padStart) {
    // ä¸ºäº†æ–¹ä¾¿è¡¨ç¤ºè¿™é‡Œ fillString ç”¨äº†ES6 çš„默认参数,不影响理解
    String.prototype.padStart = function(maxLength, fillString = ' ') {
        if (Object.prototype.toString.call(fillString) !== "[object String]") throw new TypeError(
            'fillString must be String')
        let str = this
        // è¿”回 String(str) è¿™é‡Œæ˜¯ä¸ºäº†ä½¿è¿”回的值是字符串字面量,在控制台中更符合直觉
        if (str.length >= maxLength) return String(str)
        let fillLength = maxLength - str.length,
            times = Math.ceil(fillLength / fillString.length)
        while (times >>= 1) {
            fillString += fillString
            if (times === 1) {
                fillString += fillString
            }
        }
        return fillString.slice(0, fillLength) + str;
    }
}
// å…¶ä»–更多是格式化有如下:
// yyyy:mm:dd|yyyy:mm|yyyyå¹´mm月dd日|yyyyå¹´mm月dd日 hh时MM分等,可自定义组合
function timeFormat(dateTime = null, fmt = 'yyyy-mm-dd') {
    // å¦‚果为null,则格式化当前时间
    if (!dateTime) dateTime = Number(new Date());
    // å¦‚æžœdateTime长度为10或者13,则为秒和毫秒的时间戳,如果超过13位,则为其他的时间格式
    if (dateTime.toString().length == 10) dateTime *= 1000;
    let date = new Date(dateTime);
    let ret;
    let opt = {
        "y+": date.getFullYear().toString(), // å¹´
        "m+": (date.getMonth() + 1).toString(), // æœˆ
        "d+": date.getDate().toString(), // æ—¥
        "h+": date.getHours().toString(), // æ—¶
        "M+": date.getMinutes().toString(), // åˆ†
        "s+": date.getSeconds().toString() // ç§’
        // æœ‰å…¶ä»–格式化字符需求可以继续添加,必须转化成字符串
    };
    for (let k in opt) {
        ret = new RegExp("(" + k + ")").exec(fmt);
        if (ret) {
            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
        };
    };
    return fmt;
}
export default timeFormat
h5/apph5/uni_modules/h-datetime-picker/package.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,81 @@
{
  "id": "h-datetime-picker",
  "displayName": "时间日期选择器",
  "version": "1.1.3",
  "description": "时间日期选择器",
  "keywords": [
    "h-datetime-picker"
],
  "repository": "",
  "engines": {
    "HBuilderX": "^3.1.0"
  },
  "dcloudext": {
    "type": "component-vue",
    "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": "u"
        },
        "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",
          "阿里": "u",
          "百度": "u",
          "字节跳动": "u",
          "QQ": "u",
          "钉钉": "u",
          "快手": "u",
          "飞书": "u",
          "京东": "u"
        },
        "快应用": {
          "华为": "u",
          "联盟": "u"
        }
      }
    }
  }
}
h5/apph5/uni_modules/h-datetime-picker/readme.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
## datetime-picker æ—¥æœŸæ—¶é—´é€‰æ‹©å™¨
> **组件名:h-datetime-picker**
> ä»£ç å—: `<h-datetime-picker></h-datetime-picker>`
> å…³è”组件:`uni-popup uni-icons`。
## å±žæ€§è¯´æ˜Ž
参数|说明|类型|默认值
-|-|-|-
params|需要显示的日期格式|Object|{year: true,month: true,day: true,hour: false,minute: false,second: false,timestamp: true,}
defaultTime|默认显示的时间(默认为当前时间)|String|''
startYear|年份开始时间|String,Number|1950
endYear|年份结束时间|String,Number|2050
endMonth|月份结束时间|String,Number|12
optionMode|自定义时间选择栏顶部快捷时间段选择类型,可选值:month(月)、day(天)|String|month
mode|选择器模式 all(显示月份选择以及时间段选择)、single(仅显示单月份选择)、multiple(仅显示时间段选择) |String|all
startTime|默认起始日期 ä»…在mode='multiple'时生效 ä¾‹å¦‚:2022-5-18 12:00|String|''
endTime|默认截止日期 ä»…在mode='multiple'时生效 ä¾‹å¦‚:2023-5-18 12:00|String|''
@reset|点击重置回调|Handler|无
@confirm|点击确定回调|Handler|无
##@confirm返回说明(对应params)
###单日期(时间)选择
参数|说明|类型
-|-|-|-
year|å¹´|String
month|月|String
day|日|String
hour|时|String
minute|分|String
second|秒|String
timestamp|时间戳|Number
###时间段选择
参数|说明|类型
-|-|-|-
start_time|起始时间 æ ¼å¼ä¸Žä¸Šä¸€è‡´|Object
end_time|截至时间 æ ¼å¼ä¸Žä¸Šä¸€è‡´|Object
##示例
```
<template>
    <view>
        <h-datetime-picker ref="pickerDate" @reset="reset" @confirm="confirm"></h-datetime-picker>
    </view>
</template>
<script>
    export default {
        methods: {
            //打开选择器
            open() {
                this.$refs.pickerDate.open()
            },
            reset(){
                console.log('点击了重置');
            },
            confirm(e){
                console.log('点击了确定',e);
            }
        }
    }
</script>
```
h5/apph5/uni_modules/uni-icons/changelog.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
## 1.3.5(2022-01-24)
- ä¼˜åŒ– size å±žæ€§å¯ä»¥ä¼ å…¥ä¸å¸¦å•位的字符串数值
## 1.3.4(2022-01-24)
- ä¼˜åŒ– size æ”¯æŒå…¶ä»–单位
## 1.3.3(2022-01-17)
- ä¿®å¤ nvue æœ‰äº›å›¾æ ‡ä¸æ˜¾ç¤ºçš„bug,兼容老版本图标
## 1.3.2(2021-12-01)
- ä¼˜åŒ– ç¤ºä¾‹å¯å¤åˆ¶å›¾æ ‡åç§°
## 1.3.1(2021-11-23)
- ä¼˜åŒ– å…¼å®¹æ—§ç»„ä»¶ type å€¼
## 1.3.0(2021-11-19)
- æ–°å¢ž æ›´å¤šå›¾æ ‡
- ä¼˜åŒ– è‡ªå®šä¹‰å›¾æ ‡ä½¿ç”¨æ–¹å¼
- ä¼˜åŒ– ç»„ä»¶UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
- æ–‡æ¡£è¿ç§»ï¼Œè¯¦è§:[https://uniapp.dcloud.io/component/uniui/uni-icons](https://uniapp.dcloud.io/component/uniui/uni-icons)
## 1.1.7(2021-11-08)
## 1.2.0(2021-07-30)
- ç»„件兼容 vue3,如何创建vue3项目,详见 [uni-app é¡¹ç›®æ”¯æŒ vue3 ä»‹ç»](https://ask.dcloud.net.cn/article/37834)
## 1.1.5(2021-05-12)
- æ–°å¢ž ç»„件示例地址
## 1.1.4(2021-02-05)
- è°ƒæ•´ä¸ºuni_modules目录规范
h5/apph5/uni_modules/uni-icons/components/uni-icons/icons.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1169 @@
export default {
  "id": "2852637",
  "name": "uniui图标库",
  "font_family": "uniicons",
  "css_prefix_text": "uniui-",
  "description": "",
  "glyphs": [
    {
      "icon_id": "25027049",
      "name": "yanse",
      "font_class": "color",
      "unicode": "e6cf",
      "unicode_decimal": 59087
    },
    {
      "icon_id": "25027048",
      "name": "wallet",
      "font_class": "wallet",
      "unicode": "e6b1",
      "unicode_decimal": 59057
    },
    {
      "icon_id": "25015720",
      "name": "settings-filled",
      "font_class": "settings-filled",
      "unicode": "e6ce",
      "unicode_decimal": 59086
    },
    {
      "icon_id": "25015434",
      "name": "shimingrenzheng-filled",
      "font_class": "auth-filled",
      "unicode": "e6cc",
      "unicode_decimal": 59084
    },
    {
      "icon_id": "24934246",
      "name": "shop-filled",
      "font_class": "shop-filled",
      "unicode": "e6cd",
      "unicode_decimal": 59085
    },
    {
      "icon_id": "24934159",
      "name": "staff-filled-01",
      "font_class": "staff-filled",
      "unicode": "e6cb",
      "unicode_decimal": 59083
    },
    {
      "icon_id": "24932461",
      "name": "VIP-filled",
      "font_class": "vip-filled",
      "unicode": "e6c6",
      "unicode_decimal": 59078
    },
    {
      "icon_id": "24932462",
      "name": "plus_circle_fill",
      "font_class": "plus-filled",
      "unicode": "e6c7",
      "unicode_decimal": 59079
    },
    {
      "icon_id": "24932463",
      "name": "folder_add-filled",
      "font_class": "folder-add-filled",
      "unicode": "e6c8",
      "unicode_decimal": 59080
    },
    {
      "icon_id": "24932464",
      "name": "yanse-filled",
      "font_class": "color-filled",
      "unicode": "e6c9",
      "unicode_decimal": 59081
    },
    {
      "icon_id": "24932465",
      "name": "tune-filled",
      "font_class": "tune-filled",
      "unicode": "e6ca",
      "unicode_decimal": 59082
    },
    {
      "icon_id": "24932455",
      "name": "a-rilidaka-filled",
      "font_class": "calendar-filled",
      "unicode": "e6c0",
      "unicode_decimal": 59072
    },
    {
      "icon_id": "24932456",
      "name": "notification-filled",
      "font_class": "notification-filled",
      "unicode": "e6c1",
      "unicode_decimal": 59073
    },
    {
      "icon_id": "24932457",
      "name": "wallet-filled",
      "font_class": "wallet-filled",
      "unicode": "e6c2",
      "unicode_decimal": 59074
    },
    {
      "icon_id": "24932458",
      "name": "paihangbang-filled",
      "font_class": "medal-filled",
      "unicode": "e6c3",
      "unicode_decimal": 59075
    },
    {
      "icon_id": "24932459",
      "name": "gift-filled",
      "font_class": "gift-filled",
      "unicode": "e6c4",
      "unicode_decimal": 59076
    },
    {
      "icon_id": "24932460",
      "name": "fire-filled",
      "font_class": "fire-filled",
      "unicode": "e6c5",
      "unicode_decimal": 59077
    },
    {
      "icon_id": "24928001",
      "name": "refreshempty",
      "font_class": "refreshempty",
      "unicode": "e6bf",
      "unicode_decimal": 59071
    },
    {
      "icon_id": "24926853",
      "name": "location-ellipse",
      "font_class": "location-filled",
      "unicode": "e6af",
      "unicode_decimal": 59055
    },
    {
      "icon_id": "24926735",
      "name": "person-filled",
      "font_class": "person-filled",
      "unicode": "e69d",
      "unicode_decimal": 59037
    },
    {
      "icon_id": "24926703",
      "name": "personadd-filled",
      "font_class": "personadd-filled",
      "unicode": "e698",
      "unicode_decimal": 59032
    },
    {
      "icon_id": "24923351",
      "name": "back",
      "font_class": "back",
      "unicode": "e6b9",
      "unicode_decimal": 59065
    },
    {
      "icon_id": "24923352",
      "name": "forward",
      "font_class": "forward",
      "unicode": "e6ba",
      "unicode_decimal": 59066
    },
    {
      "icon_id": "24923353",
      "name": "arrowthinright",
      "font_class": "arrow-right",
      "unicode": "e6bb",
      "unicode_decimal": 59067
    },
        {
          "icon_id": "24923353",
          "name": "arrowthinright",
          "font_class": "arrowthinright",
          "unicode": "e6bb",
          "unicode_decimal": 59067
        },
    {
      "icon_id": "24923354",
      "name": "arrowthinleft",
      "font_class": "arrow-left",
      "unicode": "e6bc",
      "unicode_decimal": 59068
    },
        {
          "icon_id": "24923354",
          "name": "arrowthinleft",
          "font_class": "arrowthinleft",
          "unicode": "e6bc",
          "unicode_decimal": 59068
        },
    {
      "icon_id": "24923355",
      "name": "arrowthinup",
      "font_class": "arrow-up",
      "unicode": "e6bd",
      "unicode_decimal": 59069
    },
        {
          "icon_id": "24923355",
          "name": "arrowthinup",
          "font_class": "arrowthinup",
          "unicode": "e6bd",
          "unicode_decimal": 59069
        },
    {
      "icon_id": "24923356",
      "name": "arrowthindown",
      "font_class": "arrow-down",
      "unicode": "e6be",
      "unicode_decimal": 59070
    },{
      "icon_id": "24923356",
      "name": "arrowthindown",
      "font_class": "arrowthindown",
      "unicode": "e6be",
      "unicode_decimal": 59070
    },
    {
      "icon_id": "24923349",
      "name": "arrowdown",
      "font_class": "bottom",
      "unicode": "e6b8",
      "unicode_decimal": 59064
    },{
      "icon_id": "24923349",
      "name": "arrowdown",
      "font_class": "arrowdown",
      "unicode": "e6b8",
      "unicode_decimal": 59064
    },
    {
      "icon_id": "24923346",
      "name": "arrowright",
      "font_class": "right",
      "unicode": "e6b5",
      "unicode_decimal": 59061
    },
        {
          "icon_id": "24923346",
          "name": "arrowright",
          "font_class": "arrowright",
          "unicode": "e6b5",
          "unicode_decimal": 59061
        },
    {
      "icon_id": "24923347",
      "name": "arrowup",
      "font_class": "top",
      "unicode": "e6b6",
      "unicode_decimal": 59062
    },
        {
          "icon_id": "24923347",
          "name": "arrowup",
          "font_class": "arrowup",
          "unicode": "e6b6",
          "unicode_decimal": 59062
        },
    {
      "icon_id": "24923348",
      "name": "arrowleft",
      "font_class": "left",
      "unicode": "e6b7",
      "unicode_decimal": 59063
    },
        {
          "icon_id": "24923348",
          "name": "arrowleft",
          "font_class": "arrowleft",
          "unicode": "e6b7",
          "unicode_decimal": 59063
        },
    {
      "icon_id": "24923334",
      "name": "eye",
      "font_class": "eye",
      "unicode": "e651",
      "unicode_decimal": 58961
    },
    {
      "icon_id": "24923335",
      "name": "eye-filled",
      "font_class": "eye-filled",
      "unicode": "e66a",
      "unicode_decimal": 58986
    },
    {
      "icon_id": "24923336",
      "name": "eye-slash",
      "font_class": "eye-slash",
      "unicode": "e6b3",
      "unicode_decimal": 59059
    },
    {
      "icon_id": "24923337",
      "name": "eye-slash-filled",
      "font_class": "eye-slash-filled",
      "unicode": "e6b4",
      "unicode_decimal": 59060
    },
    {
      "icon_id": "24923305",
      "name": "info-filled",
      "font_class": "info-filled",
      "unicode": "e649",
      "unicode_decimal": 58953
    },
    {
      "icon_id": "24923299",
      "name": "reload-01",
      "font_class": "reload",
      "unicode": "e6b2",
      "unicode_decimal": 59058
    },
    {
      "icon_id": "24923195",
      "name": "mic_slash_fill",
      "font_class": "micoff-filled",
      "unicode": "e6b0",
      "unicode_decimal": 59056
    },
    {
      "icon_id": "24923165",
      "name": "map-pin-ellipse",
      "font_class": "map-pin-ellipse",
      "unicode": "e6ac",
      "unicode_decimal": 59052
    },
    {
      "icon_id": "24923166",
      "name": "map-pin",
      "font_class": "map-pin",
      "unicode": "e6ad",
      "unicode_decimal": 59053
    },
    {
      "icon_id": "24923167",
      "name": "location",
      "font_class": "location",
      "unicode": "e6ae",
      "unicode_decimal": 59054
    },
    {
      "icon_id": "24923064",
      "name": "starhalf",
      "font_class": "starhalf",
      "unicode": "e683",
      "unicode_decimal": 59011
    },
    {
      "icon_id": "24923065",
      "name": "star",
      "font_class": "star",
      "unicode": "e688",
      "unicode_decimal": 59016
    },
    {
      "icon_id": "24923066",
      "name": "star-filled",
      "font_class": "star-filled",
      "unicode": "e68f",
      "unicode_decimal": 59023
    },
    {
      "icon_id": "24899646",
      "name": "a-rilidaka",
      "font_class": "calendar",
      "unicode": "e6a0",
      "unicode_decimal": 59040
    },
    {
      "icon_id": "24899647",
      "name": "fire",
      "font_class": "fire",
      "unicode": "e6a1",
      "unicode_decimal": 59041
    },
    {
      "icon_id": "24899648",
      "name": "paihangbang",
      "font_class": "medal",
      "unicode": "e6a2",
      "unicode_decimal": 59042
    },
    {
      "icon_id": "24899649",
      "name": "font",
      "font_class": "font",
      "unicode": "e6a3",
      "unicode_decimal": 59043
    },
    {
      "icon_id": "24899650",
      "name": "gift",
      "font_class": "gift",
      "unicode": "e6a4",
      "unicode_decimal": 59044
    },
    {
      "icon_id": "24899651",
      "name": "link",
      "font_class": "link",
      "unicode": "e6a5",
      "unicode_decimal": 59045
    },
    {
      "icon_id": "24899652",
      "name": "notification",
      "font_class": "notification",
      "unicode": "e6a6",
      "unicode_decimal": 59046
    },
    {
      "icon_id": "24899653",
      "name": "staff",
      "font_class": "staff",
      "unicode": "e6a7",
      "unicode_decimal": 59047
    },
    {
      "icon_id": "24899654",
      "name": "VIP",
      "font_class": "vip",
      "unicode": "e6a8",
      "unicode_decimal": 59048
    },
    {
      "icon_id": "24899655",
      "name": "folder_add",
      "font_class": "folder-add",
      "unicode": "e6a9",
      "unicode_decimal": 59049
    },
    {
      "icon_id": "24899656",
      "name": "tune",
      "font_class": "tune",
      "unicode": "e6aa",
      "unicode_decimal": 59050
    },
    {
      "icon_id": "24899657",
      "name": "shimingrenzheng",
      "font_class": "auth",
      "unicode": "e6ab",
      "unicode_decimal": 59051
    },
    {
      "icon_id": "24899565",
      "name": "person",
      "font_class": "person",
      "unicode": "e699",
      "unicode_decimal": 59033
    },
    {
      "icon_id": "24899566",
      "name": "email-filled",
      "font_class": "email-filled",
      "unicode": "e69a",
      "unicode_decimal": 59034
    },
    {
      "icon_id": "24899567",
      "name": "phone-filled",
      "font_class": "phone-filled",
      "unicode": "e69b",
      "unicode_decimal": 59035
    },
    {
      "icon_id": "24899568",
      "name": "phone",
      "font_class": "phone",
      "unicode": "e69c",
      "unicode_decimal": 59036
    },
    {
      "icon_id": "24899570",
      "name": "email",
      "font_class": "email",
      "unicode": "e69e",
      "unicode_decimal": 59038
    },
    {
      "icon_id": "24899571",
      "name": "personadd",
      "font_class": "personadd",
      "unicode": "e69f",
      "unicode_decimal": 59039
    },
    {
      "icon_id": "24899558",
      "name": "chatboxes-filled",
      "font_class": "chatboxes-filled",
      "unicode": "e692",
      "unicode_decimal": 59026
    },
    {
      "icon_id": "24899559",
      "name": "contact",
      "font_class": "contact",
      "unicode": "e693",
      "unicode_decimal": 59027
    },
    {
      "icon_id": "24899560",
      "name": "chatbubble-filled",
      "font_class": "chatbubble-filled",
      "unicode": "e694",
      "unicode_decimal": 59028
    },
    {
      "icon_id": "24899561",
      "name": "contact-filled",
      "font_class": "contact-filled",
      "unicode": "e695",
      "unicode_decimal": 59029
    },
    {
      "icon_id": "24899562",
      "name": "chatboxes",
      "font_class": "chatboxes",
      "unicode": "e696",
      "unicode_decimal": 59030
    },
    {
      "icon_id": "24899563",
      "name": "chatbubble",
      "font_class": "chatbubble",
      "unicode": "e697",
      "unicode_decimal": 59031
    },
    {
      "icon_id": "24881290",
      "name": "upload-filled",
      "font_class": "upload-filled",
      "unicode": "e68e",
      "unicode_decimal": 59022
    },
    {
      "icon_id": "24881292",
      "name": "upload",
      "font_class": "upload",
      "unicode": "e690",
      "unicode_decimal": 59024
    },
    {
      "icon_id": "24881293",
      "name": "weixin",
      "font_class": "weixin",
      "unicode": "e691",
      "unicode_decimal": 59025
    },
    {
      "icon_id": "24881274",
      "name": "compose",
      "font_class": "compose",
      "unicode": "e67f",
      "unicode_decimal": 59007
    },
    {
      "icon_id": "24881275",
      "name": "qq",
      "font_class": "qq",
      "unicode": "e680",
      "unicode_decimal": 59008
    },
    {
      "icon_id": "24881276",
      "name": "download-filled",
      "font_class": "download-filled",
      "unicode": "e681",
      "unicode_decimal": 59009
    },
    {
      "icon_id": "24881277",
      "name": "pengyouquan",
      "font_class": "pyq",
      "unicode": "e682",
      "unicode_decimal": 59010
    },
    {
      "icon_id": "24881279",
      "name": "sound",
      "font_class": "sound",
      "unicode": "e684",
      "unicode_decimal": 59012
    },
    {
      "icon_id": "24881280",
      "name": "trash-filled",
      "font_class": "trash-filled",
      "unicode": "e685",
      "unicode_decimal": 59013
    },
    {
      "icon_id": "24881281",
      "name": "sound-filled",
      "font_class": "sound-filled",
      "unicode": "e686",
      "unicode_decimal": 59014
    },
    {
      "icon_id": "24881282",
      "name": "trash",
      "font_class": "trash",
      "unicode": "e687",
      "unicode_decimal": 59015
    },
    {
      "icon_id": "24881284",
      "name": "videocam-filled",
      "font_class": "videocam-filled",
      "unicode": "e689",
      "unicode_decimal": 59017
    },
    {
      "icon_id": "24881285",
      "name": "spinner-cycle",
      "font_class": "spinner-cycle",
      "unicode": "e68a",
      "unicode_decimal": 59018
    },
    {
      "icon_id": "24881286",
      "name": "weibo",
      "font_class": "weibo",
      "unicode": "e68b",
      "unicode_decimal": 59019
    },
    {
      "icon_id": "24881288",
      "name": "videocam",
      "font_class": "videocam",
      "unicode": "e68c",
      "unicode_decimal": 59020
    },
    {
      "icon_id": "24881289",
      "name": "download",
      "font_class": "download",
      "unicode": "e68d",
      "unicode_decimal": 59021
    },
    {
      "icon_id": "24879601",
      "name": "help",
      "font_class": "help",
      "unicode": "e679",
      "unicode_decimal": 59001
    },
    {
      "icon_id": "24879602",
      "name": "navigate-filled",
      "font_class": "navigate-filled",
      "unicode": "e67a",
      "unicode_decimal": 59002
    },
    {
      "icon_id": "24879603",
      "name": "plusempty",
      "font_class": "plusempty",
      "unicode": "e67b",
      "unicode_decimal": 59003
    },
    {
      "icon_id": "24879604",
      "name": "smallcircle",
      "font_class": "smallcircle",
      "unicode": "e67c",
      "unicode_decimal": 59004
    },
    {
      "icon_id": "24879605",
      "name": "minus-filled",
      "font_class": "minus-filled",
      "unicode": "e67d",
      "unicode_decimal": 59005
    },
    {
      "icon_id": "24879606",
      "name": "micoff",
      "font_class": "micoff",
      "unicode": "e67e",
      "unicode_decimal": 59006
    },
    {
      "icon_id": "24879588",
      "name": "closeempty",
      "font_class": "closeempty",
      "unicode": "e66c",
      "unicode_decimal": 58988
    },
    {
      "icon_id": "24879589",
      "name": "clear",
      "font_class": "clear",
      "unicode": "e66d",
      "unicode_decimal": 58989
    },
    {
      "icon_id": "24879590",
      "name": "navigate",
      "font_class": "navigate",
      "unicode": "e66e",
      "unicode_decimal": 58990
    },
    {
      "icon_id": "24879591",
      "name": "minus",
      "font_class": "minus",
      "unicode": "e66f",
      "unicode_decimal": 58991
    },
    {
      "icon_id": "24879592",
      "name": "image",
      "font_class": "image",
      "unicode": "e670",
      "unicode_decimal": 58992
    },
    {
      "icon_id": "24879593",
      "name": "mic",
      "font_class": "mic",
      "unicode": "e671",
      "unicode_decimal": 58993
    },
    {
      "icon_id": "24879594",
      "name": "paperplane",
      "font_class": "paperplane",
      "unicode": "e672",
      "unicode_decimal": 58994
    },
    {
      "icon_id": "24879595",
      "name": "close",
      "font_class": "close",
      "unicode": "e673",
      "unicode_decimal": 58995
    },
    {
      "icon_id": "24879596",
      "name": "help-filled",
      "font_class": "help-filled",
      "unicode": "e674",
      "unicode_decimal": 58996
    },
    {
      "icon_id": "24879597",
      "name": "plus-filled",
      "font_class": "paperplane-filled",
      "unicode": "e675",
      "unicode_decimal": 58997
    },
    {
      "icon_id": "24879598",
      "name": "plus",
      "font_class": "plus",
      "unicode": "e676",
      "unicode_decimal": 58998
    },
    {
      "icon_id": "24879599",
      "name": "mic-filled",
      "font_class": "mic-filled",
      "unicode": "e677",
      "unicode_decimal": 58999
    },
    {
      "icon_id": "24879600",
      "name": "image-filled",
      "font_class": "image-filled",
      "unicode": "e678",
      "unicode_decimal": 59000
    },
    {
      "icon_id": "24855900",
      "name": "locked-filled",
      "font_class": "locked-filled",
      "unicode": "e668",
      "unicode_decimal": 58984
    },
    {
      "icon_id": "24855901",
      "name": "info",
      "font_class": "info",
      "unicode": "e669",
      "unicode_decimal": 58985
    },
    {
      "icon_id": "24855903",
      "name": "locked",
      "font_class": "locked",
      "unicode": "e66b",
      "unicode_decimal": 58987
    },
    {
      "icon_id": "24855884",
      "name": "camera-filled",
      "font_class": "camera-filled",
      "unicode": "e658",
      "unicode_decimal": 58968
    },
    {
      "icon_id": "24855885",
      "name": "chat-filled",
      "font_class": "chat-filled",
      "unicode": "e659",
      "unicode_decimal": 58969
    },
    {
      "icon_id": "24855886",
      "name": "camera",
      "font_class": "camera",
      "unicode": "e65a",
      "unicode_decimal": 58970
    },
    {
      "icon_id": "24855887",
      "name": "circle",
      "font_class": "circle",
      "unicode": "e65b",
      "unicode_decimal": 58971
    },
    {
      "icon_id": "24855888",
      "name": "checkmarkempty",
      "font_class": "checkmarkempty",
      "unicode": "e65c",
      "unicode_decimal": 58972
    },
    {
      "icon_id": "24855889",
      "name": "chat",
      "font_class": "chat",
      "unicode": "e65d",
      "unicode_decimal": 58973
    },
    {
      "icon_id": "24855890",
      "name": "circle-filled",
      "font_class": "circle-filled",
      "unicode": "e65e",
      "unicode_decimal": 58974
    },
    {
      "icon_id": "24855891",
      "name": "flag",
      "font_class": "flag",
      "unicode": "e65f",
      "unicode_decimal": 58975
    },
    {
      "icon_id": "24855892",
      "name": "flag-filled",
      "font_class": "flag-filled",
      "unicode": "e660",
      "unicode_decimal": 58976
    },
    {
      "icon_id": "24855893",
      "name": "gear-filled",
      "font_class": "gear-filled",
      "unicode": "e661",
      "unicode_decimal": 58977
    },
    {
      "icon_id": "24855894",
      "name": "home",
      "font_class": "home",
      "unicode": "e662",
      "unicode_decimal": 58978
    },
    {
      "icon_id": "24855895",
      "name": "home-filled",
      "font_class": "home-filled",
      "unicode": "e663",
      "unicode_decimal": 58979
    },
    {
      "icon_id": "24855896",
      "name": "gear",
      "font_class": "gear",
      "unicode": "e664",
      "unicode_decimal": 58980
    },
    {
      "icon_id": "24855897",
      "name": "smallcircle-filled",
      "font_class": "smallcircle-filled",
      "unicode": "e665",
      "unicode_decimal": 58981
    },
    {
      "icon_id": "24855898",
      "name": "map-filled",
      "font_class": "map-filled",
      "unicode": "e666",
      "unicode_decimal": 58982
    },
    {
      "icon_id": "24855899",
      "name": "map",
      "font_class": "map",
      "unicode": "e667",
      "unicode_decimal": 58983
    },
    {
      "icon_id": "24855825",
      "name": "refresh-filled",
      "font_class": "refresh-filled",
      "unicode": "e656",
      "unicode_decimal": 58966
    },
    {
      "icon_id": "24855826",
      "name": "refresh",
      "font_class": "refresh",
      "unicode": "e657",
      "unicode_decimal": 58967
    },
    {
      "icon_id": "24855808",
      "name": "cloud-upload",
      "font_class": "cloud-upload",
      "unicode": "e645",
      "unicode_decimal": 58949
    },
    {
      "icon_id": "24855809",
      "name": "cloud-download-filled",
      "font_class": "cloud-download-filled",
      "unicode": "e646",
      "unicode_decimal": 58950
    },
    {
      "icon_id": "24855810",
      "name": "cloud-download",
      "font_class": "cloud-download",
      "unicode": "e647",
      "unicode_decimal": 58951
    },
    {
      "icon_id": "24855811",
      "name": "cloud-upload-filled",
      "font_class": "cloud-upload-filled",
      "unicode": "e648",
      "unicode_decimal": 58952
    },
    {
      "icon_id": "24855813",
      "name": "redo",
      "font_class": "redo",
      "unicode": "e64a",
      "unicode_decimal": 58954
    },
    {
      "icon_id": "24855814",
      "name": "images-filled",
      "font_class": "images-filled",
      "unicode": "e64b",
      "unicode_decimal": 58955
    },
    {
      "icon_id": "24855815",
      "name": "undo-filled",
      "font_class": "undo-filled",
      "unicode": "e64c",
      "unicode_decimal": 58956
    },
    {
      "icon_id": "24855816",
      "name": "more",
      "font_class": "more",
      "unicode": "e64d",
      "unicode_decimal": 58957
    },
    {
      "icon_id": "24855817",
      "name": "more-filled",
      "font_class": "more-filled",
      "unicode": "e64e",
      "unicode_decimal": 58958
    },
    {
      "icon_id": "24855818",
      "name": "undo",
      "font_class": "undo",
      "unicode": "e64f",
      "unicode_decimal": 58959
    },
    {
      "icon_id": "24855819",
      "name": "images",
      "font_class": "images",
      "unicode": "e650",
      "unicode_decimal": 58960
    },
    {
      "icon_id": "24855821",
      "name": "paperclip",
      "font_class": "paperclip",
      "unicode": "e652",
      "unicode_decimal": 58962
    },
    {
      "icon_id": "24855822",
      "name": "settings",
      "font_class": "settings",
      "unicode": "e653",
      "unicode_decimal": 58963
    },
    {
      "icon_id": "24855823",
      "name": "search",
      "font_class": "search",
      "unicode": "e654",
      "unicode_decimal": 58964
    },
    {
      "icon_id": "24855824",
      "name": "redo-filled",
      "font_class": "redo-filled",
      "unicode": "e655",
      "unicode_decimal": 58965
    },
    {
      "icon_id": "24841702",
      "name": "list",
      "font_class": "list",
      "unicode": "e644",
      "unicode_decimal": 58948
    },
    {
      "icon_id": "24841489",
      "name": "mail-open-filled",
      "font_class": "mail-open-filled",
      "unicode": "e63a",
      "unicode_decimal": 58938
    },
    {
      "icon_id": "24841491",
      "name": "hand-thumbsdown-filled",
      "font_class": "hand-down-filled",
      "unicode": "e63c",
      "unicode_decimal": 58940
    },
    {
      "icon_id": "24841492",
      "name": "hand-thumbsdown",
      "font_class": "hand-down",
      "unicode": "e63d",
      "unicode_decimal": 58941
    },
    {
      "icon_id": "24841493",
      "name": "hand-thumbsup-filled",
      "font_class": "hand-up-filled",
      "unicode": "e63e",
      "unicode_decimal": 58942
    },
    {
      "icon_id": "24841494",
      "name": "hand-thumbsup",
      "font_class": "hand-up",
      "unicode": "e63f",
      "unicode_decimal": 58943
    },
    {
      "icon_id": "24841496",
      "name": "heart-filled",
      "font_class": "heart-filled",
      "unicode": "e641",
      "unicode_decimal": 58945
    },
    {
      "icon_id": "24841498",
      "name": "mail-open",
      "font_class": "mail-open",
      "unicode": "e643",
      "unicode_decimal": 58947
    },
    {
      "icon_id": "24841488",
      "name": "heart",
      "font_class": "heart",
      "unicode": "e639",
      "unicode_decimal": 58937
    },
    {
      "icon_id": "24839963",
      "name": "loop",
      "font_class": "loop",
      "unicode": "e633",
      "unicode_decimal": 58931
    },
    {
      "icon_id": "24839866",
      "name": "pulldown",
      "font_class": "pulldown",
      "unicode": "e632",
      "unicode_decimal": 58930
    },
    {
      "icon_id": "24813798",
      "name": "scan",
      "font_class": "scan",
      "unicode": "e62a",
      "unicode_decimal": 58922
    },
    {
      "icon_id": "24813786",
      "name": "bars",
      "font_class": "bars",
      "unicode": "e627",
      "unicode_decimal": 58919
    },
    {
      "icon_id": "24813788",
      "name": "cart-filled",
      "font_class": "cart-filled",
      "unicode": "e629",
      "unicode_decimal": 58921
    },
    {
      "icon_id": "24813790",
      "name": "checkbox",
      "font_class": "checkbox",
      "unicode": "e62b",
      "unicode_decimal": 58923
    },
    {
      "icon_id": "24813791",
      "name": "checkbox-filled",
      "font_class": "checkbox-filled",
      "unicode": "e62c",
      "unicode_decimal": 58924
    },
    {
      "icon_id": "24813794",
      "name": "shop",
      "font_class": "shop",
      "unicode": "e62f",
      "unicode_decimal": 58927
    },
    {
      "icon_id": "24813795",
      "name": "headphones",
      "font_class": "headphones",
      "unicode": "e630",
      "unicode_decimal": 58928
    },
    {
      "icon_id": "24813796",
      "name": "cart",
      "font_class": "cart",
      "unicode": "e631",
      "unicode_decimal": 58929
    }
  ]
}
h5/apph5/uni_modules/uni-icons/components/uni-icons/uni-icons.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
<template>
    <!-- #ifdef APP-NVUE -->
    <text :style="{ color: color, 'font-size': iconSize }" class="uni-icons" @click="_onClick">{{unicode}}</text>
    <!-- #endif -->
    <!-- #ifndef APP-NVUE -->
    <text :style="{ color: color, 'font-size': iconSize }" class="uni-icons" :class="['uniui-'+type,customPrefix,customPrefix?type:'']" @click="_onClick"></text>
    <!-- #endif -->
</template>
<script>
    import icons from './icons.js';
    const getVal = (val) => {
        const reg = /^[0-9]*$/g
        return (typeof val === 'number' || reg.test(val) )? val + 'px' : val;
    }
    // #ifdef APP-NVUE
    var domModule = weex.requireModule('dom');
    import iconUrl from './uniicons.ttf'
    domModule.addRule('fontFace', {
        'fontFamily': "uniicons",
        'src': "url('"+iconUrl+"')"
    });
    // #endif
    /**
     * Icons å›¾æ ‡
     * @description ç”¨äºŽå±•示 icons å›¾æ ‡
     * @tutorial https://ext.dcloud.net.cn/plugin?id=28
     * @property {Number} size å›¾æ ‡å¤§å°
     * @property {String} type å›¾æ ‡å›¾æ¡ˆï¼Œå‚考示例
     * @property {String} color å›¾æ ‡é¢œè‰²
     * @property {String} customPrefix è‡ªå®šä¹‰å›¾æ ‡
     * @event {Function} click ç‚¹å‡» Icon è§¦å‘事件
     */
    export default {
        name: 'UniIcons',
        emits:['click'],
        props: {
            type: {
                type: String,
                default: ''
            },
            color: {
                type: String,
                default: '#333333'
            },
            size: {
                type: [Number, String],
                default: 16
            },
            customPrefix:{
                type: String,
                default: ''
            }
        },
        data() {
            return {
                icons: icons.glyphs
            }
        },
        computed:{
            unicode(){
                let code = this.icons.find(v=>v.font_class === this.type)
                if(code){
                    return unescape(`%u${code.unicode}`)
                }
                return ''
            },
            iconSize(){
                return getVal(this.size)
            }
        },
        methods: {
            _onClick() {
                this.$emit('click')
            }
        }
    }
</script>
<style lang="scss">
    /* #ifndef APP-NVUE */
    @import './uniicons.css';
    @font-face {
        font-family: uniicons;
        src: url('./uniicons.ttf') format('truetype');
    }
    /* #endif */
    .uni-icons {
        font-family: uniicons;
        text-decoration: none;
        text-align: center;
    }
</style>
h5/apph5/uni_modules/uni-icons/components/uni-icons/uniicons.css
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,663 @@
.uniui-color:before {
  content: "\e6cf";
}
.uniui-wallet:before {
  content: "\e6b1";
}
.uniui-settings-filled:before {
  content: "\e6ce";
}
.uniui-auth-filled:before {
  content: "\e6cc";
}
.uniui-shop-filled:before {
  content: "\e6cd";
}
.uniui-staff-filled:before {
  content: "\e6cb";
}
.uniui-vip-filled:before {
  content: "\e6c6";
}
.uniui-plus-filled:before {
  content: "\e6c7";
}
.uniui-folder-add-filled:before {
  content: "\e6c8";
}
.uniui-color-filled:before {
  content: "\e6c9";
}
.uniui-tune-filled:before {
  content: "\e6ca";
}
.uniui-calendar-filled:before {
  content: "\e6c0";
}
.uniui-notification-filled:before {
  content: "\e6c1";
}
.uniui-wallet-filled:before {
  content: "\e6c2";
}
.uniui-medal-filled:before {
  content: "\e6c3";
}
.uniui-gift-filled:before {
  content: "\e6c4";
}
.uniui-fire-filled:before {
  content: "\e6c5";
}
.uniui-refreshempty:before {
  content: "\e6bf";
}
.uniui-location-filled:before {
  content: "\e6af";
}
.uniui-person-filled:before {
  content: "\e69d";
}
.uniui-personadd-filled:before {
  content: "\e698";
}
.uniui-back:before {
  content: "\e6b9";
}
.uniui-forward:before {
  content: "\e6ba";
}
.uniui-arrow-right:before {
  content: "\e6bb";
}
.uniui-arrowthinright:before {
  content: "\e6bb";
}
.uniui-arrow-left:before {
  content: "\e6bc";
}
.uniui-arrowthinleft:before {
  content: "\e6bc";
}
.uniui-arrow-up:before {
  content: "\e6bd";
}
.uniui-arrowthinup:before {
  content: "\e6bd";
}
.uniui-arrow-down:before {
  content: "\e6be";
}
.uniui-arrowthindown:before {
  content: "\e6be";
}
.uniui-bottom:before {
  content: "\e6b8";
}
.uniui-arrowdown:before {
  content: "\e6b8";
}
.uniui-right:before {
  content: "\e6b5";
}
.uniui-arrowright:before {
  content: "\e6b5";
}
.uniui-top:before {
  content: "\e6b6";
}
.uniui-arrowup:before {
  content: "\e6b6";
}
.uniui-left:before {
  content: "\e6b7";
}
.uniui-arrowleft:before {
  content: "\e6b7";
}
.uniui-eye:before {
  content: "\e651";
}
.uniui-eye-filled:before {
  content: "\e66a";
}
.uniui-eye-slash:before {
  content: "\e6b3";
}
.uniui-eye-slash-filled:before {
  content: "\e6b4";
}
.uniui-info-filled:before {
  content: "\e649";
}
.uniui-reload:before {
  content: "\e6b2";
}
.uniui-micoff-filled:before {
  content: "\e6b0";
}
.uniui-map-pin-ellipse:before {
  content: "\e6ac";
}
.uniui-map-pin:before {
  content: "\e6ad";
}
.uniui-location:before {
  content: "\e6ae";
}
.uniui-starhalf:before {
  content: "\e683";
}
.uniui-star:before {
  content: "\e688";
}
.uniui-star-filled:before {
  content: "\e68f";
}
.uniui-calendar:before {
  content: "\e6a0";
}
.uniui-fire:before {
  content: "\e6a1";
}
.uniui-medal:before {
  content: "\e6a2";
}
.uniui-font:before {
  content: "\e6a3";
}
.uniui-gift:before {
  content: "\e6a4";
}
.uniui-link:before {
  content: "\e6a5";
}
.uniui-notification:before {
  content: "\e6a6";
}
.uniui-staff:before {
  content: "\e6a7";
}
.uniui-vip:before {
  content: "\e6a8";
}
.uniui-folder-add:before {
  content: "\e6a9";
}
.uniui-tune:before {
  content: "\e6aa";
}
.uniui-auth:before {
  content: "\e6ab";
}
.uniui-person:before {
  content: "\e699";
}
.uniui-email-filled:before {
  content: "\e69a";
}
.uniui-phone-filled:before {
  content: "\e69b";
}
.uniui-phone:before {
  content: "\e69c";
}
.uniui-email:before {
  content: "\e69e";
}
.uniui-personadd:before {
  content: "\e69f";
}
.uniui-chatboxes-filled:before {
  content: "\e692";
}
.uniui-contact:before {
  content: "\e693";
}
.uniui-chatbubble-filled:before {
  content: "\e694";
}
.uniui-contact-filled:before {
  content: "\e695";
}
.uniui-chatboxes:before {
  content: "\e696";
}
.uniui-chatbubble:before {
  content: "\e697";
}
.uniui-upload-filled:before {
  content: "\e68e";
}
.uniui-upload:before {
  content: "\e690";
}
.uniui-weixin:before {
  content: "\e691";
}
.uniui-compose:before {
  content: "\e67f";
}
.uniui-qq:before {
  content: "\e680";
}
.uniui-download-filled:before {
  content: "\e681";
}
.uniui-pyq:before {
  content: "\e682";
}
.uniui-sound:before {
  content: "\e684";
}
.uniui-trash-filled:before {
  content: "\e685";
}
.uniui-sound-filled:before {
  content: "\e686";
}
.uniui-trash:before {
  content: "\e687";
}
.uniui-videocam-filled:before {
  content: "\e689";
}
.uniui-spinner-cycle:before {
  content: "\e68a";
}
.uniui-weibo:before {
  content: "\e68b";
}
.uniui-videocam:before {
  content: "\e68c";
}
.uniui-download:before {
  content: "\e68d";
}
.uniui-help:before {
  content: "\e679";
}
.uniui-navigate-filled:before {
  content: "\e67a";
}
.uniui-plusempty:before {
  content: "\e67b";
}
.uniui-smallcircle:before {
  content: "\e67c";
}
.uniui-minus-filled:before {
  content: "\e67d";
}
.uniui-micoff:before {
  content: "\e67e";
}
.uniui-closeempty:before {
  content: "\e66c";
}
.uniui-clear:before {
  content: "\e66d";
}
.uniui-navigate:before {
  content: "\e66e";
}
.uniui-minus:before {
  content: "\e66f";
}
.uniui-image:before {
  content: "\e670";
}
.uniui-mic:before {
  content: "\e671";
}
.uniui-paperplane:before {
  content: "\e672";
}
.uniui-close:before {
  content: "\e673";
}
.uniui-help-filled:before {
  content: "\e674";
}
.uniui-paperplane-filled:before {
  content: "\e675";
}
.uniui-plus:before {
  content: "\e676";
}
.uniui-mic-filled:before {
  content: "\e677";
}
.uniui-image-filled:before {
  content: "\e678";
}
.uniui-locked-filled:before {
  content: "\e668";
}
.uniui-info:before {
  content: "\e669";
}
.uniui-locked:before {
  content: "\e66b";
}
.uniui-camera-filled:before {
  content: "\e658";
}
.uniui-chat-filled:before {
  content: "\e659";
}
.uniui-camera:before {
  content: "\e65a";
}
.uniui-circle:before {
  content: "\e65b";
}
.uniui-checkmarkempty:before {
  content: "\e65c";
}
.uniui-chat:before {
  content: "\e65d";
}
.uniui-circle-filled:before {
  content: "\e65e";
}
.uniui-flag:before {
  content: "\e65f";
}
.uniui-flag-filled:before {
  content: "\e660";
}
.uniui-gear-filled:before {
  content: "\e661";
}
.uniui-home:before {
  content: "\e662";
}
.uniui-home-filled:before {
  content: "\e663";
}
.uniui-gear:before {
  content: "\e664";
}
.uniui-smallcircle-filled:before {
  content: "\e665";
}
.uniui-map-filled:before {
  content: "\e666";
}
.uniui-map:before {
  content: "\e667";
}
.uniui-refresh-filled:before {
  content: "\e656";
}
.uniui-refresh:before {
  content: "\e657";
}
.uniui-cloud-upload:before {
  content: "\e645";
}
.uniui-cloud-download-filled:before {
  content: "\e646";
}
.uniui-cloud-download:before {
  content: "\e647";
}
.uniui-cloud-upload-filled:before {
  content: "\e648";
}
.uniui-redo:before {
  content: "\e64a";
}
.uniui-images-filled:before {
  content: "\e64b";
}
.uniui-undo-filled:before {
  content: "\e64c";
}
.uniui-more:before {
  content: "\e64d";
}
.uniui-more-filled:before {
  content: "\e64e";
}
.uniui-undo:before {
  content: "\e64f";
}
.uniui-images:before {
  content: "\e650";
}
.uniui-paperclip:before {
  content: "\e652";
}
.uniui-settings:before {
  content: "\e653";
}
.uniui-search:before {
  content: "\e654";
}
.uniui-redo-filled:before {
  content: "\e655";
}
.uniui-list:before {
  content: "\e644";
}
.uniui-mail-open-filled:before {
  content: "\e63a";
}
.uniui-hand-down-filled:before {
  content: "\e63c";
}
.uniui-hand-down:before {
  content: "\e63d";
}
.uniui-hand-up-filled:before {
  content: "\e63e";
}
.uniui-hand-up:before {
  content: "\e63f";
}
.uniui-heart-filled:before {
  content: "\e641";
}
.uniui-mail-open:before {
  content: "\e643";
}
.uniui-heart:before {
  content: "\e639";
}
.uniui-loop:before {
  content: "\e633";
}
.uniui-pulldown:before {
  content: "\e632";
}
.uniui-scan:before {
  content: "\e62a";
}
.uniui-bars:before {
  content: "\e627";
}
.uniui-cart-filled:before {
  content: "\e629";
}
.uniui-checkbox:before {
  content: "\e62b";
}
.uniui-checkbox-filled:before {
  content: "\e62c";
}
.uniui-shop:before {
  content: "\e62f";
}
.uniui-headphones:before {
  content: "\e630";
}
.uniui-cart:before {
  content: "\e631";
}
h5/apph5/uni_modules/uni-icons/components/uni-icons/uniicons.ttf
Binary files differ
h5/apph5/uni_modules/uni-icons/package.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
{
  "id": "uni-icons",
  "displayName": "uni-icons å›¾æ ‡",
  "version": "1.3.5",
  "description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。",
  "keywords": [
    "uni-ui",
    "uniui",
    "icon",
    "图标"
],
  "repository": "https://github.com/dcloudio/uni-ui",
  "engines": {
    "HBuilderX": "^3.2.14"
  },
  "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"
        }
      }
    }
  }
}
h5/apph5/uni_modules/uni-icons/readme.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
## Icons å›¾æ ‡
> **组件名:uni-icons**
> ä»£ç å—: `uIcons`
用于展示 icons å›¾æ ‡ ã€‚
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-icons)
#### å¦‚使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui äº¤æµç¾¤ï¼š871950839
h5/apph5/uni_modules/uni-popup/changelog.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
## 1.8.3(2023-04-17)
- ä¿®å¤ uni-popup é‡å¤æ‰“开时的 bug
## 1.8.2(2023-02-02)
- uni-popup-dialog ç»„件新增 inputType å±žæ€§
## 1.8.1(2022-12-01)
- ä¿®å¤ nvue ä¸‹ v-show æŠ¥é”™
## 1.8.0(2022-11-29)
- ä¼˜åŒ– ä¸»é¢˜æ ·å¼
## 1.7.9(2022-04-02)
- ä¿®å¤ å¼¹å‡ºå±‚内部无法滚动的bug
## 1.7.8(2022-03-28)
- ä¿®å¤ å°ç¨‹åºä¸­é«˜åº¦é”™è¯¯çš„bug
## 1.7.7(2022-03-17)
- ä¿®å¤ å¿«é€Ÿè°ƒç”¨open出现问题的Bug
## 1.7.6(2022-02-14)
- ä¿®å¤ safeArea å±žæ€§ä¸èƒ½è®¾ç½®ä¸ºfalse的bug
## 1.7.5(2022-01-19)
- ä¿®å¤ isMaskClick å¤±æ•ˆçš„bug
## 1.7.4(2022-01-19)
- æ–°å¢ž cancelText \ confirmText å±žæ€§ ï¼Œå¯è‡ªå®šä¹‰æ–‡æœ¬
- æ–°å¢ž maskBackgroundColor å±žæ€§ ï¼Œå¯ä»¥ä¿®æ”¹è’™ç‰ˆé¢œè‰²
- ä¼˜åŒ– maskClick属性 æ›´æ–°ä¸º isMaskClick ï¼Œè§£å†³å¾®ä¿¡å°ç¨‹åºè­¦å‘Šçš„问题
## 1.7.3(2022-01-13)
- ä¿®å¤ è®¾ç½® safeArea å±žæ€§ä¸ç”Ÿæ•ˆçš„bug
## 1.7.2(2021-11-26)
- ä¼˜åŒ– ç»„件示例
## 1.7.1(2021-11-26)
- ä¿®å¤ vuedoc æ–‡å­—错误
## 1.7.0(2021-11-19)
- ä¼˜åŒ– ç»„ä»¶UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
- æ–‡æ¡£è¿ç§»ï¼Œè¯¦è§:[https://uniapp.dcloud.io/component/uniui/uni-popup](https://uniapp.dcloud.io/component/uniui/uni-popup)
## 1.6.2(2021-08-24)
- æ–°å¢ž æ”¯æŒå›½é™…化
## 1.6.1(2021-07-30)
- ä¼˜åŒ– vue3下事件警告的问题
## 1.6.0(2021-07-13)
- ç»„件兼容 vue3,如何创建vue3项目,详见 [uni-app é¡¹ç›®æ”¯æŒ vue3 ä»‹ç»](https://ask.dcloud.net.cn/article/37834)
## 1.5.0(2021-06-23)
- æ–°å¢ž mask-click é®ç½©å±‚点击事件
## 1.4.5(2021-06-22)
- ä¿®å¤ nvue å¹³å°ä¸­é—´å¼¹å‡ºåŽï¼Œç‚¹å‡»å†…容,再点击遮罩无法关闭的Bug
## 1.4.4(2021-06-18)
- ä¿®å¤ H5平台中间弹出后,点击内容,再点击遮罩无法关闭的Bug
## 1.4.3(2021-06-08)
- ä¿®å¤ é”™è¯¯çš„ watch å­—段
- ä¿®å¤ safeArea å±žæ€§ä¸ç”Ÿæ•ˆçš„问题
- ä¿®å¤ ç‚¹å‡»å†…容,再点击遮罩无法关闭的Bug
## 1.4.2(2021-05-12)
- æ–°å¢ž ç»„件示例地址
## 1.4.1(2021-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.9(2021-02-05)
- ä¼˜åŒ– ç»„件引用关系,通过uni_modules引用组件
## 1.2.8(2021-02-05)
- è°ƒæ•´ä¸ºuni_modules目录规范
## 1.2.7(2021-02-05)
- è°ƒæ•´ä¸ºuni_modules目录规范
- æ–°å¢ž æ”¯æŒ PC ç«¯
- æ–°å¢ž uni-popup-message ã€uni-popup-dialog扩展组件支持 PC ç«¯
h5/apph5/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js
¶Ô±ÈÐÂÎļþ
@@ -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
h5/apph5/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,275 @@
<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="inputType" :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: {
            inputType:{
                type: String,
                default: 'text'
            },
            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>
h5/apph5/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue
¶Ô±ÈÐÂÎļþ
@@ -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>
h5/apph5/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,187 @@
<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: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/c2b17470-50be-11eb-b680-7980c8a877b8.png',
                        name: 'wx'
                    },
                    {
                        text: '支付宝',
                        icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/d684ae40-50be-11eb-8ff1-d5dcf8779628.png',
                        name: 'wx'
                    },
                    {
                        text: 'QQ',
                        icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/e7a79520-50be-11eb-b997-9918a5dda011.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: 90px;
        /* #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: 50px;
        color: #666;
        font-size: 16px;
    }
    .uni-share-button::after {
        border-radius: 50px;
    }
</style>
h5/apph5/uni_modules/uni-popup/components/uni-popup/i18n/en.json
¶Ô±ÈÐÂÎļþ
@@ -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"
}
h5/apph5/uni_modules/uni-popup/components/uni-popup/i18n/index.js
¶Ô±ÈÐÂÎļþ
@@ -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
}
h5/apph5/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
{
    "uni-popup.cancel": "取消",
    "uni-popup.ok": "确定",
    "uni-popup.placeholder": "请输入",
        "uni-popup.title": "提示",
        "uni-popup.shareTitle": "分享到"
}
h5/apph5/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
{
    "uni-popup.cancel": "取消",
    "uni-popup.ok": "確定",
    "uni-popup.placeholder": "請輸入",
    "uni-popup.title": "提示",
    "uni-popup.shareTitle": "分享到"
}
h5/apph5/uni_modules/uni-popup/components/uni-popup/keypress.js
¶Ô±ÈÐÂÎļþ
@@ -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
h5/apph5/uni_modules/uni-popup/components/uni-popup/popup.js
¶Ô±ÈÐÂÎļþ
@@ -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;
        },
    }
}
h5/apph5/uni_modules/uni-popup/components/uni-popup/uni-popup.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,473 @@
<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) {
                    return
                }
                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>
h5/apph5/uni_modules/uni-popup/package.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
{
    "id": "uni-popup",
    "displayName": "uni-popup å¼¹å‡ºå±‚",
    "version": "1.8.3",
    "description": " Popup ç»„件,提供常用的弹层",
    "keywords": [
        "uni-ui",
        "弹出层",
        "弹窗",
        "popup",
        "弹框"
    ],
    "repository": "https://github.com/dcloudio/uni-ui",
    "engines": {
        "HBuilderX": ""
    },
    "directories": {
        "example": "../../temps/example_temps"
    },
    "dcloudext": {
        "sale": {
            "regular": {
                "price": "0.00"
            },
            "sourcecode": {
                "price": "0.00"
            }
        },
        "contact": {
            "qq": ""
        },
        "declaration": {
            "ads": "无",
            "data": "无",
            "permissions": "无"
        },
        "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
        "type": "component-vue"
    },
    "uni_modules": {
        "dependencies": [
            "uni-scss",
            "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"
                }
            }
        }
    }
}
h5/apph5/uni_modules/uni-popup/readme.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
## Popup å¼¹å‡ºå±‚
> **组件名:uni-popup**
> ä»£ç å—: `uPopup`
> å…³è”组件:`uni-transition`
弹出层组件,在应用中弹出一个消息提示窗口、提示框等
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-popup)
#### å¦‚使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui äº¤æµç¾¤ï¼š871950839
h5/apph5/uni_modules/uni-scss/changelog.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
## 1.0.3(2022-01-21)
- ä¼˜åŒ– ç»„件示例
## 1.0.2(2021-11-22)
- ä¿®å¤ / ç¬¦å·åœ¨ vue ä¸åŒç‰ˆæœ¬å…¼å®¹é—®é¢˜å¼•起的报错问题
## 1.0.1(2021-11-22)
- ä¿®å¤ vue3中scss语法兼容问题
## 1.0.0(2021-11-18)
- init
h5/apph5/uni_modules/uni-scss/index.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
@import './styles/index.scss';
h5/apph5/uni_modules/uni-scss/package.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
{
  "id": "uni-scss",
  "displayName": "uni-scss è¾…助样式",
  "version": "1.0.3",
  "description": "uni-sass是uni-ui提供的一套全局样式 ï¼Œé€šè¿‡ä¸€äº›ç®€å•的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。",
  "keywords": [
    "uni-scss",
    "uni-ui",
    "辅助样式"
],
  "repository": "https://github.com/dcloudio/uni-ui",
  "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": "https://www.npmjs.com/package/@dcloudio/uni-ui"
  },
  "uni_modules": {
    "dependencies": [],
    "encrypt": [],
    "platforms": {
      "cloud": {
        "tcb": "y",
        "aliyun": "y"
      },
      "client": {
        "App": {
          "app-vue": "y",
          "app-nvue": "u"
        },
        "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"
        },
        "快应用": {
          "华为": "n",
          "联盟": "n"
        },
        "Vue": {
            "vue2": "y",
            "vue3": "y"
        }
      }
    }
  }
}
h5/apph5/uni_modules/uni-scss/readme.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,4 @@
`uni-sass` æ˜¯ `uni-ui`提供的一套全局样式 ï¼Œé€šè¿‡ä¸€äº›ç®€å•的类名和`sass`变量,实现简单的页面布局操作,比如颜色、边距、圆角等。
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass)
#### å¦‚使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui äº¤æµç¾¤ï¼š871950839
h5/apph5/uni_modules/uni-scss/styles/index.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
@import './setting/_variables.scss';
@import './setting/_border.scss';
@import './setting/_color.scss';
@import './setting/_space.scss';
@import './setting/_radius.scss';
@import './setting/_text.scss';
@import './setting/_styles.scss';
h5/apph5/uni_modules/uni-scss/styles/setting/_border.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
.uni-border {
    border: 1px $uni-border-1 solid;
}
h5/apph5/uni_modules/uni-scss/styles/setting/_color.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
// TODO æš‚时不需要 class ï¼Œéœ€è¦ç”¨æˆ·ä½¿ç”¨å˜é‡å®žçް ï¼Œå¦‚果使用类名其实并不推荐
// @mixin get-styles($k,$c) {
//     @if $k == size or $k == weight{
//         font-#{$k}:#{$c}
//     }@else{
//         #{$k}:#{$c}
//     }
// }
$uni-ui-color:(
    // ä¸»è‰²
    primary: $uni-primary,
    primary-disable: $uni-primary-disable,
    primary-light: $uni-primary-light,
    // è¾…助色
    success: $uni-success,
    success-disable: $uni-success-disable,
    success-light: $uni-success-light,
    warning: $uni-warning,
    warning-disable: $uni-warning-disable,
    warning-light: $uni-warning-light,
    error: $uni-error,
    error-disable: $uni-error-disable,
    error-light: $uni-error-light,
    info: $uni-info,
    info-disable: $uni-info-disable,
    info-light: $uni-info-light,
    // ä¸­æ€§è‰²
    main-color: $uni-main-color,
    base-color: $uni-base-color,
    secondary-color: $uni-secondary-color,
    extra-color: $uni-extra-color,
    // èƒŒæ™¯è‰²
    bg-color: $uni-bg-color,
    // è¾¹æ¡†é¢œè‰²
    border-1: $uni-border-1,
    border-2: $uni-border-2,
    border-3: $uni-border-3,
    border-4: $uni-border-4,
    // é»‘色
    black:$uni-black,
    // ç™½è‰²
    white:$uni-white,
    // é€æ˜Ž
    transparent:$uni-transparent
) !default;
@each $key, $child in $uni-ui-color {
    .uni-#{"" + $key} {
        color: $child;
    }
    .uni-#{"" + $key}-bg {
        background-color: $child;
    }
}
.uni-shadow-sm {
    box-shadow: $uni-shadow-sm;
}
.uni-shadow-base {
    box-shadow: $uni-shadow-base;
}
.uni-shadow-lg {
    box-shadow: $uni-shadow-lg;
}
.uni-mask {
    background-color:$uni-mask;
}
h5/apph5/uni_modules/uni-scss/styles/setting/_radius.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
@mixin radius($r,$d:null ,$important: false){
  $radius-value:map-get($uni-radius, $r) if($important, !important, null);
  // Key exists within the $uni-radius variable
  @if (map-has-key($uni-radius, $r) and  $d){
        @if $d == t {
                border-top-left-radius:$radius-value;
                border-top-right-radius:$radius-value;
        }@else if $d == r {
                border-top-right-radius:$radius-value;
                border-bottom-right-radius:$radius-value;
        }@else if $d == b {
                border-bottom-left-radius:$radius-value;
                border-bottom-right-radius:$radius-value;
        }@else if $d == l {
                border-top-left-radius:$radius-value;
                border-bottom-left-radius:$radius-value;
        }@else if $d == tl {
                border-top-left-radius:$radius-value;
        }@else if $d == tr {
                border-top-right-radius:$radius-value;
        }@else if $d == br {
                border-bottom-right-radius:$radius-value;
        }@else if $d == bl {
                border-bottom-left-radius:$radius-value;
        }
  }@else{
        border-radius:$radius-value;
  }
}
@each $key, $child in $uni-radius {
    @if($key){
        .uni-radius-#{"" + $key} {
                @include radius($key)
        }
    }@else{
        .uni-radius {
                @include radius($key)
        }
    }
}
@each $direction in t, r, b, l,tl, tr, br, bl {
    @each $key, $child in $uni-radius {
        @if($key){
            .uni-radius-#{"" + $direction}-#{"" + $key} {
                @include radius($key,$direction,false)
            }
        }@else{
            .uni-radius-#{$direction} {
                @include radius($key,$direction,false)
            }
        }
    }
}
h5/apph5/uni_modules/uni-scss/styles/setting/_space.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
@mixin fn($space,$direction,$size,$n) {
    @if $n {
        #{$space}-#{$direction}: #{$size*$uni-space-root}px
    } @else {
         #{$space}-#{$direction}: #{-$size*$uni-space-root}px
    }
}
@mixin get-styles($direction,$i,$space,$n){
    @if $direction == t {
        @include fn($space, top,$i,$n);
    }
    @if $direction == r {
        @include fn($space, right,$i,$n);
    }
    @if $direction == b {
        @include fn($space, bottom,$i,$n);
    }
    @if $direction == l {
     @include fn($space, left,$i,$n);
    }
    @if $direction == x {
        @include fn($space, left,$i,$n);
        @include fn($space, right,$i,$n);
    }
    @if $direction == y {
        @include fn($space, top,$i,$n);
        @include fn($space, bottom,$i,$n);
    }
    @if $direction == a {
        @if $n {
            #{$space}:#{$i*$uni-space-root}px;
        } @else {
            #{$space}:#{-$i*$uni-space-root}px;
        }
    }
}
@each $orientation in m,p {
    $space: margin;
    @if $orientation == m {
        $space: margin;
    } @else {
        $space: padding;
    }
    @for $i from 0 through 16 {
        @each $direction in t, r, b, l, x, y, a {
            .uni-#{$orientation}#{$direction}-#{$i} {
                @include  get-styles($direction,$i,$space,true);
            }
            .uni-#{$orientation}#{$direction}-n#{$i} {
                @include  get-styles($direction,$i,$space,false);
            }
        }
    }
}
h5/apph5/uni_modules/uni-scss/styles/setting/_styles.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,167 @@
/* #ifndef APP-NVUE */
$-color-white:#fff;
$-color-black:#000;
@mixin base-style($color) {
    color: #fff;
    background-color: $color;
    border-color: mix($-color-black, $color, 8%);
    &:not([hover-class]):active {
        background: mix($-color-black, $color, 10%);
        border-color: mix($-color-black, $color, 20%);
        color: $-color-white;
        outline: none;
    }
}
@mixin is-color($color) {
    @include base-style($color);
    &[loading] {
        @include base-style($color);
        &::before {
            margin-right:5px;
        }
    }
    &[disabled] {
      &,
        &[loading],
      &:not([hover-class]):active {
        color: $-color-white;
            border-color: mix(darken($color,10%), $-color-white);
        background-color: mix($color, $-color-white);
      }
    }
}
@mixin base-plain-style($color) {
    color:$color;
    background-color: mix($-color-white, $color, 90%);
    border-color: mix($-color-white, $color, 70%);
    &:not([hover-class]):active {
      background: mix($-color-white, $color, 80%);
      color: $color;
      outline: none;
        border-color: mix($-color-white, $color, 50%);
    }
}
@mixin is-plain($color){
    &[plain] {
        @include base-plain-style($color);
        &[loading] {
            @include base-plain-style($color);
            &::before {
                margin-right:5px;
            }
        }
        &[disabled] {
          &,
          &:active {
            color: mix($-color-white, $color, 40%);
            background-color: mix($-color-white, $color, 90%);
                border-color: mix($-color-white, $color, 80%);
          }
        }
    }
}
.uni-btn {
    margin: 5px;
    color: #393939;
    border:1px solid #ccc;
    font-size: 16px;
    font-weight: 200;
    background-color: #F9F9F9;
    // TODO æš‚时处理边框隐藏一边的问题
    overflow: visible;
    &::after{
        border: none;
    }
    &:not([type]),&[type=default] {
        color: #999;
        &[loading] {
            background: none;
            &::before {
                margin-right:5px;
            }
        }
        &[disabled]{
            color: mix($-color-white, #999, 60%);
          &,
            &[loading],
          &:active {
                color: mix($-color-white, #999, 60%);
            background-color: mix($-color-white,$-color-black , 98%);
                border-color: mix($-color-white,  #999, 85%);
          }
        }
        &[plain] {
            color: #999;
            background: none;
            border-color: $uni-border-1;
            &:not([hover-class]):active {
                background: none;
              color: mix($-color-white, $-color-black, 80%);
                border-color: mix($-color-white, $-color-black, 90%);
              outline: none;
            }
            &[disabled]{
              &,
                &[loading],
              &:active {
                background: none;
                    color: mix($-color-white, #999, 60%);
                    border-color: mix($-color-white,  #999, 85%);
              }
            }
        }
    }
    &:not([hover-class]):active {
      color: mix($-color-white, $-color-black, 50%);
    }
    &[size=mini] {
        font-size: 16px;
        font-weight: 200;
        border-radius: 8px;
    }
    &.uni-btn-small {
        font-size: 14px;
    }
    &.uni-btn-mini {
        font-size: 12px;
    }
    &.uni-btn-radius {
        border-radius: 999px;
    }
    &[type=primary] {
        @include is-color($uni-primary);
        @include is-plain($uni-primary)
    }
    &[type=success] {
        @include is-color($uni-success);
        @include is-plain($uni-success)
    }
    &[type=error] {
        @include is-color($uni-error);
        @include is-plain($uni-error)
    }
    &[type=warning] {
        @include is-color($uni-warning);
        @include is-plain($uni-warning)
    }
    &[type=info] {
        @include is-color($uni-info);
        @include is-plain($uni-info)
    }
}
/* #endif */
h5/apph5/uni_modules/uni-scss/styles/setting/_text.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
@mixin get-styles($k,$c) {
    @if $k == size or $k == weight{
        font-#{$k}:#{$c}
    }@else{
        #{$k}:#{$c}
    }
}
@each $key, $child in $uni-headings {
    /* #ifndef APP-NVUE */
    .uni-#{$key} {
        @each $k, $c in $child {
            @include get-styles($k,$c)
        }
    }
    /* #endif */
    /* #ifdef APP-NVUE */
    .container .uni-#{$key} {
        @each $k, $c in $child {
            @include get-styles($k,$c)
        }
    }
    /* #endif */
}
h5/apph5/uni_modules/uni-scss/styles/setting/_variables.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,146 @@
// @use "sass:math";
@import  '../tools/functions.scss';
// é—´è·åŸºç¡€å€æ•°
$uni-space-root: 2 !default;
// è¾¹æ¡†åŠå¾„默认值
$uni-radius-root:5px !default;
$uni-radius: () !default;
// è¾¹æ¡†åŠå¾„断点
$uni-radius: map-deep-merge(
  (
    0: 0,
        // TODO å½“前版本暂时不支持 sm å±žæ€§
    // 'sm': math.div($uni-radius-root, 2),
    null: $uni-radius-root,
    'lg': $uni-radius-root * 2,
    'xl': $uni-radius-root * 6,
    'pill': 9999px,
    'circle': 50%
  ),
  $uni-radius
);
// å­—体家族
$body-font-family: 'Roboto', sans-serif !default;
// æ–‡æœ¬
$heading-font-family: $body-font-family !default;
$uni-headings: () !default;
$letterSpacing: -0.01562em;
$uni-headings: map-deep-merge(
  (
    'h1': (
      size: 32px,
            weight: 300,
            line-height: 50px,
            // letter-spacing:-0.01562em
    ),
    'h2': (
      size: 28px,
      weight: 300,
      line-height: 40px,
      // letter-spacing: -0.00833em
    ),
    'h3': (
      size: 24px,
      weight: 400,
      line-height: 32px,
      // letter-spacing: normal
    ),
    'h4': (
      size: 20px,
      weight: 400,
      line-height: 30px,
      // letter-spacing: 0.00735em
    ),
    'h5': (
      size: 16px,
      weight: 400,
      line-height: 24px,
      // letter-spacing: normal
    ),
    'h6': (
      size: 14px,
      weight: 500,
      line-height: 18px,
      // letter-spacing: 0.0125em
    ),
    'subtitle': (
      size: 12px,
      weight: 400,
      line-height: 20px,
      // letter-spacing: 0.00937em
    ),
    'body': (
      font-size: 14px,
            font-weight: 400,
            line-height: 22px,
            // letter-spacing: 0.03125em
    ),
    'caption': (
      'size': 12px,
      'weight': 400,
      'line-height': 20px,
      // 'letter-spacing': 0.03333em,
      // 'text-transform': false
    )
  ),
  $uni-headings
);
// ä¸»è‰²
$uni-primary: #2979ff !default;
$uni-primary-disable:lighten($uni-primary,20%) !default;
$uni-primary-light: lighten($uni-primary,25%) !default;
// è¾…助色
// é™¤äº†ä¸»è‰²å¤–的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。
$uni-success: #18bc37 !default;
$uni-success-disable:lighten($uni-success,20%) !default;
$uni-success-light: lighten($uni-success,25%) !default;
$uni-warning: #f3a73f !default;
$uni-warning-disable:lighten($uni-warning,20%) !default;
$uni-warning-light: lighten($uni-warning,25%) !default;
$uni-error: #e43d33 !default;
$uni-error-disable:lighten($uni-error,20%) !default;
$uni-error-light: lighten($uni-error,25%) !default;
$uni-info: #8f939c !default;
$uni-info-disable:lighten($uni-info,20%) !default;
$uni-info-light: lighten($uni-info,25%) !default;
// ä¸­æ€§è‰²
// ä¸­æ€§è‰²ç”¨äºŽæ–‡æœ¬ã€èƒŒæ™¯å’Œè¾¹æ¡†é¢œè‰²ã€‚通过运用不同的中性色,来表现层次结构。
$uni-main-color: #3a3a3a !default;             // ä¸»è¦æ–‡å­—
$uni-base-color: #6a6a6a !default;            // å¸¸è§„文字
$uni-secondary-color: #909399 !default;    // æ¬¡è¦æ–‡å­—
$uni-extra-color: #c7c7c7 !default;            // è¾…助说明
// è¾¹æ¡†é¢œè‰²
$uni-border-1: #F0F0F0 !default;
$uni-border-2: #EDEDED !default;
$uni-border-3: #DCDCDC !default;
$uni-border-4: #B9B9B9 !default;
// å¸¸è§„色
$uni-black: #000000 !default;
$uni-white: #ffffff !default;
$uni-transparent: rgba($color: #000000, $alpha: 0) !default;
// èƒŒæ™¯è‰²
$uni-bg-color: #f7f7f7 !default;
/* æ°´å¹³é—´è· */
$uni-spacing-sm: 8px !default;
$uni-spacing-base: 15px !default;
$uni-spacing-lg: 30px !default;
// é˜´å½±
$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default;
$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default;
$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default;
// è’™ç‰ˆ
$uni-mask: rgba($color: #000000, $alpha: 0.4) !default;
h5/apph5/uni_modules/uni-scss/styles/tools/functions.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
// åˆå¹¶ map
@function map-deep-merge($parent-map, $child-map){
    $result: $parent-map;
    @each $key, $child in $child-map {
        $parent-has-key: map-has-key($result, $key);
        $parent-value: map-get($result, $key);
        $parent-type: type-of($parent-value);
        $child-type: type-of($child);
        $parent-is-map: $parent-type == map;
        $child-is-map: $child-type == map;
        @if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){
            $result: map-merge($result, ( $key: $child ));
        }@else {
            $result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) ));
        }
    }
    @return $result;
};
h5/apph5/uni_modules/uni-scss/theme.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
// é—´è·åŸºç¡€å€æ•°
$uni-space-root: 2;
// è¾¹æ¡†åŠå¾„默认值
$uni-radius-root:5px;
// ä¸»è‰²
$uni-primary: #2979ff;
// è¾…助色
$uni-success: #4cd964;
// è­¦å‘Šè‰²
$uni-warning: #f0ad4e;
// é”™è¯¯è‰²
$uni-error: #dd524d;
// æè¿°è‰²
$uni-info: #909399;
// ä¸­æ€§è‰²
$uni-main-color: #303133;
$uni-base-color: #606266;
$uni-secondary-color: #909399;
$uni-extra-color: #C0C4CC;
// èƒŒæ™¯è‰²
$uni-bg-color: #f5f5f5;
// è¾¹æ¡†é¢œè‰²
$uni-border-1: #DCDFE6;
$uni-border-2: #E4E7ED;
$uni-border-3: #EBEEF5;
$uni-border-4: #F2F6FC;
// å¸¸è§„色
$uni-black: #000000;
$uni-white: #ffffff;
$uni-transparent: rgba($color: #000000, $alpha: 0);
h5/apph5/uni_modules/uni-scss/variables.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
@import './styles/setting/_variables.scss';
// é—´è·åŸºç¡€å€æ•°
$uni-space-root: 2;
// è¾¹æ¡†åŠå¾„默认值
$uni-radius-root:5px;
// ä¸»è‰²
$uni-primary: #2979ff;
$uni-primary-disable:mix(#fff,$uni-primary,50%);
$uni-primary-light: mix(#fff,$uni-primary,80%);
// è¾…助色
// é™¤äº†ä¸»è‰²å¤–的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。
$uni-success: #18bc37;
$uni-success-disable:mix(#fff,$uni-success,50%);
$uni-success-light: mix(#fff,$uni-success,80%);
$uni-warning: #f3a73f;
$uni-warning-disable:mix(#fff,$uni-warning,50%);
$uni-warning-light: mix(#fff,$uni-warning,80%);
$uni-error: #e43d33;
$uni-error-disable:mix(#fff,$uni-error,50%);
$uni-error-light: mix(#fff,$uni-error,80%);
$uni-info: #8f939c;
$uni-info-disable:mix(#fff,$uni-info,50%);
$uni-info-light: mix(#fff,$uni-info,80%);
// ä¸­æ€§è‰²
// ä¸­æ€§è‰²ç”¨äºŽæ–‡æœ¬ã€èƒŒæ™¯å’Œè¾¹æ¡†é¢œè‰²ã€‚通过运用不同的中性色,来表现层次结构。
$uni-main-color: #3a3a3a;             // ä¸»è¦æ–‡å­—
$uni-base-color: #6a6a6a;            // å¸¸è§„文字
$uni-secondary-color: #909399;    // æ¬¡è¦æ–‡å­—
$uni-extra-color: #c7c7c7;            // è¾…助说明
// è¾¹æ¡†é¢œè‰²
$uni-border-1: #F0F0F0;
$uni-border-2: #EDEDED;
$uni-border-3: #DCDCDC;
$uni-border-4: #B9B9B9;
// å¸¸è§„色
$uni-black: #000000;
$uni-white: #ffffff;
$uni-transparent: rgba($color: #000000, $alpha: 0);
// èƒŒæ™¯è‰²
$uni-bg-color: #f7f7f7;
/* æ°´å¹³é—´è· */
$uni-spacing-sm: 8px;
$uni-spacing-base: 15px;
$uni-spacing-lg: 30px;
// é˜´å½±
$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5);
$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2);
$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5);
// è’™ç‰ˆ
$uni-mask: rgba($color: #000000, $alpha: 0.4);
h5/apph5/uni_modules/uni-transition/changelog.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
## 1.3.2(2023-05-04)
- ä¿®å¤ NVUE å¹³å°æŠ¥é”™çš„问题
## 1.3.1(2021-11-23)
- ä¿®å¤ init æ–¹æ³•初始化问题
## 1.3.0(2021-11-19)
- ä¼˜åŒ– ç»„ä»¶UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
- æ–‡æ¡£è¿ç§»ï¼Œè¯¦è§:[https://uniapp.dcloud.io/component/uniui/uni-transition](https://uniapp.dcloud.io/component/uniui/uni-transition)
## 1.2.1(2021-09-27)
- ä¿®å¤ init æ–¹æ³•不生效的 Bug
## 1.2.0(2021-07-30)
- ç»„件兼容 vue3,如何创建 vue3 é¡¹ç›®ï¼Œè¯¦è§ [uni-app é¡¹ç›®æ”¯æŒ vue3 ä»‹ç»](https://ask.dcloud.net.cn/article/37834)
## 1.1.1(2021-05-12)
- æ–°å¢ž ç¤ºä¾‹åœ°å€
- ä¿®å¤ ç¤ºä¾‹é¡¹ç›®ç¼ºå°‘组件的 Bug
## 1.1.0(2021-04-22)
- æ–°å¢ž é€šè¿‡æ–¹æ³•自定义动画
- æ–°å¢ž custom-class éž NVUE å¹³å°æ”¯æŒè‡ªå®šä¹‰ class å®šåˆ¶æ ·å¼
- ä¼˜åŒ– åŠ¨ç”»è§¦å‘é€»è¾‘ï¼Œä½¿åŠ¨ç”»æ›´æµç•…
- ä¼˜åŒ– æ”¯æŒå•独的动画类型
- ä¼˜åŒ– æ–‡æ¡£ç¤ºä¾‹
## 1.0.2(2021-02-05)
- è°ƒæ•´ä¸º uni_modules ç›®å½•规范
h5/apph5/uni_modules/uni-transition/components/uni-transition/createAnimation.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,131 @@
// const defaultOption = {
//     duration: 300,
//     timingFunction: 'linear',
//     delay: 0,
//     transformOrigin: '50% 50% 0'
// }
// #ifdef APP-NVUE
const nvueAnimation = uni.requireNativePlugin('animation')
// #endif
class MPAnimation {
    constructor(options, _this) {
        this.options = options
        // åœ¨iOS10+QQ小程序平台下,传给原生的对象一定是个普通对象而不是Proxy对象,否则会报parameter should be Object instead of ProxyObject的错误
        this.animation = uni.createAnimation({
            ...options
        })
        this.currentStepAnimates = {}
        this.next = 0
        this.$ = _this
    }
    _nvuePushAnimates(type, args) {
        let aniObj = this.currentStepAnimates[this.next]
        let styles = {}
        if (!aniObj) {
            styles = {
                styles: {},
                config: {}
            }
        } else {
            styles = aniObj
        }
        if (animateTypes1.includes(type)) {
            if (!styles.styles.transform) {
                styles.styles.transform = ''
            }
            let unit = ''
            if(type === 'rotate'){
                unit = 'deg'
            }
            styles.styles.transform += `${type}(${args+unit}) `
        } else {
            styles.styles[type] = `${args}`
        }
        this.currentStepAnimates[this.next] = styles
    }
    _animateRun(styles = {}, config = {}) {
        let ref = this.$.$refs['ani'].ref
        if (!ref) return
        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)
}
h5/apph5/uni_modules/uni-transition/components/uni-transition/uni-transition.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,286 @@
<template>
  <!-- #ifndef APP-NVUE -->
  <view v-show="isShow" ref="ani" :animation="animationData" :class="customClass" :style="transformStyles" @click="onClick"><slot></slot></view>
  <!-- #endif -->
  <!-- #ifdef APP-NVUE -->
  <view v-if="isShow" ref="ani" :animation="animationData" :class="customClass" :style="transformStyles" @click="onClick"><slot></slot></view>
  <!-- #endif -->
</template>
<script>
import { createAnimation } from './createAnimation'
/**
 * Transition è¿‡æ¸¡åŠ¨ç”»
 * @description ç®€å•过渡动画组件
 * @tutorial https://ext.dcloud.net.cn/plugin?id=985
 * @property {Boolean} show = [false|true] æŽ§åˆ¶ç»„件显示或隐藏
 * @property {Array|String} modeClass = [fade|slide-top|slide-right|slide-bottom|slide-left|zoom-in|zoom-out] è¿‡æ¸¡åŠ¨ç”»ç±»åž‹
 *  @value fade æ¸é𐿏å‡ºè¿‡æ¸¡
 *  @value slide-top ç”±ä¸Šè‡³ä¸‹è¿‡æ¸¡
 *  @value slide-right ç”±å³è‡³å·¦è¿‡æ¸¡
 *  @value slide-bottom ç”±ä¸‹è‡³ä¸Šè¿‡æ¸¡
 *  @value slide-left ç”±å·¦è‡³å³è¿‡æ¸¡
 *  @value zoom-in ç”±å°åˆ°å¤§è¿‡æ¸¡
 *  @value zoom-out ç”±å¤§åˆ°å°è¿‡æ¸¡
 * @property {Number} duration è¿‡æ¸¡åŠ¨ç”»æŒç»­æ—¶é—´
 * @property {Object} styles ç»„件样式,同 css æ ·å¼ï¼Œæ³¨æ„å¸¦â€™-‘连接符的属性需要使用小驼峰写法如:`backgroundColor:red`
 */
export default {
    name: 'uniTransition',
    emits:['click','change'],
    props: {
        show: {
            type: Boolean,
            default: false
        },
        modeClass: {
            type: [Array, String],
            default() {
                return 'fade'
            }
        },
        duration: {
            type: Number,
            default: 300
        },
        styles: {
            type: Object,
            default() {
                return {}
            }
        },
        customClass:{
            type: String,
            default: ''
        },
        onceRender:{
            type:Boolean,
            default:false
        },
    },
    data() {
        return {
            isShow: false,
            transform: '',
            opacity: 1,
            animationData: {},
            durationTime: 300,
            config: {}
        }
    },
    watch: {
        show: {
            handler(newVal) {
                if (newVal) {
                    this.open()
                } else {
                    // é¿å…ä¸Šæ¥å°±æ‰§è¡Œ close,导致动画错乱
                    if (this.isShow) {
                        this.close()
                    }
                }
            },
            immediate: true
        }
    },
    computed: {
        // ç”Ÿæˆæ ·å¼æ•°æ®
        stylesObject() {
            let styles = {
                ...this.styles,
                'transition-duration': this.duration / 1000 + 's'
            }
            let transform = ''
            for (let i in styles) {
                let line = this.toLine(i)
                transform += line + ':' + styles[i] + ';'
            }
            return transform
        },
        // åˆå§‹åŒ–动画条件
        transformStyles() {
            return 'transform:' + this.transform + ';' + 'opacity:' + this.opacity + ';' + this.stylesObject
        }
    },
    created() {
        // åŠ¨ç”»é»˜è®¤é…ç½®
        this.config = {
            duration: this.duration,
            timingFunction: 'ease',
            transformOrigin: '50% 50%',
            delay: 0
        }
        this.durationTime = this.duration
    },
    methods: {
        /**
         *  ref è§¦å‘ åˆå§‹åŒ–动画
         */
        init(obj = {}) {
            if (obj.duration) {
                this.durationTime = obj.duration
            }
            this.animation = createAnimation(Object.assign(this.config, obj),this)
        },
        /**
         * ç‚¹å‡»ç»„件触发回调
         */
        onClick() {
            this.$emit('click', {
                detail: this.isShow
            })
        },
        /**
         * ref è§¦å‘ åŠ¨ç”»åˆ†ç»„
         * @param {Object} obj
         */
        step(obj, config = {}) {
            if (!this.animation) return
            for (let i in obj) {
                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>
h5/apph5/uni_modules/uni-transition/package.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
{
  "id": "uni-transition",
  "displayName": "uni-transition è¿‡æ¸¡åŠ¨ç”»",
  "version": "1.3.2",
  "description": "元素的简单过渡动画",
  "keywords": [
    "uni-ui",
    "uniui",
    "动画",
    "过渡",
    "过渡动画"
],
  "repository": "https://github.com/dcloudio/uni-ui",
  "engines": {
    "HBuilderX": ""
  },
  "directories": {
    "example": "../../temps/example_temps"
  },
"dcloudext": {
    "sale": {
      "regular": {
        "price": "0.00"
      },
      "sourcecode": {
        "price": "0.00"
      }
    },
    "contact": {
      "qq": ""
    },
    "declaration": {
      "ads": "无",
      "data": "无",
      "permissions": "无"
    },
    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
    "type": "component-vue"
  },
  "uni_modules": {
    "dependencies": ["uni-scss"],
    "encrypt": [],
    "platforms": {
      "cloud": {
        "tcb": "y",
        "aliyun": "y"
      },
      "client": {
        "App": {
          "app-vue": "y",
          "app-nvue": "y"
        },
        "H5-mobile": {
          "Safari": "y",
          "Android Browser": "y",
          "微信浏览器(Android)": "y",
          "QQ浏览器(Android)": "y"
        },
        "H5-pc": {
          "Chrome": "y",
          "IE": "y",
          "Edge": "y",
          "Firefox": "y",
          "Safari": "y"
        },
        "小程序": {
          "微信": "y",
          "阿里": "y",
          "百度": "y",
          "字节跳动": "y",
          "QQ": "y"
        },
        "快应用": {
          "华为": "u",
          "联盟": "u"
        },
        "Vue": {
            "vue2": "y",
            "vue3": "y"
        }
      }
    }
  }
}
h5/apph5/uni_modules/uni-transition/readme.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
## Transition è¿‡æ¸¡åŠ¨ç”»
> **组件名:uni-transition**
> ä»£ç å—: `uTransition`
元素过渡动画
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-transition)
#### å¦‚使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui äº¤æµç¾¤ï¼š871950839