米字格
This commit is contained in:
parent
e306019a7d
commit
30695c234d
|
|
@ -308,7 +308,12 @@ function submit() {
|
||||||
salesNo: Local.get("userInfo").salesNo,
|
salesNo: Local.get("userInfo").salesNo,
|
||||||
};
|
};
|
||||||
Local.set("marriageInfo", params);
|
Local.set("marriageInfo", params);
|
||||||
router.push("/Signature");
|
router.push({
|
||||||
|
path: "/Signature",
|
||||||
|
query: {
|
||||||
|
name: form.receiveName || "",
|
||||||
|
},
|
||||||
|
});
|
||||||
}
|
}
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
getNumber();
|
getNumber();
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,20 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="signature" ref="signatureRef1">
|
<div class="signature" ref="signatureRef1">
|
||||||
|
<div
|
||||||
|
class="name_grid"
|
||||||
|
v-if="nameChars.length"
|
||||||
|
:style="{
|
||||||
|
'--grid-size': `${gridSize}px`,
|
||||||
|
'--grid-gap': `${gridGap}px`,
|
||||||
|
'--grid-padding': `${gridPadding}px`,
|
||||||
|
'--grid-font': `${gridFontSize}px`,
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
<div class="grid_cell" v-for="(item, index) in nameChars" :key="index">
|
||||||
|
<span class="grid_cell_text">{{ item }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<van-signature
|
<van-signature
|
||||||
class="vantSignature"
|
class="vantSignature"
|
||||||
ref="vanSignatureRef"
|
ref="vanSignatureRef"
|
||||||
|
|
@ -43,14 +57,15 @@
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, onMounted } from "vue";
|
import { ref, onMounted, computed, onUnmounted, watch } from "vue";
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter, useRoute } from "vue-router";
|
||||||
import { Local } from "@/utils/storage.js";
|
import { Local } from "@/utils/storage.js";
|
||||||
import { receiveCode } from "@/api/index.js";
|
import { receiveCode } from "@/api/index.js";
|
||||||
import toast from "@/components/toast/index1.vue";
|
import toast from "@/components/toast/index1.vue";
|
||||||
import toast1 from "@/components/toast/index2.vue";
|
import toast1 from "@/components/toast/index2.vue";
|
||||||
import submit from "@/components/toast/submit.vue";
|
import submit from "@/components/toast/submit.vue";
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
const route = useRoute();
|
||||||
const image = ref("");
|
const image = ref("");
|
||||||
const signatureRef = ref(null);
|
const signatureRef = ref(null);
|
||||||
const signatureRef1 = ref(null);
|
const signatureRef1 = ref(null);
|
||||||
|
|
@ -61,6 +76,20 @@ const submitRef = ref(null);
|
||||||
const btnType = ref(false);
|
const btnType = ref(false);
|
||||||
const canvasRef = ref();
|
const canvasRef = ref();
|
||||||
const submitType = ref(false);
|
const submitType = ref(false);
|
||||||
|
const receiveName = ref("");
|
||||||
|
const gridSize = ref(72);
|
||||||
|
const gridGap = 8;
|
||||||
|
const gridPadding = 8;
|
||||||
|
const gridFontSize = computed(() => {
|
||||||
|
const target = gridSize.value * 0.9;
|
||||||
|
return Math.max(Math.min(target, gridSize.value - 6), 28);
|
||||||
|
});
|
||||||
|
const nameChars = computed(() =>
|
||||||
|
(receiveName.value || "")
|
||||||
|
.trim()
|
||||||
|
.split("")
|
||||||
|
.filter((item) => item)
|
||||||
|
);
|
||||||
const onSubmit = (data) => {
|
const onSubmit = (data) => {
|
||||||
if (data.image) {
|
if (data.image) {
|
||||||
// image.value = data.image;
|
// image.value = data.image;
|
||||||
|
|
@ -80,6 +109,9 @@ const clearSignature = () => {
|
||||||
const closeSignature = () => {
|
const closeSignature = () => {
|
||||||
router.back();
|
router.back();
|
||||||
};
|
};
|
||||||
|
const onClear = () => {
|
||||||
|
btnType.value = false;
|
||||||
|
};
|
||||||
function setSignatureWidth() {
|
function setSignatureWidth() {
|
||||||
const signatureWidth = signatureRef1.value.clientWidth;
|
const signatureWidth = signatureRef1.value.clientWidth;
|
||||||
vanSignatureRef.value.setWidth(signatureWidth);
|
vanSignatureRef.value.setWidth(signatureWidth);
|
||||||
|
|
@ -89,9 +121,12 @@ function getSignatureHeight() {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
if (signatureRef1.value) {
|
if (signatureRef1.value) {
|
||||||
const signatureHeight = signatureRef1.value.offsetHeight;
|
const signatureHeight = signatureRef1.value.offsetHeight;
|
||||||
const canvas = vanSignatureRef.value.$el.querySelector("canvas");
|
const content = vanSignatureRef.value.$el.querySelector(
|
||||||
// const content = vanSignatureRef.value.$el.querySelector(".van-signature__content");
|
".van-signature__content"
|
||||||
content.style.height = `${signatureHeight}px`;
|
);
|
||||||
|
if (content) {
|
||||||
|
content.style.height = `${signatureHeight}px`;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}, 100);
|
}, 100);
|
||||||
}
|
}
|
||||||
|
|
@ -149,11 +184,45 @@ async function rotateToBase64File(base64, mimeType = "image/png") {
|
||||||
function cancelSignature(){
|
function cancelSignature(){
|
||||||
btnType.value = false;
|
btnType.value = false;
|
||||||
}
|
}
|
||||||
|
function updateGridSize() {
|
||||||
|
const wrapper = signatureRef1.value;
|
||||||
|
if (!wrapper) return;
|
||||||
|
const rect = wrapper.getBoundingClientRect();
|
||||||
|
const availableWidth = Math.max(rect.width - gridPadding * 2, 10);
|
||||||
|
const availableHeight = Math.max(rect.height - gridPadding * 2, 10);
|
||||||
|
const count = Math.max(nameChars.value.length, 1);
|
||||||
|
const gapTotal = gridGap * (count - 1);
|
||||||
|
const sizeByWidth = availableWidth;
|
||||||
|
const heightNeeded = sizeByWidth * count + gapTotal;
|
||||||
|
let size =
|
||||||
|
heightNeeded <= availableHeight
|
||||||
|
? sizeByWidth
|
||||||
|
: Math.max((availableHeight - gapTotal) / count, 40);
|
||||||
|
size = Math.min(size, availableWidth);
|
||||||
|
gridSize.value = size;
|
||||||
|
}
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
// 组件挂载后获取高度
|
// 组件挂载后获取高度
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
getSignatureHeight();
|
getSignatureHeight();
|
||||||
|
updateGridSize();
|
||||||
}, 100);
|
}, 100);
|
||||||
|
const queryName = route.query.name || route.query.receiveName;
|
||||||
|
if (typeof queryName === "string" && queryName.trim()) {
|
||||||
|
receiveName.value = decodeURIComponent(queryName);
|
||||||
|
} else {
|
||||||
|
const marriageInfo = Local.get("marriageInfo");
|
||||||
|
if (marriageInfo?.receiveName) {
|
||||||
|
receiveName.value = marriageInfo.receiveName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
window.addEventListener("resize", updateGridSize);
|
||||||
|
});
|
||||||
|
onUnmounted(() => {
|
||||||
|
window.removeEventListener("resize", updateGridSize);
|
||||||
|
});
|
||||||
|
watch(nameChars, () => {
|
||||||
|
updateGridSize();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
|
|
@ -205,6 +274,8 @@ onMounted(() => {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.btn_box {
|
.btn_box {
|
||||||
|
|
@ -244,4 +315,46 @@ onMounted(() => {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
top: -100000px;
|
top: -100000px;
|
||||||
}
|
}
|
||||||
|
.name_grid {
|
||||||
|
position: absolute;
|
||||||
|
inset: 0;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
gap: var(--grid-gap);
|
||||||
|
padding: var(--grid-padding);
|
||||||
|
pointer-events: none;
|
||||||
|
z-index: 1;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.grid_cell {
|
||||||
|
position: relative;
|
||||||
|
width: var(--grid-size);
|
||||||
|
height: var(--grid-size);
|
||||||
|
border: 1px solid rgba(0, 0, 0, 0.16);
|
||||||
|
border-radius: 0.08rem;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: var(--grid-font);
|
||||||
|
color: rgba(0, 0, 0, 0.32);
|
||||||
|
background:
|
||||||
|
linear-gradient(90deg, transparent calc(50% - 0.5px), rgba(0, 0, 0, 0.2) 50%, transparent calc(50% + 0.5px)),
|
||||||
|
linear-gradient(0deg, transparent calc(50% - 0.5px), rgba(0, 0, 0, 0.2) 50%, transparent calc(50% + 0.5px)),
|
||||||
|
linear-gradient(45deg, transparent calc(50% - 0.6px), rgba(0, 0, 0, 0.14) 50%, transparent calc(50% + 0.6px)),
|
||||||
|
linear-gradient(-45deg, transparent calc(50% - 0.6px), rgba(0, 0, 0, 0.14) 50%, transparent calc(50% + 0.6px));
|
||||||
|
box-shadow: inset 0 0 0 0.02rem rgba(0, 0, 0, 0.06);
|
||||||
|
}
|
||||||
|
.grid_cell_text {
|
||||||
|
display: block;
|
||||||
|
line-height: var(--grid-size);
|
||||||
|
transform: rotate(90deg);
|
||||||
|
transform-origin: center;
|
||||||
|
}
|
||||||
|
::v-deep(.van-signature__content) {
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue