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 }