123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643 |
- import {getSiteInfo,getSiteCategory,selectWebsiteDepartment,selectWebsiteArea,getWebsiteArticlesList,
- selectWebsiteArticleInfo,getWebsiteCategory} from '@/api/cms'
- import { Message } from 'element-ui'; //注意在这里引入是非常不符合规范的
- import Vue from 'vue'; //导入Vue 因为我们要进行深层次的json修改,深拷贝的数据无法令视图更新
- //所以我们需要使用Vue的$set方法来强制视图更新,在vuex中没有this,这里我们需要通过引入vue来使用vue.$set
- //引入随机模板json
- import randomTemplateJson from '@/utils/templateJson/index/1.js';//首页
- const state = {
- //0.全局配置 start------------------------------------------------------------>
- editWebsiteId: "",//当前编辑网站的id
- stepStatus: true,//是否显示现在进行到哪一步:true=显示 false=不显示
- //0.全局配置 end------------------------------------------------------------>
-
- //1.画布数据 start------------------------------------------------------------>
- pageStatus:1,//当前编辑哪个页面 1=首页 2=分类页 3=列表页 4=详情页 5=搜索页 6=自定义列表页 7=自定义详情页
- menuType:1, //当前菜单显示板块还是组件 1=板块 2=组件
- previewStatus:false,//是否预览
- pageData: { //自助建站拖拽板块的数据,注意,这里并不是提交到后台的数据
- index:[
-
- ],//首页
- class:[],//分类页
- list:[],//列表页
- article:[],//详情页
- search:[],//搜索页
- aloneList:[],//自定义列表页
- aloneArticle:[],//自定义详情页
- },
- // layout: [
- // // i = id
- // // w = 最大宽度是12
- // // { i: "0", x: 0, y: 0, w: 12, h: 2, content:""},
- // // { i: "1", x: 0, y: 0, w: 12, h: 2, content:""},
- // ],
- //1.画布数据 end------------------------------------------------------------>
- //2.站点数据 start------------------------------------------------------------>
- webSiteInfo:"",//网站信息
- webSiteMenu:"",//网站包含的导航池
- area:{//地区
- economize:[],//省区
- market:[],//市区
- county:[]//县区
- },
- departmentList:"",//职能部门
- //2.站点数据 end------------------------------------------------------------>
- //3.网站数据 start------------------------------------------------------------>
- editWindowStatus:false,//编辑组件弹出框是否显示
- editComponentWindowStatus:false,//选择组件样式弹出框是否显示
- editWindowTitle:"",//编辑弹出框标题
- editSectorId:0,//当前正在编辑的板块id
- editDataSort:0,//当前正在编辑的数据位置
- editComponentSort:0,//当前正在编辑的组件id
- editComponentType:0,//当前正在编辑的组件类型
- editComponentSize:0,//当前组件展示的条数
- editComponentStyle:0,//当前编辑的组件样式
- editWebsiteCategory:[],//当前网站全部关联导航
- webSiteData:{
- //1.base网站基本信息
- base:{
- websiteId:1,//网站id
- },
- //2.style信息
- style:{
- styleId:1,//风格id
- },
- //3.板块信息 header,menu,footer 是页面自带的无需构建
- template:{
- //index = 首页 class=分类页 list=列表页 article=详情页 search=搜索页 aloneList=自定义列表页 aloneArticle=自定义详情页
- index:[],
- class:[],//分类页
- list:[],//列表页
- article:[],//详情页
- search:[],//搜索页
- aloneList:[],//自定义列表页
- aloneArticle:[],//自定义详情页
- }
- },
- //3.网站数据 end------------------------------------------------------------>
- //4.组件回显数据 start------------------------------------------------------------>
- componentViewData:{
- pid_arr:[],//导航池
- pageSize:"",//展示条数
- adName:"",//广告名称
- titleName:"",//标题名称
- }
- //4.组件回显数据 start------------------------------------------------------------>
- }
- const mutations = {
- //0.全局配置 start------------------------------------------------------------>
- //设置网站的id
- setEditWebsiteId(state,id){
- state.editWebsiteId = id;
- },
- //展示步骤
- showStepStatus(state){
- state.stepStatus = true;
- },
- //隐藏步骤
- hiddenStepStatus(state){
- state.stepStatus = false;
- },
- //设置步骤
- setPageStatus(state,num){
- state.pageStatus = num;
- },
- //设置预览状态
- setPreviewStatus(state){
- state.previewStatus = !state.previewStatus;
- },
- //打开编辑组件弹出框
- setEditWindowStatus(state,data){
- state.editWindowStatus = true;
- state.editSectorId = data.id;
- state.editDataSort = data.dataSort;
- state.editComponentSort = data.sort;
- state.editComponentType = data.type;
- state.editComponentSize = data.size;
- },
- //关闭编辑组件弹出框
- closeEditWindowStatus(state){
- state.editWindowStatus = false;
- },
- //打开选择组件样式弹出框
- setComponentStyleStatus(state,data){
- state.editComponentWindowStatus = true;
- state.editSectorId = data.id;
- state.editDataSort = data.dataSort;
- state.editComponentSort = data.sort;
- state.editComponentType = data.type;
- state.editComponentStyle = data.style;
- },
- //关闭选择组件样式弹出框
- closeComponentStyleStatus(state){
- state.editComponentWindowStatus = false;
- },
- //选择组件样式
- selectComponentStyleNumber(state,data){
- state.editComponentStyle = data;
- },
- //设置组件回显数据
- setComponentViewData(state,data){
- //首页
- if(state.pageStatus == 1){
- //找到要修改的板块
- const targetModuleIndex = state.pageData.index.findIndex(module => module.i === data.id);
- //判断组件类型 1=普通新闻 2=tabs新闻选项卡 3=广告 4=友情链接 6=静态组件 7=文本 8=评论
- if(state.editComponentType == 1){
- state.componentViewData.pid_arr = state.pageData.index[targetModuleIndex].content.componentList[data.sort].componentData.category_id;
- state.componentViewData.pageSize = state.editComponentSize;
- }
- //2=tabs新闻选项卡
- if(state.editComponentType == 2){
- state.componentViewData.pid_arr = state.pageData.index[targetModuleIndex].content.componentList[data.sort].componentData.category_id;
- state.componentViewData.pageSize = state.editComponentSize;
- }
- //3=广告名称
- if(state.editComponentType == 3){
- state.componentViewData.adName = state.pageData.index[targetModuleIndex].content.componentList[data.sort].componentData.text;
- }
- //7=标题
- if(state.editComponentType == 7){
- state.componentViewData.titleName = state.pageData.index[targetModuleIndex].content.componentList[data.sort].componentData.text;
- }
- }
- //pageStatus==2 分类页
- if(state.pageStatus == 2){}
- //pageStatus==3 列表页
- if(state.pageStatus == 3){}
- //pageStatus==4 详情页
- if(state.pageStatus == 4){}
- //pageStatus==5 搜索页
- if(state.pageStatus == 5){}
- //pageStatus==6 自定义列表页
- if(state.pageStatus == 6){}
- //pageStatus==7 自定义详情页
- if(state.pageStatus == 7){}
- },
- //0.全局配置 start------------------------------------------------------------>
- //1.配置模块 start------------------------------------------------------------>
- //添加板块
- addModule(state,data){
- //pageStatus==1 首页
- if(state.pageStatus == 1){
- //判断当前一共有多少个模块最多能添加10个
- if(state.pageData.index.length >= 10){
- Message.error('最多只能添加10个模块!');
- return;
- }else{
- //通过时间戳生成id
- const currentTimestamp = Date.now();
- let id = currentTimestamp;
- //data.type 组件名称 data.h 模块高度
- //计算当前布局的最大 y 值
- const maxY = Math.max(...state.pageData.index.map(item => item.y), 0);
- console.log(data);
- //设置数据在构建json中的位置
- let dataSort = state.pageData.index.length;
- //添加板块id
- state.pageData.index.push({
- //i: state.pageData.index.length, //base 0.0.1 此方法会导致重复的id出现
- i: id,
- x: 0,
- y: maxY + 1,
- w: 12,
- h: data.h,
- type: data.type,
- //sectorData:data.jsonData //base 0.0.1 此问题导致深层数据无法被视图渲染
- content:data.jsonData,
- dataSort:dataSort
- });
- console.log("当前添加模块的dataSort为:" + dataSort);
- //当前的页面构建数据
- console.log(state.pageData.index);
- }
- }
- //pageStatus==2 分类页
- if(state.pageStatus == 2){}
- //pageStatus==3 列表页
- if(state.pageStatus == 3){}
- //pageStatus==4 详情页
- if(state.pageStatus == 4){}
- //pageStatus==5 搜索页
- if(state.pageStatus == 5){}
- //pageStatus==6 自定义列表页
- if(state.pageStatus == 6){}
- //pageStatus==7 自定义详情页
- if(state.pageStatus == 7){}
- },
- //删除板块
- deleteModule(state,data){
- //data.i = id
- //data.dataSort = dataSort
- //pageStatus==1 首页
- if(state.pageStatus == 1){
- //必须通过重新查找id的方式来删除
- const indexToRemove = state.pageData.index.findIndex(item => item.i === data.i);
- if (indexToRemove !== -1) {
- state.pageData.index.splice(indexToRemove, 1);
- Message.success('模块已删除!');
- console.log('模块已删除,当前的页面构建数据为:', state.pageData.index);
- } else {
- Message.warning('未找到要删除的模块!');
- }
- // base 0.0.2 如果使用splice方法删除sort,当你就剩下最后一个的时候,会出现找不到那个元素的问题
- // state.pageData.index.splice(data.dataSort,1);
- // Message.success('模块已删除!');
- // console.log(state.pageData.index);
- }
- //pageStatus==2 分类页
- if(state.pageStatus == 2){}
- //pageStatus==3 列表页
- if(state.pageStatus == 3){}
- //pageStatus==4 详情页
- if(state.pageStatus == 4){}
- //pageStatus==5 搜索页
- if(state.pageStatus == 5){}
- //pageStatus==6 自定义列表页
- if(state.pageStatus == 6){}
- //pageStatus==7 自定义详情页
- if(state.pageStatus == 7){}
- },
- //设置组件样式
- setComponentStyleNumber(state,data){
- let id = state.editSectorId;
- let dataSort = state.editDataSort;
- let sort = state.editComponentSort;
- let num = state.editComponentStyle;
- console.log(id,dataSort,sort,num);
- //pageStatus==1 首页
- if(state.pageStatus == 1){
- // 获取当前模块数据并进行深拷贝
- let module = JSON.parse(JSON.stringify(state.pageData.index[dataSort]));
- //module.content.componentList[sort].component_style = num;
- //确保修改属性时 Vue 能监控到变化
- Vue.set(module.content.componentList, sort, {
- ...module.content.componentList[sort],
- component_style: num
- });
- // 拷贝后直接替换原来的板块
- //state.pageData.index[id] = module;
- // 使用Vue.set来强制视图更新
- Vue.set(state.pageData.index, dataSort, module);
- console.log("当前的板块数据为:");
- console.log(state.pageData.index);
- }
- //pageStatus==2 分类页
- if(state.pageStatus == 2){}
- //pageStatus==3 列表页
- if(state.pageStatus == 3){}
- //pageStatus==4 详情页
- if(state.pageStatus == 4){}
- //pageStatus==5 搜索页
- if(state.pageStatus == 5){}
- //pageStatus==6 自定义列表页
- if(state.pageStatus == 6){}
- //pageStatus==7 自定义详情页
- if(state.pageStatus == 7){}
- },
- //保存组件设置的数据
- saveComponentData(state,data){
- //传入的板块id
- console.log("当前编辑板块:" + data.id)
- //pageStatus==1 首页
- if(state.pageStatus == 1){
- const targetModuleIndex = state.pageData.index.findIndex(module => module.i === data.id);
- console.log("要修改的模块id为:") //找到要修改的板块
- console.log(data.sort) //找到要修改的板块
- console.log(targetModuleIndex) //找到要修改的板块
- //console.log(targetModuleIndex) //找到要修改的板块
- //state.pageData.index[targetModuleIndex].content.componentList[data.sort] //当前编辑的组件
- //data.data.pid_arr //导航池
- //state.editComponentSize //展示条数
- //判断数据的类型 1=普通新闻 2=tabs新闻选项卡 3=广告 4=友情链接 6=静态组件 7=文本 8=评论
- //1=普通新闻
- //注意,vue有一个bug就是,当你修改复杂对象的时候,如果对象的内部是数组
- //vue可能无法检测到变化,而当你修改无法被检测变化的数据时,就会把所有数据都修改成相同的值
- //解决办法是通过vue的set方法将整个对象,即你的数组外层那个对象进行深拷贝,然后修改完再替换回去
- if(state.editComponentType == 1){
- // 获取当前模块数据并进行深拷贝
- let module = JSON.parse(JSON.stringify(state.pageData.index[targetModuleIndex])); // 深拷贝整个模块
- // 更新 category_id 和 pageSize
- module.content.componentList[data.sort].componentData.category_id = data.data.pid_arr; // 设置 category_id
- module.content.componentList[data.sort].componentData.pageSize = state.editComponentSize; // 设置 pageSize
- // 使用Vue.set来强制视图更新
- Vue.set(state.pageData.index, targetModuleIndex, module); // 替换为深拷贝的模块
- console.log("当前的板块数据为:");
- console.log(state.pageData.index);
- }
- //2=tabs新闻选项卡
- if(state.editComponentType == 2){
- // 获取当前模块数据并进行深拷贝
- let module = JSON.parse(JSON.stringify(state.pageData.index[targetModuleIndex])); // 深拷贝整个模块
- // 更新 category_id 和 pageSize
- module.content.componentList[data.sort].componentData.category_id = data.data.pid_arr; // 设置 category_id
- module.content.componentList[data.sort].componentData.pageSize = state.editComponentSize; // 设置 pageSize
- // 使用Vue.set来强制视图更新
- Vue.set(state.pageData.index, targetModuleIndex, module); // 替换为深拷贝的模块
- console.log("当前的板块数据为:");
- console.log(state.pageData.index);
- }
- //3=广告
- if(state.editComponentType == 3){;
- let module = JSON.parse(JSON.stringify(state.pageData.index[targetModuleIndex]));
- module.content.componentList[data.sort].componentData.text = data.data.adName;
- Vue.set(state.pageData.index, targetModuleIndex, module);
- console.log("当前的板块数据为:");
- console.log(state.pageData.index);
- }
- //4=友情链接
- //if(state.editComponentType == 4){}
- //6=静态组件
- //if(state.editComponentType == 6){}
- //7=文本
- if(state.editComponentType == 7){
- let module = JSON.parse(JSON.stringify(state.pageData.index[targetModuleIndex]));
- module.content.componentList[data.sort].componentData.text = data.data.titleName;
- Vue.set(state.pageData.index, targetModuleIndex, module);
- console.log("当前的板块数据为:");
- console.log(state.pageData.index);
- }
- //8=评论
- //if(state.editComponentType == 8){}
- }
- //pageStatus==2 分类页
- if(state.pageStatus == 2){}
- //pageStatus==3 列表页
- if(state.pageStatus == 3){}
- //pageStatus==4 详情页
- if(state.pageStatus == 4){}
- //pageStatus==5 搜索页
- if(state.pageStatus == 5){}
- //pageStatus==6 自定义列表页
- if(state.pageStatus == 6){}
- //pageStatus==7 自定义详情页
- if(state.pageStatus == 7){}
- },
- //移动板块 (暂时停用)
- moveModule(state, data) {
- Message.error('移动板块功能暂时停用!');
- // pageStatus == 1 首页
- // if (state.pageStatus == 1) {
- // const moveType = data.moveType;
- // const moduleId = data.i;
- // const modules = state.pageData.index;
- // // 查找模块在数组中的实际索引
- // const thisIndex = modules.findIndex(module => module.i === moduleId);
- // if (thisIndex === -1) {
- // Message.error('模块未找到!');
- // return;
- // }
- // const thisY = modules[thisIndex].y;
- // let thatY;
- // if (moveType === 'up') {
- // thatY = Math.max(
- // ...modules.filter(item => item.y < thisY).map(item => item.y)
- // );
- // if (thatY === -Infinity) {
- // Message.error('已经是顶部了!');
- // return;
- // }
- // const thatIndex = modules.findIndex(item => item.y === thatY);
- // if (thatIndex === -1) {
- // Message.error('上方模块未找到!');
- // return;
- // }
- // [modules[thisIndex].y, modules[thatIndex].y] = [modules[thatIndex].y, modules[thisIndex].y];
- // } else if (moveType === 'down') {
- // thatY = Math.min(
- // ...modules.filter(item => item.y > thisY).map(item => item.y)
- // );
- // if (thatY === Infinity) {
- // Message.error('已经是底部了!');
- // return;
- // }
- // const thatIndex = modules.findIndex(item => item.y === thatY);
- // if (thatIndex === -1) {
- // Message.error('下方模块未找到!');
- // return;
- // }
- // [modules[thisIndex].y, modules[thatIndex].y] = [modules[thatIndex].y, modules[thisIndex].y];
- // } else {
- // Message.error('未知的移动类型!');
- // return;
- // }
- // // 交换后对模块进行排序以确保顺序一致
- // modules.sort((a, b) => a.y - b.y);
- // // 使用 Vue.set 强制更新数组,确保视图更新
- // Vue.set(state.pageData, 'index', [...modules]);
- // console.log(state.pageData.index); //打印查看是否已修改
- // }
- // pageStatus == 2 分类页
- // if (state.pageStatus == 2) {}
- // // pageStatus == 3 列表页
- // if (state.pageStatus == 3) {}
- // // pageStatus == 4 详情页
- // if (state.pageStatus == 4) {}
- // // pageStatus == 5 搜索页
- // if (state.pageStatus == 5) {}
- // // pageStatus == 6 自定义列表页
- // if (state.pageStatus == 6) {}
- // // pageStatus == 7 自定义详情页
- // if (state.pageStatus == 7) {}
- },
- //修改首页板块高度
- setModuleHeight(state,data){
- // pageStatus == 1 首页
- if (state.pageStatus == 1) {
- console.log(data);
- state.pageData.index[data.i].h = data.h;
- console.log(state.pageData.index[data.i]);
- }
- // pageStatus == 2 分类页
- if (state.pageStatus == 2) {}
- // pageStatus == 3 列表页
- if (state.pageStatus == 3) {}
- // pageStatus == 4 详情页
- if (state.pageStatus == 4) {}
- // pageStatus == 5 搜索页
- if (state.pageStatus == 5) {}
- // pageStatus == 6 自定义列表页
- if (state.pageStatus == 6) {}
- // pageStatus == 7 自定义详情页
- if (state.pageStatus == 7) {}
- },
- //格式化模板信息
- formatTemplateInfo(state, data) {
- //console.log(data.type);
- //按照data.data.y的大小排序
- data.data.sort((a, b) => a.y - b.y);
- console.log(data,data);
- let websiteData = [];
- //获取板块的sort
- for (let index in data.data) {
- console.log(data.data[index].content);
- data.data[index].content.sort = Number(index)+1;
- if(data.type=="index"){
- //不要把数据直接保存到state.webSiteData.template中,否则无法删除
- websiteData.push(data.data[index].content)
- }
- }
- //保存到对应的页面json中
- if(data.type=="index"){
- state.webSiteData.template.index = websiteData;
- }
- },
- //保存模板
- saveTemplate(state) {
- //调用mutations中的方法无需使用$store
- //格式化index的信息
- this.commit('template/formatTemplateInfo',{data:state.pageData.index,type:"index"});
-
- console.log(state.webSiteData);
- },
- //随机生成模板
- randomTemplate(state){
- console.log("随机生成模板");
- const randomIndex = Math.floor(Math.random() * 3); // Generates a random number between 1 and 2
- console.log(`随机生成的数字是: ${randomIndex}`);
- // pageStatus == 1 首页
- if (state.pageStatus == 1) {}
- // pageStatus == 2 分类页
- if (state.pageStatus == 2) {}
- // pageStatus == 3 列表页
- if (state.pageStatus == 3) {}
- // pageStatus == 4 详情页
- if (state.pageStatus == 4) {}
- // pageStatus == 5 搜索页
- if (state.pageStatus == 5) {}
- // pageStatus == 6 自定义列表页
- if (state.pageStatus == 6) {}
- // pageStatus == 7 自定义详情页
- if (state.pageStatus == 7) {}
- },
- //1.配置模块 end------------------------------------------------------------>
- //2.获取站点信息 start------------------------------------------------------------>
- //获取站点详情
- setWebsiteInfo(state,data){
- state.webSiteInfo = data;
- },
- //获取站点导航池
- setGetSiteCategory(state,data) {
- state.webSiteMenu = data;
- },
- //设置地区
- setArea(state,data){
- //都没有的时候返回的是省
- if(data.province==undefined){
- state.area.economize = data;
- }
- //没有region的时候返回的是市
- if(data.province!=undefined&&data.city!=undefined&&data.region==undefined){
- state.area.market = data.city;
- }
- //有region的时候返回的是县
- if(data.province!=undefined&&data.city!=undefined&&data.region!=undefined){
- state.area.county = data.region;
- }
- },
- //获取全部导航
- setWebsiteCategory(state,data){
- let arrayData = []
- for(let item of data){
- let options = {
- key:item.id,
- label:item.name,
- value:item.id
- }
- arrayData.push(options);
- }
- state.editWebsiteCategory = arrayData;
- },
- //2.获取站点信息 end------------------------------------------------------------>
- }
- const actions = {
- //1.站点数据 start------------------------------------------------------------>
- //获取网站基本信息
- getSiteInfo({commit},data){
- return new Promise((resolve, reject) => {
- getSiteInfo(data).then(response => {
- commit('setWebsiteInfo', response.data);
- resolve(response)
- }).catch(error => {
- reject(error)
- })
- })
- },
- //获取网站导航池
- getSiteCategory({commit},data){
- return new Promise((resolve, reject) => {
- getSiteCategory(data).then(response => {
- commit('setGetSiteCategory', response.data);
- resolve(response)
- }).catch(error => {
- reject(error)
- })
- })
- },
- //设置行政区划
- selectWebsiteArea({commit},data){
- return new Promise((resolve, reject) => {
- selectWebsiteArea(data).then(response => {
- commit('setArea', response.data);
- resolve(response)
- }).catch(error => {
- reject(error)
- })
- })
- },
- //获取新闻列表
- getWebsiteArticlesList({commit},data){
- return new Promise((resolve, reject) => {
- getWebsiteArticlesList(data).then(response => {
- resolve(response)
- }).catch(error => {
- reject(error)
- })
- })
- },
- //获取新闻详情
- selectWebsiteArticleInfo({commit},data){
- return new Promise((resolve, reject) => {
- selectWebsiteArticleInfo(data).then(response => {
- resolve(response)
- }).catch(error => {
- reject(error)
- })
- })
- },
- //获取全部导航池
- getWebsiteCategory({commit},data){
- return new Promise((resolve, reject) => {
- getWebsiteCategory(data).then(response => {
- commit('setWebsiteCategory', response.data);
- resolve(response)
- }).catch(error => {
- reject(error)
- })
- })
- },
- //1.站点数据 end------------------------------------------------------------>
- }
- export default {
- namespaced: true,
- state,
- mutations,
- actions
- }
|