jiangping
2024-05-07 b000e640c08486c687728dadc1f9d8ecdf3d3bd7
meeting
已添加6个文件
已修改10个文件
2916 ■■■■■ 文件已修改
h5/components/Li-Calendar/Li-Calendar.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/main.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/packagesMine/confirmAppointment/confirmAppointment.vue 584 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/packagesMine/meetingDetails/meetingDetails.vue 676 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/packagesMine/notice/notice.vue 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/packagesMine/notificationDetails/notificationDetails.vue 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/packagesMine/reservation/reservation.vue 439 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/packagesMine/selectPersonnel/selectPersonnel.vue 434 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages.json 263 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/meeting/index/index.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/meeting/manage/manage.vue 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/meeting/mine/mine.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/meeting/myAppointment/myAppointment.vue 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/meeting/personal/personal.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/store/index.js 81 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/utils/meetingHttp.js 67 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/components/Li-Calendar/Li-Calendar.vue
@@ -5,7 +5,7 @@
                <!-- <image :src="lastDisabled ? disable : nodisable" mode="widthFix" @tap="subMonth"></image> -->
                <image :src="nodisable" mode="widthFix" @tap="subMonth"></image>
                <text>{{title_time}}</text>
                <image src="@/static/icon/ar_right@2x.png" mode="widthFix" @tap="addMonth"></image>
                <image src="@/static/meeting/icon/ar_right@2x.png" mode="widthFix" @tap="addMonth"></image>
            </view>
            <view class="header-right" @tap="backToToday">回到今天</view>
            <!-- <text class='calendar-lastMonth' @tap="subMonth" v-bind:class="{'calendar-btn-disabled' : lastDisabled }">{{lastText}}</text>
@@ -158,8 +158,8 @@
        },
        data() {
            return {
                nodisable: require('@/static/icon/ar_left@2x.png'),
                disable: require('@/static/icon/ar_left_disable.png'),
                nodisable: require('@/static/meeting/icon/ar_left@2x.png'),
                disable: require('@/static/meeting/icon/ar_left_disable.png'),
                
                nextDisabled: false,
                lastDisabled: true,
@@ -688,7 +688,7 @@
        },
        computed: {
            transformObj:function () { 
                return 'translate3d(' + this.transform_x + 'px, 0px, 0px) translateZ(0px)';
                return 'translate3d(' + this.transform_x + 'px, 0px, 0px) translateZ(0px)';
            },
            transformTimeObj:function () {
                return this.transform_time + 'ms';
@@ -699,4 +699,4 @@
<style>
    @import url("./Li-Calendar.css");
</style>
</style>
h5/main.js
@@ -31,7 +31,9 @@
// http接口API抽离
import httpApi from '@/utils/http.api.js'
import httpMeetingApi from '@/utils/meetingHttp.js'
Vue.use(httpApi, app)
Vue.use(httpMeetingApi, app)
// è¯·æ±‚拦截器
import interceptor from '@/utils/http.interceptor.js'
h5/packagesMine/confirmAppointment/confirmAppointment.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,584 @@
<template>
    <view class="confirm">
        <view class="confirm_a">
            <view class="confirm_a_item">
                <view class="label">会议时间</view>
                <view class="content">
                    {{time}}
                </view>
            </view>
            <view class="confirm_a_item">
                <view class="label">会议室</view>
                <view class="content">
                    {{info.name}} <template v-if="info.limitNum">(可容纳{{info.limitNum}}人)</template>
                </view>
            </view>
            <view class="confirm_a_item">
                <view class="label">预约人</view>
                <view class="content">
                    {{user.departmentName ? user.departmentName : userInfo.departmentName}} {{user.realname ? user.realname : userInfo.realname}} {{user.mobile ? user.mobile : userInfo.mobile}}
                </view>
            </view>
        </view>
        <view class="confirm_b">
            <view class="confirm_b_item">
                <view class="label">
                    <text>会议主题</text>
                    <text>*</text>
                </view>
                <view class="input">
                    <input type="text" v-model="from.theme" placeholder="请输入会议主题" placeholder-class="placeholder" />
                </view>
            </view>
            <view class="confirm_b_item">
                <view class="label">
                    <text>会议内容</text>
                </view>
                <view class="input">
                    <textarea class="textarea" placeholder="请按要求输入内容" maxlength="300" v-model="from.content" />
                    <!-- <view class="num">{{ from.content.length }}/300</view> -->
                    <!-- <textarea
                    v-model="from.content"
                    placeholder="请按要求输入内容"
                    placeholder-style="color: #999999;font-size: 30rpx;font-weight: 400;"
                    :maxlength="300"/> -->
                    <!-- <u--textarea
                    border="none"
                    v-model="from.content"
                    maxlength="300"
                    height="150"
                    placeholder="请按要求输入内容"
                    count></u--textarea> -->
                </view>
            </view>
        </view>
        <view class="confirm_b">
            <view class="confirm_b_item" @click="jump">
                <view class="label">
                    <text>参会人员</text>
                    <text>*</text>
                </view>
                <view class="select">
                    <text :style="{color: usersName ? '#000' : ''}">{{usersName ? usersName : '请选择'}}</text>
                    <view class="select_right">></view>
                </view>
            </view>
            <view class="confirm_b_item" v-if="info.projectList && info.projectList.length > 0">
                <view class="label">
                    <text>选择服务项</text>
                </view>
                <view class="multiple">
                    <view
                        :class="item.active ? 'multiple_item active' : 'multiple_item'" v-for="(item, index) in info.projectList"
                        :key="index"
                        @click="serviceItems(index)">
                        {{item.projectName}}
                    </view>
                </view>
            </view>
            <view class="confirm_b_item">
                <view class="label">
                    <text>附件</text>
                </view>
                <view class="uplaod">
                    <view class="uplaod_item" v-for="(item, index) in from.files" :key="index">
                        <view class="uplaod_item_url">
                            <text @click="linkAddress(item.url)">{{item.name}}</text>
                            <!-- <u--text :lines="1" mode="link" :text="item.name" :href="item.url" ></u--text> -->
                        </view>
                        <text class="dele" @click="dele(index)">删除</text>
                    </view>
                    <view class="uplaod_box" @click="uploadFile">
                        <image src="@/static/meeting/icon/ic_upload@2x.png" mode="widthFix"></image>
                        <text>点击上传</text>
                    </view>
                </view>
            </view>
            <view class="confirm_b_item">
                <view class="label">
                    <text>备注</text>
                </view>
                <view class="input">
                    <textarea
                    v-model="from.notes"
                    placeholder="请输入"
                    placeholder-style="color: #999999;font-size: 30rpx;font-weight: 400;"
                    :maxlength="300"/>
                    <!-- <u--textarea
                    border="none"
                    v-model="from.notes"
                    height="150"
                    placeholder="请输入"></u--textarea> -->
                </view>
            </view>
        </view>
        <view class="confirm_footer">
            <view class="confirm_footer_btn" @click="submit">{{id ? '确认编辑' : '确认预约'}}</view>
        </view>
    </view>
</template>
<script>
    import { mapState } from 'vuex'
    export default {
        data() {
            return {
                id: '',
                roomId: '',
                value2: '',
                time: '',
                info: {},
                usersName: '',
                timelist: [],
                userList: [],
                startTime: '',
                endTime: '',
                from: {
                    theme: '',
                    content: '',
                    files: [],
                    notes: ''
                },
                user: {}
            };
        },
        computed: {
            ...mapState(['userInfo'])
        },
        async onLoad(option) {
            if (option.descid) {
                uni.setNavigationBarTitle({
                    title: "编辑会议"
                });
                this.roomId = option.roomId
                this.id = option.descid
                this.timelist = JSON.parse(option.timeList)
                await this.getDesc()
                this.getdesc()
            } else {
                this.time = option.time
                this.roomId = option.id
                this.startTime = option.startTime
                this.endTime = option.endTime
                this.timelist = JSON.parse(option.list)
                this.getDesc()
            }
        },
        onShow() {
            uni.$once('user', (data) => {
                this.userList = data.userList
                this.usersName = data.usersName
            })
        },
        methods: {
            linkAddress(link) {
                uni.setClipboardData({
                    data: link,
                    success: function () {
                        uni.showToast({
                            title: '链接已复制,请在浏览器打开',
                            icon: 'none',
                            duration: 2000
                        });
                    }
                });
            },
            dele(index) {
                this.from.files.splice(index, 1)
            },
            getdesc() {
                this.$u.api.meetingDetail({ id: this.id })
                    .then(res => {
                        this.time = res.data.meetingDate + ' ' + res.data.meetingTime
                        this.from.notes = res.data.remark
                        this.from.theme = res.data.meetingName
                        this.from.content = res.data.meetingContent
                        this.user = res.data.bookingUser
                        this.startTime = res.data.meetingDate + ' ' + res.data.meetingTime.substring(0, 5)
                        this.endTime = res.data.meetingDate + ' ' + res.data.meetingTime.substring(8, 13)
                        if (res.data.projectsResponseList.length > 0) {
                            res.data.projectsResponseList.forEach(item => {
                                this.info.projectList.forEach(child => {
                                    if (item.id === child.projectId) {
                                        child.active = true
                                    }
                                })
                            })
                        }
                        if (res.data.multiFileList.length > 0) {
                            this.from.files = res.data.multiFileList.map(item => {
                                return {
                                    fileurl: item.fileurl,
                                    name: item.name,
                                    url: item.fileurl + item.name
                                }
                            })
                        }
                        if (res.data.userResponseList.length > 0) {
                            this.userList = res.data.userResponseList.map(item => {
                                return {
                                    userId: item.id
                                }
                            })
                            let name = res.data.userResponseList.map(item => item.realname)
                            this.usersName = name.join(';')
                        }
                    })
            },
            submit() {
                if (!this.from.theme) return uni.showToast({
                    title: '会议主题不能为空',
                    icon: 'none',
                    duration: 2000
                });
                if (this.userList.length === 0) return uni.showToast({
                    title: '请先选择参会人员',
                    icon: 'none',
                    duration: 2000
                });
                var that = this
                uni.requestSubscribeMessage({
                    tmplIds: [
                        '_-HjcxNFJQU3O6P_I_bFzEQsiuUsT_0vbCLUxRL4zRA',
                        '6dc1gVYwRVm7kTnjdZRtzMGa48iBPZ5kX2N_S7TnDac',
                        'lEWpQak_nN9iC3re0Ub2RH7vgBxvB-EX8yp_Q5SdQTA'
                    ],
                    success (res) {
                        let projectList = []
                        that.info.projectList.forEach(item => {
                            if (item.active) {
                                projectList.push({ projectId: item.projectId })
                            }
                        })
                        that.$u.api.reservationMeeting({
                            id: that.id,
                            bookingTimeList: that.timelist,
                            content: that.from.content.substring(0, 300),
                            fileList: that.from.files,
                            name: that.from.theme,
                            projectList,
                            remark: that.from.notes,
                            roomId: that.roomId,
                            sysList: that.userList,
                            startTime: (that.startTime + ':00').replace(/å¹´/g, '-').replace(/月/g, '-').replace(/日/g, ''),
                            endTime: (that.endTime + ':00').replace(/å¹´/g, '-').replace(/月/g, '-').replace(/日/g, '')
                        }).then(res => {
                            if (res.code === 200) {
                                let url = `/packagesMine/meetingDetails/meetingDetails?id=${res.data}`
                                if (that.id) {
                                    uni.showToast({
                                        title: '编辑成功',
                                        icon: 'none',
                                        duration: 2000,
                                        complete() {
                                            setTimeout(() => {
                                                uni.reLaunch({
                                                    url: url
                                                });
                                            }, 2000)
                                        }
                                    });
                                } else {
                                    uni.showToast({
                                        title: '预约成功',
                                        icon: 'none',
                                        duration: 2000,
                                        complete() {
                                            setTimeout(() => {
                                                uni.reLaunch({
                                                    url: url
                                                });
                                            }, 2000)
                                        }
                                    });
                                }
                            }
                        })
                    },
                    fail(err) {
                        console.log(err)
                        // uni.showToast({
                        //     title: '订阅失败',
                        //     icon: 'error',
                        //     duration: 2000
                        // });
                    }
                })
            },
            serviceItems(i) {
                this.info.projectList[i].active = !this.info.projectList[i].active
            },
            getDesc() {
                this.$u.api.getRoomDetail({ roomId: this.roomId })
                    .then(res => {
                        res.data.projectList.forEach(item => {
                            item.active = false
                        })
                        this.info = res.data
                    })
            },
            uploadFile() {
                var that = this
                uni.chooseImage({
                    success: (chooseImageRes) => {
                        for (let i = 0; i < chooseImageRes.tempFilePaths.length; i++) {
                            uni.uploadFile({
                                url: `${that.$baseUrl}public/uploadLocal`,
                                filePath: chooseImageRes.tempFilePaths[i],
                                name: 'file',
                                formData: {
                                    'folder': 'projects'
                                },
                                success: (uploadFileRes) => {
                                    console.log(JSON.parse(uploadFileRes.data));
                                    let res = JSON.parse(uploadFileRes.data).data
                                    that.from.files.push({
                                        fileurl: res.imgaddr,
                                        name: res.imgname,
                                        url: res.url
                                    })
                                }
                            });
                        }
                    }
                });
            },
            jump() {
                uni.navigateTo({
                    url: `/packagesMine/selectPersonnel/selectPersonnel?startTime=${this.startTime}&endTime=${this.endTime}`
                });
            }
        }
    }
</script>
<style lang="scss">
    .confirm {
        width: 100%;
        padding-bottom: calc(108rpx + env(safe-area-inset-bottom));
        .confirm_a {
            width: 100%;
            padding: 30rpx;
            box-sizing: border-box;
            background-color: #fff;
            .confirm_a_item {
                width: 100%;
                display: flex;
                flex-direction: column;
                padding-bottom: 30rpx;
                margin-bottom: 30rpx;
                border-bottom: 1rpx solid #E5E5E5;
                &:last-child {
                    margin-bottom: 0 !important;
                    border: none !important;
                    padding-bottom: 0 !important;
                }
                .label {
                    font-size: 28rpx;
                    font-family: PingFangSC-Regular, PingFang SC;
                    font-weight: 400;
                    color: #666666;
                    margin-bottom: 30rpx;
                }
                .content {
                    font-size: 30rpx;
                    font-family: PingFangSC-Regular, PingFang SC;
                    font-weight: 400;
                    color: #222222;
                }
            }
        }
        .confirm_b {
            width: 100%;
            margin-top: 20rpx;
            padding: 30rpx;
            background: #fff;
            box-sizing: border-box;
            .confirm_b_item {
                display: flex;
                flex-direction: column;
                padding-bottom: 30rpx;
                margin-bottom: 30rpx;
                border-bottom: 1rpx solid #E5E5E5;
                &:last-child {
                    margin-bottom: 0 !important;
                    border: none !important;
                    padding-bottom: 0 !important;
                }
                .select {
                    width: 100%;
                    display: flex;
                    align-items: center;
                    justify-content: space-between;
                    .select_right {
                        flex-shrink: 0;
                        margin-left: 20rpx;
                        color: #999999;
                        font-size: 24rpx;
                    }
                    text {
                        flex: 1;
                        font-size: 30rpx;
                        font-family: PingFangSC-Regular, PingFang SC;
                        font-weight: 400;
                        color: #999999;
                        overflow:hidden;
                        white-space: nowrap;
                        text-overflow: ellipsis;
                        -o-text-overflow:ellipsis;
                    }
                }
                .uplaod {
                    width: 100%;
                    .uplaod_item {
                        width: 100%;
                        // word-break: break-all;
                        margin-bottom: 20rpx;
                        display: flex;
                        align-items: center;
                        justify-content: space-between;
                        &:last-child {
                            margin-bottom: 0 !important;
                        }
                        .uplaod_item_url {
                            flex: 1;
                            overflow: hidden;
                            white-space: nowrap;
                            text-overflow: ellipsis;
                            text {
                                font-size: 28rpx;
                                font-family: PingFangSC-Regular, PingFang SC;
                                font-weight: 400;
                                color: #0055FF;
                                text-decoration: underline;
                            }
                            // .u-link {
                            //     width: 200rpx !important;
                            //     overflow: hidden !important;
                            //     white-space: nowrap !important;
                            //     text-overflow: ellipsis !important;
                            // }
                        }
                        .dele {
                            font-size: 26rpx;
                            font-family: PingFangSC-Regular, PingFang SC;
                            font-weight: 400;
                            color: #666666;
                            flex-shrink: 0;
                            margin-left: 20rpx;
                        }
                    }
                    .uplaod_box {
                        width: 212rpx;
                        height: 64rpx;
                        line-height: 64rpx;
                        text-align: center;
                        border-radius: 4rpx;
                        border: 1rpx solid #0055FF;
                        image {
                            width: 28rpx;
                            height: 28rpx;
                            margin-right: 8rpx;
                        }
                        text {
                            font-size: 28rpx;
                            font-family: PingFangSC-Regular, PingFang SC;
                            font-weight: 400;
                            color: #0055FF;
                        }
                    }
                }
                .multiple {
                    width: 100%;
                    display: flex;
                    align-items: center;
                    flex-wrap: wrap;
                    .active {
                        background: #0055FF !important;
                        color: #FFFFFF !important;
                    }
                    .multiple_item {
                        padding: 18rpx 32rpx;
                        background: #F7F7F7;
                        border-radius: 4rpx;
                        box-sizing: border-box;
                        font-size: 28rpx;
                        font-family: PingFangSC-Regular, PingFang SC;
                        font-weight: 400;
                        color: #333333;
                        margin-right: 20rpx;
                        margin-bottom: 20rpx;
                    }
                }
                .label {
                    display: flex;
                    align-items: center;
                    margin-bottom: 30rpx;
                    text {
                        &:nth-child(1) {
                            font-size: 28rpx;
                            font-family: PingFangSC-Regular, PingFang SC;
                            font-weight: 400;
                            color: #666666;
                            margin-right: 8rpx;
                        }
                        &:nth-child(2) {
                            font-size: 28rpx;
                            font-family: PingFangSC-Regular, PingFang SC;
                            font-weight: 400;
                            color: #F62710;
                        }
                    }
                }
                .input /deep/ {
                    width: 100%;
                    display: flex;
                    flex-direction: column;
                    align-items: flex-end;
                    textarea {
                        width: 100%;
                    }
                    .u-textarea {
                        padding: 0 !important;
                    }
                    .placeholder {
                        font-size: 30rpx;
                        font-family: PingFangSC-Regular, PingFang SC;
                        font-weight: 400;
                        color: #999999;
                    }
                    input {
                        width: 100%;
                        font-size: 30rpx;
                        font-family: PingFangSC-Regular, PingFang SC;
                        font-weight: 400;
                        color: #000000;
                    }
                }
            }
        }
        .confirm_footer {
            width: 100%;
            position: fixed;
            bottom: 0;
            box-sizing: border-box;
            padding: 10rpx 30rpx calc(10rpx + env(safe-area-inset-bottom)) 30rpx;
            z-index: 9;
            .confirm_footer_btn {
                width: 690rpx;
                height: 88rpx;
                line-height: 88rpx;
                text-align: center;
                background: #0055FF;
                border-radius: 4rpx;
                font-size: 30rpx;
                font-family: PingFangSC-Regular, PingFang SC;
                font-weight: 400;
                color: #FFFFFF;
            }
        }
    }
</style>
h5/packagesMine/meetingDetails/meetingDetails.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,676 @@
<template>
    <page-meta :page-style="'overflow:'+(pageShow?'hidden':'visible')"></page-meta>
    <view class="details">
        <view class="details_head">
            <text>{{info.meetingName || ''}}</text>
            <text>{{info.roomName || ''}}|{{info.meetingDate || ''}} {{info.meetingTime || ''}}</text>
        </view>
        <view class="details_content">
            <view class="details_content_item">
                <view class="label">参会人员</view>
                <view class="content" v-if="info.userResponseList && info.userResponseList.length > 0">
                    <text v-for="(item, index) in info.userResponseList" :key="index">
                        {{ item.realname }}({{item.departmentName}})<template v-if="index !== info.userResponseList.length - 1">;</template>
                    </text>
                </view>
            </view>
            <view class="details_content_item" v-if="info.meetingContent">
                <view class="label">会议内容</view>
                <view class="content">
                    <text>{{info.meetingContent || ''}}</text>
                </view>
            </view>
            <view class="details_content_item" v-if="info.projectsResponseList && info.projectsResponseList.length > 0">
                <view class="label">服务项</view>
                <view class="content" v-if="info.projectsResponseList && info.projectsResponseList.length > 0">
                    <text v-for="(item, index) in info.projectsResponseList" :key="index">
                        {{item.name}}<template v-if="index !== info.projectsResponseList.length - 1"> | </template>
                    </text>
                </view>
                <view class="content" v-else>
                    <text>无服务项</text>
                </view>
            </view>
            <view class="details_content_item">
                <view class="label">附件</view>
                <view class="list" v-if="info.multiFileList && info.multiFileList.length > 0">
                    <view class="list_item" v-for="(item, index) in info.multiFileList" :key="index">
                        <u--text mode="link" :text="item.name" :href="item.fileFullUrl + item.fileurl"></u--text>
                    </view>
                </view>
                <view class="content" v-else>
                    <text>无</text>
                </view>
            </view>
            <view class="details_content_item" v-if="info.remark">
                <view class="label">备注</view>
                <view class="content">
                    <text>{{info.remark || ''}}</text>
                </view>
            </view>
        </view>
        <view class="details_content">
            <view class="details_content_item">
                <view class="label">预约人</view>
                <view class="content">
                    <text>{{info.bookingUser.departmentName || ''}} {{info.bookingUser.realname || ''}} {{info.bookingUser.mobile || ''}}</text>
                </view>
            </view>
        </view>
        <!-- å†…部用户自己发布 -->
        <view class="details_footer" v-if="userInfo.id === info.bookingUser.id && userInfo.type === 0 && info.meetingStatus !== 3">
            <view class="details_footer_left">
                <view class="item" @click="copy" v-if="info.meetingStatus === 1 || info.meetingStatus === 2">
                    <image src="@/static/meeting/icon/ic_copy@2x.png" mode="widthFix"></image>
                    <text>复制</text>
                </view>
                <view class="item" @click="edit" v-if="info.meetingStatus === 1">
                    <image src="@/static/meeting/icon/ic_edit@2x.png" mode="widthFix"></image>
                    <text>修改</text>
                </view>
                <view class="item" @click="closeRoom" v-if="info.meetingStatus === 1">
                    <image src="@/static/meeting/icon/ic_cancel@2x.png" mode="widthFix"></image>
                    <text>取消</text>
                </view>
            </view>
            <view class="details_footer_right">
                <view class="btn1">
                    <button open-type="share"></button>
                    åˆ†äº«
                </view>
                <view class="btn2" @click="open" v-if="isShow">开门码</view>
            </view>
        </view>
        <!-- å†…部用户不是自己发布 -->
        <view class="details_footer" v-else-if="userInfo.id !== info.bookingUser.id && userInfo.type === 0 && info.meetingStatus !== 3">
            <view class="details_footer_left">
                <view class="item" @click="copy" v-if="info.meetingStatus === 1 || info.meetingStatus === 2">
                    <image src="@/static/meeting/icon/ic_copy@2x.png" mode="widthFix"></image>
                    <text>复制</text>
                </view>
            </view>
            <view class="details_footer_right">
                <view class="btn1">
                    <button open-type="share"></button>
                    åˆ†äº«
                </view>
                <view class="btn2" @click="open" v-if="isShow">开门码</view>
            </view>
        </view>
        <!-- è®¿å®¢ -->
        <view class="details_footer" v-else-if="(!userInfo || userInfo.type === 1) && info.meetingStatus !== 3">
            <button class="details_footer_submit" v-if="!userInfo" open-type="getPhoneNumber" @getphonenumber="getphonenumber">查看会议室开门码</button>
            <view class="details_footer_submit" v-else @click="open">查看会议室开门码</view>
        </view>
        <view v-else></view>
        <!-- å¼€é—¨ç  -->
        <view class="details_ma">
            <u-popup :show="show" :overlayStyle="{'touch-action':'none'}" :closeable="true" :safeAreaInsetBottom="false" :round="0" mode="center" @close="close">
                <view class="box" @touchmove.stop.prevent="preventHandle">
                    <text class="box_a">{{info.roomName || ''}}</text>
                    <text class="box_b" v-if="time > 0">二维码{{time}}秒内有效</text>
                    <text class="box_b" v-else>二维码已过期,请点击二维码刷新</text>
                    <view class="qrcode" @click="Refresh(1)">
                        <image :src="qrurl" mode="widthFix"></image>
                    </view>
                    <text class="box_c">出示该二维码,扫码进入会议室</text>
                    <text class="box_d" v-if="info.roomUser">如果打不开请联系管理员:</text>
                    <text class="box_e" v-if="info.roomUser">{{info.roomUser.realname}} <template v-if="info.roomUser.mobile">{{info.roomUser.mobile}}</template></text>
                </view>
            </u-popup>
        </view>
        <u-modal
        :show="show1"
        title="提示"
        content='是否确认取消当前会议'
        @confirm="confirm"
        @cancel="close1"
        ref="uModal"
        :showCancelButton="true"
        asyncClose="true"></u-modal>
    </view>
</template>
<script>
    import { mapState, mapMutations } from 'vuex'
    import tkiQrcode from "@/components/tki-qrcode/tki-qrcode.vue"
    export default {
        data() {
            return {
                roomId: '',
                pageShow: false,
                show: false,
                show1: false,
                info: {},
                val: '',
                time: 0,
                link: '',
                qrurl: '',
                timer: null,
                timeValue: '',
                isShow: false,
                imageUrl: 'https://dmtest.ahapp.net/file/projects/20230511/13f256b832db4a4fadc5e6770f5727bf.png'
            };
        },
        components: { tkiQrcode },
        onLoad(options) {
            // æ‰«ç è¿›å…¥
            if (options.scene) {
                console.log('扫码进入')
                let scene = decodeURIComponent(options.scene);
                console.log(scene)
                let roomId = scene.substring(0, scene.indexOf('|'))
                this.roomId = roomId
            }
            // åˆ†äº«è¿›å…¥
            if (options.shareId) {
                console.log('分享进入')
                this.roomId = options.shareId
            }
            // æ­£å¸¸è¿›å…¥
            if (options.id) {
                this.roomId = options.id
            }
            this.getdesc()
            this.getSYSTEM()
        },
        computed: {
            ...mapState(['userInfo', 'token'])
        },
        onShareAppMessage({from,target}) {
            if (from == 'button') {
                return {
                    title: this.info.meetingName,
                    path: `/packagesMine/meetingDetails/meetingDetails?shareId=${this.info.id}`,
                    imageUrl: this.imageUrl
                }
            }
        },
        methods: {
            ...mapMutations(["setToken", "setUserInfo"]),
            // åˆ·æ–°äºŒç»´ç 
            Refresh(type) {
                if (this.time !== 0) return
                uni.showLoading({
                    title: '加载中',
                    mask: true
                });
                uni.request({
                    url: `${this.$baseUrl}web/meeting/getQrCodeImg?id=${this.info.id}&token=${this.token}`,//url地址
                    method: 'GET',
                    responseType: 'arraybuffer',
                    header: {
                        'Content-Type': 'application/json'
                    },
                    success: res => {
                        const arrayBuffer = new Uint8Array(res.data)
                        const base64 = "data:image/png;base64," + uni.arrayBufferToBase64(arrayBuffer) //这里需要添加前缀
                        this.qrurl = base64
                        if (type === 1) {
                            this.time = Number(this.timeValue) * 60
                            this.getTime()
                        }
                    },
                    complete() {
                        uni.hideLoading();
                    }
                });
            },
            onChange(e) {
                this.timeData = e
            },
            preventHandle() {
                return
            },
            getTime() {
                this.timer = setInterval(() => {
                    if (this.time === 0) {
                        clearInterval(this.timer)
                        this.timer = null
                        this.time = 0
                        return
                    }
                    this.time = this.time - 1
                }, 1000)
            },
            // è®¿å®¢ç™»å½•获取信息
            getphonenumber(e) {
                var that = this
                if (e.detail.errMsg === 'getPhoneNumber:ok') {
                    uni.login({
                        provider: 'MP-WEIXIN',
                        success: function (loginRes) {
                            that.$u.api.visitorLogin({
                                code: loginRes.code
                            }).then(res => {
                                if (res.data.code === 500) {
                                    that.$u.api.visitorWxPhone({
                                        encryptedData: e.detail.encryptedData,
                                        iv: e.detail.iv,
                                        openId: res.data.openId,
                                        sessionKey: res.data.sessionKey
                                    }).then(resa => {
                                        that.setToken(resa.data.token)
                                        that.setUserInfo(resa.data.systemUser)
                                    })
                                } else {
                                    that.setToken(res.data.token)
                                    that.setUserInfo(res.data.systemUser)
                                }
                            })
                        }
                    });
                }
            },
            // è®¿å®¢ç™»å½•
            wxlogin() {
                var that = this
                uni.login({
                    provider: 'MP-WEIXIN',
                    success: function (loginRes) {
                        that.$u.api.visitorLogin({
                            code: loginRes.code
                        }).then(res => {
                            that.setToken(res.data.token)
                            that.setUserInfo(res.data.systemUser)
                        })
                    }
                });
            },
            getSYSTEM() {
                this.$u.api.getSystemDictData({
                    dictCode: 'SYSTEM',
                    label: 'QR_OPENBOOK_VALIDTIME'
                }).then(res => {
                    // this.time = res.data.code
                    this.time = Number(res.data.code) * 60
                    this.timeValue = Number(res.data.code)
                })
                this.$u.api.getSystemDictData({
                    dictCode: 'SYSTEM',
                    label: 'H5_LINK_ADDR'
                }).then(res => {
                    this.link = res.data.code
                })
            },
            edit() {
                if (this.info.meetingStatus !== 1) {
                    uni.showToast({
                        title: '会议不可编辑',
                        icon: "none",
                        duration: 2000
                    });
                    return
                }
                uni.navigateTo({
                    url: `/packagesMine/confirmAppointment/confirmAppointment?roomId=${this.info.roomId}&descid=${this.info.id}&timeList=${JSON.stringify(this.info.bookingTimeList)}`
                });
            },
            close1() {
                this.show1 = false
            },
            confirm() {
                var that = this
                that.$u.api.reservationCancel({
                    id: that.roomId
                }).then(res => {
                    that.show1 = false;
                    if (res.code === 200) {
                        that.getdesc()
                        uni.navigateBack({
                            delta: 1
                        });
                    }
                })
            },
            closeRoom() {
                this.show1 = true;
            },
            copy() {
                let val = `${this.info.bookingUser.realname} é‚€è¯·æ‚¨åŠ å…¥ä¼šè®®
会议主题:${this.info.meetingName}
会议室:${this.info.roomName}
会议时间:${this.info.meetingDate} ${this.info.meetingTime}
点击链接直接加入会议:
${this.link}?id=${this.info.id}`
                uni.setClipboardData({
                    data: val,
                    success: function () {
                        uni.showToast({
                            title: '会议信息复制成功,去分享给同事吧~',
                            icon:'none',
                            duration: 2000
                        });
                    }
                });
            },
            close() {
                this.pageShow = false
                this.show = false
                this.time = 0
                clearInterval(this.timer)
                this.timer = null
                uni.setScreenBrightness({
                    value: 0.5,
                    success: function () {
                        console.log('success');
                    }
                });
            },
            open() {
                var that = this
                this.time = 0
                this.Refresh(2)
                this.time = this.timeValue * 60
                this.getTime()
                that.pageShow = true
                that.show = true
                uni.setScreenBrightness({
                    value: 1,
                    success: function () {
                        console.log('success');
                    }
                });
            },
            getQrCodes() {
            },
            getdesc() {
                this.$u.api.meetingDetail({ id: this.roomId })
                    .then(res => {
                        this.info = res.data
                        if (res.data.meetingStatus === 3) return
                        res.data.userResponseList.forEach(item => {
                            if (item.id === this.userInfo.id) {
                                this.isShow = true
                            }
                        })
                        if (!this.isShow && this.userInfo && this.userInfo.id) {
                            uni.showToast({
                                title: '您已经不在当前会议',
                                icon: 'none',
                                duration: 2000
                            });
                        }
                    })
            },
            qrR(e) {
                console.log(e)
            }
        }
    }
</script>
<style lang="scss" scoped>
.time {
    @include flex;
    align-items: center;
    &__custom {
         margin-top: 4px;
         width: 22px;
         height: 22px;
         background-color: $u-primary;
         border-radius: 4px;
         /* #ifndef APP-NVUE */
         display: flex;
         /* #endif */
         justify-content: center;
         align-items: center;
        &__item {
             color: #fff;
             font-size: 12px;
             text-align: center;
         }
    }
    &__doc {
         color: $u-primary;
         padding: 0px 4px;
     }
    &__item {
         color: #606266;
         font-size: 15px;
         margin-right: 4px;
     }
}
</style>
<style lang="scss" scoped>
    .details {
        width: 100%;
        padding-bottom: calc(140rpx + env(safe-area-inset-bottom));
        .details_head {
            width: 100%;
            padding: 30rpx;
            box-sizing: border-box;
            display: flex;
            flex-direction: column;
            background-color: #ffffff;
            text {
                &:first-child {
                    font-size: 36rpx;
                    font-family: PingFangSC-Semibold, PingFang SC;
                    font-weight: 600;
                    color: #222222;
                }
                &:last-child {
                    font-size: 28rpx;
                    font-family: PingFangSC-Regular, PingFang SC;
                    font-weight: 400;
                    color: #666666;
                    margin-top: 30rpx;
                }
            }
        }
        .details_content {
            width: 100%;
            padding: 30rpx;
            box-sizing: border-box;
            background-color: #ffffff;
            margin-top: 20rpx;
            display: flex;
            flex-direction: column;
            .details_content_item {
                display: flex;
                flex-direction: column;
                padding-bottom: 30rpx;
                margin-top: 30rpx;
                border-bottom: 1rpx solid #E5E5E5;
                &:first-child {
                    margin-top: 0 !important;
                }
                &:last-child {
                    border: none !important;
                    padding-bottom: 0 !important;
                }
                .label {
                    font-size: 28rpx;
                    font-family: PingFangSC-Regular, PingFang SC;
                    font-weight: 400;
                    color: #666666;
                    margin-bottom: 22rpx;
                }
                .list {
                    display: flex;
                    flex-direction: column;
                    .list_item {
                        width: 100%;
                        word-break: break-all;
                        margin-bottom: 24rpx;
                        &:last-child {
                            margin-bottom: 0 !important;
                        }
                    }
                }
                .content {
                    display: flex;
                    align-items: center;
                    flex-wrap: wrap;
                    text {
                        font-size: 30rpx;
                        font-family: PingFangSC-Regular, PingFang SC;
                        font-weight: 400;
                        color: #222222;
                    }
                }
            }
        }
        .details_footer {
            width: 100%;
            padding: 20rpx 30rpx calc(20rpx + env(safe-area-inset-bottom)) 30rpx;
            box-sizing: border-box;
            background-color: #ffffff;
            position: fixed;
            bottom: 0;
            left: 0;
            display: flex;
            align-items: center;
            justify-content: space-between;
            .details_footer_submit {
                width: 100%;
                height: 88rpx;
                line-height: 88rpx;
                text-align: center;
                background: #0055FF;
                border-radius: 4rpx;
                font-size: 30rpx;
                font-family: PingFangSC-Regular, PingFang SC;
                font-weight: 400;
                color: #FFFFFF;
            }
            .details_footer_left {
                display: flex;
                align-items: center;
                .item {
                    display: flex;
                    flex-direction: column;
                    margin-right: 40rpx;
                    image {
                        width: 44rpx;
                        height: 44rpx;
                    }
                    text {
                        font-size: 20rpx;
                        font-family: PingFangSC-Regular, PingFang SC;
                        font-weight: 400;
                        color: #666666;
                        margin-top: 8rpx;
                    }
                }
            }
            .details_footer_right {
                flex: 1;
                display: flex;
                align-items: center;
                .btn1 {
                    flex: 1;
                    height: 72rpx;
                    line-height: 72rpx;
                    text-align: center;
                    border-radius: 4rpx;
                    border: 2rpx solid #0055FF;
                    font-size: 30rpx;
                    font-family: PingFangSC-Regular, PingFang SC;
                    font-weight: 400;
                    color: #0055FF;
                    margin-right: 20rpx;
                    overflow: hidden;
                    position: relative;
                    button {
                        width: 100vw;
                        height: 300rpx;
                        position: absolute;
                        top: -20rpx;
                        left: -20rpx;
                        background: rgba(0, 0, 0, 0);
                        border: none;
                        z-index: 2;
                    }
                }
                .btn2 {
                    flex: 1;
                    height: 72rpx;
                    line-height: 72rpx;
                    text-align: center;
                    background: #0055FF;
                    box-shadow: 0rpx -1rpx 0rpx 0rpx #EEEEEE;
                    border-radius: 4rpx;
                    font-size: 30rpx;
                    font-family: PingFangSC-Regular, PingFang SC;
                    font-weight: 400;
                    color: #FFFFFF;
                }
            }
        }
        .details_ma /deep/ {
            .u-popup__content {
                width: 100%;
                .box {
                    width: 100%;
                    padding: 80rpx 0;
                    box-sizing: border-box;
                    background-color: #ffffff;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    flex-direction: column;
                    .box_a {
                        padding: 0 30rpx;
                        box-sizing: border-box;
                        font-size: 36rpx;
                        font-family: PingFangSC-Semibold, PingFang SC;
                        font-weight: 600;
                        color: #222222;
                    }
                    .box_b {
                        font-size: 28rpx;
                        font-family: PingFangSC-Regular, PingFang SC;
                        font-weight: 400;
                        color: #0055FF;
                        margin-top: 40rpx;
                    }
                    .qrcode {
                        width: 440rpx;
                        height: 440rpx;
                        margin-top: 40rpx;
                        overflow: hidden;
                        image {
                            width: 100%;
                            height: 100%;
                        }
                    }
                    .box_c {
                        font-size: 28rpx;
                        font-family: PingFangSC-Regular, PingFang SC;
                        font-weight: 400;
                        color: #333333;
                        margin-top: 40rpx;
                    }
                    .box_d {
                        font-size: 26rpx;
                        font-family: PingFangSC-Regular, PingFang SC;
                        font-weight: 400;
                        color: #666666;
                        margin-top: 32rpx;
                    }
                    .box_e {
                        font-size: 26rpx;
                        font-family: PingFangSC-Regular, PingFang SC;
                        font-weight: 400;
                        color: #666666;
                    }
                }
            }
        }
    }
</style>
h5/packagesMine/notice/notice.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,172 @@
<template>
    <view class="notice">
        <view class="notice_item" v-for="(item, index) in list" :key="index" @click="jump(item)">
            <view class="left">
                <view class="left_dian" v-if="item.status === 0"></view>
                <image src="@/static/meeting/icon/xiaoxi_ic_gonggao@2x.png" v-if="item.type === 1" mode="widthFix"></image>
                <image src="@/static/meeting/icon/xiaoxi_ic_gonggao@2x(1).png" v-else mode="widthFix"></image>
            </view>
            <view class="right">
                <view class="right_a">{{item.title}}</view>
                <view class="right_b" v-if="item.type === 1">
                    <view class="right_b_label">会议主题:</view>
                    <view class="right_b_val">{{item.meetingDetailResponse.meetingName}}</view>
                </view>
                <view class="right_b" v-if="item.type === 1">
                    <view class="right_b_label">会议时间:</view>
                    <view class="right_b_val">{{item.meetingDetailResponse.meetingDate}} {{item.meetingDetailResponse.meetingTime}}</view>
                </view>
                <view class="right_b" v-if="item.type === 1">
                    <view class="right_b_label">会议室:</view>
                    <view class="right_b_val">{{item.meetingDetailResponse.roomName}}</view>
                </view>
                <view class="right_b" v-if="item.type === 1">
                    <view class="right_b_label">预约人:</view>
                    <view class="right_b_val">{{item.meetingDetailResponse.bookingUserName}}</view>
                </view>
                <view class="right_c" v-if="item.type !== 1">{{item.createDate}}</view>
            </view>
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                page: 0,
                next: false,
                list: []
            };
        },
        onLoad() {
            this.getList()
        },
        onReachBottom(){
            this.getList()
        },
        methods: {
            getList() {
                if (!this.next) {
                    this.page = this.page + 1
                    this.$u.api.findNoticePage({
                        capacity: 20,
                        model: {
                        },
                        page: this.page
                    }).then(res => {
                        if (res.data.records.length > 0) {
                            this.list = [...this.list, ...res.data.records]
                        }
                        if (res.data.records.length < 20) {
                            this.next = false
                        }
                    })
                }
            },
            jump(item) {
                var that = this
                if (item.type === 0) {
                    uni.navigateTo({
                        url: `/packagesMine/notificationDetails/notificationDetails?content=${item.id}`
                    });
                } else {
                    that.$u.api.getMemberDTO({ id: item.id })
                        .then(res => {
                            that.list.forEach(element => {
                                if (element.id === item.id) {
                                    element.status = 1
                                }
                            })
                            uni.navigateTo({
                                url: `/packagesMine/meetingDetails/meetingDetails?id=${item.meetingDetailResponse.id}`
                            });
                        })
                }
            }
        }
    }
</script>
<style lang="scss">
    .notice {
        width: 100%;
        padding: 26rpx 30rpx;
        box-sizing: border-box;
        .notice_item {
            width: 100%;
            display: flex;
            align-items: flex-start;
            justify-content: space-between;
            background-color: #fff;
            padding: 30rpx;
            box-sizing: border-box;
            margin-bottom: 20rpx;
            &:last-child {
                margin-bottom: 0 !important;
            }
            .left {
                flex-shrink: 0;
                width: 72rpx;
                height: 72rpx;
                position: relative;
                margin-right: 24rpx;
                .left_dian {
                    position: absolute;
                    right: 0;
                    top: 0;
                    width: 18rpx;
                    height: 18rpx;
                    background: #F62710;
                    border: 2rpx solid #FFFFFF;
                    border-radius: 50%;
                }
                image {
                    width: 100%;
                    height: 100%;
                }
            }
            .right {
                flex: 1;
                display: flex;
                flex-direction: column;
                .right_a {
                    font-size: 32rpx;
                    font-family: PingFangSC-Medium, PingFang SC;
                    font-weight: 500;
                    color: #222222;
                    margin-bottom: 24rpx;
                }
                .right_c {
                    font-size: 26rpx;
                    font-family: PingFangSC-Regular, PingFang SC;
                    font-weight: 400;
                    color: #999999;
                }
                .right_b {
                    display: flex;
                    align-items: flex-start;
                    margin-bottom: 24rpx;
                    &:last-child {
                        margin-bottom: 0 !important;
                    }
                    .right_b_label {
                        flex-shrink: 0;
                        font-size: 26rpx;
                        font-family: PingFangSC-Regular, PingFang SC;
                        font-weight: 400;
                        color: #666666;
                    }
                    .right_b_val {
                        flex: 1;
                        font-size: 26rpx;
                        font-family: PingFangSC-Regular, PingFang SC;
                        font-weight: 400;
                        color: #333333;
                    }
                }
            }
        }
    }
</style>
h5/packagesMine/notificationDetails/notificationDetails.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
<template>
    <view class="details">
        <view class="details_head">
            <text>{{info.title}}</text>
            <text>{{info.createDate}}</text>
        </view>
        <u-parse :content="content"></u-parse>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                info: {},
                content:  ''
            };
        },
        onLoad(option) {
            this.$u.api.getNoticeDetail({ id: option.content })
                .then(res => {
                    this.content = res.data.content
                    this.info = res.data
                })
        }
    }
</script>
<style>
    page {
        background-color: #ffffff;
    }
</style>
<style lang="scss">
    .details {
        width: 100%;
        padding: 30rpx;
        box-sizing: border-box;
        .details_head {
            width: 100%;
            display: flex;
            flex-direction: column;
            margin-bottom: 38rpx;
            text {
                &:first-child {
                    font-size: 40rpx;
                    font-family: PingFangSC-Medium, PingFang SC;
                    font-weight: 500;
                    color: #222222;
                }
                &:last-child {
                    font-size: 26rpx;
                    font-family: PingFangSC-Regular, PingFang SC;
                    font-weight: 400;
                    color: #999999;
                    margin-top: 30rpx;
                }
            }
        }
    }
</style>
h5/packagesMine/reservation/reservation.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,439 @@
<template>
    <view class="reservation">
        <view class="date">
            <view class="date_head">
                <image src="@/static/meeting/icon/ar_left@2x.png" mode="widthFix" @click="getPreviousDays" v-if="!disable"></image>
                <image src="@/static/meeting/icon/ar_left_disable.png" mode="widthFix" v-else></image>
                <text @click="openDate">{{date}}</text>
                <image src="@/static/meeting/icon/ar_right@2x.png" mode="widthFix" @click="getNextDays"></image>
            </view>
            <scroll-view scroll-x="true" class="date_cate">
                <view class="date_cate_item" v-for="(item, index) in roomList" :key="index" @click="clickRoom(index)">
                    <text :class="i === index ? 'active' : ''">{{item.name}}</text>
                    <view class="date_cate_item_h" v-show="i === index"></view>
                </view>
            </scroll-view>
            <view class="date_list">
                <view
                    :style="{ background: item.active ? '#0055FF !important;' : '' }"
                    :class="item.isUse ? 'date_list_item disable' : 'date_list_item'"
                    v-for="(item, index) in timeList"
                    :key="index"
                    @click="clickTime(item, index)">
                    <text :style="{ color: item.active ? '#fff !important;' : '' }">{{item.startTime}}-{{item.endTime}}</text>
                </view>
                <view class="date_list_item1"></view>
            </view>
        </view>
        <view class="footer">
            <view class="footer_text">
                <view class="label">已选择:</view>
                <view class="content" v-if="selected.length > 0">{{roomList[i].name}}|{{selectedDate}}</view>
            </view>
            <view class="footer_submit">
                <view class="footer_submit_left">
                    <view class="footer_submit_left_item">
                        <view class="item_hz"></view>
                        <text>已选择</text>
                    </view>
                    <view class="footer_submit_left_item">
                        <view class="item_hz ke"></view>
                        <text>可预约</text>
                    </view>
                    <view class="footer_submit_left_item">
                        <view class="item_hz bu"></view>
                        <text>不可预约</text>
                    </view>
                </view>
                <view class="footer_submit_right" @click="submit">
                    ç¡®è®¤é¢„约
                </view>
            </view>
        </view>
        <u-calendar :defaultDate="defaultDateMultiple" :show="dateShow" @confirm="selectDate" @close="closeDate"></u-calendar>
    </view>
</template>
<script>
    import { getDay, getPreviousDay, getNowDate } from '@/utils/utils.js'
    export default {
        data() {
            return {
                i: 0,
                date: '',
                stringDate: '',
                number: 0,
                selected: [],
                roomList: [],
                timeList: [],
                status: 0,
                startnum: '',
                endnum: '',
                dateShow: false,
                time: '',
                disable: true,
                defaultDateMultiple: []
            };
        },
        onLoad() {
            this.date = getDay().today
            this.stringDate = getDay().date
            this.defaultDateMultiple = [getDay().date]
            this.getList()
        },
        computed: {
            selectedDate() {
                if (this.selected.length > 0) {
                    let start = this.selected[0].date.substring(0, 5)
                    let end = this.selected[this.selected.length - 1].date.substring(6, 11)
                    return `${start}-${end}`
                }
                return ''
            }
        },
        methods: {
            closeDate() {
                this.dateShow = false
            },
            selectDate(e) {
                this.number = 0
                this.disable = false
                this.time = getPreviousDay(this.number, e[0]).date
                this.date = getPreviousDay(this.number, e[0]).today
                this.stringDate = getPreviousDay(this.number, e[0]).date
                this.defaultDateMultiple = [getPreviousDay(this.number, e[0]).date]
                this.getOpeningHours()
                this.dateShow = false
            },
            openDate() {
                this.dateShow = true
            },
            submit() {
                if (this.selected.length === 0) {
                    uni.showToast({
                        title: '请先选择预约时间',
                        icon: 'none',
                        duration: 2000
                    });
                    return
                }
                let time = `${this.date.substring(0, 11)} ${this.selectedDate}`
                let timeList = JSON.stringify(this.selected)
                let startTime = `${this.stringDate} ${this.selectedDate.substring(0, 5)}`
                let endTime = `${this.stringDate} ${this.selectedDate.substring(6, 11)}`
                uni.navigateTo({
                    url: `/packagesMine/confirmAppointment/confirmAppointment?endTime=${endTime}&startTime=${startTime}&id=${this.roomList[this.i].id}&time=${time}&list=${timeList}`
                });
            },
            // é€‰æ‹©å¼€æ”¾æ—¶é—´
            clickTime(obj, index) {
                if (obj.status === 1) return
                if (this.status === 0) {
                    this.timeList.forEach(item => {
                        item.active = false
                    })
                    this.selected = []
                    this.timeList[index].active = !this.timeList[index].active
                    this.startnum = index
                    this.status = 1
                } else if (this.status === 1) {
                    this.endnum = index
                    let startnum = ''
                    let endnum = ''
                    if (this.startnum > this.endnum) {
                        startnum = this.startnum
                        endnum = this.endnum
                    } else {
                        startnum = this.endnum
                        endnum = this.startnum
                    }
                    for (let i = 0; i < this.timeList.length; i++) {
                        if (i <= startnum && i >= endnum) {
                            if (this.timeList[i].isUse) {
                                uni.showToast({
                                    title: '所选日期包含不可选日期',
                                    icon: 'none',
                                    duration: 2000
                                });
                                this.status = 0
                                return
                            }
                        }
                    }
                     this.timeList.forEach((element, i) => {
                        if (i <= startnum && i >= endnum) {
                            element.active = true
                            this.selected.push({date: `${element.startTime}-${element.endTime}`, timeId: element.id, id: element.bookingTimeId})
                        } else {
                            element.active = false
                        }
                    })
                    this.status = 0
                }
            },
            // ä¼šè®®å®¤å¼€æ”¾æ—¶é—´
            getOpeningHours() {
                this.$u.api.getRoomUseTime({
                    roomId: this.roomList[this.i].id,
                    yudingDate: this.stringDate
                }).then(res => {
                    res.data.forEach(item => {
                        item.active = false
                    })
                    this.timeList = res.data
                })
            },
            // åˆ‡æ¢ä¼šè®®å®¤
            clickRoom(i) {
                this.i = i
                this.status = 0
                this.selected = []
                this.timeList = []
                this.getOpeningHours()
            },
            getList() {
                this.$u.api.roomsList()
                    .then(res => {
                        if (res.data.length > 0) {
                            this.roomList = res.data
                            this.getOpeningHours()
                        }
                    })
            },
            // ä¸Šä¸€å¤©æ—¥æœŸ
            getPreviousDays() {
                if (this.disable) true
                if (getPreviousDay(1, this.stringDate).date === getDay().date) {
                    this.disable = true
                } else {
                    this.disable = false
                }
                this.number = this.number + 1
                this.date = getPreviousDay(this.number, this.time ? this.time : '').today
                this.stringDate = getPreviousDay(this.number, this.time ? this.time : '').date
                this.defaultDateMultiple = [getPreviousDay(this.number, this.time ? this.time : '').date]
                this.getOpeningHours()
            },
            // ä¸‹ä¸€è·³æ—¥æœŸ
            getNextDays() {
                this.disable = false
                this.number = this.number - 1
                this.date = getPreviousDay(this.number, this.time ? this.time : '').today
                this.stringDate = getPreviousDay(this.number, this.time ? this.time : '').date
                this.defaultDateMultiple = [getPreviousDay(this.number, this.time ? this.time : '').date]
                this.getOpeningHours()
            }
        }
    }
</script>
<style>
    page {
        background-color: #ffffff !important;
    }
</style>
<style lang="scss" scoped>
    .reservation {
        width: 100%;
        padding-bottom: calc(env(safe-area-inset-bottom) + 160rpx);
        .date {
            width: 100%;
            padding: 30rpx 0;
            box-sizing: border-box;
            .date_head {
                width: 100%;
                padding: 0 30rpx;
                box-sizing: border-box;
                display: flex;
                align-items: center;
                justify-content: center;
                image {
                    width: 30rpx;
                    height: 30rpx;
                }
                text {
                    font-size: 32rpx;
                    font-family: PingFangSC-Semibold, PingFang SC;
                    font-weight: 600;
                    color: #222222;
                    margin: 0 40rpx
                }
            }
            .date_cate {
                white-space: nowrap;
                width: 100%;
                padding: 0 30rpx;
                box-sizing: border-box;
                // padding-bottom: 32rpx;
                height: 70rpx;
                box-sizing: border-box;
                margin-top: 62rpx;
                border-bottom: 1rpx solid #E5E5E5;
                .date_cate_item {
                    display: inline-block;
                    margin-right: 54rpx;
                    position: relative;
                    &:last-child {
                        margin-right: 0 !important;
                    }
                    .date_cate_item_h {
                        position: absolute;
                        bottom: -30rpx;
                        left: 50%;
                        transform: translate(-50%, 0);
                        width: 60rpx;
                        height: 10rpx;
                        background-color: #0055FF;
                    }
                    .active {
                        font-size: 30rpx;
                        font-family: PingFangSC-Semibold, PingFang SC;
                        font-weight: 600;
                        color: #0055FF;
                    }
                    text {
                        font-size: 28rpx;
                        font-family: PingFangSC-Regular, PingFang SC;
                        font-weight: 400;
                        color: #333333;
                    }
                }
            }
            .date_list {
                width: 100%;
                padding: 28rpx 30rpx;
                box-sizing: border-box;
                display: flex;
                align-items: center;
                justify-content: space-between;
                flex-wrap: wrap;
                .date_list_item1 {
                    width: 220rpx;
                    height: 0;
                }
                .active {
                    background: #0055FF !important;
                    text {
                        color: #FFFFFF !important;
                    }
                }
                .disable {
                    background: #CCCCCC !important;
                    text {
                        color: #999999 !important;
                    }
                }
                .date_list_item {
                    width: 220rpx;
                    height: 80rpx;
                    background: #F7F7F7;
                    border-radius: 4rpx;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    margin-bottom: 24rpx;
                    text {
                        font-size: 30rpx;
                        font-family: PingFangSC-Regular, PingFang SC;
                        font-weight: 400;
                        color: #222222;
                    }
                }
            }
        }
        .footer {
            width: 100%;
            padding: 0 30rpx;
            box-sizing: border-box;
            // height: 100rpx;
            background: #FFFFFF;
            // box-shadow: 0rpx -1rpx 0rpx 0rpx #EEEEEE;
            position: fixed;
            bottom: 0;
            padding-bottom: env(safe-area-inset-bottom);
            flex-direction: column;
            .footer_text {
                width: 100%;
                height: 30rpx;
                display: flex;
                align-items: center;
                margin-bottom: 30rpx;
                .label {
                    flex-shrink: 0;
                    font-size: 28rpx;
                    font-family: PingFangSC-Regular, PingFang SC;
                    font-weight: 400;
                    color: #222222;
                    margin-right: 20rpx;
                }
                .content {
                    font-size: 28rpx;
                    font-family: PingFangSC-Regular, PingFang SC;
                    font-weight: 400;
                    color: #0055FF;
                }
            }
            .footer_submit {
                width: 100%;
                height: 100rpx;
                box-shadow: 0rpx -1rpx 0rpx 0rpx #EEEEEE;
                display: flex;
                align-items: center;
                justify-content: space-between;
                .footer_submit_left {
                    flex: 1;
                    display: flex;
                    align-items: center;
                    .footer_submit_left_item {
                        display: flex;
                        align-items: center;
                        margin-right: 20rpx;
                        &:last-child {
                            margin-right: 0 !important;
                        }
                        .item_hz {
                            width: 32rpx;
                            height: 32rpx;
                            background: #0055FF;
                            border-radius: 4rpx;
                            margin-right: 10rpx;
                        }
                        .ke {
                            background: #F7F7F7 !important;
                        }
                        .bu {
                            background: #CCCCCC !important;
                        }
                        text {
                            font-size: 26rpx;
                            font-family: PingFangSC-Regular, PingFang SC;
                            font-weight: 400;
                            color: #333333;
                        }
                    }
                }
                .footer_submit_right {
                    flex-shrink: 0;
                    width: 184rpx;
                    height: 72rpx;
                    line-height: 72rpx;
                    text-align: center;
                    background: #0055FF;
                    box-shadow: 0rpx -1rpx 0rpx 0rpx #EEEEEE;
                    border-radius: 4rpx;
                    font-size: 30rpx;
                    font-family: PingFangSC-Regular, PingFang SC;
                    font-weight: 400;
                    color: #FFFFFF;
                }
            }
        }
    }
</style>
h5/packagesMine/selectPersonnel/selectPersonnel.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,434 @@
<template>
    <view class="select">
        <view class="select_input">
            <view class="select_input_box">
                <u--input
                    placeholder="搜索部门/人员"
                    prefixIcon="search"
                    v-model="keyword"
                    @confirm="confirm"
                    prefixIconStyle="font-size: 26rpx;color: #B2B2B2"
                ></u--input>
            </view>
        </view>
        <view class="select_list" v-if="list && list.length > 0">
            <view class="select_list_item" v-for="(item, index) in list" :key="index" @click="clickItem(index)">
                <view class="left">
                    <view class="left_img">
                        <image :src="item.prefixUrl + item.avatar" mode="widthFix" v-if="item.avatar"></image>
                        <view class="left_img_t">{{ item.realname.substring(0, 1) }}</view>
                    </view>
                    <view class="left_info">
                        <view class="left_info_top">
                            <text>{{item.realname}}</text>
                            <text v-if="item.status === 1">有会议</text>
                        </view>
                        <view class="left_info_bm">{{item.departmentName}}</view>
                    </view>
                </view>
                <image class="xuan" v-if="!item.active" src="@/static/meeting/icon/ic_choose@2x.png" mode="widthFix"></image>
                <image class="xuan" v-else src="@/static/meeting/icon/ic_choose_sel@2x.png" mode="widthFix"></image>
            </view>
        </view>
        <view class="select_list" v-else>
            <view class="select_list_wu">
                <image src="@/static/meeting/common/364.png" mode="widthFix"></image>
            </view>
        </view>
        <view class="select_zw"></view>
        <view class="select_footer">
            <view class="footer_top">
                <view class="footer_top_label">已选择:</view>
                <view class="footer_top_content">
                    {{users}}
                </view>
                <image @click="show = true" src="@/static/meeting/icon/renyuan_ic_open@2x.png" mode="widthFix"></image>
            </view>
            <view class="footer_btn" @click="go">确认({{selected.length}}/{{list.length}})</view>
        </view>
        <u-popup :show="show" :round="20" mode="bottom" @close="show = false">
            <view class="select_box">
                <view class="select_box_head">
                    <text>已选择:{{selected.length}}人</text>
                    <text @click="show = false">确认</text>
                </view>
                <scroll-view scroll-y="true" class="select_box_list">
                    <view class="select_box_list_item" v-for="(item, index) in selected" :key="index">
                        <view class="left">
                            <view class="left_img">
                                <image :src="item.prefixUrl + item.avatar" mode="widthFix" v-if="item.avatar"></image>
                                <view class="left_img_t" v-else>{{ item.realname.substring(0, 1) }}</view>
                            </view>
                            <view class="left_info">
                                <text>{{item.realname}}</text>
                                <text>{{item.departmentName}}</text>
                            </view>
                        </view>
                        <view class="dele" @click="dele(index)">移除</view>
                    </view>
                </scroll-view>
            </view>
        </u-popup>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                show: false,
                next: false,
                page: 0,
                list: [],
                keyword: '',
                selectedName: [],
                selectedIds: [],
                selected: [],
                startTime: '',
                endTime: ''
            };
        },
        onLoad(option) {
            this.startTime = option.startTime
            this.endTime = option.endTime
            this.getList()
        },
        computed: {
            users() {
                return this.selectedName.join(';')
            }
        },
        methods: {
            go() {
                uni.$emit('user', { userList: this.selectedIds, usersName: this.users })
                uni.navigateBack({
                    delta: 1
                });
            },
            dele(i) {
                this.list.forEach(item => {
                    if (item.id === this.selectedIds[i].userId) {
                        item.active = false
                    }
                })
                this.selectedName.splice(i, 1)
                this.selectedIds.splice(i, 1)
                this.selected.splice(i, 1)
            },
            confirm() {
                this.list = []
                this.next = false
                this.page = 0
                this.getList()
            },
            clickItem(i) {
                this.selectedName = []
                this.selectedIds = []
                this.selected = []
                this.list[i].active = !this.list[i].active
                this.list.forEach(item => {
                    if (item.active) {
                        this.selectedName.unshift(item.realname)
                        this.selectedIds.unshift({ userId: item.id })
                        this.selected.unshift(item)
                    }
                })
            },
            getList() {
                if (!this.next) {
                    this.$u.api.userPage({
                        capacity: 20,
                        page: this.page,
                        model: {
                            keyword: this.keyword,
                            startTime: this.startTime,
                            endTime: this.endTime
                        }
                    }).then(res => {
                        if (res.data.records.length > 0) {
                            res.data.records.forEach(item => {
                                item.active = false
                            })
                            this.list = [...this.list, ...res.data.records]
                            this.page = this.page + 1
                        }
                        if (res.data.records.length < 20) {
                            this.next = true
                        }
                    })
                }
            }
        },
        onReachBottom(){
            this.getList()
        }
    }
</script>
<style>
    page {
        background-color: #fff !important;
    }
</style>
<style lang="scss" scoped>
    .select {
        width: 100%;
        .select_input {
            width: 100%;
            position: sticky;
            top: 0;
            padding: 20rpx 30rpx;
            box-sizing: border-box;
            background: #ffffff;
            .select_input_box /deep/ {
                width: 100%;
                background: #F7F7F7;
                .u-border {
                    border: none !important;
                }
            }
        }
        .select_list {
            width: 100%;
            padding: 0 30rpx;
            margin-top: 16rpx;
            box-sizing: border-box;
            .select_list_wu {
                width: 100%;
                margin-top: 50rpx;
                display: flex;
                align-items: center;
                justify-content: center;
                image {
                    width: 340rpx;
                    height: 364rpx;
                }
            }
            .select_list_item {
                width: 100%;
                height: 138rpx;
                display: flex;
                align-items: center;
                justify-content: space-between;
                border-bottom: 1rpx solid #E5E5E5;
                .left {
                    display: flex;
                    align-items: flex-start;
                    .left_img {
                        width: 64rpx;
                        height: 64rpx;
                        margin-right: 20rpx;
                        border-radius: 50%;
                        overflow: hidden;
                        .left_img_t {
                            width: 100%;
                            height: 100%;
                            display: flex;
                            align-items: center;
                            justify-content: center;
                            background-color: #0055FF;
                            font-size: 30rpx;
                            font-family: PingFangSC-Regular, PingFang SC;
                            font-weight: 400;
                            color: #FFFFFF;
                        }
                        image {
                            width: 100%;
                            height: 100%;
                        }
                    }
                    .left_info {
                        display: flex;
                        flex-direction: column;
                        .left_info_top {
                            display: flex;
                            align-items: center;
                            text {
                                &:nth-child(1) {
                                    font-size: 30rpx;
                                    font-family: PingFangSC-Regular, PingFang SC;
                                    font-weight: 400;
                                    color: #222222;
                                    margin-right: 10rpx;
                                }
                                &:nth-child(2) {
                                    padding: 8rpx;
                                    border-radius: 4rpx;
                                    border: 1rpx solid #F62710;
                                    font-size: 22rpx;
                                    font-family: PingFangSC-Regular, PingFang SC;
                                    font-weight: 400;
                                    color: #F62710;
                                }
                            }
                        }
                        .left_info_bm {
                            font-size: 24rpx;
                            font-family: PingFangSC-Regular, PingFang SC;
                            font-weight: 400;
                            color: #666666;
                            margin-top: 16rpx;
                        }
                    }
                }
                .xuan {
                    width: 40rpx;
                    height: 40rpx;
                }
            }
        }
        .select_zw {
            width: 100%;
            height: calc(198rpx + env(safe-area-inset-bottom));
        }
        .select_footer {
            width: 100%;
            position: fixed;
            bottom: 0;
            box-sizing: border-box;
            padding: 22rpx 30rpx calc(22rpx + env(safe-area-inset-bottom)) 30rpx;
            background: #FFFFFF;
            box-shadow: 0rpx 0rpx 6rpx 0rpx #B2B2B2;
            .footer_top {
                width: 100%;
                height: 44rpx;
                display: flex;
                align-items: center;
                .footer_top_label {
                    flex-shrink: 0;
                    font-size: 28rpx;
                    font-family: PingFangSC-Regular, PingFang SC;
                    font-weight: 400;
                    color: #222222;
                }
                .footer_top_content {
                    flex: 1;
                    font-size: 28rpx;
                    font-family: PingFangSC-Regular, PingFang SC;
                    font-weight: 400;
                    color: #0055FF;
                    overflow:hidden;
                    white-space: nowrap;
                    text-overflow: ellipsis;
                    -o-text-overflow:ellipsis;
                }
                image {
                    width: 44rpx;
                    height: 44rpx;
                }
            }
            .footer_btn {
                width: 100%;
                height: 88rpx;
                line-height: 88rpx;
                text-align: center;
                background: #0055FF;
                border-radius: 4rpx;
                font-size: 30rpx;
                font-family: PingFangSC-Regular, PingFang SC;
                font-weight: 400;
                color: #FFFFFF;
                margin-top: 22rpx;
            }
        }
        .select_box {
            width: 100%;
            padding: 40rpx 30rpx;
            box-sizing: border-box;
            .select_box_head {
                display: flex;
                align-items: center;
                justify-content: space-between;
                margin-bottom: 40rpx;
                text {
                    &:first-child {
                        font-size: 28rpx;
                        font-family: PingFangSC-Semibold, PingFang SC;
                        font-weight: 600;
                        color: #222222;
                    }
                    &:last-child {
                        font-size: 28rpx;
                        font-family: PingFangSC-Regular, PingFang SC;
                        font-weight: 400;
                        color: #0055FF;
                    }
                }
            }
            .select_box_list {
                width: 100%;
                max-height: 700rpx;
                display: flex;
                flex-direction: column;
                .select_box_list_item {
                    width: 100%;
                    height: 134rpx;
                    display: flex;
                    align-items: center;
                    justify-content: space-between;
                    border-bottom: 1rpx solid #E5E5E5;
                    .left {
                        display: flex;
                        align-items: center;
                        .left_img {
                            width: 64rpx;
                            height: 64rpx;
                            margin-right: 20rpx;
                            border-radius: 50%;
                            overflow: hidden;
                            .left_img_t {
                                width: 100%;
                                height: 100%;
                                display: flex;
                                align-items: center;
                                justify-content: center;
                                background-color: #0055FF;
                                font-size: 30rpx;
                                font-family: PingFangSC-Regular, PingFang SC;
                                font-weight: 400;
                                color: #FFFFFF;
                            }
                            image {
                                width: 100%;
                                height: 100%;
                            }
                        }
                        .left_info {
                            display: flex;
                            flex-direction: column;
                            text {
                                &:first-child {
                                    font-size: 30rpx;
                                    font-family: PingFangSC-Regular, PingFang SC;
                                    font-weight: 400;
                                    color: #222222;
                                }
                                &:last-child {
                                    font-size: 24rpx;
                                    font-family: PingFangSC-Regular, PingFang SC;
                                    font-weight: 400;
                                    color: #666666;
                                    margin-top: 20rpx;
                                }
                            }
                        }
                    }
                    .dele {
                        width: 80rpx;
                        height: 48rpx;
                        line-height: 48rpx;
                        text-align: center;
                        border-radius: 4rpx;
                        border: 1rpx solid #999999;
                        font-size: 24rpx;
                        font-family: PingFangSC-Regular, PingFang SC;
                        font-weight: 400;
                        color: #333333;
                    }
                }
            }
        }
    }
</style>
h5/pages.json
@@ -4,166 +4,259 @@
    },
    "pages": [
        {
            "path" : "pages/notice/notice",
            "style" :
            {
                "navigationBarTitleText" : "入场须知",
                "enablePullDownRefresh" : false,
            "path": "pages/notice/notice",
            "style": {
                "navigationBarTitleText": "入场须知",
                "enablePullDownRefresh": false,
                "navigationStyle": "custom"
            }
        },
        {
            "path" : "pages/index/index",
            "style" :
            {
                "navigationBarTitleText" : "华晟新能源",
                "enablePullDownRefresh" : false
            "path": "pages/index/index",
            "style": {
                "navigationBarTitleText": "华晟新能源",
                "enablePullDownRefresh": false
            }
        },
        {
            "path" : "pages/login/login",
            "style" :
            {
                "navigationBarTitleText" : "登录",
                "enablePullDownRefresh" : false,
            "path": "pages/login/login",
            "style": {
                "navigationBarTitleText": "登录",
                "enablePullDownRefresh": false,
                "navigationStyle": "custom"
            }
        },
        {
            "path" : "pages/answer/answer",
            "style" :
            {
                "navigationBarTitleText" : "答题",
                "enablePullDownRefresh" : false,
            "path": "pages/answer/answer",
            "style": {
                "navigationBarTitleText": "答题",
                "enablePullDownRefresh": false,
                "navigationStyle": "custom"
            }
        },
        {
            "path" : "pages/userinfo/userinfo",
            "style" :
            {
                "navigationBarTitleText" : "个人信息",
                "enablePullDownRefresh" : false,
            "path": "pages/userinfo/userinfo",
            "style": {
                "navigationBarTitleText": "个人信息",
                "enablePullDownRefresh": false,
                "navigationStyle": "custom"
            }
        },
        {
            "path" : "pages/visitorApplication/visitorApplication",
            "style" :
            {
                "navigationBarTitleText" : "访客申请",
                "enablePullDownRefresh" : false,
            "path": "pages/visitorApplication/visitorApplication",
            "style": {
                "navigationBarTitleText": "访客申请",
                "enablePullDownRefresh": false,
                "navigationStyle": "custom"
            }
        },
        {
            "path" : "pages/visitorApproval/visitorApproval",
            "style" :
            {
                "navigationBarTitleText" : "访客审批",
                "enablePullDownRefresh" : false
            "path": "pages/visitorApproval/visitorApproval",
            "style": {
                "navigationBarTitleText": "访客审批",
                "enablePullDownRefresh": false
            }
        },
        {
            "path" : "pages/laborApplication/laborApplication",
            "style" :
            {
                "navigationBarTitleText" : "劳务申请",
                "enablePullDownRefresh" : false
            "path": "pages/laborApplication/laborApplication",
            "style": {
                "navigationBarTitleText": "劳务申请",
                "enablePullDownRefresh": false
            }
        },
        {
            "path" : "pages/applicationRecord/applicationRecord",
            "style" :
            {
                "navigationBarTitleText" : "申请记录",
                "enablePullDownRefresh" : false
            "path": "pages/applicationRecord/applicationRecord",
            "style": {
                "navigationBarTitleText": "申请记录",
                "enablePullDownRefresh": false
            }
        },
        {
            "path" : "pages/personnel/personnel",
            "style" :
            {
                "navigationBarTitleText" : "人员管理",
                "enablePullDownRefresh" : false
            "path": "pages/personnel/personnel",
            "style": {
                "navigationBarTitleText": "人员管理",
                "enablePullDownRefresh": false
            }
        },
        {
            "path" : "pages/newPersonnel/newPersonnel",
            "style" :
            {
                "navigationBarTitleText" : "新增人员",
                "enablePullDownRefresh" : false
            "path": "pages/newPersonnel/newPersonnel",
            "style": {
                "navigationBarTitleText": "新增人员",
                "enablePullDownRefresh": false
            }
        },
        {
            "path" : "pages/changePassword/changePassword",
            "style" :
            {
                "navigationBarTitleText" : "修改密码",
                "enablePullDownRefresh" : false
            "path": "pages/changePassword/changePassword",
            "style": {
                "navigationBarTitleText": "修改密码",
                "enablePullDownRefresh": false
            }
        },
        {
            "path" : "pages/appointmentDetails/appointmentDetails",
            "style" :
            {
                "navigationBarTitleText" : "预约详情",
                "enablePullDownRefresh" : false
            "path": "pages/appointmentDetails/appointmentDetails",
            "style": {
                "navigationBarTitleText": "预约详情",
                "enablePullDownRefresh": false
            }
        },
        {
            "path" : "pages/cropping/cropping",
            "style" :
            {
                "navigationBarTitleText" : "图片裁剪",
                "enablePullDownRefresh" : false,
            "path": "pages/cropping/cropping",
            "style": {
                "navigationBarTitleText": "图片裁剪",
                "enablePullDownRefresh": false,
                "navigationStyle": "custom"
            }
        },
        // ä¼šè®®å®¤
        {
            "path": "pages/meeting/index/index",
            "style": {
                "navigationStyle": "custom",
                "mp-alipay": {
                    "transparentTitle": "always",
                    "titlePenetrate": "YES"
                },
                "app-plus": {
                    "bounce": "none"
                }
            }
        },
        {
            "path": "pages/meeting/mine/mine",
            "style": {
                "navigationStyle": "custom",
                "navigationBarTextStyle": "white",
                "navigationBarTitleText": "我的",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/meeting/login/login",
            "style": {
                "navigationStyle": "custom",
                "navigationBarTitleText": "登录",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/meeting/personal/personal",
            "style": {
                "navigationBarTitleText": "个人资料",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/meeting/myAppointment/myAppointment",
            "style": {
                "navigationBarTitleText": "我预约的会议室",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/meeting/manage/manage",
            "style": {
                "navigationBarTitleText": "我管理的会议室",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/meeting/changePassword/changePassword",
            "style": {
                "navigationBarTitleText": "修改密码",
                "enablePullDownRefresh": false
            }
        }
    ],
    "subPackages": [
    "subPackages": [
        {
            "root": "n_pages",
            "pages": [
                {
                    "path": "login/login",
                    "style": {
                        "navigationBarTitleText" : "登录",
                        "enablePullDownRefresh" : false,
                        "navigationBarTitleText": "登录",
                        "enablePullDownRefresh": false,
                        "navigationStyle": "custom"
                    }
                },
                {
                    "path": "index/index",
                    "style": {
                        "navigationBarTitleText" : "华晟新能源",
                        "enablePullDownRefresh" : false,
                        "navigationBarTitleText": "华晟新能源",
                        "enablePullDownRefresh": false,
                        "navigationStyle": "custom"
                    }
                },
                {
                    "path" : "applicationRecord/applicationRecord",
                    "path": "applicationRecord/applicationRecord",
                    "style": {
                        "navigationBarTitleText" : "申请记录",
                        "enablePullDownRefresh" : false,
                        "navigationBarTitleText": "申请记录",
                        "enablePullDownRefresh": false,
                        "navigationStyle": "custom"
                    }
                },
                {
                    "path" : "visitorApproval/visitorApproval",
                    "path": "visitorApproval/visitorApproval",
                    "style": {
                        "navigationBarTitleText" : "访客审批",
                        "enablePullDownRefresh" : false,
                        "navigationBarTitleText": "访客审批",
                        "enablePullDownRefresh": false,
                        "navigationStyle": "custom"
                    }
                },
                {
                    "path" : "visitorApplication/visitorApplication",
                    "path": "visitorApplication/visitorApplication",
                    "style": {
                        "navigationBarTitleText" : "访客申请",
                        "enablePullDownRefresh" : false,
                        "navigationBarTitleText": "访客申请",
                        "enablePullDownRefresh": false,
                        "navigationStyle": "custom"
                    }
                }
            ]
        },
        {
            "root": "packagesMine",
            "name": "mine",
            "pages": [
                {
                    "path": "notice/notice",
                    "style": {
                        "navigationBarTitleText": "通知",
                        "enablePullDownRefresh": false
                    }
                },
                {
                    "path": "notificationDetails/notificationDetails",
                    "style": {
                        "navigationBarTitleText": "通知详情",
                        "enablePullDownRefresh": false
                    }
                },
                {
                    "path": "meetingDetails/meetingDetails",
                    "style": {
                        "navigationBarTitleText": "会议详情",
                        "enablePullDownRefresh": false
                    }
                },
                {
                    "path": "reservation/reservation",
                    "style": {
                        "navigationBarTitleText": "预约",
                        "enablePullDownRefresh": false
                    }
                },
                {
                    "path": "confirmAppointment/confirmAppointment",
                    "style": {
                        "navigationBarTitleText": "确认预约",
                        "enablePullDownRefresh": false
                    }
                },
                {
                    "path": "selectPersonnel/selectPersonnel",
                    "style": {
                        "navigationBarTitleText": "选择人员",
                        "enablePullDownRefresh": false
                    }
                }
            ]
@@ -176,4 +269,4 @@
        "backgroundColor": "#ffffff"
    },
    "uniIdRouter": {}
}
}
h5/pages/meeting/index/index.vue
@@ -1,12 +1,12 @@
<template>
    <view class="container">
        <!-- è‡ªå®šä¹‰å¤´éƒ¨ -->
        <!-- è‡ªå®šä¹‰å¤´éƒ¨ -->
        <navigation Title="智能会议室"></navigation>
        <you-scroll ref="scroll" @onPullDown="onPullDown" @More="More">
            <!-- é€šçŸ¥å…¬å‘Š -->
            <view class="container_a" @click="jump">
                <view class="container_a_left">
                    <image src="@/static/icon/home_ic_notice@2x.png" mode="widthFix"></image>
                    <image src="@/static/meeting/icon/home_ic_notice@2x.png" mode="widthFix"></image>
                </view>
                <view class="container_a_right">
                    <text>{{news.title}}</text>
@@ -43,7 +43,7 @@
                    </view>
                    <view class="container_c_head_right" @click="show = true">
                        <text>{{roomName.length > 10 ? roomName.substring(0, 8) + '...' : roomName}}</text>
                        <image src="@/static/icon/ar_open@2x.png" mode="widthFix"></image>
                        <image src="@/static/meeting/icon/ar_open@2x.png" mode="widthFix"></image>
                    </view>
                </view>
                <view class="container_c_list" v-if="list && list.length > 0">
@@ -82,7 +82,7 @@
                </view>
                <view class="container_c_list" v-else>
                    <view class="container_c_list_wu">
                        <image src="@/static/common/364.png" mode="widthFix"></image>
                        <image src="@/static/meeting/common/364.png" mode="widthFix"></image>
                    </view>
                </view>
            </view>
@@ -484,4 +484,4 @@
            }
        }
    }
</style>
</style>
h5/pages/meeting/manage/manage.vue
@@ -1,6 +1,6 @@
<template>
    <page-meta :page-style="'overflow:'+(pageShow?'hidden':'visible')"></page-meta>
    <view class="manage">
    <page-meta :page-style="'overflow:'+(pageShow?'hidden':'visible')"></page-meta>
    <view class="manage">
        <view class="manage_head">
            <view class="manage_head_input">
                <u--input
@@ -22,7 +22,7 @@
                        <view class="top_left_content">
                            <text>{{item.name}}</text>
                            <view class="top_left_content_time">
                                <image src="@/static/icon/ic_time@2x.png" mode="widthFix"></image>
                                <image src="@/static/meeting/icon/ic_time@2x.png" mode="widthFix"></image>
                                <text>{{item.startTime}}-{{item.endTime}}</text>
                            </view>
                        </view>
@@ -38,7 +38,7 @@
        
        <view class="manage_list" v-else>
            <view class="manage_list_wu">
                <image src="@/static/common/364.png" mode="widthFix"></image>
                <image src="@/static/meeting/common/364.png" mode="widthFix"></image>
            </view>
        </view>
        
@@ -56,15 +56,15 @@
                </view>
            </u-popup>
        </view>
    </view>
</template>
    </view>
</template>
<script>
    import { mapState } from 'vuex'
    export default {
        data() {
            return {
    import { mapState } from 'vuex'
    export default {
        data() {
            return {
                value: '',
                next: false,
                list: [],
@@ -78,8 +78,8 @@
                qrurl: '',
                id: '',
                pageShow: false,
                icon: require('@/static/common/123.png')
            };
                icon: require('@/static/meeting/common/123.png')
            };
        },
        onLoad() {
            this.getList()
@@ -204,11 +204,11 @@
                    })
                }
            }
        }
    }
</script>
<style lang="scss">
        }
    }
</script>
<style lang="scss">
    .manage {
        width: 100%;
        .details_ma /deep/ {
@@ -403,5 +403,5 @@
                }
            }
        }
    }
</style>
    }
</style>
h5/pages/meeting/mine/mine.vue
@@ -43,12 +43,12 @@
        data() {
            return {
                backgroundImage: 'https://dmtest.ahapp.net/file/projects/20230511/7d1f149816e24e68bb2df9011be53990.png',
                avatar: require('@/static/common/default_user@2x.png'),
                avatar: require('@/static/meeting/common/default_user@2x.png'),
                list: [
                    { name: '个人资料', path: '/pages/personal/personal', icon: require('@/static/icon/wd_ic_ziliao@2x.png') },
                    { name: '我预约的会议室', path: '/pages/myAppointment/myAppointment', icon: require('@/static/icon/wd_ic_yuyue@2x.png') },
                    { name: '我管理的会议室', path: '/pages/manage/manage', icon: require('@/static/icon/wd_ic_guanli@2x.png') },
                    { name: '修改密码', path: '/pages/changePassword/changePassword', icon: require('@/static/icon/wd_ic_mima@2x.png') }
                    { name: '个人资料', path: '/pages/personal/personal', icon: require('@/static/meeting/icon/wd_ic_ziliao@2x.png') },
                    { name: '我预约的会议室', path: '/pages/myAppointment/myAppointment', icon: require('@/static/meeting/icon/wd_ic_yuyue@2x.png') },
                    { name: '我管理的会议室', path: '/pages/manage/manage', icon: require('@/static/meeting/icon/wd_ic_guanli@2x.png') },
                    { name: '修改密码', path: '/pages/changePassword/changePassword', icon: require('@/static/meeting/icon/wd_ic_mima@2x.png') }
                ]
            }
        },
@@ -204,4 +204,4 @@
            }
        }
    }
</style>
</style>
h5/pages/meeting/myAppointment/myAppointment.vue
@@ -1,6 +1,6 @@
<template>
    <page-meta :page-style="'overflow:'+(pageShow?'hidden':'visible')"></page-meta>
    <view class="yuyue">
    <page-meta :page-style="'overflow:'+(pageShow?'hidden':'visible')"></page-meta>
    <view class="yuyue">
        <view class="yuyue_head">
            <view class="yuyue_head_input">
                <u--input
@@ -45,16 +45,16 @@
                <view class="item_d" v-if="i === 0">
                    <view class="item_d_left">
                        <view class="item_d_left_item" @click.stop="copy(item)" v-if="item.meetingStatus !== 3">
                            <image src="@/static/icon/ic_copy@2x.png" mode="widthFix"></image>
                            <image src="@/static/meeting/icon/ic_copy@2x.png" mode="widthFix"></image>
                            <text>复制</text>
                        </view>
                        <view class="item_d_left_item" @click="fenxiang(item)" v-if="item.meetingStatus !== 3">
                            <button open-type="share"></button>
                            <image src="@/static/icon/ic_fenxiang@2x.png" mode="widthFix"></image>
                            <image src="@/static/meeting/icon/ic_fenxiang@2x.png" mode="widthFix"></image>
                            <text>分享</text>
                        </view>
                        <view class="item_d_left_item" v-if="item.meetingStatus === 1" @click.stop="closeRoom(item.meetingStatus, item.id)">
                            <image src="@/static/icon/ic_cancel@2x.png" mode="widthFix"></image>
                            <image src="@/static/meeting/icon/ic_cancel@2x.png" mode="widthFix"></image>
                            <text>取消</text>
                        </view>
                    </view>
@@ -67,7 +67,7 @@
        
        <view class="yuyue_content" v-else>
            <view class="yuyue_content_wu">
                <image src="@/static/common/364.png" mode="widthFix"></image>
                <image src="@/static/meeting/common/364.png" mode="widthFix"></image>
            </view>
        </view>
        
@@ -98,18 +98,18 @@
        @cancel="close1"
        ref="uModal"
        :showCancelButton="true"
        asyncClose="true"></u-modal>
    </view>
</template>
        asyncClose="true"></u-modal>
    </view>
</template>
<script>
    import { mapState } from 'vuex'
    import tkiQrcode from "@/components/tki-qrcode/tki-qrcode.vue"
    export default {
        data() {
    import tkiQrcode from "@/components/tki-qrcode/tki-qrcode.vue"
    export default {
        data() {
            return {
                i: 0,
                show: false,
                show: false,
                cate: [
                    { name: '未开始', id: 1 },
                    { name: '已结束', id: 2 }
@@ -133,8 +133,8 @@
                    title: '',
                    path: '',
                    imageUrl: 'https://dmtest.ahapp.net/file/projects/20230511/13f256b832db4a4fadc5e6770f5727bf.png'
                }
            };
                }
            };
        },
        computed: {
            ...mapState(['token'])
@@ -333,11 +333,11 @@
                    })
                }
            }
        }
    }
</script>
<style lang="scss">
        }
    }
</script>
<style lang="scss">
    .yuyue {
        width: 100%;
        .details_ma /deep/ {
@@ -614,5 +614,5 @@
                }
            }
        }
    }
</style>
    }
</style>
h5/pages/meeting/personal/personal.vue
@@ -72,9 +72,9 @@
            @confirm="confirmDate"
            @cancel="isShow = false"
        ></u-datetime-picker>
    </view>
</template>
    </view>
</template>
<script>
    import { mapState, mapMutations } from 'vuex'
    
@@ -87,7 +87,7 @@
                show1: false,
                minDate: Number(new Date('1980-01-01')),
                maxDate: Number(new Date()),
                defaultAvatar: require('@/static/common/default_user@2x.png'),
                defaultAvatar: require('@/static/meeting/common/default_user@2x.png'),
                columns: [
                    ['男', '女']
                ],
@@ -187,15 +187,15 @@
                    })
            }
        }
    }
</script>
    }
</script>
<style>
    page {
        background-color: #fff !important;
    }
</style>
<style lang="scss" scoped>
    .personal {
        width: 100%;
@@ -480,5 +480,5 @@
                color: #FFFFFF;
            }
        }
    }
    }
</style>
h5/store/index.js
@@ -3,29 +3,92 @@
Vue.use(Vuex)
const openId = uni.getStorageSync('openId');
const member = uni.getStorageSync('member');
const openId = uni.getStorageSync('openId')
const member = uni.getStorageSync('member')
// meeting
const navHeight = uni.getStorageSync('navHeight')
const statusbarHeight = uni.getStorageSync('statusbarHeight')
const height = uni.getStorageSync('height')
const token = uni.getStorageSync('token')
const time = uni.getStorageSync('time')
const userInfo = uni.getStorageSync('userInfo')
const sessionKey = uni.getStorageSync('sessionKey')
const store = new Vuex.Store({
    state: {
        openId: openId || '',
        member: member || null
        member: member || null,
        statusbarHeight: statusbarHeight || '0',
        navHeight: navHeight || '0',
        token: token || null,
        time: time || null,
        userInfo: userInfo || {},
        height: height || '0',
        sessionKey: sessionKey || ''
    },
    mutations: {
        // è®¾ç½®openId
        setOpenId(state, val) {
            state.openId = val
            uni.setStorageSync('openId', val);
            uni.setStorageSync('openId', val)
        },
        // è®¾ç½®ç”¨æˆ·ä¿¡æ¯
        setMember(state, val) {
            state.member = val
            uni.setStorageSync('member', val);
            uni.setStorageSync('member', val)
        },
        // è®¾ç½®å¯¼èˆªæ é«˜åº¦
        setHeight(state, val) {
            state.navHeight = val.navHeight
            state.statusbarHeight = val.statusbarHeight
            state.height = val.height
            uni.setStorageSync('navHeight', val.navHeight)
            uni.setStorageSync('statusbarHeight', val.statusbarHeight)
            uni.setStorageSync('height', val.height)
        },
        // è®¾ç½®ç¼“å­˜token
        setToken(state, token) {
            state.token = token
            uni.setStorageSync('token', token)
        },
        // è®¾ç½®è¿‡æœŸæ—¶é—´æˆ³
        setTimeStamp(state, time) {
            state.time = time
            uni.setStorageSync('time', time)
        },
        // è®¾ç½®ç”¨æˆ·ä¿¡æ¯
        setUserInfo(state, obj) {
            state.userInfo = obj
            uni.setStorageSync('userInfo', obj)
        },
        // è®¾ç½®SessionKey
        setSessionKey(state, val) {
            state.sessionKey = val
            uni.setStorageSync('sessionKey', val)
        },
        // æ¸…空所有缓存
        empty(state) {
            state.token = ''
            state.userInfo = ''
            uni.removeStorageSync('userInfo')
            uni.removeStorageSync('token')
        }
    },
    actions: {
        // èŽ·å–çŠ¶æ€é«˜åº¦
        getHeight(context) {
            let res = uni.getMenuButtonBoundingClientRect()
            let status = uni.getSystemInfoSync()
            var height = res.height
            let statusbarHeight = status.statusBarHeight
            let navHeight = res.height + (res.top - statusbarHeight) * 2
            context.commit('setHeight', { statusbarHeight, navHeight, height })
        }
    }
})
export default store;
export default store
h5/utils/meetingHttp.js
@@ -1,44 +1,43 @@
import { baseUrl } from './http.api'
const install = (Vue, vm) => {
    uni.$u.http.setConfig((config) => {
        config.baseURL = baseURL;
            config.timeout = 60000;
        return config;
        config.baseURL = baseUrl
        config.timeout = 60000
        return config
    })
    Vue.prototype.$baseUrl = baseUrl;
    Vue.prototype.$uploadUrl = uploadUrl;
    Vue.prototype.$baseUrl = baseUrl
    let ordinaryLogin = (params = {}) => uni.$u.http.get('web/account/ordinaryLogin', { params })
    let wxEmpower = (params = {}) => uni.$u.http.get('web/account/wxEmpower', { params })
    let editUserInfo = (data = {}) => vm.$u.http.post('web/account/editUserInfo', data);
    let getUserInfo = (params = {}) => vm.$u.http.get('web/account/getUserInfo', { params });
    let roomsList = (params = {}) => vm.$u.http.get('web/rooms/roomsList', { params });
    let getRoomUseTime = (data = {}) => vm.$u.http.post('web/rooms/getRoomUseTime', data);
    let userPage = (data = {}) => vm.$u.http.post('web/meeting/userPage', data);
    let getRoomDetail = (params = {}) => vm.$u.http.get('web/rooms/getRoomDetail', { params });
    let reservationMeeting = (data = {}) => vm.$u.http.post('web/meeting/reservationMeeting', data);
    let meetingDetail = (params = {}) => vm.$u.http.get('web/meeting/meetingDetail', { params });
    let getQrCode = (params = {}) => vm.$u.http.get('web/meeting/getQrCode', { params });
    let reservationCancel = (params = {}) => vm.$u.http.get('web/meeting/reservationCancel', { params });
    let resetPwd = (data = {}) => vm.$u.http.post('web/account/resetPwd', data);
    let myMeetingPage = (data = {}) => vm.$u.http.post('web/meeting/myMeetingPage', data);
    let myRoomsPage = (data = {}) => vm.$u.http.post('web/rooms/myRoomsPage', data);
    let findNoticePage = (data = {}) => vm.$u.http.post('web/notice/findNoticePage', data);
    let getMemberDTO = (params = {}) => vm.$u.http.get('web/notice/getMemberDTO', { params });
    let findNewNotice = (params = {}) => vm.$u.http.get('web/notice/findNewNotice', { params });
    let monthMeeting = (params = {}) => vm.$u.http.get('web/meeting/monthMeeting', { params });
    let roomsGetQrCode = (params = {}) => vm.$u.http.get('web/rooms/getQrCode', { params });
    let getSystemDictData = (params = {}) => vm.$u.http.get('web/util/getSystemDictData', { params });
    let getQrCodeImg = (params = {}) => vm.$u.http.get('web/meeting/getQrCodeImg', { params });
    let visitorLogin = (params = {}) => vm.$u.http.get('web/account/visitorLogin', { params });
    let visitorWxPhone = (data = {}) => vm.$u.http.post('web/account/visitorWxPhone', data);
    let getNoticeDetail = (params = {}) => vm.$u.http.get('web/notice/getNoticeDetail', { params });
    let editUserInfo = (data = {}) => vm.$u.http.post('web/account/editUserInfo', data)
    let getUserInfo = (params = {}) => vm.$u.http.get('web/account/getUserInfo', { params })
    let roomsList = (params = {}) => vm.$u.http.get('web/rooms/roomsList', { params })
    let getRoomUseTime = (data = {}) => vm.$u.http.post('web/rooms/getRoomUseTime', data)
    let userPage = (data = {}) => vm.$u.http.post('web/meeting/userPage', data)
    let getRoomDetail = (params = {}) => vm.$u.http.get('web/rooms/getRoomDetail', { params })
    let reservationMeeting = (data = {}) => vm.$u.http.post('web/meeting/reservationMeeting', data)
    let meetingDetail = (params = {}) => vm.$u.http.get('web/meeting/meetingDetail', { params })
    let getQrCode = (params = {}) => vm.$u.http.get('web/meeting/getQrCode', { params })
    let reservationCancel = (params = {}) => vm.$u.http.get('web/meeting/reservationCancel', { params })
    let resetPwd = (data = {}) => vm.$u.http.post('web/account/resetPwd', data)
    let myMeetingPage = (data = {}) => vm.$u.http.post('web/meeting/myMeetingPage', data)
    let myRoomsPage = (data = {}) => vm.$u.http.post('web/rooms/myRoomsPage', data)
    let findNoticePage = (data = {}) => vm.$u.http.post('web/notice/findNoticePage', data)
    let getMemberDTO = (params = {}) => vm.$u.http.get('web/notice/getMemberDTO', { params })
    let findNewNotice = (params = {}) => vm.$u.http.get('web/notice/findNewNotice', { params })
    let monthMeeting = (params = {}) => vm.$u.http.get('web/meeting/monthMeeting', { params })
    let roomsGetQrCode = (params = {}) => vm.$u.http.get('web/rooms/getQrCode', { params })
    let getSystemDictData = (params = {}) => vm.$u.http.get('web/util/getSystemDictData', { params })
    let getQrCodeImg = (params = {}) => vm.$u.http.get('web/meeting/getQrCodeImg', { params })
    let visitorLogin = (params = {}) => vm.$u.http.get('web/account/visitorLogin', { params })
    let visitorWxPhone = (data = {}) => vm.$u.http.post('web/account/visitorWxPhone', data)
    let getNoticeDetail = (params = {}) => vm.$u.http.get('web/notice/getNoticeDetail', { params })
    vm.$u.api = {
        ordinaryLogin,
        wxEmpower,
@@ -65,7 +64,7 @@
        visitorLogin,
        visitorWxPhone,
        getNoticeDetail
    };
    }
}
export default { install }