refactor: 微信小程序改造
This commit is contained in:
parent
c5d956d3a8
commit
8b1bc80d4b
|
|
@ -123,6 +123,7 @@ export default defineManifestConfig({
|
||||||
// 是否启用 ES6 转 ES5
|
// 是否启用 ES6 转 ES5
|
||||||
es6: true,
|
es6: true,
|
||||||
minified: true,
|
minified: true,
|
||||||
|
swc: true,
|
||||||
},
|
},
|
||||||
optimization: {
|
optimization: {
|
||||||
subPackages: true,
|
subPackages: true,
|
||||||
|
|
|
||||||
|
|
@ -247,113 +247,6 @@ function toggleSpecialMark(type: 'excellent' | 'typical' | 'problem') {
|
||||||
emit('toggle-special-mark', type)
|
emit('toggle-special-mark', type)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新画笔颜色
|
|
||||||
*/
|
|
||||||
function updatePenColor(color: string | null) {
|
|
||||||
settings.value.penColor = color || '#ff0000'
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新画笔粗细
|
|
||||||
*/
|
|
||||||
function updatePenWidth(width: number | number[]) {
|
|
||||||
settings.value.penWidth = Array.isArray(width) ? width[0] : width
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新文字大小
|
|
||||||
*/
|
|
||||||
function updateTextSize(size: number | undefined) {
|
|
||||||
if (size !== undefined) {
|
|
||||||
settings.value.textSize = size
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新文字颜色
|
|
||||||
*/
|
|
||||||
function updateTextColor(color: string | null) {
|
|
||||||
settings.value.textColor = color || '#000000'
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 处理鼠标按下开始拖动
|
|
||||||
*/
|
|
||||||
function handleMouseDown(event: MouseEvent) {
|
|
||||||
// 如果已收起,不允许拖动
|
|
||||||
if (isCollapsed.value) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// 如果点击的是按钮或其他交互元素,不触发拖动
|
|
||||||
const target = event.target as HTMLElement
|
|
||||||
if (
|
|
||||||
target.tagName === 'BUTTON'
|
|
||||||
|| target.closest('button')
|
|
||||||
|| target.tagName === 'INPUT'
|
|
||||||
|| target.closest('input')
|
|
||||||
) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
isDragging.value = true
|
|
||||||
dragState.value = {
|
|
||||||
startX: event.clientX,
|
|
||||||
startY: event.clientY,
|
|
||||||
startPositionX: position.value.x,
|
|
||||||
startPositionY: position.value.y,
|
|
||||||
}
|
|
||||||
|
|
||||||
// 添加全局鼠标事件监听
|
|
||||||
document.addEventListener('mousemove', handleMouseMove)
|
|
||||||
document.addEventListener('mouseup', handleMouseUp)
|
|
||||||
|
|
||||||
// 防止选中文本
|
|
||||||
event.preventDefault()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 处理鼠标移动进行拖动
|
|
||||||
*/
|
|
||||||
function handleMouseMove(event: MouseEvent) {
|
|
||||||
if (!isDragging.value)
|
|
||||||
return
|
|
||||||
|
|
||||||
const deltaX = event.clientX - dragState.value.startX
|
|
||||||
const deltaY = event.clientY - dragState.value.startY
|
|
||||||
|
|
||||||
// 计算新位置
|
|
||||||
let newX = dragState.value.startPositionX + deltaX
|
|
||||||
let newY = dragState.value.startPositionY - deltaY // bottom 坐标系是相反的
|
|
||||||
|
|
||||||
// 获取工具栏尺寸和窗口尺寸,确保工具栏不会超出屏幕边界
|
|
||||||
if (toolbarRef.value) {
|
|
||||||
const rect = toolbarRef.value.getBoundingClientRect()
|
|
||||||
const windowWidth = window.innerWidth
|
|
||||||
const windowHeight = window.innerHeight
|
|
||||||
|
|
||||||
// 限制左右边界
|
|
||||||
newX = Math.max(0, Math.min(newX, windowWidth - rect.width))
|
|
||||||
// 限制上下边界 (注意 bottom 坐标系)
|
|
||||||
newY = Math.max(0, Math.min(newY, windowHeight - rect.height))
|
|
||||||
}
|
|
||||||
|
|
||||||
// 更新位置
|
|
||||||
position.value = { x: newX, y: newY }
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 处理鼠标松开结束拖动
|
|
||||||
*/
|
|
||||||
function handleMouseUp() {
|
|
||||||
isDragging.value = false
|
|
||||||
|
|
||||||
// 移除全局鼠标事件监听
|
|
||||||
document.removeEventListener('mousemove', handleMouseMove)
|
|
||||||
document.removeEventListener('mouseup', handleMouseUp)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 切换收起/展开状态
|
* 切换收起/展开状态
|
||||||
*/
|
*/
|
||||||
|
|
@ -361,74 +254,6 @@ function toggleCollapse() {
|
||||||
isCollapsed.value = !isCollapsed.value
|
isCollapsed.value = !isCollapsed.value
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 键盘快捷键处理
|
|
||||||
*/
|
|
||||||
function handleKeydown(event: KeyboardEvent) {
|
|
||||||
// 防止在输入框中触发
|
|
||||||
const target = event.target as HTMLElement
|
|
||||||
if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (event.code) {
|
|
||||||
case 'KeyV':
|
|
||||||
event.preventDefault()
|
|
||||||
switchTool(MarkingTool.SELECT)
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'KeyT':
|
|
||||||
event.preventDefault()
|
|
||||||
switchTool(MarkingTool.TEXT)
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'KeyP':
|
|
||||||
event.preventDefault()
|
|
||||||
switchTool(MarkingTool.PEN)
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'KeyR':
|
|
||||||
event.preventDefault()
|
|
||||||
switchTool(MarkingTool.RECT)
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'KeyE':
|
|
||||||
event.preventDefault()
|
|
||||||
switchTool(MarkingTool.ERASER)
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'KeyZ':
|
|
||||||
if (event.ctrlKey || event.metaKey) {
|
|
||||||
event.preventDefault()
|
|
||||||
if (event.shiftKey) {
|
|
||||||
handleRedo()
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
handleUndo()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'Delete':
|
|
||||||
case 'Backspace':
|
|
||||||
event.preventDefault()
|
|
||||||
handleClearAll()
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 挂载时绑定键盘事件
|
|
||||||
onMounted(() => {
|
|
||||||
document.addEventListener('keydown', handleKeydown)
|
|
||||||
})
|
|
||||||
|
|
||||||
// 卸载时移除事件监听
|
|
||||||
onUnmounted(() => {
|
|
||||||
document.removeEventListener('keydown', handleKeydown)
|
|
||||||
document.removeEventListener('mousemove', handleMouseMove)
|
|
||||||
document.removeEventListener('mouseup', handleMouseUp)
|
|
||||||
})
|
|
||||||
|
|
||||||
// 暴露点击处理方法给父组件
|
// 暴露点击处理方法给父组件
|
||||||
defineExpose({
|
defineExpose({
|
||||||
handleImageClick,
|
handleImageClick,
|
||||||
|
|
@ -447,7 +272,6 @@ defineExpose({
|
||||||
'backdrop-saturate-150': !isCollapsed,
|
'backdrop-saturate-150': !isCollapsed,
|
||||||
},
|
},
|
||||||
]"
|
]"
|
||||||
@mousedown="handleMouseDown"
|
|
||||||
>
|
>
|
||||||
<!-- 收起按钮 -->
|
<!-- 收起按钮 -->
|
||||||
<div
|
<div
|
||||||
|
|
|
||||||
|
|
@ -130,9 +130,9 @@ export function getEnvBaseUrl() {
|
||||||
let baseUrl = import.meta.env.VITE_SERVER_BASEURL
|
let baseUrl = import.meta.env.VITE_SERVER_BASEURL
|
||||||
|
|
||||||
// # 有些同学可能需要在微信小程序里面根据 develop、trial、release 分别设置上传地址,参考代码如下。
|
// # 有些同学可能需要在微信小程序里面根据 develop、trial、release 分别设置上传地址,参考代码如下。
|
||||||
const VITE_SERVER_BASEURL__WEIXIN_DEVELOP = 'https://ukw0y1.laf.run'
|
const VITE_SERVER_BASEURL__WEIXIN_DEVELOP = 'http://mapi.xianglexue.com/api/v1'
|
||||||
const VITE_SERVER_BASEURL__WEIXIN_TRIAL = 'https://ukw0y1.laf.run'
|
const VITE_SERVER_BASEURL__WEIXIN_TRIAL = 'http://mapi.xianglexue.com/api/v1'
|
||||||
const VITE_SERVER_BASEURL__WEIXIN_RELEASE = 'https://ukw0y1.laf.run'
|
const VITE_SERVER_BASEURL__WEIXIN_RELEASE = 'http://mapi.xianglexue.com/api/v1'
|
||||||
|
|
||||||
// 微信小程序端环境区分
|
// 微信小程序端环境区分
|
||||||
if (isMpWeixin) {
|
if (isMpWeixin) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue