diff --git a/package-lock.json b/package-lock.json index 2bc5483..9d13655 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "@webtoon/psd": "^0.4.0", "axios": "^0.21.1", "core-js": "^3.6.5", + "cropperjs": "^1.6.1", "dayjs": "^1.10.7", "element-plus": "^2.3.7", "fontfaceobserver": "^2.1.0", @@ -26,6 +27,7 @@ "moveable-helper": "^0.4.0", "nanoid": "^3.1.23", "normalize.css": "^8.0.1", + "pinia": "^2.1.7", "qr-code-styling": "^1.6.0-rc.1", "selecto": "^1.13.0", "throttle-debounce": "^3.0.1", @@ -36,6 +38,7 @@ "vuex": "^4.0.0-0" }, "devDependencies": { + "@types/cropperjs": "^1.3.0", "@types/fontfaceobserver": "^2.1.3", "@types/node": "^20.11.24", "@types/throttle-debounce": "^2.1.0", @@ -972,6 +975,16 @@ "framework-utils": "^1.1.0" } }, + "node_modules/@types/cropperjs": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/cropperjs/-/cropperjs-1.3.0.tgz", + "integrity": "sha512-U3a/z302duKpXUHfMneFjrWDDoq5n+nsJ/YeJHoTI9LXSBtSsqMUyxEJPIMAzfDawF5nuG5c9FN2gY//ZGl5PA==", + "deprecated": "This is a stub types definition. cropperjs provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "cropperjs": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -1829,6 +1842,11 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/cropperjs": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/cropperjs/-/cropperjs-1.6.1.tgz", + "integrity": "sha512-F4wsi+XkDHCOMrHMYjrTEE4QBOrsHHN5/2VsVAaRq8P7E5z7xQpT75S+f/9WikmBEailas3+yo+6zPIomW+NOA==" + }, "node_modules/cross-env": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", @@ -3282,6 +3300,56 @@ "node": ">=6" } }, + "node_modules/pinia": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.7.tgz", + "integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.3.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, "node_modules/postcss": { "version": "8.4.35", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", diff --git a/package.json b/package.json index 84195af..65b5f35 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "@webtoon/psd": "^0.4.0", "axios": "^0.21.1", "core-js": "^3.6.5", + "cropperjs": "^1.6.1", "dayjs": "^1.10.7", "element-plus": "^2.3.7", "fontfaceobserver": "^2.1.0", @@ -29,16 +30,17 @@ "moveable-helper": "^0.4.0", "nanoid": "^3.1.23", "normalize.css": "^8.0.1", + "pinia": "^2.1.7", "qr-code-styling": "^1.6.0-rc.1", "selecto": "^1.13.0", "throttle-debounce": "^3.0.1", "vite-plugin-compression": "^0.5.1", "vue": "3.4.19", "vue-router": "^4.0.0-0", - "vuedraggable": "^4.1.0", - "vuex": "^4.0.0-0" + "vuedraggable": "^4.1.0" }, "devDependencies": { + "@types/cropperjs": "^1.3.0", "@types/fontfaceobserver": "^2.1.3", "@types/node": "^20.11.24", "@types/throttle-debounce": "^2.1.0", diff --git a/src/api/material.ts b/src/api/material.ts index 8765569..7561373 100644 --- a/src/api/material.ts +++ b/src/api/material.ts @@ -73,6 +73,7 @@ export const getFontSub = (params: TGetFontSubParam, extra: TGetFontSubExtra = { type TGetImageListParams = { page?: number + pageSize?: number cate?: number } diff --git a/src/assets/data/TextIconsData.ts b/src/assets/data/TextIconsData.ts index 80d554e..98c77be 100644 --- a/src/assets/data/TextIconsData.ts +++ b/src/assets/data/TextIconsData.ts @@ -14,6 +14,7 @@ export type TStyleIconData = { tip: string value: string[] select: boolean + extraIcon?: boolean, } export const styleIconList1 = [ diff --git a/src/common/hooks/dragHelper.ts b/src/common/hooks/dragHelper.ts index 1d5e617..877a648 100644 --- a/src/common/hooks/dragHelper.ts +++ b/src/common/hooks/dragHelper.ts @@ -6,7 +6,9 @@ * @LastEditTime: 2023-11-22 18:11:15 */ -import store from '@/store' +import { useControlStore, useWidgetStore } from "@/store" + +// import store from '@/store' type TInitial = { offsetX: number @@ -71,7 +73,10 @@ export default class DragHelper { */ public start(e: MouseEvent, finallySize: number) { if (!this.cloneEl) { - store.commit('setDraging', true) + const controlStore = useControlStore() + controlStore.setDraging(true) + // store.commit('setDraging', true) + const app = window.document.getElementById('app') if (!app || !e) return app.classList.add('drag_active') // 整个鼠标全局变成抓取 @@ -134,12 +139,19 @@ export default class DragHelper { } // 结束/完成处理(动画) private finish(done = false) { + if (!this.dragging) { return } + + const controlStore = useControlStore() + const widgetStore = useWidgetStore() this.dragging = false - store.commit('setDraging', false) - store.commit('selectItem', {}) + controlStore.setDraging(false) + // store.commit('setDraging', false) + + widgetStore.setSelectItem({}) + // store.commit('selectItem', {}) if (!done) { const { pageX, offsetX, pageY, offsetY } = this.initial as TInitial diff --git a/src/common/hooks/mapGetters.ts b/src/common/hooks/mapGetters.ts index 98a3008..4423012 100644 --- a/src/common/hooks/mapGetters.ts +++ b/src/common/hooks/mapGetters.ts @@ -1,13 +1,21 @@ -import { ComputedRef, computed } from 'vue' -import { useStore } from 'vuex' +/* + * @Author: Jeremy-Yu + * @Date: 2024-02-14 14:58:48 + * @Description: 同意处理vue3 Mapgetters 已废弃 + * @LastEditors: ShawnPhang + * @LastEditTime: 2023-11-22 18:11:15 + */ -export function useSetupMapGetters(strList: T[]) { - const mapData: Partial<{[x in T]: ComputedRef}> = {} - const getters = useStore().getters +// import { ComputedRef, computed } from 'vue' +// import { useStore } from 'vuex' - strList.forEach(val => { - mapData[val] = computed(() => getters[val]) - }) +// export function useSetupMapGetters(strList: T[]) { +// const mapData: Partial<{[x in T]: ComputedRef}> = {} +// const getters = useStore().getters - return mapData as {[x in T]: ComputedRef} -} +// strList.forEach(val => { +// mapData[val] = computed(() => getters[val]) +// }) + +// return mapData as {[x in T]: ComputedRef} +// } diff --git a/src/common/methods/DesignFeatures/setComponents.ts b/src/common/methods/DesignFeatures/setComponents.ts index 4152131..19f1b7a 100644 --- a/src/common/methods/DesignFeatures/setComponents.ts +++ b/src/common/methods/DesignFeatures/setComponents.ts @@ -5,15 +5,20 @@ * @LastEditors: ShawnPhang , Jeremy Yu * @LastEditTime: 2024-03-02 11:50:00 */ -import store from '@/store' -export default async function setCompData(item: TCommonItemData[] | string) { - const group: TCommonItemData[] = typeof item === 'string' ? JSON.parse(item) : JSON.parse(JSON.stringify(item)) - let parent: Partial = {} +import { useCanvasStore, usePageStore } from '@/store' +import { TdWidgetData } from '@/store/design/widget' +// import store from '@/store' + +export default async function setCompData(item: TdWidgetData[] | string) { + const canvasStore = useCanvasStore() + const pageStore = usePageStore() + const group: TdWidgetData[] = typeof item === 'string' ? JSON.parse(item) : JSON.parse(JSON.stringify(item)) + let parent: Partial = {} Array.isArray(group) && group.forEach((element) => { element.type === 'w-group' && (parent = element) }) - const { width: screenWidth, height: screenHeight } = store.getters.dPage + const { width: screenWidth, height: screenHeight } = pageStore.dPage const { width: imgWidth = 0, height: imgHeight = 0 } = parent let ratio = 1 // 先限制在画布内,保证不超过边界 @@ -22,7 +27,7 @@ export default async function setCompData(item: TCommonItemData[] | string) { } // 根据画布缩放比例再进行一次调整 if (ratio < 1) { - ratio *= store.getters.dZoom / 100 + ratio *= canvasStore.dZoom / 100 group.forEach((element) => { element.fontSize && (element.fontSize *= ratio) element.width *= ratio diff --git a/src/common/methods/DesignFeatures/setImage.ts b/src/common/methods/DesignFeatures/setImage.ts index c5ee7f4..4a89f23 100644 --- a/src/common/methods/DesignFeatures/setImage.ts +++ b/src/common/methods/DesignFeatures/setImage.ts @@ -5,8 +5,9 @@ * @LastEditors: ShawnPhang , Jeremy Yu * @LastEditTime: 2024-03-01 20:55:51 */ -import store from '@/store' +// import store from '@/store' import { getImage } from '../getImgDetail' +import { useCanvasStore, usePageStore } from '@/store' export type TItem2DataParam = { id?: string | number @@ -24,8 +25,10 @@ export type TItem2DataResult = { } export default async function setItem2Data(item: TItem2DataParam): Promise> { + const canvasStore = useCanvasStore() + const pageStore = usePageStore() const cloneItem = JSON.parse(JSON.stringify(item)) - const { width: screenWidth, height: screenHeight } = store.getters.dPage + const { width: screenWidth, height: screenHeight } = pageStore.dPage let { width: imgWidth, height: imgHeight } = item if (!imgWidth || !imgHeight) { const actual = await getImage(item.url) @@ -39,11 +42,11 @@ export default async function setItem2Data(item: TItem2DataParam): Promise) { let setting = data @@ -35,7 +34,7 @@ export default async function(type: string, item: TCommonItemData, data: Record< setting.mask = item.value.url } if (type === 'svg') { - setting = JSON.parse(JSON.stringify(wSvg.setting)) + setting = JSON.parse(JSON.stringify(wSvgSetting)) const img = await setImageData(item.value) setting.width = img.width setting.height = img.height // parseInt(100 / item.value.ratio, 10) diff --git a/src/common/methods/addMouseWheel.ts b/src/common/methods/addMouseWheel.ts index 6be1dae..9767ed7 100644 --- a/src/common/methods/addMouseWheel.ts +++ b/src/common/methods/addMouseWheel.ts @@ -5,7 +5,8 @@ * @LastEditors: ShawnPhang , Jeremy Yu * @LastEditTime: 2024-03-02 11:50:00 */ -import store from '@/store' +import { useControlStore } from '@/store' +// import store from '@/store' type TAddEventCb = (e: Event) => void type TAddEventObj = { @@ -14,6 +15,7 @@ type TAddEventObj = { export default function(el: HTMLElement | string, cb: Function, altLimit: boolean = true) { const box = typeof el === 'string' ? document.getElementById(el) : el + const controlStore = useControlStore() if (!box) return; addEvent(box, 'mousewheel', (e: any) => { const ev = e || window.event @@ -23,7 +25,7 @@ export default function(el: HTMLElement | string, cb: Function, altLimit: boolea // } else { // console.log('鼠标滚轮向上++++++++++') // } - if ((altLimit && store.getters.dAltDown) || !altLimit) { + if ((altLimit && controlStore.dAltDown) || !altLimit) { ev.preventDefault() cb(down) } diff --git a/src/components/business/cropper/CropImage/CropImage.vue b/src/components/business/cropper/CropImage/CropImage.vue index de50847..003e067 100644 --- a/src/components/business/cropper/CropImage/CropImage.vue +++ b/src/components/business/cropper/CropImage/CropImage.vue @@ -23,19 +23,21 @@ import api from '@/api' import { ElDialog } from 'element-plus' import { ref, defineComponent, toRefs, reactive, nextTick } from 'vue' -import { useStore } from 'vuex' +// import { useStore } from 'vuex' import 'cropperjs/dist/cropper.css' import Cropper from 'cropperjs' +import { useControlStore } from '@/store' export default defineComponent({ components: { ElDialog }, emits: ['done'], setup(props, context) { - const store = useStore() + // const store = useStore() const state = reactive({ loading: false, url: '', }) + const controlStore = useControlStore() const dialogVisible = ref(false) const imgBox = ref() let cropData: any = null @@ -49,7 +51,8 @@ export default defineComponent({ item.rawImg = item.rawImg ? item.rawImg : item.imgUrl cropData = data state.url = item.rawImg - store.commit('setShowMoveable', false) + // store.commit('setShowMoveable', false) + controlStore.setShowMoveable(false) dialogVisible.value = true await nextTick() setEdit() @@ -86,7 +89,8 @@ export default defineComponent({ } const cancel = () => { - store.commit('setShowMoveable', true) + // store.commit('setShowMoveable', true) + controlStore.setShowMoveable(true) dialogVisible.value = false state.url = '' cropData = null diff --git a/src/components/business/cropper/CropImage/index.vue b/src/components/business/cropper/CropImage/index.vue index c05c8dc..ded8d44 100644 --- a/src/components/business/cropper/CropImage/index.vue +++ b/src/components/business/cropper/CropImage/index.vue @@ -23,9 +23,10 @@ import api from '@/api' import { ElDialog } from 'element-plus' import { ref, reactive, nextTick, toRefs } from 'vue' -import { useStore } from 'vuex' +// import { useStore } from 'vuex' import 'cropperjs/dist/cropper.css' import Cropper from 'cropperjs' +import { useControlStore } from '@/store' type TDoneParams = { newImg: string, @@ -40,7 +41,8 @@ type TOpenItem = { imgUrl: string } -const store = useStore() +// const store = useStore() +const controlStore = useControlStore() const state = reactive({ loading: false, url: '', @@ -61,7 +63,8 @@ const open = async (item: TOpenItem, data: Cropper.Data) => { item.rawImg = item.rawImg ? item.rawImg : item.imgUrl cropData = data state.url = item.rawImg - store.commit('setShowMoveable', false) + // store.commit('setShowMoveable', false) + controlStore.setShowMoveable(false) dialogVisible.value = true await nextTick() setEdit() @@ -101,7 +104,8 @@ const ok = () => { } const cancel = () => { - store.commit('setShowMoveable', true) + // store.commit('setShowMoveable', true) + controlStore.setShowMoveable(true) dialogVisible.value = false state.url = '' cropData = null diff --git a/src/components/business/image-cutout/ImageCutout/index.vue b/src/components/business/image-cutout/ImageCutout/index.vue index 880020f..dc5d663 100644 --- a/src/components/business/image-cutout/ImageCutout/index.vue +++ b/src/components/business/image-cutout/ImageCutout/index.vue @@ -41,13 +41,14 @@ + \ No newline at end of file diff --git a/src/components/business/moveable/Selecto.ts b/src/components/business/moveable/Selecto.ts index bad2aea..4d4e40d 100644 --- a/src/components/business/moveable/Selecto.ts +++ b/src/components/business/moveable/Selecto.ts @@ -1,8 +1,10 @@ import Selecto from 'selecto' -import { getElementInfo } from 'moveable' -import store from '@/store' +import Moveable, { getElementInfo } from 'moveable' +// import store from '@/store' +import { useWidgetStore } from '@/store' -export default function(moveable: any) { +export default function(moveable: Moveable) { + const widgetStore = useWidgetStore() const selecto = new Selecto({ container: document.getElementById('page-design'), selectableTargets: ['.layer'], @@ -23,16 +25,22 @@ export default function(moveable: any) { e.added.forEach((el) => { if (!Array.from(el.classList).includes('layer-lock') && !el.hasAttribute('child')) { el.classList.add('widget-selected') - store.dispatch('selectWidgetsInOut', { - uuid: el.getAttribute('data-uuid'), + widgetStore.selectWidgetsInOut({ + uuid: el.getAttribute('data-uuid') || "", }) + // store.dispatch('selectWidgetsInOut', { + // uuid: el.getAttribute('data-uuid'), + // }) } }) e.removed.forEach((el) => { el.classList.remove('widget-selected') - store.dispatch('selectWidgetsInOut', { - uuid: el.getAttribute('data-uuid'), + widgetStore.selectWidgetsInOut({ + uuid: el.getAttribute('data-uuid') || "", }) + // store.dispatch('selectWidgetsInOut', { + // uuid: el.getAttribute('data-uuid'), + // }) }) moveable.renderDirections = [] // ['nw', 'ne', 'sw', 'se'] // [] moveable.rotatable = false diff --git a/src/components/business/picture-selector/index.vue b/src/components/business/picture-selector/index.vue index 3775c8f..557675d 100644 --- a/src/components/business/picture-selector/index.vue +++ b/src/components/business/picture-selector/index.vue @@ -32,10 +32,11 @@ diff --git a/src/components/modules/panel/wrap/BgImgListWrap.vue b/src/components/modules/panel/wrap/BgImgListWrap.vue index 59f8fea..a71f79f 100644 --- a/src/components/modules/panel/wrap/BgImgListWrap.vue +++ b/src/components/modules/panel/wrap/BgImgListWrap.vue @@ -25,9 +25,10 @@