Browse Source

区域屏

master
xuhuajiao 4 weeks ago
parent
commit
67f11e6232
  1. BIN
      src/assets/images/screen/book.png
  2. 41
      src/assets/styles/digitalScreen.scss
  3. 9
      src/views/components/upload.vue
  4. 51
      src/views/digitalScreen/index.vue
  5. 18
      src/views/digitalScreen/module/addBookDialog.vue
  6. 10
      src/views/digitalScreen/module/advSetting.vue
  7. 241
      src/views/digitalScreen/module/areaSetting.vue
  8. 86
      src/views/digitalScreen/module/bookRecommend.vue
  9. 23
      src/views/system/menu/index.vue
  10. 23
      src/views/system/role/index.vue

BIN
src/assets/images/screen/book.png

Before

Width: 1080  |  Height: 1920  |  Size: 412 KiB

After

Width: 110  |  Height: 160  |  Size: 3.3 KiB

41
src/assets/styles/digitalScreen.scss

@ -208,7 +208,7 @@
width: 110px;
height: 160px;
flex-shrink: 0; // 禁止压缩保持固定尺寸
border: 2px solid #fff;
// border: 2px solid #fff;
border-radius: 4px;
transition: all 0.2s;
margin: 0 5px;
@ -223,8 +223,8 @@
object-fit: cover;
}
.book-select, .book-delete {
position: absolute;
bottom: 3px;
// position: absolute;
// bottom: 3px;
display: flex;
align-items: center;
justify-content: center;
@ -236,10 +236,10 @@
}
}
.book-select {
left: 6px;
// left: 6px;
.icon-wancheng {
display: none;
color: #0348F3;
color: #fff;
}
.icon-weixuan {
color: #fff;
@ -248,7 +248,7 @@
}
.book-delete {
right: 3px;
// right: 3px;
.icon-shanchu {
font-size: 16px;
color: #ED4A41;
@ -271,9 +271,32 @@
}
&.book-list-item--selected {
background:rgba(0,0,0,0.5);
border-color: #ED4A41;
box-shadow: 0 2px 12px rgba(3, 72, 243, 0.2);
position: relative;
// background:rgba(0,0,0,0.5);
// border-color: #ED4A41;
// box-shadow: 0 2px 12px rgba(3, 72, 243, 0.2);
.select-style{
position: relative;
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
.select-mask{
width: 100%;
height: 100%;
background:rgba(0,0,0,0.3);
}
.icon-wancheng{
position: absolute;
right: 10px;
top: 10px;
z-index: 9999;
color: #fff;
font-size: 26px;
}
}
}
}
.book-upload-btn{

9
src/views/components/upload.vue

@ -38,6 +38,10 @@ export default {
uploadType: {
type: String,
default: ''
},
limitNum: {
type: Number,
default: 0
}
},
data() {
@ -63,6 +67,11 @@ export default {
methods: {
//
async changeFile(e) {
if (this.limitNum && this.limitNum >= 3) {
this.$message({ message: '最多只可上传3张图片', type: 'error', offset: 8 })
return false
}
const file = e.target.files[0]
if (file && file.type.startsWith('image/')) {

51
src/views/digitalScreen/index.vue

@ -24,20 +24,24 @@
@click="handleTabClick(index)"
>
<img :src="require(`@/assets/images/screen/screen${item.id}.png`)" alt="">
<div class="screen-info">
<span>1920*1080</span>
<span>{{ index+1 }}</span>
</div>
<div class="screen-playOrPause">
<i :class="item.enabled ? 'el-icon-video-play' : 'el-icon-video-pause'" @click.stop="toggleScreenStatus(index)" />
</div>
<div class="screen-time">
<span v-if="!item.editing" class="time-readonly" @click="handleTimeClick($event)" @dblclick="handleEditClick($event, item)">
{{ item.time }}
</span>
<el-input v-else ref="timeInput" v-model="item.time" type="number" @blur="handleTimeBlur(item)" @keyup.enter="handleTimeBlur(item)" />
<span class="time-unit"></span>
<div class="screen-mask">
<div class="title-mask">{{ item.name }}</div>
<div class="screen-info">
<span>1920*1080</span>
<span>{{ index+1 }}</span>
</div>
<div class="screen-playOrPause">
<i :class="item.enabled ? 'el-icon-video-play' : 'el-icon-video-pause'" @click.stop="toggleScreenStatus(index)" />
</div>
<div class="screen-time">
<span v-if="!item.editing" class="time-readonly" @click="handleTimeClick($event)" @dblclick="handleEditClick($event, item)">
{{ item.time }}
</span>
<el-input v-else ref="timeInput" v-model="item.time" type="number" @blur="handleTimeBlur(item)" @keyup.enter="handleTimeBlur(item)" />
<span class="time-unit"></span>
</div>
</div>
</div>
<div class="screen-right-info">
@ -991,6 +995,25 @@ export default {
transition: all 0.3s ease; //
z-index: 2; //
.screen-mask{
position: relative;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
background:rgba(0,0,0,0.4);
.title-mask{
text-align: center;
font-weight: bold;
color: #fff;
letter-spacing: 3px;
}
}
&.active {
transform: translateY(-5px); //
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); //
@ -1010,7 +1033,7 @@ export default {
display: flex;
justify-content: space-between;
width: 100%;
padding: 4px 6px;
padding: 6px;
font-size: 12px;
color: #fff;
span{

18
src/views/digitalScreen/module/addBookDialog.vue

@ -28,7 +28,7 @@
<el-input v-model="form.explain" type="textarea" row="4" placeholder="请输入" style="width: 586px;" />
</el-form-item>
</div>
<UploadCover :label-name="labelName" :form="form" upload-type="book" @childCover="handleCover" />
<UploadCover ref="uploadCoverRefs" :label-name="labelName" :form="form" upload-type="book" @childCover="handleCover" />
</div>
<div v-if="form.imgPath" class="preview-cover">
<p>封面预览</p>
@ -56,7 +56,7 @@ export default {
return {
btnLoading: false,
addBookDialogVisible: false,
form: { id: null, name: null, author: null, isbn: null, callnos: null, publisherdate: null, publisher: null, imgPath: null, explain: null },
form: { id: null, name: null, author: null, isbn: null, callnos: null, publisherdate: null, publisher: null, imgPath: null, explain: null, libcode: null },
bookCover: null,
labelName: '图书封面',
rules: {
@ -80,7 +80,8 @@ export default {
},
computed: {
...mapGetters([
'baseApi'
'baseApi',
'user'
])
},
created() {
@ -98,15 +99,22 @@ export default {
},
handleClose() {
this.addBookDialogVisible = false
this.$refs['form'].resetFields()
this.$refs['form'].clearValidate()
this.$refs.uploadCoverRefs.fileNames = ''
this.form.imgPath = null
this.bookCover = null
},
handleComfired() {
this.$refs.form.validate((valid) => {
if (valid) {
this.addBookDialogVisible = false
console.log(this.form)
this.form.libcode = this.user.fonds.fondsNo
FetchEditScreenBookRecommend(this.form).then((res) => {
if (res.code !== 500) {
console.log('res', res)
if (res) {
this.$message({ message: '推荐图书新增成功', type: 'success', offset: 8 })
this.$emit('refresh')
} else {
this.$message({ message: res.message, type: 'error', offset: 8 })
}

10
src/views/digitalScreen/module/advSetting.vue

@ -33,7 +33,11 @@
:class="{ 'book-list-item--selected': book.selected }"
>
<div style="cursor: default;" @click.stop="toggleBookSelect(index)">
<img :src="book.url || require('@/assets/images/cover-bg.png')" alt="图书封面"></img>
<img :src="book.url || require('@/assets/images/cover-bg.png')" alt="图书封面">
<div v-if="book.selected" class="select-style">
<div class="select-mask" />
<i class="iconfont icon-wancheng" />
</div>
</div>
<!-- <span style="position: absolute; top: 0; left: 0;">{{ book.id }}</span> -->
<!-- <div class="book-select" @click.stop="toggleBookSelect(index)">
@ -219,7 +223,7 @@ export default {
const selectedCount = this.advImgList.filter(book => book.selected).length
if (selectedCount === 0) return
this.$confirm(`确定要删除选中的 ${selectedCount} 本图书吗?`, '提示', {
this.$confirm(`确定要删除选中的 ${selectedCount} 张宣传图片吗?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
@ -228,7 +232,7 @@ export default {
this.$nextTick(() => {
this.updateSwiper()
})
this.$message.success(`已成功删除 ${selectedCount} 本图书`)
this.$message.success(`已成功删除 ${selectedCount} 张宣传图片`)
})
},
//

241
src/views/digitalScreen/module/areaSetting.vue

@ -40,13 +40,25 @@
>
<el-table-column type="selection" align="center" width="55" />
<el-table-column prop="name" label="名称" width="150" />
<el-table-column prop="libCode" label="馆代码" width="100" />
<el-table-column prop="province" label="坐标" width="200" />
<el-table-column prop="number" label="宣传图片" width="80" />
<el-table-column prop="libcode" label="馆代码" width="100">
<template slot-scope="scope">
<span v-if="scope.row.branchType === 1|| scope.row.branchType === '1'">{{ scope.row.libcode }}</span>
<span v-else>{{ scope.row.tcId }}</span>
</template>
</el-table-column>
<el-table-column prop="mapX" label="坐标" width="200">
<template slot-scope="scope">
{{ scope.row.mapX }},{{ scope.row.mapY }}
</template>
</el-table-column>
<el-table-column prop="promotions" label="宣传图片" width="80">
<template slot-scope="scope">
{{ scope.row.promotions.length }}
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="100">
<template>
<!-- slot-scope="scope" -->
<el-button style="padding: 5px 6px !important;"><i class="iconfont icon-bianji" />编辑</el-button>
<template slot-scope="scope">
<el-button style="padding: 5px 6px !important;" @click="initForm('edit',scope.row)"><i class="iconfont icon-bianji" />编辑</el-button>
</template>
</el-table-column>
</el-table>
@ -64,7 +76,7 @@
</el-card>
<!-- @click="toDelete(crud.selections)" -->
<div style="display: flex; flex-direction: column; justify-content: flex-start; margin-left: 15px;">
<el-button size="mini" @click="libDialogVisible=true">
<el-button size="mini" @click="initForm('add')">
<i class="iconfont icon-xinzeng" />
新增
</el-button>
@ -106,58 +118,61 @@
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="90px">
<div style="width: 696px;">
<div>
<el-form-item label="名称" prop="title">
<el-input v-model="form.title" placeholder="请输入" style="width: 586px;" />
<el-form-item label="名称" prop="name">
<el-input v-model="form.name" placeholder="请输入" style="width: 586px;" />
</el-form-item>
</div>
<el-form-item label="类型" prop="type">
<el-radio-group v-model="form.type" aria-hidden="false">
<el-radio :label="1">总馆</el-radio>
<el-radio :label="2">分馆</el-radio>
<el-form-item label="类型" prop="branchType">
<el-radio-group v-model="form.branchType" aria-hidden="false" @change="changeBranchType">
<el-radio label="1">总馆</el-radio>
<el-radio label="2">分馆</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="馆代码" prop="libCode" style="margin-left: 30px; margin-right: 0 !important;">
<el-input v-model="form.libCode" placeholder="请输入" />
<el-form-item v-if="form.branchType === '1'" label="馆代码" prop="libcode" style="margin-left: 30px; margin-right: 0 !important;">
<el-input v-model="form.libcode" placeholder="请输入" />
</el-form-item>
<el-form-item v-else label="馆代码" prop="tcId" style="margin-left: 30px; margin-right: 0 !important;">
<el-input v-model="form.tcId" placeholder="请输入" />
</el-form-item>
<div>
<el-form-item label="面积" prop="areaNum">
<el-input v-model="form.areaNum" placeholder="请输入" style="width: 586px;">
<el-form-item label="面积" prop="occupationArea">
<el-input v-model="form.occupationArea" placeholder="请输入" style="width: 586px;">
<template slot="append">平方米</template>
</el-input>
</el-form-item>
</div>
<div>
<el-form-item label="地址" prop="place">
<el-input v-model="form.place" placeholder="请输入" style="width: 586px;" />
<el-form-item label="地址" prop="address">
<el-input v-model="form.address" placeholder="请输入" style="width: 586px;" />
</el-form-item>
</div>
<div class="location-item">
<el-form-item label="坐标" prop="location">
<el-input v-model="form.location.x" placeholder="请输入">
<el-input v-model="form.mapX" placeholder="请输入">
<template slot="prepend">X</template>
</el-input>
<el-input v-model="form.location.y" placeholder="请输入">
<el-input v-model="form.mapY" placeholder="请输入">
<template slot="prepend">Y</template>
</el-input>
</el-form-item>
</div>
<div>
<el-form-item label="简介" prop="remarks">
<el-input v-model="form.remarks" type="textarea" rows="4" placeholder="请输入" style="width: 586px;" />
<el-form-item label="简介" prop="explains">
<el-input v-model="form.explains" type="textarea" rows="4" placeholder="请输入" style="width: 586px;" />
</el-form-item>
</div>
<div>
<el-form-item label="宣传图片" prop="remarks">
<div style="display: flex; justify-content: flex-start;">
<div style="display: flex; justify-content: flex-start; flex-wrap: wrap;">
<div class="libImg-list">
<img v-for="(item,index) in libImgList" :key="index" :src="item.url" alt="">
</div>
<div class="upload-img-input">
<!-- @change="changeAiFile" -->
<input ref="fileInput" type="file" multiple>
<div class="upload-libImg"><i class="iconfont icon-shangchuan2" /><span>点击上传</span></div>
<div v-for="(item,index) in libImgList" :key="index" class="libImg-item">
<img :src="item.imgPath" alt="">
<i class="iconfont icon-shanchu" @click="handleDelete(index)" />
</div>
</div>
<UploadCover upload-type="other-digital" :limit-num="libImgList.length" @childCover="handleCover" />
</div>
<div style="font-size: 12px; color: #9098a4;">点击上传图片最多可上传 3 </div>
</el-form-item>
</div>
</div>
@ -173,12 +188,13 @@
</template>
<script>
import { FetchEditScreenSetting, FetchInitScreenBranch } from '@/api/digitalScreen/index'
import { FetchEditScreenSetting, FetchInitScreenBranch, FetchEditScreenBranch } from '@/api/digitalScreen/index'
import UploadCover from '@/views/components/upload.vue'
import { mapGetters } from 'vuex'
export default {
name: 'AreaSetting',
components: { },
components: { UploadCover },
props: {
mapData: {
type: String,
@ -203,32 +219,36 @@ export default {
link: 'https://datav.aliyun.com/portal/school/atlas/area_selector',
copied: false,
tableData: [
// { name: '', libCode: 'lib001', province: '114.133561,30.641408', number: '3' },
// { name: '1', libCode: 'lib001', province: '114.133561,30.641408', number: '3' }
// { name: '', libcode: 'lib001', province: '114.133561,30.641408', number: '3' },
// { name: '1', libcode: 'lib001', province: '114.133561,30.641408', number: '3' }
],
page: {
page: 1,
page: 0,
size: 10,
total: 0
},
libDialogVisible: false,
form: {
title: '',
type: 1,
libCode: '',
areaNum: '',
place: '',
location: { x: '', y: '' },
remarks: ''
name: '',
branchType: '1',
libcode: '',
occupationArea: '',
address: '',
mapX: '',
mapY: '',
explains: ''
},
rules: {
title: [
name: [
{ required: true, message: '名称不可为空', trigger: 'blur' }
],
type: [
branchType: [
{ required: true, message: '请选择类型', trigger: 'change' }
],
libCode: [
tcId: [
{ required: true, message: '馆代码不可为空', trigger: 'blur' }
],
libcode: [
{ required: true, message: '馆代码不可为空', trigger: 'blur' }
]
},
@ -241,7 +261,8 @@ export default {
},
computed: {
...mapGetters([
'baseApi'
'baseApi',
'user'
])
},
watch: {
@ -260,8 +281,20 @@ export default {
},
methods: {
initScreenBranch() {
FetchInitScreenBranch().then((res) => {
console.log('initScreenBranch', res)
const params = {
'libcode': this.user.fonds.fondsNo,
'page': this.page.page,
'size': this.page.size
}
FetchInitScreenBranch(params).then((res) => {
console.log('initScreenBranch', res.content)
if (res.content.length !== 0) {
this.tableData = res.content
this.page.total = res.totalElements
} else {
this.tableData = []
this.page.total = 0
}
}).catch(err => {
console.log(err)
})
@ -307,13 +340,94 @@ export default {
this.$message.error('GeoJSON更新失败')
})
},
handleCover(value) {
if (value) {
const imgUrl = this.baseApi + '/api/fileRelevant/getImg?imgType=1&imgId=' + value
this.libImgList.push({ imgPath: imgUrl })
} else {
this.libImgList = []
}
},
initForm(type, branchData) {
if (type === 'add') {
if (this.form.branchType === '1') {
this.form.name = this.user.fonds.fondsName
this.form.libcode = this.user.fonds.fondsNo
} else {
this.form.name = ''
this.form.libcode = ''
}
} else {
console.log('branchData', branchData)
this.form = branchData
this.form.branchType = branchData.branchType === 1 || branchData.branchType === '1' ? '1' : '2'
this.libImgList = branchData.promotions
console.log(this.form)
}
this.libDialogVisible = true
},
changeBranchType(val) {
if (val === '1') {
this.form.name = this.user.fonds.fondsName
this.form.libcode = this.user.fonds.fondsNo
} else {
this.form.name = ''
this.form.libcode = ''
}
},
handleDelete(index) {
this.libImgList.splice(index, 1)
},
handleComfired() {
this.$refs.form.validate((valid) => {
if (valid) {
if (this.libImgList.length !== 0) {
this.form.promotions = this.libImgList
}
if (this.form.branchType === '2') {
this.form.libcode = this.user.fonds.fondsNo
}
console.log('FetchEditScreenBranch', this.form)
FetchEditScreenBranch(this.form).then((res) => {
console.log('res', res)
if (res.code !== 500) {
this.$message({ message: '新增成功', type: 'success', offset: 8 })
this.initScreenBranch()
} else {
this.$message({ message: res.message, type: 'error', offset: 8 })
}
this.handleClose()
}).catch(err => {
console.log(err)
this.addBookDialogVisible = false
})
} else {
console.log('error submit!!')
return false
}
})
},
handleClose() {
this.geoJsonVisible = false
this.libDialogVisible = false
this.$refs['form'].resetFields()
this.$refs['form'].clearValidate()
this.form = {
name: '', branchType: '1', libcode: '', occupationArea: '', address: '', mapX: '', mapY: '', explains: ''
}
this.libImgList = []
},
handleSizeChange(size) {
this.page.size = size
this.page.page = 1
this.initScreenBranch()
},
handleCurrentPage(val) {
this.page.page = val
this.initScreenBranch()
},
copyLink() {
//
navigator.clipboard.writeText(this.link)
.then(() => {
this.copied = true
@ -324,11 +438,9 @@ export default {
})
.catch(err => {
console.error('无法复制内容: ', err)
// clipboard API
this.fallbackCopyText()
})
},
// Clipboard API
fallbackCopyText() {
const textArea = document.createElement('textarea')
textArea.value = this.link
@ -350,16 +462,6 @@ export default {
}
document.body.removeChild(textArea)
},
handleSizeChange(size) {
this.page.size = size
this.page.page = 1
},
handleCurrentPage(val) {
this.page.page = val
},
handleComfired() {
}
}
}
@ -435,10 +537,23 @@ export default {
.libImg-list{
display: flex;
justify-content: flex-start;
img{
display: block;
width: 600px;
margin-bottom: 10px;
.libImg-item{
position: relative;
height: 120px;
margin-right: 10px;
img{
display: block;
height: 100%;
}
i{
position: absolute;
left: 4px;
top: 0;
color: red;
cursor: pointer;
}
}
}

86
src/views/digitalScreen/module/bookRecommend.vue

@ -14,14 +14,16 @@
:key="book.id"
class="book-list-item"
>
<img :src="book.url || require('@/assets/images/screen/book.jpg')" alt="图书封面">
<span style="position: absolute; top: 0; left: 0;">{{ book.id }}</span>
<div class="book-select" @click.stop="toggleBookSelect(index)">
<i v-if="book.selected" class="iconfont icon-wancheng" />
<i v-else class="iconfont icon-weixuan" />
</div>
<div class="book-delete" @click.stop="deleteBook(index)">
<i class="iconfont icon-shanchu" />
<img :src="book.imgPath ? (baseApi + '/api/fileRelevant/getImg?imgType=2&imgId=' + book.imgPath) : require('@/assets/images/screen/book.png')" alt="图书封面">
<!-- <span style="position: absolute; top: 0; left: 0; color: #fff;">{{ book.id }}</span> -->
<div style="position: relative; position: absolute; left: 0; bottom: 0; width: calc(100% - 15px); display: flex; justify-content: space-between; padding: 0 5px 0 10px; background: rgba(0,0,0,.5);">
<div class="book-select" @click.stop="toggleBookSelect(index)">
<i v-if="book.selected" class="iconfont icon-wancheng" />
<i v-else class="iconfont icon-weixuan" />
</div>
<div class="book-delete" @click.stop="deleteBook(index)">
<i class="iconfont icon-shanchu" />
</div>
</div>
</swiper-slide>
</swiper>
@ -35,7 +37,7 @@
批量删除
</el-button>
</div>
<addBookDialog ref="addBookRef" />
<addBookDialog ref="addBookRef" @refresh="updateBookItem" />
</div>
</template>
@ -97,7 +99,8 @@ export default {
},
computed: {
...mapGetters([
'baseApi'
'baseApi',
'user'
]),
hasSelectedItems() {
return this.bookList.some(book => book.selected)
@ -110,8 +113,17 @@ export default {
},
methods: {
initScreenBookRecommend() {
FetchInitScreenBookRecommend().then((res) => {
const param = {
'libcode': this.user.fonds.fondsNo
}
FetchInitScreenBookRecommend(param).then((res) => {
console.log('BookRecommend', res)
const newRes = res.map(item => ({
...item,
selected: false
}))
this.bookList = newRes
}).catch(err => {
console.log(err)
})
@ -130,35 +142,19 @@ export default {
toggleBookSelect(index) {
this.bookList[index].selected = !this.bookList[index].selected
},
deleteBook(index) {
this.$confirm('确定要删除这本图书吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
dangerouslyUseHTMLString: true
}).then(() => {
this.bookList.splice(index, 1)
this.$nextTick(() => {
this.$refs.bookSwiper.swiper.update()
})
this.$message.success('删除成功!')
}).catch(() => {
//
})
},
uploadBook() {
this.$refs.addBookRef.addBookDialogVisible = true
},
updateBookItem(data) {
this.bookList.unshift({
...data,
selected: false
})
// const newBookId = Date.now()
// this.bookList.unshift({
// id: newBookId,
// url: require('@/assets/images/screen/book.jpg'),
// selected: false
// })
// this.$nextTick(() => {
// this.$refs.bookSwiper.swiper.update()
// this.$refs.bookSwiper.swiper.slideTo(0, 300)
// })
this.$nextTick(() => {
this.$refs.bookSwiper.swiper.update()
this.$refs.bookSwiper.swiper.slideTo(0, 300)
})
},
batchDelete() {
const selectedCount = this.bookList.filter(book => book.selected).length
@ -175,6 +171,22 @@ export default {
})
this.$message.success(`已成功删除 ${selectedCount} 本图书`)
})
},
deleteBook(index) {
this.$confirm('确定要删除这本图书吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
dangerouslyUseHTMLString: true
}).then(() => {
this.bookList.splice(index, 1)
this.$nextTick(() => {
this.$refs.bookSwiper.swiper.update()
})
this.$message.success('删除成功!')
}).catch(() => {
//
})
}
}
}

23
src/views/system/menu/index.vue

@ -150,7 +150,7 @@
</el-table-column>
<el-table-column prop="createTime" label="创建日期" width="200px">
<template slot-scope="scope">
<div>{{ scope.row.createTime | parseTime }}</div>
<div>{{ formatDateTimePadded(scope.row.createTime) }}</div>
</template>
</el-table-column>
</el-table>
@ -217,6 +217,27 @@ export default {
}
},
methods: {
formatDateTimePadded(timeArray) {
if (!Array.isArray(timeArray) || timeArray.length !== 6) {
return '无效时间'
}
const [year, month, day, hour, minute, second] = timeArray
const date = new Date(year, month - 1, day, hour, minute, second)
if (isNaN(date.getTime())) {
return '无效时间'
}
//
const paddedMonth = String(date.getMonth() + 1).padStart(2, '0')
const paddedDay = String(date.getDate()).padStart(2, '0')
const paddedHour = String(date.getHours()).padStart(2, '0')
const paddedMinute = String(date.getMinutes()).padStart(2, '0')
const paddedSecond = String(date.getSeconds()).padStart(2, '0')
return `${date.getFullYear()}-${paddedMonth}-${paddedDay} ${paddedHour}:${paddedMinute}:${paddedSecond}`
},
changePid() {
this.$refs.form.validateField('pid')
},

23
src/views/system/role/index.vue

@ -53,7 +53,7 @@
</el-table-column>
<el-table-column :show-overflow-tooltip="true" prop="createTime" label="创建日期">
<template slot-scope="scope">
<div>{{ scope.row.createTime | parseTime }}</div>
<div>{{ formatDateTimePadded(scope.row.createTime) }}</div>
</template>
</el-table-column>
</el-table>
@ -157,6 +157,27 @@ export default {
mounted() {
},
methods: {
formatDateTimePadded(timeArray) {
if (!Array.isArray(timeArray) || timeArray.length !== 6) {
return '无效时间'
}
const [year, month, day, hour, minute, second] = timeArray
const date = new Date(year, month - 1, day, hour, minute, second)
if (isNaN(date.getTime())) {
return '无效时间'
}
//
const paddedMonth = String(date.getMonth() + 1).padStart(2, '0')
const paddedDay = String(date.getDate()).padStart(2, '0')
const paddedHour = String(date.getHours()).padStart(2, '0')
const paddedMinute = String(date.getMinutes()).padStart(2, '0')
const paddedSecond = String(date.getSeconds()).padStart(2, '0')
return `${date.getFullYear()}-${paddedMonth}-${paddedDay} ${paddedHour}:${paddedMinute}:${paddedSecond}`
},
getMenuDatas(node, resolve) {
setTimeout(() => {
getMenusTree(node.data.id ? node.data.id : 0).then(res => {

Loading…
Cancel
Save