yujialong 12 months ago
parent 00f2117db3
commit 8d7049ec42
  1. 14
      src/api/index.js
  2. 75
      src/const/column.js
  3. 10926
      src/const/modules.js
  4. 44
      src/const/user.js
  5. 20
      src/pages/activity/add/index.vue
  6. 38
      src/pages/activity/list/index.vue
  7. 11
      src/pages/activity/manage/index.vue
  8. 27
      src/pages/activity/manage/matchSignup.vue
  9. 457
      src/pages/article/add/editor.js
  10. 1731
      src/pages/article/add/index.vue
  11. 521
      src/pages/article/list/index.vue
  12. 186
      src/pages/preschool/audit/index.vue
  13. 246
      src/pages/preschool/list/index.vue
  14. 51
      src/pages/user/detail/index.vue
  15. 145
      src/pages/user/list/index.vue
  16. 2
      src/router/permission.js

@ -1,5 +1,6 @@
import Setting from '@/setting'
const host = Setting.apiBaseURL
let host1 = 'http://192.168.31.51:10010/'
export default {
logins: `users/users/user/login`,
@ -15,12 +16,15 @@ export default {
backgroundActivityList: `competition/competition/management/backgroundActivityList`,
addCompetition: `competition/competition/management/addCompetition`,
batchDeleteCompetition: `competition/competition/management/batchDeleteCompetition`,
checkTheStatusOfTheCompetition: `competition/competition/management/checkTheStatusOfTheCompetition`,
disabledEventsCompetition: `competition/competition/management/disabledEvents`,
editCompetition: `competition/competition/management/editCompetition`,
getCompetition: `competition/competition/management/getCompetition`,
getProjectAssessmentByCompetition: `occupationlab/occupationlab/projectManage/getProjectAssessmentByCompetition`,
publishCompetition: `competition/competition/management/publishCompetition`,
detailsOfCompetitionStage: `competition/competition/management/detailsOfCompetitionStage`,
entryInformation: `competition/competition/team/entryInformation`,
queryRegistrationByCondition: `competition/competition/registration/queryRegistrationByCondition`,
delCertification: `users/enterprise/certification/batchDeletion`,
findCertification: `users/enterprise/certification/findById`,
selectEnterpriseCertificationList: `users/enterprise/certification/selectEnterpriseCertificationList`,
queryUserInfoList: `${host1}users/users/userAccount/queryUserInfoList`,
viewUserDetails: `${host1}users/users/userAccount/viewUserDetails`,
}

@ -1,75 +0,0 @@
/**
* 栏目配置
* */
export default {
// 栏目类型
types: [
{
id: 1,
name: '常规栏目'
},
{
id: 2,
name: '跳转链接'
},
{
id: 3,
name: '长页栏目'
},
{
id: 4,
name: '子级优先栏目'
}
],
// 出版物类型
publicationTypes: [
{
id: 1,
name: '科技图书'
},
{
id: 2,
name: '科技期刊'
},
{
id: 3,
name: '专利文献'
},
{
id: 4,
name: '会议文献'
},
{
id: 5,
name: '科技报告'
},
{
id: 6,
name: '政府出版物'
},
{
id: 7,
name: '学位论文'
},
{
id: 8,
name: '标准文献'
},
{
id: 9,
name: '产品资料和其它'
}
],
// 专利类别
patentClasses: [
{
id: 1,
name: '发明专利'
},
{
id: 2,
name: '实用外观'
}
]
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,44 @@
/**
* 栏目配置
* */
export default {
// 角色
platformSource: [
{
id: '',
name: '不限'
},
{
id: 7,
name: '个人'
},
{
id: 5,
name: '幼儿园'
},
{
id: 6,
name: '供应商'
},
],
// 认证状态
auditStatus: [
{
id: null,
name: '不限'
},
{
id: 0,
name: '默认待审核'
},
{
id: 1,
name: '通过'
},
{
id: 2,
name: '驳回'
},
],
}

@ -1,6 +1,6 @@
<template>
<div class="page">
<div class="page-content">
<div class="page"
style="padding-bottom: 70px">
<el-form label-width="170px"
label-suffix=":"
class="input-form model"
@ -136,7 +136,7 @@
label="报名人数上限">
<div class="input-center">
<el-input placeholder="请输入人数"
v-model.number="form.maximumNumber"
v-model.number="form.quantityLimit"
type="number"></el-input>
</div>
</el-form-item>
@ -156,6 +156,7 @@
:label="1">需要</el-radio>
<el-input style="width: 250px"
placeholder="请输入4位邀请码或点击随机生成"
maxlength="4"
v-model="form.invitationCode"
:disabled="form.isNeedCode === 0"></el-input>
<el-button v-if="form.isNeedCode === 1"
@ -186,7 +187,6 @@
<el-button @click="back">取消</el-button>
</div>
</div>
</div>
</template>
<script>
@ -200,6 +200,7 @@ export default {
data () {
return {
id: this.$route.query.id || '',
name: this.$route.query.name,
headers: {
token: Util.local.get(Setting.tokenKey)
},
@ -208,7 +209,6 @@ export default {
form: {
id: this.$route.query.id || '',
founder: 1,
maximumNumber: '',
carouselUrl: '',
coverUrl: '',
competitionAnnexList: [], //
@ -225,7 +225,9 @@ export default {
whetherToShowApplicants: '1',
reportingPlace: '',
competitionRangeList: [],
competitionRegistration: {}
competitionRegistration: {},
createSource: 0,
quantityLimit: ''
},
competitionScope: [],
scopes: [
@ -315,7 +317,7 @@ export default {
route: '/activity'
},
{
name: '创建活动'
name: this.id ? this.name : '创建活动'
},
])
this.getData()
@ -333,6 +335,7 @@ export default {
data.competitionScope = 1
} else if (data.competitionScope !== 1) {
this.competitionScope = data.competitionScope.split(',').map(e => +e)
data.competitionScope = 0
}
//
const fileList = data.competitionAnnexList
@ -378,7 +381,7 @@ export default {
uploadAnnexSuccess (file) {
const url = file.url
const data = {
activityId: this.form.id || '',
competitionId: this.form.id || '',
fileName: file.name,
name: file.name,
filePath: url,
@ -428,6 +431,7 @@ export default {
if (!form.playStartTime) return Util.warningMsg("请选择举办时间");
if (playStartTime && signUpEndTime && playStartTime < signUpEndTime) return Util.warningMsg("举办时间不能早于报名结束时间");
if (form.isNeedCode && (!form.invitationCode || form.invitationCode.length !== 4)) return Util.warningMsg('请填写四位数邀请码')
if (!form.quantityLimit) return Util.warningMsg('请填写报名人数上限')
if (!form.description) return Util.warningMsg("请填写活动详情");
}
form.publishStatus = status

@ -26,7 +26,8 @@
clearable></el-date-picker>
</li>
<li>
<el-input placeholder="请输入活动名称/创建人"
<el-input style="width: 200px"
placeholder="请输入活动名称/创建人"
suffix-icon="el-icon-search"
v-model="keyword"
clearable />
@ -93,16 +94,12 @@
<el-table-column prop="founderName"
label="创建人"
align="center"></el-table-column>
<el-table-column prop="name"
label="大赛来源"
<el-table-column prop="createSource"
label="活动来源"
width="120"
align="center">
<template slot-scope="scope">
<!-- {{ sourceList.find(e => e.id === scope.row.platformSource).name }} -->
</template>
</el-table-column>
<el-table-column prop="range"
label="大赛范围"
align="center"></el-table-column>
<el-table-column prop="competitionScope"
label="活动范围"
align="center"></el-table-column>
<el-table-column prop="applicantNum"
label="报名人数"
@ -168,25 +165,8 @@ export default {
data () {
return {
keyword: "",
sourceList: [
{
id: "",
name: "不限"
},
{
id: 0,
name: "平台创建"
},
{
id: 1,
name: "院校创建"
}
],
sourceList: [],
rangeList: [
{
id: "",
name: "不限"
},
{
id: 6,
name: "供应商"
@ -304,7 +284,7 @@ export default {
this.$refs.table.clearSelection();
this.initData();
},
//
//
sourceChange (val) {
this.initData()
},

@ -1,13 +1,5 @@
<template>
<!-- 活动管理 -->
<div>
<el-card shadow="hover"
class="m-b-20">
<div class="flex-between">
<el-page-header @back="back"
:content="name + '/管理'"></el-page-header>
</div>
</el-card>
<div class="page"
style="margin-bottom: 24px">
<div class="tabs">
@ -21,7 +13,6 @@
ref="detail" />
<MatchSignup v-else-if="active == 'tab2'" />
</div>
</div>
</template>
@ -89,7 +80,7 @@ export default {
// tab
tabSwitch (i) {
this.active = i
this.$router.push(`manageDetail?id=${this.$route.query.id}&tab=${i}&name=${this.name}`)
this.$router.push(`/activity/manage?id=${this.$route.query.id}&tab=${i}&name=${this.name}`)
},
// tab
backOrTab (i) {

@ -6,7 +6,7 @@
<ul class="filter">
<li>
<label>搜索</label>
<el-input placeholder="请输入姓名/手机号/学号"
<el-input placeholder="请输入姓名/手机号/团队名称/学号"
prefix-icon="el-icon-search"
v-model="keyword"
clearable
@ -14,7 +14,7 @@
style="width: 250px"></el-input>
</li>
<li>
<label>报名人员状态</label>
<label>参数人员状态</label>
<el-select v-model="isDisable"
@change="initData">
<el-option v-for="(item, i) in statusList"
@ -25,9 +25,9 @@
</li>
</ul>
<div>
<el-button type="primary"
<!-- <el-button type="primary"
round
@click="exportAll">批量导出</el-button>
@click="exportAll">批量导出</el-button> -->
</div>
</div>
@ -52,19 +52,16 @@
</template>
</el-table-column>
<el-table-column prop="schoolName"
label="学校"
label="组织名称"
sortable="custom">
</el-table-column>
<el-table-column prop="username"
label="姓名">
</el-table-column>
<el-table-column prop="workNumber"
label="学号/工号">
</el-table-column>
<el-table-column prop="phone"
label="手机号">
</el-table-column>
<el-table-column label="操作"
<!-- <el-table-column label="操作"
align="center"
width="320">
<template slot-scope="scope">
@ -77,7 +74,7 @@
style="margin-left: 5px"
@change="switchOff($event,scope.row,scope.$index)"></el-switch>
</template>
</el-table-column>
</el-table-column> -->
</el-table>
<div class="pagination">
<el-pagination background
@ -136,15 +133,15 @@ export default {
},
methods: {
getData () {
this.$post(this.api.ApplicantsList, {
this.$post(this.api.queryRegistrationByCondition, {
pageNum: this.page,
pageSize: this.pageSize,
activityId: this.id,
keyWords: this.keyword,
competitionId: this.id,
keyWord: this.keyword,
isDisable: this.isDisable,
}).then(({ data }) => {
this.listData = data.data.records;
this.total = data.data.total;
this.listData = data.records;
this.total = data.total;
}).catch(res => {
});
},

@ -1,457 +0,0 @@
import Axios from 'axios'
import Api from '@/api'
import Setting from '@/setting'
import Util from '@/libs/util'
export default {
//skin:'oxide-dark',
language:'zh_CN',
language_url: './styles/tinymce/langs/zh_CN.js',
plugins: 'print powerpaste preview searchreplace autolink directionality visualblocks visualchars fullscreen image link media template advcode codesample table charmap hr pagebreak nonbreaking anchor insertdatetime advlist lists wordcount imagetools textpattern help emoticons autosave autoresize formatpainter',
toolbar: 'code undo redo restoredraft | cut copy powerpaste pastetext | forecolor backcolor headings fontsize lineHeight bold italic underline strikethrough link anchor | alignleft aligncenter alignright alignjustify | \
styleselect fontselect fontsizeselect | bullist numlist | blockquote subscript superscript removeformat | \
table image media charmap emoticons hr pagebreak insertdatetime print preview | fullscreen | indent2em formatpainter',
style_formats: [
//新增 首行缩进与行高 配置
{
title: '首行缩进',
block: 'p',
styles: {
'text-indent': '2em'
}
},
{
title: '行高',
items: [{
title: '1',
styles: {
'line-height': '1'
},
inline: 'span'
},
{
title: '1.5',
styles: {
'line-height': '1.5'
},
inline: 'span'
},
{
title: '2',
styles: {
'line-height': '2'
},
inline: 'span'
},
{
title: '2.5',
styles: {
'line-height': '2.5'
},
inline: 'span'
},
{
title: '3',
styles: {
'line-height': '3'
},
inline: 'span'
}
]
},
//默认的配置
{
title: 'headings',
items: [
{
title: 'Heading 1',
format: 'h1'
},
{
title: 'Heading 2',
format: 'h2'
},
{
title: 'Heading 3',
format: 'h3'
},
{
title: 'Heading 4',
format: 'h4'
},
{
title: 'Heading 5',
format: 'h5'
},
{
title: 'Heading 6',
format: 'h6'
}
]
},
{
title: 'Inline',
items: [
{
title: 'Bold',
icon: 'bold',
format: 'bold'
},
{
title: 'Italic',
icon: 'italic',
format: 'italic'
},
{
title: 'Underline',
icon: 'underline',
format: 'underline'
},
{
title: 'Strikethrough',
icon: 'strikethrough',
format: 'strikethrough'
},
{
title: 'Superscript',
icon: 'superscript',
format: 'superscript'
},
{
title: 'Subscript',
icon: 'subscript',
format: 'subscript'
},
{
title: 'Code',
icon: 'code',
format: 'code'
}
]
},
{
title: 'Blocks',
items: [
{
title: 'Paragraph',
format: 'p'
},
{
title: 'Blockquote',
format: 'blockquote'
},
{
title: 'Div',
format: 'div'
},
{
title: 'Pre',
format: 'pre'
}
]
},
{
title: 'Alignment',
items: [
{
title: 'Left',
icon: 'alignleft',
format: 'alignleft'
},
{
title: 'Center',
icon: 'aligncenter',
format: 'aligncenter'
},
{
title: 'Right',
icon: 'alignright',
format: 'alignright'
},
{
title: 'Justify',
icon: 'alignjustify',
format: 'alignjustify'
}
]
}
],
promotion: false,
branding: false,
width: 940,
height: 650, //编辑器高度
// min_height: 400,
max_height: 650,
content_css: [ //可设置编辑区内容展示的css,谨慎使用
'./styles/css/editor.css',
],
// content_style: Style,
fontsize_formats: '12px 14px 16px 19px 24px 36px 48px 56px 72px',
font_formats: '苹果苹方=PingFang SC,Microsoft YaHei,sans-serif;宋体=simsun,serif;微软雅黑=Microsoft YaHei,Helvetica Neue,PingFang SC,sans-serif;仿宋体=FangSong,serif;黑体=SimHei,sans-serif;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats;知乎配置=BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, WenQuanYi Micro Hei, sans-serif;小米配置=Helvetica Neue,Helvetica,Arial,Microsoft Yahei,Hiragino Sans GB,Heiti SC,WenQuanYi Micro Hei,sans-serif',
link_list: [
{ title: '预置链接1', value: 'http://www.tinymce.com' },
{ title: '预置链接2', value: 'http://tinymce.ax-z.cn' }
],
image_list: [
{ title: '预置图片1', value: 'https://www.tiny.cloud/images/glyph-tinymce@2x.png' },
{ title: '预置图片2', value: 'https://www.baidu.com/img/bd_logo1.png' }
],
image_class_list: [
{ title: 'None', value: '' },
{ title: 'Some class', value: 'class-name' }
],
//importcss_append: true,
//自定义文件选择器的回调内容
file_picker_callback: function (callback, value, meta) {
if (meta.filetype === 'file') {
callback('https://www.baidu.com/img/bd_logo1.png', { text: 'My text' });
}
if (meta.filetype === 'image') {
callback('https://www.baidu.com/img/bd_logo1.png', { alt: 'My alt text' });
}
if (meta.filetype === 'media') {
callback('movie.mp4', { source2: 'alt.ogg', poster: 'https://www.baidu.com/img/bd_logo1.png' });
}
},
//为内容模板插件提供预置模板
templates: [
{ title: '中文文章模板1', description: '图片文字流', content: `
<div class="tiny-wrap">
<div class="block">
<div class="fl">
<img class="pic" src="images/default.png"/>
<p class="img-des">图片描述</p>
</div>
<div class="texts">
<p>S³FEL主要由一台超导直线加速器波荡器光束线和实验站组成可产生重复频率达1MHz电子束能量达2.5 GeV的软X 射线自由电子激光可在百飞秒内级实现原子分子及外壳层电子结构的无损动态监测是科学家认识和了解物质微观结构及动态变化的高速摄像机S³FEL为科学家和企业用户提供了一种具有超高时间分辨空间分辨和能量分辨的新方法新技术 S³FEL在量子材料能源催化生物医药大气与星际科学原子分子科学等领域的应用研究将为促进我国战略性新兴产业创新发展和关键S³FEL主要由一台超导直线加速器波荡器光束线和实验站组成可产生重复频率达1MHz电子束能量达2.5 GeV的软X 射线自由电子激光可在百飞秒内级实现原子分子及外壳层电子结构的无损动态监测是科学家认识和了解物质微观结构及动态变化的高速摄像机S³FEL为科学家和企业用户提供了一种具有超高时间分辨空间分辨和能量分辨的新方法新技术 S³FEL在量子材料能源催化生物医药大气与星际科学原子分子科学等领域的应用研究将为促进我国战略性新兴产业创新发展和关键S³FEL主要由一台超导直线加速器波荡器光束线和实验站组成可产生重复频率达1MHz电子束能量达2.5 GeV的软X 射线自由电子激光可在百飞秒内级实现原子分子及外壳层电子结构的无损动态监测是科学家认识和了解物质微观结构及动态变化的高速摄像机S³FEL为科学家和企业用户提供了一种具有超高时间分辨空间分辨和能量分辨的新方法新技术 S³FEL在量子材料能源催化生物医药大气与星际科学原子分子科学等领域的应用研究将为促进我国战略性新兴产业创新发展和关键S³FEL主要由一台超导直线加速器波荡器光束线和实验站组成可产生重复频率达1MHz电子束能量达2.5 GeV的软X 射线自由电子激光可在百飞秒内级实现原子分子及外壳层电子结构的无损动态监测是科学家认识和了解物质微观结构及动态变化的高速摄像机S³FEL在量子材料能源催化生物医药大气与星际科学原子分子科学等领域的应用研究将为促进我国战略性新兴产业创新发展和关键S³FEL主要由一台超导直线加速器波荡器光束线和实验站组成可产生重复频率达1MHz电子束能量达2.5 GeV的软X 射线自由电子激光可在百飞秒内级实现原子分子及外壳层电子结构的无损动态监测是科学家认识和了解物质微观结构及动态变化的高速摄像机
</p>
</div>
</div>
<div class="block">
<div class="fr">
<img class="pic" src="images/default.png"/>
<p class="img-des">图片描述</p>
</div>
<div>
<p>集聚世界前沿和原创性科学技术及产业研发将推动一批高水平大学和科研机构的科技人才队伍建设及相关学科的高质量发展营造粤港澳大湾区人才高地并助力粤港澳大湾区国际科技创新中心的建设此外 S³FEL作为重要的科普教育基地</p>
<p>S³FEL汇聚并培养信息生命材料能源等学科领域的国际水平科技领军人才集聚世界前沿和原创性科学技术及产业研发将推动一批高水平大学和科研机构的科技人才队伍建设及相关学科的高质量发展营造粤港澳大湾区人才高地并助力粤港澳大湾区国际科技创新中心的建设此外 S³FEL作为重要的科普教育基地是展示我国科技实力提高全民族科学素质和民族自信的重要宣传窗口 S³FEL主体建筑将成为深圳市地标式建筑促进提升深圳市的城市形象和国际化知名度S³FEL汇聚并培养信息生命材料能源等学科领域的国际水平科技领军人才集聚世界前沿和原创性科学技术及产业研发将推动一批高水平大学和科研机构的科技人才队伍建设及相关学科的高质量发展营造粤港澳大湾区人才高地并助力粤港澳大湾区国际科技创新中心的建设此外 S³FEL作为重要的科普教育基地是展示我国科技实力提高全民族科学素质和民族自信的重要宣传窗口 S³FEL主体建筑将成为深圳市地标式建筑促进提升深圳市的城市形象和国际化知名度S³FEL汇聚并培养信息生命材料能源等学科领域的国际水平科技领军人才集聚世界前沿和原创性科学技术及产业研发将推动一批高水平大学和科研机构的科技人才队伍建设及相关学科的高质量发展营造粤港澳大湾区人才高地并助力粤港澳大湾区国际科技创新中心的建设此外 S³FEL作为重要的科普教育基地是展示我国科技实力提高全民族科学素质和民族自信的重要宣传窗口 S³FEL主体建筑将成为深圳市地标式建筑促进提升深圳市的城市形象和国际化知名度</p>
</div>
</div>
</div>
`
},
{ title: '英文文章模板1', description: '图片文字流', content: `
<div class="tiny-wrap">
<div class="block en-block">
<div class="fr">
<img class="pic" src="images/default.png"/>
<p class="img-des">Picture description</p>
</div>
<div>
<p>One of the major barriers to treating pain effectively is rooted in providers fear of killing their patients. This includes caregivers who may be family or friends. In a 2014 study I led of nonprofessional hospice caregivers, we found that the majority of pain medication errors caregivers made involved administering less than the prescribed dose, which makes it difficult for patients to achieve optimal pain relief.</p>
<p>Meanwhile, more than 11 million Americans  often family members or friends provide unpaid care for people with Alzheimer's or other dementias, according to calculations by the Alzheimers Association. In 2021, caregivers for people with Alzheimers or other dementias provided an estimated 16 billion hours of unpaid care valued at nearly $272 billion.My father took her to the emergency room. A doctor found a severe knee infection and took her into surgery. She was hospitalized for two weeks, followed by two months of rehabilitation at a skilled nursing facility.</p>
<p>If you heated the salt on your kitchen table up to 801 C (1,474 F), it would melt, and youd have molten salt. However, for making and storing energy, not just any salt will do. Scientists are exploring different combinations of salts to get the exact properties needed to cool and fuel a nuclear power reactor efficiently for decades. These properties include lower melting temperatures, the right consistency, and the ability to absorb high amounts of heat, among others.</p>
<div class="quote">We used experimental results to validate our simulation. At the same time, the simulation results provided us more details about which salts to study further. They work with each other. Jicheng Guo, chemical engineer at Argonne National Laboratory</div>
<p>Which molten salt blueprints will deliver the desired traits for a nuclear reactor? The potential variations are nearly endless. The study set out to determine whether computer simulations driven by machine learning could guide and refine real-world experiments at the Advanced Photon Source (APS), a DOE Office of Science user facility at Argonne. The results were recently published in the journal Physical Review B.</p>
<p>We used experimental results from the APS to validate our simulation. At the same time, the simulation results provided us more details about which salts to study further. They work with each other, said Jicheng Guo, a chemical engineer at Argonne and the papers lead author. This allows us to study multiple compositions at the same time.</p>
</div>
</div>
</div>
`
},
{ title: '新闻模板', description: '', content: `
<div class="tiny-wrap">
<div class="block" style="margin-bottom: 70px;">
<div class="fr">
<img class="pic" src="images/default.png"/>
<p class="img-des">图片描述</p>
</div>
<div>
<p style="text-indent: 2em">S³FEL汇聚并培养信息生命材料能源等学科领域的国际水平科技领军人才集聚世界前沿和原创性科学技术及产业研发将推动一批高水平大学和科研机构的科技人才队伍建设及相关学科的高质量发展营造粤港澳大湾区人才高地并助力粤港澳大湾区国际科技创新中心的建设此外 S³FEL作为重要的科普教育基地是展示我国科技实力提高全民族科学素质和民族自信的重要宣传窗口 S³FEL主体建筑将成为深圳市地标式建筑促进提升深圳市的城市形象和国际化知名度S³FEL汇聚并培养信息生命材料能源等学科领域的国际水平科技领军人才集聚世界前沿和原创性科学技术及产业研发将推动一批高水平大学和科研机构的科技人才队伍建设及相关学科的高质量发展营造粤港澳大湾区人才高地并助力粤港澳大湾区国际科技创新中心的建设此外 S³FEL作为重要的科普教育基地是展示我国科技实力提高全民族科学素质和民族自信的重要宣传窗口 S³FEL主体建筑将成为深圳市地标式建筑促进提升深圳市的城市形象和国际化知名度S³FEL汇聚并培养信息生命材料能源等学科领域的国际水平科技领军人才集聚世界前沿和原创性科学技术及产业研发将推动一批高水平大学和科研机构的科技人才队伍建设及相关学科的高质量发展营造粤港澳大湾区人才高地并助力粤港澳大湾区国际科技创新中心的建设此外 S³FEL作为重要的科普教育基地是展示我国科技实力提高全民族科学素质和民族自信的重要宣传窗口 S³FEL主体建筑将成为深圳市地标式建筑促进提升深圳市的城市形象和国际化知名度</p>
<div class="quote">
Here is a long quotation here is a long quotation here is a long quotation
here is a long quotation here is a long quotation here is a long quotation
here is a long quotation here is a long quotation here is a long quotation.
</div>
</div>
</div>
<div class="block">
<div class="img-wrap">
<img class="pic" src="images/default.png"/>
<p class="img-des">图片描述</p>
</div>
<div class="texts">
<h6 class="tiny-title">小标题</h6>
<p style="text-indent: 2em">S³FEL主要由一台超导直线加速器波荡器光束线和实验站组成可产生重复频率达1MHz电子束能量达2.5 GeV的软X 射线自由电子激光可在百飞秒内级实现原子分子及外壳层电子结构的无损动态监测是科学家认识和了解物质微观结构及动态变化的高速摄像机S³FEL为科学家和企业用户提供了一种具有超高时间分辨空间分辨和能量分辨的新方法新技术 S³FEL在量子材料能源催化生物医药大气与星际科学原子分子科学等领域的应用研究将为促进我国战略性新兴产业创新发展和关键S³FEL主要由一台超导直线加速器波荡器光束线和实验站组成可产生重复频率达1MHz电子束能量达2.5 GeV的软X 射线自由电子激光可在百飞秒内级实现原子分子及外壳层电子结构的无损动态监测是科学家认识和了解物质微观结构及动态变化的高速摄像机S³FEL为科学家和企业用户提供了一种具有超高时间分辨空间分辨和能量分辨的新方法新技术 S³FEL在量子材料能源催化生物医药大气与星际科学原子分子科学等领域的应用研究将为促进我国战略性新兴产业创新发展和关键
</p>
</div>
</div>
</div>
`
},
{ title: '图片描述', description: '', content: `
<div class="tiny-wrap">
<div class="block">
<div class="img-wrap">
<img class="pic" src="images/default.png"/>
<p class="img-des">图片描述</p>
</div>
</div>
</div>
`
},
{ title: '人物详情', description: '', content: `
<div class="tiny-wrap">
<div class="people">
<img class="pic" src="http://139.159.254.212/images/team/5.png"/>
<div class="texts">
<h6>谢明远 XIE Mingyuan</h6>
<div class="text">
<p>同步辐射光源工程经理部 生物医药组 副研究员</p>
<p>负责深圳产业光源生物安全防护晶体学与成像实验站建设</p>
<p>深圳市海外高层次人才孔雀计划C类 </p>
</div>
</div>
</div>
<div class="block">
<h6 class="p-title">基本简介</h6>
<div class="block">
<p>职称副教授</p>
<p>学位博士</p>
<p>毕业学校美国马里兰大学帕克分校</p>
<p>电子邮件<span class="blue">xiemy@mail.iasf.ac.cn</span></p>
</div>
</div>
<div class="block">
<h6 class="p-title">学术经历 </h6>
<div class="block">
<p>2014 毕业于中山大学获理学博士学位</p>
<p>2014-2015 香港理工大学从事博士后研究工作</p>
<p>2015-2016 北京理工大学珠海学院信息学院任讲师主要从事高功率单模光纤激光器大芯径高功率多模光纤激光器以及基于光纤的系统的研发工作</p>
<p>2016-2019 于中山大学物理学院任副研究员主要开展藻类捕光蛋白结构和功能研究</p>
<p>2019-2021 获得广东省青年优秀人才海外派出计划资助赴德国电子同步加速器实验室DESY任访问学者共同搭建世界上首台基于光学参量放大过程的波形相干合成光源</p>
<p>2021年至今 深圳综合粒子设施研究院同步辐射光源经理部生物医药组任副研究员负责深圳产业光源生物安全防护晶体学与成像实验站建设</p>
</div>
</div>
<div class="block">
<h6 class="p-title">学科方向</h6>
<div class="block">
<p>所在学科材料物理</p>
<p>研究方向分子模拟计算材料学统计力学</p>
<p>研究兴趣软物质及复杂流体界面的分子模拟熔盐传蓄热材料热物性的计算模拟</p>
</div>
</div>
<div class="block">
<h6 class="p-title">学术业绩</h6>
<div class="block">
<p>长期从事材料界面软物质和能源材料的分子模拟工作迄今为止以第一作者或通讯作者发表论文16篇</p>
<p>主持科研项目</p>
<p>国家自然科学基金青年项目2019-2021超级电容器双电层结构的多尺度模拟研究11804400</p>
<p>国家自然科学基金面上项目2022-2025接枝表面上液体输运性质的多尺度模拟12174457</p>
</div>
</div>
<div class="block">
<h6 class="p-title">荣誉获奖</h6>
<div class="block">
<p>百千万人才工程国家杰出青年科学基金项目青年千人计划中国科学院百人计划珠江人才青年拔尖人才深圳市高层次人</p>
</div>
</div>
<div class="block">
<h6 class="p-title">代表论著</h6>
<div class="block">
<p>1) F. Liang, J. Ding and S. Liu*, Collective Solvation and Transport at TetrahydrofuranSilica Interfaces for Separation of Aromatic Compounds: Insight from Molecular Dynamics Simulations, Langmuir, 2021, 37, 2091-2103.</p>
<p>2) K. Ren, Y.-P. Wang and S. Liu*, The role of solute polarity on methanolsilica interfacial solvation: a molecular dynamics study, Phys. Chem. Chem. Phys., 2021, 23, 1092-1102.</p>
<p>3) Y.-P. Wang, K. Ren and S. Liu*, The joint effect of surface polarity and concentration on the structure and dynamics of acetonitrile solution: a molecular dynamics simulation study, Phys. Chem. Chem. Phys., 2020, 22, 10322-10334.</p>
<p>4) K. Ren and S. Liu*, The effect of surface polarity on the structure and collective dynamics of liquid ethanol, Phys. Chem. Chem. Phys., 2020, 22, 1204-1213.</p>
<p>5) R. C. Remsing, S. Liu and J. D. Weeks, Long-ranged Contributions to Solvation Free Energies from Theory and Short-ranged Models, Proc. Natl. Acad. Sci. 113, 2819-2826(2016).</p>
<p>6) S. Liu, J. Savage and G. A. Voth, Mesoscale Study of Proton Transport in Proton Exchange Membranes: Role of Morphologies. J. Phys. Chem. C., 119, 1753-1762 (2015).</p>
<p>7) S. Liu and J. T. Fourkas, Orientational Time Correlati.</p>
</div>
</div>
</div>
`
}
],
// content_security_policy: "https://cdn.tiny.cloud/1/rnk6zw9v267xqz7pf98twt1vmrvltmd436je7a642pckltda/tinymce/6/tinymce.min.js",
// extended_valid_elements:'script[src]',
//
// template_cdate_format: '[CDATE: %m/%d/%Y : %H:%M:%S]',
// template_mdate_format: '[MDATE: %m/%d/%Y : %H:%M:%S]',
// autosave_ask_before_unload: false,
toolbar_mode : 'wrap',
// automatic_uploads: true,
// images_upload_base_path: '/demo',
// images_upload_url: 'http://139.159.254.212:10000/iasf/sysFiles/upload',
paste_data_images: true,
powerpaste_allow_local_images: true,
powerpaste_word_import: 'clean',
powerpaste_html_import: 'clean',
// 自定义上传
images_upload_handler: function (blobInfo, succFun, failFun) {
const form = new FormData()
form.append('file', blobInfo.blob()),
Axios({
method: 'post',
url: Api.upload,
data: form,
headers: {
'Content-Type': 'multipart/form-data',
token: Util.local.get(Setting.tokenKey)
},
}).then(({ data }) => {
succFun(data.url)
}).catch(res => {})
},
//自定义文件选择器的回调内容 此方法只有在点击上方图片按钮才会触发
file_picker_callback: function (callback, value, meta) {
if (meta.filetype === 'file') {
callback('https://www.baidu.com/img/bd_logo1.png', { text: 'My text' });
}
if (meta.filetype === 'image') {
callback('https://www.baidu.com/img/bd_logo1.png', { alt: 'My alt text' });
}
// 主要判断 media
if (meta.filetype === 'media') {
// 动态创建上传input,并进行模拟点击上传操作,达到本地上传视频效果。
let input = document.createElement('input');//创建一个隐藏的input
input.setAttribute('type', 'file');
input.setAttribute("accept", ".mp4");
input.onchange = function(){
let file = this.files[0];
let fd = new FormData();
fd.append("file", file);
Axios({
method: 'post',
url: Api.upload,
data: fd,
headers: {
'Content-Type': 'multipart/form-data',
token: Util.local.get(Setting.tokenKey)
},
}).then(({ data }) => {
callback(data.url)
}).catch(res => {})
}
//触发点击
input.click();
}
},
// 初始化事件
setup: function(editor) {
const that = this
editor.on('init', function(ed) {
// 设置默认字体(新增才需要设置)
if (editor.iframeElement.contentWindow.document.body.innerText === '\n') {
ed.target.editorCommands.execCommand("fontName", false, "Microsoft Yahei")
ed.target.editorCommands.execCommand("fontSize", false, "19px")
ed.target.editorCommands.execCommand("lineHeight", false, "1")
}
top.document.querySelector('#articleTitle').focus() // 第一个字段聚焦
})
},
}

File diff suppressed because it is too large Load Diff

@ -1,521 +0,0 @@
<template>
<div class="flex page">
<div style="width: 218px;border-right: 1px solid #EBEDF0">
<p class="page-name mb">全部栏目</p>
<div style="height: calc(100% - 50px);overflow: auto">
<el-tree ref="column"
:data="columns"
highlight-current
:expand-on-click-node="false"
default-expand-all
:props="defaultProps"
node-key="id"
@node-click="initData">
<span class="custom-tree-node"
slot-scope="{ node, data }">
<span class="org-name"
:title="node.label">{{ node.label }}</span>
</span>
</el-tree>
</div>
</div>
<div class="p-l-20"
style="width: calc(100% - 219px);">
<div class="tool">
<div class="search-wrap">
<el-select v-model="field"
@change="initData">
<el-option v-for="(item, i) in keywords"
:key="i"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
<el-input class="keyword"
:placeholder="'请输入' + keywords.find(e => e.id === field).name"
v-model.trim="keyword"
clearable></el-input>
</div>
<div class="actions">
<el-dropdown class="setting"
trigger="click"
:hide-on-click="false">
<img class="icon"
src="@/assets/images/setting.png"
alt="">
<el-dropdown-menu>
<el-dropdown-item>
<el-button @click="resetColumns"
type="text">列重置</el-button>
</el-dropdown-item>
<el-dropdown-item v-for="(column, i) in settings"
:key="i"
:divided="i === 0">
<el-checkbox v-model="column.show">{{ column.name }}</el-checkbox>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<el-button v-auth="'/site/list:' + siteName + ':内容管理:文章管理:新增'"
type="primary"
@click="add">新增</el-button>
<el-button v-auth="'/site/list:' + siteName + ':内容管理:文章管理:删除'"
@click="batchDel">删除</el-button>
</div>
</div>
<el-table :data="list"
class="table"
ref="table"
header-align="center"
@selection-change="handleSelectionChange"
row-key="id"
@sort-change="sortChange">
<el-table-column v-if="settings[0].show"
type="selection"
width="55"
align="center"
:reserve-selection="true"></el-table-column>
<el-table-column type="index"
width="60"
label="序号"
align="center">
<template scope="scope">
<span>{{(page - 1) * pageSize + scope.$index + 1}}</span>
</template>
</el-table-column>
<el-table-column v-if="settings[1].show"
show-overflow-tooltip
prop="title"
label="标题"
align="center"
min-width="150"></el-table-column>
<el-table-column v-if="settings[2].show"
prop="columnName"
label="栏目"
align="center"
min-width="120"></el-table-column>
<el-table-column v-if="settings[3].show"
prop="classificationName"
label="所属分类"
align="center"
min-width="120"></el-table-column>
<el-table-column v-if="settings[4].show"
prop="typeId"
label="栏目类型"
align="center"
min-width="100">
<template slot-scope="scope">
{{ types.find(e => e.id === scope.row.typeId).name }}
</template>
</el-table-column>
<el-table-column v-if="settings[5].show"
prop="founderName"
label="录入人"
align="center"
min-width="80"></el-table-column>
<el-table-column v-if="settings[6].show"
prop="editorName"
label="修改人"
align="center"
min-width="80"></el-table-column>
<el-table-column v-if="settings[7].show"
prop="updateTime"
label="修改日期"
align="center"
min-width="150"
sortable="custom"></el-table-column>
<el-table-column v-if="settings[8].show"
prop="releaseTime"
label="发布日期"
align="center"
min-width="100"
sortable="custom"></el-table-column>
<el-table-column v-if="settings[9].show"
prop="totalBrowsing"
label="总浏览"
align="center"
min-width="70"></el-table-column>
<el-table-column v-if="settings[10].show"
prop="workNumber"
label="状态"
align="center"
min-width="80">
<template slot-scope="scope">
{{ scope.row.isRelease ? '已发布' : '草稿' }}
</template>
</el-table-column>
<el-table-column v-auth="'/site/list:' + siteName + ':内容管理:文章管理:置顶'"
prop="sequence"
label="置顶"
align="center"
min-width="80"
sortable="custom">
<template slot-scope="scope">
<i v-if="scope.row.isRelease"
:class="['squ-icon', scope.row.isTop ? 'el-icon-check' : 'el-icon-close']"
@click="sticky(scope.row)"></i>
</template>
</el-table-column>
<el-table-column v-if="settings[11].show"
label="操作"
align="center"
width="190">
<template slot-scope="scope">
<el-button v-auth="'/site/list:' + siteName + ':内容管理:文章管理:预览'"
type="text"
@click="preview(scope.row)">预览</el-button>
<el-button v-auth="'/site/list:' + siteName + ':内容管理:文章管理:编辑'"
type="text"
@click="edit(scope.row)">编辑</el-button>
<el-button v-auth="'/site/list:' + siteName + ':内容管理:文章管理:删除'"
type="text"
@click="handleDelete(scope.row)">删除</el-button>
<el-switch v-if="scope.row.isRelease"
v-auth="'/site/list:' + siteName + ':内容管理:文章管理:禁用'"
class="m-l-10"
v-model="scope.row.isDisable"
:active-value="0"
:inactive-value="1"
@change="switchOff($event, scope.row, scope.$index)">
</el-switch>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination background
@current-change="currentChange"
:current-page="page"
layout="total, prev, pager, next"
:total="total"></el-pagination>
</div>
</div>
</div>
</template>
<script>
import Setting from '@/setting'
import util from '@/libs/util'
import { mapMutations } from 'vuex'
import ColumnConst from '@/const/column'
export default {
data () {
return {
last: this.$route.query.last, //
types: ColumnConst.types,
siteName: this.$store.state.content.site.siteName,
columns: [],
defaultProps: {
value: 'id',
label: 'columnName'
},
field: 'title',
keywords: [
{
id: 'title',
name: '标题'
},
{
id: 'founder',
name: '录入人'
},
{
id: 'column',
name: '栏目'
},
{
id: 'editor',
name: '修改人'
}
],
keyword: '',
list: [],
page: 1,
pageSize: 10,
total: 0,
modifiedTimeSort: '',
publicationTimeSort: '',
topSort: '',
multipleSelection: [],
originSettings: [],
settings: [
{
name: '选择框',
show: true
},
{
name: '标题',
show: true
},
{
name: '栏目',
show: true
},
{
name: '所属分类',
show: false
},
{
name: '栏目类型',
show: true
},
{
name: '录入人',
show: true
},
{
name: '修改人',
show: true
},
{
name: '修改日期',
show: true
},
{
name: '发布日期',
show: true
},
{
name: '总浏览',
show: true
},
{
name: '状态',
show: true
},
{
name: '操作',
show: true
}
],
originList: []
};
},
watch: {
keyword: function (val) {
clearTimeout(this.searchTimer)
this.searchTimer = setTimeout(() => {
this.initData()
}, 500)
}
},
mounted () {
this.$store.commit('user/setCrumbs', [
{
name: '站点管理',
route: '/site'
},
{
name: '内容管理'
},
{
name: '文章管理'
}
])
this.originSettings = JSON.parse(JSON.stringify(this.settings))
this.getColumn()
},
methods: {
...mapMutations('content', [
'setColumn'
]),
//
getColumn () {
this.$post(this.api.listWithTree, {
siteId: this.$store.state.content.site.id,
columnName: '',
templateId: '',
typeId: '',
isSort: 1
}).then(({ data }) => {
this.columns = data
this.$nextTick(() => {
this.$refs.column.setCurrentKey(this.$route.query.columnId || data[0].id)
this.getData()
})
}).catch(e => { })
},
//
getData () {
const id = this.$refs.column.getCurrentKey()
this.$router.push(`/article?columnId=${id}`).catch(e => { })
const { keyword } = this
const data = {
siteId: this.$store.state.content.site.id,
columnIds: [id],
pageNum: this.page,
pageSize: this.pageSize,
topSort: this.topSort,
title: this.field === 'title' ? keyword : '',
founder: this.field === 'founder' ? keyword : '',
column: this.field === 'column' ? keyword : '',
editor: this.field === 'editor' ? keyword : ''
}
if (this.modifiedTimeSort !== '') data.modifiedTimeSort = this.modifiedTimeSort
if (this.publicationTimeSort !== '') data.publicationTimeSort = this.publicationTimeSort
this.$post(this.api.queryArticle, data).then(({ data }) => {
data.records.map(e => {
e.editing = false
e.releaseTime = e.releaseTime.split(' ')[0]
})
this.originList = JSON.parse(JSON.stringify(data.records))
this.list = data.records
const total = +data.total
this.total = total
if (this.last) {
let page = parseInt(total / 10)
total % 10 && page++
this.page = page
this.last = ''
this.getData()
}
}).catch(err => { })
},
//
resetColumns () {
this.settings = JSON.parse(JSON.stringify(this.originSettings))
},
currentChange (val) {
this.page = val
this.getData()
},
handleSelectionChange (val) {
this.multipleSelection = val
},
initData () {
this.$refs.table.clearSelection()
this.page = 1
this.getData()
},
//
submitSequence (row) {
const { sequence } = row
if (!sequence) return util.errorMsg('请输入排序')
if (isNaN(sequence)) return util.errorMsg('请输入数字')
this.$post(`${this.api.modifiedSort}?articleId=${row.id}&sequenceNumber=${sequence > this.total ? this.total : sequence}`).then(res => {
this.initData()
}).catch(res => { })
},
//
editSequence (row) {
this.list.forEach(e => {
e.editing = false
})
row.editing = true
},
//
batchDel () {
const list = this.multipleSelection
if (list.length) {
this.$confirm('确定要删除吗?', '提示', {
type: 'warning'
}).then(() => {
const data = []
list.map(e => {
data.push('ids=' + e.id)
})
this.$post(`${this.api.deleteArticle}?${data.join('&')}`).then(res => {
this.$refs.table.clearSelection()
util.successMsg("删除成功")
this.getData()
}).catch(res => { })
}).catch(() => { })
} else {
util.errorMsg('请先选择数据 !')
}
},
//
handleDelete (row) {
this.$confirm('确定要删除吗?', '提示', {
type: 'warning'
}).then(() => {
this.$post(`${this.api.deleteArticle}?ids=${row.id}`).then(res => {
util.successMsg('删除成功')
this.getData()
}).catch(res => { })
}).catch(() => { })
},
//
switchOff (val, row) {
this.$post(`${this.api.articleEnableOrDisable}?id=${row.id}&isDisable=${val}`).then(res => { }).catch((res) => { })
},
//
add () {
if (!this.columns.length) return util.errorMsg('请添加栏目')
this.setColumn(this.$refs.column.getCurrentNode())
this.$router.push(`add?columnId=${this.$refs.column.getCurrentKey()}&columnName=${this.$refs.column.getCurrentNode().columnName}`)
},
//
sortChange (column) {
const { order } = column
// 1
// 0 1
if (column.prop === 'updateTime') {
this.modifiedTimeSort = order ? order === 'ascending' ? 1 : 0 : ''
if (order) {
this.publicationTimeSort = ''
this.topSort = ''
}
}
if (column.prop === 'releaseTime') {
this.publicationTimeSort = order ? order === 'ascending' ? 1 : 0 : ''
if (order) {
this.modifiedTimeSort = ''
this.topSort = ''
}
}
// 0 1
if (column.prop === 'sequence') {
this.topSort = order ? order === 'ascending' ? 0 : 1 : ''
if (order) {
this.publicationTimeSort = ''
this.modifiedTimeSort = ''
}
}
this.getData()
},
//
sticky (row) {
this.$post(`${this.api.articleTopOperation}?articleId=${row.id}&isTop=${row.isTop ? 0 : 1}`).then(res => {
this.initData()
}).catch(res => { })
},
//
preview (row) {
window.open((Setting.isDev ? `http://${location.hostname}:8097` : this.$store.state.content.site.domainName) + `#/article?articleId=${row.id}&siteId=${this.$refs.column.getCurrentNode().siteId}&id=${row.columnId}`)
},
//
edit (row) {
this.$router.push(`add?id=${row.id}&columnId=${this.$refs.column.getCurrentKey()}&columnName=${this.$refs.column.getCurrentNode().columnName}`)
},
}
};
</script>
<style lang="scss" scoped>
.custom-tree-node {
display: inline-flex;
align-items: center;
}
.name {
display: inline-block;
max-width: 160px;
margin-right: 20px;
overflow: hidden;
text-overflow: ellipsis;
}
.squ-icon {
font-size: 16px;
font-weight: 600;
cursor: pointer;
color: #f70000;
&.el-icon-check {
color: #05991e;
}
}
/deep/.squ-input {
width: auto;
.el-input__inner {
width: 60px;
padding: 0 10px;
}
}
</style>

@ -48,10 +48,10 @@
<div class="btns">
<el-button type="primary"
@click="save(1)">通过</el-button>
@click="submit(1)">通过</el-button>
<el-button type="danger"
@click="preview">驳回</el-button>
<el-button @click="back">返回</el-button>
<el-button @click="$router.back()">返回</el-button>
</div>
</div>
</template>
@ -63,52 +63,10 @@ export default {
data () {
return {
id: this.$route.query.id || '',
headers: {
token: Util.local.get(Setting.tokenKey)
},
scope: 0,
form: {
id: this.$route.query.id || '',
founder: 1,
isOpen: 0, // (0 1 0)
maximumNumber: '',
carouselUrl: '',
coverUrl: '',
activityFileList: [], //
initiator: '',
isNeedCode: 0,
invitationCode: '',
maximumNumber: 0,
signUpStartTime: '',
signUpEndTime: '',
playStartTime: '',
playEndTime: '',
projectDescribe: '',
projectName: '',
publishStatus: 0,
competitionScope: 0,
competitionScope1: []
},
fileName: '',
signupTime: [],
playTime: [],
sponsorList: [""],
undertakerList: [''],
fileList: [],
form: {},
submiting: false,
pass: false,
updateTime: 0,
};
},
watch: {
// ,
form: {
handler () {
this.updateTime++
},
deep: true
},
},
mounted () {
this.$store.commit('user/setCrumbs', [
{
@ -119,114 +77,21 @@ export default {
name: '幼儿园审核'
},
])
// this.getData()
this.getData()
},
methods: {
getData () {
const { id } = this.form
id && this.$post(`${this.api.findByIdActivity}?id=${id}`).then(({ data }) => {
if (data.signUpStartTime) this.signupTime = [data.signUpStartTime, data.signUpEndTime]
if (data.playStartTime) this.playTime = [data.playStartTime, data.playEndTime]
this.sponsorList = data.initiator.split(",")
//
const fileList = data.activityFileList
if (fileList) {
fileList.map(e => {
e.name = e.fileName
e.url = e.filePath
})
} else {
data.activityFileList = []
}
const { id } = this
id && this.$post(`${this.api.findCertification}?id=${id}`).then(({ data }) => {
this.form = data
this.$nextTick(() => {
this.updateTime = 0
})
}).catch(err => { })
},
handleExceed (files, fileList) {
Util.warningMsg(`当前限制选择 1 个文件,如需更换,请删除上一个文件再重新选择!`);
},
beforeRemove (file, fileList) {
return this.$confirm(`确定移除 ${file.name}`);
},
handleRemove () {
Oss.del(this.form.coverUrl)
this.form.coverUrl = ''
},
uploadError (err, file, fileList) {
this.$message({
message: "上传出错,请重试!",
type: "error",
center: true
})
},
//
async handleRequest ({ file }) {
this.form.coverUrl && Oss.del(this.form.coverUrl)
Oss.upload(file).then(res => {
this.form.coverUrl = res.url
})
},
//
uploadAnnexSuccess (file) {
const url = file.url
const data = {
activityId: this.form.id || '',
fileName: file.name,
name: file.name,
filePath: url,
url
}
this.form.activityFileList.push(data)
},
handleExceedAnnex (files, fileList) {
Util.warningMsg(`当前限制选择 5 个文件,如需更换,请删除一个文件再重新选择!`);
},
//
beforeUpload (file) {
const isLt2M = file.size / 1024 / 1024 < 10
if (!isLt2M) Util.warningMsg('请上传小于10MB的附件!')
if (isLt2M) {
this.fileName = file.name
return true
} else {
return false
}
},
handleAnnexRemove (file, fileList) {
Oss.del(file.url)
this.form.activityFileList = fileList
},
//
randomInv () {
let result = ''
for (let i = 0; i < 4; i++) {
result += Math.floor(Math.random() * 10);
}
this.form.invitationCode = result
},
//
save (status) {
submit (status) {
const { form } = this
form.initiator = this.sponsorList.filter(d => d).join();
if (!form.projectName) return Util.warningMsg("请填写活动名称");
//
if (status) {
if (!form.initiator) return Util.warningMsg("请填写发起方");
if (!form.signUpStartTime) return Util.warningMsg("请选择报名时间");
let now = new Date().getTime();
let signUpStartTime = new Date(form.signUpStartTime).getTime();
let signUpEndTime = new Date(form.signUpEndTime).getTime();
let playStartTime = new Date(form.playStartTime).getTime();
// if (signUpStartTime && now > signUpStartTime) return Util.warningMsg("");
if (!form.playStartTime) return Util.warningMsg("请选择活动时间");
if (playStartTime && signUpEndTime && playStartTime < signUpEndTime) return Util.warningMsg("活动时间不能早于报名结束时间");
if (form.isNeedCode && (!form.invitationCode || form.invitationCode.length !== 4)) return Util.warningMsg('请填写四位数邀请码')
if (!form.projectDescribe) return Util.warningMsg("请填写活动详情");
}
form.publishStatus = status
form.id = this.$route.query.id
if (this.submiting) return false
this.submiting = true
if (form.id) {
@ -245,43 +110,6 @@ export default {
});
}
},
//
preview () {
Util.local.set('activity', this.form)
window.open(this.$router.resolve('preview').href)
},
addSponsor () {
this.sponsorList.push("");
},
delSponsor (index) {
this.sponsorList.splice(index, 1);
},
addOrganizer () {
this.undertakerList.push("");
},
delOrganizer (index) {
this.undertakerList.splice(index, 1);
},
backList () {
this.pass = true
this.updateTime = 0
this.$router.back()
},
back () {
this.pass = true
//
if (this.updateTime) {
this.$confirm(`编辑的内容未保存,是否保存?`, '提示', {
type: 'warning'
}).then(() => {
this.save(this.form.publishStatus)
}).catch(() => {
this.backList()
})
} else {
this.backList()
}
},
}
};
</script>

@ -21,7 +21,6 @@
clearable
placeholder="请选择城市"
:disabled="form.provinces ? false : true"
@clear="clearcity"
@change="initData">
<el-option v-for="(item, i) in cityList"
:key="i"
@ -48,8 +47,7 @@
<ul class="filter">
<li>
<label>创建时间</label>
<el-radio-group v-model="form.month">
<el-date-picker v-model="form.date"
<el-date-picker v-model="date"
align="right"
unlink-panels
type="daterange"
@ -58,7 +56,6 @@
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
clearable></el-date-picker>
</el-radio-group>
</li>
<li>
<label>会员状态</label>
@ -67,7 +64,7 @@
filterable
placeholder="请选择会员状态"
@change="initData">
<el-option v-for="(item, i) in schoolList"
<el-option v-for="(item, i) in platformList"
:key="i"
:label="item.schoolName"
:value="item.schoolId"></el-option>
@ -75,22 +72,22 @@
</li>
<li>
<label>认证状态</label>
<el-select v-model="form.schoolId"
<el-select v-model="form.auditStatus"
clearable
filterable
placeholder="请选择认证状态"
@change="initData">
<el-option v-for="(item, i) in schoolList"
<el-option v-for="(item, i) in auditStatus"
:key="i"
:label="item.schoolName"
:value="item.schoolId"></el-option>
:label="item.name"
:value="item.id"></el-option>
</el-select>
</li>
<li>
<el-input style="width: 300px"
placeholder="请输入园所名称、联系人、账号、手机号"
prefix-icon="el-icon-search"
v-model="form.keyword"
v-model="form.keyWord"
clearable />
</li>
</ul>
@ -110,10 +107,8 @@
name="tab5"></el-tab-pane>
</el-tabs>
<div class="btn-wrap">
<el-button type="primary"
@click="add">新增</el-button>
<el-button @click="delAllSelection">批量删除</el-button>
<el-button>批量导出</el-button>
<!-- <el-button>批量导出</el-button> -->
</div>
</div>
<el-table :data="list"
@ -129,29 +124,28 @@
align="center"
:reserve-selection="true"></el-table-column>
<el-table-column type="index"
width="100"
width="60"
label="序号"
align="center"></el-table-column>
<el-table-column prop="userName"
<el-table-column prop="companyName"
label="园所名称"
min-width="160"
align="center"></el-table-column>
<el-table-column prop="phone"
label="省份"
align="center"></el-table-column>
<el-table-column prop="phone"
label="用户端权限"
align="center"></el-table-column>
<el-table-column prop="schoolName"
label="城市"
align="center"></el-table-column>
<el-table-column prop="platformName"
label="联系人"
<el-table-column prop="proposer"
label="申请人"
align="center"></el-table-column>
<el-table-column prop="phone"
label="手机号"
align="center"></el-table-column>
<el-table-column prop="phone"
label="创建时间"
<el-table-column prop="submitTime"
label="提交时间"
width="150"
align="center"></el-table-column>
<el-table-column prop="createTime"
label="来源"
@ -162,9 +156,13 @@
align="center"></el-table-column>
<el-table-column prop="lastLoginTime"
label="审核状态"
align="center"></el-table-column>
align="center">
<template slot-scope="scope">
{{ auditStatus.find(e => e.id === scope.row.auditStatus).name }}
</template>
</el-table-column>
<el-table-column label="操作"
width="300"
width="140"
align="center">
<template slot-scope="scope">
<el-button type="text"
@ -193,83 +191,35 @@
<script>
import Setting from '@/setting'
import Util from '@/libs/util'
import Const from '@/const/user'
export default {
name: 'user',
data () {
return {
searchTimer: null,
form: {
name: '',
countries: '中国',
startCommitTime: '',
endCommitTime: '',
provinces: '',
city: '',
platformId: '',
schoolId: '',
accountRole: '',
keyword: '',
date: '',
startTime: '',
endTime: '',
month: ''
auditStatus: null,
keyWord: '',
platformSource: 5,
},
accountRoleList: [{
name: '超级管理员',
value: 1
},
{
name: '管理员',
value: 13
},
{
name: '教师',
value: 14
},
{
name: '学生',
value: 4
}],
countryList: [{
name: '中国'
}],
provinceList: this.$store.state.provinceList,
cityList: [],
schoolList: [],
list: [{}],
dateList: [{
id: '',
name: '不限'
},
{
id: 3,
name: '3个月内'
},
{
id: 6,
name: '6个月内'
},
{
id: 9,
name: '9个月内'
},
{
id: 12,
name: '1年内'
}],
date: [],
auditStatus: Const.auditStatus,
platformList: [
{
value: '',
label: '不限'
},
{
value: 1,
label: '职站'
},
{
value: 2,
label: '数据前瞻'
},
],
page: +this.$route.query.page || 1,
provinceList: [],
cityList: [],
schoolList: [],
list: [],
page: 1,
pageSize: 10,
total: 0,
multipleSelection: [],
@ -278,27 +228,19 @@ export default {
};
},
watch: {
'form.keyword': function (val) {
'form.keyWord': function (val) {
clearTimeout(this.searchTimer)
this.searchTimer = setTimeout(() => {
this.initData()
}, 500)
},
'form.month': function (val) {
if (val) {
let unit = 24 * 60 * 60 * 1000
this.form.date = [this.formatDate('yyyy-MM-dd', new Date(new Date().getTime() - unit * 30 * val)), this.formatDate('yyyy-MM-dd', new Date(new Date().getTime() + unit))]
} else {
this.form.date = []
}
},
'form.date': function (val) {
date: function (val) {
if (val && val.length) {
this.form.startTime = val[0]
this.form.endTime = val[1]
this.form.startCommitTime = val[0]
this.form.endCommitTime = val[1]
} else {
this.form.startTime = ''
this.form.endTime = ''
this.form.startCommitTime = ''
this.form.endCommitTime = ''
}
this.initData()
}
@ -313,47 +255,20 @@ export default {
name: '幼儿园列表'
},
])
// this.getData()
// this.getSchoolData();
this.initData()
this.getProvince();
},
methods: {
getData () {
let data = {
countries: this.form.countries,
provinceId: this.form.provinces,
cityId: this.form.city,
platformId: this.form.platformId,
schoolId: this.form.schoolId,
month: this.form.month,
creationTime: this.form.startTime,
endTime: this.form.endTime,
roleId: this.form.accountRole,
searchContent: this.form.keyword,
pageNum: this.page,
pageSize: this.pageSize
}
this.loading = true
this.$post(this.api.queryUserInfoList, data).then(({ page, total }) => {
const promises = []
page.map(e => {
promises.push(new Promise((resolve, reject) => {
//
this.$get(this.api.viewUserDetailsforNakadai, { userId: e.userId }).then(({ result }) => {
const platList = result.bindingPlatformAndUserList
// 1->0->
e.isEnable = platList.find(e => e.isEnable) ? 1 : 0
e.userIds = platList.map(e => e.userId) // userId
resolve()
}).catch((res) => {
reject()
})
}))
})
Promise.all(promises).then(_ => {
this.list = page
this.total = total
this.$post(this.api.selectEnterpriseCertificationList, {
...this.form,
pageNum: this.page,
pageSize: this.pageSize,
}).then(({ data }) => {
this.list = data.records
this.total = data.total
this.loading = false
})
}).catch(res => {
this.loading = false
})
@ -362,10 +277,13 @@ export default {
this.page = 1
this.getData()
},
//
getProvince () {
this.$get(this.api.queryProvince).then(res => {
this.provinceList = res.list
}).catch(res => { })
},
clearprovince () {
this.form.city = '',
this.form.schoolId = ''
this.form.city = ''
},
//
getCity () {
@ -381,81 +299,43 @@ export default {
this.cityList = res.list
}).catch(res => { })
},
//
clearcity () {
this.form.schoolId = ''
},
// /
getSchool () {
this.clearcity()
this.getSchoolData()
this.page = 1
this.getData()
},
getSchoolData () {
let data = {
provinceId: "",
cityId: ""
}
this.$get(this.api.querySchool, data).then(res => {
this.schoolList = res.list
}).catch(res => { })
},
currentChange (val) {
this.page = val
this.$router.push(`user?page=${val}`)
this.getData()
},
toDetail (row, detail) {
this.$router.push(`manage?userId=${row.userId}`)
},
toAudit (row, detail) {
this.$router.push(`audit?userId=${row.userId}`)
this.$router.push(`audit?id=${row.id}`)
},
handleDelete (row) {
this.$confirm('确定要删除吗?', '提示', {
type: 'warning'
}).then(() => {
this.$post(this.api.delUserAccounts, row.userIds).then(res => {
this.$post(this.api.delCertification, [row.id]).then(res => {
Util.successMsg('删除成功')
this.getData()
}).catch(res => { })
}).catch(() => { })
},
//
switchUser (val, row) {
this.$get(this.api.updateAccountAllEnable, {
id: row.userId,
isEnable: val,
phone: row.phone
}).then(res => {
Util.successMsg(val ? '启用成功' : '禁用成功')
}).catch(res => { })
},
handleSelectionChange (val) {
this.multipleSelection = val;
},
delAllSelection () {
if (this.multipleSelection.length) {
let delList = this.multipleSelection.map(e => e.userId);
this.$confirm('确定要删除选中用户吗?', '提示', {
let delList = this.multipleSelection.map(e => e.id);
this.$confirm('确定要删除选中数据吗?', '提示', {
type: 'warning'
}).then(() => {
this.$post(this.api.delUserAccounts, delList).then(res => {
if (delList.length == this.list.length) {
if (this.page > 1) {
this.page = this.page - 1
}
}
this.$post(this.api.delCertification, delList).then(res => {
Util.successMsg('删除成功')
this.$refs.table.clearSelection()
this.getData()
}).catch(res => {
})
}).catch(res => { })
}).catch(() => { })
} else {
Util.errorMsg('请先选择用户 !')
Util.errorMsg('请选择数据 !')
}
},
}

@ -85,37 +85,37 @@
width="100"
label="序号"
align="center"></el-table-column>
<el-table-column prop="platformName"
label="平台名称"
<el-table-column prop="companyName"
label="组织名称"
align="center"></el-table-column>
<el-table-column prop="schoolName"
label="绑定组织名称"
align="center"></el-table-column>
<el-table-column prop="userName"
label="姓名"
<el-table-column prop="companyName"
label="类型"
align="center">
<template slot-scope="scope">
{{ platformSource.find(e => e.id == scope.row.platformSource).name }}
</template>
</el-table-column>
<el-table-column prop="creditCode"
label="统一社会信用代码"
align="center"></el-table-column>
<el-table-column prop="workNumber"
label="工号/学号"
align="center"></el-table-column>
label="组织认证状态"
align="center">
<template slot-scope="scope">
{{ auditStatus.find(e => e.id === scope.row.auditStatus).name }}
</template>
</el-table-column>
<el-table-column prop="roleName"
label="角色"
align="center"></el-table-column>
<el-table-column prop="phoneBindingTime"
label="绑定时间"
align="center"></el-table-column>
<el-table-column prop="logInNumber"
label="登录次数"
align="center"></el-table-column>
<el-table-column prop="lastLoginTime"
label="上一次的登录时间"
label="组织会员状态"
align="center"></el-table-column>
<el-table-column label="操作"
width="180"
align="center">
<template slot-scope="scope">
<el-button type="text"
@click="show(scope.row)">查看</el-button>
<el-button type="text"
@click="del(scope.row)"></el-button>
@click="del(scope.row)">移除</el-button>
<el-switch v-if="scope.row.userId!==1"
v-model="scope.row.isEnable"
:active-value="1"
@ -132,11 +132,14 @@
<script>
import * as md5 from 'blueimp-md5'
import Const from '@/const/user'
export default {
name: 'baseform',
data () {
return {
userId: this.$route.query.userId,
auditStatus: Const.auditStatus,
platformSource: Const.platformSource,
isDetail: this.$route.query.show === '1', //
form: {
//
@ -167,13 +170,13 @@ export default {
},
methods: {
getdata () {
this.$get(this.api.viewUserDetailsforNakadai, { userId: this.userId }).then(({ result }) => {
this.$get(this.api.viewUserDetails, { userId: this.userId }).then(({ result }) => {
const info = result.hrUserInfo
info.phone = result.userAccount.phone
// MD51313
if (info.phone) info.uniqueIdentification = md5(info.phone).slice(0, 13)
this.form = info
this.platformList = result.bindingPlatformAndUserList
this.platformList = result.enterpriseCertificationList
}).catch((res) => { })
},
goback () {
@ -195,11 +198,11 @@ export default {
},
//
del (row) {
this.$confirm('确定要除吗?', '提示', {
this.$confirm('确定要除吗?', '提示', {
type: 'warning'
}).then(() => {
this.$post(this.api.delUserAccounts, [row.userId]).then(res => {
this.$message.success('除成功')
this.$message.success('除成功')
this.getData()
}).catch(res => { })
}).catch(() => { })

@ -2,33 +2,6 @@
<div class="page">
<div class="tool">
<ul class="filter">
<li>
<label>省份</label>
<el-select v-model="form.provinces"
clearable
placeholder="请选择省份"
@change="getCity"
@clear="clearprovince">
<el-option v-for="(item, i) in provinceList"
:key="i"
:label="item.provinceName"
:value="item.provinceId"></el-option>
</el-select>
</li>
<li>
<label>城市</label>
<el-select v-model="form.city"
clearable
placeholder="请选择城市"
:disabled="form.provinces ? false : true"
@clear="clearcity"
@change="initData">
<el-option v-for="(item, i) in cityList"
:key="i"
:label="item.cityName"
:value="item.cityId"></el-option>
</el-select>
</li>
<li>
<label>来源</label>
<el-select v-model="form.platformId"
@ -42,16 +15,15 @@
</el-select>
</li>
<li>
<label>学校</label>
<el-select v-model="form.schoolId"
<label>用户端权限</label>
<el-select v-model="form.platformId1"
clearable
filterable
placeholder="请选择学校"
placeholder="请选择用户端权限"
@change="initData">
<el-option v-for="(item, i) in schoolList"
:key="i"
:label="item.schoolName"
:value="item.schoolId"></el-option>
<el-option v-for="item in platformSource"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
</li>
</ul>
@ -114,12 +86,9 @@
<el-table-column prop="phone"
label="手机号"
align="center"></el-table-column>
<el-table-column prop="phone"
<el-table-column prop="platformName"
label="用户端权限"
align="center"></el-table-column>
<el-table-column prop="schoolName"
label="学校"
align="center"></el-table-column>
<el-table-column prop="platformName"
label="来源"
align="center"></el-table-column>
@ -137,7 +106,7 @@
label="最近登录时间"
align="center"></el-table-column>
<el-table-column label="操作"
width="300"
width="180"
align="center">
<template slot-scope="scope">
<el-button type="text"
@ -147,14 +116,12 @@
type="text"
@click="handleDelete(scope.row)"
v-auth>删除</el-button>
<el-switch v-if="scope.row.userId!==1"
v-model="scope.row.isEnable"
<el-switch v-model="scope.row.isEnable"
:active-value="1"
:inactive-value="0"
style="margin: 0 10px 0 5px"
:active-text="scope.row.isEnable ? '启用' : '禁用'"
@change="switchOff($event,scope.row,scope.$index)"
v-auth="'/user:启用'"></el-switch>
@change="switchOff($event,scope.row,scope.$index)"></el-switch>
</template>
</el-table-column>
</el-table>
@ -172,6 +139,7 @@
<script>
import Setting from '@/setting'
import Util from '@/libs/util'
import Const from '@/const/user'
export default {
name: 'user',
data () {
@ -183,37 +151,18 @@ export default {
provinces: '',
city: '',
platformId: '',
schoolId: '',
accountRole: '',
keyword: '',
date: '',
startTime: '',
endTime: '',
month: ''
},
accountRoleList: [{
name: '超级管理员',
value: 1
},
{
name: '管理员',
value: 13
},
{
name: '教师',
value: 14
},
{
name: '学生',
value: 4
}],
countryList: [{
name: '中国'
}],
provinceList: this.$store.state.provinceList,
provinceList: [],
cityList: [],
schoolList: [],
list: [{}],
list: [],
dateList: [{
id: '',
name: '不限'
@ -239,16 +188,9 @@ export default {
value: '',
label: '不限'
},
{
value: 1,
label: '职站'
},
{
value: 2,
label: '数据前瞻'
},
],
page: +this.$route.query.page || 1,
platformSource: Const.platformSource,
page: 1,
pageSize: 10,
total: 0,
multipleSelection: [],
@ -265,7 +207,7 @@ export default {
'form.month': function (val) {
if (val) {
let unit = 24 * 60 * 60 * 1000
this.form.date = [this.formatDate('yyyy-MM-dd', new Date(new Date().getTime() - unit * 30 * val)), this.formatDate('yyyy-MM-dd', new Date(new Date().getTime() + unit))]
this.form.date = [Util.formatDate('yyyy-MM-dd', new Date(new Date().getTime() - unit * 30 * val)), Util.formatDate('yyyy-MM-dd', new Date(new Date().getTime() + unit))]
} else {
this.form.date = []
}
@ -287,47 +229,27 @@ export default {
name: '用户管理'
}
])
// this.getData()
this.initData()
// this.getSchoolData();
},
methods: {
getData () {
let data = {
this.loading = true
this.$post(this.api.queryUserInfoList, {
countries: this.form.countries,
provinceId: this.form.provinces,
cityId: this.form.city,
platformId: this.form.platformId,
schoolId: this.form.schoolId,
month: this.form.month,
creationTime: this.form.startTime,
endTime: this.form.endTime,
roleId: this.form.accountRole,
searchContent: this.form.keyword,
pageNum: this.page,
pageSize: this.pageSize
}
this.loading = true
this.$post(this.api.queryUserInfoList, data).then(({ page, total }) => {
const promises = []
page.map(e => {
promises.push(new Promise((resolve, reject) => {
//
this.$get(this.api.viewUserDetailsforNakadai, { userId: e.userId }).then(({ result }) => {
const platList = result.bindingPlatformAndUserList
// 1->0->
e.isEnable = platList.find(e => e.isEnable) ? 1 : 0
e.userIds = platList.map(e => e.userId) // userId
resolve()
}).catch((res) => {
reject()
})
}))
})
Promise.all(promises).then(_ => {
this.list = page
this.total = total
}).then(({ page }) => {
this.list = page.records
this.total = page.total
this.loading = false
})
}).catch(res => {
this.loading = false
})
@ -355,29 +277,8 @@ export default {
this.cityList = res.list
}).catch(res => { })
},
//
clearcity () {
this.form.schoolId = ''
},
// /
getSchool () {
this.clearcity()
this.getSchoolData()
this.page = 1
this.getData()
},
getSchoolData () {
let data = {
provinceId: "",
cityId: ""
}
this.$get(this.api.querySchool, data).then(res => {
this.schoolList = res.list
}).catch(res => { })
},
currentChange (val) {
this.page = val
this.$router.push(`user?page=${val}`)
this.getData()
},
toDetail (row, detail) {

@ -9,7 +9,7 @@ router.beforeEach((to, from, next) => {
if (!role && !whiteList.includes(to.path)) {
next('/login')
} else if (role && to.path === '/login') {
next('/site')
next('/user')
} else {
next()
}

Loading…
Cancel
Save