|
@@ -1,32 +1,43 @@
|
|
|
<template>
|
|
<template>
|
|
|
<div class="cam-detail-container">
|
|
<div class="cam-detail-container">
|
|
|
- <el-row :gutter="16">
|
|
|
|
|
|
|
+ <el-row :gutter="24">
|
|
|
<el-col :md="17" :sm="24">
|
|
<el-col :md="17" :sm="24">
|
|
|
<el-card class="video-main-card" shadow="never">
|
|
<el-card class="video-main-card" shadow="never">
|
|
|
- <div slot="header" class="card-header">
|
|
|
|
|
- <div class="title-info">
|
|
|
|
|
- <i class="el-icon-video-camera"></i>
|
|
|
|
|
- <span class="cam-name">{{ camDetail ? camDetail.camName : '摄像头监控' }}</span>
|
|
|
|
|
- <el-tag v-if="camDetail" :type="camDetail.onLive ? 'danger' : 'info'" size="mini" effect="dark" class="live-tag">
|
|
|
|
|
- {{ camDetail.onLive ? '• LIVE 直播' : '回放中' }}
|
|
|
|
|
- </el-tag>
|
|
|
|
|
|
|
+ <div class="video-header">
|
|
|
|
|
+ <div class="header-left">
|
|
|
|
|
+ <div class="cam-icon-box">
|
|
|
|
|
+ <i class="el-icon-video-camera" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="cam-meta">
|
|
|
|
|
+ <h2 class="cam-title">{{ camDetail ? camDetail.camName : '摄像头监控' }}</h2>
|
|
|
|
|
+ <div class="status-tags">
|
|
|
|
|
+ <span v-if="camDetail" :class="['status-dot-tag', camDetail.onLive ? 'is-live' : 'is-playback']">
|
|
|
|
|
+ <span class="pulse-dot" />
|
|
|
|
|
+ {{ camDetail.onLive ? 'LIVE 实时画面' : '历史回放' }}
|
|
|
|
|
+ </span>
|
|
|
|
|
+ <span class="cam-id-tag">ID: {{ query.camId }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
- <div class="header-actions">
|
|
|
|
|
- <el-button icon="el-icon-share" type="primary" size="mini" round @click="onShareCam">分享</el-button>
|
|
|
|
|
|
|
+ <div class="header-right">
|
|
|
|
|
+ <el-button icon="el-icon-share" type="primary" round @click="onShareCam">授权分享</el-button>
|
|
|
|
|
+ <el-button icon="el-icon-refresh" circle @click="() => $router.go()" />
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <div class="video-content-wrapper">
|
|
|
|
|
- <div class="video-container">
|
|
|
|
|
|
|
+ <div class="player-viewport">
|
|
|
|
|
+ <div class="video-wrapper">
|
|
|
<video
|
|
<video
|
|
|
id="videoElement"
|
|
id="videoElement"
|
|
|
controls
|
|
controls
|
|
|
autoplay
|
|
autoplay
|
|
|
muted
|
|
muted
|
|
|
- playsinline
|
|
|
|
|
- webkit-playsinline
|
|
|
|
|
class="video-element"
|
|
class="video-element"
|
|
|
/>
|
|
/>
|
|
|
|
|
+ <div v-if="!camDetail" class="video-loading">
|
|
|
|
|
+ <i class="el-icon-loading" />
|
|
|
|
|
+ <p>正在建立加密连接...</p>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</el-card>
|
|
</el-card>
|
|
@@ -35,99 +46,88 @@
|
|
|
<el-col :md="7" :sm="24">
|
|
<el-col :md="7" :sm="24">
|
|
|
<el-card class="record-sidebar-card" shadow="never">
|
|
<el-card class="record-sidebar-card" shadow="never">
|
|
|
<div slot="header" class="sidebar-header">
|
|
<div slot="header" class="sidebar-header">
|
|
|
- <div class="sidebar-title">
|
|
|
|
|
- <i class="el-icon-collection"></i>
|
|
|
|
|
- <span>历史录像</span>
|
|
|
|
|
- </div>
|
|
|
|
|
- <el-button type="primary" icon="el-icon-date" size="mini" plain @click="onSelectDate">切换日期</el-button>
|
|
|
|
|
|
|
+ <span class="sidebar-title">监控档案</span>
|
|
|
|
|
+ <el-button type="text" icon="el-icon-date" @click="onSelectDate">选择日期</el-button>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <div class="record-list-info">
|
|
|
|
|
- <div class="date-display">
|
|
|
|
|
- <i class="el-icon-time"></i>
|
|
|
|
|
- <span>{{ getYearMonthDay(calendarDate) }}</span>
|
|
|
|
|
- <small>的监控档案</small>
|
|
|
|
|
|
|
+ <div class="current-date-bar">
|
|
|
|
|
+ <div class="date-info">
|
|
|
|
|
+ <span class="day">{{ calendarDate.getDate() }}</span>
|
|
|
|
|
+ <div class="month-year">
|
|
|
|
|
+ <span class="m">{{ calendarDate.getMonth() + 1 }}月</span>
|
|
|
|
|
+ <span class="y">{{ calendarDate.getFullYear() }}</span>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+ <i class="el-icon-calendar" />
|
|
|
|
|
+ </div>
|
|
|
|
|
|
|
|
|
|
+ <div class="record-list-container">
|
|
|
<el-table
|
|
<el-table
|
|
|
|
|
+ v-loading="!dataList.length && loading"
|
|
|
:data="dataList"
|
|
:data="dataList"
|
|
|
- size="small"
|
|
|
|
|
- height="460px"
|
|
|
|
|
- class="custom-table"
|
|
|
|
|
- :header-cell-style="{ background: '#f5f7fa', color: '#606266' }"
|
|
|
|
|
|
|
+ height="500"
|
|
|
|
|
+ class="record-table"
|
|
|
|
|
+ :show-header="false"
|
|
|
>
|
|
>
|
|
|
- <el-table-column prop="startTime" label="开始时间" width="90">
|
|
|
|
|
- <template slot-scope="scope">
|
|
|
|
|
- <span class="time-text">{{ scope.row.startTime }}</span>
|
|
|
|
|
- </template>
|
|
|
|
|
- </el-table-column>
|
|
|
|
|
- <el-table-column prop="duration" label="时长" align="center">
|
|
|
|
|
- <template slot-scope="scope">
|
|
|
|
|
- <el-tag size="mini" type="info" plain>{{ scope.row.duration }}s</el-tag>
|
|
|
|
|
- </template>
|
|
|
|
|
- </el-table-column>
|
|
|
|
|
- <el-table-column label="操作" width="80" align="right">
|
|
|
|
|
|
|
+ <el-table-column>
|
|
|
<template slot-scope="scope">
|
|
<template slot-scope="scope">
|
|
|
- <el-button
|
|
|
|
|
- type="primary"
|
|
|
|
|
- circle
|
|
|
|
|
- size="mini"
|
|
|
|
|
- icon="el-icon-caret-right"
|
|
|
|
|
- @click="handlePlay(scope.row.recordId)"
|
|
|
|
|
- ></el-button>
|
|
|
|
|
|
|
+ <div class="record-item" @click="handlePlay(scope.row.recordId)">
|
|
|
|
|
+ <div class="record-icon">
|
|
|
|
|
+ <i class="el-icon-video-play" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="record-text">
|
|
|
|
|
+ <div class="record-time">{{ scope.row.startTime }}</div>
|
|
|
|
|
+ <div class="record-duration">持续时长 {{ scope.row.duration }}s</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <i class="el-icon-arrow-right arrow" />
|
|
|
|
|
+ </div>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
</el-table>
|
|
</el-table>
|
|
|
-
|
|
|
|
|
- <div class="sidebar-footer">
|
|
|
|
|
- <el-button type="warning" icon="el-icon-magic-stick" size="medium" class="full-width-btn" @click="onButtonSubmit">提交</el-button>
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ <el-empty v-if="!dataList.length" description="当日暂无录像" :image-size="60" />
|
|
|
</div>
|
|
</div>
|
|
|
</el-card>
|
|
</el-card>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
</el-row>
|
|
</el-row>
|
|
|
|
|
|
|
|
<el-dialog
|
|
<el-dialog
|
|
|
- title="选择监控日期"
|
|
|
|
|
- append-to-body
|
|
|
|
|
|
|
+ title="切换监控日期"
|
|
|
:visible.sync="showCalenderDialog"
|
|
:visible.sync="showCalenderDialog"
|
|
|
- width="600px"
|
|
|
|
|
- custom-class="custom-calendar-dialog"
|
|
|
|
|
|
|
+ width="400px"
|
|
|
|
|
+ append-to-body
|
|
|
|
|
+ custom-class="pikpak-dialog"
|
|
|
>
|
|
>
|
|
|
- <div class="calendar-legend">
|
|
|
|
|
- <span class="legend-item"><i class="dot active"></i> 有录像</span>
|
|
|
|
|
- <span class="legend-item"><i class="dot"></i> 无数据</span>
|
|
|
|
|
- </div>
|
|
|
|
|
- <el-calendar v-model="calendarDate">
|
|
|
|
|
- <div slot="dateCell" slot-scope="{ date, data }" class="custom-date-cell" @click="handleCellClick(date, data)">
|
|
|
|
|
- <span :class="{ 'has-record': dealMyDate(data.day) }">
|
|
|
|
|
- {{ data.day.split("-").slice(2).join() }}
|
|
|
|
|
- </span>
|
|
|
|
|
- <div v-if="dealMyDate(data.day)" class="record-dot"></div>
|
|
|
|
|
|
|
+ <el-calendar v-model="calendarDate" class="mini-calendar">
|
|
|
|
|
+ <div slot="dateCell" slot-scope="{ date, data }" class="cell-wrapper" @click="handleCellClick(date, data)">
|
|
|
|
|
+ <span :class="{ 'has-data': dealMyDate(data.day) }">{{ data.day.split('-').slice(2).join() }}</span>
|
|
|
|
|
+ <div v-if="dealMyDate(data.day)" class="data-dot" />
|
|
|
</div>
|
|
</div>
|
|
|
</el-calendar>
|
|
</el-calendar>
|
|
|
</el-dialog>
|
|
</el-dialog>
|
|
|
|
|
|
|
|
<el-dialog
|
|
<el-dialog
|
|
|
- title="分享摄像头权限"
|
|
|
|
|
|
|
+ title="授权给好友"
|
|
|
:visible.sync="showCreateShareDialog"
|
|
:visible.sync="showCreateShareDialog"
|
|
|
- width="420px"
|
|
|
|
|
- center
|
|
|
|
|
|
|
+ width="380px"
|
|
|
|
|
+ append-to-body
|
|
|
|
|
+ custom-class="pikpak-dialog"
|
|
|
>
|
|
>
|
|
|
- <div class="share-dialog-body">
|
|
|
|
|
- <el-form ref="createAlbumForm" :model="createShareForm" label-position="top">
|
|
|
|
|
- <el-form-item label="授权给联系人">
|
|
|
|
|
- <div class="user-check-list">
|
|
|
|
|
- <el-checkbox-group v-model="createShareForm.shareToList">
|
|
|
|
|
- <el-checkbox v-for="user in userContactList" :key="user.userIdStr" :label="user.username" border size="small" class="user-checkbox" />
|
|
|
|
|
- </el-checkbox-group>
|
|
|
|
|
- </div>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-form>
|
|
|
|
|
- <div slot="footer" class="dialog-footer">
|
|
|
|
|
- <el-button type="primary" block @click="createShare" style="width: 100%">确认分享</el-button>
|
|
|
|
|
|
|
+ <div class="share-box">
|
|
|
|
|
+ <p class="share-tip">请选择有权查看此摄像头画面的好友</p>
|
|
|
|
|
+ <div class="user-select-grid">
|
|
|
|
|
+ <el-checkbox-group v-model="createShareForm.shareToList">
|
|
|
|
|
+ <el-checkbox v-for="user in userContactList" :key="user.userIdStr" :label="user.username" border>
|
|
|
|
|
+ <div class="user-cell">
|
|
|
|
|
+ <el-avatar :size="24" icon="el-icon-user" />
|
|
|
|
|
+ <span>{{ user.username }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </el-checkbox>
|
|
|
|
|
+ </el-checkbox-group>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+ <div slot="footer">
|
|
|
|
|
+ <el-button type="primary" round block style="width: 100%" @click="createShare">确认授权</el-button>
|
|
|
|
|
+ </div>
|
|
|
</el-dialog>
|
|
</el-dialog>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
@@ -135,7 +135,7 @@
|
|
|
<script>
|
|
<script>
|
|
|
import flvjs from 'flv.js'
|
|
import flvjs from 'flv.js'
|
|
|
|
|
|
|
|
-import { createShare, getCamDetail, getCamList, getRecordByMonth, getRecordUrl, submitActivity } from '@/api/disk'
|
|
|
|
|
|
|
+import { createShare, getCamDetail, getRecordByMonth, getRecordUrl } from '@/api/disk'
|
|
|
import { getUserContact } from '@/api/user'
|
|
import { getUserContact } from '@/api/user'
|
|
|
|
|
|
|
|
export default {
|
|
export default {
|
|
@@ -318,24 +318,6 @@ export default {
|
|
|
onSelectDate() {
|
|
onSelectDate() {
|
|
|
this.showCalenderDialog = true
|
|
this.showCalenderDialog = true
|
|
|
},
|
|
},
|
|
|
- onButtonSubmit() {
|
|
|
|
|
- this.$confirm('确认提交?', '提示', {
|
|
|
|
|
- confirmButtonText: '确定',
|
|
|
|
|
- cancelButtonText: '取消',
|
|
|
|
|
- type: 'warning'
|
|
|
|
|
- }).then(() => {
|
|
|
|
|
- submitActivity().then(resp => {
|
|
|
|
|
- this.$message.info(resp.msg)
|
|
|
|
|
- }).catch(error => {
|
|
|
|
|
- this.$message.error(error.message)
|
|
|
|
|
- })
|
|
|
|
|
- }).catch(() => {
|
|
|
|
|
- this.$message({
|
|
|
|
|
- type: 'info',
|
|
|
|
|
- message: '已取消'
|
|
|
|
|
- })
|
|
|
|
|
- })
|
|
|
|
|
- },
|
|
|
|
|
onShareCam() {
|
|
onShareCam() {
|
|
|
this.createShareForm.albumId = this.camDetail.camId
|
|
this.createShareForm.albumId = this.camDetail.camId
|
|
|
getUserContact(1).then(resp => {
|
|
getUserContact(1).then(resp => {
|
|
@@ -365,167 +347,249 @@ export default {
|
|
|
|
|
|
|
|
<style scoped>
|
|
<style scoped>
|
|
|
.cam-detail-container {
|
|
.cam-detail-container {
|
|
|
- padding: 16px;
|
|
|
|
|
- background-color: #f0f2f5;
|
|
|
|
|
- min-height: 100vh;
|
|
|
|
|
|
|
+ padding: 24px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* 播放器卡片美化 */
|
|
|
|
|
|
|
+/* 播放器卡片 */
|
|
|
.video-main-card {
|
|
.video-main-card {
|
|
|
- border-radius: 8px;
|
|
|
|
|
|
|
+ border-radius: 20px;
|
|
|
border: none;
|
|
border: none;
|
|
|
|
|
+ background: #fff;
|
|
|
}
|
|
}
|
|
|
-.card-header {
|
|
|
|
|
|
|
+
|
|
|
|
|
+.video-header {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
justify-content: space-between;
|
|
justify-content: space-between;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
|
|
+ padding: 10px 0 20px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.header-left {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ gap: 16px;
|
|
|
}
|
|
}
|
|
|
-.title-info {
|
|
|
|
|
|
|
+
|
|
|
|
|
+.cam-icon-box {
|
|
|
|
|
+ width: 48px;
|
|
|
|
|
+ height: 48px;
|
|
|
|
|
+ background: #e8f0fe;
|
|
|
|
|
+ border-radius: 12px;
|
|
|
display: flex;
|
|
display: flex;
|
|
|
|
|
+ justify-content: center;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
|
|
+ color: #1a73e8;
|
|
|
|
|
+ font-size: 24px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.cam-title {
|
|
|
|
|
+ font-size: 18px;
|
|
|
|
|
+ font-weight: 700;
|
|
|
|
|
+ margin: 0 0 6px 0;
|
|
|
|
|
+ color: #1a1a1a;
|
|
|
}
|
|
}
|
|
|
-.title-info i {
|
|
|
|
|
- font-size: 20px;
|
|
|
|
|
- color: #409eff;
|
|
|
|
|
- margin-right: 8px;
|
|
|
|
|
|
|
+
|
|
|
|
|
+.status-tags {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ gap: 8px;
|
|
|
|
|
+ align-items: center;
|
|
|
}
|
|
}
|
|
|
-.cam-name {
|
|
|
|
|
|
|
+
|
|
|
|
|
+.status-dot-tag {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ padding: 2px 10px;
|
|
|
|
|
+ border-radius: 20px;
|
|
|
|
|
+ font-size: 12px;
|
|
|
font-weight: 600;
|
|
font-weight: 600;
|
|
|
- font-size: 16px;
|
|
|
|
|
- margin-right: 12px;
|
|
|
|
|
}
|
|
}
|
|
|
-.live-tag {
|
|
|
|
|
- letter-spacing: 1px;
|
|
|
|
|
|
|
+
|
|
|
|
|
+.is-live {
|
|
|
|
|
+ background: #fef0f0;
|
|
|
|
|
+ color: #f56c6c;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.is-playback {
|
|
|
|
|
+ background: #f4f4f5;
|
|
|
|
|
+ color: #909399;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.pulse-dot {
|
|
|
|
|
+ width: 8px;
|
|
|
|
|
+ height: 8px;
|
|
|
|
|
+ border-radius: 50%;
|
|
|
|
|
+ margin-right: 6px;
|
|
|
|
|
+ background: currentColor;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.is-live .pulse-dot {
|
|
|
|
|
+ animation: pulse 1.5s infinite;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+@keyframes pulse {
|
|
|
|
|
+ 0% { transform: scale(1); opacity: 1; }
|
|
|
|
|
+ 50% { transform: scale(1.5); opacity: 0.5; }
|
|
|
|
|
+ 100% { transform: scale(1); opacity: 1; }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.video-content-wrapper {
|
|
|
|
|
- background-color: #000;
|
|
|
|
|
- border-radius: 4px;
|
|
|
|
|
|
|
+.cam-id-tag {
|
|
|
|
|
+ font-size: 11px;
|
|
|
|
|
+ color: #c0c4cc;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.player-viewport {
|
|
|
|
|
+ background: #000;
|
|
|
|
|
+ border-radius: 16px;
|
|
|
overflow: hidden;
|
|
overflow: hidden;
|
|
|
|
|
+ box-shadow: inset 0 0 40px rgba(0,0,0,0.5);
|
|
|
}
|
|
}
|
|
|
-.video-container {
|
|
|
|
|
|
|
+
|
|
|
|
|
+.video-wrapper {
|
|
|
position: relative;
|
|
position: relative;
|
|
|
width: 100%;
|
|
width: 100%;
|
|
|
- padding-top: 56.25%; /* 16:9 Aspect Ratio */
|
|
|
|
|
|
|
+ padding-top: 56.25%;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
.video-element {
|
|
.video-element {
|
|
|
position: absolute;
|
|
position: absolute;
|
|
|
top: 0;
|
|
top: 0;
|
|
|
left: 0;
|
|
left: 0;
|
|
|
width: 100%;
|
|
width: 100%;
|
|
|
height: 100%;
|
|
height: 100%;
|
|
|
- object-fit: contain;
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* 侧边栏美化 */
|
|
|
|
|
|
|
+/* 侧边栏档案 */
|
|
|
.record-sidebar-card {
|
|
.record-sidebar-card {
|
|
|
- border-radius: 8px;
|
|
|
|
|
|
|
+ border-radius: 20px;
|
|
|
border: none;
|
|
border: none;
|
|
|
height: 100%;
|
|
height: 100%;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
.sidebar-header {
|
|
.sidebar-header {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
justify-content: space-between;
|
|
justify-content: space-between;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
.sidebar-title {
|
|
.sidebar-title {
|
|
|
|
|
+ font-weight: 700;
|
|
|
|
|
+ font-size: 16px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.current-date-bar {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
- font-weight: 600;
|
|
|
|
|
- color: #303133;
|
|
|
|
|
-}
|
|
|
|
|
-.sidebar-title i {
|
|
|
|
|
- margin-right: 6px;
|
|
|
|
|
- color: #909399;
|
|
|
|
|
|
|
+ padding: 16px;
|
|
|
|
|
+ background: #f8f9fa;
|
|
|
|
|
+ border-radius: 12px;
|
|
|
|
|
+ margin-bottom: 20px;
|
|
|
}
|
|
}
|
|
|
-.date-display {
|
|
|
|
|
- padding: 12px;
|
|
|
|
|
- background: #fdf6ec;
|
|
|
|
|
- border-radius: 4px;
|
|
|
|
|
- margin-bottom: 12px;
|
|
|
|
|
- color: #e6a23c;
|
|
|
|
|
|
|
+
|
|
|
|
|
+.date-info {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
- gap: 8px;
|
|
|
|
|
-}
|
|
|
|
|
-.date-display small {
|
|
|
|
|
- color: #909399;
|
|
|
|
|
|
|
+ gap: 12px;
|
|
|
}
|
|
}
|
|
|
-.time-text {
|
|
|
|
|
- font-family: 'Monaco', 'Courier New', monospace;
|
|
|
|
|
- font-weight: 500;
|
|
|
|
|
|
|
+
|
|
|
|
|
+.date-info .day {
|
|
|
|
|
+ font-size: 32px;
|
|
|
|
|
+ font-weight: 800;
|
|
|
|
|
+ color: #1a73e8;
|
|
|
}
|
|
}
|
|
|
-.sidebar-footer {
|
|
|
|
|
- margin-top: 16px;
|
|
|
|
|
|
|
+
|
|
|
|
|
+.month-year {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ line-height: 1.2;
|
|
|
}
|
|
}
|
|
|
-.full-width-btn {
|
|
|
|
|
- width: 100%;
|
|
|
|
|
|
|
+
|
|
|
|
|
+.month-year .m { font-weight: 700; font-size: 14px; }
|
|
|
|
|
+.month-year .y { font-size: 11px; color: #909399; }
|
|
|
|
|
+
|
|
|
|
|
+.current-date-bar i {
|
|
|
|
|
+ font-size: 24px;
|
|
|
|
|
+ color: #dcdfe6;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* 日历组件美化 */
|
|
|
|
|
-.custom-calendar-dialog >>> .el-dialog__body {
|
|
|
|
|
- padding: 0 20px 20px 20px;
|
|
|
|
|
|
|
+.record-list-container {
|
|
|
|
|
+ margin: 0 -10px;
|
|
|
}
|
|
}
|
|
|
-.calendar-legend {
|
|
|
|
|
- text-align: right;
|
|
|
|
|
- font-size: 12px;
|
|
|
|
|
- margin-bottom: 10px;
|
|
|
|
|
|
|
+
|
|
|
|
|
+.record-item {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ padding: 12px;
|
|
|
|
|
+ cursor: pointer;
|
|
|
|
|
+ border-radius: 10px;
|
|
|
|
|
+ transition: all 0.2s;
|
|
|
}
|
|
}
|
|
|
-.legend-item {
|
|
|
|
|
- margin-left: 15px;
|
|
|
|
|
- color: #909399;
|
|
|
|
|
|
|
+
|
|
|
|
|
+.record-item:hover {
|
|
|
|
|
+ background: #f0f7ff;
|
|
|
}
|
|
}
|
|
|
-.dot {
|
|
|
|
|
- display: inline-block;
|
|
|
|
|
- width: 8px;
|
|
|
|
|
- height: 8px;
|
|
|
|
|
|
|
+
|
|
|
|
|
+.record-icon {
|
|
|
|
|
+ width: 36px;
|
|
|
|
|
+ height: 36px;
|
|
|
border-radius: 50%;
|
|
border-radius: 50%;
|
|
|
- background: #dcdfe6;
|
|
|
|
|
|
|
+ background: #fff;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ margin-right: 12px;
|
|
|
|
|
+ box-shadow: 0 2px 6px rgba(0,0,0,0.05);
|
|
|
}
|
|
}
|
|
|
-.dot.active {
|
|
|
|
|
- background: #f56c6c;
|
|
|
|
|
|
|
+
|
|
|
|
|
+.record-icon i { color: #1a73e8; font-size: 18px; }
|
|
|
|
|
+
|
|
|
|
|
+.record-text { flex: 1; }
|
|
|
|
|
+.record-time { font-weight: 600; font-size: 14px; color: #303133; }
|
|
|
|
|
+.record-duration { font-size: 11px; color: #909399; margin-top: 2px; }
|
|
|
|
|
+
|
|
|
|
|
+.arrow { color: #dcdfe6; font-size: 14px; }
|
|
|
|
|
+
|
|
|
|
|
+/* 日历弹窗美化 */
|
|
|
|
|
+::v-deep .pikpak-dialog {
|
|
|
|
|
+ border-radius: 20px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.custom-date-cell {
|
|
|
|
|
- height: 100%;
|
|
|
|
|
|
|
+::v-deep .mini-calendar .el-calendar-table .el-calendar-day {
|
|
|
|
|
+ height: 50px;
|
|
|
|
|
+ padding: 4px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.cell-wrapper {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
flex-direction: column;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
justify-content: center;
|
|
|
- position: relative;
|
|
|
|
|
|
|
+ height: 100%;
|
|
|
}
|
|
}
|
|
|
-.has-record {
|
|
|
|
|
- color: #f56c6c;
|
|
|
|
|
- font-weight: bold;
|
|
|
|
|
|
|
+
|
|
|
|
|
+.has-data {
|
|
|
|
|
+ color: #1a73e8;
|
|
|
|
|
+ font-weight: 800;
|
|
|
}
|
|
}
|
|
|
-.record-dot {
|
|
|
|
|
|
|
+
|
|
|
|
|
+.data-dot {
|
|
|
width: 4px;
|
|
width: 4px;
|
|
|
height: 4px;
|
|
height: 4px;
|
|
|
- background: #f56c6c;
|
|
|
|
|
|
|
+ background: #1a73e8;
|
|
|
border-radius: 50%;
|
|
border-radius: 50%;
|
|
|
- margin-top: 2px;
|
|
|
|
|
|
|
+ margin-top: 4px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* 分享列表美化 */
|
|
|
|
|
-.user-check-list {
|
|
|
|
|
- max-height: 200px;
|
|
|
|
|
- overflow-y: auto;
|
|
|
|
|
- border: 1px solid #ebeef5;
|
|
|
|
|
|
|
+/* 分享列表 */
|
|
|
|
|
+.share-tip { font-size: 13px; color: #909399; margin-bottom: 16px; }
|
|
|
|
|
+.user-select-grid { max-height: 300px; overflow-y: auto; }
|
|
|
|
|
+
|
|
|
|
|
+::v-deep .user-select-grid .el-checkbox {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ margin: 0 0 10px 0 !important;
|
|
|
|
|
+ border-radius: 10px;
|
|
|
padding: 10px;
|
|
padding: 10px;
|
|
|
- border-radius: 4px;
|
|
|
|
|
-}
|
|
|
|
|
-.user-checkbox {
|
|
|
|
|
- margin-bottom: 8px;
|
|
|
|
|
- margin-left: 0 !important;
|
|
|
|
|
- margin-right: 8px;
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* 表格滚动条美化 */
|
|
|
|
|
-.custom-table >>> .el-table__body-wrapper::-webkit-scrollbar {
|
|
|
|
|
- width: 6px;
|
|
|
|
|
-}
|
|
|
|
|
-.custom-table >>> .el-table__body-wrapper::-webkit-scrollbar-thumb {
|
|
|
|
|
- background-color: #ddd;
|
|
|
|
|
- border-radius: 3px;
|
|
|
|
|
-}
|
|
|
|
|
|
|
+.user-cell { display: flex; align-items: center; gap: 10px; }
|
|
|
</style>
|
|
</style>
|