91 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Vue
		
	
	
		
		
			
		
	
	
			91 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Vue
		
	
	
|  | <template> | ||
|  |   <div> | ||
|  |     <div> | ||
|  |       <el-button type="primary" @click="fnOpen">手写签字</el-button> | ||
|  |     </div> | ||
|  |     <div v-if="modelValue" style="border: 1px dashed #ccc" class="mt-10"> | ||
|  |       <img :src="modelValue" alt="" style="width: 100%" /> | ||
|  |     </div> | ||
|  |   </div> | ||
|  |   <el-dialog v-model="visible" title="签字"> | ||
|  |     <vue-esign | ||
|  |       ref="signRef" | ||
|  |       :width="800" | ||
|  |       :height="300" | ||
|  |       :is-crop="false" | ||
|  |       :is-clear-bg-color="false" | ||
|  |       :line-width="6" | ||
|  |       line-color="#000" | ||
|  |       bg-color="#fff" | ||
|  |     /> | ||
|  |     <template #footer> | ||
|  |       <el-button @click="fnReset">重签</el-button> | ||
|  |       <el-button type="primary" @click="fnGenerate">确定</el-button> | ||
|  |       <el-button @click="fnClose">关闭</el-button> | ||
|  |     </template> | ||
|  |   </el-dialog> | ||
|  | </template> | ||
|  | 
 | ||
|  | <script setup> | ||
|  | import { useTemplateRef } from "vue"; | ||
|  | import { ElDialog, ElButton, ElMessage } from "element-plus"; | ||
|  | import "element-plus/es/components/dialog/style/css"; | ||
|  | import "element-plus/es/components/button/style/css"; | ||
|  | import VueEsign from "vue-esign"; | ||
|  | 
 | ||
|  | defineOptions({ | ||
|  |   name: "AppSign", | ||
|  | }); | ||
|  | const emits = defineEmits(["confirm"]); | ||
|  | const modelValue = defineModel({ type: String, default: "" }); | ||
|  | const visible = defineModel("visible", { type: Boolean, default: false }); | ||
|  | const signRef = useTemplateRef("signRef"); | ||
|  | const fnOpen = () => { | ||
|  |   visible.value = true; | ||
|  | }; | ||
|  | const fnReset = () => { | ||
|  |   signRef.value.reset(); | ||
|  | }; | ||
|  | const fnGenerate = () => { | ||
|  |   signRef.value | ||
|  |     .generate() | ||
|  |     .then((res) => { | ||
|  |       modelValue.value = res; | ||
|  |       emits("confirm", res); | ||
|  |       fnClose(); | ||
|  |     }) | ||
|  |     .catch(() => { | ||
|  |       ElMessage.warning("请签字!"); | ||
|  |     }); | ||
|  | }; | ||
|  | const fnClose = () => { | ||
|  |   fnReset(); | ||
|  |   visible.value = false; | ||
|  | }; | ||
|  | </script> | ||
|  | 
 | ||
|  | <style scoped lang="scss"> | ||
|  | .title { | ||
|  |   display: flex; | ||
|  |   justify-content: space-between; | ||
|  | 
 | ||
|  |   div { | ||
|  |     flex-basis: 33.333%; | ||
|  | 
 | ||
|  |     &:nth-child(2) { | ||
|  |       text-align: center; | ||
|  |     } | ||
|  | 
 | ||
|  |     &:nth-child(3) { | ||
|  |       padding-right: 30px; | ||
|  |       text-align: right; | ||
|  |     } | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | canvas { | ||
|  |   border: 1px dashed #7e7d7d; | ||
|  |   margin: auto; | ||
|  | } | ||
|  | </style> |