- Replace all static mock data with real backend API calls for templates, generation tasks, credit balance and recharge - Remove deprecated mock data files including templates.js, versionOptions.js, records.js and packages.js - Add useCurrentCredit composable for fetching and managing user credit balance - Update all components to align with new backend data shapes (e.g. templateItemId instead of id) - Add loading and disabled states for interactive UI elements - Implement full WeChat mini-program payment flow for credit recharge - Fix template and record card UI styling and media handling - Set developVersion flag to true for testing environment
93 lines
2.0 KiB
Vue
93 lines
2.0 KiB
Vue
<template>
|
||
<uni-popup
|
||
ref="popupRef"
|
||
type="bottom"
|
||
background-color="transparent"
|
||
mask-background-color="rgba(0, 0, 0, 0)"
|
||
:safe-area="false"
|
||
:is-mask-click="false"
|
||
>
|
||
<view class="photo-pick-drawer">
|
||
<view
|
||
class="photo-pick-close"
|
||
:class="{ 'is-disabled': loading }"
|
||
@tap="handleClose"
|
||
>
|
||
<uni-icons type="closeempty" size="30" color="#8fa2ba" />
|
||
</view>
|
||
|
||
<text class="photo-pick-title">选择照片</text>
|
||
|
||
<view class="photo-pick-card">
|
||
<view class="photo-pick-plus">+</view>
|
||
<text class="photo-pick-card-title">上传照片素材</text>
|
||
<text class="photo-pick-card-desc">
|
||
选择后会自动进行清晰度、人脸数量和遮挡检测
|
||
</text>
|
||
</view>
|
||
|
||
<view class="photo-pick-actions">
|
||
<view
|
||
class="photo-pick-action"
|
||
:class="{ 'is-disabled': loading }"
|
||
:hover-class="loading ? 'none' : 'is-pressed'"
|
||
@tap="handleCamera"
|
||
>
|
||
拍照
|
||
</view>
|
||
<view
|
||
class="photo-pick-action"
|
||
:class="{ 'is-disabled': loading }"
|
||
:hover-class="loading ? 'none' : 'is-pressed'"
|
||
@tap="handleAlbum"
|
||
>
|
||
相册
|
||
</view>
|
||
</view>
|
||
|
||
<text class="photo-pick-hint">建议使用半身照,避免墨镜、口罩、强逆光。</text>
|
||
</view>
|
||
</uni-popup>
|
||
</template>
|
||
|
||
<script setup>
|
||
import { nextTick, onMounted, ref } from "vue";
|
||
|
||
const props = defineProps({
|
||
loading: {
|
||
type: Boolean,
|
||
default: false,
|
||
},
|
||
});
|
||
|
||
const emit = defineEmits(["close", "camera", "album"]);
|
||
const popupRef = ref(null);
|
||
|
||
const handleClose = () => {
|
||
if (props.loading) return;
|
||
|
||
emit("close");
|
||
};
|
||
|
||
const handleCamera = () => {
|
||
if (props.loading) return;
|
||
|
||
emit("camera");
|
||
};
|
||
|
||
const handleAlbum = () => {
|
||
if (props.loading) return;
|
||
|
||
emit("album");
|
||
};
|
||
|
||
onMounted(async () => {
|
||
await nextTick();
|
||
popupRef.value?.open();
|
||
});
|
||
</script>
|
||
|
||
<style scoped lang="scss">
|
||
@import "./styles/index.scss";
|
||
</style>
|