v0.1.2 - 创建群表单新增6个必填字段
This commit is contained in:
parent
a31d6cc153
commit
f695dfbfa0
|
|
@ -16,10 +16,12 @@ router = APIRouter(prefix="/api/purchase", tags=["认购"])
|
||||||
|
|
||||||
# ============ Schema ============
|
# ============ Schema ============
|
||||||
class PurchaseGroupCreate(BaseModel):
|
class PurchaseGroupCreate(BaseModel):
|
||||||
cycle_months: Optional[int] = None
|
|
||||||
start_date: Optional[str] = None
|
|
||||||
name: str
|
name: str
|
||||||
description: Optional[str] = None
|
description: str
|
||||||
|
total_members: int
|
||||||
|
total_collections: int
|
||||||
|
cycle_months: int
|
||||||
|
start_date: str
|
||||||
|
|
||||||
class PurchaseGroupResponse(BaseModel):
|
class PurchaseGroupResponse(BaseModel):
|
||||||
cycle_months: Optional[int] = None
|
cycle_months: Optional[int] = None
|
||||||
|
|
@ -238,6 +240,8 @@ def create_group(
|
||||||
creator_id=current_user.f99_90_id,
|
creator_id=current_user.f99_90_id,
|
||||||
creator_name=current_user.f01_01_name,
|
creator_name=current_user.f01_01_name,
|
||||||
status="active",
|
status="active",
|
||||||
|
total_members=data.total_members,
|
||||||
|
total_collections=data.total_collections,
|
||||||
cycle_months=data.cycle_months,
|
cycle_months=data.cycle_months,
|
||||||
start_date=start_date
|
start_date=start_date
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,23 @@
|
||||||
# 版本更新记录
|
# 版本更新记录
|
||||||
|
|
||||||
|
## v0.1.2 (2026-04-30)
|
||||||
|
|
||||||
|
### 前端更新
|
||||||
|
- **Home.jsx**
|
||||||
|
- 修复:我的认购入口字体颜色改为蓝色 #3b82f6
|
||||||
|
- **Purchase.jsx**
|
||||||
|
- 新增:创建群表单6个必填字段
|
||||||
|
- 认购群名称
|
||||||
|
- 认购介绍(群介绍)
|
||||||
|
- 参与人数
|
||||||
|
- 总认购数
|
||||||
|
- 认购周期(月)
|
||||||
|
- 开始日期
|
||||||
|
|
||||||
|
### 后端更新
|
||||||
|
- **purchase.py**
|
||||||
|
- 新增:创建群接口支持新字段 total_members、total_collections
|
||||||
|
|
||||||
## v0.0.12 (2026-04-29)
|
## v0.0.12 (2026-04-29)
|
||||||
|
|
||||||
### 前端更新
|
### 前端更新
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,16 @@
|
||||||
{
|
{
|
||||||
"version": "0.1.1",
|
"version": "0.1.2",
|
||||||
"updated": "2026-04-29",
|
"updated": "2026-04-30",
|
||||||
"modules": {
|
"modules": {
|
||||||
"frontend": {
|
"frontend": {
|
||||||
"version": "0.1.1",
|
"version": "0.1.2",
|
||||||
"pages": {
|
"pages": {
|
||||||
"Home": "0.1.0",
|
"Home": "0.1.0",
|
||||||
"Purchase": "0.1.2"
|
"Purchase": "0.0.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"backend": {
|
"backend": {
|
||||||
"version": "0.1.1",
|
"version": "0.1.2",
|
||||||
"routers": {
|
"routers": {
|
||||||
"purchase": "0.1.0"
|
"purchase": "0.1.0"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -238,7 +238,7 @@ export default function Home() {
|
||||||
justifyContent: 'center',
|
justifyContent: 'center',
|
||||||
textAlign: 'center'
|
textAlign: 'center'
|
||||||
}}>
|
}}>
|
||||||
<div style={{ color: '#ec4899', fontSize: '18px', fontWeight: '600', whiteSpace: 'nowrap' }}>我的认购</div>
|
<div style={{ color: '#3b82f6', fontSize: '18px', fontWeight: '600', whiteSpace: 'nowrap' }}>我的认购</div>
|
||||||
<div style={{ color: 'rgba(255,255,255,0.5)', fontSize: '10px', marginTop: '2px' }}>认购群入口</div>
|
<div style={{ color: 'rgba(255,255,255,0.5)', fontSize: '10px', marginTop: '2px' }}>认购群入口</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
/**
|
/**
|
||||||
* Purchase - 我的认购/团购页面
|
* Purchase - 我的认购/团购页面
|
||||||
* Version: 0.0.1 (2026-04-24)
|
* Version: 0.0.2 (2026-04-30)
|
||||||
* 认购群管理、加入、查看详情
|
* 认购群管理、加入、查看详情
|
||||||
|
* 更新:创建群表单新增6个字段(群名、介绍、人数、总数、周期、开始日期)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, { useState, useEffect } from 'react'
|
import React, { useState, useEffect } from 'react'
|
||||||
|
|
@ -19,7 +20,14 @@ function Purchase() {
|
||||||
const [groupMembers, setGroupMembers] = useState([])
|
const [groupMembers, setGroupMembers] = useState([])
|
||||||
const [groupCollections, setGroupCollections] = useState([])
|
const [groupCollections, setGroupCollections] = useState([])
|
||||||
const [showCollectionForm, setShowCollectionForm] = useState(false)
|
const [showCollectionForm, setShowCollectionForm] = useState(false)
|
||||||
const [newGroup, setNewGroup] = useState({ name: '', description: '' })
|
const [newGroup, setNewGroup] = useState({
|
||||||
|
name: '',
|
||||||
|
description: '',
|
||||||
|
total_members: '',
|
||||||
|
total_collections: '',
|
||||||
|
cycle_months: '',
|
||||||
|
start_date: ''
|
||||||
|
})
|
||||||
const [newCollection, setNewCollection] = useState({ number: 'J0________', price: '' })
|
const [newCollection, setNewCollection] = useState({ number: 'J0________', price: '' })
|
||||||
const [loading, setLoading] = useState(true)
|
const [loading, setLoading] = useState(true)
|
||||||
const [activeTab, setActiveTab] = useState('my') // my/all
|
const [activeTab, setActiveTab] = useState('my') // my/all
|
||||||
|
|
@ -61,6 +69,11 @@ function Purchase() {
|
||||||
const token = localStorage.getItem('token')
|
const token = localStorage.getItem('token')
|
||||||
if (!token) { alert('请先登录'); return }
|
if (!token) { alert('请先登录'); return }
|
||||||
if (!newGroup.name.trim()) { alert('请输入认购群名称'); return }
|
if (!newGroup.name.trim()) { alert('请输入认购群名称'); return }
|
||||||
|
if (!newGroup.description.trim()) { alert('请输入认购介绍'); return }
|
||||||
|
if (!newGroup.total_members) { alert('请输入参与人数'); return }
|
||||||
|
if (!newGroup.total_collections) { alert('请输入总认购数'); return }
|
||||||
|
if (!newGroup.cycle_months) { alert('请输入认购周期'); return }
|
||||||
|
if (!newGroup.start_date) { alert('请选择开始日期'); return }
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const res = await fetch(`${API_BASE}/api/purchase/groups`, {
|
const res = await fetch(`${API_BASE}/api/purchase/groups`, {
|
||||||
|
|
@ -75,7 +88,7 @@ function Purchase() {
|
||||||
if (res.ok) {
|
if (res.ok) {
|
||||||
alert('创建成功!')
|
alert('创建成功!')
|
||||||
setShowCreate(false)
|
setShowCreate(false)
|
||||||
setNewGroup({ name: '', description: '' })
|
setNewGroup({ name: '', description: '', total_members: '', total_collections: '', cycle_months: '', start_date: '' })
|
||||||
fetchGroups()
|
fetchGroups()
|
||||||
} else {
|
} else {
|
||||||
alert(data.detail || '创建失败')
|
alert(data.detail || '创建失败')
|
||||||
|
|
@ -749,10 +762,12 @@ function Purchase() {
|
||||||
maxWidth: '400px'
|
maxWidth: '400px'
|
||||||
}}>
|
}}>
|
||||||
<div style={{ fontSize: '18px', fontWeight: 'bold', marginBottom: '16px' }}>创建认购群</div>
|
<div style={{ fontSize: '18px', fontWeight: 'bold', marginBottom: '16px' }}>创建认购群</div>
|
||||||
|
|
||||||
|
{/* 1. 认购群名称 */}
|
||||||
<input
|
<input
|
||||||
value={newGroup.name}
|
value={newGroup.name}
|
||||||
onChange={(e) => setNewGroup({...newGroup, name: e.target.value})}
|
onChange={(e) => setNewGroup({...newGroup, name: e.target.value})}
|
||||||
placeholder="认购群名称"
|
placeholder="* 认购群名称"
|
||||||
style={{
|
style={{
|
||||||
width: '100%',
|
width: '100%',
|
||||||
background: 'rgba(255,255,255,0.1)',
|
background: 'rgba(255,255,255,0.1)',
|
||||||
|
|
@ -764,11 +779,13 @@ function Purchase() {
|
||||||
marginBottom: '12px'
|
marginBottom: '12px'
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
{/* 2. 认购介绍 */}
|
||||||
<textarea
|
<textarea
|
||||||
value={newGroup.description}
|
value={newGroup.description}
|
||||||
onChange={(e) => setNewGroup({...newGroup, description: e.target.value})}
|
onChange={(e) => setNewGroup({...newGroup, description: e.target.value})}
|
||||||
placeholder="描述(可选)"
|
placeholder="* 认购介绍(群介绍)"
|
||||||
rows={3}
|
rows={2}
|
||||||
style={{
|
style={{
|
||||||
width: '100%',
|
width: '100%',
|
||||||
background: 'rgba(255,255,255,0.1)',
|
background: 'rgba(255,255,255,0.1)',
|
||||||
|
|
@ -777,10 +794,83 @@ function Purchase() {
|
||||||
padding: '12px',
|
padding: '12px',
|
||||||
color: '#fff',
|
color: '#fff',
|
||||||
fontSize: '14px',
|
fontSize: '14px',
|
||||||
marginBottom: '16px',
|
marginBottom: '12px',
|
||||||
resize: 'none'
|
resize: 'none'
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
{/* 3. 参与人数 */}
|
||||||
|
<input
|
||||||
|
type="number"
|
||||||
|
value={newGroup.total_members}
|
||||||
|
onChange={(e) => setNewGroup({...newGroup, total_members: e.target.value})}
|
||||||
|
placeholder="* 参与人数"
|
||||||
|
style={{
|
||||||
|
width: '100%',
|
||||||
|
background: 'rgba(255,255,255,0.1)',
|
||||||
|
border: '1px solid rgba(255,255,255,0.2)',
|
||||||
|
borderRadius: '8px',
|
||||||
|
padding: '12px',
|
||||||
|
color: '#fff',
|
||||||
|
fontSize: '14px',
|
||||||
|
marginBottom: '12px'
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{/* 4. 总认购数 */}
|
||||||
|
<input
|
||||||
|
type="number"
|
||||||
|
value={newGroup.total_collections}
|
||||||
|
onChange={(e) => setNewGroup({...newGroup, total_collections: e.target.value})}
|
||||||
|
placeholder="* 总认购数"
|
||||||
|
style={{
|
||||||
|
width: '100%',
|
||||||
|
background: 'rgba(255,255,255,0.1)',
|
||||||
|
border: '1px solid rgba(255,255,255,0.2)',
|
||||||
|
borderRadius: '8px',
|
||||||
|
padding: '12px',
|
||||||
|
color: '#fff',
|
||||||
|
fontSize: '14px',
|
||||||
|
marginBottom: '12px'
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{/* 5. 认购周期 */}
|
||||||
|
<input
|
||||||
|
type="number"
|
||||||
|
value={newGroup.cycle_months}
|
||||||
|
onChange={(e) => setNewGroup({...newGroup, cycle_months: e.target.value})}
|
||||||
|
placeholder="* 认购周期(月)"
|
||||||
|
style={{
|
||||||
|
width: '100%',
|
||||||
|
background: 'rgba(255,255,255,0.1)',
|
||||||
|
border: '1px solid rgba(255,255,255,0.2)',
|
||||||
|
borderRadius: '8px',
|
||||||
|
padding: '12px',
|
||||||
|
color: '#fff',
|
||||||
|
fontSize: '14px',
|
||||||
|
marginBottom: '12px'
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{/* 6. 开始日期 */}
|
||||||
|
<input
|
||||||
|
type="date"
|
||||||
|
value={newGroup.start_date}
|
||||||
|
onChange={(e) => setNewGroup({...newGroup, start_date: e.target.value})}
|
||||||
|
placeholder="* 开始日期"
|
||||||
|
style={{
|
||||||
|
width: '100%',
|
||||||
|
background: 'rgba(255,255,255,0.1)',
|
||||||
|
border: '1px solid rgba(255,255,255,0.2)',
|
||||||
|
borderRadius: '8px',
|
||||||
|
padding: '12px',
|
||||||
|
color: '#fff',
|
||||||
|
fontSize: '14px',
|
||||||
|
marginBottom: '16px'
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
|
||||||
<div style={{ display: 'flex', gap: '8px' }}>
|
<div style={{ display: 'flex', gap: '8px' }}>
|
||||||
<button
|
<button
|
||||||
onClick={() => setShowCreate(false)}
|
onClick={() => setShowCreate(false)}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue