Browse Source

轮播图相关

master
aBin 4 years ago
parent
commit
dec6b86ee3
  1. 13
      package-lock.json
  2. 1
      package.json
  3. 2
      src/common/portrait.styl
  4. 203
      src/components/Banner/BannerAdd.vue
  5. 27
      src/components/Banner/BannerDate.vue
  6. 199
      src/components/Banner/BannerEdit.vue
  7. 119
      src/components/Banner/BannerSearch.vue
  8. 2
      src/components/BtnCom/BtnCon.vue
  9. 328
      src/components/Page/PageAdd.vue
  10. 128
      src/components/Page/PageDate.vue
  11. 204
      src/components/Page/PageEdit.vue
  12. 33
      src/components/Page/PageSearch.vue
  13. 213
      src/components/QuillEditor/QuillEditor.vue
  14. 29
      src/config/api.js
  15. 3
      src/main.js
  16. 136
      src/store/state.js
  17. 35
      src/views/BannerManage/BannerManage.vue
  18. 27
      src/views/PageManage/PageManage.vue

13
package-lock.json

@ -5194,6 +5194,11 @@
"domelementtype": "1"
}
},
"dompurify": {
"version": "2.2.6",
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.2.6.tgz",
"integrity": "sha512-7b7ZArhhH0SP6W2R9cqK6RjaU82FZ2UPM7RO8qN1b1wyvC/NY1FNWcX1Pu00fFOAnzEORtwXe4bPaClg6pUybQ=="
},
"domready": {
"version": "1.0.8",
"resolved": "https://registry.npm.taobao.org/domready/download/domready-1.0.8.tgz",
@ -12589,6 +12594,14 @@
"integrity": "sha1-KdTrSCdcf+FbkuH9XZX74qlmQ28=",
"dev": true
},
"vue-dompurify-html": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/vue-dompurify-html/-/vue-dompurify-html-2.3.0.tgz",
"integrity": "sha512-Iz9wI4iiJF+rzC2x3r8quw/VXrkwgMsWXt9p0Le4wXtolBXwMDJOmK3QNMiNg36bzU2b0f3En/wjidoeRVNZ7A==",
"requires": {
"dompurify": "^2.0.0"
}
},
"vue-eslint-parser": {
"version": "7.1.1",
"resolved": "https://registry.npm.taobao.org/vue-eslint-parser/download/vue-eslint-parser-7.1.1.tgz?cache=0&sync_timestamp=1602498980660&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-eslint-parser%2Fdownload%2Fvue-eslint-parser-7.1.1.tgz",

1
package.json

@ -15,6 +15,7 @@
"register-service-worker": "^1.7.1",
"stylus": "^0.54.8",
"vue": "^2.6.11",
"vue-dompurify-html": "^2.3.0",
"vue-quill-editor": "^3.0.6",
"vue-router": "^3.2.0",
"vuex": "^3.4.0"

2
src/common/portrait.styl

@ -183,8 +183,6 @@
.white--text{
color: #fff;
width: 200px;
margin: 0 auto
}

203
src/components/Banner/BannerAdd.vue

@ -3,67 +3,34 @@
<!-- 添加 -->
<a-modal :closable="false" footer title="添加轮播图" v-model="visible" width="700px">
<a-form :form="form" @submit="handleSubmit">
<!-- 页面路径 -->
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="页面路径"
>
<a-input
placeholder="页面路径"
v-decorator="[
'pagePath',
{
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
placeholder="排序"
v-decorator="[
'sort',
{
rules: [
{ required: true, message: '排序不能为空' },
{ whitespace: true, message: '排序不能为空' },
{ max: 140, massage: '排序最多140个字符' },
],
},
]"
/>
<!-- 跳转类型 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="跳转类型">
<a-select @change="getUse($event, 'jumpType')" class="ml-3" default-value="正常" style="width: 150px">
<a-select-option :key="item" :value="index" v-for="(item, index) in enable">{{ item }}</a-select-option>
</a-select>
</a-form-item>
<!-- 跳转路径 -->
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="跳转路径"
>
<a-input
placeholder="跳转路径"
v-decorator="[
'jumpPath',
{
rules: [
{ required: true, message: '跳转路径不能为空' },
{ whitespace: true, message: '跳转路径不能为空' },
{ max: 140, massage: '跳转路径最多140个字符' },
],
},
]"
/>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="图片跳转路径">
<a-input placeholder="图片跳转路径" class="ml-3" />
</a-form-item>
<!-- 状态 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="状态">
<a-select @change="getUse($event, 'recStatus')" class="ml-3" default-value="启用" style="width: 150px">
<a-select-option :key="item" :value="index" v-for="(item, index) in enable">{{ item }}</a-select-option>
</a-select>
</a-form-item>
<!-- 页面显示位置 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="页面显示位置">
<a-select @change="getUse($event, 'showPage')" class="ml-3" default-value="首页" style="width: 100%">
<a-select-option :key="item.page" :value="item.page" v-for="item in enable2">{{ item.name }}</a-select-option>
</a-select>
</a-form-item>
<!-- 图片 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="图片">
<a-upload :before-upload="beforeUpload" class="ml-3" :action="upload" list-type="picture" name="files" @change="handleChange">
<a-button v-show="fileList.length - 0 === 0"> <a-icon type="upload" /> 选择图片 </a-button>
</a-upload>
</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>
@ -74,7 +41,7 @@
</template>
<script>
// import { addTeam } from 'config/api'
import { upload, addCarousel } from 'config/api';
const formItemLayout = {
labelCol: { span: 6 },
@ -82,33 +49,127 @@ const formItemLayout = {
};
const tailItemLayout = { wrapperCol: { span: 16, offset: 6 } };
export default {
name: "BannerAdd",
name: 'BannerAdd',
props: { visible: { type: Boolean, default: false } },
data() {
return {
formItemLayout,
tailItemLayout,
form: this.$form.createForm(this, { name: 'r-d-add' }),
}
enable: ['启用', '禁用'],
enable1: ['不跳转', 'H5'],
enable2: [
{
name: '首页',
page: 0,
},
{
name: '关于我们-公司介绍',
page: 11,
},
{
name: '关于我们-组织机构',
page: 12,
},
{
name: '创新平台-创新资源平台',
page: 32,
},
{
name: '创新平台-科技创新服务',
page: 33,
},
{
name: ':孵化平台-众创空间',
page: 41,
},
{
name: '孵化平台-公共实验室',
page: 42,
},
{
name: '孵化平台-中试基地',
page: 43,
},
{
name: '孵化平台-创业导师',
page: 44,
},
{
name: '孵化平台-孵化场所',
page: 45,
},
{
name: '孵化平台-创业服务',
page: 46,
},
{
name: '孵化平台-众创空间-虚拟众创空间',
page: 48,
},
{
name: '孵化平台-众创空间-实体众创空间',
page: 49,
},
{
name: '产业平台-产业服务',
page: 52,
},
],
upload: upload,
paramD: {
jumpType: 0,
jumpUrl: '',
param: '',
url: '',
recStatus: 0,
showPage: 0,
},
fileList: [],
//
beforeUpload: file => {
const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
if (!isJpgOrPng) {
this.$message.error('仅支持 JPG/PNG 格式的图片!');
}
return isJpgOrPng;
},
};
},
methods: {
//
getUse(value, str) {
this.paramD[str] = value;
console.log(this.paramD[str]);
},
handleChange(info) {
// this.fileList = fileList;
console.log(info);
if (info.file.status === 'done') {
this.fileList.push(info.file.response.data[0].visitUrl);
} else if (info.file.status === 'removed') {
this.fileList = info.fileList;
}
},
//
handleSubmit(e) {
e.preventDefault();
this.paramD.url = this.fileList[0];
this.form.validateFieldsAndScroll(async (err, values) => {
if (!err) {
try {
// const params = { param: values };
// const res = await addTeam(params);
// const { data, msg, code } = res.data;
// this.$emit('closeModal');
// if (code === 200) {
// this.$message.success('')
// // TODO:
// } else {
// throw msg;
// }
const params = { param: this.paramD };
const res = await addCarousel(params);
const { data, msg, code } = res.data;
this.$emit('closeModal');
this.$emit('handleTableChange');
if (code === 200) {
this.$message.success('添加成功');
// TODO:
} else {
throw msg;
}
} catch (error) {
this.$message.error(error || '添加失败');
}

27
src/components/Banner/BannerDate.vue

@ -1,11 +1,13 @@
<template>
<div class="main flex-1">
<div style="width: 100%" v-if="lists && lists.list.length > 0">
<div style="width: 100%" v-if="lists && lists.list">
<a-table
:columns="columns"
:data-source="lists.list"
:loading="loading"
:row-key="record => record.id"
:pagination="pagination"
@change="handleTableChange"
bordered
class="white"
:scroll="{ y: height }"
@ -16,9 +18,17 @@
<template slot="url" slot-scope="text, record">
<img :src="record.url" style="width: 300px; height: 80px" alt="" />
</template>
<template slot="jumpType" slot-scope="text, record">
<span v-if="record.jumpType - 0 === 0">不跳转</span>
<span v-if="record.jumpType - 0 === 1">H5</span>
</template>
<template slot="jumpUrl" slot-scope="text, record">
<span v-if="record.jumpUrl">{{ jumpUrl }}</span>
<span v-else></span>
</template>
<template slot="edit" slot-scope="text, record">
<a-icon @click="showEditModal(record)" class="pointer" theme="twoTone" type="edit" />
<a-popconfirm @confirm="() => onDelete(record.id)" title="确定要删除这一条?" v-if="lists.list.length > 0">
<a-popconfirm @confirm="() => onDelete(record.id)" title="确定要删除这一条?" v-if="lists.list">
<a-icon class="ml-4 pointer" theme="twoTone" two-tone-color="#ff0000" type="delete" />
</a-popconfirm>
<a-switch checked-children="启用" class="ml-4" default-checked un-checked-children="禁用" />
@ -28,7 +38,7 @@
<a-empty v-else />
<!-- 编辑 -->
<banner-edit :edit-item="editItem" :edit-visible="editVisible" @closeM-modal="closeModal" />
<banner-edit :edit-item="editItem" :edit-visible="editVisible" @closeModal="closeModal" />
</div>
</template>
@ -105,6 +115,10 @@ export default {
type: Object,
default: () => {},
},
pagination: {
type: Object,
default: () => {},
},
},
data() {
return {
@ -130,7 +144,6 @@ export default {
methods: {
showEditModal(record) {
console.log('record: ', record);
this.editItem = record;
this.editVisible = true;
},
@ -138,7 +151,11 @@ export default {
closeModal() {
this.editVisible = false;
},
handleTableChange(pagination) {
const { current, pageSize } = pagination;
const condition = { current, pageSize };
this.$emit('getListData', condition);
},
//
async onDelete(teamId) {
try {

199
src/components/Banner/BannerEdit.vue

@ -1,69 +1,57 @@
<template>
<div class="d-flex flex-wrap pb-3">
<!-- 编辑 -->
<a-modal :closable="false" footer title="修改轮播图" v-model="editVisible" width="700px">
<a-form :form="form" @submit="handleSubmit">
<a-modal :closable="false" footer title="修改轮播图" v-model="editVisible" width="700px" @cancel="$emit('closeModal')">
<a-form :form="form" @submit="handleSubmit" v-if="editItem">
<!-- 页面路径 -->
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="页面路径"
>
<!-- <a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="页面路径">
<a-input
placeholder="页面路径"
v-decorator="[
'pagePath',
{
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
placeholder="排序"
v-decorator="[
'sort',
{
rules: [
{ required: true, message: '排序不能为空' },
{ whitespace: true, message: '排序不能为空' },
{ max: 140, massage: '排序最多140个字符' },
],
},
]"
'pagePath',
{
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-select @change="getUse($event, 'jumpType')" class="ml-3" :default-value="enable1[editItem.jumpType]" style="width: 150px">
<a-select-option :key="item" :value="index" v-for="(item, index) in enable1">{{ item }}</a-select-option>
</a-select>
</a-form-item>
<!-- 跳转路径 -->
<a-form-item
v-if="editItem.jumpType === 1"
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="跳转路径"
label="图片跳转路径"
>
<a-input
placeholder="跳转路径"
v-decorator="[
'jumpPath',
{
rules: [
{ required: true, message: '跳转路径不能为空' },
{ whitespace: true, message: '跳转路径不能为空' },
{ max: 140, massage: '跳转路径最多140个字符' },
],
},
]"
/>
<a-input v-model="editItem.jumpUrl" placeholder="图片跳转路径" class="ml-3" />
</a-form-item>
<!-- 状态 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="状态">
<a-select @change="getUse($event, 'recStatus')" class="ml-3" :default-value="enable[editItem.recStatus]" style="width: 150px">
<a-select-option :key="item" :value="index" v-for="(item, index) in enable">{{ item }}</a-select-option>
</a-select>
</a-form-item>
<!-- 页面显示位置 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="页面显示位置">
<a-select @change="getUse($event, 'showPage')" class="ml-3" :default-value="editItem.showPage" style="width: 100%">
<a-select-option :key="item.page" :value="item.page" v-for="item in enable2">{{ item.name }}</a-select-option>
</a-select>
</a-form-item>
<!-- 图片 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="图片">
<a-upload :before-upload="beforeUpload" class="ml-3" :action="upload" list-type="picture" name="files" @change="handleChange">
<a-button v-show="fileList.length - 0 === 0"> <a-icon type="upload" /> 选择图片 </a-button>
</a-upload>
</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>
@ -75,6 +63,7 @@
<script>
// import { upTeam } from 'config/api';
import { upload, addCarousel } from 'config/api';
const formItemLayout = {
labelCol: { span: 6 },
@ -84,19 +73,119 @@ const formItemLayout = {
const tailItemLayout = { wrapperCol: { span: 16, offset: 6 } };
export default {
name: "BannerEdit",
props: { editVisible: { type: Boolean, default: false },editItem: { type: Object, default: () => {} } },
name: 'BannerEdit',
props: { editVisible: { type: Boolean, default: false }, editItem: { type: Object, default: () => {} } },
data() {
return {
formItemLayout,
tailItemLayout,
form: this.$form.createForm(this, { name: 'r-d-add' }),
}
enable: ['启用', '禁用'],
enable1: ['不跳转', 'H5'],
enable2: [
{
name: '首页',
page: 0,
},
{
name: '关于我们-公司介绍',
page: 11,
},
{
name: '关于我们-组织机构',
page: 12,
},
{
name: '创新平台-创新资源平台',
page: 32,
},
{
name: '创新平台-科技创新服务',
page: 33,
},
{
name: ':孵化平台-众创空间',
page: 41,
},
{
name: '孵化平台-公共实验室',
page: 42,
},
{
name: '孵化平台-中试基地',
page: 43,
},
{
name: '孵化平台-创业导师',
page: 44,
},
{
name: '孵化平台-孵化场所',
page: 45,
},
{
name: '孵化平台-创业服务',
page: 46,
},
{
name: '孵化平台-众创空间-虚拟众创空间',
page: 48,
},
{
name: '孵化平台-众创空间-实体众创空间',
page: 49,
},
{
name: '产业平台-产业服务',
page: 52,
},
],
upload: upload,
fileList: [],
//
beforeUpload: file => {
const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
if (!isJpgOrPng) {
this.$message.error('仅支持 JPG/PNG 格式的图片!');
}
return isJpgOrPng;
},
};
},
watch: {
editItem(val) {
console.log(val);
},
},
methods: {
//
getUse(e, str) {
this.editItem[str] = e;
if (str === 'jumpType' && e === 0) {
this.editItem.jumpUrl = '';
}
},
showPageNums(nums) {
for (let i = 0; i < this.enable2.length; i++) {
if (nums - 0 === this.enable2[i].page - 0) {
return this.enable2[i].name;
} else if (i === this.enable2.length - 1) {
return '';
}
}
},
//
handleChange(info) {
// this.fileList = fileList;
if (info.file.status === 'done') {
this.fileList.push(info.file.response.data[0].visitUrl);
} else if (info.file.status === 'removed') {
this.fileList = info.fileList;
}
},
//
handleSubmit(e) {
console.log(this.editItem);
e.preventDefault();
this.form.validateFieldsAndScroll(async (err, values) => {
if (!err) {

119
src/components/Banner/BannerSearch.vue

@ -4,8 +4,16 @@
<div class="d-flex flex-wrap pb-3">
<div>
<!-- 启用 -->
<a-select @change="getUse" class="ml-3" default-value="启用" style="width: 150px">
<a-select-option :key="use" :value="use" v-for="use in enable">{{ use }}</a-select-option>
<a-select @change="getUse($event, 'recStatus')" class="ml-3" default-value="启用" style="width: 150px">
<a-select-option :key="item" :value="index" v-for="(item, index) in enable">{{ item }}</a-select-option>
</a-select>
<!-- 跳转类型 -->
<a-select @change="getUse($event, 'jumpType')" class="ml-3" default-value="不跳转" style="width: 150px">
<a-select-option :key="item" :value="index" v-for="(item, index) in enable1">{{ item }}</a-select-option>
</a-select>
<!-- 页面显示位置 -->
<a-select allow-clear @change="getUse($event, 'showPage')" class="ml-3" placeholder="查询全部" style="width: 250px">
<a-select-option :key="item.name" :value="item.page" v-for="item in enable2">{{ item.name }}</a-select-option>
</a-select>
<a-button @click="handleTableChange" class="mx-2" type="primary">搜索</a-button>
</div>
@ -15,55 +23,104 @@
<a-button @click="showModal" class="editable-add-btn">增加</a-button>
<!-- 添加 -->
<banner-add :visible="visible" @closeModal="closeModal" />
<banner-add :visible="visible" @closeModal="closeModal" @handleTableChange="handleTableChange" />
</div>
</template>
<script>
import BannerAdd from "components/Banner/BannerAdd.vue";
import BannerAdd from 'components/Banner/BannerAdd.vue';
// import { selLikeTeam } from 'config/api';
export default {
name: "BannerSearch",
components: {
BannerAdd,
},
name: 'BannerSearch',
components: { BannerAdd },
data() {
return {
visible: false,
enable: ['启用','禁用'],
use: '',
}
enable: ['启用', '禁用'],
enable1: ['不跳转', 'H5'],
enable2: [
{
name: '首页',
page: 0,
},
{
name: '关于我们-公司介绍',
page: 11,
},
{
name: '关于我们-组织机构',
page: 12,
},
{
name: '创新平台-创新资源平台',
page: 32,
},
{
name: '创新平台-科技创新服务',
page: 33,
},
{
name: ':孵化平台-众创空间',
page: 41,
},
{
name: '孵化平台-公共实验室',
page: 42,
},
{
name: '孵化平台-中试基地',
page: 43,
},
{
name: '孵化平台-创业导师',
page: 44,
},
{
name: '孵化平台-孵化场所',
page: 45,
},
{
name: '孵化平台-创业服务',
page: 46,
},
{
name: '孵化平台-众创空间-虚拟众创空间',
page: 48,
},
{
name: '孵化平台-众创空间-实体众创空间',
page: 49,
},
{
name: '产业平台-产业服务',
page: 52,
},
],
paramData: {
jumpType: 0, //
recStatus: 0, //
showPage: '', //
},
};
},
methods: {
showModal(){
showModal() {
this.visible = true;
},
closeModal(){
closeModal() {
this.visible = false;
},
//
getUse(value) {
console.log('value: ', value);
this.use = value;
//
getUse(value, str) {
this.paramData[str] = value;
console.log(this.paramData[str]);
},
async handleTableChange() {
try {
// const params = { param: {publishingPlatform: this.publishingPlatform} };
// const res = await selLikeTeam(params);
// const { data, msg, code } = res.data;
// if (code === 200) {
// console.log('',data);
// // TODO:
// } else {
// throw msg;
// }
} catch (error) {
this.$message.error(error);
}
handleTableChange() {
this.$emit('getListData', this.paramData);
},
},
};

2
src/components/BtnCom/BtnCon.vue

@ -3,12 +3,12 @@
<div class="font-bold-24">行政部</div>
<div @click="jump('/page-manage')" class="btn">内容管理</div>
<div @click="jump('/industry-info')" class="btn">行业资讯</div>
<div @click="jump('/talent-recruitment')" class="btn">人才招聘</div>
<div @click="jump('/user-manage')" class="btn">用户管理</div>
<div @click="jump('/banner-manage')" class="btn">轮播图管理</div>
<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('/talent-recruitment')" class="btn">人才招聘</div>
<div class="font-bold-24">创新部</div>
<div @click="jump('/cooperation-intention')" class="btn">合作意向</div>

328
src/components/Page/PageAdd.vue

@ -11,7 +11,6 @@
>
<a-cascader
:options="titles"
@change="onChange"
placeholder="标题"
v-decorator="['titleCode',{
rules: [
@ -19,158 +18,6 @@
],
}]"
/>
<!-- <a-input
placeholder="标题"
v-decorator="[
'titleCode',
{
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-select
placeholder="查询模块"
v-decorator="['queryModule',{
rules: [
{ required: true, message: '查询模块不能为空' },
],
}]"
>
<a-select-option
:key="index"
:value="item.id"
v-for="(item, index) in modules"
>{{ item.text }}</a-select-option>
</a-select>
</a-form-item>
<!-- 展示类型 -->
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="展示类型"
>
<a-select
@select="changeType"
placeholder="展示类型"
v-decorator="['style',{
rules: [
{ required: true, message: '查询模块不能为空' },
],
}]"
>
<a-select-option :key="type.id" :value="type.id" v-for="type in types">{{ type.text }}</a-select-option>
</a-select>
</a-form-item>
<!-- 第几行 -->
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="第几行"
>
<a-input
placeholder="第几行"
v-decorator="[
'sort',
{
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
placeholder="宽度"
v-decorator="[
'width',
{
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
placeholder="共几列"
v-decorator="[
'colTotal',
{
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
placeholder="第几列"
v-decorator="[
'col',
{
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-radio-group
v-decorator="[
'queryMethod',
{
rules: [
{ required: true, message: '查询方式不能为空' },
],
},
]"
>
<a-radio :value="1">配置内容</a-radio>
<a-radio :value="2">指定内容</a-radio>
</a-radio-group>
</a-form-item>
<!-- 内容 -->
<a-form-item
@ -178,9 +25,12 @@
:wrapper-col="formItemLayout.wrapperCol"
label="内容"
>
<a-textarea placeholder="内容" v-if="type != 1" v-model="content" />
<quill-editor :options="editorOption" placeholder="请在此输入文本..." v-else v-model="content"></quill-editor>
<quill-editor
:options="editorOption"
class="editor"
placeholder="请在此输入文本..."
v-model="content"
></quill-editor>
</a-form-item>
<a-form-item class="d-flex flex-row-reverse">
@ -193,6 +43,7 @@
</template>
<script>
import { mapState } from 'vuex';
import { addPage } from 'config/api';
import { quillEditor } from 'vue-quill-editor';
@ -212,158 +63,6 @@ export default {
formItemLayout,
tailItemLayout,
form: this.$form.createForm(this, { name: 'page-add' }),
titles: [
{
value: '关于我们',
label: '关于我们',
children: [
{
value: '公司介绍',
label: '公司介绍',
},
{
value: '组织机构',
label: '组织机构',
},
{
value: '合作伙伴',
label: '合作伙伴',
},
{
value: '衍生企业',
label: '衍生企业',
},
],
},
{
value: '创新政策',
label: '创新政策',
},
{
value: '创新平台',
label: '创新平台',
children: [
{
value: '协同创新中心',
label: '协同创新中心',
},
{
value: '组织机构',
label: '组织机构',
},
{
value: '创新服务平台',
label: '创新服务平台',
},
{
value: '科技创新服务',
label: '科技创新服务',
},
],
},
{
value: '孵化平台',
label: '孵化平台',
children: [
{
value: '众创空间',
label: '众创空间',
},
{
value: '公共实验室',
label: '公共实验室',
},
{
value: '中试基地',
label: '中试基地',
},
{
value: '创业导师',
label: '创业导师',
},
{
value: '合作伙伴',
label: '合作伙伴',
},
{
value: '创业服务',
label: '创业服务',
},
{
value: '产品展示',
label: '产品展示',
},
],
},
{
value: '产业平台',
label: '产业平台',
children: [
{
value: '产业创新联盟',
label: '产业创新联盟',
},
{
value: '产业服务',
label: '产业服务',
},
{
value: '衍生企业',
label: '衍生企业',
},
],
},
{
value: '知识平台',
label: '知识平台',
},
{
value: '活动公告',
label: '活动公告',
},
{
value: '创新挑战',
label: '创新挑战',
children: [
{
value: '需求征集',
label: '需求征集',
},
{
value: '项目发布',
label: '项目发布',
},
{
value: '结果公告',
label: '结果公告',
},
],
},
{
value: '交流社区',
label: '交流社区',
},
{
value: '联系我们',
label: '联系我们',
},
],
modules: [
{ id: 0, text: '介绍' },
{ id: 1, text: '政策' },
{ id: 2, text: '新闻列表' },
{ id: 3, text: '交流社区' },
],
types: [
{ id: 0, text: '一级标题' },
{ id: 1, text: '富文本' },
{ id: 2, text: '按钮' },
{ id: 3, text: '动态图文简介' },
{ id: 4, text: '静态图文简介' },
{ id: 5, text: '大按钮' },
{ id: 6, text: '联系我们' },
],
type: '',
editorOption: {
placeholder: '请在此输入文本...',
modules: {
@ -380,15 +79,9 @@ export default {
};
},
methods: {
onChange(value) {
console.log(value);
},
changeType(value) {
this.type = value;
},
computed: mapState(['titles']),
methods: {
//
handleSubmit(e) {
e.preventDefault();
@ -406,10 +99,9 @@ export default {
console.log('params: ', params);
const res = await addPage(params);
const { data, msg, code } = res.data;
this.$emit('closeModal');
if (code === 200) {
this.$message.success('添加成功');
// TODO:
this.$emit('closeModal');
} else {
throw msg;
}

128
src/components/Page/PageDate.vue

@ -5,8 +5,10 @@
:columns="columns"
:data-source="lists"
:loading="loading"
:pagination="pagination"
:row-key="record => record.id"
:scroll="{ y: height }"
@change="handleTableChange"
bordered
class="white"
>
@ -14,28 +16,8 @@
<span>{{ index + 1 }}</span>
</template>
<!-- 模块 -->
<template slot="queryModule" slot-scope="text, record">
<span>{{ record.queryModule === 0 ? '专家' : record.queryModule === 1 ? '政策' : '其他' }}</span>
</template>
<!-- 展示类型 -->
<template slot="style" slot-scope="text, record">
<span>
{{ record.style === 0 ? '一级标题' :
record.style === 1 ? '二级标题' :
record.style === 2 ? '正文' :
record.style === 3 ? '列表' :
record.style === 4 ? '图片' :
record.style === 5 ? '图片滚动' :
record.style === 6 ? '多列排列' :
'富文本' }}
</span>
</template>
<!-- 查询方式 -->
<template slot="queryMethod" slot-scope="text, record">
<span>{{ record.queryMethod === 0 ? '配置内容' : '接口查询' }}</span>
<template slot="content" slot-scope="text, record, index">
<span v-dompurify-html="text"></span>
</template>
<template slot="edit" slot-scope="text, record">
@ -45,14 +27,14 @@
</a-popconfirm>
</template>
<div
class="d-flex flex-nowrap justify-space-between"
slot="expandedRowRender"
slot-scope="record"
style="margin: 0"
>
<div>内容{{ record.content }}</div>
</div>
<!-- <div slot="expandedRowRender" slot-scope="record" style="margin: 0">
<div class="d-flex flex-nowrap justify-space-between mb-2">
<div>计划时间{{ record.planTime }}</div>
<div class="ml-8">实际时间{{ record.realTime }}</div>
<div class="ml-8">组织人{{ record.organizer }}</div>
</div>
<div>活动内容{{ record.content }}</div>
</div>-->
</a-table>
</div>
<a-empty v-else />
@ -64,7 +46,7 @@
<script>
import PageEdit from 'components/Page/PageEdit.vue';
// import { delTeam } from 'config/api';
import { deletePage } from 'config/api';
const columns = [
{
@ -72,57 +54,28 @@ const columns = [
align: 'center',
dataIndex: 'id',
key: 'id',
width: 80,
scopedSlots: { customRender: 'id' },
},
{
title: '模块',
title: '标题',
align: 'center',
dataIndex: 'queryModule',
key: 'queryModule',
dataIndex: 'titleCode',
key: 'titleCode',
},
{
title: '展示类型',
title: '内容',
align: 'center',
dataIndex: 'style',
key: 'style',
scopedSlots: { customRender: 'style' },
},
{
title: '第几行',
align: 'center',
dataIndex: 'sort',
key: 'sort',
},
{
title: '宽度',
align: 'center',
dataIndex: 'width',
key: 'width',
},
{
title: '共几列',
align: 'center',
dataIndex: 'colTotal',
key: 'colTotal',
},
{
title: '第几列',
align: 'center',
dataIndex: 'col',
key: 'col',
},
{
title: '查询方式',
align: 'center',
dataIndex: 'queryMethod',
key: 'queryMethod',
scopedSlots: { customRender: 'queryMethod' },
dataIndex: 'content',
key: 'content',
scopedSlots: { customRender: 'content' },
},
{
title: '编辑',
align: 'center',
dataIndex: 'edit',
key: 'edit',
width: 150,
scopedSlots: { customRender: 'edit' },
},
];
@ -132,16 +85,15 @@ export default {
components: {
PageEdit,
},
props: { lists: { type: Array, default: () => [] } },
props: { lists: { type: Array, default: () => [] }, pagination: { type: Object, default: () => {} } },
data() {
this.cacheData = this.lists.map(item => ({ ...item }));
return {
columns,
loading: false,
editingKey: '',
height: '',
editVisible: false,
editItem: null, //
editItem: {}, //
};
},
@ -159,29 +111,33 @@ export default {
methods: {
showEditModal(record) {
console.log('record: ', record);
this.editItem = record;
this.editVisible = true;
},
closeModal() {
async closeModal() {
this.editVisible = false;
await this.$emit('getPageList');
},
handleTableChange(pagination) {
const { current, pageSize } = pagination;
const condition = { current, pageSize };
this.$emit('getPageList', condition);
},
//
async onDelete(teamId) {
async onDelete(pageId) {
try {
// const params = { param: { teamId } };
// const res = await delTeam(params);
// const { data, msg, code } = res.data;
// if (code === 200) {
// this.$message.success('');
// const arr = [...this.lists];
// this.lists = arr.filter(item => item.id !== teamId);
// // TODO:
// } else {
// throw msg;
// }
const params = { param: { pageId } };
const res = await deletePage(params);
const { data, msg, code } = res.data;
if (code === 200) {
this.$message.success('删除成功');
await this.$emit('getPageList');
} else {
throw msg;
}
} catch (error) {
this.$message.error(error || '删除失败');
}

204
src/components/Page/PageEdit.vue

@ -3,143 +3,31 @@
<!-- 编辑 -->
<a-modal :closable="false" footer title="修改页面" v-model="editVisible" width="700px">
<a-form :form="form" @submit="handleSubmit">
<!-- 模块 -->
<!-- 标题code -->
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="模块"
label="标题"
v-model="edtiTitleCode"
>
<a-input
placeholder="模块"
v-decorator="[
'pagePath',
{
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-select @change="getType" placeholder="展示类型" style="width: 200px">
<a-select-option :key="index" :value="type" v-for="(type, index) in types">{{ type }}</a-select-option>
</a-select>
</a-form-item>
<!-- 第几行 -->
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="第几行"
>
<a-input
placeholder="第几行"
v-decorator="[
'whichLine',
{
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
placeholder="宽度"
v-decorator="[
'whichLine',
{
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
placeholder="共几列"
v-decorator="[
'totalColumns',
{
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
placeholder="第几列"
v-decorator="[
'whichColumns',
{
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-radio-group @change="getQueryMethod" v-model="value">
<a-radio :value="1">配置内容</a-radio>
<a-radio :value="2">指定内容</a-radio>
</a-radio-group>
<a-cascader :options="titles" :placeholder="titleCode" @change="onChange" />
</a-form-item>
<a-cascader :options="titles" @change="onChange" placeholder="标题" />
<!-- 内容 -->
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="内容"
>
<a-textarea
placeholder="内容"
v-decorator="[
'content',
]"
<quill-editor
:max-size="maxSize"
:value="editItem && (editItem.content ? editItem.content : '')"
@changeInput="changeInput"
/>
</a-form-item>
<a-form-item class="d-flex flex-row-reverse">
<a-button @click="$emit('closeModal')" class="mr-3">取消</a-button>
<a-button @click="closeModal" class="mr-3">取消</a-button>
<a-button class="white--text" html-type="submit" type="primary">保存</a-button>
</a-form-item>
</a-form>
@ -148,7 +36,9 @@
</template>
<script>
// import { upTeam } from 'config/api';
import { mapState } from 'vuex';
import { updatePage } from 'config/api';
import QuillEditor from 'components/QuillEditor/QuillEditor.vue';
const formItemLayout = {
labelCol: { span: 6 },
@ -158,28 +48,50 @@ const formItemLayout = {
const tailItemLayout = { wrapperCol: { span: 16, offset: 6 } };
export default {
name: "PageEdit",
props: { editVisible: { type: Boolean, default: false },editItem: { type: Object, default: () => {} } },
name: 'PageEdit',
props: { editVisible: { type: Boolean, default: false }, editItem: { type: Object, default: () => {} } },
components: { QuillEditor },
data() {
return {
formItemLayout,
tailItemLayout,
form: this.$form.createForm(this, { name: 'r-d-add' }),
types: ['单选框','多选框','富文本框'],
type: '',
value: 1
}
maxSize: 2048,
content: '',
titleCode: '',
edtiTitleCode: '',
};
},
computed: {
...mapState(['titles']),
},
watch: {
editVisible(value) {
if (value === true && this.editItem && this.editItem.titleCode) {
this.titleCode = this.editItem.titleCode.replace(/-/g, ' / ');
}
},
},
methods: {
//
getType(value){
this.type = value;
//
changeInput(value) {
this.content = value;
},
onChange(value) {
if (value.length > 1) {
this.edtiTitleCode = `${value[0]}-${value[1]}`;
} else {
this.edtiTitleCode = `${value[0]}`;
}
},
//
getQueryMethod(value){
this.queryMethod = value;
closeModal() {
this.edtiTitleCode = '';
this.$emit('closeModal');
},
//
@ -188,16 +100,18 @@ export default {
this.form.validateFieldsAndScroll(async (err, values) => {
if (!err) {
try {
// const params = { param: values };
// const res = await upTeam(params);
// const { data, msg, code } = res.data;
// this.$emit('closeModal');
// if (code === 200) {
// this.$message.success('')
// // TODO:
// } else {
// throw msg;
// }
const { content, editItem, edtiTitleCode } = this;
const params = { param: { content, id: editItem.id, titleCode: edtiTitleCode || editItem.titleCode } };
const res = await updatePage(params);
const { data, msg, code } = res.data;
if (code === 200) {
this.$message.success('修改成功');
this.$emit('closeModal');
this.edtiTitleCode = '';
this.content = '';
} else {
throw msg;
}
} catch (error) {
this.$message.error(error || '修改失败');
}

33
src/components/Page/PageSearch.vue

@ -2,21 +2,15 @@
<template>
<div class="d-flex flex-wrap pb-3">
<div>
<div class="d-flex flex-row">
<!-- 模块 -->
<a-select @change="handleChangeModular" placeholder="查询模块" style="width:200px">
<a-select-option
:key="index"
:value="item.id"
v-for="(item, index) in modules"
>{{ item.text }}</a-select-option>
</a-select>
<a-input placeholder="标题code" v-model="titleCode" />
<a-button @click="handleTableChange" class="mx-2" type="primary">搜索</a-button>
</div>
<div class="flex-1"></div>
<a-button @click="showModal" class="editable-add-btn">增加</a-button>
<a-button @click="showModal" class="editable-add-btn" type="primary">增加</a-button>
<!-- 添加 -->
<page-add :visible="visible" @closeModal="closeModal" />
@ -25,7 +19,6 @@
<script>
import PageAdd from 'components/Page/PageAdd.vue';
// import { selLikeTeam } from 'config/api';
export default {
name: 'PageSearch',
@ -35,12 +28,7 @@ export default {
data() {
return {
visible: false,
modular: '',
modules: [
{ id: 0, text: '介绍' },
{ id: 1, text: '政策' },
{ id: 2, text: '交流社区' },
],
titleCode: '',
};
},
methods: {
@ -52,19 +40,12 @@ export default {
this.visible = false;
},
//
handleChangeModular(value) {
console.log('value: ', value);
this.modular = value;
this.handleTableChange(value);
},
handleTableChange(modular) {
this.$emit('getPageList', modular);
handleTableChange() {
const condition = { titleCode: this.titleCode };
this.$emit('getPageList', condition);
},
},
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped lang="stylus"></style>

213
src/components/QuillEditor/QuillEditor.vue

@ -0,0 +1,213 @@
<template>
<div class="ql-snow">
<quill-editor
:options="editorOption"
@blur="onEditorBlur($event)"
@change="onEditorChange()"
@focus="onEditorFocus($event)"
ref="myTextEditor"
v-model="content"
></quill-editor>
</div>
</template>
<script>
//
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'], //
['link', 'image'], // 'video'
];
import { quillEditor } from 'vue-quill-editor';
import 'quill/dist/quill.core.css';
import 'quill/dist/quill.snow.css';
import 'quill/dist/quill.bubble.css';
export default {
name: 'QuillEditor',
components: { quillEditor },
props: {
/*编辑器的内容*/
value: {
type: String,
default: '',
},
/*图片大小*/
maxSize: {
type: Number,
default: 4000, //kb
},
/* 默认提示 */
placeholder: {
type: String,
default: '',
},
},
data() {
return {
content: this.value,
quillUpdateImg: false, // loadingfalse,
editorOption: {
theme: 'snow', // or 'bubble'
placeholder: this.placeholder,
modules: { toolbar: { container: toolbarOptions } },
},
serverUrl: '/v1/blog/imgUpload', //
header: {}, // token: sessionStorage.token// token
};
},
methods: {
onEditorBlur() {
//
},
onEditorFocus() {
//
},
onEditorChange() {
//
this.$emit('changeInput', this.content);
},
//
beforeUpload() {
// loading
this.quillUpdateImg = true;
},
uploadSuccess(res, file) {
// res
//
let quill = this.$refs.myQuillEditor.quill;
//
if (res.code == 200) {
//
let length = quill.getSelection().index;
// res.url
quill.insertEmbed(length, 'image', res.url);
//
quill.setSelection(length + 1);
} else {
this.$message.error('图片插入失败');
}
// loading
this.quillUpdateImg = false;
},
//
uploadError() {
// loading
this.quillUpdateImg = false;
this.$message.error('图片插入失败');
},
},
};
</script>
<style>
.ql-container {
overflow: auto;
min-height: 200px;
max-height: 300px;
}
.ql-toolbar.ql-snow {
background: #f5f5f5;
border: 1px solid #d9d9d9;
}
.ql-container.ql-snow {
border: 1px solid #d9d9d9;
}
.ql-snow .ql-tooltip[data-mode='link']::before {
content: '请输入链接地址:';
}
.ql-snow .ql-tooltip.ql-editing a.ql-action::after {
border-right: 0px;
content: '保存';
padding-right: 0px;
}
.ql-snow .ql-tooltip[data-mode='video']::before {
content: '请输入视频地址:';
}
.ql-snow .ql-picker {
line-height: 20px;
border: 1px solid #ddd;
border-radius: 3px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label::before,
.ql-snow .ql-picker.ql-size .ql-picker-item::before {
content: '14px';
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='small']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='small']::before {
content: '10px';
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='large']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='large']::before {
content: '18px';
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='huge']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='huge']::before {
content: '32px';
}
.ql-snow .ql-picker.ql-header .ql-picker-label::before,
.ql-snow .ql-picker.ql-header .ql-picker-item::before {
content: '文本';
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='1']::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='1']::before {
content: '标题1';
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='2']::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='2']::before {
content: '标题2';
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='3']::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='3']::before {
content: '标题3';
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='4']::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='4']::before {
content: '标题4';
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='5']::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='5']::before {
content: '标题5';
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='6']::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='6']::before {
content: '标题6';
}
.ql-snow .ql-picker.ql-font .ql-picker-label::before,
.ql-snow .ql-picker.ql-font .ql-picker-item::before {
content: '标准字体';
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value='serif']::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value='serif']::before {
content: '衬线字体';
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value='monospace']::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value='monospace']::before {
content: '等宽字体';
}
</style>

29
src/config/api.js

@ -11,9 +11,24 @@ const researchTeam = `${greenvalley}/researchTeam`; // 创新平台相关操作
const page = `${greenvalley}/page`; // 页面管理相关操作
const carousel = `${greenvalley}/carousel`; // 轮播图相关接口
// 上传附件
export const upload = `${greenvalley}/file/upload`;
// websocket基础地址
export const WS_BASE_URL = msgUrl;
// 页面列表查询
export const getPageList = params => axios.post(`${page}/list`, params);
// 页面配置添加
export const addPage = params => axios.post(`${page}/add`, params);
// 页面配置删除
export const deletePage = params => axios.post(`${page}/delete`, params);
// 页面配置修改
export const updatePage = params => axios.post(`${page}/update`, params);
// 查询所有的研发团队相关信息
export const getAllTeam = () => axios.post(`${researchTeam}/selectAllTeam`);
@ -32,13 +47,15 @@ export const upTeam = params => axios.post(`${researchTeam}/upTeam`, params);
// 根据团队名称搜索团队
export const selLikeTeam = params => axios.post(`${researchTeam}/selLikeTeam`, params);
// 页面列表查询
export const getPageList = params => axios.post(`${page}/list`, params);
// // 页面列表查询
// export const getPageList = params => axios.post(`${page}/list`, params);
// 页面配置添加
export const addPage = params => axios.post(`${page}/add`, params);
// // 页面配置添加
// export const addPage = params => axios.post(`${page}/add`, params);
// 页面配置删除
export const deletePage = params => axios.post(`${page}/delete`, params);
// // 页面配置删除
// export const deletePage = params => axios.post(`${page}/delete`, params);
// 查询轮播图列表
export const queryCarousel = params => axios.post(`${carousel}/queryCarousel`, params);
// 查询轮播图列表
export const addCarousel = params => axios.post(`${carousel}/addCarousel`, params);

3
src/main.js

@ -8,9 +8,12 @@ import store from './store';
import './plugins/ant-design-vue.js';
import './plugins/vue-quill-editor.js';
import 'common/portrait.styl';
import VueDOMPurifyHTML from 'vue-dompurify-html';
Vue.config.productionTip = false;
Vue.use(VueDOMPurifyHTML);
window.vm = new Vue({
router,
store,

136
src/store/state.js

@ -4,6 +4,142 @@ const state = {
RDTeamLists: [], // 研发团队列表
pageLists: [], // 页面管理列表
titles: [
{
value: '关于我们',
label: '关于我们',
children: [
{
value: '公司介绍',
label: '公司介绍',
},
{
value: '组织机构',
label: '组织机构',
},
{
value: '合作伙伴',
label: '合作伙伴',
},
{
value: '衍生企业',
label: '衍生企业',
},
],
},
{
value: '创新政策',
label: '创新政策',
},
{
value: '创新平台',
label: '创新平台',
children: [
{
value: '协同创新中心',
label: '协同创新中心',
},
{
value: '组织机构',
label: '组织机构',
},
{
value: '创新服务平台',
label: '创新服务平台',
},
{
value: '科技创新服务',
label: '科技创新服务',
},
],
},
{
value: '孵化平台',
label: '孵化平台',
children: [
{
value: '众创空间',
label: '众创空间',
},
{
value: '公共实验室',
label: '公共实验室',
},
{
value: '中试基地',
label: '中试基地',
},
{
value: '创业导师',
label: '创业导师',
},
{
value: '合作伙伴',
label: '合作伙伴',
},
{
value: '创业服务',
label: '创业服务',
},
{
value: '产品展示',
label: '产品展示',
},
],
},
{
value: '产业平台',
label: '产业平台',
children: [
{
value: '产业创新联盟',
label: '产业创新联盟',
},
{
value: '产业服务',
label: '产业服务',
},
{
value: '衍生企业',
label: '衍生企业',
},
],
},
{
value: '知识平台',
label: '知识平台',
},
{
value: '活动公告',
label: '活动公告',
},
{
value: '创新挑战',
label: '创新挑战',
children: [
{
value: '需求征集',
label: '需求征集',
},
{
value: '项目发布',
label: '项目发布',
},
{
value: '结果公告',
label: '结果公告',
},
],
},
{
value: '交流社区',
label: '交流社区',
},
{
value: '联系我们',
label: '联系我们',
},
],
};
export default state;

35
src/views/BannerManage/BannerManage.vue

@ -1,7 +1,7 @@
<template>
<div class="pa-3 white fill-height d-flex flex-column">
<banner-search />
<banner-date :lists="lists" />
<banner-search @getListData="getListData" />
<banner-date :lists="lists" :pagination="pagination" @getListData="getListData" />
</div>
</template>
@ -21,6 +21,14 @@ export default {
return {
str: '轮播图管理界面',
lists: {},
pagination: { current: 1, pageSize: 10 },
pageNum: 1,
pageSize: 10,
paramData: {
showPage: '',
jumpType: 0,
recStatus: 0,
},
};
},
@ -30,21 +38,32 @@ export default {
methods: {
//
async getListData() {
async getListData(condition) {
try {
if (condition && condition.current) {
this.pageNum = condition.current;
this.pageSize = condition.pageSize;
} else if (condition && !condition.pageNum) {
this.paramData = condition;
}
const params = {
param: {
showPage: '',
jumpType: '',
recStatus: '',
pageNum: 1,
pageSize: 10,
showPage: this.paramData.showPage,
jumpType: this.paramData.jumpType,
recStatus: this.paramData.recStatus,
pageNum: this.pageNum,
pageSize: this.pageSize,
},
};
const res = await queryCarousel(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.lists = data;
const paper = { ...this.pagination };
paper.current = data.pageNum;
paper.total = +data.total;
paper.pageSize = data.pageSize;
this.pagination = paper;
} else {
throw msg || '获取失败';
}

27
src/views/PageManage/PageManage.vue

@ -1,7 +1,7 @@
<template>
<div class="pa-3 white fill-height d-flex flex-column">
<page-search @getPageList="getPageList" />
<page-date :lists="lists" />
<page-date :lists="lists" :pagination="pagination" @getPageList="getPageList" />
</div>
</template>
@ -20,6 +20,7 @@ export default {
data() {
return {
lists: [],
pagination: { current: 1, pageSize: 10 },
};
},
@ -29,19 +30,29 @@ export default {
methods: {
/**
* 页面配置添加
* @param { String } competeTimeId 第几届信息的id
* 页面列表查询
* @param { String } pageNum 页码
* @param { String } pageSize 每页多少条
* @param { String } titleCode 模块
*/
async getPageList(titleCode) {
console.log('titleCode: ', titleCode);
async getPageList(condition) {
try {
const titleCode = titleCode ? titleCode : '';
const params = { param: { pageNum: 1, pageSize: 10, titleCode } };
const params = {
param: {
pageNum: (condition && condition.current) || 1,
pageSize: (condition && condition.pageSize) || 10,
titleCode: (condition && condition.titleCode) || '',
},
};
const res = await getPageList(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.lists = data.list;
console.log('this.lists: ', this.lists);
const paper = { ...this.pagination };
paper.current = data.pageNum;
paper.total = +data.total;
paper.pageSize = data.pageSize;
this.pagination = paper;
} else {
throw msg || '获取失败';
}

Loading…
Cancel
Save