5 Commits

6 changed files with 1828 additions and 26 deletions
+1721
View File
File diff suppressed because it is too large Load Diff
@@ -83,13 +83,37 @@
} }
.divisionList { .divisionList {
display: inline-flex;
flex-wrap: wrap;
gap: 8px 12px;
}
.coverWrapper {
display: flex; display: flex;
flex-direction: column; justify-content: center;
gap: 6px; align-items: center;
background: #f5f5f5;
border-radius: 8px;
padding: 16px;
:global(.ant-image) {
max-width: 100%;
}
} }
.divisionItem { .divisionItem {
display: inline-flex;
align-items: center;
font-size: 13px; font-size: 13px;
color: rgba(0, 0, 0, 0.65); color: rgba(0, 0, 0, 0.65);
padding: 4px 12px;
background: #f5f5f5;
border-radius: 4px;
transition: all 0.2s ease;
&:hover {
color: #1677ff;
background: #e6f4ff;
}
} }
} }
@@ -270,11 +270,13 @@ export default defineComponent({
{/* ===== 封面 ===== */} {/* ===== 封面 ===== */}
<div class={styles.section}> <div class={styles.section}>
<div class={styles.sectionTitle}></div> <div class={styles.sectionTitle}></div>
<Image <div class={styles.coverWrapper}>
style={{ maxHeight: '380px' }} <Image
src={detail.value.img || defaultCover} style={{ maxHeight: '380px' }}
fallback={defaultCover} src={detail.value.img || defaultCover}
/> fallback={defaultCover}
/>
</div>
</div> </div>
{/* ===== 赛事公告 ===== */} {/* ===== 赛事公告 ===== */}
+2 -1
View File
@@ -160,7 +160,8 @@ export default defineComponent({
placeholder="请输入" placeholder="请输入"
style={{ width: '140px' }} style={{ width: '140px' }}
value={filterForm.minBalance || undefined} value={filterForm.minBalance || undefined}
precision={0} precision={2}
step={0.01}
min={0} min={0}
controls={false} controls={false}
onUpdate:value={(val: any) => onUpdate:value={(val: any) =>
@@ -143,9 +143,14 @@
} }
// ===== 上传 ===== // ===== 上传 =====
.uploader { .uploadWrapper {
flex: 1; flex: 1;
display: flex;
flex-direction: column;
gap: 8px;
}
.uploader {
:global { :global {
.ant-upload-list-picture-card-container { .ant-upload-list-picture-card-container {
width: 96px; width: 96px;
@@ -159,6 +164,21 @@
} }
} }
.pasteTip {
display: flex;
align-items: center;
gap: 6px;
padding: 8px 12px;
background: #e6f7ff;
border-radius: 4px;
color: #1677ff;
font-size: 12px;
span {
line-height: 1.5;
}
}
.uploadTrigger { .uploadTrigger {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@@ -1,8 +1,8 @@
import { defineComponent, reactive, ref } from 'vue'; import { defineComponent, reactive, ref, onMounted, onUnmounted } from 'vue';
import { useEffect } from '@/hooks'; import { useEffect } from '@/hooks';
import { Modal, Radio, Input, Button, Upload, Image, Spin, message } from 'ant-design-vue'; import { Modal, Radio, Input, Button, Upload, Image, Spin, message } from 'ant-design-vue';
import type { UploadFile } from 'ant-design-vue'; import type { UploadFile } from 'ant-design-vue';
import { PlusOutlined } from '@ant-design/icons-vue'; import { PlusOutlined, CopyOutlined } from '@ant-design/icons-vue';
import { uploadFile, OssUploadType } from '@/utils/oss'; import { uploadFile, OssUploadType } from '@/utils/oss';
import { getWithdrawInfo, postWithdrawAudit, type WithdrawInfoVO } from '../model/services'; import { getWithdrawInfo, postWithdrawAudit, type WithdrawInfoVO } from '../model/services';
import { getAuditStatusText, getPayStatusText } from '../model/useWithdrawModel'; import { getAuditStatusText, getPayStatusText } from '../model/useWithdrawModel';
@@ -41,6 +41,34 @@ export default defineComponent({
const auditForm = reactive({ pass: true, remark: '' }); const auditForm = reactive({ pass: true, remark: '' });
const imageList = ref<UploadFile[]>([]); const imageList = ref<UploadFile[]>([]);
const submitting = ref(false); const submitting = ref(false);
const uploadAreaRef = ref<HTMLElement | null>(null);
// ===== 粘贴图片上传 =====
const handlePaste = async (e: ClipboardEvent) => {
if (!props.visible || !uploadAreaRef.value) return;
const items = e.clipboardData?.items;
if (!items) return;
for (let i = 0; i < items.length; i++) {
const item = items[i];
if (item.type.indexOf('image') !== -1) {
e.preventDefault();
const file = item.getAsFile();
if (file) {
await beforeUpload(file as unknown as UploadFile);
}
}
}
};
onMounted(() => {
document.addEventListener('paste', handlePaste);
});
onUnmounted(() => {
document.removeEventListener('paste', handlePaste);
});
// ===== 拉取详情 ===== // ===== 拉取详情 =====
const fetchDetail = async (id: number) => { const fetchDetail = async (id: number) => {
@@ -239,21 +267,27 @@ export default defineComponent({
{auditForm.pass && <span class={styles.required}>*</span>} {auditForm.pass && <span class={styles.required}>*</span>}
</span> </span>
<Upload <div ref={uploadAreaRef} class={styles.uploadWrapper}>
listType="picture-card" <Upload
fileList={imageList.value} listType="picture-card"
beforeUpload={beforeUpload} fileList={imageList.value}
onRemove={handleRemove} beforeUpload={beforeUpload}
accept="image/*" onRemove={handleRemove}
class={styles.uploader} accept="image/*"
> class={styles.uploader}
{imageList.value.length >= MAX_IMAGE_COUNT ? null : ( >
<div class={styles.uploadTrigger}> {imageList.value.length >= MAX_IMAGE_COUNT ? null : (
<PlusOutlined /> <div class={styles.uploadTrigger}>
<div class={styles.uploadText}></div> <PlusOutlined />
</div> <div class={styles.uploadText}></div>
)} </div>
</Upload> )}
</Upload>
<div class={styles.pasteTip}>
<CopyOutlined />
<span> Ctrl+V </span>
</div>
</div>
</div> </div>
<div class={styles.footer}> <div class={styles.footer}>
<Button type="primary" onClick={handleSubmit} loading={submitting.value}> <Button type="primary" onClick={handleSubmit} loading={submitting.value}>