优化管理端代码结构

master
paulGao 2022-09-02 17:51:33 +08:00
parent 36c4584970
commit 55aa57d812
147 changed files with 1759 additions and 114 deletions

View File

@ -31,7 +31,7 @@ npm run lint
#### login.vue页面测试时不走权限直接return 318行 #### login.vue页面测试时不走权限直接return 318行
#### Main.vue 页面241行修改避免报错 #### Main.vue 页面241行修改避免报错
#### main-components 头部,左侧所有内容 #### main-parts 头部,左侧所有内容
#### lili-floor-renovation 楼层装修模块 #### decoration 楼层装修模块

View File

@ -22,7 +22,7 @@
"sockjs-client": "^1.4.0", "sockjs-client": "^1.4.0",
"swiper": "^6.3.5", "swiper": "^6.3.5",
"uuid": "^8.3.2", "uuid": "^8.3.2",
"view-design": "^4.2.0", "view-design": "^4.7.0",
"vue": "^2.6.10", "vue": "^2.6.10",
"vue-awesome-swiper": "^4.1.1", "vue-awesome-swiper": "^4.1.1",
"vue-i18n": "^8.15.1", "vue-i18n": "^8.15.1",

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,657 @@
.hz-m-wrap {
position: relative;
/*overflow: hidden;*/
}
.hz-m-wrap .hz-u-img {
display: block;
width: 100%;
max-width: 100%;
height: auto;
max-height: 100%;
user-select: none;
}
.hz-m-wrap .hz-m-area {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
cursor: crosshair;
}
.hz-m-wrap .hz-m-item {
position: absolute;
display: block;
}
.hz-m-wrap .hz-m-box {
position: relative;
width: 100%;
height: 100%;
box-shadow: 0 0 6px #000;
background-color: #e31414;
font-size: 12px;
cursor: pointer;
color: #fff;
opacity: 0.8;
}
.hz-m-box{
overflow: hidden;
}
.hz-m-wrap .hz-m-box>li {
position: absolute;
text-align: center;
user-select: none;
}
.hz-m-wrap .hz-m-box.hz-z-hidden>li {
display: none;
}
.hz-m-wrap .hz-m-box.hz-m-hoverbox:hover {
box-shadow: 0 0 0 2px #373950;
}
.hz-m-wrap .hz-m-box.hz-m-hoverbox .hz-icon:hover {
background-color: #373950;
}
.hz-m-wrap .hz-m-box .hz-icon {
width: 24px;
height: 24px;
line-height: 24px;
font-size: 20px;
text-align: center;
}
.hz-m-wrap .hz-m-box .hz-icon:hover {
background-color: #e31414;
opacity: 0.8;
}
.hz-m-wrap .hz-m-box .hz-u-index {
top: 0;
left: 0;
width: 24px;
height: 24px;
line-height: 24px;
background-color: #000;
z-index: 100;
}
.hz-m-wrap .hz-m-box .hz-u-close {
top: 0;
right: 0;
z-index: 10;
}
.hz-m-wrap .hz-m-box .hz-m-copy {
display: inline-block;
}
.hz-m-wrap .hz-m-box .hz-small-icon {
border: 0;
border-radius: 0;
}
.hz-m-wrap .hz-m-box .hz-u-square {
width: 8px;
height: 8px;
opacity: 0.8;
}
.hz-m-wrap .hz-m-box .hz-u-square:after {
content: '';
position: absolute;
top: 2px;
left: 2px;
width: 4px;
height: 4px;
border-radius: 4px;
background-color: #fff;
}
.hz-m-wrap .hz-m-box .hz-u-square-tl {
top: -4px;
left: -4px;
cursor: nw-resize;
}
.hz-m-wrap .hz-m-box .hz-u-square-tc {
top: -4px;
left: 50%;
transform: translateX(-50%);
cursor: n-resize;
}
.hz-m-wrap .hz-m-box .hz-u-square-tr {
top: -4px;
right: -4px;
cursor: ne-resize;
}
.hz-m-wrap .hz-m-box .hz-u-square-cl {
top: 50%;
left: -4px;
transform: translateY(-50%);
cursor: w-resize;
}
.hz-m-wrap .hz-m-box .hz-u-square-cr {
top: 50%;
right: -4px;
transform: translateY(-50%);
cursor: w-resize;
}
.hz-m-wrap .hz-m-box .hz-u-square-bl {
bottom: -4px;
left: -4px;
cursor: sw-resize;
}
.hz-m-wrap .hz-m-box .hz-u-square-bc {
bottom: -4px;
left: 50%;
transform: translateX(-50%);
cursor: s-resize;
}
.hz-m-wrap .hz-m-box .hz-u-square-br {
bottom: -4px;
right: -4px;
cursor: se-resize;
}
/* reset */
.hz-m-modal,
.hz-m-wrap {
font-size: 12px;
/* 清除内外边距 */
/* 重置列表元素 */
/* 重置文本格式元素 */
/* 初始化 input */
}
.hz-m-modal ul,
.hz-m-wrap ul,
.hz-m-modal ol,
.hz-m-wrap ol,
.hz-m-modal li,
.hz-m-wrap li {
margin: 0;
padding: 0;
}
.hz-m-modal ul,
.hz-m-wrap ul,
.hz-m-modal ol,
.hz-m-wrap ol {
list-style: none;
}
.hz-m-modal a,
.hz-m-wrap a {
text-decoration: none;
}
.hz-m-modal a:hover,
.hz-m-wrap a:hover {
text-decoration: underline;
}
.hz-m-modal p,
.hz-m-wrap p {
-webkit-margin-before: 0;
-webkit-margin-after: 0;
}
.hz-m-modal input[type="checkbox"],
.hz-m-wrap input[type="checkbox"] {
cursor: pointer;
}
/* basic */
/* modal 样式 */
.hz-m-modal {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 1000;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
touch-action: cross-slide-y pinch-zoom double-tap-zoom;
text-align: center;
overflow: hidden;
}
.hz-m-modal:before {
content: "";
display: inline-block;
vertical-align: middle;
height: 100%;
}
.hz-m-modal .hz-modal_dialog {
display: inline-block;
vertical-align: middle;
text-align: left;
border-radius: 3px;
}
.hz-m-modal .hz-modal_title {
margin: 0;
}
.hz-m-modal .hz-modal_close {
float: right;
margin: -6px -4px 0 0;
}
@media (max-width: 767px) {
.hz-m-modal .hz-modal_dialog {
width: auto;
}
}
html.z-modal,
html.z-modal body {
overflow: hidden;
}
.hz-m-modal {
background: rgba(0, 0, 0, 0.6);
}
.hz-m-modal .hz-modal_dialog {
width: 450px;
background: #fff;
-webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125);
box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125);
}
.hz-m-modal .hz-modal_hd {
padding: 15px;
border-bottom: 1px solid #f4f4f4;
}
.hz-m-modal .hz-modal_title {
font-size: 18px;
}
.hz-m-modal .hz-modal_close {
margin: -15px -15px 0 0;
padding: 6px;
color: #bbb;
cursor: pointer;
}
.hz-m-modal .hz-modal_close:hover {
color: #888;
}
.hz-m-modal .hz-modal_close .hz-u-icon-close {
font-size: 18px;
transition: transform 500ms ease-in-out;
transform: rotate(0deg);
width: 18px;
text-align: center;
}
.hz-m-modal .hz-modal_close:hover .hz-u-icon-close {
transform: rotate(270deg);
}
.hz-m-modal .hz-modal_bd {
padding: 15px 15px 0 15px;
min-height: 10px;
}
.hz-m-modal .hz-modal_ft {
padding: 15px;
text-align: center;
border-top: 1px solid #f4f4f4;
}
.hz-m-modal .hz-modal_ft .hz-u-btn {
margin: 0 10px;
}
@media (max-width: 767px) {
.hz-m-modal .hz-modal_dialog {
margin: 10px;
}
}
/* 基本按钮样式 btn */
.hz-u-btn {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-appearance: none;
border: none;
overflow: visible;
font: inherit;
text-transform: none;
text-decoration: none;
cursor: pointer;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
background: none;
display: inline-block;
vertical-align: middle;
text-align: center;
font-size: 12px;
}
.hz-u-btn:hover,
.hz-u-btn:focus {
outline: none;
text-decoration: none;
}
.hz-u-btn:disabled {
cursor: not-allowed;
}
.hz-u-btn-block {
display: block;
width: 100%;
}
.hz-u-btn {
padding: 0 16px;
height: 28px;
line-height: 26px;
background: #f4f4f4;
color: #444;
border: 1px solid #ddd;
-moz-border-radius: 3px;
border-radius: 3px;
}
.hz-u-btn:hover,
.hz-u-btn:focus {
background: #e5e5e5;
border: 1px solid #adadad;
}
.hz-u-btn:active {
background: #e5e5e5;
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
}
.hz-u-btn:disabled {
background: #fff;
border: 1px solid #ccc;
filter: alpha(opacity=65);
opacity: 0.65;
-webkit-box-shadow: none;
box-shadow: none;
}
/* 按钮类型 */
.hz-u-btn-primary {
background: #67739b;
color: #fff;
border: 1px solid #67739b;
}
.hz-u-btn-primary:hover,
.hz-u-btn-primary:focus {
background: #31384b;
color: #fff;
border: 1px solid #31384b;
}
.hz-u-btn-primary:active {
background: #367fa9;
color: #fff;
border: 1px solid #367fa9;
}
.hz-u-btn-primary:disabled {
background: #444;
color: #fff;
border: 1px solid #444;
}
/* input */
.hz-u-input {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
margin: 0;
border: 0;
padding: 0;
border-radius: 0;
font: inherit;
color: inherit;
vertical-align: middle;
}
.hz-u-input {
position: relative;
z-index: 0;
padding: 5px 6px;
border: 1px solid #d2d6de;
color: #555;
background: #fff;
-moz-border-radius: 3px;
border-radius: 3px;
}
.hz-u-input::-webkit-input-placeholder {
color: #bbb;
filter: alpha(opacity=100);
opacity: 1;
}
.hz-u-input::-moz-placeholder {
color: #bbb;
filter: alpha(opacity=100);
opacity: 1;
}
.hz-u-input:-moz-placeholder {
color: #bbb;
filter: alpha(opacity=100);
opacity: 1;
}
.hz-u-input:-ms-placeholder {
color: #bbb;
filter: alpha(opacity=100);
opacity: 1;
}
.hz-u-input:focus {
outline: 0;
background: #fff;
color: #555;
border: 1px solid #3c8dbc;
}
.hz-u-input:disabled {
cursor: not-allowed;
background: #eee;
color: #999;
border: 1px solid #d2d6de;
}
.hz-u-input {
width: 280px;
height: 34px;
}
.hz-u-input.hz-u-input-success {
color: #00a65a;
border-color: #00a65a;
}
.hz-u-input.hz-u-input-warning {
color: #f39c12;
border-color: #f39c12;
}
.hz-u-input.hz-u-input-error {
color: #dd4b39;
border-color: #dd4b39;
}
.hz-u-input.hz-u-input-blank {
border-color: transparent;
border-style: dashed;
background: none;
}
.hz-u-input.hz-u-input-blank:focus {
border-color: #ddd;
}
/* formItem */
.hz-u-formitem {
display: inline-block;
*zoom: 1;
margin-bottom: 1em;
}
.hz-u-formitem:before,
.hz-u-formitem:after {
display: table;
content: "";
line-height: 0;
}
.hz-u-formitem:after {
clear: both;
}
.hz-u-formitem .hz-formitem_tt {
display: block;
float: left;
text-align: right;
}
.hz-u-formitem .hz-formitem_ct {
display: block;
}
.hz-u-formitem .hz-formitem_rqr {
line-height: 28px;
color: #dd4b39;
}
.hz-u-formitem .hz-formitem_tt {
line-height: 34px;
width: 100px;
}
.hz-u-formitem .hz-formitem_ct {
line-height: 34px;
margin-left: 108px;
}
/* icon */
.hz-u-icon {
display: inline-block;
font: normal normal normal 14px/1 FontAwesome;
font-size: inherit;
text-rendering: auto;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* label */
.hz-u-label {
display: inline-block;
cursor: pointer;
}
/* margin */
.hz-f-ml0 {
margin-bottom: 0;
}
/* replicator */
.hz-u-copy input[data-for-copy] {
transform: translateZ(0);
position: fixed;
bottom: 0;
right: 0;
width: 1px;
height: 1px;
opacity: 0;
overflow: hidden;
z-index: -999;
color: transparent;
background-color: transparent;
border: none;
outline: none;
}
@font-face {
font-family: 'iconfont';
/* project id 525460 */
src: url('//at.alicdn.com/t/font_525460_d0ysfwzacahsemi.eot');
src: url('//at.alicdn.com/t/font_525460_d0ysfwzacahsemi.eot?#iefix') format('embedded-opentype'), url('//at.alicdn.com/t/font_525460_d0ysfwzacahsemi.woff') format('woff'), url('//at.alicdn.com/t/font_525460_d0ysfwzacahsemi.ttf') format('truetype'), url('//at.alicdn.com/t/font_525460_d0ysfwzacahsemi.svg#iconfont') format('svg');
}
.hz-icon {
font-family: "iconfont" !important;
font-size: 20px;
font-style: normal;
text-align: center;
user-select: none;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.hz-icon-edit {
position: absolute;
top: -4px;
left: 50%;
transform: translateX(-50%);
}
.hz-flex-img {
display: flex;
align-items: center;
justify-content: center;
}
.hz-flex-img img {
width: 100%;
height: 100%;
}
.hz-icon-trash:before {
content: "\e605";
}
.hz-edit-img {
width: 100%;
display: flex;
justify-content: center;
}
.hz-edit-img img {
max-width: 300px;
max-height: 200px;
margin-bottom: 10px;
}
.hz-edit-del {
width: 100%;
display: flex;
justify-content: flex-end;
}

View File

@ -0,0 +1,101 @@
<template>
<div ref="content" class="hz-m-wrap">
<img class="hz-u-img" :src="image" />
<ul class="hz-m-area" v-add-item>
<zone
class="hz-m-item"
v-for="(zone, index) in zones"
:key="index"
:index="index"
:setting="zone"
@delItem="removeItem($event)"
@changeInfo="changeInfo($event)"
></zone>
</ul>
</div>
</template>
<script>
import Zone from "./Zone";
import addItem from "../directives/addItem";
export default {
name: "HotZone",
data() {
return {
zones: [],
};
},
props: {
image: {
type: String,
required: true,
},
zonesInit: {
type: Array,
default: () => [],
},
max: {
type: Number,
},
},
mounted() {
this.zones = this.zonesInit.concat();
},
methods: {
changeInfo(res) {
let { info, index, zoneInfo } = res;
info = { ...zoneInfo, ...info };
// change
Object.assign(this.zones[index], info);
this.hasChange("changeInfo");
},
addItem(setting) {
this.zones.push(setting);
this.$emit("choose");
// this.hasChange() mouseup
// this.$emit('add', setting)
},
eraseItem(index = this.zones.length - 1) {
this.zones.splice(index, 1);
this.$emit("erase", index);
},
isOverRange() {
let { max, zones } = this;
return max && zones.length > max;
},
overRange() {
const index = this.zones.length - 1;
this.zones.splice(index, 1);
this.$emit("overRange", index);
},
removeItem(index = this.zones.length - 1) {
this.zones.splice(index, 1);
this.hasChange("removeItem");
this.$emit("remove", index);
},
changeItem(info, isAdd) {
const index = this.zones.length - 1;
// change
Object.assign(this.zones[index], info);
this.hasChange("changeItem");
isAdd && this.$emit("add", this.zones[index]);
},
hasChange(from) {
this.$emit("change", this.zones);
},
},
directives: {
addItem,
},
components: {
Zone,
},
};
</script>
<style scoped>
@import "../assets/styles/main.css";
</style>

View File

@ -0,0 +1,212 @@
<template>
<li
v-drag-item
:style="{
top: zoneTop,
left: zoneLeft,
width: zoneWidth,
height: zoneHeight,
}"
>
<ul
v-change-size
class="hz-m-box"
:class="{
'hz-z-hidden': tooSmall,
'hz-m-hoverbox': !hideZone,
}"
>
<li class="hz-u-index" :title="`热区${index + 1}`">{{ index + 1 }}</li>
<li
title="删除该热区"
v-show="!hideZone"
class="hz-u-close hz-icon hz-icon-trash"
@click.prevent.stop="delItem(index)"
@mousedown.stop
@mouseup.stop
@mousemove.stop
></li>
<li
title="编辑该热区"
v-show="!hideZone"
class="hz-u-close hz-icon hz-icon-edit"
@click.prevent.stop="showModalFn(index)"
@mousedown.stop
@mouseup.stop
@mousemove.stop
>
<img width="17" height="17" src="../assets/styles/icons8-edit-64.png"></img>
</li>
<li class="hz-flex-img">
<img class="hz-u-img" :src="zoneForm.img" />
</li>
<li class="hz-u-square hz-u-square-tl" data-pointer="dealTL"></li>
<li class="hz-u-square hz-u-square-tc" data-pointer="dealTC"></li>
<li class="hz-u-square hz-u-square-tr" data-pointer="dealTR"></li>
<li class="hz-u-square hz-u-square-cl" data-pointer="dealCL"></li>
<li class="hz-u-square hz-u-square-cr" data-pointer="dealCR"></li>
<li class="hz-u-square hz-u-square-bl" data-pointer="dealBL"></li>
<li class="hz-u-square hz-u-square-bc" data-pointer="dealBC"></li>
<li class="hz-u-square hz-u-square-br" data-pointer="dealBR"></li>
</ul>
<Modal
v-model="showModal"
title="编辑热区"
draggable
scrollable
:mask="false"
ok-text="保存"
@on-ok="saveZone"
@on-cancel="
() => {
showModal = false;
}
"
>
<div>
<div class="hz-edit-img">
<img class="show-image" :src="zoneForm.img" alt />
</div>
<Form :model="zoneForm" :label-width="80">
<FormItem label="图片链接:">
<Input v-model="zoneForm.img"></Input>
<Button size="small" type="primary" @click="handleSelectImg"
>选择图片</Button
>
</FormItem>
<FormItem label="跳转链接:">
<Input v-model="zoneForm.link"></Input>
<Button size="small" type="primary" @click="handleSelectLink"
>选择链接</Button
>
</FormItem>
</Form>
</div>
</Modal>
<!-- 选择商品链接 -->
<liliDialog ref="liliDialog" @selectedLink="selectedLink"></liliDialog>
<!-- 选择图片 -->
<Modal width="1200px" v-model="picModelFlag" footer-hide>
<ossManage
@callback="callbackSelected"
:isComponent="true"
ref="ossManage"
/>
</Modal>
</li>
</template>
<script>
import changeSize from "../directives/changeSize";
import dragItem from "../directives/dragItem";
import ossManage from "@/views/sys/oss-manage/ossManage";
export default {
name: "Zone",
components: {
ossManage,
},
data() {
return {
zoneTop: "",
zoneLeft: "",
zoneWidth: "",
zoneHeight: "",
hideZone: false,
tooSmall: false,
showModal: false,
picModelFlag: false,
currentIndex: 0,
zoneForm: {
img: "",
link: "",
type: "",
},
};
},
props: ["index", "setting"],
mounted() {
console.log(this.setting);
this.setZoneInfo(this.setting);
},
methods: {
setZoneInfo(val) {
this.zoneTop = this.getZoneStyle(val.topPer);
this.zoneLeft = this.getZoneStyle(val.leftPer);
this.zoneWidth = this.getZoneStyle(val.widthPer);
this.zoneHeight = this.getZoneStyle(val.heightPer);
this.tooSmall = val.widthPer < 0.01 && val.heightPer < 0.01;
this.zoneForm.img = val.img;
this.zoneForm.link = val.link;
this.zoneForm.type = val.type;
},
handlehideZone(isHide = true) {
if (this.hideZone === isHide) {
return;
}
this.hideZone = isHide;
},
changeInfo(info = {}) {
const { index } = this;
this.$emit("changeInfo", {
info,
index,
zoneInfo: this.zoneForm,
});
},
showModalFn(index) {
this.showModal = true;
this.currentIndex = index;
},
//
handleSelectImg() {
this.$refs.ossManage.selectImage = true;
this.picModelFlag = true;
},
//
callbackSelected(item) {
this.picModelFlag = false;
this.zoneForm.img = item.url;
},
//
handleSelectLink(item, index) {
if (item) this.selectedNav = item;
this.$refs.liliDialog.open("link");
},
//
selectedLink(val) {
this.zoneForm.link = this.$options.filters.formatLinkType(val);
this.zoneForm.type = val.___type;
},
saveZone() {},
delZone() {
this.delItem(this.currentIndex);
},
delItem(index) {
this.$emit("delItem", index);
},
getZoneStyle(val) {
return `${(val || 0) * 100}%`;
},
},
watch: {
setting: {
handler: function (val) {
this.setZoneInfo(val);
},
deep: true,
},
},
directives: {
changeSize,
dragItem,
},
};
</script>

View File

@ -0,0 +1,100 @@
import _ from '../utils'
export default {
bind: function (el, binding, vnode) {
const MIN_LIMIT = _.MIN_LIMIT
el.addEventListener('mousedown', handleMouseDown,{ passive: false })
function handleMouseDown (e) {
console.log('additem', e)
e && e.preventDefault()
let itemInfo = {
top: _.getDistanceY(e, el),
left: _.getDistanceX(e, el),
width: 0,
height: 0
}
let container = _.getOffset(el)
// Only used once at the beginning of init
let setting = {
topPer: _.decimalPoint(itemInfo.top / container.height),
leftPer: _.decimalPoint(itemInfo.left / container.width),
widthPer: 0,
heightPer: 0
}
let preX = _.getPageX(e)
let preY = _.getPageY(e)
vnode.context.addItem(setting)// 这里去添加并发送了add通知不应该发送通知
window.addEventListener('mousemove', handleChange,{ passive: false })
window.addEventListener('mouseup', handleMouseUp,{ passive: false })
function handleChange (e) {
e && e.preventDefault()
let moveX = _.getPageX(e) - preX
let moveY = _.getPageY(e) - preY
preX = _.getPageX(e)
preY = _.getPageY(e)
// Not consider the direction of movement first, consider only the lower right drag point
let minLimit = 0
// 添加热区时判定鼠标释放时满足热区大于48*48时条件时生效
let styleInfo = _.dealBR(itemInfo, moveX, moveY, minLimit)
// Boundary value processing 改变热区大小时边界条件的处理
itemInfo = _.dealEdgeValue(itemInfo, styleInfo, container, vnode.context.zones)
Object.assign(el.lastElementChild.style, {
top: `${itemInfo.top}px`,
left: `${itemInfo.left}px`,
width: `${itemInfo.width}px`,
height: `${itemInfo.height}px`
})
}
function handleMouseUp () {
let perInfo = {
topPer: _.decimalPoint(itemInfo.top / container.height),
leftPer: _.decimalPoint(itemInfo.left / container.width),
widthPer: _.decimalPoint(itemInfo.width / container.width),
heightPer: _.decimalPoint(itemInfo.height / container.height),
img: "",
link: "",
type: "",
}
if (vnode.context.isOverRange()) {
vnode.context.overRange() // 判断超出个数限制给overRange钩子抛回调
} else if (container.height < MIN_LIMIT && itemInfo.width > MIN_LIMIT) {
vnode.context.changeItem(Object.assign(perInfo, {
topPer: 0,
heightPer: 1
}), true)
} else if (container.width < MIN_LIMIT && itemInfo.height > MIN_LIMIT) {
vnode.context.changeItem(Object.assign(perInfo, {
leftper: 0,
widthPer: 1
}), true)
} else if (itemInfo.width > MIN_LIMIT && itemInfo.height > MIN_LIMIT) {
vnode.context.changeItem(perInfo, true)
} else {
// 当添加区域超出范围或小于最小区域48*48时触发删除当亲绘制的热区并发送erase事件通知
vnode.context.eraseItem()
}
window.removeEventListener('mousemove', handleChange)
window.removeEventListener('mouseup', handleMouseUp)
}
}
el.$destroy = () => el.removeEventListener('mousedown', handleMouseDown)
},
unbind: function (el) {
el.$destroy()
}
}

View File

@ -0,0 +1,91 @@
import _ from '../utils'
export default {
bind: function (el, binding, vnode) {
el.addEventListener('mousedown', handleMouseDown,{ passive: false })
function handleMouseDown (e) {
let pointer = e.target.dataset.pointer //元素上绑定的方法名
if (!pointer) {
return
}
e && e.stopPropagation()
let zone = el.parentNode
let setting = vnode.context.setting
let currentIndex = vnode.context.index
let container = _.getOffset(zone.parentNode)
let itemInfo = {
width: _.getOffset(zone).width || 0,
height: _.getOffset(zone).height || 0,
top: setting.topPer * container.height || 0,
left: setting.leftPer * container.width || 0
}
let preX = _.getPageX(e)
let preY = _.getPageY(e)
let flag
// Hide the info displayed by hover
vnode.context.handlehideZone(true)
window.addEventListener('mousemove', handleChange,{ passive: false })
window.addEventListener('mouseup', handleMouseUp,{ passive: false })
function handleChange (e) {
e && e.preventDefault()
flag = true
let moveX = _.getPageX(e) - preX
let moveY = _.getPageY(e) - preY
preX = _.getPageX(e)
preY = _.getPageY(e)
// Handling the situation when different dragging points are selected
let styleInfo = _[pointer](itemInfo, moveX, moveY)//调用对应的方法
// Boundary value processing
itemInfo = _.dealEdgeValue(itemInfo, styleInfo, container, vnode.context.$parent.zones, currentIndex)
Object.assign(zone.style, {
top: `${itemInfo.top}px`,
left: `${itemInfo.left}px`,
width: `${itemInfo.width}px`,
height: `${itemInfo.height}px`
})
}
function handleMouseUp () {
if (flag) {
flag = false
let perInfo = {
topPer: _.decimalPoint(itemInfo.top / container.height),
leftPer: _.decimalPoint(itemInfo.left / container.width),
widthPer: _.decimalPoint(itemInfo.width / container.width),
heightPer: _.decimalPoint(itemInfo.height / container.height)
}
vnode.context.changeInfo(perInfo)
// 兼容数据无变更情况下导致 computed 不更新,数据仍为 px 时 resize 出现的问题
Object.assign(zone.style, {
top: `${itemInfo.top}px`,
left: `${itemInfo.left}px`,
width: `${itemInfo.width}px`,
height: `${itemInfo.height}px`
})
}
// Show the info
vnode.context.handlehideZone(false)
window.removeEventListener('mousemove', handleChange)
window.removeEventListener('mouseup', handleMouseUp)
}
}
el.$destroy = () => el.removeEventListener('mousedown', handleMouseDown)
},
unbind: function (el) {
el.$destroy()
}
}

View File

@ -0,0 +1,108 @@
import _ from '../utils'
export default {
bind: function (el, binding, vnode) {
el.addEventListener('mousedown', handleMouseDown)
let collision
function handleMouseDown (e) {
e && e.stopPropagation()
let container = _.getOffset(el.parentNode)
let preX = _.getPageX(e)
let preY = _.getPageY(e)
let topPer
let leftPer
let flag
window.addEventListener('mousemove', handleChange,{ passive: false })
window.addEventListener('mouseup', handleMouseUp,{ passive: false })
function handleChange (e) {
e && e.preventDefault()
flag = true
collision = false
// Hide the info displayed by hover
vnode.context.handlehideZone(true)
let setting = vnode.context.setting
let currentIndex = vnode.context.index
let moveX = _.getPageX(e) - preX
let moveY = _.getPageY(e) - preY
setting.topPer = setting.topPer || 0
setting.leftPer = setting.leftPer || 0
topPer = _.decimalPoint(moveY / container.height + setting.topPer)
leftPer = _.decimalPoint(moveX / container.width + setting.leftPer)
// Hotzone moving boundary processing
if (topPer < 0) {
topPer = 0
moveY = -container.height * setting.topPer
}
if (leftPer < 0) {
leftPer = 0
moveX = -container.width * setting.leftPer
}
if (topPer + setting.heightPer > 1) {
topPer = 1 - setting.heightPer
moveY = container.height * (topPer - setting.topPer)
}
if (leftPer + setting.widthPer > 1) {
leftPer = 1 - setting.widthPer
moveX = container.width * (leftPer - setting.leftPer)
}
// 拖拽碰撞检测
if (vnode.context.$parent.zones.length > 1) {
let currentzones = JSON.parse(JSON.stringify(vnode.context.$parent.zones)).map((zone) => {
return {
left: (zone.leftPer || 0) * container.width,
top: (zone.topPer || 0) * container.height,
width: (zone.widthPer || 0) * container.width,
height: (zone.heightPer || 0) * container.height
}
})
// 矫正
let changeSetting = {}
changeSetting.left = setting.leftPer * container.width + moveX
changeSetting.top = setting.topPer * container.height + moveY
changeSetting.width = setting.widthPer * container.width
changeSetting.height = setting.heightPer * container.height
// 碰撞检测
for (let i = 0, len = currentzones.length; i < len; i++) {
if (currentIndex !== i && _.handleEgdeCollisions(currentzones[i], changeSetting)) {
collision = true
break
}
}
}
el.style.transform = `translate(${moveX}px, ${moveY}px)`
}
function handleMouseUp () {
if (flag) {
flag = false
el.style.transform = 'translate(0, 0)'
if (!collision) {
vnode.context.changeInfo({
topPer,
leftPer
})
}
}
// Show the info
vnode.context.handlehideZone(false)
window.removeEventListener('mousemove', handleChange)
window.removeEventListener('mouseup', handleMouseUp)
}
}
el.$destroy = () => el.removeEventListener('mousedown', handleMouseDown)
},
unbind: function (el) {
el.$destroy()
}
}

View File

@ -0,0 +1,7 @@
import hotzone from './components/Hotzone.vue'
hotzone.install = (Vue) => {
Vue.component(hotzone.name, hotzone)
}
export default hotzone

View File

@ -0,0 +1,274 @@
let _ = {
MIN_LIMIT: 48, // Min size of zone
DECIMAL_PLACES: 4 // Hotzone positioning decimal point limit number of digits
}
/**
* Get a power result of 10 for the power of the constant
* @return {Number}
*/
_.getMultiple = (decimalPlaces = _.DECIMAL_PLACES) => {
return Math.pow(10, decimalPlaces)
}
/**
* Limit decimal places
* @param {Number} num
* @return {Number}
*/
_.decimalPoint = (val = 0) => { // 处理js小数点计算不精确问题先放再缩小
return Math.round(val * _.getMultiple()) / _.getMultiple() || 0
}
/**
* Get element width and height
* @param {Object} elem
* @return {Object}
*/
_.getOffset = (elem = {}) => ({
width: elem.clientWidth || 0,
height: elem.clientHeight || 0
})
/**
* Get pageX
* @param {Object} e
* @return {Number}
*/
_.getPageX = (e) => ('pageX' in e) ? e.pageX : e.touches[0].pageX
/**
* Get pageY
* @param {Object} e
* @return {Number}
*/
_.getPageY = (e) => ('pageY' in e) ? e.pageY : e.touches[0].pageY
/**
* Gets the abscissa value of the mouse click relative to the target node
* @param {Object} e
* @param {Object} container
* @return {Number}
*/
_.getDistanceX = (e, container) =>
_.getPageX(e) - (container.getBoundingClientRect().left + window.pageXOffset)
/**
* Gets the ordinate value of the mouse click relative to the target node
* @param {Object} e
* @param {Object} container
* @return {Number}
*/
_.getDistanceY = (e, container) =>
_.getPageY(e) - (container.getBoundingClientRect().top + window.pageYOffset)
// 检测区域是否有碰撞 true 有碰撞交集 ,false 无碰撞
_.handleEgdeCollisions = (rect1, rect2) => {
const l1 = { left: rect1.left, top: rect1.top }
const r1 = { left: rect1.left + rect1.width, top: rect1.top + rect1.height }
const l2 = { left: rect2.left, top: rect2.top }
const r2 = { left: rect2.left + rect2.width, top: rect2.top + rect2.height }
return !(
l1.left > r2.left ||
l2.left > r1.left ||
l1.top > r2.top ||
l2.top > r1.top
)
}
/**
* Treatment of boundary conditions when changing the size of the hotzone 改变热区大小时边界条件的处理如果要避免热区重叠代码要加载这里
* @param {Object} itemInfo
* @param {Object} styleInfo
* @param {Object} container
*/
_.dealEdgeValue = (itemInfo, styleInfo, container, zones, currentIndex = zones.length - 1) => {
if (Object.prototype.hasOwnProperty.call(styleInfo, "left") && styleInfo.left < 0) {
styleInfo.left = 0
styleInfo.width = itemInfo.width + itemInfo.left
}
if (Object.prototype.hasOwnProperty.call(styleInfo, "top") && styleInfo.top < 0) {
styleInfo.top = 0
styleInfo.height = itemInfo.height + itemInfo.top
}
if (!Object.prototype.hasOwnProperty.call(styleInfo, "left") && Object.prototype.hasOwnProperty.call(styleInfo, "width")) {
if (itemInfo.left + styleInfo.width > container.width) {
styleInfo.width = container.width - itemInfo.left
}
}
if (!Object.prototype.hasOwnProperty.call(styleInfo, "top") && Object.prototype.hasOwnProperty.call(styleInfo, "height")) {
if (itemInfo.top + styleInfo.height > container.height) {
styleInfo.height = container.height - itemInfo.top
}
}
// 与其他热区重叠,则修正 检测是否发生碰撞
if (zones.length > 1) {
let currentzones = JSON.parse(JSON.stringify(zones)).map((zone) => {
return {
left: (zone.leftPer || 0) * container.width,
top: (zone.topPer || 0) * container.height,
width: (zone.widthPer || 0) * container.width,
height: (zone.heightPer || 0) * container.height
}
})
let current = { ...itemInfo, ...styleInfo }
for (let i = 0, len = currentzones.length; i < len; i++) {
if (currentIndex !== i && _.handleEgdeCollisions(currentzones[i], current)) {
return itemInfo
}
}
}
return Object.assign(itemInfo, styleInfo)
}
/**
* Handle different drag points, capital letters mean: T-topL-leftC-centerR-rightB-bottom
* @param {Object} itemInfo
* @param {Number} moveX
* @param {Number} moveY
* @return {Object}
*/
_.dealTL = (itemInfo, moveX, moveY, minLimit = _.MIN_LIMIT) => {
let styleInfo = {}
let width = itemInfo.width - moveX
let height = itemInfo.height - moveY
if (width >= Math.min(minLimit, itemInfo.width)) {
Object.assign(styleInfo, {
width,
left: itemInfo.left + moveX
})
}
if (height >= Math.min(minLimit, itemInfo.height)) {
Object.assign(styleInfo, {
height,
top: itemInfo.top + moveY
})
}
return styleInfo
}
_.dealTC = (itemInfo, moveX, moveY, minLimit = _.MIN_LIMIT) => {
let styleInfo = {}
let height = itemInfo.height - moveY
if (height >= Math.min(minLimit, itemInfo.height)) {
styleInfo = {
height,
top: itemInfo.top + moveY
}
}
return styleInfo
}
_.dealTR = (itemInfo, moveX, moveY, minLimit = _.MIN_LIMIT) => {
let styleInfo = {}
let width = itemInfo.width + moveX
let height = itemInfo.height - moveY
if (width >= Math.min(minLimit, itemInfo.width)) {
Object.assign(styleInfo, {
width
})
}
if (height >= Math.min(minLimit, itemInfo.height)) {
Object.assign(styleInfo, {
height,
top: itemInfo.top + moveY
})
}
return styleInfo
}
_.dealCL = (itemInfo, moveX, moveY, minLimit = _.MIN_LIMIT) => {
let styleInfo = {}
let width = itemInfo.width - moveX
if (width >= Math.min(minLimit, itemInfo.width)) {
Object.assign(styleInfo, {
width,
left: itemInfo.left + moveX
})
}
return styleInfo
}
_.dealCR = (itemInfo, moveX, moveY, minLimit = _.MIN_LIMIT) => {
let styleInfo = {}
let width = itemInfo.width + moveX
if (width >= Math.min(minLimit, itemInfo.width)) {
Object.assign(styleInfo, {
width
})
}
return styleInfo
}
_.dealBL = (itemInfo, moveX, moveY, minLimit = _.MIN_LIMIT) => {
let styleInfo = {}
let width = itemInfo.width - moveX
let height = itemInfo.height + moveY
if (width >= Math.min(minLimit, itemInfo.width)) {
Object.assign(styleInfo, {
width,
left: itemInfo.left + moveX
})
}
if (height >= Math.min(minLimit, itemInfo.height)) {
Object.assign(styleInfo, {
height
})
}
return styleInfo
}
_.dealBC = (itemInfo, moveX, moveY, minLimit = _.MIN_LIMIT) => {
let styleInfo = {}
let height = itemInfo.height + moveY
if (height >= Math.min(minLimit, itemInfo.height)) {
Object.assign(styleInfo, {
height
})
}
return styleInfo
}
// 添加热区时,判定鼠标释放点满足一下条件时生效
_.dealBR = (itemInfo, moveX, moveY, minLimit = _.MIN_LIMIT) => {
let styleInfo = {}
let width = itemInfo.width + moveX
let height = itemInfo.height + moveY
if (width >= Math.min(minLimit, itemInfo.width)) {
// 改变后的宽度 >= min(之前宽度,内置的最小宽度标准),即生效
Object.assign(styleInfo, {
width
})
}
if (height >= Math.min(minLimit, itemInfo.height)) {
// 改变后的高度 大于等于 Min最小高度之前高度生效
Object.assign(styleInfo, {
height
})
}
return styleInfo
}
export default _

View File

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -17,8 +17,8 @@ import { setStore, getStore, removeStore } from '@/libs/storage'
import util from '@/libs/util' import util from '@/libs/util'
import * as filters from '@/utils/filters' // global filter import * as filters from '@/utils/filters' // global filter
import liliDialog from '@/views/lili-dialog' import liliDialog from '@/components/lili-dialog'
import i18nBox from '@/views/lili-components/i18n-translate' import i18nBox from '@/components/i18n-translate'
import {md5} from '@/utils/md5.js'; import {md5} from '@/utils/md5.js';
// 打印 // 打印

View File

@ -257,13 +257,13 @@ export const otherRouter = {
path: "/floorList/renovation", path: "/floorList/renovation",
title: "编辑模板", title: "编辑模板",
name: "renovation", name: "renovation",
component: () => import("@/views/lili-floor-renovation/renovation.vue") component: () => import("@/views/page-decoration/renovation.vue")
}, },
{ {
path: "/floorList/main", path: "/floorList/main",
title: "编辑模板", title: "编辑模板",
name: "main", name: "main",
component: () => import("@/views/lili-floor-renovation/wap/main.vue") component: () => import("@/views/page-decoration/wap/main.vue")
}, },
{ {
path: "add-sms-sign", path: "add-sms-sign",

View File

@ -77,10 +77,10 @@
</template> </template>
<script> <script>
import shrinkableMenu from "./main-components/shrinkable-menu/shrinkable-menu.vue"; import shrinkableMenu from "./main-parts/shrinkable-menu/shrinkable-menu.vue";
import tagsPageOpened from "./main-components/tags-page-opened.vue"; import tagsPageOpened from "./main-parts/tags-page-opened.vue";
import messageTip from "./main-components/message-tip.vue"; import messageTip from "./main-parts/message-tip.vue";
import circleLoading from "@/views/my-components/lili/circle-loading.vue"; import circleLoading from "@/components/lili/circle-loading.vue";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import util from "@/libs/util.js"; import util from "@/libs/util.js";
import { getNoticePage, logout } from "@/api/index"; import { getNoticePage, logout } from "@/api/index";

View File

@ -25,7 +25,7 @@
</template> </template>
<script> <script>
import SetPassword from "@/views/my-components/lili/set-password"; import SetPassword from "@/components/lili/set-password";
import { changePass } from "@/api/index"; import { changePass } from "@/api/index";
export default { export default {

View File

@ -59,7 +59,7 @@ import {
import { regular } from "@/utils"; import { regular } from "@/utils";
export default { export default {
name: "customWords", name: "custom-words",
data() { data() {
return { return {
loading: true, // loading: true, //

View File

@ -43,7 +43,7 @@ import {
disableBrand, disableBrand,
delBrand, delBrand,
} from "@/api/goods"; } from "@/api/goods";
import uploadPicInput from "@/views/my-components/lili/upload-pic-input"; import uploadPicInput from "@/components/lili/upload-pic-input";
import {regular} from "@/utils"; import {regular} from "@/utils";

View File

@ -194,7 +194,7 @@ import {
getCategoryTree, getCategoryTree,
} from "@/api/goods"; } from "@/api/goods";
import uploadPicInput from "@/views/my-components/lili/upload-pic-input"; import uploadPicInput from "@/components/lili/upload-pic-input";
import { regular } from "@/utils"; import { regular } from "@/utils";
export default { export default {
name: "goods-category", name: "goods-category",

View File

@ -200,7 +200,7 @@ import { homeStatistics, hotGoods, hotShops, getNoticePage } from "@/api/index";
import * as API_Goods from "@/api/goods"; import * as API_Goods from "@/api/goods";
import { Chart } from "@antv/g2"; import { Chart } from "@antv/g2";
import * as API_Member from "@/api/member"; import * as API_Member from "@/api/member";
// import i18nBox from '@/views/lili-components/i18n-translate' // import i18nBox from '@/components/i18n-translate'
export default { export default {
name: "home", name: "home",
// components:{ // components:{

View File

@ -34,11 +34,11 @@
<script> <script>
import { login, userInfo } from "@/api/index"; import { login, userInfo } from "@/api/index";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import Header from "@/views/main-components/header"; import Header from "@/views/main-parts/header";
import Footer from "@/views/main-components/footer"; import Footer from "@/views/main-parts/footer";
import LangSwitch from "@/views/main-components/lang-switch"; import LangSwitch from "@/views/main-parts/lang-switch";
import util from "@/libs/util.js"; import util from "@/libs/util.js";
import verify from "@/views/my-components/verify"; import verify from "@/components/verify";
export default { export default {
components: { components: {

View File

@ -104,7 +104,7 @@
</template> </template>
<script> <script>
import region from "@/views/lili-components/region"; import region from "@/components/region";
import * as API_Member from "@/api/member.js"; import * as API_Member from "@/api/member.js";
import ossManage from "@/views/sys/oss-manage/ossManage"; import ossManage from "@/views/sys/oss-manage/ossManage";
import * as RegExp from "@/libs/RegExp.js"; import * as RegExp from "@/libs/RegExp.js";

View File

@ -353,10 +353,10 @@
</template> </template>
<script> <script>
import region from "@/views/lili-components/region"; import region from "@/components/region";
import * as API_Member from "@/api/member.js"; import * as API_Member from "@/api/member.js";
import ossManage from "@/views/sys/oss-manage/ossManage"; import ossManage from "@/views/sys/oss-manage/ossManage";
import liliMap from "@/views/my-components/map/index"; import liliMap from "@/components/map/index";
import * as RegExp from '@/libs/RegExp.js'; import * as RegExp from '@/libs/RegExp.js';
import * as API_Order from "@/api/order.js"; import * as API_Order from "@/api/order.js";

View File

@ -159,7 +159,7 @@
</template> </template>
<script> <script>
import region from "@/views/lili-components/region"; import region from "@/components/region";
import * as API_Member from "@/api/member.js"; import * as API_Member from "@/api/member.js";
import ossManage from "@/views/sys/oss-manage/ossManage"; import ossManage from "@/views/sys/oss-manage/ossManage";

View File

@ -49,7 +49,7 @@
</template> </template>
<script> <script>
import region from "@/views/lili-components/region"; import region from "@/components/region";
import * as API_Member from "@/api/member.js"; import * as API_Member from "@/api/member.js";
import ossManage from "@/views/sys/oss-manage/ossManage"; import ossManage from "@/views/sys/oss-manage/ossManage";

View File

@ -505,7 +505,7 @@
<script> <script>
import * as API_Order from "@/api/order"; import * as API_Order from "@/api/order";
import * as RegExp from "@/libs/RegExp.js"; import * as RegExp from "@/libs/RegExp.js";
import region from "@/views/lili-components/region"; import region from "@/components/region";
import vueQr from "vue-qr"; import vueQr from "vue-qr";
export default { export default {
name: "orderList", name: "orderList",

View File

@ -25,6 +25,7 @@ export const modelData = [
type: "carousel", type: "carousel",
name: "图片轮播", name: "图片轮播",
img: "md-image", img: "md-image",
onlyImg: true,
notTitle: false, notTitle: false,
close: true, close: true,
options: { options: {
@ -33,19 +34,22 @@ export const modelData = [
img: "https://i.loli.net/2020/12/05/fKH4CwImpbuD5Xj.png", img: "https://i.loli.net/2020/12/05/fKH4CwImpbuD5Xj.png",
url: "", url: "",
link: "", link: "",
size: "750*350" size: "750*350",
model: "link"
}, },
{ {
img: "https://i.loli.net/2020/12/05/12kleCgrSLfKoQs.png", img: "https://i.loli.net/2020/12/05/12kleCgrSLfKoQs.png",
url: "", url: "",
link: "", link: "",
size: "750*350" size: "750*350",
model: "link"
}, },
{ {
img: "https://i.loli.net/2021/05/14/ZlzcCdnpejtN9gL.png", img: "https://i.loli.net/2021/05/14/ZlzcCdnpejtN9gL.png",
url: "", url: "",
link: "", link: "",
size: "750*350" size: "750*350",
model: "link"
} }
] ]
} }
@ -55,6 +59,7 @@ export const modelData = [
name: "左一右二", name: "左一右二",
notAdd: true, notAdd: true,
drawer: true, drawer: true,
onlyImg: true,
view: "tpl_ad_list", view: "tpl_ad_list",
img: "md-image", img: "md-image",
options: { options: {
@ -63,19 +68,22 @@ export const modelData = [
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
size: "335*335" size: "335*335",
model: "link"
}, },
{ {
img: "https://i.loli.net/2021/05/14/kdB3AE9ay4c1SnN.png", img: "https://i.loli.net/2021/05/14/kdB3AE9ay4c1SnN.png",
url: "", url: "",
link: "", link: "",
size: "335*177" size: "335*177",
model: "link"
}, },
{ {
img: "https://i.loli.net/2021/05/14/FmDr9ksiXeEqYLU.png", img: "https://i.loli.net/2021/05/14/FmDr9ksiXeEqYLU.png",
url: "", url: "",
link: "", link: "",
size: "335*177" size: "335*177",
model: "link"
} }
] ]
} }
@ -97,7 +105,8 @@ export const modelData = [
bk_color: "#FF0000", bk_color: "#FF0000",
textAlign: "center", textAlign: "center",
link: "", link: "",
url: '' url: '',
model: "link"
} }
] ]
} }
@ -107,7 +116,7 @@ export const modelData = [
name: "左二右一", name: "左二右一",
notAdd: true, notAdd: true,
drawer: true, drawer: true,
onlyImg: true,
img: "md-image", img: "md-image",
options: { options: {
list: [ list: [
@ -115,19 +124,22 @@ export const modelData = [
img: "https://i.loli.net/2021/05/14/kdB3AE9ay4c1SnN.png", img: "https://i.loli.net/2021/05/14/kdB3AE9ay4c1SnN.png",
url: "", url: "",
link: "", link: "",
size: "335*177" size: "335*177",
model: "link"
}, },
{ {
img: "https://i.loli.net/2021/05/14/FmDr9ksiXeEqYLU.png", img: "https://i.loli.net/2021/05/14/FmDr9ksiXeEqYLU.png",
url: "", url: "",
link: "", link: "",
size: "335*177" size: "335*177",
model: "link"
}, },
{ {
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
size: "335*335" size: "335*335",
model: "link"
} }
] ]
} }
@ -137,7 +149,7 @@ export const modelData = [
name: "三列单行", name: "三列单行",
drawer: true, drawer: true,
notAdd: true, notAdd: true,
onlyImg: true,
img: "md-image", img: "md-image",
options: { options: {
list: [ list: [
@ -145,19 +157,22 @@ export const modelData = [
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
size: "226*226 (1:1)" size: "226*226 (1:1)",
model: "link"
}, },
{ {
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
size: "226*226 (1:1)" size: "226*226 (1:1)",
model: "link"
}, },
{ {
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
size: "226*226 (1:1)" size: "226*226 (1:1)",
model: "link"
} }
] ]
} }
@ -167,7 +182,7 @@ export const modelData = [
name: "一张大图", name: "一张大图",
drawer: true, drawer: true,
notAdd: true, notAdd: true,
onlyImg: true,
img: "md-image", img: "md-image",
options: { options: {
list: [ list: [
@ -175,7 +190,8 @@ export const modelData = [
img: "https://i.loli.net/2020/12/05/8wSNWbnqujDh6HL.png", img: "https://i.loli.net/2020/12/05/8wSNWbnqujDh6HL.png",
url: "", url: "",
link: "", link: "",
size: "750*280" size: "750*280",
model: "link"
} }
] ]
} }
@ -185,7 +201,7 @@ export const modelData = [
name: "两张横图", name: "两张横图",
drawer: true, drawer: true,
notAdd: true, notAdd: true,
onlyImg: true,
img: "md-image", img: "md-image",
options: { options: {
list: [ list: [
@ -193,13 +209,15 @@ export const modelData = [
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
size: "335*220" size: "335*220",
model: "link"
}, },
{ {
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
size: "335*220" size: "335*220",
model: "link"
} }
] ]
} }
@ -209,7 +227,7 @@ export const modelData = [
name: "上一下二", name: "上一下二",
drawer: true, drawer: true,
notAdd: true, notAdd: true,
onlyImg: true,
img: "md-image", img: "md-image",
options: { options: {
list: [ list: [
@ -217,19 +235,22 @@ export const modelData = [
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
size: "710*170" size: "710*170",
model: "link"
}, },
{ {
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
size: "335*170" size: "335*170",
model: "link"
}, },
{ {
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
size: "335*170" size: "335*170",
model: "link"
} }
] ]
} }
@ -239,7 +260,7 @@ export const modelData = [
name: "上二下一", name: "上二下一",
drawer: true, drawer: true,
notAdd: true, notAdd: true,
onlyImg: true,
img: "md-image", img: "md-image",
options: { options: {
list: [ list: [
@ -247,20 +268,22 @@ export const modelData = [
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
size: "335*170",
size: "335*170" model: "link"
}, },
{ {
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
size: "335*170" size: "335*170",
model: "link"
}, },
{ {
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
size: "710*170" size: "710*170",
model: "link"
} }
] ]
} }
@ -270,7 +293,7 @@ export const modelData = [
name: "五列单行", name: "五列单行",
drawer: true, drawer: true,
notAdd: true, notAdd: true,
onlyImg: true,
img: "md-image", img: "md-image",
options: { options: {
list: [ list: [
@ -278,31 +301,36 @@ export const modelData = [
img: "https://picsum.photos/id/127/200/200", img: "https://picsum.photos/id/127/200/200",
url: "", url: "",
link: "", link: "",
size: "75*751:1" size: "75*751:1",
model: "link"
}, },
{ {
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
size: "75*751:1" size: "75*751:1",
model: "link"
}, },
{ {
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
size: "75*751:1" size: "75*751:1",
model: "link"
}, },
{ {
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
size: "75*751:1" size: "75*751:1",
model: "link"
}, },
{ {
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
size: "75*751:1" size: "75*751:1",
model: "link"
} }
] ]
} }
@ -312,7 +340,7 @@ export const modelData = [
name: "四列单行", name: "四列单行",
drawer: true, drawer: true,
notAdd: true, notAdd: true,
onlyImg: true,
img: "md-image", img: "md-image",
options: { options: {
list: [ list: [
@ -320,25 +348,29 @@ export const modelData = [
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
size: "88*881:1" size: "88*881:1",
model: "link"
}, },
{ {
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
size: "88*881:1" size: "88*881:1",
model: "link"
}, },
{ {
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
size: "88*881:1" size: "88*881:1",
model: "link"
}, },
{ {
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
size: "88*881:1" size: "88*881:1",
model: "link"
} }
] ]
} }
@ -357,28 +389,32 @@ export const modelData = [
url: "", url: "",
link: "", link: "",
title: "文字", title: "文字",
size: "88*881:1" size: "88*881:1",
model: "link"
}, },
{ {
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
title: "文字", title: "文字",
size: "88*881:1" size: "88*881:1",
model: "link"
}, },
{ {
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
title: "文字", title: "文字",
size: "88*881:1" size: "88*881:1",
model: "link"
}, },
{ {
img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png", img: "https://i.loli.net/2021/05/14/dtNvI5UxchXn8gz.png",
url: "", url: "",
link: "", link: "",
title: "文字", title: "文字",
size: "88*881:1" size: "88*881:1",
model: "link"
} }
] ]
} }
@ -410,35 +446,40 @@ export const modelData = [
url: "", url: "",
link: "", link: "",
title: "标题", title: "标题",
size: "88*88 (1:1)" size: "88*88 (1:1)",
model: "link"
}, },
{ {
img: "https://i.loli.net/2020/12/05/JXR5K3sbIeENjqH.png", img: "https://i.loli.net/2020/12/05/JXR5K3sbIeENjqH.png",
url: "", url: "",
link: "", link: "",
title: "标题", title: "标题",
size: "88*88 (1:1)" size: "88*88 (1:1)",
model: "link"
}, },
{ {
img: "https://i.loli.net/2020/12/05/KlZfnCFIdEV231Y.png", img: "https://i.loli.net/2020/12/05/KlZfnCFIdEV231Y.png",
url: "", url: "",
link: "", link: "",
title: "标题", title: "标题",
size: "88*88 (1:1)" size: "88*88 (1:1)",
model: "link"
}, },
{ {
img: "https://i.loli.net/2020/12/05/GfmMyN2wrUVIlci.png", img: "https://i.loli.net/2020/12/05/GfmMyN2wrUVIlci.png",
url: "", url: "",
link: "", link: "",
title: "标题", title: "标题",
size: "88*88 (1:1)" size: "88*88 (1:1)",
model: "link"
}, },
{ {
img: "https://i.loli.net/2020/12/05/eznDa3iNby5FkYL.png", img: "https://i.loli.net/2020/12/05/eznDa3iNby5FkYL.png",
url: "", url: "",
link: "", link: "",
title: "标题", title: "标题",
size: "88*88 (1:1)" size: "88*88 (1:1)",
model: "link"
} }
] ]
} }
@ -529,10 +570,10 @@ export const modelData = [
options: { options: {
list: [ list: [
{ {
title: [{context: "这是一条公告"}], title: [{ context: "这是一条公告" }],
color: "#666", color: "#666",
bk_color: "#FFF", bk_color: "#FFF",
direction:"horizontal", direction: "horizontal",
img: 'http://files.sxcfx.cn/upload/20220318/71e5d27aca82aeedf647052e1e4ceaaa.png' img: 'http://files.sxcfx.cn/upload/20220318/71e5d27aca82aeedf647052e1e4ceaaa.png'
} }
] ]

View File

@ -303,7 +303,7 @@
<!-- 填写链接 --> <!-- 填写链接 -->
<div class="decorate-view" v-if="!res.notLink"> <div class="decorate-view" v-if="!res.notLink">
<div class="decorate-view-title">选择链接</div> <div class="decorate-view-title">选择模式</div>
<div <div
v-if="item.url && item.url.length != 0" v-if="item.url && item.url.length != 0"
class="decorate-view-link" class="decorate-view-link"
@ -351,13 +351,16 @@
</div> </div>
<div> <div>
<Button <RadioGroup
ghost @on-change="clickLink(item, index, res)"
size="small" v-model="item.model"
type="primary" type="button"
@click="clickLink(item, index)"
>选择链接</Button
> >
<Radio value="link" label="link">链接</Radio>
<Radio v-if="res.onlyImg" value="hotzone" label="hotzone"
>热区</Radio
>
</RadioGroup>
</div> </div>
</div> </div>
<!-- 链接地址--> <!-- 链接地址-->
@ -405,7 +408,7 @@
<script> <script>
import ossManage from "@/views/sys/oss-manage/ossManage"; import ossManage from "@/views/sys/oss-manage/ossManage";
import { modelData } from "./config"; import { modelData } from "./config";
import ways from "@/views/lili-dialog/wap.js"; // import ways from "@/components/lili-dialog/wap.js"; //
export default { export default {
components: { components: {
ossManage, ossManage,
@ -494,9 +497,11 @@ export default {
this.textAlign = val; this.textAlign = val;
}, },
// //
clickLink(val, index) { clickLink(val, index, oval) {
this.selectedLinks = val; if (val.model === "link") {
this.liliDialogFlag(false); this.selectedLinks = val;
this.liliDialogFlag(false);
}
}, },
//base64 //base64
changeFile(item, index) { changeFile(item, index) {
@ -527,10 +532,20 @@ export default {
link: "", link: "",
url: "", url: "",
size: this.res.options.list[0].size, size: this.res.options.list[0].size,
model: "link",
}; };
this.res.options.list.push(way); this.res.options.list.push(way);
} }
}, },
addHotPoint() {
let way = {
img: "https://picsum.photos/id/264/200/200",
text: "标题",
link: "",
url: "",
};
this.res.options.list[0].points.push(way);
},
// //
callbackSelected(val) { callbackSelected(val) {
this.picModelFlag = false; this.picModelFlag = false;

View File

@ -195,7 +195,7 @@ export default {
if (res.success && !exist) { if (res.success && !exist) {
this.contentData.list[newIndex].options.list.push({ this.contentData.list[newIndex].options.list.push({
data: res.result[val.promotionsType] data: res.result[val.promotionsType]
? res.result[val.promotionsType].splice(0,2) ? res.result[val.promotionsType].splice(0, 2)
: [], : [],
type: val.promotionsType, type: val.promotionsType,
title1: val.subName, title1: val.subName,

Some files were not shown because too many files have changed in this diff Show More