master
yujialong 2 years ago
parent 8dd8cdde96
commit 7394964cb5
  1. 5
      src/api/index.js
  2. BIN
      src/assets/img/article1.png
  3. BIN
      src/assets/img/article2.png
  4. BIN
      src/assets/img/article3.png
  5. BIN
      src/assets/img/list1.png
  6. BIN
      src/assets/img/list2.png
  7. BIN
      src/assets/img/plus.png
  8. BIN
      src/assets/img/style1.png
  9. BIN
      src/assets/img/style2.png
  10. 31
      src/layouts/navbar/index.vue
  11. 137
      src/pages/annex/list/index.vue
  12. 298
      src/pages/article/add/index.vue
  13. 89
      src/pages/article/list/index.vue
  14. 312
      src/pages/column/add/index.vue
  15. 159
      src/pages/column/list/index.vue
  16. 84
      src/pages/page/list/index.vue
  17. 35
      src/pages/site/list/index.vue
  18. 2
      src/plugins/requests/index.js
  19. 23
      src/router/modules/annex.js
  20. 17
      src/store/modules/content.js
  21. 10
      src/store/modules/user.js
  22. 128
      src/styles/common.scss

@ -1,11 +1,13 @@
import Setting from "@/setting"; import Setting from "@/setting";
const host = Setting.apiBaseURL const host = Setting.apiBaseURL
const uploadURL = Setting.upload.apiURL;
const host1 = 'http://192.168.31.151:10000/' const host1 = 'http://192.168.31.151:10000/'
export default { export default {
logins: `iasf/sys/user/login`, logins: `iasf/sys/user/login`,
verification: `${host}iasf/sys/getVerify`, verification: `${host}iasf/sys/getVerify`,
upload: `${host}iasf/sysFiles/upload`,
listByPage: `${host}iasf/sysFiles/listByPage`,
delFile: `${host}iasf/sysFiles/delete`,
dept: `iasf/sys/dept`, dept: `iasf/sys/dept`,
deptTree: `iasf/sys/dept/tree`, deptTree: `iasf/sys/dept/tree`,
deptId: `iasf/sys/dept`, deptId: `iasf/sys/dept`,
@ -22,4 +24,5 @@ export default {
queryArticle: `${host1}iasf/sysContent/pagingQuery`, queryArticle: `${host1}iasf/sysContent/pagingQuery`,
saveArticle: `${host1}iasf/sysContent/save`, saveArticle: `${host1}iasf/sysContent/save`,
updateArticle: `${host1}iasf/sysContent/update`, updateArticle: `${host1}iasf/sysContent/update`,
longPageColumnList: `${host1}iasf/pageManagement/longPageColumnList`,
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 456 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 390 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 735 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 505 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 464 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 287 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 709 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 877 B

@ -95,7 +95,7 @@ export default {
return { return {
collapse: false, collapse: false,
active: this.$route.path, active: this.$route.path,
siteActive: '/page/list', siteActive: '/page',
reloadSite: true, reloadSite: true,
menus: [ menus: [
{ {
@ -149,15 +149,15 @@ export default {
title: '内容管理', title: '内容管理',
subs: [ subs: [
{ {
index: '/page/list', index: '/page',
title: '页面管理' title: '页面管理'
}, },
{ {
index: '/column/list', index: '/column',
title: '栏目管理' title: '栏目管理'
}, },
{ {
index: '/article/list', index: '/article',
title: '文章管理' title: '文章管理'
} }
] ]
@ -165,9 +165,6 @@ export default {
], ],
actives: { actives: {
dashboard: ["add"], dashboard: ["add"],
achievement: ["experiment", "experimentVir", "experimentTeach", "addexperiment", "addexperimentoptions", "showExperiment", "showExperimentoption", "showExperimentoptions"],
project: ["addproject", "program", "programOption", "programOptions"],
backstage: ["report"]
} }
}; };
}, },
@ -186,12 +183,14 @@ export default {
let name = `/${arr[1]}/list` let name = `/${arr[1]}/list`
this.active = name this.active = name
const { path } = this.$route const { path } = this.$route
console.log("🚀 ~ file: index.vue ~ line 167 ~ path", this.sites[0].subs.find(e => e.index === path)) this.collapse = !!this.sites[0].subs.find(e => path.includes(e.index))
this.collapse = !!this.sites[0].subs.find(e => e.index === path)
} }
}, },
created() { created() {
this.collapse = !!this.sites[0].subs.find(e => e.index === this.$route.path) const { path } = this.$route
console.log("🚀 ~ file: index.vue ~ line 191 ~ created ~ path", path)
this.collapse = !!this.sites[0].subs.find(e => path.includes(e.index))
if (this.collapse) this.siteActive = '/' + path.split('/')[1]
// this.getPer() // this.getPer()
}, },
methods: { methods: {
@ -200,21 +199,9 @@ export default {
]), ]),
// //
menuSelect(index) { menuSelect(index) {
console.log("🚀 ~ file: index.vue ~ line 180 ~ menuSelect ~ index", index)
this.collapse = false this.collapse = false
if (index.includes('/')) { if (index.includes('/')) {
this.$router.push(index) this.$router.push(index)
// if (this.collapse) {
// this.reloadSite = false
// this.siteActive = '/page/list'
// this.$nextTick(() => {
// this.reloadSite = true
// })
// this.$router.push('/page')
// }
} else {
} }
}, },
// //

@ -0,0 +1,137 @@
<template>
<div class="page">
<div class="tool">
<div class="search-wrap">
<el-input placeholder="请输入站点名称" v-model.trim="keyword" clearable @keyup.enter.native="initData"></el-input>
<el-button type="primary" @click="initData">查询</el-button>
</div>
<div class="actions">
<el-button @click="batchDel">删除</el-button>
</div>
</div>
<el-table ref="table" :data="list" class="table" header-align="center" @selection-change="handleSelectionChange" row-key="id">
<el-table-column type="selection" width="50" :reserve-selection="true"></el-table-column>
<el-table-column type="index" width="60" label="ID"></el-table-column>
<el-table-column prop="site" label="站点名称" min-width="180"></el-table-column>
<el-table-column prop="type" label="文件类型" min-width="100"></el-table-column>
<el-table-column prop="format" label="格式" min-width="100"></el-table-column>
<el-table-column prop="fileSize" label="大小" min-width="100">
<template slot-scope="scope">
{{ scope.row.fileSize }}kb
</template>
</el-table-column>
<el-table-column prop="createDate" label="上传时间" min-width="150"></el-table-column>
<el-table-column prop="uploader" label="上传人" min-width="100"></el-table-column>
<el-table-column prop="quote" label="文章名称" min-width="180"></el-table-column>
<el-table-column prop="deleted" label="是否使用" min-width="100">
<template slot-scope="scope">
{{ scope.row.deleted ? '否' : '是' }}
</template>
</el-table-column>
<el-table-column label="操作" width="170">
<template slot-scope="scope">
<el-button type="text" @click="del(scope.row)">删除</el-button>
<el-button type="text" @click="edit(scope.row, 'edit')">下级</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination background layout="total, prev, pager, next" :total="total" @current-change="handleCurrentChange" :current-page="page"></el-pagination>
</div>
</div>
</template>
<script>
import util from "@/libs/util";
export default {
data() {
return {
keyword: '',
page: +this.$route.query.page || 1,
pageSize: 10,
total: 0,
list: [],
multipleSelection: [],
};
},
mounted() {
this.getData()
},
methods: {
getData() {
this.$post(this.api.listByPage, {
page: this.page,
limit: this.pageSize,
}).then(({ data }) => {
this.list = data.records
this.total = +data.total
}).catch(err => {})
},
initData() {
this.$refs.table.clearSelection()
this.page = 1
this.getData()
},
add() {
this.$router.push('add')
},
edit(row, type) {
this.$router.push(`add?id=${row.id}&level=${row.level + 1}&type=${type}`)
},
del(row) {
this.$confirm('确定要删除吗?', '提示', {
type: 'warning'
}).then(() => {
this.$del(`${this.api.delFile}`, [row.id]).then(res => {
util.successMsg('删除成功')
this.getData()
}).catch(res => {})
}).catch(() => {})
},
batchDel() {
const list = this.multipleSelection
if (list.length) {
this.$confirm('确定要删除吗?', '提示', {
type: 'warning'
}).then(() => {
this.$del(`${this.api.delFile}`, list.map(e => e.id)).then(res => {
this.$refs.table.clearSelection()
util.successMsg('删除成功')
this.getData()
}).catch(res => {})
}).catch(() => {})
} else {
util.errorMsg('请先选择数据 !')
}
},
handleSelectionChange(val) {
this.multipleSelection = val
},
handleCurrentChange(val) {
this.page = val
this.$router.push(`list?page=${val}`)
this.getData()
},
}
};
</script>
<style lang="scss" scoped>
.styles {
display: inline-flex;
li {
margin-right: 20px;
text-align: center;
&:hover .review {
border-color: #2962FF;
}
}
.review {
padding: 18px;
margin-bottom: 10px;
border: 1px solid #DCDEE0;
border-radius: 2px;
}
}
</style>

@ -1,19 +1,8 @@
<template> <template>
<div> <div class="page">
<el-form> <p class="page-name mb">新增栏目</p>
<el-card shadow="hover" class="m-b-20"> <el-form class="input-form model" label-width="100px">
<div class="flex-between"> <el-form-item prop="title" label="标题">
<el-page-header @back="goBack" :content="(isEdit ? '更新' : '创建') + '文章'"></el-page-header>
<div>
<el-button type="primary" @click="submit(1)">发布</el-button>
<el-button v-if="!form.id" type="primary" @click="submit(0)">保存为草稿</el-button>
</div>
</div>
</el-card>
<el-card shadow="hover" class="mgr20 m-b-20">
<div>
<p class="m-b-20">标题</p>
<el-input <el-input
placeholder="请输入标题" placeholder="请输入标题"
v-model.trim="form.title" v-model.trim="form.title"
@ -22,23 +11,17 @@
class="inline-input" class="inline-input"
@change="nameChange" @change="nameChange"
></el-input> ></el-input>
</div> </el-form-item>
</el-card> <div class="item-line">
<el-card shadow="hover" class="mgr20 m-b-20"> <el-form-item prop="columnId" label="所属栏目">
<div>
<p class="m-b-20">所属栏目</p>
<el-cascader <el-cascader
ref="column" ref="column"
v-model="form.columnId" v-model="form.columnId"
:options="columns" :options="columns"
:props="columnProps" :props="columnProps"
clearable></el-cascader> clearable></el-cascader>
</div> </el-form-item>
</el-card> <el-form-item prop="releaseTime" label="发布日期">
<el-card shadow="hover" class="mgr20 m-b-20">
<div>
<p class="m-b-20">发布日期</p>
<div class="inline-input">
<el-date-picker <el-date-picker
v-model="form.releaseTime" v-model="form.releaseTime"
type="date" type="date"
@ -46,12 +29,10 @@
format="yyyy-MM-dd" format="yyyy-MM-dd"
value-format="yyyy-MM-dd"> value-format="yyyy-MM-dd">
</el-date-picker> </el-date-picker>
</el-form-item>
</div> </div>
</div> <div class="item-line">
</el-card> <el-form-item prop="source" label="来源">
<el-card shadow="hover" class="mgr20 m-b-20">
<div>
<p class="m-b-20">来源</p>
<el-input <el-input
placeholder="请输入来源" placeholder="请输入来源"
v-model.trim="form.source" v-model.trim="form.source"
@ -60,11 +41,8 @@
class="inline-input" class="inline-input"
@change="nameChange" @change="nameChange"
></el-input> ></el-input>
</div> </el-form-item>
</el-card> <el-form-item prop="author" label="作者">
<el-card shadow="hover" class="mgr20 m-b-20">
<div>
<p class="m-b-20">作者</p>
<el-input <el-input
placeholder="请输入作者" placeholder="请输入作者"
v-model.trim="form.author" v-model.trim="form.author"
@ -73,141 +51,138 @@
class="inline-input" class="inline-input"
@change="nameChange" @change="nameChange"
></el-input> ></el-input>
</el-form-item>
</div> </div>
</el-card> <el-form-item prop="summary" label="摘要">
<el-card shadow="hover" class="mgr20 m-b-20"> <el-input
<div> type="textarea"
<p class="m-b-20">标题图</p> v-model.trim="form.summary"
clearable
></el-input>
</el-form-item>
<div class="item-line">
<el-form-item prop="titleImg" label="标题图">
<el-upload <el-upload
class="avatar-uploader" class="avatar-uploader"
accept=".jpg,.png,.jpeg,.gif" accept=".jpg,.png,.jpeg,.gif"
:before-upload="beforeUpload"
:on-remove="handleRemove" :on-remove="handleRemove"
:on-error="uploadError" :on-error="uploadError"
:on-success="uploadSuccess" :on-success="uploadSuccess"
:before-remove="beforeRemove"
:limit="1" :limit="1"
:on-exceed="handleExceed" :on-exceed="handleExceed"
:action="this.api.fileupload" :show-file-list="false"
:headers="headers" :action="this.api.upload"
name="file" :data="{
quote: form.title,
site: '粒子研究院中文站点',
uploader: userName
}"
> >
<img v-if="form.titleImg" :src="form.titleImg" class="avatar"> <img v-if="form.titleImg" :src="form.titleImg" class="avatar">
<div class="uploader-default" v-else> <div class="uploader-default" v-else>
<i class="el-icon-plus"></i> <img class="plus" src="@/assets/img/plus.png" alt="">
<p>上传banner</p> <p>点击上传</p>
</div>
<div slot="tip" class="el-upload__tip">
<p>展示宽度为220高度140JPG/PNG/GIF3MB以内</p>
</div> </div>
</el-upload> </el-upload>
</div> </el-form-item>
</el-card> <el-form-item prop="bannerImg" label="banner图" style="flex: 1;">
<el-card shadow="hover" class="mgr20 m-b-20">
<div>
<p class="m-b-20">banner图</p>
<el-upload <el-upload
class="avatar-uploader avatar-uploader-lg" class="avatar-uploader avatar-uploader-lg"
accept=".jpg,.png,.jpeg,.gif" accept=".jpg,.png,.jpeg,.gif"
:before-upload="beforeUpload"
:on-remove="handleRemove" :on-remove="handleRemove"
:on-error="uploadError" :on-error="uploadError"
:on-success="uploadSuccessBanner" :on-success="uploadSuccessBanner"
:before-remove="beforeRemove"
:limit="1" :limit="1"
:on-exceed="handleExceed" :on-exceed="handleExceed"
:action="this.api.fileupload" :show-file-list="false"
:headers="headers" :action="this.api.upload"
name="file" :data="{
quote: form.title,
site: '粒子研究院中文站点',
uploader: userName
}"
> >
<img v-if="form.bannerImg" :src="form.bannerImg" class="avatar"> <img v-if="form.bannerImg" :src="form.bannerImg" class="avatar">
<div class="uploader-default" v-else> <div class="uploader-default" v-else>
<i class="el-icon-plus"></i> <img class="plus" src="@/assets/img/plus.png" alt="">
<p>上传banner</p> <p>点击上传</p>
</div>
<div slot="tip" class="el-upload__tip">
<p>展示宽度为220高度140JPG/PNG/GIF3MB以内</p>
</div> </div>
</el-upload> </el-upload>
</el-form-item>
</div> </div>
</el-card> <el-form-item prop="articleTemplate" label="独立文章模板">
<el-card shadow="hover" class="mgr20 m-b-20">
<div>
<p class="m-b-20">独立文章模板</p>
<div class="style-wrap">
<ul class="styles"> <ul class="styles">
<li> <li>
<div class="review">
<img src="@/assets/img/article2.png" alt="">
</div>
<el-radio v-model="form.articleTemplate" :label="1">视频详情</el-radio> <el-radio v-model="form.articleTemplate" :label="1">视频详情</el-radio>
</li> </li>
<li> <li>
<div class="review">
<img src="@/assets/img/article1.png" alt="">
</div>
<el-radio v-model="form.articleTemplate" :label="2">富文本</el-radio> <el-radio v-model="form.articleTemplate" :label="2">富文本</el-radio>
</li> </li>
<li> <li>
<div class="review">
<img src="@/assets/img/article3.png" alt="">
</div>
<el-radio v-model="form.articleTemplate" :label="3">链接</el-radio> <el-radio v-model="form.articleTemplate" :label="3">链接</el-radio>
</li> </li>
</ul> </ul>
</div> </el-form-item>
</div>
</el-card>
<template v-if="form.articleTemplate === 1 || form.articleTemplate === 2"> <template v-if="form.articleTemplate === 1 || form.articleTemplate === 2">
<el-card shadow="hover" class="mgr20 m-b-20"> <el-form-item prop="mainBody" label="正文">
<div> <quill :border="true" v-model="form.mainBody" :height="150" />
<p class="m-b-20">正文</p> </el-form-item>
<quill :border="true" v-model="form.mainBody" :height="400" /> <el-form-item prop="mainBody" label="文件上传">
</div>
</el-card>
<el-card shadow="hover" class="mgr20 m-b-20">
<div>
<p class="m-b-20">文件上传</p>
<el-upload <el-upload
class="avatar-uploader avatar-uploader-lg"
accept=".jpg,.png,.jpeg,.gif"
:on-remove="handleRemove" :on-remove="handleRemove"
:on-error="uploadError" :on-error="uploadError"
:on-success="uploadSuccessFile" :on-success="uploadSuccessFile"
:before-remove="beforeRemove"
:limit="1" :limit="1"
:on-exceed="handleExceed" :on-exceed="handleExceed"
:action="this.api.fileupload" :show-file-list="false"
:headers="headers" :action="this.api.upload"
name="file" :data="{
quote: form.columnName,
site: '粒子研究院中文站点',
uploader: userName
}"
> >
<el-button type="primary">上传</el-button> <el-button type="primary">上传</el-button>
</el-upload> </el-upload>
</div> </el-form-item>
</el-card>
</template> </template>
<template v-if="form.articleTemplate === 3"> <template v-if="form.articleTemplate === 3">
<el-card shadow="hover" class="mgr20 m-b-20"> <el-form-item prop="connectionType" label="连接类型">
<div>
<p class="m-b-20">连接类型</p>
<el-radio-group v-model="form.connectionType"> <el-radio-group v-model="form.connectionType">
<el-radio :label="1">站内链接</el-radio> <el-radio :label="1">站内链接</el-radio>
<el-radio :label="2">站外链接</el-radio> <el-radio :label="2">站外链接</el-radio>
<el-radio :label="3">其他站点链接</el-radio> <el-radio :label="3">其他站点链接</el-radio>
</el-radio-group> </el-radio-group>
</div> </el-form-item>
</el-card> <el-form-item v-show="form.connectionType === 1" prop="connectionType" label="站内链接">
<el-card v-show="form.connectionType === 1" shadow="hover" class="mgr20 m-b-20">
<div>
<p class="m-b-20">站内链接</p>
<el-cascader <el-cascader
v-model="links" v-model="links"
:options="columns" :options="columns"
:props="columnProps" :props="columnProps"
clearable></el-cascader> clearable></el-cascader>
</div> </el-form-item>
</el-card> <el-form-item v-show="form.connectionType === 2" prop="connectionType" label="站内链接">
<el-card v-show="form.connectionType === 2" shadow="hover" class="mgr20 m-b-20">
<div>
<p class="m-b-20">站外链接</p>
<el-input <el-input
placeholder="请输入站外链接" placeholder="请输入站外链接"
v-model.trim="form.linkAddress" v-model.trim="form.linkAddress"
clearable clearable
></el-input> ></el-input>
</div> </el-form-item>
</el-card>
<template v-if="form.connectionType === 3"> <template v-if="form.connectionType === 3">
<el-card shadow="hover" class="mgr20 m-b-20"> <el-form-item prop="siteSelection" label="站点选择">
<div>
<p class="m-b-20">站点选择</p>
<el-select v-model="form.siteSelection"> <el-select v-model="form.siteSelection">
<el-option <el-option
v-for="item in sites" v-for="item in sites"
@ -216,41 +191,41 @@
:value="item.id"> :value="item.id">
</el-option> </el-option>
</el-select> </el-select>
</div> </el-form-item>
</el-card> <el-form-item label="栏目">
<el-card shadow="hover" class="mgr20 m-b-20">
<div>
<p class="m-b-20">栏目</p>
<el-cascader <el-cascader
v-model="links" v-model="links"
:options="columns" :options="columns"
:props="columnProps" :props="columnProps"
clearable></el-cascader> clearable></el-cascader>
</div> </el-form-item>
</el-card>
</template> </template>
</template> </template>
<el-card v-show="form.typeId === 4" shadow="hover" class="mgr20 m-b-20"> <el-form-item v-show="form.typeId === 4" prop="showWithDetails" label="栏目">
<div>
<p class="m-b-20">在新窗口打开</p>
<el-switch <el-switch
v-model="form.showWithDetails" v-model="form.showWithDetails"
:active-value="1" :active-value="1"
:inactive-value="0"> :inactive-value="0">
</el-switch> </el-switch>
</div> </el-form-item>
</el-card>
</el-form> </el-form>
<div class="btns">
<el-button type="primary" @click="submit(1)">发布</el-button>
<el-button @click="preview">预览</el-button>
<el-button v-if="!isEdit" @click="submit(0)">保存草稿</el-button>
<el-button @click="$router.back()">取消</el-button>
</div>
</div> </div>
</template> </template>
<script> <script>
import util from "@/libs/util"; import util from '@/libs/util'
import ColumnConst from '@/const/column' import ColumnConst from '@/const/column'
import quill from '@/components/quill' import quill from '@/components/quill'
import { mapState, mapActions } from "vuex"; import { mapState } from 'vuex'
export default { export default {
data() { data() {
return { return {
siteId: this.$store.state.content.siteId,
isEdit: this.$route.query.type === 'edit', isEdit: this.$route.query.type === 'edit',
headers: {}, headers: {},
nameRepeat: false, nameRepeat: false,
@ -265,6 +240,7 @@ export default {
}, },
links: [], links: [],
form: { form: {
siteId: this.$store.state.content.siteId,
id: this.$route.query.id || '', id: this.$route.query.id || '',
founderId: +this.$store.state.user.userId, founderId: +this.$store.state.user.userId,
editorId: +this.$store.state.user.userId, editorId: +this.$store.state.user.userId,
@ -288,6 +264,11 @@ export default {
updateTime: 0 updateTime: 0
}; };
}, },
computed: {
...mapState('user', [
'userName'
])
},
components: { components: {
quill quill
}, },
@ -308,6 +289,7 @@ export default {
// //
getList() { getList() {
this.$post(this.api.listWithTree, { this.$post(this.api.listWithTree, {
siteId: this.siteId,
columnName: '', columnName: '',
templateId: '', templateId: '',
typeId : '', typeId : '',
@ -332,6 +314,7 @@ export default {
const { title, level, id } = this.form const { title, level, id } = this.form
if(title && title !== this.originalName){ if(title && title !== this.originalName){
this.$post(this.api.checkIfTheTitleIsRepeat, { this.$post(this.api.checkIfTheTitleIsRepeat, {
siteId: this.siteId,
title, title,
id: id || '' id: id || ''
}).then(res => { }).then(res => {
@ -346,6 +329,19 @@ export default {
// //
typeChange(val) { typeChange(val) {
},
//
beforeUpload(file) {
const { size, name } = file
const ext = name.substring(name.lastIndexOf('.') + 1)
if (!util.isImg(ext)) {
this.$message.error('请上传图片!')
return false
}
if (size / 1024 / 1024 > 1) {
this.$message.error('请上传1M以内的图片!')
return false
}
}, },
uploadError(err, file, fileList) { uploadError(err, file, fileList) {
this.$message({ this.$message({
@ -364,13 +360,17 @@ export default {
this.form.columnBanner = '' this.form.columnBanner = ''
}, },
uploadSuccess(res) { uploadSuccess(res) {
this.form.columnBanner = res.data.filesResult.fileUrl this.form.columnBanner = res.data.url
}, },
uploadSuccessBanner(res) { uploadSuccessBanner(res) {
this.form.bannerImg = res.data.filesResult.fileUrl this.form.bannerImg = res.data.url
}, },
uploadSuccessFile(res) { uploadSuccessFile(res) {
this.form.file = res.data.filesResult.fileUrl this.form.file = res.data.url
},
//
preview() {
}, },
// //
submit(isRelease) { submit(isRelease) {
@ -432,53 +432,38 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.inline-input {
width: 500px;
}
$upload-width: 220px; $upload-width: 220px;
$upload-height: 140px; $upload-height: 102px;
$upload-lg-height: 150px; $upload-lg-height: 102px;
/deep/ .avatar-uploader { /deep/ .avatar-uploader {
.el-upload { .el-upload {
position: relative; position: relative;
width: $upload-width; width: $upload-width;
height: $upload-height; height: $upload-height;
border: 1px dashed #d9d9d9; border: 1px solid #DCDEE0;
border-radius: 6px; border-radius: 2px;
cursor: pointer; cursor: pointer;
overflow: hidden; overflow: hidden;
&:hover {
border-color: #cb221c;
}
.uploader-default { .uploader-default {
display: flex; display: flex;
height: $upload-height; height: $upload-height;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
align-items: center;
text-align: center; text-align: center;
background: rgba(0, 0, 0, 0.04); background: #FAFAFA;
i {
font-size: 20px;
font-weight: bold;
color: #8c939d;
}
p { p {
margin-top: 10px; margin-top: 10px;
font-size: 14px; font-size: 14px;
color: rgba(0, 0, 0, 0.65); color: #333;
line-height: 1; line-height: 20px;
} }
} }
} }
&.avatar-uploader-lg { &.avatar-uploader-lg {
.el-upload { .el-upload {
width: 100%; width: 100%;
max-width: 960px; max-width: 820px;
height: $upload-lg-height; height: $upload-lg-height;
.uploader-default { .uploader-default {
@ -486,30 +471,21 @@ $upload-lg-height: 150px;
} }
} }
} }
.avatar { .avatar {
display: block; display: block;
width: $upload-width; width: $upload-width;
height: $upload-height; height: $upload-height;
} }
.avatar-lg { .avatar-lg {
display: block; display: block;
width: 100%; width: 100%;
height: $upload-lg-height; height: $upload-lg-height;
} }
.el-upload__tip { .el-upload__tip {
margin-top: 0; margin-top: 0;
p { p {
font-size: 14px; font-size: 12px;
color: rgba(0, 0, 0, 0.45); color: #333;
line-height: 1;
&:first-child {
margin-bottom: 5px;
}
} }
} }
} }
@ -524,6 +500,16 @@ $upload-lg-height: 150px;
display: inline-flex; display: inline-flex;
li { li {
margin-right: 20px; margin-right: 20px;
text-align: center;
&:hover .review {
border-color: #2962FF;
}
}
.review {
padding: 18px;
margin-bottom: 10px;
border: 1px solid #DCDEE0;
border-radius: 2px;
} }
} }
</style> </style>

@ -1,31 +1,23 @@
<template> <template>
<div class="flex"> <div class="flex page">
<div class="page" style="width: 320px"> <div style="width: 218px">
<div> <p class="page-name mb">全部栏目</p>
<div class="flex-between m-b-20"> <div style="height: 504px;overflow: auto">
<h6 class="p-title" style="margin-bottom: 0">栏目</h6>
</div>
<div style="height: 504px; max-height: 504px; overflow: auto">
<el-tree ref="column" :data="columns" :props="defaultProps" node-key="id" @node-click="columnClick"></el-tree> <el-tree ref="column" :data="columns" :props="defaultProps" node-key="id" @node-click="columnClick"></el-tree>
</div> </div>
</div> </div>
</div> <div class="flex-1">
<div class="page flex-1 m-l-20">
<h6 class="p-title">筛选</h6>
<div class="tool"> <div class="tool">
<ul class="filter"> <div class="search-wrap">
<li> <el-input placeholder="请输入文章标题" v-model.trim="keyword" clearable @keyup.enter.native="initData"></el-input>
<el-input style="width: 250px;" placeholder="请输入文章标题" prefix-icon="el-icon-search" v-model="keyword" clearable></el-input> <el-button type="primary" @click="initData">查询</el-button>
</li>
</ul>
<div>
<el-button type="info" v-auth @click="add">新增</el-button>
<el-button type="primary" v-auth @click="delAllSelection">批量删除</el-button>
</div> </div>
<div class="actions">
<el-button type="primary" @click="add" >新增</el-button>
<el-button @click="batchDel">删除</el-button>
</div> </div>
</div>
<el-table :data="list" class="table" ref="table" stripe header-align="center" @selection-change="handleSelectionChange" row-key="id"> <el-table :data="list" class="table" ref="table" header-align="center" @selection-change="handleSelectionChange" row-key="id">
<el-table-column type="selection" width="55" align="center" :reserve-selection="true"></el-table-column> <el-table-column type="selection" width="55" align="center" :reserve-selection="true"></el-table-column>
<el-table-column type="index" width="60" label="序号" align="center"></el-table-column> <el-table-column type="index" width="60" label="序号" align="center"></el-table-column>
<el-table-column prop="title" label="标题" align="center" min-width="100"></el-table-column> <el-table-column prop="title" label="标题" align="center" min-width="100"></el-table-column>
@ -52,9 +44,7 @@
</template> </template>
<script> <script>
import util from "@/libs/util"; import util from '@/libs/util'
import Setting from "@/setting";
import { mapState } from "vuex";
export default { export default {
data() { data() {
return { return {
@ -63,17 +53,7 @@ export default {
value: 'id', value: 'id',
label: 'columnName' label: 'columnName'
}, },
keyword: "", keyword: '',
originForm: {},
form: {
userName: "",
phone: "",
uniqueIdentification: "",
workNumber: "",
email: "",
account: "",
classId: ""
},
list: [], list: [],
page: 1, page: 1,
pageSize: 10, pageSize: 10,
@ -84,23 +64,11 @@ export default {
mounted() { mounted() {
this.getColumn() this.getColumn()
}, },
watch: {
keyword: function(val) {
clearTimeout(this.searchTimer);
this.searchTimer = setTimeout(() => {
if (this.studentType) {
this.initData();
} else {
this.getOrgStudentData();
}
}, 500);
},
},
methods: { methods: {
// //
getColumn() { getColumn() {
this.$post(this.api.listWithTree, { this.$post(this.api.listWithTree, {
siteId: this.$store.state.content.siteId,
columnName: '', columnName: '',
templateId: '', templateId: '',
typeId : '', typeId : '',
@ -119,6 +87,7 @@ export default {
// //
getData() { getData() {
this.$post(this.api.queryArticle, { this.$post(this.api.queryArticle, {
siteId: this.$store.state.content.siteId,
columnIds: [this.$refs.column.getCurrentKey()], columnIds: [this.$refs.column.getCurrentKey()],
pageNum: this.page, pageNum: this.page,
pageSize: this.pageSize, pageSize: this.pageSize,
@ -128,19 +97,19 @@ export default {
this.total = +data.total this.total = +data.total
}).catch(err => {}) }).catch(err => {})
}, },
currentChange(val) { // currentChange(val) {
this.page = val; this.page = val
this.getData() this.getData()
}, },
handleSelectionChange(val) { // handleSelectionChange(val) {
this.multipleSelection = val; this.multipleSelection = val
}, },
initData() { initData() {
this.$refs.table.clearSelection(); this.$refs.table.clearSelection()
this.page = 1; this.page = 1
this.getData(); this.getData()
}, },
delAllSelection() { // batchDel() { //
if (this.multipleSelection.length) { if (this.multipleSelection.length) {
this.$confirm("确定要删除选中用户吗?", "提示", { this.$confirm("确定要删除选中用户吗?", "提示", {
type: "warning" type: "warning"
@ -168,16 +137,16 @@ export default {
util.errorMsg("请先选择数据 !"); util.errorMsg("请先选择数据 !");
} }
}, },
handleDelete(row) { // //
handleDelete(row) {
this.$confirm("确定要删除吗?", "提示", { this.$confirm("确定要删除吗?", "提示", {
type: "warning" type: "warning"
}).then(() => { }).then(() => {
this.$post(`${this.api.deleteArticle}?id=${row.id}`).then(res => { this.$post(`${this.api.deleteArticle}?id=${row.id}`).then(res => {
util.successMsg("删除成功"); util.successMsg("删除成功")
this.getData() this.getData()
}).catch(res => {}) }).catch(res => {})
}).catch(() => { }).catch(() => {})
});
}, },
// //
add() { add() {

@ -1,42 +1,27 @@
<template> <template>
<div> <div class="page">
<el-form> <p class="page-name mb">新增栏目</p>
<el-card shadow="hover" class="m-b-20"> <el-form class="input-form model" label-width="100px">
<div class="flex-between"> <div class="item-line">
<el-page-header @back="goBack" :content="(isEdit ? '更新' : '创建') + '栏目'"></el-page-header> <el-form-item prop="columnName" label="栏目名称">
<div>
<el-button type="primary" @click="submit">{{ form.id ? "更新" : "创建" }}</el-button>
</div>
</div>
</el-card>
<el-card shadow="hover" class="mgr20 m-b-20">
<div>
<p class="m-b-20">栏目名称</p>
<el-input <el-input
placeholder="请输入栏目名称" placeholder="请输入栏目名称"
v-model.trim="form.columnName" v-model.trim="form.columnName"
clearable clearable
maxlength="15" maxlength="15"
class="inline-input"
@change="nameChange" @change="nameChange"
></el-input> ></el-input>
</div> </el-form-item>
</el-card> <el-form-item prop="fatherId" label="设置上级">
<el-card shadow="hover" class="mgr20 m-b-20">
<div>
<p class="m-b-20">设置上级</p>
<el-cascader <el-cascader
v-model="form.fatherId" v-model="form.fatherId"
:options="columns" :options="columns"
:props="columnProps" :props="columnProps"
clearable></el-cascader> clearable></el-cascader>
</el-form-item>
</div> </div>
</el-card> <div class="item-line">
<el-card shadow="hover" class="mgr20 m-b-20"> <el-form-item prop="typeId" label="栏目类型">
<div>
<p class="m-b-20">栏目类型</p>
<div class="inline-input">
<el-select v-model="form.typeId" @change="typeChange"> <el-select v-model="form.typeId" @change="typeChange">
<el-option <el-option
v-for="item in types" v-for="item in types"
@ -45,62 +30,49 @@
:value="item.id"> :value="item.id">
</el-option> </el-option>
</el-select> </el-select>
</div> </el-form-item>
</div> <el-form-item prop="pageSize" label="分页条数">
</el-card> <el-input-number v-model="form.pageSize" :min="0" class="auto"></el-input-number>
<el-card shadow="hover" class="mgr20 m-b-20"> </el-form-item>
<div> <el-form-item prop="menuVisible" label="导航菜单可见">
<p class="m-b-20">分页条数</p>
<el-input
placeholder="请输入分页条数"
v-model.trim="form.pageSize"
maxlength="15"
type="number"
style="width: 150px"
></el-input>
</div>
</el-card>
<el-card shadow="hover" class="mgr20 m-b-20">
<div>
<p class="m-b-20">导航菜单可见</p>
<el-switch <el-switch
v-model="form.menuVisible" v-model="form.menuVisible"
:active-value="0" :active-value="0"
:inactive-value="1"> :inactive-value="1">
</el-switch> </el-switch>
</el-form-item>
</div> </div>
</el-card> <div class="line"></div>
<template v-if="form.typeId === 1 || form.typeId === 4"> <template v-if="form.typeId === 1 || form.typeId === 4">
<el-card shadow="hover" class="mgr20 m-b-20"> <el-form-item prop="columnBanner" label="栏目banner">
<div>
<p class="m-b-20">栏目banner</p>
<el-upload <el-upload
class="avatar-uploader avatar-uploader-lg" class="avatar-uploader avatar-uploader-lg"
accept=".jpg,.png,.jpeg,.gif" accept=".jpg,.png,.jpeg,.gif"
:before-upload="beforeUpload"
:on-remove="handleRemove" :on-remove="handleRemove"
:on-error="uploadError" :on-error="uploadError"
:on-success="uploadSuccess" :on-success="uploadSuccess"
:before-remove="beforeRemove"
:limit="1" :limit="1"
:on-exceed="handleExceed" :on-exceed="handleExceed"
:action="this.api.fileupload" :show-file-list="false"
:headers="headers" :action="this.api.upload"
name="file" :data="{
quote: form.columnName,
site: '粒子研究院中文站点',
uploader: userName
}"
> >
<img v-if="form.columnBanner" :src="form.columnBanner" class="avatar"> <img v-if="form.columnBanner" :src="form.columnBanner" class="avatar">
<div class="uploader-default" v-else> <div class="uploader-default" v-else>
<i class="el-icon-plus"></i> <img class="plus" src="@/assets/img/plus.png" alt="">
<p>上传banner</p> <p>点击上传</p>
</div> </div>
<div slot="tip" class="el-upload__tip"> <div slot="tip" class="el-upload__tip">
<p>展示宽度为220高度140JPG/PNG/GIF3MB以内</p> <p>请上传1920x500PX1M以内的jpgbmppng格式</p>
</div> </div>
</el-upload> </el-upload>
</div> </el-form-item>
</el-card> <el-form-item prop="templateId" label="栏目模板">
<el-card shadow="hover" class="mgr20 m-b-20">
<div>
<p class="m-b-20">栏目模板</p>
<el-select v-model="form.templateId"> <el-select v-model="form.templateId">
<el-option <el-option
v-for="item in templates" v-for="item in templates"
@ -109,72 +81,76 @@
:value="item.id"> :value="item.id">
</el-option> </el-option>
</el-select> </el-select>
<div class="style-wrap"> </el-form-item>
<p class="label">列表样式</p> <el-form-item prop="listStyleId" label="列表样式">
<ul class="styles"> <ul class="styles">
<li> <li>
<div class="review">
<img src="@/assets/img/list1.png" alt="">
</div>
<el-radio v-model="form.listStyleId" :label="1">图片列表</el-radio> <el-radio v-model="form.listStyleId" :label="1">图片列表</el-radio>
</li> </li>
<li> <li>
<div class="review">
<img src="@/assets/img/list2.png" alt="">
</div>
<el-radio v-model="form.listStyleId" :label="2">新闻列表</el-radio> <el-radio v-model="form.listStyleId" :label="2">新闻列表</el-radio>
</li> </li>
<li> <li>
<div class="review">
<img src="@/assets/img/list2.png" alt="">
</div>
<el-radio v-model="form.listStyleId" :label="3">出版物列表</el-radio> <el-radio v-model="form.listStyleId" :label="3">出版物列表</el-radio>
</li> </li>
</ul> </ul>
</div> </el-form-item>
<div class="style-wrap"> <el-form-item prop="detailStyle" label="详情样式">
<p class="label">详情样式</p>
<ul class="styles"> <ul class="styles">
<li> <li>
<div class="review">
<img src="@/assets/img/article1.png" alt="">
</div>
<el-radio v-model="form.detailStyle" :label="1">视频详情</el-radio> <el-radio v-model="form.detailStyle" :label="1">视频详情</el-radio>
</li> </li>
<li> <li>
<div class="review">
<img src="@/assets/img/article2.png" alt="">
</div>
<el-radio v-model="form.detailStyle" :label="2">富文本</el-radio> <el-radio v-model="form.detailStyle" :label="2">富文本</el-radio>
</li> </li>
<li> <li>
<div class="review">
<img src="@/assets/img/article3.png" alt="">
</div>
<el-radio v-model="form.detailStyle" :label="3">链接</el-radio> <el-radio v-model="form.detailStyle" :label="3">链接</el-radio>
</li> </li>
</ul> </ul>
</div> </el-form-item>
</div>
</el-card>
</template> </template>
<template v-if="form.typeId === 2"> <template v-if="form.typeId === 2">
<el-card shadow="hover" class="mgr20 m-b-20"> <el-form-item prop="connectionType" label="连接类型">
<div>
<p class="m-b-20">连接类型</p>
<el-radio-group v-model="form.connectionType"> <el-radio-group v-model="form.connectionType">
<el-radio :label="1">站内链接</el-radio> <el-radio :label="1">站内链接</el-radio>
<el-radio :label="2">站外链接</el-radio> <el-radio :label="2">站外链接</el-radio>
<el-radio :label="3">其他站点链接</el-radio> <el-radio :label="3">其他站点链接</el-radio>
</el-radio-group> </el-radio-group>
</div> </el-form-item>
</el-card> <el-form-item v-show="form.connectionType === 1" label="站内链接">
<el-card v-show="form.connectionType === 1" shadow="hover" class="mgr20 m-b-20">
<div>
<p class="m-b-20">站内链接</p>
<el-cascader <el-cascader
v-model="links" v-model="links"
:options="columns" :options="columns"
:props="columnProps" :props="columnProps"
clearable></el-cascader> clearable></el-cascader>
</div> </el-form-item>
</el-card> <el-form-item v-show="form.connectionType === 2" prop="linkAddress" label="站外链接">
<el-card v-show="form.connectionType === 2" shadow="hover" class="mgr20 m-b-20">
<div>
<p class="m-b-20">站外链接</p>
<el-input <el-input
placeholder="请输入站外链接" placeholder="请输入站外链接"
v-model.trim="form.linkAddress" v-model.trim="form.linkAddress"
clearable clearable
></el-input> ></el-input>
</div> </el-form-item>
</el-card>
<template v-if="form.connectionType === 3"> <template v-if="form.connectionType === 3">
<el-card shadow="hover" class="mgr20 m-b-20"> <el-form-item prop="siteSelection" label="站点选择">
<div>
<p class="m-b-20">站点选择</p>
<el-select v-model="form.siteSelection"> <el-select v-model="form.siteSelection">
<el-option <el-option
v-for="item in sites" v-for="item in sites"
@ -183,23 +159,24 @@
:value="item.id"> :value="item.id">
</el-option> </el-option>
</el-select> </el-select>
</div> </el-form-item>
</el-card> <el-form-item label="栏目">
<el-card shadow="hover" class="mgr20 m-b-20">
<div>
<p class="m-b-20">栏目</p>
<el-cascader <el-cascader
:options="links" :options="links"
:props="{ checkStrictly: true }" :props="{ checkStrictly: true }"
clearable></el-cascader> clearable></el-cascader>
</div> </el-form-item>
</el-card>
</template> </template>
<el-form-item prop="isOpen" label="新窗口打开">
<el-switch
v-model="form.isOpen"
:active-value="1"
:inactive-value="0">
</el-switch>
</el-form-item>
</template> </template>
<template v-if="form.typeId === 3"> <template v-if="form.typeId === 3">
<el-card shadow="hover" class="mgr20 m-b-20"> <el-form-item prop="templateId" label="栏目模板">
<div>
<p class="m-b-20">栏目模板</p>
<el-select v-model="form.templateId"> <el-select v-model="form.templateId">
<el-option <el-option
v-for="item in templates" v-for="item in templates"
@ -208,45 +185,55 @@
:value="item.id"> :value="item.id">
</el-option> </el-option>
</el-select> </el-select>
<div class="style-wrap"> </el-form-item>
<p class="label">列表样式</p> <el-form-item prop="listStyleId" label="列表样式">
<ul class="styles"> <ul class="styles">
<li> <li>
<div class="review">
<img src="@/assets/img/list1.png" alt="">
</div>
<el-radio v-model="form.listStyleId" :label="1">图片列表</el-radio> <el-radio v-model="form.listStyleId" :label="1">图片列表</el-radio>
</li> </li>
<li> <li>
<div class="review">
<img src="@/assets/img/list2.png" alt="">
</div>
<el-radio v-model="form.listStyleId" :label="2">新闻列表</el-radio> <el-radio v-model="form.listStyleId" :label="2">新闻列表</el-radio>
</li> </li>
<li> <li>
<div class="review">
<img src="@/assets/img/list2.png" alt="">
</div>
<el-radio v-model="form.listStyleId" :label="3">出版物列表</el-radio> <el-radio v-model="form.listStyleId" :label="3">出版物列表</el-radio>
</li> </li>
</ul> </ul>
</div> </el-form-item>
</div>
</el-card>
</template> </template>
<el-card v-show="form.typeId === 4" shadow="hover" class="mgr20 m-b-20"> <el-form-item v-show="form.typeId === 4" prop="showWithDetails" label="只有一篇文章时,以详情方式展示">
<div>
<p class="m-b-20">只有一篇文章时以详情方式展示</p>
<el-switch <el-switch
v-model="form.showWithDetails" v-model="form.showWithDetails"
:active-value="1" :active-value="1"
:inactive-value="0"> :inactive-value="0">
</el-switch> </el-switch>
</div> </el-form-item>
</el-card>
</el-form> </el-form>
<div class="btns">
<el-button type="primary" @click="submit(1)">发布</el-button>
<el-button @click="preview">预览</el-button>
<el-button v-if="!isEdit" @click="submit(0)">保存草稿</el-button>
<el-button @click="$router.back()">取消</el-button>
</div>
</div> </div>
</template> </template>
<script> <script>
import util from "@/libs/util"; import util from "@/libs/util";
import ColumnConst from '@/const/column' import ColumnConst from '@/const/column'
import { mapState, mapActions } from "vuex"; import { mapState } from 'vuex'
export default { export default {
data() { data() {
return { return {
siteId: this.$store.state.content.siteId,
isEdit: this.$route.query.type === 'edit', isEdit: this.$route.query.type === 'edit',
headers: {},
nameRepeat: false, nameRepeat: false,
types: ColumnConst.types, types: ColumnConst.types,
templates: ColumnConst.templates, templates: ColumnConst.templates,
@ -259,6 +246,7 @@ export default {
}, },
links: [], links: [],
form: { form: {
siteId: this.$store.state.content.siteId,
id: this.$route.query.id || '', id: this.$route.query.id || '',
founderId: +this.$store.state.user.userId, founderId: +this.$store.state.user.userId,
editorId: +this.$store.state.user.userId, editorId: +this.$store.state.user.userId,
@ -278,11 +266,17 @@ export default {
siteSelection: 1, siteSelection: 1,
status: 1, status: 1,
sort: 1, sort: 1,
isOpen: 1
}, },
submiting: false, // submiting: false, //
updateTime: 0 updateTime: 0
}; };
}, },
computed: {
...mapState('user', [
'userName'
])
},
mounted() { mounted() {
this.getList() this.getList()
this.isEdit && this.getData() this.isEdit && this.getData()
@ -300,6 +294,7 @@ export default {
// //
getList() { getList() {
this.$post(this.api.listWithTree, { this.$post(this.api.listWithTree, {
siteId: this.siteId,
columnName: '', columnName: '',
templateId: '', templateId: '',
typeId : '', typeId : '',
@ -322,6 +317,7 @@ export default {
const { columnName, level, id } = this.form const { columnName, level, id } = this.form
if (columnName && columnName !== this.originalName) { if (columnName && columnName !== this.originalName) {
this.$post(this.api.sameLevelJudgment, { this.$post(this.api.sameLevelJudgment, {
siteId: this.siteId,
columnName, columnName,
level: +level, level: +level,
id: +id || '' id: +id || ''
@ -337,6 +333,19 @@ export default {
// //
typeChange(val) { typeChange(val) {
},
//
beforeUpload(file) {
const { size, name } = file
const ext = name.substring(name.lastIndexOf('.') + 1)
if (!util.isImg(ext)) {
this.$message.error('请上传图片!')
return false
}
if (size / 1024 / 1024 > 1) {
this.$message.error('请上传1M以内的图片!')
return false
}
}, },
uploadError(err, file, fileList) { uploadError(err, file, fileList) {
this.$message({ this.$message({
@ -345,9 +354,6 @@ export default {
center: true center: true
}) })
}, },
beforeRemove(file, fileList) {
return this.$confirm(`确定移除 ${file.name}`);
},
handleExceed(files, fileList) { handleExceed(files, fileList) {
util.errorMsg(`当前限制选择 1 个文件,如需更换,请删除上一个文件再重新选择!`); util.errorMsg(`当前限制选择 1 个文件,如需更换,请删除上一个文件再重新选择!`);
}, },
@ -355,10 +361,14 @@ export default {
this.form.columnBanner = '' this.form.columnBanner = ''
}, },
uploadSuccess(res) { uploadSuccess(res) {
this.form.columnBanner = res.data.filesResult.fileUrl this.form.columnBanner = res.data.url
},
//
preview() {
}, },
// //
submit() { submit(status) {
if (this.submiting) return false if (this.submiting) return false
const { form } = this const { form } = this
if (!form.columnName) return util.errorMsg('请填写栏目名称') if (!form.columnName) return util.errorMsg('请填写栏目名称')
@ -371,7 +381,7 @@ export default {
if (!links.length && form.connectionType === 3) return util.errorMsg('请选择栏目') if (!links.length && form.connectionType === 3) return util.errorMsg('请选择栏目')
form.linkAddress = links.join() form.linkAddress = links.join()
} }
console.log(44, this.links) form.status = status
this.submiting = true this.submiting = true
if (this.isEdit) { if (this.isEdit) {
delete form.children delete form.children
@ -390,79 +400,44 @@ export default {
this.submiting = false this.submiting = false
}) })
} }
},
//
backPage() {
this.$router.back()
},
goBack() {
const { id } = this.form
const { updateTime } = this
//
if ((!this.isEdit && updateTime > 1) || (id && updateTime > 2)) {
this.$confirm(`编辑的内容未保存,是否保存?`, '提示', {
type: 'warning'
}).then(() => {
this.submit()
}).catch(() => {
this.backPage()
})
} else {
this.backPage()
}
} }
} }
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.inline-input {
width: 500px;
}
$upload-width: 220px; $upload-width: 220px;
$upload-height: 140px; $upload-height: 102px;
$upload-lg-height: 150px; $upload-lg-height: 102px;
/deep/ .avatar-uploader { /deep/ .avatar-uploader {
.el-upload { .el-upload {
position: relative; position: relative;
width: $upload-width; width: $upload-width;
height: $upload-height; height: $upload-height;
border: 1px dashed #d9d9d9; border: 1px solid #DCDEE0;
border-radius: 6px; border-radius: 2px;
cursor: pointer; cursor: pointer;
overflow: hidden; overflow: hidden;
&:hover {
border-color: #cb221c;
}
.uploader-default { .uploader-default {
display: flex; display: flex;
height: $upload-height; height: $upload-height;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
align-items: center;
text-align: center; text-align: center;
background: rgba(0, 0, 0, 0.04); background: #FAFAFA;
i {
font-size: 20px;
font-weight: bold;
color: #8c939d;
}
p { p {
margin-top: 10px; margin-top: 10px;
font-size: 14px; font-size: 14px;
color: rgba(0, 0, 0, 0.65); color: #333;
line-height: 1; line-height: 20px;
} }
} }
} }
&.avatar-uploader-lg { &.avatar-uploader-lg {
.el-upload { .el-upload {
width: 100%; width: 100%;
max-width: 960px; max-width: 820px;
height: $upload-lg-height; height: $upload-lg-height;
.uploader-default { .uploader-default {
@ -470,30 +445,21 @@ $upload-lg-height: 150px;
} }
} }
} }
.avatar { .avatar {
display: block; display: block;
width: $upload-width; width: $upload-width;
height: $upload-height; height: $upload-height;
} }
.avatar-lg { .avatar-lg {
display: block; display: block;
width: 100%; width: 100%;
height: $upload-lg-height; height: $upload-lg-height;
} }
.el-upload__tip { .el-upload__tip {
margin-top: 0; margin-top: 0;
p { p {
font-size: 14px; font-size: 12px;
color: rgba(0, 0, 0, 0.45); color: #333;
line-height: 1;
&:first-child {
margin-bottom: 5px;
}
} }
} }
} }
@ -508,6 +474,16 @@ $upload-lg-height: 150px;
display: inline-flex; display: inline-flex;
li { li {
margin-right: 20px; margin-right: 20px;
text-align: center;
&:hover .review {
border-color: #2962FF;
}
}
.review {
padding: 18px;
margin-bottom: 10px;
border: 1px solid #DCDEE0;
border-radius: 2px;
} }
} }
</style> </style>

@ -1,39 +1,40 @@
<template> <template>
<div class="page"> <div class="page">
<h6 class="p-title">筛选</h6> <div class="tool">
<div class="tool mul"> <div class="search-wrap">
<ul class="filter"> <el-input placeholder="请输入栏目名称" v-model.trim="keyword" clearable @keyup.enter.native="initData"></el-input>
<li> <el-button type="primary" @click="initData">查询</el-button>
<el-input placeholder="请输入栏目名称" prefix-icon="el-icon-search" v-model.trim="keyWord" clearable style="width: 300px"></el-input>
</li>
</ul>
<div>
<div>
<el-button type="info" round @click="add" >新增</el-button>
<el-button type="primary" round @click="delAllData">批量删除</el-button>
</div> </div>
<div class="actions">
<el-button type="primary" @click="add" >新增</el-button>
<el-button @click="batchDel">删除</el-button>
<el-button class="lg" @click="sort">更改排序</el-button>
<el-button class="lg" @click="styleSet">导航样式设置</el-button>
</div> </div>
</div> </div>
<el-table v-loading="listLoading" ref="table" :data="listData" class="table" stripe header-align="center" @selection-change="handleSelectionChange" row-key="id"> <el-table v-loading="listLoading" ref="table" :data="list" class="table" header-align="center" @selection-change="handleSelectionChange" row-key="id">
<el-table-column type="selection" width="50" align="center" :reserve-selection="true"></el-table-column> <el-table-column type="selection" width="50" :reserve-selection="true"></el-table-column>
<el-table-column type="index" width="60" label="序号" align="center"> <el-table-column prop="columnName" label="名称"></el-table-column>
<el-table-column prop="typeId" label="栏目类型">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.$index + (page - 1) * pageSize + 1 }} {{ types.find(e => e.id == scope.row.typeId) && types.find(e => e.id == scope.row.typeId).name }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="columnName" label="名称"></el-table-column> <el-table-column prop="templateId" label="栏目模板"></el-table-column>
<el-table-column prop="typeId" label="栏目类型" align="center"> <el-table-column prop="listStyleId" label="列表/长页样式"></el-table-column>
<el-table-column prop="detailStyle" label="详情样式"></el-table-column>
<el-table-column prop="menuVisible" label="导航菜单">
<template slot-scope="scope"> <template slot-scope="scope">
{{ types.find(e => e.id == scope.row.typeId) && types.find(e => e.id == scope.row.typeId).name }} <el-switch
v-model="scope.row.menuVisible"
:active-value="0"
:inactive-value="1">
</el-switch>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="templateId" label="栏目模板" align="center"></el-table-column> <el-table-column prop="id" label="ID"></el-table-column>
<el-table-column prop="listStyleId" label="列表/长页样式" align="center"></el-table-column> <el-table-column label="操作" width="170">
<el-table-column prop="detailStyle" label="详情样式" align="center"></el-table-column>
<el-table-column prop="menuVisible" label="导航菜单" align="center"></el-table-column>
<el-table-column prop="id" label="ID" align="center"></el-table-column>
<el-table-column label="操作" width="170" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="text" @click="edit(scope.row, 'add')">新增下级</el-button> <el-button type="text" @click="edit(scope.row, 'add')">新增下级</el-button>
<el-button type="text" @click="edit(scope.row, 'edit')">编辑</el-button> <el-button type="text" @click="edit(scope.row, 'edit')">编辑</el-button>
@ -41,9 +42,41 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="pagination">
<el-pagination background layout="total, prev, pager, next" :total="total" @current-change="handleCurrentChange" :current-page="page"></el-pagination> <el-dialog title="导航样式设置" :visible.sync="styleVisible" width="850px" :close-on-click-modal="false">
<el-form class="input-form" label-width="100px">
<el-form-item label="导航样式">
<el-select v-model="form.typeId">
<el-option
v-for="item in styleTypes"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="样式选择">
<ul class="styles">
<li>
<div class="review">
<img src="@/assets/img/style1.png" alt="">
</div> </div>
<el-radio v-model="form.listStyleId" :label="1">竖行导航</el-radio>
</li>
<li>
<div class="review">
<img src="@/assets/img/style2.png" alt="">
</div>
<el-radio v-model="form.listStyleId" :label="2">横向导航</el-radio>
</li>
</ul>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="styleVisible = false"> </el-button>
<el-button type="primary" @click="styleSubmit"> </el-button>
</span>
</el-dialog>
</div> </div>
</template> </template>
@ -55,23 +88,26 @@ export default {
return { return {
types: ColumnConst.types, types: ColumnConst.types,
templates: ColumnConst.templates, templates: ColumnConst.templates,
keyWord: "", // keyword: '',
searchTimer: null, searchTimer: null,
page: +this.$route.query.page || 1, // list: [],
pageSize: 10, // 10 multipleSelection: [],
total: 0, // listLoading: false,
listData: [], // styleVisible: false,
multipleSelection: [], // styleTypes: [
listLoading:false,// {
}; id: 1,
name: '目录树结构'
}, },
watch: { {
keyWord: function(val) { id: 2,
clearTimeout(this.searchTimer); name: '分类结构'
this.searchTimer = setTimeout(() => { }
this.initData(); ],
}, 500); form: {
} }
};
}, },
mounted() { mounted() {
this.getData() this.getData()
@ -79,11 +115,12 @@ export default {
methods: { methods: {
getData() { getData() {
this.$post(this.api.listWithTree, { this.$post(this.api.listWithTree, {
columnName: this.keyWord, siteId: this.$store.state.content.siteId,
columnName: this.keyword,
templateId: '', templateId: '',
typeId : '', typeId : '',
}).then(({ data }) => { }).then(({ data }) => {
this.listData = data this.list = data
this.listLoading = false this.listLoading = false
}).catch(err => { }).catch(err => {
this.listLoading = false this.listLoading = false
@ -110,7 +147,7 @@ export default {
}).catch(res => {}) }).catch(res => {})
}).catch(() => {}) }).catch(() => {})
}, },
delAllData() { batchDel() {
if (this.multipleSelection.length) { if (this.multipleSelection.length) {
let ids = this.multipleSelection.map(item => { let ids = this.multipleSelection.map(item => {
return item.id; return item.id;
@ -127,7 +164,7 @@ export default {
this.getData(); this.getData();
}).catch(res => { }).catch(res => {
}); });
if(this.multipleSelection.length === this.listData.length && this.page>1) { if(this.multipleSelection.length === this.list.length && this.page>1) {
this.handleCurrentChange(this.page - 1) this.handleCurrentChange(this.page - 1)
} }
}).catch(() => { }).catch(() => {
@ -137,22 +174,44 @@ export default {
} }
}, },
handleSelectionChange(val) { handleSelectionChange(val) {
this.multipleSelection = val; this.multipleSelection = val
}, },
handleCurrentChange(val) { handleCurrentChange(val) {
this.page = val this.page = val
this.$router.push(`list?page=${val}`) this.$router.push(`list?page=${val}`)
this.getData(); this.getData()
},
//
sort() {
},
//
styleSet() {
this.styleVisible = true
},
//
styleSubmit() {
} }
} }
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.el-radio-group { .styles {
white-space: nowrap; display: inline-flex;
li {
margin-right: 20px;
text-align: center;
&:hover .review {
border-color: #2962FF;
}
}
.review {
padding: 18px;
margin-bottom: 10px;
border: 1px solid #DCDEE0;
border-radius: 2px;
} }
.el-radio.is-bordered + .el-radio.is-bordered {
margin-left: 0;
} }
</style> </style>

@ -1,32 +1,29 @@
<template> <template>
<div class="page"> <div class="page">
<h6 class="p-title">筛选</h6> <div class="tool">
<div class="tool mul"> <p class="page-name">长页栏目列表</p>
<ul class="filter"> <div class="search-wrap">
<li> <el-input placeholder="请输入栏目或模板名称" v-model.trim="keyword" clearable @keyup.enter.native="initData"></el-input>
<el-input placeholder="请输入栏目或模板名称" prefix-icon="el-icon-search" v-model.trim="keyword" clearable style="width: 300px"></el-input> <el-button type="primary" @click="initData">查询</el-button>
</li>
</ul>
<div>
<div>
<!-- <el-button v-auth type="info" round @click="add" >创建考核</el-button>
<el-button v-auth type="primary" round @click="delAllData">批量删除</el-button> -->
</div>
</div> </div>
</div> </div>
<el-table ref="table" :data="list" class="table" stripe header-align="center" row-key="id"> <el-table ref="table" :data="list" class="table" header-align="center" row-key="id">
<el-table-column type="selection" :selectable="row => row.status !== 1" width="50" align="center" :reserve-selection="true"></el-table-column>
<el-table-column type="index" width="60" label="序号" align="center"> <el-table-column type="index" width="60" label="序号" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.$index + (pageNum - 1) * pageSize + 1 }} {{ scope.$index + (page - 1) * pageSize + 1 }}
</template>
</el-table-column>
<el-table-column prop="columnName" label="长页栏目名称" align="center"></el-table-column>
<el-table-column prop="articleTemplate" label="模板名称" align="center"></el-table-column>
<el-table-column prop="columnName" label="上级栏目" align="center">
<template slot-scope="scope">
{{ scope.row.parents }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="createTime" label="长页栏目名称" align="center"></el-table-column> <el-table-column prop="createTime" label="创建时间" align="center"></el-table-column>
<el-table-column prop="createTime" label="模板名称" align="center"></el-table-column> <el-table-column prop="updateTime" label="最近编辑" align="center"></el-table-column>
<el-table-column prop="createTime" label="上级栏目" align="center"></el-table-column> <el-table-column prop="editorName" label="编辑人" align="center"></el-table-column>
<el-table-column prop="createTime" label="最近编辑" align="center"></el-table-column>
<el-table-column prop="createTime" label="编辑人" align="center"></el-table-column>
<el-table-column label="操作" width="170" align="center"> <el-table-column label="操作" width="170" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="text" @click="start(scope.row)">预览</el-button> <el-button type="text" @click="start(scope.row)">预览</el-button>
@ -36,46 +33,59 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="pagination"> <div class="pagination">
<el-pagination background layout="total, prev, pager, next" :total="total" @current-change="handleCurrentChange" :current-page="pageNum"></el-pagination> <el-pagination background layout="total, prev, pager, next" :total="total" @current-change="handleCurrentChange" :current-page="page"></el-pagination>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import { mapState } from "vuex";
import util from "@/libs/util";
export default { export default {
data() { data() {
return { return {
keyword: '', keyword: '',
pageNum: +this.$route.query.page || 1, // page: +this.$route.query.page || 1,
pageSize: 10, // 10 pageSize: 10,
total: 0, // total: 0,
list: [] list: []
}; };
}, },
watch: {
keyword: function(val) {
clearTimeout(this.searchTimer);
this.searchTimer = setTimeout(() => {
this.initData();
}, 500);
}
},
mounted() { mounted() {
this.getData()
}, },
methods: { methods: {
//
getData() {
this.$post(this.api.longPageColumnList, {
siteId: this.$store.state.content.siteId,
pageNum: this.page,
pageSize: this.pageSize,
title: this.keyword
}).then(({ data }) => {
const list = data.records
list.map(e => {
//
e.parents = e.superiorColumn ?
e.superiorColumn.map(n => n.columnName).join(' / ') :
'--'
})
this.list = list
this.total = +data.total
}).catch(err => {})
},
initData() {
this.page = 1
this.getData()
},
handleCurrentChange(val) { handleCurrentChange(val) {
this.page = val this.page = val
// this.getData(); this.getData()
}, },
add() { add() {
this.$router.push("add"); this.$router.push("add");
}, },
edit(row) { edit(row) {
this.$router.push(`add?id=${row.id}`); this.$router.push(`add?id=${row.id}`);
}, }
} }
}; };
</script> </script>

@ -1,15 +1,14 @@
<template> <template>
<div class="page"> <div class="page">
<h6 class="p-title">筛选</h6> <div class="tool">
<div class="tool mul"> <p class="page-name">站点列表</p>
<ul class="filter"> <div class="search-wrap">
<li> <el-input placeholder="请输入站点名称" v-model.trim="keyword" clearable @keyup.enter.native="getData"></el-input>
<el-input placeholder="请输入站点名称" prefix-icon="el-icon-search" v-model.trim="keyword" clearable style="width: 300px"></el-input> <el-button type="primary" @click="getData">查询</el-button>
</li> </div>
</ul>
</div> </div>
<el-table ref="table" :data="list" class="table" stripe header-align="center" row-key="id"> <el-table ref="table" :data="list" class="table" header-align="center" row-key="id">
<el-table-column type="index" width="60" label="序号" align="center"> <el-table-column type="index" width="60" label="序号" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.$index + (page - 1) * pageSize + 1 }} {{ scope.$index + (page - 1) * pageSize + 1 }}
@ -31,15 +30,14 @@
</template> </template>
<script> <script>
import { mapState } from "vuex"; import { mapMutations } from 'vuex'
import util from "@/libs/util";
export default { export default {
data() { data() {
return { return {
keyword: '', keyword: '',
page: +this.$route.query.page || 1, // page: +this.$route.query.page || 1, //
pageSize: 10, // 10 pageSize: 10, // 10
total: 0, // total: 2, //
list: [ list: [
{ {
id: 1, id: 1,
@ -54,18 +52,16 @@ export default {
] ]
}; };
}, },
watch: {
keyword: function(val) {
clearTimeout(this.searchTimer);
this.searchTimer = setTimeout(() => {
this.initData();
}, 500)
}
},
mounted() { mounted() {
}, },
methods: { methods: {
...mapMutations('content', [
'setSiteId'
]),
getData() {
},
handleCurrentChange(val) { handleCurrentChange(val) {
this.page = val this.page = val
}, },
@ -75,6 +71,7 @@ export default {
}, },
// //
content(row) { content(row) {
this.setSiteId(row.id)
this.$router.push(`/page`) this.$router.push(`/page`)
}, },
} }

@ -112,7 +112,7 @@ function post(url, params) {
function del(url, params) { function del(url, params) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
service.delete(url, { service.delete(url, {
params data: params
}).then(res => { }).then(res => {
resolve(res); resolve(res);
}).catch(err => { }).catch(err => {

@ -0,0 +1,23 @@
import BasicLayout from '@/layouts/home'
const meta = {}
const pre = 'annex-'
export default {
path: '/annex',
name: 'annex',
redirect: {
name: `${pre}list`
},
meta,
component: BasicLayout,
children: [
{
name: `${pre}list`,
path: `list`,
component: () => import('@/pages/annex/list'),
meta: { title: '栏目管理' }
}
]
}

@ -0,0 +1,17 @@
/**
* 内容管理
* */
export default {
namespaced: true,
state: {
siteId: ''
},
mutations: {
setSiteId: (state, siteId) => {
state.siteId = siteId
}
},
actions: {
}
};

@ -23,16 +23,16 @@ export default {
}, },
SET_USERNAME: (state, userName) => { SET_USERNAME: (state, userName) => {
state.userName = userName state.userName = userName
}, }
}, },
actions: { actions: {
logout({ commit, state, dispatch }) { logout({ commit, state, dispatch }) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
util.local.remove(Setting.storeKey); util.local.remove(Setting.storeKey)
util.local.remove(Setting.tokenKey); util.local.remove(Setting.tokenKey)
location.reload() location.reload()
resolve(); resolve()
}); })
} }
} }
}; };

@ -27,28 +27,11 @@
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
} }
.el-button--primary.action-btn {
color: $--color-primary !important;
font-size: 14px !important;
background-color: #fff !important;
border-radius: 4px !important;
}
.el-button--info.action-btn {
color: #fff !important;
font-size: 14px !important;
background-color: $--color-primary !important;
border-radius: 4px !important;
border: none;
}
.el-input { .el-input {
.el-input__inner { .el-input__inner {
border-color: rgba(0, 0, 0, 0.15); border-color: #DCDEE0;
} }
} }
.p-title { .p-title {
padding-left: 5px; padding-left: 5px;
margin-bottom: 24px; margin-bottom: 24px;
@ -60,21 +43,24 @@
.page { .page {
position: relative; position: relative;
padding: 24px; padding: 16px 20px;
background-color: #fff; background-color: #fff;
border-radius: 8px; .page-name {
font-size: 14px;
color: #333;
&.mb {
margin-bottom: 16px;
}
}
.tool { .tool {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center;
margin-bottom: 24px; margin-bottom: 24px;
.filter { .filter {
display: inline-flex; display: inline-flex;
//flex-wrap: wrap;
align-items: center; align-items: center;
flex: 1; flex: 1;
li { li {
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
@ -89,15 +75,6 @@
} }
} }
} }
.el-button--primary {
@extend .action-btn;
}
.el-button--info {
@extend .action-btn;
}
&.mul { &.mul {
margin-bottom: 0; margin-bottom: 0;
@ -111,7 +88,61 @@
} }
} }
} }
.search-wrap {
display: flex;
.el-input__inner {
border-radius: 0;
border-right: 0;
}
.el-button {
border-radius: 0;
}
}
.actions, .btns, .el-dialog__footer {
.el-button {
width: 80px;
padding: 8px 0;
font-size: 14px;
border-radius: 2px;
&.lg {
width: 100px;
}
}
}
.input-form {
&.model {
height: calc(100vh - 278px);
padding-right: 20px;
overflow: auto;
}
.item-line {
display: flex;
justify-content: space-between;
}
.line {
margin-bottom: 24px;
border-bottom: 1px dashed #C2C2C2;
}
.el-form-item--small.el-form-item {
margin-bottom: 24px;
}
.el-input, .el-select {
width: 300px;
}
.auto, .auto .el-input {
width: auto;
}
}
.btns {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
padding: 14px 0;
text-align: center;
background-color: #fff;
box-shadow: 4px -2px 6px 0px rgba(198,198,198,0.3500);
}
.pagination { .pagination {
margin: 20px 0; margin: 20px 0;
text-align: center; text-align: center;
@ -119,7 +150,7 @@
button, .number { button, .number {
color: rgba(0, 0, 0, .65) !important; color: rgba(0, 0, 0, .65) !important;
background-color: transparent !important; background-color: transparent !important;
border: 1px solid rgba(0, 0, 0, 0.15) !important; border: 1px solid #DCDEE0 !important;
border-radius: 4px !important; border-radius: 4px !important;
} }
@ -134,25 +165,24 @@
} }
.el-table { .el-table {
border-radius: 8px;
border: 1px solid rgba(0, 0, 0, 0.06);
border-bottom: 0; border-bottom: 0;
.cell { .cell {
font-size: 12px; font-size: 12px;
color: #333;
line-height: 35px; line-height: 35px;
} }
th { th {
background: $--color-primary !important; background: #F7F7F7 !important;
.cell { .cell {
color: #fff; color: #323232;
font-size: 14px; font-size: 12px;
font-weight: normal; font-weight: normal;
} }
} }
} }
.el-table th.is-leaf, .el-table td {
border-bottom-color: #EBEDF0;
}
.tabs { .tabs {
display: flex; display: flex;
@ -226,7 +256,6 @@
} }
} }
} }
.el-message-box { .el-message-box {
padding-bottom: 24px; padding-bottom: 24px;
@ -272,33 +301,22 @@
} }
} }
.el-dialog__wrapper { .el-dialog__wrapper {
.el-dialog { .el-dialog {
border-radius: 4px; border-radius: 4px;
.el-dialog__header { .el-dialog__header {
border-bottom: 1px solid rgba(0, 0, 0, 0.06); border-bottom: 1px solid rgba(0, 0, 0, 0.06);
.el-dialog__title { .el-dialog__title {
font-size: 16px; font-size: 16px;
color: rgba(0, 0, 0, 0.85); color: rgba(0, 0, 0, 0.85);
} }
} }
.el-dialog__footer { .el-dialog__footer {
padding: 10px 16px; padding: 10px 16px;
border-top: 1px solid rgba(0, 0, 0, 0.06); border-top: 1px solid rgba(0, 0, 0, 0.06);
.el-button {
font-size: 14px;
border-radius: 4px;
border-color: rgba(0, 0, 0, 0.15);
} }
} }
} }
}
.upload-wrap { .upload-wrap {
position: relative; position: relative;
display: flex; display: flex;

Loading…
Cancel
Save