alipay-emulator/pages/other/splash/splash.vue

604 lines
16 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="container">
<!-- 自定义头部导航栏 -->
<ZdyNavbar @right-click="edit" isRightButton rightButtonText="编辑" :title="data.navbar.title"
:bgColor="data.navbar.bgColor" :isBack="true" />
<image :src="data.code" mode="widthFix" style="width: 100vw;" @click="previewImage"></image>
<view class="button-container">
<button class="btn-save-image" @click="saveImage">保存图片</button>
</view>
<l-painter isCanvasToTempFilePath @success="data.code = $event" hidden
:css="`width:${data.width}px;height:${data.width / 4 * 3}px;`">
<l-painter-view
:css="`position: relative;width:${data.width}px;height:${data.width / 4 * 3}px;background-image: url('/static/image/other/gzd.png');`">
<!-- 头部年月 -->
<l-painter-view :css="`position: absolute;left:480px;top:336px;`">
<l-painter-text :css="data.textCssTime" :text="data.form.year" />
</l-painter-view>
<l-painter-view :css="`position: absolute;left:544px;top:336px;`">
<l-painter-text :css="data.textCssTime" :text="data.form.month" />
</l-painter-view>
<!-- 岗位 -->
<l-painter-view :css="`position: absolute;left:158px;top:445px;`">
<l-painter-text :css="data.textCss" :text="data.form.work" />
</l-painter-view>
<!-- 姓名 -->
<l-painter-view :css="`position: absolute;left:213px;top:445px;`">
<l-painter-text :css="data.textCss" :text="data.form.name" />
</l-painter-view>
<!-- 基本工资 -->
<l-painter-view :css="`position: absolute;left:268px;top:445px;`">
<l-painter-text :css="data.textCssMoney" :text="data.form.money1 + ''" />
</l-painter-view>
<!-- 绩效工资 -->
<l-painter-view :css="`position: absolute;left:314px;top:445px;`">
<l-painter-text :css="data.textCssMoney" :text="data.form.money2 + ''" />
</l-painter-view>
<!-- 全勤工资 -->
<l-painter-view :css="`position: absolute;left:358px;top:445px;`">
<l-painter-text :css="data.textCssMoney" :text="data.form.money3 + ''" />
</l-painter-view>
<!-- 其他奖金 -->
<l-painter-view :css="`position: absolute;left:404px;top:445px;`">
<l-painter-text :css="data.textCssMoney" :text="data.form.money4 + ''" />
</l-painter-view>
<!-- 合计 -->
<l-painter-view :css="`position: absolute;left:454px;top:445px;`">
<l-painter-text :css="data.textCssMoney" :text="data.form.money5 + ''" />
</l-painter-view>
<!-- 社保缴纳 -->
<l-painter-view :css="`position: absolute;left:504px;top:445px;`">
<l-painter-text :css="data.textCssMoney" :text="data.form.money6 + ''" />
</l-painter-view>
<!-- 个税缴纳 -->
<l-painter-view :css="`position: absolute;left:554px;top:445px;`">
<l-painter-text :css="data.textCssMoney" :text="data.form.money7 + ''" />
</l-painter-view>
<!-- 考勤扣款 -->
<l-painter-view :css="`position: absolute;left:598px;top:445px;`">
<l-painter-text :css="data.textCssMoney" :text="data.form.money8 + ''" />
</l-painter-view>
<!-- 其他扣款 -->
<l-painter-view :css="`position: absolute;left:640px;top:445px;`">
<l-painter-text :css="data.textCssMoney" :text="data.form.money9 + ''" />
</l-painter-view>
<!-- 合计 -->
<l-painter-view :css="`position: absolute;left:688px;top:445px;`">
<l-painter-text :css="data.textCss" :text="data.form.money10 + ''" />
</l-painter-view>
<!-- 实发工资 -->
<l-painter-view :css="`position: absolute;left:734px;top:445px;`">
<l-painter-text :css="data.textCss" :text="data.form.money11 + ''" />
</l-painter-view>
<l-painter-view v-if="$isVip()" :css="`position: absolute;right:20px;bottom:20px;`">
<l-painter-image src="/static/image/other/shuiying.png" css="width: 170rpx; height: 50rpx;" />
</l-painter-view>
</l-painter-view>
</l-painter>
<!-- 编辑弹窗 -->
<view v-if="showEditPopup" class="popup-overlay">
<view class="popup-content">
<view class="popup-header">
<text class="popup-title">编辑工资条</text>
<text class="popup-close" @click="closeEditPopup">×</text>
</view>
<view class="popup-body">
<view class="form-row">
<text class="form-label">岗位:</text>
<input class="form-input" v-model="editForm.work" type="text" />
</view>
<view class="form-row">
<text class="form-label">姓名:</text>
<input class="form-input" v-model="editForm.name" type="text" />
</view>
<view class="form-row">
<text class="form-label">年月:</text>
<input class="form-input" v-model="editForm.year" type="number" style="width: 100px;" />
<text class="form-separator">-</text>
<input class="form-input" v-model="editForm.month" type="number" style="width: 100px;" />
</view>
<view class="form-section">
<text class="section-title">收入部分</text>
<view class="form-row">
<text class="form-label">基本工资:</text>
<input class="form-input" v-model.number="editForm.money1" type="number"
@input="calculateValues" />
</view>
<view class="form-row">
<text class="form-label">绩效工资:</text>
<input class="form-input" v-model.number="editForm.money2" type="number"
@input="calculateValues" />
</view>
<view class="form-row">
<text class="form-label">全勤工资:</text>
<input class="form-input" v-model.number="editForm.money3" type="number"
@input="calculateValues" />
</view>
<view class="form-row">
<text class="form-label">其他奖金:</text>
<input class="form-input" v-model.number="editForm.money4" type="number"
@input="calculateValues" />
</view>
<view class="form-row form-total">
<text class="form-label">合计:</text>
<input class="form-input form-total-input" v-model.number="editForm.money5" type="number"
disabled />
</view>
</view>
<view class="form-section">
<text class="section-title">扣款部分</text>
<view class="form-row">
<text class="form-label">社保缴纳:</text>
<input class="form-input" v-model.number="editForm.money6" type="number"
@input="calculateValues" />
</view>
<view class="form-row">
<text class="form-label">个税缴纳:</text>
<input class="form-input" v-model.number="editForm.money7" type="number"
@input="calculateValues" />
</view>
<view class="form-row">
<text class="form-label">考勤扣款:</text>
<input class="form-input" v-model.number="editForm.money8" type="number"
@input="calculateValues" />
</view>
<view class="form-row">
<text class="form-label">其他扣款:</text>
<input class="form-input" v-model.number="editForm.money9" type="number"
@input="calculateValues" />
</view>
<view class="form-row form-total">
<text class="form-label">合计:</text>
<input class="form-input form-total-input" v-model.number="editForm.money10" type="number"
disabled />
</view>
</view>
<view class="form-row form-total">
<text class="form-label">实发工资:</text>
<input class="form-input form-total-input" v-model.number="editForm.money11" type="number"
disabled />
</view>
</view>
<view class="popup-footer">
<button class="btn-cancel" @click="closeEditPopup">取消</button>
<button class="btn-save" @click="saveEditForm">保存</button>
</view>
</view>
</view>
</view>
</template>
<script setup>
// 自定义头部
import ZdyNavbar from "@/components/nav-bar/nav-bar.vue"
import {
ref,
reactive,
watch,
nextTick,
getCurrentInstance
} from "vue";
import {
onLoad,
onShow,
onReady,
onPullDownRefresh,
onReachBottom
} from "@dcloudio/uni-app";
const {
appContext,
proxy
} = getCurrentInstance();
const data = reactive({
navbar: {
title: "工资条",
bgColor: '#EDEDED',
},
width: 375,
height: 495,
code: '',
form: {
work: "销售",
name: '小明',
money1: 5000,
money2: 1000,
money3: 1000,
money4: 1000,
money5: 8000,
money6: 512,
money7: 12,
money8: 0,
money9: 0,
money10: 524,
money11: 7476,
year: 2026,
month: 1,
},
textCss: ' letter-spacing: 10px;font-family: "SimHei", "Microsoft YaHei", sans-serif;width:50px;text-align: center;color:#505156;transform: scale(0.4);font-size:26rpx;font-weight: bold; mix-blend-mode: overlay;',
textCssMoney: 'font-family: "SimHei", "Microsoft YaHei", sans-serif;width:50px;text-align: center;color:#505156;transform: scale(0.4);font-size:12px;font-weight: bold; mix-blend-mode: overlay;',
textCssTime: 'font-family: "SimHei", "Microsoft YaHei", sans-serif;width:50px;text-align: center;color:#505156;transform: scale(0.4);font-size:18px;font-weight: bold; mix-blend-mode: overlay;'
})
// 弹窗相关
const showEditPopup = ref(false);
const editForm = ref({});
// 打开编辑弹窗
function edit() {
console.log(data.form)
// 复制当前表单数据到编辑表单
editForm.value = JSON.parse(JSON.stringify(data.form));
// 计算初始值
calculateValues();
// 显示弹窗
showEditPopup.value = true;
}
// 关闭编辑弹窗
function closeEditPopup() {
showEditPopup.value = false;
}
// 保存编辑表单
function saveEditForm() {
// 将编辑后的数据复制回原始表单
data.form = JSON.parse(JSON.stringify(editForm.value));
// 关闭弹窗
showEditPopup.value = false;
}
// 计算值
function calculateValues() {
// 计算收入合计 (money5 = money1 + money2 + money3 + money4)
editForm.value.money5 = (editForm.value.money1 || 0) + (editForm.value.money2 || 0) + (editForm.value.money3 ||
0) + (editForm.value.money4 || 0);
// 计算扣款合计 (money10 = money6 + money7 + money8 + money9)
editForm.value.money10 = (editForm.value.money6 || 0) + (editForm.value.money7 || 0) + (editForm.value.money8 ||
0) + (editForm.value.money9 || 0);
// 计算实发工资 (money11 = money5 - money10)
editForm.value.money11 = editForm.value.money5 - editForm.value.money10;
}
// 预览图片
function previewImage() {
if (data.code) {
uni.previewImage({
urls: [data.code],
current: 0
});
}
}
// 保存图片
function saveImage() {
if (data.code) {
console.log(data.code)
uni.showLoading({
title: '保存中...'
});
try {
// 检查是否为base64格式
if (data.code.startsWith('data:image')) {
// 处理base64格式图片
console.log('开始处理base64图片');
uni.base64ToTempFile({
base64: data.code.split(',')[1], // 去除base64前缀
success: (res) => {
console.log('base64转换成功', res);
if (res.tempFilePath) {
uni.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success: () => {
console.log('保存图片成功');
uni.hideLoading();
uni.showToast({
title: '保存成功',
icon: 'success'
});
},
fail: (err) => {
console.log('保存图片失败', err);
uni.hideLoading();
uni.showToast({
title: '保存失败',
icon: 'none'
});
}
});
} else {
console.log('base64转换失败无临时文件路径');
uni.hideLoading();
uni.showToast({
title: '转换失败',
icon: 'none'
});
}
},
fail: (err) => {
console.log('base64转换失败', err);
uni.hideLoading();
uni.showToast({
title: '转换失败',
icon: 'none'
});
}
});
} else if (data.code.startsWith('_') || data.code.includes('temp') || data.code.includes('cache') || data
.code.includes('_doc') || data.code.includes('_tmp')) {
// 处理本地临时文件
console.log('开始处理本地临时文件');
uni.saveImageToPhotosAlbum({
filePath: data.code,
success: () => {
console.log('保存本地文件成功');
uni.hideLoading();
uni.showToast({
title: '保存成功',
icon: 'success'
});
},
fail: (err) => {
console.log('保存本地文件失败', err);
uni.hideLoading();
uni.showToast({
title: '保存失败',
icon: 'none'
});
}
});
} else {
// 处理网络图片
console.log('开始处理网络图片');
uni.downloadFile({
url: data.code,
success: (res) => {
console.log('下载图片成功', res);
if (res.statusCode === 200 && res.tempFilePath) {
uni.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success: () => {
console.log('保存图片成功');
uni.hideLoading();
uni.showToast({
title: '保存成功',
icon: 'success'
});
},
fail: (err) => {
console.log('保存图片失败', err);
uni.hideLoading();
uni.showToast({
title: '保存失败',
icon: 'none'
});
}
});
} else {
console.log('下载图片失败,状态码:', res.statusCode);
uni.hideLoading();
uni.showToast({
title: '下载失败',
icon: 'none'
});
}
},
fail: (err) => {
console.log('下载图片失败', err);
uni.hideLoading();
uni.showToast({
title: '下载失败',
icon: 'none'
});
}
});
}
} catch (error) {
console.log('保存图片异常', error);
uni.hideLoading();
uni.showToast({
title: '保存失败',
icon: 'none'
});
}
} else {
uni.showToast({
title: '暂无图片可保存',
icon: 'none'
});
}
}
onLoad((option) => { })
onReady(() => {
})
onShow(() => { })
onPullDownRefresh(() => {
setTimeout(() => {
uni.stopPullDownRefresh();
}, 1000);
})
onReachBottom(() => {
})
</script>
<style lang="scss" scoped>
* {
box-sizing: content-box;
}
.aadadad {
text-align: center;
}
.heiti {
font-family: "SimHei", "Microsoft YaHei", sans-serif;
}
/* 弹窗样式 */
.popup-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 9999;
}
.popup-content {
background-color: #fff;
border-radius: 10px;
width: 90%;
max-width: 500px;
max-height: 80vh;
overflow-y: auto;
}
.popup-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20rpx;
border-bottom: 1rpx solid #eee;
}
.popup-title {
font-size: 32rpx;
font-weight: bold;
color: #333;
}
.popup-close {
font-size: 48rpx;
color: #999;
cursor: pointer;
}
.popup-body {
padding: 20rpx;
}
.form-section {
margin-bottom: 30rpx;
padding: 20rpx;
background-color: #f5f5f5;
border-radius: 8rpx;
}
.section-title {
font-size: 28rpx;
font-weight: bold;
color: #333;
margin-bottom: 20rpx;
display: block;
}
.form-row {
display: flex;
align-items: center;
margin-bottom: 20rpx;
}
.form-label {
width: 200rpx;
font-size: 26rpx;
color: #333;
}
.form-input {
flex: 1;
padding: 15rpx;
border: 1rpx solid #ddd;
border-radius: 4rpx;
font-size: 26rpx;
}
.form-separator {
margin: 0 10rpx;
font-size: 26rpx;
color: #333;
}
.form-total {
margin-top: 10rpx;
padding-top: 10rpx;
border-top: 1rpx dashed #ddd;
}
.form-total-input {
background-color: #f9f9f9;
color: #ff6b35;
font-weight: bold;
}
.popup-footer {
display: flex;
justify-content: space-between;
padding: 20rpx;
border-top: 1rpx solid #eee;
}
.btn-cancel,
.btn-save {
width: 48%;
padding: 20rpx;
border-radius: 4rpx;
font-size: 28rpx;
}
.btn-cancel {
background-color: #f5f5f5;
color: #333;
border: 1rpx solid #ddd;
}
.btn-save {
background-color: #ff6b35;
color: #fff;
border: none;
}
/* 保存图片按钮 */
.button-container {
display: flex;
justify-content: center;
padding: 30rpx 0;
}
.btn-save-image {
background-color: #07C160;
color: #fff;
border: none;
padding: 18rpx 60rpx;
border-radius: 40rpx;
font-size: 26rpx;
font-weight: bold;
box-shadow: 0 3rpx 10rpx rgba(7, 193, 96, 0.3);
transition: all 0.3s ease;
text-align: center;
min-width: 160rpx;
}
.btn-save-image:hover {
transform: translateY(-2rpx);
box-shadow: 0 4rpx 12rpx rgba(7, 193, 96, 0.4);
}
.btn-save-image:active {
transform: translateY(0);
box-shadow: 0 2rpx 6rpx rgba(7, 193, 96, 0.3);
}
</style>