admin/.env.development
@@ -3,6 +3,6 @@ VUE_APP_API_URL = 'http://localhost:10010' # VUE_APP_API_URL = 'http://192.168.0.139:10010' # VUE_APP_API_URL = 'http://10.50.250.253:8088/gateway_interface' VUE_APP_API_URL = 'https://dmtest.ahapp.net/antai_admin_interface/' VUE_APP_API_URL = 'http://10.50.250.253:8088/gateway_interface' # VUE_APP_API_URL = 'https://dmtest.ahapp.net/antai_admin_interface/' admin/src/components/business/OperaDeviceRoleWindow.vue
@@ -32,6 +32,7 @@ :filter-method="filterMethod" filter-placeholder="请è¾å ¥é¨ç¦ç¹æåºååç§°" v-model="form.doorIds" class="transfer" :data="device"> </el-transfer> </el-form-item> @@ -196,8 +197,25 @@ } </script> <style> .el-transfer-panel { width: 350px !important; } <style lang="scss" scoped> .transfer { height: 600px; width: 100%; display: flex; justify-content: center; align-items: center; ::v-deep .el-transfer-panel { flex: 1; height: 100%; } ::v-deep .el-transfer-panel__body { height: 500px; } ::v-deep .el-transfer-panel__list.is-filterable { height: 480px; } } </style> admin/src/components/business/OperaMemberRoleWindow.vue
@@ -1,50 +1,32 @@ <template> <GlobalWindow :title="title" :visible.sync="visible" width="70%" :confirm-working="isWorking" @confirm="confirm" > <p class="tip-warn"><i class="el-icon-warning"></i>æéï¼<br> 1.é¨ç¦æéé ç½®æååï¼ææä»»å¡å³è¿å ¥æéä¸åéåï¼å¯åå¾ãäººåææè®°å½ãæ¥çä¸åè¿åº¦;<br> 2.妿éè¦æ¸ 空å½åéä¸äººåä¸åæéï¼ä»¥ä¸ãå·²éé¨ç¦ç¹åç»ã为空æäº¤å³å¯ã </p> <p class="tip" v-if="form.names != null">æ£å¨ä¸º<em>ã{{ form.names.map(item => `${item}`).join('ï¼') }}ã</em> é ç½®é¨ç¦æé</p> <el-form :model="form" ref="form" :rules="rules"> <el-form-item label="é¨ç¦æææï¼" prop="timeType"> <el-radio-group v-model="form.timeType"> <el-radio :label="0">é¿æææ</el-radio> <el-radio :label="1">èªå®ä¹æ¶é´</el-radio> <el-radio :label="2" v-if="companyType=== 0">å¹è®æææ</el-radio> </el-radio-group> <div v-if="form.timeType ==1" style="margin-top: 10px" > <el-date-picker @change="seleTime" v-model="time" type="datetimerange" format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss" range-separator="è³" start-placeholder="å¼å§æ¥æ" end-placeholder="ç»ææ¥æ"> </el-date-picker> </div> </el-form-item> <el-form-item label="é¨ç¦ç¹åç»ï¼" prop="roleIds"> <el-transfer style="margin-top: 15px;font-size: 12px" :titles="['æªéé¨ç¦ç¹åç»', 'å·²éé¨ç¦ç¹åç»']" filterable :filter-method="filterMethod" filter-placeholder="请è¾å ¥é¨ç¦ç¹åç»åç§°" v-model="form.roleIds" :data="roles"> </el-transfer> </el-form-item> <GlobalWindow :title="title" :visible.sync="visible" width="900px" :confirm-working="isWorking" @confirm="confirm"> <p class="tip-warn"><i class="el-icon-warning"></i>æéï¼<br> 1.é¨ç¦æéé ç½®æååï¼ææä»»å¡å³è¿å ¥æéä¸åéåï¼å¯åå¾ãäººåææè®°å½ãæ¥çä¸åè¿åº¦;<br> 2.妿éè¦æ¸ 空å½åéä¸äººåä¸åæéï¼ä»¥ä¸ãå·²éé¨ç¦ç¹åç»ã为空æäº¤å³å¯ã </p> <p class="tip" v-if="form.names != null">æ£å¨ä¸º<em>ã{{ form.names.map(item => `${item}`).join('ï¼') }}ã</em> é ç½®é¨ç¦æé</p> <el-form :model="form" ref="form" :rules="rules"> <el-form-item label="é¨ç¦æææï¼" prop="timeType"> <el-radio-group v-model="form.timeType"> <el-radio :label="0">é¿æææ</el-radio> <el-radio :label="1">èªå®ä¹æ¶é´</el-radio> <el-radio :label="2" v-if="companyType === 0">å¹è®æææ</el-radio> </el-radio-group> <div v-if="form.timeType == 1" style="margin-top: 10px"> <el-date-picker @change="seleTime" v-model="time" type="datetimerange" format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss" range-separator="è³" start-placeholder="å¼å§æ¥æ" end-placeholder="ç»ææ¥æ"> </el-date-picker> </div> </el-form-item> <el-form-item label="é¨ç¦ç¹åç»ï¼" prop="roleIds"> <el-transfer style="margin-top: 15px;font-size: 12px" :titles="['æªéé¨ç¦ç¹åç»', 'å·²éé¨ç¦ç¹åç»']" filterable :filter-method="filterMethod" filter-placeholder="请è¾å ¥é¨ç¦ç¹åç»åç§°" v-model="form.roleIds" class="transfer" :data="roles"> </el-transfer> </el-form-item> </el-form> </GlobalWindow> </el-form> </GlobalWindow> </template> <script> @@ -55,7 +37,7 @@ name: 'OperaDeviceRoleWindow', extends: BaseOpera, components: { GlobalWindow }, data () { data() { var validateTime = (rule, value, callback) => { if (this.form.timeType == null) { callback(new Error('è¯·å¡«åæ£ç¡®çé¨ç¦ææææ¶é´')) @@ -83,7 +65,7 @@ }, roles: [], rules: { // éªè¯è§å // éªè¯è§å timeType: [ { required: true, validator: validateTime, message: '请éä¸é¨ç¦æææ' } ], @@ -96,18 +78,18 @@ } } }, created () { created() { this.config({ api: '/business/member', 'field.id': 'id' }) }, methods: { filterMethod (query, item) { filterMethod(query, item) { if (!query) return item return item.label.indexOf(query) > -1 }, seleTime (e) { seleTime(e) { if (e && e.length >= 2) { this.form.startTime = e[0] this.form.endTime = e[1] @@ -116,7 +98,7 @@ this.form.endTime = null } }, confirm () { confirm() { this.$refs.form.validate((valid) => { if (!valid) { return @@ -126,13 +108,13 @@ .then(() => { this.confirmDo() }) .catch(() => {}) .catch(() => { }) } else { this.confirmDo() } }) }, confirmDo () { confirmDo() { // è°ç¨æ°å»ºæ¥å£ this.isWorking = true this.api.batchRoleAuth({ @@ -155,7 +137,7 @@ }) }, // è·åè®¾å¤ getLists () { getLists() { getDeviceRoleList({ type: 2 }) .then(res => { this.roles = res.map(item => { @@ -167,7 +149,7 @@ }) }) }, open (title, ids, names, companyType) { open(title, ids, names, companyType) { this.roles = [] this.getLists() this.title = title @@ -189,6 +171,7 @@ <style scoped lang="scss"> @import "@/assets/style/variables.scss"; // è§è²é ç½® .global-window { .tip { @@ -198,10 +181,12 @@ font-weight: bold; } } .tip-warn { margin: 4px 0 12px 0; font-size: 12px; color: #999; i { color: orange; margin-right: 4px; @@ -211,7 +196,25 @@ } } } .el-transfer-panel { width: 350px !important; .transfer { height: 600px; width: 100%; display: flex; justify-content: center; align-items: center; ::v-deep .el-transfer-panel { flex: 1; height: 100%; } ::v-deep .el-transfer-panel__body { height: 500px; } ::v-deep .el-transfer-panel__list.is-filterable { height: 480px; } } </style> admin/src/components/business/OperaMemberWindow.vue
@@ -1,56 +1,45 @@ <template> <GlobalWindow :title="title" width="60%" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm" > <el-form :model="form" ref="form" :rules="rules"> <el-form-item label="å§å" prop="name"> <el-input v-model="form.name" placeholder="请è¾å ¥å§å" v-trim/> </el-form-item> <el-form-item label="æå±ç»ç»" prop="companyId"> <el-cascader v-model="form.company" :options="department" @change="handleChangeCompany" :show-all-levels="false" clearable filterable :props="departprops" ></el-cascader> <div style="font-size: 12px;color: #F56C6C" > 注ï¼ä» æ¯æéæ© ã{{companyType ===0?'ç¸å ³æ¹ç»ç»':'å é¨ç»ç»'}}ã </div> </el-form-item> <el-form-item label="ææºå·" prop="phone"> <el-input v-model="form.phone" placeholder="请è¾å ¥ææºå·" v-trim/> <div style="color: #F56C6C;font-size: 12px">注ï¼åå·¥ææºå·å°ä½ä¸ºå¹³å°ç»å½è´¦å·ï¼åå§å¯ç 为系ç»é»è®¤å¯ç é 置项</div> </el-form-item> <el-form-item label="身份è¯å·" prop="idcardNo" v-if="form.id ==null"> <el-input v-model="form.idcardNo" placeholder="请è¾å ¥èº«ä»½è¯å·" v-trim/> </el-form-item> <el-form-item label="ä¿®æ¹èº«ä»½è¯å·" prop="idcardNoNew" v-if="form.id !=null"> <el-input v-model="form.idcardNoNew" placeholder="å¯ä¿®æ¹èº«ä»½è¯å·" v-trim/> <div style="font-size: 12px" v-if="form.id !=null"> 注ï¼å½å身份è¯å·ä¸º<span style="color: #F56C6C">ã{{form.idcardDecode}}ã</span>ï¼å¦éä¿®æ¹ï¼è¯·å¨è¾å ¥æ å¡«åæ°ç身份è¯å·! </div> </el-form-item> <el-form-item label="å·¥å·" prop="code"> <el-input v-model="form.code" placeholder="请è¾å ¥å工工å·" v-trim/> </el-form-item> <el-form-item label="人è¸ç §ç" prop="faceImgFull" > <UploadFaceImg :file="{ 'imgurlfull': form.faceImgFull, 'imgurl': form.faceImg }" :uploadData="uploadData" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false" @uploadBegin="isUploading = true" /> </el-form-item> </el-form> </GlobalWindow> <GlobalWindow :title="title" width="60%" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm"> <el-form :model="form" ref="form" :rules="rules"> <el-form-item label="å§å" prop="name"> <el-input v-model="form.name" placeholder="请è¾å ¥å§å" v-trim /> </el-form-item> <el-form-item label="æå±ç»ç»" prop="companyId"> <el-cascader v-model="form.company" :options="department" @change="handleChangeCompany" :show-all-levels="false" clearable filterable :props="departprops"></el-cascader> <div style="font-size: 12px;color: #F56C6C"> 注ï¼ä» æ¯æéæ© ã{{ companyType === 0 ? 'ç¸å ³æ¹ç»ç»' : 'å é¨ç»ç»' }}ã </div> </el-form-item> <el-form-item label="ææºå·" prop="phone"> <el-input v-model="form.phone" placeholder="请è¾å ¥ææºå·" v-trim /> <div style="color: #F56C6C;font-size: 12px">注ï¼åå·¥ææºå·å°ä½ä¸ºå¹³å°ç»å½è´¦å·ï¼åå§å¯ç 为系ç»é»è®¤å¯ç é 置项</div> </el-form-item> <el-form-item label="身份è¯å·" v-if="form.id == null"> <el-input v-model="form.idcardNo" placeholder="请è¾å ¥èº«ä»½è¯å·" v-trim /> </el-form-item> <el-form-item label="ä¿®æ¹èº«ä»½è¯å·" v-if="form.id != null"> <el-input v-model="form.idcardNoNew" placeholder="å¯ä¿®æ¹èº«ä»½è¯å·" v-trim /> <div style="font-size: 12px" v-if="form.id != null"> 注ï¼å½å身份è¯å·ä¸º<span style="color: #F56C6C">ã{{ form.idcardDecode }}ã</span>ï¼å¦éä¿®æ¹ï¼è¯·å¨è¾å ¥æ å¡«åæ°ç身份è¯å·! </div> </el-form-item> <el-form-item label="å·¥å·" prop="code"> <el-input v-model="form.code" placeholder="请è¾å ¥å工工å·" v-trim /> </el-form-item> <el-form-item label="人è¸ç §ç" prop="faceImgFull"> <div class="upload_wrap"> <UploadFaceImg :file="{ 'imgurlfull': form.faceImgFull, 'imgurl': form.faceImg }" :uploadData="uploadData" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false" @uploadBegin="isUploading = true" /> <div class="content"> <div>1ãè¯·éæ©æµ è²æä¸æ§èæ¯ï¼ä½¿ç¨ååå 线æç §ã</div> <div>2ãè¯·ä¿æé¢é¨æ£å¯¹é头ï¼å¿é®æ¡é¢é¨ï¼ä¿æä¸ç«è¡¨æ ã</div> <div>3ã请é¿å åæä¿®å¾ï¼ç¡®ä¿äººè¸è½®å»æ¸ æ°ã宿´ï¼å°½å¯è½åå°éè¸é¨å å®¹å æ¯ã</div> </div> </div> </el-form-item> </el-form> </GlobalWindow> </template> <script> @@ -58,12 +47,12 @@ import GlobalWindow from '@/components/common/GlobalWindow' import UploadAvatarImage from '@/components/common/UploadAvatarImage' import UploadFaceImg from '@/components/common/UploadFaceImg' import {checkMobile, validIdCardNo, validIdCardNoNew} from '@/utils/form' import { checkMobile, validIdCardNo, validIdCardNoNew } from '@/utils/form' export default { name: 'OperaCompanyWindow', extends: BaseOpera, components: { GlobalWindow, UploadAvatarImage,UploadFaceImg }, data () { components: { GlobalWindow, UploadAvatarImage, UploadFaceImg }, data() { return { uploadData: { folder: 'member' @@ -73,7 +62,7 @@ value: 'id', checkStrictly: true }, companyType:0, companyType: 0, department: [], // è¡¨åæ°æ® form: { @@ -102,14 +91,14 @@ } } }, created () { created() { this.config({ api: '/business/member.js', 'field.id': 'id' }) }, methods: { handleChangeCompany (value) { handleChangeCompany(value) { if (this.form.company && this.form.company.length > 1) { this.form.companyId = this.form.company[this.form.company.length - 1] } @@ -119,7 +108,7 @@ * @title çªå£æ é¢ * @target ç¼è¾ç对象 */ open (title, target, depart,companyType) { open(title, target, depart, companyType) { this.title = title this.department = depart this.visible = true @@ -140,7 +129,7 @@ this.form[key] = target[key] this.form.idcardNo = '' } this.form.company =[] this.form.company = [] if (target.companyId && target.companyPath) { var array = target.companyPath.split('/') array.forEach(item => { @@ -152,10 +141,34 @@ }) }, // ä¸ä¼ å¾ç uploadAvatarSuccess (file) { uploadAvatarSuccess(file) { this.form.faceImg = file.imgurl this.form.faceImgFull = file.imgurlfull } } } </script> <style lang="scss" scoped> .upload_wrap{ display: flex; align-items: center; .avatar-uploader{ display: flex; align-items: center; justify-content: center; } ::v-deep .avatar{ max-width: 90px; max-height: 90px; } .content{ display: flex; flex-direction: column; justify-content: center; font-size: 12px; color: #999999; margin-left: 12px; line-height: 24px; } } </style> admin/src/components/business/OperaPlatformApproveTemplWindow.vue
@@ -82,10 +82,10 @@ <!-- æé人 --> <template v-if="apprList[activeIndex].type == '1'"> <div class="config_data_item_reviewed_content"> <div v-for="mem in apprList[activeIndex].objIds" :key="mem.id" <div v-for="(mem,memIndex) in apprList[activeIndex].objIds" :key="mem.id" class="config_data_item_reviewed_content_item"> <span>{{ mem.name }}</span> <i class="el-icon-close"></i> <i @click="memDel(memIndex)" class="el-icon-close"></i> </div> <span class="add" @click="selStaff">+æ·»å </span> </div> admin/src/components/business/operaVisitsWindow.vue
@@ -288,7 +288,6 @@ .upload_wrap{ display: flex; align-items: center; justify-content: center; .avatar-uploader{ display: flex; align-items: center; admin/src/components/common/CommonHeader.vue
@@ -9,7 +9,7 @@ <div class="linellae"></div> </div> <div class="item" @click="getHeaderNav('0')">å®é²ä¸å¿</div> <div class="item" @click="getHeaderNav('1')">æ¶é²ä¸å¿</div> <div class="item" @click="getHeaderNav('1')">æ¶æ§ä¸å¿</div> <div class="item" @click="getHeaderNav('2')">è½ç®¡ä¸å¿</div> <div class="item" @click="getHeaderNav('3')">驾驶è±</div> </div> admin/src/components/common/UploadFaceImg.vue
@@ -24,8 +24,9 @@ <ImageCropper ref="iconShot" v-if="updateImg" :imgSrc="img" > </ImageCropper> <span slot="footer" class="dialog-footer"> <el-button @click="updateImg = false">å æ¶</el-button> <el-button type="primary" @click="uploadIcon">ç¡® å®</el-button> <el-button v-if="loading">å æ¶</el-button> <el-button v-else @click="updateImg = false">å æ¶</el-button> <el-button :loading="loading" type="primary" @click="uploadIcon">ç¡® å®</el-button> </span> </el-dialog> </div> @@ -50,6 +51,7 @@ }, data () { return { loading: false, fileInfo:{}, img: null, updateImg: false, @@ -75,7 +77,9 @@ { type: this.fileInfo.type } // 设置Fileç±»åçæä»¶ç±»å ) ) this.loading = true upload(formData).then(res => { this.loading = false console.log(res) this.file.imgurl = res.imgaddr this.file.imgurlfull = res.url @@ -84,6 +88,8 @@ this.updateImg = false this.$emit('uploadSuccess', { imgurl: res.imgaddr, imgurlfull: res.url, name: res.originname }) this.$emit('uploadEnd') }, () => { this.loading = false }) }) }, admin/src/components/operation/OperCarUseBookParamWindow.vue
@@ -533,7 +533,7 @@ }, initData () { getCarList({ type: 1 type: 0 }).then(res => { this.carsList = res }) admin/src/components/system/role/PermissionConfigWindow.vue
@@ -12,6 +12,7 @@ ref="permissionTransfer" v-model="selectedIds" filterable class="transfer" :filter-method="filterPermissions" :titles="['æªæææé', 'å·²æææé']" :props="{ @@ -121,4 +122,24 @@ } } } .transfer { height: 600px; width: 100%; display: flex; justify-content: center; align-items: center; ::v-deep .el-transfer-panel { flex: 1; height: 100%; } ::v-deep .el-transfer-panel__body { height: 500px; } ::v-deep .el-transfer-panel__list.is-filterable { height: 480px; } } </style> admin/src/components/system/user/RoleConfigWindow.vue
@@ -11,6 +11,7 @@ <div class="df_center"> <el-transfer v-model="selectedIds" class="transfer" :titles="['æªææè§è²', 'å·²ææè§è²']" :props="{ key: 'id', @@ -126,4 +127,24 @@ } } } .transfer { height: 600px; width: 100%; display: flex; justify-content: center; align-items: center; ::v-deep .el-transfer-panel { flex: 1; height: 100%; } ::v-deep .el-transfer-panel__body { height: 500px; } ::v-deep .el-transfer-panel__list.is-filterable { height: 480px; } } </style> admin/src/views/business/approvalConfiguration.vue
@@ -686,9 +686,18 @@ } .transfer { height: 600px; width: 100%; display: flex; justify-content: center; align-items: center; ::v-deep .el-transfer-panel{ flex: 1; height: 100%; } ::v-deep .el-transfer-panel__body { height: 500px; } ::v-deep .el-transfer-panel__list.is-filterable { height: 480px; } admin/src/views/business/approvalReport.vue
@@ -107,12 +107,12 @@ <template v-if="apprList[activeIndex].type == '1'"> <div class="config_data_item_reviewed_content"> <div v-for="mem in apprList[activeIndex].objIds" v-for="mem,memIndex in apprList[activeIndex].objIds" :key="mem.id" class="config_data_item_reviewed_content_item" > <span>{{ mem.name }}</span> <i class="el-icon-close"></i> <i @click="memDel(memIndex)" class="el-icon-close"></i> </div> <span class="add" @click="selStaff">+æ·»å </span> </div> @@ -672,9 +672,18 @@ } .transfer { height: 600px; width: 100%; display: flex; justify-content: center; align-items: center; ::v-deep .el-transfer-panel{ flex: 1; height: 100%; } ::v-deep .el-transfer-panel__body { height: 500px; } ::v-deep .el-transfer-panel__list.is-filterable { height: 480px; } admin/src/views/operation/serviceCar/apprConfig.vue
@@ -154,7 +154,7 @@ <span>é¨é¨ä¸»ç®¡</span> </div> <div class="config_data_item_reviewed_r"> <span>被访人ç</span> <span>ç³è¯·äººç</span> <el-select v-model="apprList[activeIndex].objLevel" placeholder="è¯·éæ©" @@ -691,9 +691,18 @@ } .transfer { height: 600px; width: 100%; display: flex; justify-content: center; align-items: center; ::v-deep .el-transfer-panel{ flex: 1; height: 100%; } ::v-deep .el-transfer-panel__body { height: 500px; } ::v-deep .el-transfer-panel__list.is-filterable { height: 480px; } admin/src/views/platform/components/PlatformQueuing.vue
@@ -259,6 +259,7 @@ .footer { .detail { color: $primaryColor; cursor: pointer; } } } admin/src/views/platform/platformReason.vue
@@ -38,7 +38,8 @@ <el-table-column prop="reason" label="å ¥ååå " fixed min-width="100px"></el-table-column> <el-table-column prop="groupName" label="对åºä½ä¸æå°ç»" fixed min-width="150px"></el-table-column> <el-table-column prop="limitNum" label="ä½ä¸é(ä¸åª/天)" min-width="120px"></el-table-column> <el-table-column prop="reason" label="说æ" fixed min-width="100px"></el-table-column> <el-table-column prop="sortnum" label="æåºç " fixed min-width="80px"></el-table-column> <el-table-column prop="remark" label="说æ" fixed min-width="100px"></el-table-column> <el-table-column label="ç¦/å¯ç¨" min-width="120px" > <template slot-scope="{row}"> <el-switch admin/src/views/platform/queueUp.vue
@@ -21,7 +21,7 @@ <span></span> </div> </div> <el-table v-if="activeGroup.type == 2" class="mb20" v-loading="loading" :data="dataList" stripe row-key="id" default-expand-all> <el-table class="mb20" v-loading="loading" :data="dataList" stripe row-key="id" default-expand-all> <el-table-column type="index" label="åºå·" width="80" /> <el-table-column label="车çå·" width="130"> <template slot-scope="{ row }"> @@ -33,8 +33,21 @@ </div> </template> </el-table-column> <el-table-column prop="contractNum" label="åååå·" min-width="120" /> <el-table-column prop="totalNum" label="æ»è¿è¾é(䏿¯)" min-width="110" /> <el-table-column prop="carrierName" label="è¿è¾å ¬å¸" min-width="120"> <template v-slot="scope"> <span>{{ scope.row.carrierName || '-' }}</span> </template> </el-table-column> <el-table-column prop="contractNum" label="è¿è¾åå·/ååå·" min-width="120"> <template v-slot="scope"> <span>{{ scope.row.billCode || scope.row.carrierName || '-' }}</span> </template> </el-table-column> <el-table-column prop="totalNum" label="æ»è¿è¾é(䏿¯)" min-width="110"> <template v-slot="scope"> <span>{{ scope.row.totalNum || '-' }}</span> </template> </el-table-column> <el-table-column label="驾驶å" min-width="130"> <template slot-scope="{ row }"> <span class="mr10">{{ row.driverName }}</span> @@ -50,7 +63,7 @@ </template> </el-table-column> </el-table> <el-table v-else class="mb20" v-loading="loading" :data="dataList" stripe row-key="id" default-expand-all> <!-- <el-table v-else class="mb20" v-loading="loading" :data="dataList" stripe row-key="id" default-expand-all> <el-table-column type="index" label="åºå·" width="80" /> <el-table-column label="车çå·" width="130"> <template slot-scope="{ row }"> @@ -78,7 +91,7 @@ <el-button v-else type="text" @click="subDetail(row)">é¢çº¦è¯¦æ </el-button> </template> </el-table-column> </el-table> </el-table> --> <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="pagination" /> <!-- --> admin/src/views/platform/set/group.vue
@@ -72,6 +72,7 @@ :titles="['å¾ æ·»å æå°', 'å·²æ·»å æå°']" v-model="param.sel" :data="data" class="transfer" > </el-transfer> @@ -144,5 +145,25 @@ } </script> <style> <style lang="scss" scoped> .transfer { height: 600px; width: 100%; display: flex; justify-content: center; align-items: center; ::v-deep .el-transfer-panel { flex: 1; height: 100%; } ::v-deep .el-transfer-panel__body { height: 500px; } ::v-deep .el-transfer-panel__list.is-filterable { height: 480px; } } </style> admin/src/views/task/driverDetail.vue
@@ -14,7 +14,7 @@ <div class="right" :class="{ scs: info.status == '2' || info.status == '5', msg: info.status == '3' || info.status == '6' }">{{ statusMap[info.status] }}</div> </div> <div class="info"> <div class="title">å ¬å¡è½¦ç³è¯·ä¿¡æ¯</div> <div class="title">ç©æµè½¦é¢çº¦ä¿¡æ¯</div> <div class="list"> <div class="item"> <div class="label">ç³è¯·äºº</div> admin/src/views/task/index.vue
@@ -250,7 +250,7 @@ getList (page) { this.getHeadData() const { filters, pagination } = this if (filters.selTime && filters.selTime.length > 0) { if (filters.selTime && filters.selTime.length > 0 && filters.queryType != 0) { filters.startDate = filters.selTime[0] filters.endDate = filters.selTime[1] } else { h5/pages/staff/task/visitorReport.vue
@@ -222,143 +222,166 @@ padding-bottom: 0; .flow_wrap { padding: 30rpx 0; .flow_title { font-weight: 600; font-size: 32rpx; color: #222222; margin-bottom: 24rpx; } .list { .item { display: flex; margin-bottom: 48rpx; position: relative; .separate { position: absolute; width: 4rpx; height: 100%; background-color: #eeeeee; left: 40rpx; transform: translate(-50%, 0); top: 80rpx; } .avatar { width: 80rpx; height: 80rpx; position: relative; margin-right: 20rpx; .img { width: 80rpx; height: 80rpx; border-radius: 50%; } .status { width: 28rpx; height: 28rpx; border-radius: 50%; position: absolute; right: 0; bottom: 0; } } .content { flex: 1; .head { display: flex; justify-content: space-between; margin-bottom: 4rpx; .event { font-size: 30rpx; } .time { font-size: 26rpx; color: #999999; } } .name_wrap { font-size: 26rpx; color: #777777; .status { color: $uni-color-primary; } } .children { display: flex; flex-wrap: wrap; margin-top: 12rpx; .child { display: flex; flex-direction: column; justify-content: center; align-items: center; margin-right: 12rpx; font-size: 26rpx; color: #777777; .child_img { width: 48rpx; height: 48rpx; border-radius: 50%; } } } .remark { margin-top: 12rpx; background-color: #f7f7f7; padding: 14rpx 20rpx; border-radius: 8rpx; font-size: 26rpx; color: #666666; line-height: 36rpx; } } .carbon { display: flex; width: 590rpx; overflow-x: auto; margin-top: 12rpx; .carbon_item { text-align: center; flex-shrink: 0; width: 100rpx; image { width: 60rpx; height: 60rpx; margin: 0 auto; } view { font-size: 26rpx; color: #777777; } } } &:nth-last-child(1) { .separate { height: 0; } } } } padding: 30rpx 0; .flow_title { font-weight: 600; font-size: 32rpx; color: #222222; margin-bottom: 24rpx; } .list { .item { display: flex; margin-bottom: 48rpx; position: relative; .separate { position: absolute; width: 4rpx; height: 100%; background-color: #eeeeee; left: 40rpx; transform: translate(-50%, 0); top: 80rpx; } .avatar { width: 80rpx; height: 80rpx; position: relative; margin-right: 20rpx; display: flex; align-items: center; justify-content: center; .img { width: 80rpx; height: 80rpx; border-radius: 50%; } .img_name { font-size: 32rpx; color: #FFFFFF; } .status { width: 28rpx; height: 28rpx; border-radius: 50%; position: absolute; right: 0; bottom: 0; } } .content { flex: 1; .head { display: flex; justify-content: space-between; margin-bottom: 4rpx; .event { font-size: 30rpx; } .time { font-size: 26rpx; color: #999999; } } .name_wrap { font-size: 26rpx; color: #777777; .status { color: $uni-color-primary; } } .children { display: flex; flex-wrap: wrap; margin-top: 12rpx; .child { display: flex; flex-direction: column; justify-content: center; align-items: center; margin-right: 12rpx; font-size: 26rpx; color: #777777; .child_img { width: 48rpx; height: 48rpx; border-radius: 50%; margin-bottom: 2rpx; } .child_name { margin-bottom: 2rpx; width: 48rpx; height: 48rpx; text-align: center; justify-content: center; padding-top: 4rpx; font-size: 28rpx; border-radius: 50%; color: #FFFFFF; background-color: $uni-color-primary; } } } .remark { margin-top: 12rpx; background-color: #f7f7f7; padding: 14rpx 20rpx; border-radius: 8rpx; font-size: 26rpx; color: #666666; line-height: 36rpx; } } .carbon { display: flex; width: 590rpx; overflow-x: auto; margin-top: 12rpx; .carbon_item { text-align: center; flex-shrink: 0; width: 100rpx; image { width: 60rpx; height: 60rpx; margin: 0 auto; } view { font-size: 26rpx; color: #777777; } } } &:nth-last-child(1) { .separate { height: 0; } } } } } .module_list { h5/utils/config.js
@@ -1,6 +1,6 @@ // export const baseUrl = 'admin_interface/' export const baseUrl = 'http://192.168.0.173/gateway_interface/' export const baseUrl = 'admin_interface/' // export const baseUrl = 'http://192.168.0.173/gateway_interface/' export const uploadAvatar = `${baseUrl}visitsAdmin/cloudService/web/public/uploadFtp.do` export const uploadUrl = `${baseUrl}visitsAdmin/cloudService/public/uploadBatch` screen/src/assets/images/SecurityControl/anfang_ic_data@2x.png
screen/src/assets/images/SecurityControl/bg@2x.png
screen/src/assets/images/SecurityControl/ic_title_green@2x.png
screen/src/assets/images/SecurityControl/jiankong_ic_open@2x.png
screen/src/assets/images/SecurityControl/staff_ic_fangke@2x.png
screen/src/assets/images/SecurityControl/staff_ic_neibu@2x.png
screen/src/assets/images/SecurityControl/staff_ic_xiangguanfang@2x.png
screen/src/assets/images/SecurityControl/title_short@2x.png
screen/src/router/index.js
@@ -23,6 +23,11 @@ name: 'LogisticsControl', component: () => import('../views/LogisticsEfficiency.vue') }, { path: '/SecurityControl', name: 'SecurityControl', component: () => import('../views/SecurityControl.vue') }, ] }) screen/src/utils/scale_screen.js
@@ -1,7 +1,7 @@ // remçæ¯éé é ç½®æä»¶ // åºåå¤§å° const baseSize = 16 const baseSize = 14 // 设置 rem 彿° function setRem() { // å½å页é¢å®½åº¦ç¸å¯¹äº 1920宽çç¼©æ¾æ¯ä¾ï¼å¯æ ¹æ®èªå·±éè¦ä¿®æ¹ã screen/src/views/LogisticsEfficiency.vue
@@ -1,9 +1,8 @@ <template> <v-scale-screen width="1920" height="960" :fullScreen="true"> <v-scale-screen width="1920" height="960"> <div class="main_app"> <img src="@/assets/images/energy_ef/bg@2x.png" class="main_bg" alt="" /> <div class="main_header"> <!-- <img src="@/assets/images/maintitle.gif" class="main_header_bg" alt="" /> --> <img src="@/assets/images/maintitle@2x.png" class="main_header_bg" alt="" /> <div class="title">宿³°æºæ §ç©æµååº-è°åº¦è½æè·è¸ª</div> <div class="time_wrap"> @@ -222,7 +221,16 @@ </div> <Percent :rate="80" /> </div> <div class="list"></div> <div class="list"> <div class="item"> <div class="la">é»å±±(æ°å¶çç)</div> <div class="val">400䏿¯</div> </div> <div class="item"> <div class="la">é»å±±(æ°å¶çç)</div> <div class="val">400䏿¯</div> </div> </div> </div> </div> </div> @@ -723,16 +731,20 @@ .list { margin-left: 36px; .item { margin-bottom: 14px; font-size: 14px; &:nth-last-child(1){ &:nth-last-child(1) { margin: 0; } .line { display: flex; align-items: center; margin-bottom: 6px; .icon { width: 12px; height: 12px; @@ -741,15 +753,51 @@ background: linear-gradient(270deg, #29aeff 0%, #207ff7 100%); } } .num{ .num { margin-left: 20px; } } } } } .right_box_three{ .right_box_three { .repertory { .header { padding: 15px; display: flex; justify-content: space-between; align-items: center; font-size: 14px; color: #D2E0FF; margin-bottom: 11px; .num { font-weight: 500; font-size: 16px; color: #FFFFFF; } } .list{ margin-top: 22px; .item{ width: 100%; height: 36px; display: flex; align-items: center; &:nth-of-type(2n+1){ background: rgba(0,152,255,0.13); } .la{ flex: 5; padding-left: 20px; } .val{ flex: 2; } } } } } } } @@ -867,7 +915,7 @@ color: #FFFFFF; position: relative; z-index: -2; font-size: 14px; .main_bg { position: absolute; left: 0; screen/src/views/PlatformCall.vue
@@ -192,7 +192,7 @@ </script> <template> <v-scale-screen width="1920" height="1080" :fullScreen="true"> <v-scale-screen width="1920" height="1080"> <div class="main_app"> <div class="main_header"> <img class="bg" src="@/assets/images/call/title@2x.png" alt=""> screen/src/views/SecurityControl.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,845 @@ <template> <v-scale-screen width="1920" height="960"> <div class="main_app"> <img src="@/assets/images/SecurityControl/bg@2x.png" class="main_bg" alt="" /> <div class="main_header"> <img src="@/assets/images/maintitle@2x.png" class="main_header_bg" alt="" /> <div class="title">宿³°æºæ §ç©æµååº-å®é²æºè½çæµ</div> <div class="time_wrap"> <span class="date">{{ date }}</span> <span class="week">{{ week }}</span> <span class="time">{{ time }}</span> </div> </div> <div class="main_content"> <div class="left_box"> <div class="left_box_one"> <div class="com_header"> <div class="title"> <img src="@/assets/images/ic_title@2x.png" class="icon" alt="" /> <div>宿¶ååºè½¦è¾</div> </div> <img src="@/assets/images/title@2x.png" class="bg" alt="" /> </div> <div class="second_title"> <div class="title"> <img src="@/assets/images/SecurityControl/ic_title_green@2x.png" class="icon" alt="" /> <div>宿¶ååºè½¦è¾</div> </div> <div class="num_wrap"> <div class="la">æ»è½¦ä½ï¼</div> <div class="val">100</div> </div> </div> <div class="stall_static"> <div class="residue"> <div class="la">å©ä½è½¦ä½</div> <div class="val">50</div> </div> <div class="total"> <div class="la">è½¦ä½æ»æ°</div> <div class="val">50</div> </div> <div class="rate"> <div class="la"> <span>车ä½ä½¿ç¨ç</span> <span class="num">50%</span> </div> <div class="val"> <Percent :rate="50" /> </div> </div> </div> <div class="second_title"> <div class="title"> <img src="@/assets/images/SecurityControl/ic_title_green@2x.png" class="icon" alt="" /> <div>å½åå¨åç§å®¶è½¦åå¸</div> </div> </div> <div class="private_car"> <div class="item"> <img src="" class="icon" alt=""> <div class="num">20</div> <div class="name">å工车è¾</div> </div> <div class="item"> <img src="" class="icon" alt=""> <div class="num">20</div> <div class="name">ç¸å ³æ¹è½¦è¾</div> </div> <div class="item"> <img src="" class="icon" alt=""> <div class="num">20</div> <div class="name">æ¥è®¿è½¦è¾</div> </div> </div> <div class="second_title"> <div class="title"> <img src="@/assets/images/SecurityControl/ic_title_green@2x.png" class="icon" alt="" /> <div>å½åå¨å货车åå¸</div> </div> </div> <div class="car_static"> <div class="echart_wrap"> <div class="pie_text"> <div class="fs30"><strong>300</strong></div> <div>货车</div> </div> <div class="echart" id="echart1"></div> </div> <div class="list"> <div class="item"> <div class="line"> <div :style="{ background: colors[0] }" class="icon"></div> <div class="text">å è¿è½¦è¾</div> </div> <div :style="{ color: colors[0] }" class="num">100</div> </div> <div class="item"> <div class="line"> <div :style="{ background: colors[1] }" class="icon"></div> <div class="text">å¤åè¿è¾è½¦è¾</div> </div> <div :style="{ color: colors[1] }" class="num">100</div> </div> <div class="item"> <div class="line"> <div :style="{ background: colors[2] }" class="icon"></div> <div class="text">å¸å ¬å¸å¸è´§è½¦è¾</div> </div> <div :style="{ color: colors[2] }" class="num">100</div> </div> </div> </div> </div> </div> <div class="center_box"> <div class="center_box_one"> <div class="list"> <div class="item"> <div class="name_wrap"> <div class="name">å½åå¨å人æ°</div> <img src="@/assets/images/SecurityControl/title_short@2x.png" class="bg" alt=""> </div> <div class="num_wrap"> <div class="num">200</div> <img src="@/assets/images/SecurityControl/anfang_ic_data@2x.png" class="bg" alt=""> </div> </div> <div class="item"> <div class="name_wrap"> <div class="name">å½åå¨åè½¦è¾æ°</div> <img src="@/assets/images/SecurityControl/title_short@2x.png" class="bg" alt=""> </div> <div class="num_wrap"> <div class="num">200</div> <img src="@/assets/images/SecurityControl/anfang_ic_data@2x.png" class="bg" alt=""> </div> </div> <div class="item"> <div class="name_wrap"> <div class="name">å½åè®¾å¤æ»æ°</div> <img src="@/assets/images/SecurityControl/title_short@2x.png" class="bg" alt=""> </div> <div class="num_wrap"> <div class="num">200</div> <img src="@/assets/images/SecurityControl/anfang_ic_data@2x.png" class="bg" alt=""> </div> </div> <div class="item"> <div class="name_wrap"> <div class="name">å½ååè¦æ»æ°</div> <img src="@/assets/images/SecurityControl/title_short@2x.png" class="bg" alt=""> </div> <div class="num_wrap"> <div class="num">200</div> <img src="@/assets/images/SecurityControl/anfang_ic_data@2x.png" class="bg" alt=""> </div> </div> </div> </div> </div> <div class="right_box"> <div class="right_box_one"> <div class="com_header"> <div class="title"> <img src="@/assets/images/ic_title@2x.png" class="icon" alt="" /> <div>å¨å人ååæ</div> </div> <img src="@/assets/images/title@2x.png" class="bg" alt="" /> </div> <div class="second_title"> <div class="title"> <img src="@/assets/images/SecurityControl/ic_title_green@2x.png" class="icon" alt="" /> <div>å½åå¨å人ååå¸</div> </div> </div> <div class="static_wrap"> <div class="item"> <img src="@/assets/images/SecurityControl/staff_ic_neibu@2x.png" alt=""> <div class="content"> <div class="name">å é¨åå·¥</div> <div class="num"><span>1000</span> | 66.6%</div> </div> </div> <div class="item"> <img src="@/assets/images/SecurityControl/staff_ic_xiangguanfang@2x.png" alt=""> <div class="content"> <div class="name">é¿æç¸å ³æ¹</div> <div class="num today"><span>1000</span> | 66.6%</div> </div> </div> <div class="item"> <img src="@/assets/images/SecurityControl/staff_ic_fangke@2x.png" alt=""> <div class="content"> <div class="name">å¨å访客</div> <div class="num finish"><span>1000</span> | 66.6%</div> </div> </div> </div> <div class="second_title"> <div class="title"> <img src="@/assets/images/SecurityControl/ic_title_green@2x.png" class="icon" alt="" /> <div>仿¥è®¿å®¢åæ</div> </div> </div> <div class="visitor_list"> <div class="item"> <div class="name">å¾ è®¿é®</div> <div class="num_wrap"> <span class="num">22</span> <span>人</span> </div> </div> <div class="spacing"></div> <div class="item"> <div class="name">å·²ç»æº</div> <div class="num_wrap"> <span class="num">22</span> <span>人</span> </div> </div> <div class="spacing"></div> <div class="item"> <div class="name">已离å¼</div> <div class="num_wrap"> <span class="num">22</span> <span>人</span> </div> </div> <div class="spacing"></div> <div class="item"> <div class="name">æ»ç</div> <div class="num_wrap"> <span class="num">22</span> <span>人</span> </div> </div> </div> </div> <div class="right_box_two"> </div> <div class="right_box_three"> </div> </div> </div> </div> </v-scale-screen> </template> <script setup> import { ref, onMounted } from 'vue' import VScaleScreen from 'v-scale-screen' import Percent from '@/components/percent.vue' import dayjs from 'dayjs' import * as echarts from 'echarts' const colors = ['#FEAF01', '#01ABFE', '#51F9E4'] const weekMap = ['æææ¥', 'ææä¸', 'ææäº', 'ææä¸', 'ææå', 'ææäº', 'ææå ',] const date = ref(dayjs().format('YYYY.MM.DD')) const week = ref(weekMap[new Date().getDay()]) const time = ref(dayjs().format('HH:mm:ss')) setInterval(() => { date.value = dayjs().format('YYYY-MM-DD') week.value = weekMap[new Date().getDay()] time.value = dayjs().format('HH:mm:ss') }, 1000) const arr = ['#68e2e3', '#50afd3', '#377cdb', '#d5ae3a'] const initEnergy = () => { var myChart = echarts.init(document.querySelector('.energyRef')) // ç»å¶å¾è¡¨ const arr = ['#68e2e3', '#50afd3', '#377cdb', '#d5ae3a'] myChart.setOption({ grid: { top: '20%', left: '2%', right: '2%', bottom: '4%', containLabel: true }, tooltip: { trigger: 'axis', axisPointer: { type: 'line' }, }, xAxis: { type: 'category', data: [1, 2, 3, 4, 4, 5] }, yAxis: { type: 'value', name: 'kw·h', nameTextStyle: { padding: [0, 0, 4, -30] // å个æ°ååå«ä¸ºä¸å³ä¸å·¦ä¸åä½ç½®è·ç¦» }, splitLine: { show: true, lineStyle: { //è¿éè¾å ¥çº¿æ¡çæ ·å¼ color: 'rgba(255,255,255,0.14)', } } }, series: [ { data: [1, 2, 3, 4, 5], type: 'bar', barWidth: 10, itemStyle: { normal: { color: new echarts.graphic.LinearGradient( 0, 0, 0, 1, [ { offset: 0, color: arr[1] }, { offset: 1, color: '#080807' } ] ), barBorderRadius: [10, 10, 0, 0] } } } ] }) window.addEventListener('resize', function () {//æ§è¡ myChart.resize() }) } const initEchart1 = () => { const myChart = echarts.init(document.getElementById('echart1')) const option = { series: [ { type: 'pie', radius: ['86%', '100%'], label: { show: false, position: 'center' }, padAngle: 5, itemStyle: { borderRadius: 10 }, color: colors, labelLine: { show: false }, data: [ { value: 1048, name: 'Search Engine' }, { value: 735, name: 'Direct' }, { value: 580, name: 'Email' } ] } ] } myChart.setOption(option) window.addEventListener('resize', function () { // æ§è¡ myChart.resize() }) } onMounted(() => { // initEnergy() initEchart1() }) </script> <style lang="scss" scoped> div { box-sizing: border-box; } .main_content { display: flex; padding: 20px 25px 0; .left_box { width: 360px; .left_box_one { width: 100%; position: relative; margin-bottom: 20px; font-size: 14px; color: #D2E0FF; .second_title { margin-top: 24px; margin-bottom: 20px; } .stall_static { display: flex; margin-bottom: 40px; padding: 0 20px; .residue { flex: 5; .val { color: #01D9FE; } } .total { flex: 5; } .rate { flex: 12; .la { display: flex; justify-content: space-between; .num { font-weight: 500; color: #FFFFFF; } } } .val { font-weight: bold; font-size: 18px; color: #FFFFFF; margin-top: 6px; display: flex; align-items: center; height: 24px; } } .private_car { padding: 4px 32px; display: flex; justify-content: space-between; margin-bottom: 36px; .item { display: flex; flex-direction: column; align-items: center; .icon { width: 52px; height: 52px; margin-bottom: 10px; } .num { line-height: 28px; height: 28px; margin-bottom: 2px; font-weight: bold; font-size: 18px; color: #01D9FE; } } } .car_static { display: flex; justify-content: center; align-items: center; padding: 16px 24px; .echart_wrap { position: relative; .pie_text { width: 82px; height: 82px; border: 1px dashed rgba(1, 217, 254, 0.7); border-radius: 50%; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); z-index: 999; display: flex; flex-direction: column; justify-content: center; align-items: center; font-size: 12px; .fs30 { font-weight: bold; font-size: 18px; margin-bottom: 4px; } } } .echart { width: 110px; height: 110px; } .list { margin-left: 36px; flex: 1; display: flex; flex-direction: column; justify-content: space-between; height: 110px; .item { width: 100%; font-size: 14px; display: flex; justify-content: space-between; .line { display: flex; align-items: center; margin-bottom: 6px; .icon { width: 12px; height: 12px; border-radius: 50%; margin-right: 10px; background: linear-gradient(270deg, #29aeff 0%, #207ff7 100%); } } .num { margin-left: 20px; } } } } } } .center_box { flex: 1; margin: 0 20px; .center_box_one { padding: 8px 60px; .list { display: flex; justify-content: space-between; .item { display: flex; flex-direction: column; align-items: center; .name_wrap { width: 120px; height: 32px; display: flex; justify-content: center; align-items: center; font-weight: 500; font-size: 13px; margin-bottom: 10px; position: relative; } .num_wrap { width: 86px; height: 75px; position: relative; font-size: 30px; .num { font-weight: 600; text-align: center; } } } } } } .right_box { width: 360px; .right_box_one { margin-bottom: 20px; .second_title { margin-top: 20px; } .static_wrap { padding: 14px 0 0 46px; .item { display: flex; align-items: center; display: flex; margin-bottom: 10px; img { width: 70px; height: 70px; margin-right: 20px; } .content { color: #FFFFFF; .num { margin-top: 8px; font-size: 16px; color: #00F2F3; span { font-size: 20px; margin-right: 4px; font-weight: 600; } } .today { color: #09FACD; } .finish { color: #FEAF01; } } } } .visitor_list { display: flex; justify-content: space-between; padding: 20px; .item { font-size: 12px; color: #D2E0FF; .num_wrap { display: flex; align-items: flex-end; margin-top: 8px; .num{ font-size: 22px; line-height: 22px; color: #FFFFFF; } } } .spacing{ width: 1px; height: 40px; background-color: #405173; margin: 0 24px; } } } .right_box_two {} .right_box_three {} } } .main_header { display: flex; justify-content: space-between; align-items: center; height: 90px; position: relative; padding: 0px 40px 16px; font-weight: 600; font-size: 36px; .title { background-image: -webkit-linear-gradient(top, #ffffff 0%, #c8ddff 70%, #85b4ff 80%, #74a9ff 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; } .time_wrap { font-size: 26px; font-weight: 600; background-image: -webkit-linear-gradient(top, #ffffff 0%, #c8ddff 50%, #85b4ff 80%, #74a9ff 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; display: flex; align-items: center; .time { width: 180px; display: flex; justify-content: flex-end; padding-bottom: 10px; font-size: 36px; } .week { margin-left: 36px; } } .main_header_bg { position: absolute; left: 0; top: 0; width: 100%; height: 100%; object-fit: cover; z-index: -1; } } .com_header { height: 40px; display: flex; justify-content: space-between; align-items: center; padding: 0 15px 0 13px; position: relative; .title { display: flex; align-items: center; font-weight: bold; font-size: 16px; background-image: -webkit-linear-gradient(top, #ffffff 0%, #c8ddff 66%, #85b4ff 72%, #74a9ff 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; .icon { width: 16px; height: 16px; margin-right: 14px; } } .tabs { display: flex; align-items: center; font-size: 14px; color: #d2e0ff; .separate { width: 1px; height: 14px; background-color: #d2e0ff; margin: 0 6px; } .active { color: #0094eb; } } } .second_title { height: 24px; display: flex; justify-content: space-between; align-items: center; padding: 0 20px; position: relative; .title { display: flex; align-items: center; font-weight: 500; font-size: 16px; color: #FFFFFF; .icon { width: 16px; height: 16px; margin-right: 10px; } } .num_wrap { font-weight: 400; font-size: 14px; color: #D2E0FF; display: flex; align-items: center; .val { font-weight: bold; font-size: 16px; color: #FFFFFF; } } } .main_app { width: 1920px; height: 960px; /* width: 100%; height: 100vh; */ background: #0b2539; color: #FFFFFF; position: relative; z-index: -2; font-size: 14px; .main_bg { position: absolute; left: 0; top: 0; width: 100%; height: 100%; object-fit: cover; z-index: -1; } } .bg { position: absolute; left: 0; top: 0; width: 100%; height: 100%; object-fit: cover; z-index: -1; } </style>