diff --git a/.eslintrc.js b/.eslintrc.js
index ec1dcf5..41a9f71 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -23,10 +23,11 @@ module.exports = {
'no-useless-return': 'off',
'no-unreachable': 'off', // 禁止在 return、throw、continue 和 break 语句后出现不可达代码
'no-new-object': 'off', // 禁止使用 Object 构造函数
- "vue/no-v-model-argument": "off",
+ 'vue/no-v-model-argument': 'off',
'no-prototype-builtins': 'off',
'vue/no-mutating-props': 'off',
- 'vue/script-setup-uses-vars': 'off'
+ 'vue/script-setup-uses-vars': 'off',
+ 'no-unused-vars': 0,
},
parser: 'vue-eslint-parser',
}
diff --git a/src/layout/home/index.vue b/src/layout/home/index.vue
index 92f41a4..ab144d9 100644
--- a/src/layout/home/index.vue
+++ b/src/layout/home/index.vue
@@ -14,7 +14,7 @@
重置
- 预览
+ 预览
查看JSON
导入JSON
导出JSON
@@ -138,7 +138,7 @@
@@ -193,369 +190,353 @@ export default {
"component": '${JSON.stringify(datas.pageComponents)}',
}`,
- '查看JSON',
- {
- confirmButtonText: '确定',
- customClass: 'JSONView',
- dangerouslyUseHTMLString: true,
- callback: () => {},
- }
- )
+ '查看JSON',
+ {
+ confirmButtonText: '确定',
+ customClass: 'JSONView',
+ dangerouslyUseHTMLString: true,
+ callback: () => {},
}
+ )
+}
- // 导出json
- const exportJSON = () => {
- // 将json转换成字符串
- const data = JSON.stringify({
- id: datas.id,
- name: datas.pageSetup.name,
- templateJson: JSON.stringify(datas.pageSetup),
- component: JSON.stringify(datas.pageComponents),
- })
- const blob = new Blob([data], { type: '' })
- FileSaver.saveAs(blob, `${datas.pageSetup.name}.json`)
- }
+// 导出json
+const exportJSON = () => {
+ // 将json转换成字符串
+ const data = JSON.stringify({
+ id: datas.id,
+ name: datas.pageSetup.name,
+ templateJson: JSON.stringify(datas.pageSetup),
+ component: JSON.stringify(datas.pageComponents),
+ })
+ const blob = new Blob([data], { type: '' })
+ FileSaver.saveAs(blob, `${datas.pageSetup.name}.json`)
+}
- // 导入json
- const importJSON = () => {
- const file = document.getElementById('file').files[0]
- const reader = new FileReader()
- reader.readAsText(file)
- let _this = datas
- reader.onload = function () {
- // this.result为读取到的json字符串,需转成json对象
- let ImportJSON = JSON.parse(this.result)
- // 检测是否导入成功
- console.log(ImportJSON, '-----------------导入成功')
- // 导入JSON数据
- _this.id = ImportJSON.id
- _this.pageSetup = JSON.parse(ImportJSON.templateJson)
- _this.pageComponents = JSON.parse(ImportJSON.component)
- }
- }
+// 导入json
+const importJSON = () => {
+ const file = document.getElementById('file').files[0]
+ const reader = new FileReader()
+ reader.readAsText(file)
+ let _this = datas
+ reader.onload = function () {
+ // this.result为读取到的json字符串,需转成json对象
+ let ImportJSON = JSON.parse(this.result)
+ // 检测是否导入成功
+ console.log(ImportJSON, '-----------------导入成功')
+ // 导入JSON数据
+ _this.id = ImportJSON.id
+ _this.pageSetup = JSON.parse(ImportJSON.templateJson)
+ _this.pageComponents = JSON.parse(ImportJSON.component)
+ }
+}
- /**
- * 切换组件位置 用于组件管理中删除功能
- *
- * @param {Object} res 组件切换后返回的位置
- */
- const componenmanagement = (res) => {
- datas.pageComponents = res
- }
+/**
+ * 切换组件位置 用于组件管理中删除功能
+ *
+ * @param {Object} res 组件切换后返回的位置
+ */
+const componenmanagement = (res) => {
+ datas.pageComponents = res
+}
- // 选择组件数据
- const choose = reactive({
- deleShow: true, //删除标签显示
- index: '', //当前选中的index
- rightcom: 'decorate', //右侧组件切换
- currentproperties: {}, //当前属性
- offsetY: 0, //记录上一次距离父元素高度
- onlyOne: ['1-5', '1-16'], // 只能存在一个的组件(组件的type)
- pointer: { show: false }, //穿透
- })
+// 选择组件数据
+const choose = reactive({
+ deleShow: true, // 删除标签显示
+ index: '', // 当前选中的index
+ rightcom: 'decorate', // 右侧组件切换
+ currentproperties: datas.pageSetup, // 当前属性 默认:页面设置
+ offsetY: 0, //记录上一次距离父元素高度
+ onlyOne: ['1-5', '1-16'], // 只能存在一个的组件(组件的type)
+ pointer: { show: false }, // 穿透
+})
- /**
- * 选择组件
- *
- * @param {Object} res 当前组件对象
- */
- const activeComponent = (res, index) => {
- choose.index = index
- /* 切换组件 */
- choose.rightcom = res.style
- /* 丢样式 */
- choose.currentproperties = res.setStyle
+/**
+ * 选择组件
+ *
+ * @param {Object} res 当前组件对象
+ */
+const activeComponent = (res, index) => {
+ choose.index = index
+ /* 切换组件 */
+ choose.rightcom = res.style
+ /* 丢样式 */
+ choose.currentproperties = res.setStyle
- /* 替换 */
- datas.pageComponents.forEach((res) => {
- /* 修改选中 */
- if (res.active === true) res.active = false
- })
+ /* 替换 */
+ datas.pageComponents.forEach((res) => {
+ /* 修改选中 */
+ if (res.active === true) res.active = false
+ })
- /* 选中样式 */
- res.active = true
- }
+ /* 选中样式 */
+ res.active = true
+}
- // 切换标题
- const headTop = () => {
- choose.rightcom = 'decorate'
- /* 替换 */
- datas.pageComponents.forEach((res) => {
- /* 修改选中 */
- if (res.active === true) res.active = false
- })
- }
+// 切换标题
+const headTop = () => {
+ choose.rightcom = 'decorate'
+ /* 替换 */
+ datas.pageComponents.forEach((res) => {
+ /* 修改选中 */
+ if (res.active === true) res.active = false
+ })
+}
- // 删除组件
- const deleteObj = (index) => {
- datas.pageComponents.splice(index, 1)
- if (choose.index === index) choose.rightcom = 'decorate'
- if (index < choose.index) choose.index = choose.index - 1
- }
+/**
+ * 删除组件
+ *
+ * @param {Number} index 当前组件index
+ */
+const deleteObj = (index) => {
+ datas.pageComponents.splice(index, 1)
+ if (choose.index === index) choose.rightcom = 'decorate'
+ if (index < choose.index) choose.index = choose.index - 1
+}
- /**
- * 当将元素或文本选择拖动到有效放置目标(每几百毫秒)上时,会触发此事件
- *
- * @param {Object} event event对象
- */
- const allowDrop = (event) => {
- //阻止浏览器的默认事件
- event.preventDefault()
+/**
+ * 当将元素或文本选择拖动到有效放置目标(每几百毫秒)上时,会触发此事件
+ *
+ * @param {Object} event event对象
+ */
+const allowDrop = (event) => {
+ //阻止浏览器的默认事件
+ event.preventDefault()
- /* 获取鼠标高度 */
- let eventoffset = event.offsetY
+ /* 获取鼠标高度 */
+ let eventoffset = event.offsetY
- /* 如果没有移动不触发事件减少损耗 */
- if (choose.offsetY === eventoffset) return
- else choose.offsetY = eventoffset
+ /* 如果没有移动不触发事件减少损耗 */
+ if (choose.offsetY === eventoffset) return
+ else choose.offsetY = eventoffset
- /* 获取组件 */
- const childrenObject = event.target.children[0]
+ /* 获取组件 */
+ const childrenObject = event.target.children[0]
- // 一个以上的组件计算
- if (datas.pageComponents.length) {
- /* 如果只有一个组件并且第一个是提示组件直接返回 */
- if (
- datas.pageComponents.length === 1 &&
- datas.pageComponents[0].type === 0
- )
- return
+ // 一个以上的组件计算
+ if (datas.pageComponents.length) {
+ /* 如果只有一个组件并且第一个是提示组件直接返回 */
+ if (datas.pageComponents.length === 1 && datas.pageComponents[0].type === 0)
+ return
- /* 如果鼠标的高度小于第一个的一半直接放到第一个 */
- if (eventoffset < childrenObject.children[0].clientHeight / 2) {
- /* 如果第一个是提示组件直接返回 */
- if (datas.pageComponents[0].type === 0) return
+ /* 如果鼠标的高度小于第一个的一半直接放到第一个 */
+ if (eventoffset < childrenObject.children[0].clientHeight / 2) {
+ /* 如果第一个是提示组件直接返回 */
+ if (datas.pageComponents[0].type === 0) return
- /* 删除提示组件 */
- datas.pageComponents = datas.pageComponents.filter(
- (res) => res.component !== 'placementarea'
- )
-
- /* 最后面添加提示组件 */
- datas.pageComponents.unshift({
- component: 'placementarea',
- type: 0,
- })
-
- return
- }
-
- /* 记录距离父元素高度 */
- const childOff = childrenObject.offsetTop
-
- /* 鼠标在所有组件下面 */
- if (
- eventoffset > childrenObject.clientHeight ||
- childrenObject.lastChild.offsetTop -
- childOff +
- childrenObject.lastChild.clientHeight / 2 <
- eventoffset
- ) {
- /* 最后一个组件是提示组件返回 */
- if (datas.pageComponents[datas.pageComponents.length - 1].type === 0)
- return
-
- /* 清除提示组件 */
- datas.pageComponents = datas.pageComponents.filter(
- (res) => res.component !== 'placementarea'
- )
-
- /* 最后一个不是提示组件添加 */
- datas.pageComponents.push({
- component: 'placementarea',
- type: 0,
- })
-
- return
- }
-
- const childrens = childrenObject.children
-
- /* 在两个组件中间,插入 */
- for (let i = 0, l = childrens.length; i < l; i++) {
- const childoffset = childrens[i].offsetTop - childOff
-
- if (childoffset + childrens[i].clientHeight / 2 > event.offsetY) {
- /* 如果是提示组件直接返回 */
- if (datas.pageComponents[i].type === 0) break
-
- if (datas.pageComponents[i - 1].type === 0) break
-
- /* 清除提示组件 */
- datas.pageComponents = datas.pageComponents.filter(
- (res) => res.component !== 'placementarea'
- )
-
- datas.pageComponents.splice(i, 0, {
- component: 'placementarea',
- type: 0,
- })
- break
- } else if (childoffset + childrens[i].clientHeight > event.offsetY) {
- if (datas.pageComponents[i].type === 0) break
-
- if (
- !datas.pageComponents[i + 1] ||
- datas.pageComponents[i + 1].type === 0
- )
- break
-
- datas.pageComponents = datas.pageComponents.filter(
- (res) => res.component !== 'placementarea'
- )
-
- datas.pageComponents.splice(i, 0, {
- component: 'placementarea',
- type: 0,
- })
-
- break
- }
- }
- } else {
- /* 一个组件都没有直接push */
- datas.pageComponents.push({
- component: 'placementarea',
- type: 0,
- })
- }
- }
-
- /**
- * 当在有效放置目标上放置元素或选择文本时触发此事件
- *
- * @param {Object} event event对象
- */
- const drop = (event) => {
- /* 获取数据 */
- let data = utils.deepClone(
- componentProperties.get(event.dataTransfer.getData('componentName'))
- )
-
- /* 查询是否只能存在一个的组件且在第一个 */
- let someOne = datas.pageComponents.some((item, index) => {
- return (
- item.component === 'placementarea' &&
- index === 0 &&
- choose.onlyOne.includes(data.type)
- )
- })
- if (someOne) {
- ElMessage.info('固定位置的组件(如: 底部导航、悬浮)不能放在第一个!')
- /* 删除提示组件 */
- dragleaves()
- return
- }
-
- /* 查询是否只能存在一个的组件 */
- let someResult = datas.pageComponents.some((item) => {
- console.log(item.component, '--------------item.component')
- return (
- choose.onlyOne.includes(item.type) &&
- item.component === event.dataTransfer.getData('componentName')
- )
- })
- if (someResult) {
- ElMessage.info('当前组件只能添加一个!')
- /* 删除提示组件 */
- dragleaves()
- return
- }
-
- /* 替换 */
- datas.pageComponents.forEach((res, index) => {
- /* 修改选中 */
- if (res.active === true) res.active = false
- /* 替换提示 */
- choose.index = index
- if (res.component === 'placementarea')
- datas.pageComponents[index] = data
- })
-
- /* 切换组件 */
- choose.rightcom = data.style
- /* 丢样式 */
- choose.currentproperties = data.setStyle
-
- console.log(
- data,
- choose.rightcom,
- choose.currentproperties,
- '----------components data'
- )
- }
-
- /**
- * 当拖动的元素或文本选择离开有效的放置目标时,会触发此事件
- *
- * @param {Object} event event对象
- */
- const dragleaves = () => {
/* 删除提示组件 */
datas.pageComponents = datas.pageComponents.filter(
(res) => res.component !== 'placementarea'
)
+
+ /* 最后面添加提示组件 */
+ datas.pageComponents.unshift({
+ component: 'placementarea',
+ type: 0,
+ })
+
+ return
}
- const reload = inject('reload')
- // 重置
- const reloads = () => {
- ElMessageBox.confirm(
- '重置后您添加或者修改的数据将会失效, 是否继续?',
- '提示',
- {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- type: 'warning',
- }
+ /* 记录距离父元素高度 */
+ const childOff = childrenObject.offsetTop
+
+ /* 鼠标在所有组件下面 */
+ if (
+ eventoffset > childrenObject.clientHeight ||
+ childrenObject.lastChild.offsetTop -
+ childOff +
+ childrenObject.lastChild.clientHeight / 2 <
+ eventoffset
+ ) {
+ /* 最后一个组件是提示组件返回 */
+ if (datas.pageComponents[datas.pageComponents.length - 1].type === 0)
+ return
+
+ /* 清除提示组件 */
+ datas.pageComponents = datas.pageComponents.filter(
+ (res) => res.component !== 'placementarea'
)
- .then(() => {
- reload()
- })
- .catch(() => {})
+
+ /* 最后一个不是提示组件添加 */
+ datas.pageComponents.push({
+ component: 'placementarea',
+ type: 0,
+ })
+
+ return
}
- // 监听右侧属性设置切换
- watch(
- () => choose.rightcom,
- (newval) => {
- if (newval === 'decorate') {
- datas.pageComponents.forEach((res) => {
- /* 修改选中 */
- if (res.active === true) res.active = false
- })
- choose.currentproperties = datas.pageSetup
- return
- }
- if (newval === 'componenmanagement') {
- /* 替换 */
- datas.pageComponents.forEach((res) => {
- /* 修改选中 */
- if (res.active === true) res.active = false
- })
- choose.currentproperties = datas.pageComponents
- }
+ const childrens = childrenObject.children
+
+ /* 在两个组件中间,插入 */
+ for (let i = 0, l = childrens.length; i < l; i++) {
+ const childoffset = childrens[i].offsetTop - childOff
+
+ if (childoffset + childrens[i].clientHeight / 2 > event.offsetY) {
+ /* 如果是提示组件直接返回 */
+ if (datas.pageComponents[i].type === 0) break
+
+ if (datas.pageComponents[i - 1].type === 0) break
+
+ /* 清除提示组件 */
+ datas.pageComponents = datas.pageComponents.filter(
+ (res) => res.component !== 'placementarea'
+ )
+
+ datas.pageComponents.splice(i, 0, {
+ component: 'placementarea',
+ type: 0,
+ })
+ break
+ } else if (childoffset + childrens[i].clientHeight > event.offsetY) {
+ if (datas.pageComponents[i].type === 0) break
+
+ if (
+ !datas.pageComponents[i + 1] ||
+ datas.pageComponents[i + 1].type === 0
+ )
+ break
+
+ datas.pageComponents = datas.pageComponents.filter(
+ (res) => res.component !== 'placementarea'
+ )
+
+ datas.pageComponents.splice(i, 0, {
+ component: 'placementarea',
+ type: 0,
+ })
+
+ break
}
- )
- return {
- realTimeView,
- ...toRefs(datas),
- ...toRefs(choose),
- catJson,
- componenmanagement,
- activeComponent,
- headTop,
- deleteObj,
- exportJSON,
- importJSON,
- allowDrop,
- drop,
- dragleaves,
- reloads,
}
- },
- components: { vuedraggable },
+ } else {
+ /* 一个组件都没有直接push */
+ datas.pageComponents.push({
+ component: 'placementarea',
+ type: 0,
+ })
+ }
}
+
+/**
+ * 当在有效放置目标上放置元素或选择文本时触发此事件
+ *
+ * @param {Object} event event对象
+ */
+const drop = (event) => {
+ /* 获取数据 */
+ let data = utils.deepClone(
+ componentProperties.get(event.dataTransfer.getData('componentName'))
+ )
+
+ /* 查询是否只能存在一个的组件且在第一个 */
+ let someOne = datas.pageComponents.some((item, index) => {
+ return (
+ item.component === 'placementarea' &&
+ index === 0 &&
+ choose.onlyOne.includes(data.type)
+ )
+ })
+ if (someOne) {
+ ElMessage.info('固定位置的组件(如: 底部导航、悬浮)不能放在第一个!')
+ /* 删除提示组件 */
+ dragleaves()
+ return
+ }
+
+ /* 查询是否只能存在一个的组件 */
+ let someResult = datas.pageComponents.some((item) => {
+ console.log(item.component, '--------------item.component')
+ return (
+ choose.onlyOne.includes(item.type) &&
+ item.component === event.dataTransfer.getData('componentName')
+ )
+ })
+ if (someResult) {
+ ElMessage.info('当前组件只能添加一个!')
+ /* 删除提示组件 */
+ dragleaves()
+ return
+ }
+
+ /* 替换 */
+ datas.pageComponents.forEach((res, index) => {
+ /* 修改选中 */
+ if (res.active === true) res.active = false
+ /* 替换提示 */
+ choose.index = index
+ if (res.component === 'placementarea') datas.pageComponents[index] = data
+ })
+
+ /* 切换组件 */
+ choose.rightcom = data.style
+ /* 丢样式 */
+ choose.currentproperties = data.setStyle
+
+ console.log(
+ data,
+ choose.rightcom,
+ choose.currentproperties,
+ '----------components data'
+ )
+}
+
+/**
+ * 当拖动的元素或文本选择离开有效的放置目标时,会触发此事件
+ *
+ * @param {Object} event event对象
+ */
+const dragleaves = () => {
+ /* 删除提示组件 */
+ datas.pageComponents = datas.pageComponents.filter(
+ (res) => res.component !== 'placementarea'
+ )
+}
+
+const reload = inject('reload')
+// 重置
+const reloads = () => {
+ ElMessageBox.confirm(
+ '重置后您添加或者修改的数据将会失效, 是否继续?',
+ '提示',
+ {
+ confirmButtonText: '确定',
+ cancelButtonText: '取消',
+ type: 'warning',
+ }
+ )
+ .then(() => {
+ reload()
+ })
+ .catch(() => {})
+}
+
+// 监听右侧属性设置切换
+watch(
+ () => choose.rightcom,
+ (newval) => {
+ if (newval === 'decorate') {
+ datas.pageComponents.forEach((res) => {
+ /* 修改选中 */
+ if (res.active === true) res.active = false
+ })
+ choose.currentproperties = datas.pageSetup
+ return
+ }
+ if (newval === 'componenmanagement') {
+ /* 替换 */
+ datas.pageComponents.forEach((res) => {
+ /* 修改选中 */
+ if (res.active === true) res.active = false
+ })
+ choose.currentproperties = datas.pageComponents
+ }
+ }
+)
+
+const { id, pageSetup, pageComponents } = toRefs(datas)
+const { deleShow, rightcom, currentproperties, pointer } = toRefs(choose)