14 Commits

Author SHA1 Message Date
chenzhen 64fdaba93d feat: 添加提现申请弹窗添加复制图片 2026-08-18 10:54:04 +08:00
chenzhen 50d5f54015 Merge pull request 'feat:amount optimization and change style optimization' (#14) from release/amountOptimization into master
Reviewed-on: #14
2026-08-10 21:23:14 +08:00
chenzhen a77592dec6 feat: change style optimization 2026-08-10 21:16:03 +08:00
chenzhen 00867ff960 feat: amount optimization 2026-08-10 20:42:51 +08:00
chenzhen 4c08bd1f8c Merge pull request '赛事运营平台 相关功能' (#13) from release/0.01 into master
Reviewed-on: #13
2026-08-10 16:02:03 +08:00
chenzhen ab6f5c787e Merge pull request 'Feature/0723/zr' (#12) from feature/0723/ZR into release/0.01
Reviewed-on: #12
2026-08-10 11:23:19 +08:00
ZhuRui 79a7ea8c56 fix: 文案修改 2026-08-10 09:44:45 +08:00
ZhuRui b5ba0ca3fb Merge remote-tracking branch 'origin/release/0.01' into feature/0723/ZR 2026-08-10 08:38:37 +08:00
ZhuRui 9b5e2807b5 fix: 处理部分前端问题 2026-08-08 18:40:52 +08:00
chenzhen 3a30e81183 Merge pull request 'fix: 声明改变' (#11) from feature/0723/ZR into release/0.01
Reviewed-on: #11
2026-08-08 15:08:52 +08:00
ZhuRui 28386f5429 fix: 声明改变 2026-08-08 15:04:26 +08:00
chenzhen b0b8689acb Merge pull request 'Feature/0723/zr' (#10) from feature/0723/ZR into release/0.01
Reviewed-on: #10
2026-08-08 14:51:53 +08:00
ZhuRui 8012cb82fc Merge remote-tracking branch 'origin/release/0.01' into feature/0723/ZR 2026-08-08 14:43:33 +08:00
ZhuRui 73b2da2d1e fix: 处理打包问题 2026-08-08 14:42:39 +08:00
14 changed files with 2186 additions and 289 deletions
+1721
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -54,7 +54,7 @@
"eslint-plugin-prettier": "^5.0.0",
"eslint-plugin-vue": "^9.0.0",
"husky": "^9.1.7",
"jsdom": "^30.0.1",
"jsdom": "^19.0.0",
"less": "^4.6.4",
"lint-staged": "^15.0.0",
"prettier": "^3.0.0",
+343 -256
View File
File diff suppressed because it is too large Load Diff
@@ -83,13 +83,37 @@
}
.divisionList {
display: inline-flex;
flex-wrap: wrap;
gap: 8px 12px;
}
.coverWrapper {
display: flex;
flex-direction: column;
gap: 6px;
justify-content: center;
align-items: center;
background: #f5f5f5;
border-radius: 8px;
padding: 16px;
:global(.ant-image) {
max-width: 100%;
}
}
.divisionItem {
display: inline-flex;
align-items: center;
font-size: 13px;
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,12 +270,14 @@ export default defineComponent({
{/* ===== 封面 ===== */}
<div class={styles.section}>
<div class={styles.sectionTitle}></div>
<div class={styles.coverWrapper}>
<Image
style={{ maxHeight: '380px' }}
src={detail.value.img || defaultCover}
fallback={defaultCover}
/>
</div>
</div>
{/* ===== 赛事公告 ===== */}
{detail.value.notice && (
@@ -25,6 +25,8 @@
padding: 12px 16px;
border-radius: 4px;
border: 1px solid #f0f0f0;
max-height: 360px;
overflow-y: auto;
}
.imageGrid {
+1 -1
View File
@@ -89,7 +89,7 @@ export default defineComponent({
const renderAction = (record: any) => {
const status = record.status;
if (status === '0' || status === '1') {
if (['0', '1', '2'].includes(status)) {
return (
<Space>
<Button type="link" size="small" onClick={() => openDetailModal(record)}>
+6 -2
View File
@@ -180,7 +180,7 @@ export default defineComponent({
},
{
key: 'totalBalance',
label: '平台余额(所有用户余额总和)',
label: '平台余额(所有用户余额总和 = 总收入 - 提现金额',
value: s.totalBalance,
bgColor: '#e6f4ff',
accentColor: '#1677ff',
@@ -224,7 +224,11 @@ export default defineComponent({
<div class={styles.statValue} style={{ color: item.accentColor }}>
¥{formatMoney(item.value)}
</div>
{/* 趋势文字暂时隐藏 */}
{/* {item.key === 'totalBalance' && (
<div class={styles.statDesc} style={{ color: 'rgba(0, 0, 0, 0.45)' }}>
= -
</div>
)} */}
</div>
))}
</div>
@@ -126,7 +126,9 @@ export function useReportsModel() {
// ===== 图表数据 =====
const chartData = computed(() => {
const list = data.value?.monthList || [];
return list.map((item) => ({
// 按月份升序排列,确保图表 X 轴时间顺序正确
const sorted = [...list].sort((a, b) => a.month.localeCompare(b.month));
return sorted.map((item) => ({
month: dayjs(item.month).format('MM月'),
order: toNumber(item.orderAmount),
refund: toNumber(item.refundAmount),
+2 -1
View File
@@ -160,7 +160,8 @@ export default defineComponent({
placeholder="请输入"
style={{ width: '140px' }}
value={filterForm.minBalance || undefined}
precision={0}
precision={2}
step={0.01}
min={0}
controls={false}
onUpdate:value={(val: any) =>
@@ -143,9 +143,14 @@
}
// ===== 上传 =====
.uploader {
.uploadWrapper {
flex: 1;
display: flex;
flex-direction: column;
gap: 8px;
}
.uploader {
:global {
.ant-upload-list-picture-card-container {
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 {
display: flex;
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 { Modal, Radio, Input, Button, Upload, Image, Spin, message } 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 { getWithdrawInfo, postWithdrawAudit, type WithdrawInfoVO } from '../model/services';
import { getAuditStatusText, getPayStatusText } from '../model/useWithdrawModel';
@@ -41,6 +41,34 @@ export default defineComponent({
const auditForm = reactive({ pass: true, remark: '' });
const imageList = ref<UploadFile[]>([]);
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) => {
@@ -239,6 +267,7 @@ export default defineComponent({
{auditForm.pass && <span class={styles.required}>*</span>}
</span>
<div ref={uploadAreaRef} class={styles.uploadWrapper}>
<Upload
listType="picture-card"
fileList={imageList.value}
@@ -250,10 +279,15 @@ export default defineComponent({
{imageList.value.length >= MAX_IMAGE_COUNT ? null : (
<div class={styles.uploadTrigger}>
<PlusOutlined />
<div class={styles.uploadText}></div>
<div class={styles.uploadText}></div>
</div>
)}
</Upload>
<div class={styles.pasteTip}>
<CopyOutlined />
<span> Ctrl+V </span>
</div>
</div>
</div>
<div class={styles.footer}>
<Button type="primary" onClick={handleSubmit} loading={submitting.value}>
+1 -1
View File
@@ -1,4 +1,4 @@
declare module 'china-area-data' {
declare module 'china-area-data/data.json' {
const data: Record<string, Record<string, string>>;
export default data;
}
+1 -1
View File
@@ -1,4 +1,4 @@
import areaData from 'china-area-data';
import areaData from 'china-area-data/data.json';
export interface CascadeOption {
value: string;