|
|
@@ -160,10 +160,19 @@
|
|
|
<div id="tab4" class="conten_box">
|
|
|
<div class="title">文物</div>
|
|
|
<div class="imgBox">
|
|
|
- <div>
|
|
|
- <img src="@/assets/img/logo22.png" alt="" />1234567891111111111111
|
|
|
+ <div
|
|
|
+ v-for="(item, index) in saveAntiqueArr"
|
|
|
+ :key="index"
|
|
|
+ @mouseenter="moveShowIdn = index"
|
|
|
+ @mouseleave="moveShowIdn = null"
|
|
|
+ >
|
|
|
+ <img :src="baseURL + item.url" alt="" />{{ item.name }}
|
|
|
+ <!-- 鼠标移上去显示的盒子 -->
|
|
|
+ <div class="moveShow" v-show="moveShowIdn === index">
|
|
|
+ <i class="el-icon-edit" @click="outEditAntique(item.id)"></i>
|
|
|
+ <i class="el-icon-delete" @click="outDelAntique(index)"></i>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- <div><img src="@/assets/img/logo22.png" alt="" />12345678</div>
|
|
|
<!-- 点击文物+号新增文物 -->
|
|
|
<div class="uploaImg" @click="addAntique">+</div>
|
|
|
</div>
|
|
|
@@ -175,8 +184,8 @@
|
|
|
<div class="edit">保 存</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <!-- 点击文物的+号出现弹出层 -->
|
|
|
- <el-dialog title="添加文物" :visible.sync="addIsShow">
|
|
|
+ <!-- 点击 文物 的+号出现弹出层 -->
|
|
|
+ <el-dialog :title="addForm.id?'编辑文物':'添加文物'" :visible.sync="addIsShow">
|
|
|
<el-form
|
|
|
:model="addForm"
|
|
|
:rules="addRules"
|
|
|
@@ -208,70 +217,74 @@
|
|
|
></el-option>
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="文物图片:">
|
|
|
- <el-upload
|
|
|
- :action="baseURL + '/cms/goods/upload'"
|
|
|
- :headers="{token}"
|
|
|
- list-type="picture-card"
|
|
|
- :auto-upload="false"
|
|
|
- :before-upload="beforethumbUpload"
|
|
|
- :on-success="upload_thumb_success"
|
|
|
- >
|
|
|
- <i slot="default" class="el-icon-plus"></i>
|
|
|
- <div slot="file" slot-scope="{ file }" class="myttttttttt">
|
|
|
- <!-- 底部的设为封面按钮 -->
|
|
|
- <div class="fengmian">设为封面</div>
|
|
|
+ <el-form-item label="文物图片:" class="myImgBox">
|
|
|
+ <div class="upImgBox">
|
|
|
+ <div
|
|
|
+ class="imgdiv"
|
|
|
+ :class="{ active: fengmianInd === index }"
|
|
|
+ v-for="(item, index) in imgList"
|
|
|
+ :key="index"
|
|
|
+ @mouseenter="imgIconInd = index"
|
|
|
+ @mouseleave="imgIconInd = null"
|
|
|
+ >
|
|
|
<img
|
|
|
- class="el-upload-list__item-thumbnail"
|
|
|
- :src="file.url"
|
|
|
- alt=""
|
|
|
+ style="width: 100%; height: 100%"
|
|
|
+ :src="baseURL + item.url"
|
|
|
/>
|
|
|
- <span class="el-upload-list__item-actions">
|
|
|
- <span
|
|
|
- class="el-upload-list__item-preview"
|
|
|
- @click="handlePictureCardPreview(file)"
|
|
|
- >
|
|
|
- <i class="el-icon-zoom-in"></i>
|
|
|
- </span>
|
|
|
+ <div class="imgIcon" v-show="index === imgIconInd">
|
|
|
+ <i class="el-icon-zoom-in" @click="lookImg(item.url)"></i>
|
|
|
+ <a :href="baseURL + item.url" target="_blank" download
|
|
|
+ ><i class="el-icon-download"></i
|
|
|
+ ></a>
|
|
|
+ <i class="el-icon-delete" @click="delImg(index)"></i>
|
|
|
<span
|
|
|
- v-if="!disabled"
|
|
|
- class="el-upload-list__item-delete"
|
|
|
- @click="handleDownload(file)"
|
|
|
+ @click="modelSetIndex(item.id, index, item.url)"
|
|
|
+ v-if="fengmianInd !== index"
|
|
|
+ >设置封面</span
|
|
|
>
|
|
|
- <i class="el-icon-download"></i>
|
|
|
- </span>
|
|
|
- <span
|
|
|
- v-if="!disabled"
|
|
|
- class="el-upload-list__item-delete"
|
|
|
- @click="handleRemoveImg(file)"
|
|
|
- >
|
|
|
- <i class="el-icon-delete"></i>
|
|
|
- </span>
|
|
|
- </span>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- <div class="el-upload__tip" slot="tip">
|
|
|
- 支持png / jpg / gif / jpeg的图片格式,最大支持20M。
|
|
|
+ </div>
|
|
|
+ <el-upload
|
|
|
+ drag
|
|
|
+ class="avatar-uploader"
|
|
|
+ :action="baseURL + '/cms/goods/upload'"
|
|
|
+ :headers="{ token }"
|
|
|
+ :show-file-list="false"
|
|
|
+ :before-upload="beforethumbUpload"
|
|
|
+ :on-success="upload_thumb_success"
|
|
|
+ >
|
|
|
+ <div class="upImg">
|
|
|
+ <i slot="default" class="el-icon-plus"></i>
|
|
|
</div>
|
|
|
</el-upload>
|
|
|
- <div class="lookImg" v-if="dialogVisible">
|
|
|
- <img :src="dialogImageUrl" alt="" />
|
|
|
- <div class="imgBtnX" @click="dialogVisible = false">关 闭</div>
|
|
|
- </div>
|
|
|
- <!-- <el-dialog :visible.sync="dialogVisible" class="lookImg">
|
|
|
- </el-dialog> -->
|
|
|
</el-form-item>
|
|
|
+ <span style="margin-left: 100px"
|
|
|
+ >支持png / jpg / gif / jpeg的图片格式,最大支持20M。</span
|
|
|
+ >
|
|
|
</el-form>
|
|
|
|
|
|
<div slot="footer" class="dialog-footer">
|
|
|
- <el-button @click="addIsShow = false">取 消</el-button>
|
|
|
- <el-button type="primary" @click="addIsShow = false">保 存</el-button>
|
|
|
+ <el-button @click="addBtnX">取 消</el-button>
|
|
|
+ <el-button type="primary" @click="addBtnOk">保 存</el-button>
|
|
|
</div>
|
|
|
</el-dialog>
|
|
|
+ <!-- 点击查看图片 -->
|
|
|
+ <div class="lookImg" v-if="dialogImageIshow">
|
|
|
+ <img :src="baseURL + dialogImageUrl" alt="" />
|
|
|
+ <div class="imgBtnX" @click="dialogImageIshow = false">关 闭</div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
-import { getProjectType, getGoodsType } from '@/apis/tab1'
|
|
|
+import {
|
|
|
+ getProjectType,
|
|
|
+ getGoodsType,
|
|
|
+ modelSetIndex,
|
|
|
+ modelSave,
|
|
|
+ getAntiqueById
|
|
|
+} from '@/apis/tab1'
|
|
|
import axios from '@/utils/request'
|
|
|
export default {
|
|
|
// import引入的组件需要注入到对象中才能使用
|
|
|
@@ -280,14 +293,19 @@ export default {
|
|
|
data () {
|
|
|
// 这里存放数据
|
|
|
return {
|
|
|
+ fengmianInd: 0,
|
|
|
+ imgIconInd: null,
|
|
|
+ imgList: [],
|
|
|
dialogImageUrl: '',
|
|
|
- dialogVisible: false,
|
|
|
- disabled: false,
|
|
|
+ dialogImageIshow: false,
|
|
|
addIsShow: false,
|
|
|
addForm: {
|
|
|
- name: '',
|
|
|
- url: '',
|
|
|
- goodsTypeId: null
|
|
|
+ fileIds: '', // 图片id, 多个以逗号隔开
|
|
|
+ name: '', // 名称
|
|
|
+ url: '', // 链接
|
|
|
+ goodsTypeId: null, // 文物类型id
|
|
|
+ // projectId: '', // 项目id
|
|
|
+ thumb: '' // 封面
|
|
|
},
|
|
|
addRules: {
|
|
|
name: { required: true, message: '不能为空', trigger: 'blur' },
|
|
|
@@ -295,7 +313,9 @@ export default {
|
|
|
},
|
|
|
// 文物类别数组
|
|
|
antiqueArr: [],
|
|
|
- // 文物弹窗数据↑
|
|
|
+ // 点击保存后的文物数组
|
|
|
+ saveAntiqueArr: [],
|
|
|
+ // 文物弹窗数据↑↑↑↑↑↑↑↑↑↑↑↑
|
|
|
projectId: 'SWKK',
|
|
|
// 服务器前缀地址
|
|
|
baseURL: '',
|
|
|
@@ -333,7 +353,9 @@ export default {
|
|
|
projectType: [],
|
|
|
rules: {
|
|
|
name: { required: true, message: '请输入项目名称', trigger: 'blur' }
|
|
|
- }
|
|
|
+ },
|
|
|
+ // 外层的文物数据
|
|
|
+ moveShowIdn: null
|
|
|
}
|
|
|
},
|
|
|
// 监听属性 类似于data概念
|
|
|
@@ -346,8 +368,10 @@ export default {
|
|
|
async addAntique () {
|
|
|
const res = await getGoodsType()
|
|
|
this.antiqueArr = res.data
|
|
|
- this.antiqueArr.unshift({ id: '', name: '请选择' })
|
|
|
+ this.antiqueArr.unshift({ id: '', name: '' })
|
|
|
this.addIsShow = true
|
|
|
+ // 把封面默认变成第一个
|
|
|
+ this.fengmianInd = 0
|
|
|
},
|
|
|
// 上面的tab栏切换
|
|
|
tabCut (index) {
|
|
|
@@ -389,6 +413,38 @@ export default {
|
|
|
this.$message.info('已取消删除!')
|
|
|
})
|
|
|
},
|
|
|
+ // -------------点击外层文物-------------------
|
|
|
+ // 编辑
|
|
|
+ async outEditAntique (id) {
|
|
|
+ const res = await getAntiqueById(id)
|
|
|
+ // console.log(999, res)
|
|
|
+ this.addForm = res.data.entity
|
|
|
+ res.data.file.forEach((v, i) => {
|
|
|
+ this.imgList.push({
|
|
|
+ url: v.filePath,
|
|
|
+ name: v.name,
|
|
|
+ id: v.id
|
|
|
+ })
|
|
|
+ // index为1的是首页图片
|
|
|
+ if (v.isIndex === 1) this.fengmianInd = i
|
|
|
+ })
|
|
|
+ this.addIsShow = true
|
|
|
+ },
|
|
|
+ // 删除
|
|
|
+ outDelAntique (index) {
|
|
|
+ this.$confirm('确定删除吗?', '提示', {
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning'
|
|
|
+ })
|
|
|
+ .then(() => {
|
|
|
+ this.saveAntiqueArr.splice(index, 1)
|
|
|
+ this.$message.success('删除成功!')
|
|
|
+ })
|
|
|
+ .catch(() => {
|
|
|
+ this.$message.info('已取消删除')
|
|
|
+ })
|
|
|
+ },
|
|
|
// --------------附件--------------
|
|
|
successFujian (file) {
|
|
|
console.log('上传附件成功', file)
|
|
|
@@ -396,12 +452,15 @@ export default {
|
|
|
handleRemove (file) {
|
|
|
console.log('删除附件成功', file)
|
|
|
},
|
|
|
- // ----------------文物弹窗里面的图片---------------
|
|
|
+ // ----------------文物弹窗里面---------------
|
|
|
beforethumbUpload (file) {
|
|
|
- console.log('上传文件前校验', file)
|
|
|
+ // console.log('上传文件前校验', file)
|
|
|
// 限制图片大小和格式
|
|
|
const sizeOk = file.size / 1024 / 1024 < 20
|
|
|
- const typeOk = file.type === 'image/png' || file.type === 'image/jpeg'
|
|
|
+ const typeOk =
|
|
|
+ file.type === 'image/png' ||
|
|
|
+ file.type === 'image/jpeg' ||
|
|
|
+ file.type === 'image/gif'
|
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
if (!typeOk) {
|
|
|
@@ -411,27 +470,96 @@ export default {
|
|
|
this.$message.error('照片大小超过20M!')
|
|
|
reject(file)
|
|
|
} else {
|
|
|
- this.$message.success('上传成功')
|
|
|
resolve(file)
|
|
|
}
|
|
|
})
|
|
|
},
|
|
|
upload_thumb_success (data) {
|
|
|
- console.log('上传文件成功', data)
|
|
|
+ this.$message.success('上传成功')
|
|
|
+ // console.log('上传文件成功', data)
|
|
|
+ this.imgList.push({
|
|
|
+ url: data.data.filePath,
|
|
|
+ name: data.data.fileName,
|
|
|
+ id: data.data.fileId
|
|
|
+ })
|
|
|
+ // 把第一张的url设置为封面---如果是新增
|
|
|
+ if (!this.addForm.id) this.addForm.thumb = this.imgList[0].url
|
|
|
// this.loading = false
|
|
|
// this.ruleForm.thumb = data.data.filePath
|
|
|
},
|
|
|
- handleRemoveImg (file) {
|
|
|
+ delImg (index) {
|
|
|
// 点击删除
|
|
|
- console.log(file)
|
|
|
+ this.$confirm('确定删除吗?', '提示', {
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning'
|
|
|
+ })
|
|
|
+ .then(() => {
|
|
|
+ this.imgList.splice(index, 1)
|
|
|
+ this.$message.success('删除成功!')
|
|
|
+ })
|
|
|
+ .catch(() => {
|
|
|
+ this.$message.info('已取消删除')
|
|
|
+ })
|
|
|
+ },
|
|
|
+ // 点击放大镜,查看图片
|
|
|
+ lookImg (url) {
|
|
|
+ this.dialogImageUrl = url
|
|
|
+ this.dialogImageIshow = true
|
|
|
+ },
|
|
|
+ // 点击设置为封面
|
|
|
+ async modelSetIndex (id, index, url) {
|
|
|
+ const res = await modelSetIndex(id)
|
|
|
+ if (res.code === 0) {
|
|
|
+ this.fengmianInd = index
|
|
|
+ this.$message.success('设置封面成功')
|
|
|
+ this.addForm.thumb = url
|
|
|
+ }
|
|
|
},
|
|
|
- handlePictureCardPreview (file) {
|
|
|
- this.dialogImageUrl = file.url
|
|
|
- this.dialogVisible = true
|
|
|
+ // 点击弹窗里面的保存
|
|
|
+ async addBtnOk () {
|
|
|
+ if (this.addForm.name.trim() === '') { return this.$message.warning('文物名称不能为空') }
|
|
|
+ if (this.addForm.url.trim() === '') { return this.$message.warning('文物链接不能为空') }
|
|
|
+ const temp = []
|
|
|
+ this.imgList.forEach((v) => {
|
|
|
+ temp.push(v.id)
|
|
|
+ })
|
|
|
+ this.addForm.fileIds = temp.join(',')
|
|
|
+ // console.log(999, this.addForm)
|
|
|
+ const res = await modelSave(this.addForm)
|
|
|
+ if (res.code === 0) {
|
|
|
+ if (!this.addForm.id) { // 新增的push进去
|
|
|
+ this.saveAntiqueArr.push({
|
|
|
+ id: res.data.id,
|
|
|
+ name: res.data.name,
|
|
|
+ url: res.data.thumb
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ // 修改的改变之前的数组
|
|
|
+ this.saveAntiqueArr.forEach(v => {
|
|
|
+ if (v.id === this.addForm.id) {
|
|
|
+ v.name = res.data.name
|
|
|
+ v.url = res.data.thumb
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ this.$message.success('保存成功')
|
|
|
+ this.addBtnX()
|
|
|
+ }
|
|
|
+ // console.log(999, res)
|
|
|
},
|
|
|
- handleDownload (file) {
|
|
|
- // 点击下载
|
|
|
- console.log(file)
|
|
|
+ // 点击弹窗里面的取消
|
|
|
+ addBtnX () {
|
|
|
+ this.addForm = {
|
|
|
+ fileIds: '', // 图片id, 多个以逗号隔开
|
|
|
+ name: '', // 名称
|
|
|
+ url: '', // 链接
|
|
|
+ goodsTypeId: null, // 文物类型id
|
|
|
+ // projectId: '', // 项目id
|
|
|
+ thumb: '' // 封面
|
|
|
+ }
|
|
|
+ this.imgList = []
|
|
|
+ this.addIsShow = false
|
|
|
}
|
|
|
},
|
|
|
// 生命周期 - 创建完成(可以访问当前this实例)
|
|
|
@@ -465,7 +593,7 @@ export default {
|
|
|
width: 100vw;
|
|
|
height: 100vh;
|
|
|
position: fixed;
|
|
|
- z-index: 999;
|
|
|
+ z-index: 9999;
|
|
|
background-color: rgba(0, 0, 0, 0.7);
|
|
|
img {
|
|
|
max-width: 80vw;
|
|
|
@@ -474,6 +602,7 @@ export default {
|
|
|
.imgBtnX {
|
|
|
cursor: pointer;
|
|
|
width: 100px;
|
|
|
+ height: 30px;
|
|
|
position: absolute;
|
|
|
left: 50%;
|
|
|
bottom: 20px;
|
|
|
@@ -485,34 +614,81 @@ export default {
|
|
|
align-items: center;
|
|
|
}
|
|
|
}
|
|
|
-/deep/.el-upload-list--picture-card .el-upload-list__item-thumbnail {
|
|
|
- width: 146px;
|
|
|
- height: 146px;
|
|
|
- object-fit: contain;
|
|
|
-}
|
|
|
-/deep/.el-upload-list--picture-card .el-upload-list__item {
|
|
|
- overflow: visible;
|
|
|
+.myImgBox {
|
|
|
+ /deep/.el-form-item__content {
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ }
|
|
|
+ /deep/.el-upload-dragger {
|
|
|
+ width: 135px;
|
|
|
+ height: 135px;
|
|
|
+ border: 1px solid #ccc;
|
|
|
+ }
|
|
|
}
|
|
|
-/deep/.el-upload-list--picture-card {
|
|
|
+.upImgBox {
|
|
|
display: flex;
|
|
|
- margin-bottom: 40px;
|
|
|
+ .active {
|
|
|
+ border: 2px solid #dc3545;
|
|
|
+ }
|
|
|
}
|
|
|
-.myttttttttt {
|
|
|
- .fengmian {
|
|
|
- border-radius: 8px;
|
|
|
- display: flex;
|
|
|
- justify-content: center;
|
|
|
+.imgdiv {
|
|
|
+ position: relative;
|
|
|
+ margin: 0 10px 10px 0;
|
|
|
+ border: 1px solid #ccc;
|
|
|
+ width: 135px;
|
|
|
+ height: 135px;
|
|
|
+ & > img {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ object-fit: contain;
|
|
|
+ }
|
|
|
+ .imgIcon {
|
|
|
+ justify-content: space-around;
|
|
|
align-items: center;
|
|
|
- cursor: pointer;
|
|
|
- z-index: 999;
|
|
|
+ display: flex;
|
|
|
position: absolute;
|
|
|
- left: 50%;
|
|
|
- transform: translateX(-50%);
|
|
|
- bottom: -35px;
|
|
|
- background-color: #dc3545;
|
|
|
- width: 100px;
|
|
|
- height: 30px;
|
|
|
- color: #fff;
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ left: 0;
|
|
|
+ top: 0;
|
|
|
+ background-color: rgba(0, 0, 0, 0.6);
|
|
|
+ i {
|
|
|
+ color: #fff;
|
|
|
+ font-size: 24px;
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
+ a {
|
|
|
+ i {
|
|
|
+ margin-top: 10px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ i:hover {
|
|
|
+
|
|
|
+ color: #dc3545;
|
|
|
+ }
|
|
|
+ & > span {
|
|
|
+ cursor: pointer;
|
|
|
+ color: #fff;
|
|
|
+ position: absolute;
|
|
|
+ bottom: 0px;
|
|
|
+ left: 50%;
|
|
|
+ transform: translateX(-50%);
|
|
|
+ }
|
|
|
+ & > span:hover {
|
|
|
+ color: #dc3545;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.upImg {
|
|
|
+ width: 135px;
|
|
|
+ height: 135px;
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ & > i {
|
|
|
+ font-size: 50px;
|
|
|
+ color: #ccc;
|
|
|
}
|
|
|
}
|
|
|
/deep/.el-select {
|
|
|
@@ -557,16 +733,22 @@ export default {
|
|
|
li {
|
|
|
padding-bottom: 5px;
|
|
|
cursor: pointer;
|
|
|
- color: #666;
|
|
|
margin-right: 100px;
|
|
|
+ a {
|
|
|
+ color: #666;
|
|
|
+ }
|
|
|
}
|
|
|
li:hover {
|
|
|
- color: black;
|
|
|
border-bottom: 2px solid #dc3545;
|
|
|
+ a {
|
|
|
+ color: black;
|
|
|
+ }
|
|
|
}
|
|
|
.active {
|
|
|
- color: black;
|
|
|
border-bottom: 2px solid #dc3545;
|
|
|
+ a {
|
|
|
+ color: black;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -620,22 +802,51 @@ export default {
|
|
|
display: flex;
|
|
|
flex-wrap: wrap;
|
|
|
& > div {
|
|
|
- cursor: pointer;
|
|
|
+ // cursor: pointer;
|
|
|
+ position: relative;
|
|
|
word-wrap: break-word;
|
|
|
text-align: center;
|
|
|
width: 120px;
|
|
|
margin: 20px 0 0 10px;
|
|
|
+ border: 1px solid #ccc;
|
|
|
+ box-shadow: 1px 1px 3px 0px;
|
|
|
+ .moveShow {
|
|
|
+ position: absolute;
|
|
|
+ left: 0;
|
|
|
+ top: 0;
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ background-color: rgba(0, 0, 0, 0.7);
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-around;
|
|
|
+ align-items: center;
|
|
|
+ & > i {
|
|
|
+ cursor: pointer;
|
|
|
+ color: #fff;
|
|
|
+ font-size: 24px;
|
|
|
+ }
|
|
|
+ & > i:hover {
|
|
|
+ color: #dc3545;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
img {
|
|
|
+ padding-top: 8px;
|
|
|
width: 100px;
|
|
|
height: 75px;
|
|
|
+ display: block;
|
|
|
+ margin: 0 auto;
|
|
|
object-fit: contain;
|
|
|
}
|
|
|
.uploaImg {
|
|
|
+ cursor: pointer;
|
|
|
color: #ccc;
|
|
|
border: 1px solid #ccc;
|
|
|
font-size: 80px;
|
|
|
font-weight: 700;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
}
|
|
|
}
|
|
|
}
|