Commit f6684613 authored by wangxl's avatar wangxl

4444

parent 4b9f69fd
<template>
<div>
<div style="display: inline-block;width:40%;padding:0px 00px 0px 20px">
<span style="font-size:16px;font-family:YouSheBiaoTiHei;line-height:31px;color:black;">{{systemTitle}}</span>
</div>
<div style="display: inline-block;width:60%;text-align:right;">
<div class="toolbar-item">
<span style="color:black;">欢迎登录~{{userInfo.unitName}}({{userInfo.loginName}})</span>
</div>
<div class="toolbar-item" style="margin-right: 20px;">
<div class="toolbar-items">
<a-dropdown style="margin-right: 5px;" :trigger="['click']">
<a class="ant-dropdown-link">
<a-icon type="user" class="toolbar-icon" style="font-size: 19px;" />
</a>
<a-menu slot="overlay" style="margin-top: 20px!important;">
<a-menu-item>
<a href="javascript:;" @click="personInfo">
<div style="padding: 2px 30px 2px 10px">
<span>
<a-icon type="user" style="margin-right: 10px" />
</span><span>个人设置</span>
</div>
</a>
</a-menu-item>
<a-menu-item>
<a href="javascript:;" @click="toUpdatePwd">
<div style="padding: 2px 30px 2px 10px">
<span>
<a-icon type="edit" style="margin-right: 10px" />
</span><span>密码修改</span>
</div>
</a>
</a-menu-item>
<a-menu-item>
<a href="javascript:;" @click="logout">
<div style="padding: 2px 30px 2px 10px">
<span>
<a-icon type="poweroff" style="margin-right: 10px" />
</span><span>退出</span>
</div>
</a>
</a-menu-item>
</a-menu>
</a-dropdown>
</div>
<div class="toolbar-items">
<a class="ant-dropdown-link" @click="logout()">
<a-icon type="poweroff" class="toolbar-icon" />
<!-- <span style="color:white;">退出</span> -->
</a>
</div>
</div>
<a-modal v-model="visibleEdit" title="密码修改" width="700px" :footer="null" destroyOnClose>
<update-pwd v-model="id" @close="() => visibleEdit = false"> </update-pwd>
</a-modal>
</div>
</div>
</template>
<script>
import { removeToken } from '@/views/utils/auth'
import UpdatePwd from '@/views/system/updatePwd/Index.vue'
export default {
name: "LayoutHeader",
components: { UpdatePwd },
computed: {
},
data () {
return {
userInfo: {},
visibleEdit: false,
id: null,
systemTitle: process.env.VUE_APP_SYSTEM_TITLE,
}
},
mounted () {
},
created () {
this.userInfo = JSON.parse(window.sessionStorage.getItem('user'))
},
methods: {
toAdmin () {
},
//修改密码
toUpdatePwd () {
this.visibleEdit = true
},
logout () {
this.$confirm({
title: '提示',
content: '确定要退出登录吗?',
onOk: () => {
// this.$api.base.logout().then(({ data }) => {
// window.sessionStorage.clear();
// removeToken()
// window.location.href = "/"
// })
window.sessionStorage.clear();
removeToken()
window.location.href = "/"
},
});
},
turnPage () {
},
personInfo () {
this.$store.commit('app/addCard', { title: '个人设置', key: '1005', code: 'personInfo', keepAlive: 1, router: '/person/info', closable: true })
}
},
watch: {
},
}
</script>
<style lang="less" scoped>
.toolbar-item {
display: inline-block;
margin-right: 10px;
}
.toolbar-items {
display: inline-block;
margin-right: 3px;
}
.toolbar-icon {
font-size: 18px;
top: 2px;
position: relative;
color: black;
}
</style>
<template>
<div class="main">
<!-- <div class="main-content"> </div> -->
<keep-alive :include='cachedViews'>
<router-view />
</keep-alive>
<!-- <iframe :id="item.id" class="iFrame" :src="item.src" :key="item.src" v-for="item in serviceCardList" scrolling="auto" frameborder="0" width="100%" v-show="item.src===activeCard.src"></iframe> -->
</div>
</template>
<script>
export default {
name: "LayoutMain",
data() {
return {
}
},
components: {},
computed: {
cachedViews() {
return this.$store.state.app.cachedViews
},
}
}
</script>
<style scoped lang="less">
.main {
margin-top: 1px;
// background-color: #eceff1;
height: calc(100% - 37px);
overflow-y: auto;
overflow-x: hidden;
.ant-tabs-nav {
transition: color 0s cubic-bezier(0.645, 0.045, 0.355, 1) !important;
}
.ant-tabs-tab {
transition: color 0s cubic-bezier(0.645, 0.045, 0.355, 1) !important;
}
.main-content {
border : 1px solid #e8e8e8;
background-color: #ffffff;
margin: 5px;
height: calc(100% - 10px);
width: calc(100% - 10px);
overflow-y: auto;
overflow-x: hidden;
}
}
</style>
<template>
<div class="navbar">
<a-breadcrumb id="breadcrumb-container" class="breadcrumb-container">
<a-breadcrumb-item>Home</a-breadcrumb-item>
<a-breadcrumb-item>List</a-breadcrumb-item>
<a-breadcrumb-item>App</a-breadcrumb-item>
</a-breadcrumb>
</div>
</template>
<script>
export default {
name: "LayoutNavbar",
computed: {
},
data() {
return {
}
},
mounted() {
},
methods: {
},
watch: {
},
}
</script>
<style lang="scss" scoped>
.navbar {
padding: 5px 10px;
height: 35px;
overflow: hidden;
position: relative;
background: #fff;
box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
.breadcrumb-container {
float: left;
}
}
</style>
<template>
<a-menu :selectedKeys="activeKeys" :openKeys="openKeys" mode="inline" @openChange="openChange">
<template v-for="item1 in menuList">
<a-menu-item v-if="item1.children!== undefined && item1.children.length === 0" :key="item1.id" @click="clickMenuItem(item1)">
<a-icon :type="item1.icon" />
<span>{{item1.name}}</span>
</a-menu-item>
<a-sub-menu v-else :key="item1.id">
<span slot="title">
<a-icon :type="item1.icon" /><span>{{item1.name}}</span>
</span>
<a-menu-item v-for="item2 in item1.children" :key="item2.id" @click="clickMenuItem(item2)">
<a-icon :type="item2.icon" v-if="item2.icon" />
<span>{{item2.name}}</span>
</a-menu-item>
</a-sub-menu>
</template>
</a-menu>
</template>
<script>
import { mapMutations } from "vuex";
export default {
name: "LayoutSider",
data () {
return {
theme: 'dark',
menuList:[]
};
},
created () {
},
computed: {
openKeys: {
get () {
return this.$store.state.app.openKeys
},
set () {
}
},
activeKeys: {
get () {
return this.$store.state.app.activeKeys
},
},
set () {
}
},
methods: {
...mapMutations(`app`, [`addCard`]),
openChange (openKeys) {
// this.openKeys = [];
// if (openKeys.length > 0) {
// this.openKeys.push(openKeys[openKeys.length - 1]);
// };
this.openKeys = openKeys
this.$store.commit('app/setOpenKeys', openKeys)
},
clickMenuItem (item) {
this.$store.commit('app/setActiveKeys', [item.id])
this.addCard({ title: item.name, key: item.id + '', code: item.code, keepAlive: item.keepAlive, router: item.frontActionUrl, closable: true })
},
changeMode () {
if (!this.collapsed) {
this.openKeys = [];
} else {
this.openKeys = this.$store.state.app.openKeys
}
this.$nextTick(() => {
this.collapsed = !this.collapsed;
this.$emit("changeCollapsed", this.collapsed);
})
},
},
}
</script>
<template>
<div class="tabs-block">
<div class="tabs-container">
<div class="tabs-scroller" :class="{'tabs-scroller-header':scrollShow}">
<span unselectable="unselectable" v-if="scrollShow" :class="{'tabs-scroller-show':scrollShow,'ant-tabs-tab-btn-disabled':lastLeft==0}" class="tabs-scroller-left" @click="prevItem">
<span class="ant-tabs-tab-prev-icon">
<a-icon type="left" />
</span>
</span>
<span unselectable="unselectable" v-if="scrollShow" :class="{'tabs-scroller-show':scrollShow,'ant-tabs-tab-btn-disabled':lastRight==0}" class="tabs-scroller-right" @click="nextItem">
<span class="ant-tabs-tab-next-icon">
<a-icon type="right" />
</span>
</span>
<div class="tabs-scroll" ref="tabsScroll">
<div class="tabs-nav" ref="tabsNav" :style="styleData">
<div class="tabs-panels" :class="{'tabs-wait':tabsActive!=item.key,'tabs-selected':tabsActive===item.key,'fixed-panels':item.key=='1'}" @click="tabclick(item)" v-for="(item,index) in tabsArray" :key="item.key">
<span class="ant-dropdown-trigger">{{item.title}}</span>
<a-icon type="close" class="tab-close-btn" onClick="event.cancelBubble = true" @click="tabClose(item,index)" v-if="item.closable" />
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "LayoutTabs",
data () {
return {
scrollShow: false,
lastLeft: 0,
lastRight: 0,
styleData: { transform: 'translate3d(0px, 0px, 0px)' }
}
},
created () {
window.addEventListener('resize', this.handleResize)
this.$nextTick(() => {
});
},
beforeDestroy: function () {
// window.removeEventListener('resize', this.handleResize)
},
computed: {
tabsActive () {
return this.$store.state.app.tabsActive
},
tabsArray () {
return this.$store.state.app.tabsArray
}
},
mounted () {
const _this = this;
const elementResizeDetectorMaker = require("element-resize-detector")
const erd = elementResizeDetectorMaker();
erd.listenTo(document.getElementsByClassName("tabs-nav"), function (element) {
_this.$nextTick(() => {
_this.handleResize()
});
});
},
methods: {
handleResize (event) {
let tabsScroll = this.$refs.tabsScroll
let tabsNav = this.$refs.tabsNav
if (tabsScroll && tabsNav) {
let scrollWidth = tabsScroll.offsetWidth
let navWidth = tabsNav.offsetWidth
if (scrollWidth < navWidth) {
this.scrollShow = true
this.lastRight = navWidth - scrollWidth
}
else
this.scrollShow = false
this.resetStyle()
}
},
tabclick (item) {
this.$router.push(item.router);
this.$store.commit('app/setTabsActive', item.key)
// this.$store.commit('app/setOpenKeys', [parseInt((item.key + '').substring(0, 2))])
this.$store.commit('app/setActiveKeys', [parseInt(item.key)])
},
tabClose (item, index) {
if (item.key == this.tabsActive) {
this.$router.push(this.$store.state.app.tabsArray[index - 1].router)
this.$store.commit('app/setTabsActive', this.$store.state.app.tabsArray[index - 1].key)
this.$store.commit('app/setActiveKeys', [parseInt(this.$store.state.app.tabsArray[index - 1].key)])
// this.$store.commit('app/setOpenKeys', [parseInt((this.$store.state.app.tabsArray[index - 1].key + '').substring(0, 2))])
}
this.$store.commit('app/closeTabs', index)
this.$store.commit('app/delCachedViews', item)
},
prevItem () {
if (this.lastLeft < 0) {
if ((this.lastLeft + 100) < 0) {
this.lastRight += 100
this.lastLeft += 100
}
else {
this.lastRight += -this.lastLeft
this.lastLeft = 0
}
this.styleData.transform = 'translate3d(' + this.lastLeft + 'px, 0px, 0px)'
}
},
nextItem () {
if (this.lastRight > 0) {
if ((this.lastRight - 100) > 0) {
this.lastLeft -= 100
this.lastRight -= 100
}
else {
this.lastLeft -= this.lastRight
this.lastRight = 0
}
this.styleData.transform = 'translate3d(' + this.lastLeft + 'px, 0px, 0px)'
}
},
resetStyle () {
this.lastLeft = 0
this.styleData.transform = 'translate3d(0px, 0px, 0px)'
},
}
}
</script>
<style lang="less" scoped>
.tabs-scroller,
.tabs-scroller-left,
.tabs-scroller-right,
.tabs-scroll,
.tabs-panels,
.tabs-selected,
.tabs-scroller-bottom .tabs li.tabs-selected a.tabs-inner,
.tabs-scroller-left .tabs li.tabs-selected a.tabs-inner,
.tabs-scroller-right .tabs li.tabs-selected a.tabs-inner {
border-color: #e8e8e8;
}
.tabs-block {
// z-index: 100000;
padding-bottom: 4px;
border-bottom: 1px solid #d4d4d4;
// -webkit-box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.12),0 0 2px 0 rgba(0, 0, 0, 0.04);
// box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12), 0 0 3px 0 rgba(0, 0, 0, 0.04);
}
.tabs-container {
z-index: 4;
font-size: 12px;
// background-color: #ffffff;
background: linear-gradient(to top, #e8e8e8 0, #ffffff 85%);
border-bottom: 1px solid #e8e8e8;
}
.tabs-scroller {
overflow: hidden;
position: relative;
margin-bottom: -1px;
border: 0px;
}
.tabs-scroller-header {
padding-right: 32px;
padding-left: 25px;
}
.tabs-scroller-show {
position: absolute;
width: 32px;
height: 100%;
opacity: 1;
pointer-events: auto;
}
.tabs-scroller-left {
cursor: pointer;
left: 0;
z-index: 2;
color: rgba(0, 0, 0, 0.45);
text-align: center;
background-color: transparent;
}
.tabs-scroller-right {
cursor: pointer;
right: 2px;
z-index: 2;
color: rgba(0, 0, 0, 0.45);
text-align: center;
background-color: transparent;
}
.ant-tabs-tab-btn-disabled {
cursor: not-allowed !important;
}
.tabs-scroll {
border: 0px;
width: 100%;
height: 25px;
margin-top: 5px;
padding-left: 2px;
overflow: hidden;
white-space: nowrap;
}
.tabs-nav {
border: 0px;
position: relative;
display: inline-block;
box-sizing: border-box;
margin: 0;
padding-left: 4px;
list-style: none;
transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
}
.tabs-panels {
clear: both;
cursor: pointer;
display: inline-block;
margin: 0 3px 0px 0;
height: 25px;
vertical-align: middle;
color: #0e2d5f;
border: 1px solid #d4d4d4;
-moz-border-radius: 5px 5px 0 0;
-webkit-border-radius: 5px 5px 0 0;
border-radius: 3px 3px 0 0;
text-align: center;
white-space: nowrap;
span {
margin: 2px 4px 2px 10px;
display: inline-block;
}
}
.fixed-panels {
display: inline-block;
padding-right: 5px !important;
}
.tab-close-btn {
font-size: 8px;
color: rgb(146, 5, 31);
position: relative !important;
top: -5px;
margin: 0 2px 0px 0px;
opacity: 0.5;
padding: 1px;
border: 1px solid #d4d4d4;
border-radius: 5px 5px 5px 5px;
}
.tabs-wait {
background: #fafafa;
// background: linear-gradient(to top, #e8e8e8 0, #ffffff 90%);
border-bottom: 1px solid #e8e8e8;
}
.tabs-selected {
background: #fff;
// background: linear-gradient(to top, #ffffff 0, #fcfcfd 100%) !important;
border-bottom: 1px solid #fff;
font-weight: bold;
}
</style>
<template>
<a-layout id="components-layout-demo-top-side">
<a-layout-header>
<LayoutHeader />
</a-layout-header>
<a-layout>
<a-layout-sider width="200" style="background:#fff">
<LayoutSider />
</a-layout-sider>
<div class="center-splitter">
<div class="x-collapse">&nbsp;</div>
</div>
<a-layout-content :style="{ background:'#fff',margin: 0}">
<LayoutTabs />
<LayoutMain />
</a-layout-content>
</a-layout>
</a-layout>
</template>
<script>
import LayoutHeader from "@/components/layout/components/LayoutHeader";
import LayoutSider from "@/components/layout/components/LayoutSider";
import LayoutNavbar from "@/components/layout/components/LayoutNavbar";
import LayoutTabs from "@/components/layout/components/LayoutTabs";
import LayoutMain from "@/components/layout/components/LayoutMain";
export default {
name: "Layout",
components: { LayoutHeader, LayoutSider, LayoutNavbar, LayoutTabs, LayoutMain },
data () {
return {
};
},
created () {
},
computed: {
},
methods: {
}
};
</script>
<style lang="less" scoped>
.ant-layout-header {
padding: 0 !important;
// height: 50px !important;
// line-height: 50px !important;
overflow: hidden;
position: relative;
// background: linear-gradient(to top, #e8e8e8 0, #ffffff 85%)!important;
background: #fff !important;
box-shadow: #e8e8e8 0px 1px 5px;
}
.ant-layout-has-sider {
height: calc(100vh - 65px);
margin: 5px 0px 0px 0px;
}
.center-splitter {
width: 4px;
height: 100%;
margin: 0px;
}
.x-collapse {
position: absolute;
cursor: pointer;
background-color: transparent;
background-repeat: no-repeat !important;
background: no-repeat top right;
background-image: url(../../../static/images/mini-left.gif);
top: 50%;
margin-top: -17px;
width: 4px;
height: 35px;
}
.ant-layout-sider {
overflow-y: auto;
overflow-x: hidden;
}
.ant-menu-root {
border: 1px solid #dedede;
height: 100%;
border-radius: 0px 2px 0px 0px;
}
.ant-layout-content {
border: 1px solid #dedede;
height: 100%;
}
.ant-menu .ant-menu-submenu-selected .ant-menu-submenu-title {
border-left: 3px solid #1890ff;
}
</style>
<style scoped lang="less">
</style>
\ No newline at end of file
......@@ -2,7 +2,7 @@
import Vue from 'vue'
import VueRouter from 'vue-router'
// import Layout from '@/components/layout'
import Layout from '@/components/layoutNew/Layout.vue'
import Layout from '@/components/layout/Layout.vue'
import store from '@/store'
import { getToken, removeToken, getType, setType } from '@/views/utils/auth'
// 进度条
......
<template>
<div class="app-content">
<div class="card-left border-style">
<div class="holder-photo"><img alt="" src="https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png">
<div class="holder-name">
<!-- <a title="修改" style="text-decoration:none;" href="#">[修改]</a> -->
</div>
</div>
<div class="holder-info">
<a-row>
<a-col :span="6" class="title">
邮 箱
</a-col>
<a-col :span="18">
{{personInfo.email}}
</a-col>
</a-row>
<a-row>
<a-col :span="6" class="title">
手机号
</a-col>
<a-col :span="18">
{{personInfo.mobile}}
<!-- <a title="修改" style="text-decoration:none;" href="#">[修改]</a> -->
</a-col>
</a-row>
<a-divider dashed />
<a-row>
<a-col :span="6" class="title">
姓 名
</a-col>
<a-col :span="18">
{{personInfo.personName}}
</a-col>
</a-row>
<a-row>
<a-col :span="6" class="title">
性 别
</a-col>
<a-col :span="18">
{{personInfo.sex}}
</a-col>
</a-row>
<a-row>
<a-col :span="6" class="title">
生 日
</a-col>
<a-col :span="18">
{{personInfo.birthday}}
</a-col>
</a-row>
<a-row>
<a-col :span="6" class="title">
证件号
</a-col>
<a-col :span="18">
{{personInfo.certId}}
</a-col>
</a-row>
</div>
</div>
<div class="card-right border-style">
<a-spin :spinning="loading" style="width: 100%;height: 100%;">
<a-tabs :activeKey="tabsActive" @tabClick="tabclick">
<a-tab-pane key="1" tab="设置">
</a-tab-pane>
<a-tab-pane key="2" tab="消息" force-render>
</a-tab-pane>
</a-tabs>
<div v-show="tabsActive!='1'">
<a-empty />
</div>
<div v-show="tabsActive=='1'">
<a-form-model ref="form" :model="formData" :rules="rules">
<a-form-model-item label="姓 名" prop="personName">
<a-input v-model="formData.personName" :maxLength="30" style="width:180px;" />
</a-form-model-item>
<a-form-model-item label="民 族" prop="nation">
<para-select v-model="formData.nation" :width="180" :typeId="11" />
</a-form-model-item>
<a-form-model-item label="学 历" prop="education">
<para-select v-model="formData.education" :width="180" :typeId="8" />
</a-form-model-item>
<a-form-model-item label="职 称" prop="title">
<para-multi-select :width="180" v-model="formData.title" :typeId="7" />
</a-form-model-item>
<a-form-model-item label="专 业" prop="spec">
<para-multi-select :width="180" v-model="formData.spec" :typeId="57" />
</a-form-model-item>
<a-form-model-item label="邮 箱" prop="email">
<a-input v-model="formData.email" :maxLength="30" style="width:180px;" />
</a-form-model-item>
<a-row>
<a-col style="text-align: center;width:100%;">
<a-button type="primary" style="width:50%;" @click="submit">保存</a-button>
</a-col>
</a-row>
</a-form-model>
</div>
</a-spin>
</div>
</div>
</template>
<script>
import { isEmptyParams, hideIdCard, hidePhone, checkEmail } from "@/views/utils/common"
import paraMultiSelect from '@/views/components/common/paraMultiSelect'
import paraSelect from '@/views/components/common/paraSelect'
import moment from 'moment'
export default {
name: 'personInfo',
components: {
paraMultiSelect, paraSelect
},
data () {
return {
tabsActive: '1',
personInfo: {
id: null, certId: null, personName: null, sex: null, birthday: null, nation: null, title: null, education: null, spec: null, mobile: null, email: null,
},
formData: {
id: null, personName: null, nation: null, title: null, education: null, spec: null, email: null,
},
rules: {
personName: [{ required: true, message: '请输入姓名', trigger: 'blur' },],
nation: [{ required: false, message: '请选择民族', trigger: 'change' }],
title: [{ required: false, message: '请选择职称', trigger: 'change' }],
education: [{ required: false, message: '请选择学历', trigger: 'change' }],
spec: [{ required: false, message: '请选择专业', trigger: 'change' }],
email: [{ required: false, validator: checkEmail, trigger: 'blur' }],
},
loading: false
}
},
created () {
this.getUserInfo()
},
methods: {
moment,
tabclick (key) {
this.tabsActive = key
},
getUserInfo () {
this.$api.person.getUserInfo().then(({ data = {} }) => {
if (data) {
this.personInfo = data
this.personInfo.birthday = moment(this.personInfo.birthday).format('YYYY-MM-DD')
this.initformData()
}
}).catch(() => { })
},
submit () {
this.$refs.form.validate(valid => {
if (valid) {
this.loading = true
let pars = isEmptyParams(this.formData)
let par = { ...pars }
this.$api.person.updatePerson(par).then(({ data = {} }) => {
if (data) {
this.$message.success('修改成功!')
this.getCurrentPersonInfo()
}
this.loading = false
}).catch(() => { this.loading = false })
} else {
return false;
}
});
},
initformData () {
this.formData = {
id: this.personInfo.id,
personName: this.personInfo.personName,
nation: this.personInfo.nation,
title: this.personInfo.title,
education: this.personInfo.education,
spec: this.personInfo.spec,
email: this.personInfo.email,
}
},
getCurrentPersonInfo () {
Object.assign(this.personInfo, this.formData)
}
}
}
</script>
<style scoped lang="less">
.app-content {
padding: 10px 8px 10px 8px;
min-width: 920px;
.border-style {
border-radius: 4px;
border: 1px solid #e6ebf5;
background-color: #ffffff;
overflow: hidden;
color: #303133;
-webkit-transition: 0.3s;
transition: 0.3s;
}
.card-left {
float: left;
width: 300px;
height: 600px;
margin-right: 6px;
.holder-photo {
margin: 20px 0px 10px 0px;
text-align: center;
}
.holder-photo > img {
width: 104px;
height: 104px;
margin-bottom: 10px;
}
.holder-info {
padding: 0px 10px 0px 10px;
.ant-row .ant-col {
padding: 3px 5px 3px 5px;
}
}
.title {
text-align: right;
}
}
.card-right {
float: left;
width: calc(100% - 320px);
min-width: 600px;
min-height: 200px;
padding: 0px 15px 15px 15px;
.ant-form-item {
margin-bottom: 6px;
}
::v-deep .ant-row {
.ant-col {
display: inline-block;
}
.ant-form-item-label {
width: 70px;
}
.ant-form-item-control-wrapper {
width: calc(100% - 70px);
}
.ant-form-explain {
margin-left: 5px;
display: inline-block;
}
}
}
}
</style>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment