Browse Source

创业学院修改

master
aBin 4 years ago
parent
commit
566f586d48
  1. 4
      src/common/portrait.styl
  2. 2
      src/components/BtnCom/BtnCon.vue
  3. 18
      src/config/api.js
  4. 6
      src/router/index.js
  5. 2
      src/views/BannerManage/BannerManage.vue
  6. 26
      src/views/Challenge/Challenge.vue
  7. 384
      src/views/Challenge/components/ChallengeAdd.vue
  8. 187
      src/views/Challenge/components/ChallengeDate.vue
  9. 321
      src/views/Challenge/components/ChallengeEdit.vue
  10. 48
      src/views/Challenge/components/ChallengeSearch.vue
  11. 44
      src/views/Challenge/components/UnveSearch.vue
  12. 251
      src/views/Challenge/components/UnveilingDate.vue
  13. 4
      src/views/College/College.vue
  14. 3
      src/views/College/components/CollegeDate.vue
  15. 4
      src/views/College/components/CollegeSearch.vue

4
src/common/portrait.styl

@ -310,3 +310,7 @@ h2{
.fill-height{
height:100%;
}
.ant-checkbox-wrapper {
margin-left: 0 !important;
}

2
src/components/BtnCom/BtnCon.vue

@ -8,7 +8,7 @@
<!-- <div @click="jump('/communication-community')" class="btn">交流社区</div> -->
<div @click="jump('/event-announcement')" class="btn">活动公告</div>
<div @click="jump('/innovation-policy')" class="btn">创新政策</div>
<div @click="jump('/')" class="btn">创新挑战</div>
<div @click="jump('/Challenge')" class="btn">创新挑战</div>
<div @click="jump('/College')" class="btn">创业学院</div>
<!-- <div @click="jump('/talent-recruitment')" class="btn">人才招聘</div> -->
<div @click="jump('/cooperative-partner')" class="btn">合作伙伴</div>

18
src/config/api.js

@ -263,6 +263,9 @@ export const academyUpdate = params => axios.post(`${academy}/update`, params);
export const queryMold = params => axios.post(`${academy}/queryMold`, params);
// 创新挑战查看发榜列表
export const selTelease = params => axios.post(`${releaseTheList}/selTelease`, params);
// 创新挑战查看某个榜的揭榜列表
export const selfulUnveilingList = params => axios.post(`${releaseTheList}/selfulUnveilingList`, params);
// 创新挑战修改
@ -270,3 +273,18 @@ export const updateTelease = params => axios.post(`${releaseTheList}/updateTelea
// 创新挑战增加
export const addTelease = params => axios.post(`${releaseTheList}/addTelease`, params);
// 创新挑战发榜类型查询
export const findTypeList = params => axios.post(`${releaseTheList}/findTypeList`, params);
// 创新挑战发榜类型查询
export const selTeleaseById = params => axios.post(`${releaseTheList}/selTeleaseById`, params);
// 创新挑战发榜审核
export const upPublished = params => axios.post(`${releaseTheList}/upPublishedSuccessfully`, params);
// 创新挑战揭榜列表
export const selfulUnveiling = params => axios.post(`${releaseTheList}/selfulUnveilingList`, params);
// 创新挑战修改揭榜审核状态
export const upUnveiling = params => axios.post(`${releaseTheList}/upSuccessfulUnveiling`, params);

6
src/router/index.js

@ -178,6 +178,12 @@ const routes = [
name: 'IndustryDemandReport',
component: () => import(/* webpackChunkName: "industry-demand-report" */ 'views/IndustryDemandReport/IndustryDemandReport.vue'),
},
// 需求填报
{
path: '/Challenge',
name: 'Challenge',
component: () => import(/* webpackChunkName: "industry-demand-report" */ 'views/Challenge/Challenge.vue'),
},
// 创业学院
{
path: '/College',

2
src/views/BannerManage/BannerManage.vue

@ -43,7 +43,7 @@ export default {
if (condition && condition.current) {
this.pageNum = condition.current;
this.pageSize = condition.pageSize;
} else if (condition && !condition.pageNum) {
} else if (condition && !condition.current) {
this.paramData = condition;
}
const params = {

26
src/views/Challenge/Challenge.vue

@ -8,7 +8,7 @@
<script>
import ChallengeSearch from './components/ChallengeSearch.vue';
import ChallengeDate from './components/ChallengeDate.vue';
import { selfulUnveilingList } from 'config/api';
import { selTelease } from 'config/api';
export default {
name: 'Challenge',
@ -25,9 +25,12 @@ export default {
pageNum: 1,
pageSize: 10,
paramData: {
banner: [],
type: '',
title: '',
companyName: '',
startTime: '',
endTime: '',
servics: '',
billboardStatus: '',
},
};
},
@ -43,19 +46,26 @@ export default {
if (condition && condition.current) {
this.pageNum = condition.current;
this.pageSize = condition.pageSize;
} else if (condition && !condition.pageNum) {
this.paramData = condition;
} else if (condition && !condition.current) {
let { paramData } = this;
console.log(paramData);
paramData = { ...condition };
this.paramData = paramData;
}
const params = {
param: {
address: '',
billboardStatus: this.paramData.billboardStatus,
companyName: this.paramData.companyName,
startTime: this.paramData.startTime,
endTime: this.paramData.endTime,
servics: this.paramData.servics,
title: this.paramData.title,
type: this.paramData.type,
banner: this.paramData.banner,
pageNum: this.pageNum,
pageSize: this.pageSize,
},
};
const res = await selfulUnveilingList(params);
const res = await selTelease(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.lists = data;

384
src/views/Challenge/components/ChallengeAdd.vue

@ -1,230 +1,278 @@
<template>
<div class="d-flex flex-wrap pb-3">
<!-- 添加 -->
<div>
<a-button @click="showModal" type="primary">增加</a-button>
<a-modal
:mask-closable="false"
@cancel="$emit('closeModal')"
destroy-on-close
footer
title="创业学院添加"
v-model="visible"
width="700px"
:confirm-loading="confirmLoading"
:title="title"
:visible="visible"
@cancel="handleCancel"
@ok="handleOk"
width="50%"
>
<a-form :form="form" @submit="handleSubmit">
<!-- 标题 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="标题">
<a-input
@change="changeIpt($event, 'title')"
class="ml-3"
placeholder="标题"
v-decorator="[
'title',
{
rules: [
{ required: true, message: '标题不能为空' },
{ whitespace: true, message: '标题不能为空' },
{ max: 140, massage: '标题最多140个字符' },
],
},
]"
/>
</a-form-item>
<!-- 内容链接 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="内容链接">
<a-input
@change="changeIpt($event, 'contentUrl')"
class="ml-3"
placeholder="内容链接"
v-decorator="[
'contentUrl',
{
rules: [
{ required: true, message: '内容链接不能为空' },
{ whitespace: true, message: '内容链接不能为空' },
{ max: 300, massage: '内容链接最多30个字符' },
],
},
]"
/>
</a-form-item>
<!-- 简介 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="简介">
<a-textarea
@change="changeIpt($event, 'intro')"
class="ml-3"
placeholder="简介"
v-decorator="[
'intro',
{
rules: [
{ required: true, message: '简介不能为空' },
{ whitespace: true, message: '简介不能为空' },
{ max: 140, massage: '简介最多140个字符' },
],
},
]"
/>
</a-form-item>
<!-- 封面图片 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="封面图片">
<a-upload :action="upload" :before-upload="beforeUpload" @change="handleChange" class="ml-3" list-type="picture" name="files">
<a-button v-show="fileList.length - 0 === 0"> <a-icon type="upload" />选择封面图片 </a-button>
</a-upload>
<a-form :form="form">
<!-- 需求名称 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" class="mb-3" label="需求名称">
<a-input placeholder="请输入需求名称..." v-model.trim="platform.needName" />
</a-form-item>
<!-- 时间 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="时间">
<a-date-picker class="ml-3" @change="changeBirthday" show-time />
<!-- 公司名称 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" class="mb-3" label="公司名称">
<a-input placeholder="请输入公司名称..." v-model.trim="platform.companyName" />
</a-form-item>
<!-- 类型 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="类型">
<a-select @change="getUse($event, 'type')" class="ml-3" default-value="视频" style="width: 100%">
<a-select-option :key="index" :value="index + 1" v-for="(item, index) in recStatusList">{{ item }}</a-select-option>
</a-select>
<!-- 技术领域 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" class="mb-3" label="技术领域">
<a-input placeholder="请输入技术领域..." v-model.trim="platform.technicalField" />
</a-form-item>
<!-- 是否在首页展示 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="是否在首页展示">
<a-radio-group class="ml-3" v-model="whetherShow" @change="onChange">
<a-radio :value="0"> </a-radio>
<a-radio :value="1"> </a-radio>
</a-radio-group>
<!-- 需求截止时间 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" class="mb-3" label="截止时间">
<a-date-picker @change="changeNeedTime" style="width: 100%" />
</a-form-item>
<!-- 栏目 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="栏目">
<a-checkbox-group class="ml-3" @change="onChangeBan">
<a-checkbox class="my-2" v-for="(item, index) in bannersList" :key="index" :value="item.moldId">{{ item.moldName }}</a-checkbox>
<!-- 需求类别 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" class="mb-3" label="需求类别">
<a-checkbox-group @change="onChange" class="line-height-30">
<a-checkbox style="width: 100%" v-for="(item, index) in typeList" :key="index" :value="item.id">{{ item.name }}</a-checkbox>
</a-checkbox-group>
</a-form-item>
<a-form-item class="d-flex flex-row-reverse">
<a-button @click="$emit('closeModal')" class="mr-3">取消</a-button>
<a-button class="white--text" html-type="submit" type="primary">保存</a-button>
<!-- 需求内容 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" class="mb-3" label="需求内容">
<quill-editor
:options="editorOption"
@blur="onEditorBlur($event)"
@change="onEditorChange($event)"
@focus="onEditorFocus($event)"
class="editor-box"
ref="myQuillEditor"
v-model="needContent"
></quill-editor>
<a-upload
accept="image/png, image/jpeg"
name="files"
:multiple="false"
style="display: none"
:action="action"
@change="fileChange"
>
<a-button id="upload-img"> <a-icon type="upload" /></a-button>
</a-upload>
</a-form-item>
<!-- 现有基础 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" class="mb-3" label="现有基础">
<a-textarea
placeholder="(已经开展的工作、所处阶段、投入资金和人力、仪器 设备、生产条件等)"
style="min-height: 100px"
v-model.trim="platform.basics"
/>
</a-form-item>
</a-form>
</a-modal>
</div>
</template>
<script>
import { upload, academySave, queryMold } from 'config/api';
import { mapState } from 'vuex';
import { quillEditor } from 'vue-quill-editor'; //
import 'quill/dist/quill.core.css';
import 'quill/dist/quill.snow.css';
import 'quill/dist/quill.bubble.css';
import { upload, addTelease, findTypeList } from 'config/api';
const formItemLayout = {
labelCol: { span: 5 },
wrapperCol: { span: 18 },
};
const formTailLayout = {
labelCol: { span: 6 },
wrapperCol: { span: 16 },
wrapperCol: { span: 18, offset: 6 },
};
const tailItemLayout = { wrapperCol: { span: 16, offset: 6 } };
const toolbarOptions = [
['bold', 'italic', 'underline', 'strike'], //线线
['blockquote', 'code-block'], //
[{ header: 1 }, { header: 2 }], // 12
[{ list: 'ordered' }, { list: 'bullet' }], //
[{ script: 'sub' }, { script: 'super' }], //
[{ indent: '-1' }, { indent: '+1' }], //
[{ direction: 'rtl' }], //
// [{ size: ['small', false, 'large', 'huge'] }], //
// [{ header: [1, 2, 3, 4, 5, 6, false] }], //
[{ color: [] }, { background: [] }], //
// [{ font: [] }], //
[{ align: [] }], //
['clean'], //
['image', 'video'], //
];
export default {
name: 'CollegeAdd',
props: { visible: { type: Boolean, default: false } },
name: 'Enroll',
components: { quillEditor },
data() {
return {
form: this.$form.createForm(this, { name: 'submit' }),
visible: false,
title: '发榜',
action: upload,
formItemLayout,
tailItemLayout,
form: this.$form.createForm(this, { name: 'r-d-member-add' }),
upload: upload,
fileList: [],
//
beforeUpload: file => {
const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
if (!isJpgOrPng) {
this.$message.error('仅支持 JPG/PNG 格式的图片!');
formTailLayout,
confirmLoading: false,
needContent: ``,
editorOption: {
placeholder: '在这里输入...',
modules: {
toolbar: {
container: toolbarOptions, //
handlers: {
image: function(value) {
if (value) {
// alert('');
document.getElementById('upload-img').click();
} else {
this.quill.format('image', false);
}
return isJpgOrPng;
},
recStatusList: ['视频', '音频', 'PPT'],
bannersList: [],
banner: [],
title: '',
contentUrl: '',
intro: '',
times: '',
type: 1,
whetherShow: 0,
},
video: function(value) {
if (value) {
alert('自定义视频');
} else {
this.quill.format('image', false);
}
},
},
},
},
},
platform: {
needName: '',
technicalField: '',
basics: '',
companyName: '',
type: [],
buildTime: '',
},
hideMessage: null,
typeList: [],
};
},
computed: mapState('user', ['anyringToken']),
created() {
this.getQueryMold();
this.findType();
},
methods: {
changeBirthday(date, dateString) {
// console.log(this.$moment(date._e).format('YYYY-MM-DD HH:mm:ss'));
this.times = this.$moment(date._e).format('YYYY-MM-DD HH:mm:ss');
//
changeNeedTime(date, dateString) {
this.platform.buildTime = this.$moment(date).format('YYYY-MM-DD HH:mm:ss');
// console.log(this.$moment(date).unix(), dateString);
},
onChange(e) {
console.log(this.whetherShow);
onEditorReady(editor) {
//
},
onEditorBlur() {}, //
onEditorFocus() {}, //
onEditorChange() {
//
// console.log(this.content);
},
onChangeBan(e) {
this.banner = e;
onChange(e) {
console.log(e);
this.platform.type = e;
},
//
handleChange(info) {
// this.fileList = fileList;
fileChange(info) {
console.log(info);
if (info.file.status === 'uploading') {
if (!this.hideMessage) {
this.hideMessage = this.$message.loading('上传中...');
}
}
// this.fileList = info.fileList;
if (info.file.status === 'done') {
this.fileList.push(info.file.response.data[0].id);
} else if (info.file.status === 'removed') {
this.fileList = info.fileList;
this.files = [];
const img = `<img src=${info.file.response.data[0].visitUrl} >`;
this.needContent += img;
setTimeout(this.hideMessage, 0);
this.$message.success('上传成功');
}
},
changeIpt(e, str) {
this[str] = e.target.value;
//
showModal() {
this.visible = true;
},
getUse(e, str) {
this[str] = e;
//
handleCancel(e) {
this.visible = false;
},
async getQueryMold() {
try {
const res = await queryMold();
const { code, msg, data } = res.data;
if (code === 200) {
this.bannersList = data;
} else {
this.$message.error(msg);
}
} catch (error) {
this.$message.error(error);
}
//
handleOk() {
this.subMitAdd();
},
//
handleSubmit(e) {
e.preventDefault();
this.form.validateFieldsAndScroll(async (err, values) => {
if (!err) {
if (this.fileList.length > 0) {
//
async subMitAdd() {
this.confirmLoading = true;
try {
this.picId = this.fileList[0];
const params = {
param: {
banners: this.banners,
contentUrl: this.contentUrl,
coverPicture: this.fileList[0],
intro: this.intro,
times: this.times,
title: this.title,
type: this.type,
whetherShow: this.whetherShow,
address: '123',
title: this.platform.needName,
content: this.needContent,
servics: this.platform.technicalField,
companyName: this.platform.companyName,
deadline: this.platform.buildTime,
existingBasis: this.platform.basics,
models: this.platform.type,
},
};
const res = await academySave(params);
const { data, msg, code } = res.data;
const res = await addTelease(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.$emit('handleTableChange');
this.$emit('closeModal');
this.$message.success('添加成功');
this.visible = false;
this.confirmLoading = false;
for (let key in this.platform) {
this.platform[key] = '';
}
} else {
throw msg;
this.confirmLoading = false;
}
} catch (error) {
this.$message.error(error || '添加失败');
this.$message.error(error);
this.confirmLoading = false;
}
},
//
async findType() {
try {
const res = await findTypeList();
const { code, msg, data } = res.data;
if (code === 200) {
this.typeList = data;
} else {
this.$message.error('请上传图片');
console.log(msg);
}
} catch (error) {
console.log(error);
}
});
},
},
};
</script>
<style scoped lang="stylus"></style>
<style lang="stylus" scoped>
.must-color {
color: red;
}
.code_img {
height: 32px;
width: 120px;
}
.ql-editor {
min-height: 600px;
max-height: 800px;
}
.editor-box >>> .ql-editor {
min-height: 150px;
}
</style>

187
src/views/Challenge/components/ChallengeDate.vue

@ -16,41 +16,46 @@
<span>{{ index + 1 }}</span>
</template>
<template slot="coverPicture" slot-scope="text, record">
<img :src="record.coverPicture" width="50" height="50" />
<template slot="content" slot-scope="text, record">
<div v-dompurify-html="record.content"></div>
</template>
<template slot="type" slot-scope="text, record">
<span v-if="record.type === 1">视频</span>
<span v-else-if="record.type === 2">音频</span>
<span v-else-if="record.type === 3">ppt</span>
<template slot="bid" slot-scope="text, record">
<span style="cursor: pointer; color: #2db7f5" @click="showList(record)">查看揭榜列表</span>
</template>
<template slot="whetherShow" slot-scope="text, record">
<span v-if="record.whetherShow === 0"></span>
<span v-else-if="record.whetherShow === 1"></span>
<template slot="billboardStatus" slot-scope="text, record">
<a-tag v-if="record.billboardStatus === 0" color="#108ee9"> 待审核 </a-tag>
<a-tag v-else-if="record.billboardStatus === 1" color="#87d068"> 审核通过 </a-tag>
<a-tag v-else-if="record.billboardStatus === 2" color="#2db7f5"> 完成 </a-tag>
<a-tag v-else-if="record.billboardStatus === 3" color="#ccc"> 发榜取消 </a-tag>
</template>
<template slot="edit" slot-scope="text, record">
<a-icon @click="showEditModal(record)" class="pointer" theme="twoTone" type="edit" />
<a-popconfirm @confirm="() => onDelete(record.academyId)" title="确定要删除这一条?" v-if="lists.list.length">
<a-icon class="ml-4 pointer" theme="twoTone" two-tone-color="#ff0000" type="delete" />
</a-popconfirm>
<a-tag color="blue" class="ml-3" style="cursor: pointer" @click="changeStatus(record.bid)"> 审核 </a-tag>
</template>
<div class="d-flex flex-nowrap justify-space-between" slot="expandedRowRender" slot-scope="record" style="margin: 0">
{{ getselContent(record.id) }}
</div>
</a-table>
</div>
<a-empty v-else />
<a-modal title="发榜审核" :visible="visible" :confirm-loading="confirmLoading" @ok="handleOk" @cancel="handleCancel" destroy-on-close>
<a-select style="width: 240px" @change="handleChange">
<a-select-option v-for="(item, index) in statusList" :value="index" :key="index">
{{ item }}
</a-select-option>
</a-select>
</a-modal>
<!-- 编辑 -->
<!-- <challenge-edit :edit-visible="editVisible" :edit-data="editData" @getData="getData" :contents="contents" @closeModal="closeModal" /> -->
<challenge-edit :edit-visible="editVisible" :edit-data="editData" @getData="getData" :contents="contents" @closeModal="closeModal" />
<!-- 揭榜列表 -->
<unveiling-date :unvu-visible="unvuVisible" :obj-data="objData" @getData="getData" @closeModal1="closeModal1" />
</div>
</template>
<script>
// import ChallengeEdit from 'components/Challenge/ChallengeEdit.vue';
import { academyDelete } from 'config/api';
import ChallengeEdit from './ChallengeEdit.vue';
import UnveilingDate from './UnveilingDate.vue';
import { academyDelete, upPublished } from 'config/api';
const columns = [
{
title: '序号',
@ -67,45 +72,51 @@ const columns = [
key: 'title',
},
{
title: '内容链接',
title: '公司名称',
align: 'center',
dataIndex: 'contentUrl',
key: 'contentUrl',
},
dataIndex: 'companyName',
key: 'companyName',
},
// {
// title: '',
// align: 'center',
// dataIndex: 'companyName',
// key: 'companyName',
// },
{
title: '封面图片',
title: '需求内容',
align: 'center',
dataIndex: 'coverPicture',
key: 'coverPicture',
scopedSlots: { customRender: 'coverPicture' },
dataIndex: 'content',
key: 'content',
scopedSlots: { customRender: 'content' },
},
{
title: '简介',
title: '截止时间',
align: 'center',
dataIndex: 'intro',
key: 'intro',
dataIndex: 'deadline',
key: 'deadline',
// scopedSlots: { customRender: 'picUrl' },
},
{
title: '类型',
title: '所属领域',
align: 'center',
dataIndex: 'type',
key: 'type',
scopedSlots: { customRender: 'type' },
dataIndex: 'servics',
key: 'servics',
scopedSlots: { customRender: 'servics' },
},
{
title: '时间',
title: '揭榜列表',
align: 'center',
dataIndex: 'times',
key: 'times',
scopedSlots: { customRender: 'times' },
dataIndex: 'bid',
key: 'bid',
scopedSlots: { customRender: 'bid' },
},
{
title: '是否在首页展示',
title: '审核状态',
align: 'center',
dataIndex: 'whetherShow',
key: 'whetherShow',
scopedSlots: { customRender: 'whetherShow' },
dataIndex: 'billboardStatus',
key: 'billboardStatus',
scopedSlots: { customRender: 'billboardStatus' },
},
{
title: '编辑',
@ -118,21 +129,25 @@ const columns = [
export default {
name: 'CollegeDate',
// components: {
// ChallengeEdit,
// },
// props: { lists: { type: Array, default: () => {} } },
components: { ChallengeEdit, UnveilingDate },
props: { lists: { type: Object, default: () => {} }, pagination: { type: Object, default: () => {} } },
data() {
return {
columns,
visible: false,
loading: false,
confirmLoading: false,
editingKey: '',
height: '',
editVisible: false,
editData: null,
contents: '',
statusList: ['待审核', '审核通过', '完成', '发榜取消'],
recordId: '',
recordStatus: '',
objData: null,
unvuVisible: false,
};
},
@ -148,14 +163,44 @@ export default {
};
},
methods: {
async handleOk() {
try {
this.confirmLoading = true;
const params = {
param: {
id: this.recordId,
billboardStatus: this.recordStatus,
},
};
const res = await upPublished(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.$message.success('修改成功');
this.$emit('getListData');
this.visible = false;
} else {
this.$message.error(msg);
}
} catch (error) {
this.$message.error(error);
}
this.confirmLoading = false;
},
handleCancel() {
this.visible = false;
},
handleChange(e) {
this.recordStatus = e;
},
showEditModal(data) {
this.editData = data;
this.contents = this.getselContent(data.id);
this.editVisible = true;
},
closeModal() {
this.editVisible = false;
closeModal(data) {
this.editVisible = data;
},
closeModal1(data) {
this.unvuVisible = data;
},
handleTableChange(pagination) {
const { current, pageSize } = pagination;
@ -165,43 +210,13 @@ export default {
getData() {
this.$emit('getListData');
},
//
async onDelete(academyId) {
try {
const params = { param: { academyId } };
const res = await academyDelete(params);
const { data, msg, code } = res.data;
if (code === 200) {
this.$emit('getListData');
this.$message.success('删除成功');
// TODO:
} else {
throw msg;
}
} catch (error) {
this.$message.error(error || '删除失败');
}
changeStatus(id) {
this.recordId = id;
this.visible = true;
},
//
getselContent(id) {
try {
const parmas = {
param: {
id: +id,
serviceType: 2,
},
};
const res = selContent(params);
const { code, msg, data } = res.data;
if (code === 200) {
// console.log(data);
return data.content;
} else {
return '暂无内容';
}
} catch (error) {
return '暂无内容';
}
showList(data) {
this.objData = data;
this.unvuVisible = true;
},
},
};

321
src/views/Challenge/components/ChallengeEdit.vue

@ -0,0 +1,321 @@
<template>
<div>
<a-modal :confirm-loading="confirmLoading" :title="title" :visible="editVisible" @cancel="handleCancel" @ok="handleOk" width="50%">
<a-spin v-if="platform.id === ''" />
<a-form :form="form" v-else>
<!-- 需求名称 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" class="mb-3" label="需求名称">
<a-input placeholder="请输入需求名称..." v-model.trim="platform.title" />
</a-form-item>
<!-- 公司名称 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" class="mb-3" label="公司名称">
<a-input placeholder="请输入公司名称..." v-model.trim="platform.companyName" />
</a-form-item>
<!-- 技术领域 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" class="mb-3" label="技术领域">
<a-input placeholder="请输入技术领域..." v-model.trim="platform.servics" />
</a-form-item>
<!-- 需求截止时间 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" class="mb-3" label="截止时间">
<a-date-picker :default-value="$moment(platform.deadline, dateFormat)" @change="changeNeedTime" style="width: 100%" />
</a-form-item>
<!-- 需求类别 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" class="mb-3" label="需求类别">
<a-checkbox-group :default-value="platform.models" @change="onChange" class="line-height-30">
<a-checkbox style="width: 100%" v-for="(item, index) in typeList" :key="index" :value="item.id">{{ item.name }}</a-checkbox>
</a-checkbox-group>
</a-form-item>
<!-- 需求内容 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" class="mb-3" label="需求内容">
<quill-editor
:options="editorOption"
@blur="onEditorBlur($event)"
@change="onEditorChange($event)"
@focus="onEditorFocus($event)"
class="editor-box"
ref="myQuillEditor"
v-model="platform.content"
></quill-editor>
<a-upload
accept="image/png, image/jpeg"
name="files"
:multiple="false"
style="display: none"
:action="action"
@change="fileChange"
>
<a-button id="upload-img"> <a-icon type="upload" /></a-button>
</a-upload>
</a-form-item>
<!-- 现有基础 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" class="mb-3" label="现有基础">
<a-textarea
placeholder="(已经开展的工作、所处阶段、投入资金和人力、仪器 设备、生产条件等)"
style="min-height: 100px"
v-model.trim="platform.existingBasis"
/>
</a-form-item>
</a-form>
</a-modal>
</div>
</template>
<script>
import { mapState } from 'vuex';
import { quillEditor } from 'vue-quill-editor'; //
import 'quill/dist/quill.core.css';
import 'quill/dist/quill.snow.css';
import 'quill/dist/quill.bubble.css';
import { upload, updateTelease, findTypeList, selTeleaseById } from 'config/api';
const formItemLayout = {
labelCol: { span: 5 },
wrapperCol: { span: 18 },
};
const formTailLayout = {
labelCol: { span: 6 },
wrapperCol: { span: 18, offset: 6 },
};
const toolbarOptions = [
['bold', 'italic', 'underline', 'strike'], //线线
['blockquote', 'code-block'], //
[{ header: 1 }, { header: 2 }], // 12
[{ list: 'ordered' }, { list: 'bullet' }], //
[{ script: 'sub' }, { script: 'super' }], //
[{ indent: '-1' }, { indent: '+1' }], //
[{ direction: 'rtl' }], //
// [{ size: ['small', false, 'large', 'huge'] }], //
// [{ header: [1, 2, 3, 4, 5, 6, false] }], //
[{ color: [] }, { background: [] }], //
// [{ font: [] }], //
[{ align: [] }], //
['clean'], //
['image', 'video'], //
];
export default {
name: 'ChallengeEdit',
components: { quillEditor },
props: {
editVisible: {
type: Boolean,
default: false,
},
editData: {
type: Object,
default: () => {},
},
},
data() {
return {
form: this.$form.createForm(this, { name: 'submit' }),
title: '发榜',
action: upload,
formItemLayout,
formTailLayout,
confirmLoading: false,
needContent: ``,
editorOption: {
placeholder: '在这里输入...',
modules: {
toolbar: {
container: toolbarOptions, //
handlers: {
image: function(value) {
if (value) {
// alert('');
document.getElementById('upload-img').click();
} else {
this.quill.format('image', false);
}
},
video: function(value) {
if (value) {
alert('自定义视频');
} else {
this.quill.format('image', false);
}
},
},
},
},
},
dateFormat: 'YYYY-MM-DD',
platform: {
id: '',
title: '',
companyName: '',
content: '',
servics: '',
deadline: '',
existingBasis: '',
models: [],
},
hideMessage: null,
typeList: [],
};
},
computed: mapState('user', ['anyringToken']),
watch: {
editVisible(val) {
if (val) {
this.confirmLoading = true;
this.getDetail(this.editData.bid);
}
},
},
created() {
this.findType();
},
methods: {
//
changeNeedTime(date, dateString) {
this.platform.buildTime = this.$moment(date).format('YYYY-MM-DD HH:mm:ss');
// console.log(this.$moment(date).unix(), dateString);
},
async getDetail(id) {
try {
const params = { param: { id } };
const res = await selTeleaseById(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.platform.id = data.bid;
this.platform.title = data.title;
this.platform.content = data.content;
this.platform.companyName = data.companyName;
this.platform.servics = data.servics;
this.platform.deadline = data.deadline;
this.platform.existingBasis = data.existingBasis;
this.platform.models = this.getModelId(data.list);
console.log(this.platform.models);
this.confirmLoading = false;
} else {
console.log(msg);
this.confirmLoading = false;
}
} catch (error) {
console.log(error);
this.confirmLoading = false;
}
},
getModelId(list) {
console.log(list);
this.platform.models = [];
let idList = [];
for (var i = 0; i < list.length; i++) {
idList.push(list[i].moid);
}
return idList;
},
onEditorReady(editor) {
//
},
onEditorBlur() {}, //
onEditorFocus() {}, //
onEditorChange() {
//
// console.log(this.content);
},
onChange(e) {
console.log(e);
this.platform.models = e;
},
//
fileChange(info) {
console.log(info);
if (info.file.status === 'uploading') {
if (!this.hideMessage) {
this.hideMessage = this.$message.loading('上传中...');
}
}
// this.fileList = info.fileList;
if (info.file.status === 'done') {
this.files = [];
const img = `<img src=${info.file.response.data[0].visitUrl} >`;
this.needContent += img;
setTimeout(this.hideMessage, 0);
this.$message.success('上传成功');
}
},
//
handleCancel(e) {
for (let key in this.platform) {
this.platform[key] = '';
}
this.$emit('closeModal', false);
},
//
handleOk() {
this.subMitAdd();
},
//
async subMitAdd() {
this.confirmLoading = true;
try {
const params = {
param: {
id: this.platform.id,
title: this.platform.title,
content: this.platform.content,
servics: this.platform.servics,
deadline: this.platform.deadline,
existingBasis: this.platform.existingBasis,
models: this.platform.models,
},
};
const res = await updateTelease(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.$message.success('修改成功');
this.$emit('getData');
this.handleCancel();
this.confirmLoading = false;
for (let key in this.platform) {
this.platform[key] = '';
}
} else {
throw msg;
this.confirmLoading = false;
}
} catch (error) {
this.$message.error(error);
this.confirmLoading = false;
}
},
//
async findType() {
try {
const res = await findTypeList();
const { code, msg, data } = res.data;
if (code === 200) {
this.typeList = data;
} else {
console.log(msg);
}
} catch (error) {
console.log(error);
}
},
},
};
</script>
<style lang="stylus" scoped>
.must-color {
color: red;
}
.code_img {
height: 32px;
width: 120px;
}
.ql-editor {
min-height: 600px;
max-height: 800px;
}
.editor-box >>> .ql-editor {
min-height: 150px;
}
</style>

48
src/views/Challenge/components/ChallengeSearch.vue

@ -2,44 +2,45 @@
<div class="d-flex flex-wrap pb-3">
<div>
<a-input placeholder="标题" style="width: 150px" v-model="title" allow-clear />
<span class="ml-3"> 类型:</span>
<a-select @change="handleChangeSelect" class="ml-3" style="width: 150px" placeholder="类型" allow-clear>
<a-select-option :key="item" :value="index + 1" v-for="(item, index) in statusList">{{ item }}</a-select-option>
<a-input placeholder="公司名称" class="ml-3 mb-3" style="width: 150px" v-model="companyName" allow-clear />
<span class="ml-3"> 截止时间:</span>
<a-range-picker class="ml-3 mb-3" @change="onChange" allow-clear />
<br />
<a-input placeholder="所属领域" style="width: 150px" v-model="servics" allow-clear />
<span class="ml-3"> 审核状态:</span>
<a-select @change="handleChangeSelect" class="ml-3" style="width: 150px" placeholder="状态" allow-clear>
<a-select-option :key="item" :value="index" v-for="(item, index) in statusList">{{ item }}</a-select-option>
</a-select>
<span class="ml-3"> 栏目:</span>
<a-checkbox-group class="ml-3" @change="onChange">
<a-checkbox class="my-2" v-for="(item, index) in bannersList" :key="index" :value="item.moldId">{{ item.moldName }}</a-checkbox>
</a-checkbox-group>
<a-button @click="handleTableChange" class="mx-2" type="primary">搜索</a-button>
</div>
<div class="flex-1"></div>
<a-button type="primary" @click="showModal" class="editable-add-btn">增加</a-button>
<!-- <a-button type="primary" @click="showModal" class="editable-add-btn">增加</a-button> -->
<!-- 添加 -->
<college-add :visible="visible" @closeModal="closeModal" @handleTableChange="handleTableChange" />
<challenge-add :visible="visible" @handleTableChange="handleTableChange" />
</div>
</template>
<script>
import CollegeAdd from './CollegeAdd.vue';
import ChallengeAdd from './ChallengeAdd.vue';
import { queryMold } from 'config/api';
export default {
name: 'CollegeSearch',
components: {
CollegeAdd,
},
components: { ChallengeAdd },
data() {
return {
visible: false,
title: '',
statusList: ['视频', '音频', 'ppt'],
bannersList: [],
banner: [],
type: '',
statusList: ['待审核', '审核通过', '完成', '发榜取消'],
companyName: '',
startTime: '',
endTime: '',
servics: '',
billboardStatus: '',
};
},
created() {
@ -47,7 +48,10 @@ export default {
},
methods: {
onChange(e) {
this.banner = e;
console.log(this.$moment(e[0]._d).format('YYYY-MM-DD HH:mm:ss'));
console.log(this.$moment(e[1]._d).format('YYYY-MM-DD HH:mm:ss'));
this.startTime = this.$moment(e[0]._d).format('YYYY-MM-DD HH:mm:ss');
this.endTime = this.$moment(e[1]._d).format('YYYY-MM-DD HH:mm:ss');
},
showModal() {
@ -59,14 +63,14 @@ export default {
},
handleChangeSelect(e) {
// this[type] = value;
this.type = e;
// console.log(e);
this.billboardStatus = e;
},
async handleTableChange() {
const { title, type, banner } = this;
const { title, companyName, startTime, endTime, servics, billboardStatus } = this;
//
const condition = { title, type, banner };
const condition = { title, companyName, startTime, endTime, servics, billboardStatus };
await this.$emit('getListData', condition);
},
async getQueryMold() {

44
src/views/Challenge/components/UnveSearch.vue

@ -0,0 +1,44 @@
<template>
<div class="d-flex flex-wrap pb-3">
<div>
<a-input placeholder="揭榜人" style="width: 150px" v-model="accepterName" allow-clear />
<span class="ml-3"> 揭榜状态:</span>
<a-select @change="handleChangeSelect" class="ml-3" style="width: 150px" placeholder="状态" allow-clear>
<a-select-option :key="item" :value="index" v-for="(item, index) in statusList">{{ item }}</a-select-option>
</a-select>
<a-button @click="handleTableChange" class="mx-2" type="primary">搜索</a-button>
</div>
<div class="flex-1"></div>
</div>
</template>
<script>
export default {
name: 'UnveSearch',
data() {
return {
visible: false,
title: '',
statusList: ['待审核', '成功', '未成功'],
orderStatus: '',
accepterName: '',
};
},
methods: {
handleChangeSelect(e) {
this.orderStatus = e;
},
handleTableChange() {
const { orderStatus, accepterName } = this;
//
const condition = { orderStatus, accepterName };
this.$emit('getData', condition);
},
},
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped lang="stylus"></style>

251
src/views/Challenge/components/UnveilingDate.vue

@ -0,0 +1,251 @@
<template>
<div>
<a-modal
:footer="false"
:confirm-loading="confirmLoading"
:title="title"
:visible="unvuVisible"
@cancel="handleCancel"
@ok="handleOk"
width="80%"
>
<unve-search @getData="getData" />
<a-table
:columns="columns"
:data-source="dataList"
:loading="loading"
:row-key="record => record.id"
:pagination="pagination"
@change="handleTableChange"
bordered
class="white"
>
<template slot="id" slot-scope="text, record, index">
<span>{{ index + 1 }}</span>
</template>
<template slot="orderStatus" slot-scope="text, record">
<div style="width: 120px; text-align: center; margin: auto" v-if="!record.editable">
<span v-if="record.orderStatus === 0">待审核</span>
<span v-else-if="record.orderStatus === 1">成功</span>
<span v-else-if="record.orderStatus === 2">未成功</span>
</div>
<div v-else>
<a-select style="width: 120px" @change="changeRecord">
<a-select-option v-for="(item, index) in statusList" :key="index" :value="index">
{{ item }}
</a-select-option>
</a-select>
</div>
</template>
<template slot="edit" slot-scope="text, record, index">
<a-icon v-if="!record.editable" @click="changeStatus(record, index)" class="pointer" theme="twoTone" type="edit" />
<span v-else>
<a @click="saveStatus(index)">保存</a>
<a class="ml-3" @click="changeStatus(record.id, index)">取消</a>
</span>
</template>
</a-table>
</a-modal>
</div>
</template>
<script>
import { mapState } from 'vuex';
import UnveSearch from './UnveSearch.vue';
import { selfulUnveiling, upUnveiling } from 'config/api';
const columns = [
{
title: '序号',
align: 'center',
dataIndex: 'id',
key: 'id',
width: '7%',
scopedSlots: { customRender: 'id' },
},
{
title: '揭榜人',
align: 'center',
dataIndex: 'accepterName',
key: 'accepterName',
},
{
title: '揭榜单位',
align: 'center',
dataIndex: 'unit',
key: 'unit',
},
{
title: '手机号',
align: 'center',
dataIndex: 'phone',
key: 'phone',
},
{
title: '时间',
align: 'center',
dataIndex: 'times',
key: 'times',
},
{
title: '方案简述',
align: 'center',
dataIndex: 'planIntro',
key: 'planIntro',
},
{
title: '揭榜状态',
align: 'center',
dataIndex: 'orderStatus',
key: 'orderStatus',
scopedSlots: { customRender: 'orderStatus' },
},
{
title: '操作',
align: 'center',
dataIndex: 'edit',
key: 'edit',
width: '15%',
scopedSlots: { customRender: 'edit' },
},
];
export default {
name: 'UnveilingDate',
components: { UnveSearch },
props: {
unvuVisible: {
type: Boolean,
default: false,
},
objData: {
type: Object,
default: () => {},
},
},
data() {
return {
title: '发榜',
confirmLoading: false,
loading: false,
columns: columns,
pagination: { current: 1, pageSize: 10 },
billboardId: '',
orderStatus: '',
accepterName: '',
pageNum: 1,
pageSize: 10,
dataList: [],
statusList: ['待审核', '成功', '未成功'],
status: '',
id: '',
};
},
watch: {
objData(val) {
if (val.bid) {
this.getData();
}
},
},
methods: {
handleCancel() {
this.$emit('closeModal1', false);
},
handleOk() {
this.$emit('closeModal1', false);
},
async getData(condition) {
try {
if (condition && condition.current) {
this.pageNum = condition.current;
this.pageSize = condition.pageSize;
} else if (condition) {
this.orderStatus = condition.orderStatus;
this.accepterName = condition.accepterName;
this.pageNum = 1;
this.pageSize = 10;
}
const params = {
param: {
accepterName: this.accepterName,
billboardId: this.objData.bid,
orderStatus: this.orderStatus,
pageNum: this.pageNum,
pageSize: this.pageSize,
},
};
const res = await selfulUnveiling(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.dataList = data.list;
for (let i = 0; i < this.dataList.length; i++) {
this.dataList.editable = true;
}
} else {
this.$message.error(msg);
}
} catch (error) {
this.$message.error(error);
}
},
handleTableChange(pagination) {
const { current, pageSize } = pagination;
const condition = { current, pageSize };
this.getData();
},
changeStatus(data, index) {
const newDataList = [...this.dataList];
newDataList[index].editable = !newDataList[index].editable;
this.dataList = newDataList;
this.status = data.orderStatus;
this.id = data.id;
},
changeRecord(e) {
this.status = e;
},
async saveStatus(index) {
try {
const params = {
param: {
id: this.id,
orderStatus: this.status,
},
};
const res = await upUnveiling(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.$message.success('修改成功');
const newDataList = [...this.dataList];
newDataList[index].editable = !newDataList[index].editable;
this.dataList = newDataList;
this.getData();
} else {
this.$message.error(msg);
}
} catch (error) {
this.$message.error(error);
}
},
},
};
</script>
<style lang="stylus" scoped>
.must-color {
color: red;
}
.code_img {
height: 32px;
width: 120px;
}
.ql-editor {
min-height: 600px;
max-height: 800px;
}
.editor-box >>> .ql-editor {
min-height: 150px;
}
</style>

4
src/views/College/College.vue

@ -19,7 +19,7 @@ export default {
data() {
return {
str: '轮播图管理界面',
str: '创业学院管理界面',
lists: {},
pagination: { current: 1, pageSize: 10 },
pageNum: 1,
@ -43,7 +43,7 @@ export default {
if (condition && condition.current) {
this.pageNum = condition.current;
this.pageSize = condition.pageSize;
} else if (condition && !condition.pageNum) {
} else if (condition && !condition.current) {
this.paramData = condition;
}
const params = {

3
src/views/College/components/CollegeDate.vue

@ -44,7 +44,8 @@
<a-empty v-else />
<!-- 编辑 -->
<!-- <challenge-edit :edit-visible="editVisible" :edit-data="editData" @getData="getData" :contents="contents" @closeModal="closeModal" /> -->
<!-- <challenge-edit :edit-visible="editVisible" :edit-data="editData"
@getData="getData" :contents="contents" @closeModal="closeModal" /> -->
</div>
</template>

4
src/views/College/components/CollegeSearch.vue

@ -29,9 +29,7 @@ import { queryMold } from 'config/api';
export default {
name: 'CollegeSearch',
components: {
CollegeAdd,
},
components: { CollegeAdd },
data() {
return {
visible: false,

Loading…
Cancel
Save