fix: fix some api issue in fronted

This commit is contained in:
2025-09-20 20:58:00 +08:00
parent a22bf1ad49
commit ef9a5b5618
6 changed files with 50 additions and 71 deletions
+10 -23
View File
@@ -32,38 +32,25 @@ class ItemSerializer(serializers.ModelSerializer):
item=obj, is_returned=False item=obj, is_returned=False
).first() ).first()
if current_usage: if current_usage:
return UserSerializer(current_usage.user).data return {
'username': current_usage.user,
'contact': current_usage.borrower_contact
}
return None return None
class ItemUsageSerializer(serializers.ModelSerializer): class ItemUsageSerializer(serializers.ModelSerializer):
user = UserSerializer(read_only=True) item_name = serializers.CharField(source='item.name', read_only=True)
user_id = serializers.IntegerField(write_only=True) item_serial = serializers.CharField(source='item.serial_number', read_only=True)
item = ItemSerializer(read_only=True)
item_id = serializers.IntegerField(write_only=True)
class Meta: class Meta:
model = ItemUsage model = ItemUsage
fields = [ fields = [
'id', 'item', 'item_id', 'user', 'user_id', 'start_time', 'end_time', 'id', 'item', 'item_name', 'item_serial', 'user', 'borrower_contact',
'purpose', 'notes', 'is_returned', 'condition_before', 'condition_after', 'start_time', 'end_time', 'purpose', 'notes', 'is_returned',
'created_at' 'condition_before', 'condition_after', 'expected_return_time', 'created_at'
] ]
read_only_fields = ['created_at']
def create(self, validated_data):
# 当创建新的使用记录时,更新物品状态为使用中
item = Item.objects.get(id=validated_data['item_id'])
item.status = 'in_use'
item.save()
return super().create(validated_data)
def update(self, instance, validated_data):
# 当归还物品时,更新物品状态为可用
if validated_data.get('is_returned', False) and not instance.is_returned:
item = instance.item
item.status = 'available'
item.save()
return super().update(instance, validated_data)
class ItemDetailSerializer(ItemSerializer): class ItemDetailSerializer(ItemSerializer):
+11 -17
View File
@@ -32,29 +32,23 @@ class ItemViewSet(viewsets.ModelViewSet):
status=status.HTTP_400_BAD_REQUEST status=status.HTTP_400_BAD_REQUEST
) )
user_id = request.data.get('user_id') user_name = request.data.get('user_name')
user_contact = request.data.get('user_contact', '')
purpose = request.data.get('purpose', '') purpose = request.data.get('purpose', '')
notes = request.data.get('notes', '') notes = request.data.get('notes', '')
condition_before = request.data.get('condition_before', '') condition_before = request.data.get('condition_before', '')
if not user_id: if not user_name:
return Response( return Response(
{'error': '指定使用者'}, {'error': '输入使用者姓名'},
status=status.HTTP_400_BAD_REQUEST
)
try:
user = User.objects.get(id=user_id)
except User.DoesNotExist:
return Response(
{'error': '用户不存在'},
status=status.HTTP_400_BAD_REQUEST status=status.HTTP_400_BAD_REQUEST
) )
# 创建使用记录 # 创建使用记录
usage = ItemUsage.objects.create( usage = ItemUsage.objects.create(
item=item, item=item,
user=user, user=user_name,
borrower_contact=user_contact,
start_time=timezone.now(), start_time=timezone.now(),
purpose=purpose, purpose=purpose,
notes=notes, notes=notes,
@@ -125,13 +119,13 @@ class ItemUsageViewSet(viewsets.ModelViewSet):
@action(detail=False) @action(detail=False)
def by_user(self, request): def by_user(self, request):
"""根据用户ID获取使用记录""" """根据用户姓名获取使用记录"""
user_id = request.query_params.get('user_id') user_name = request.query_params.get('user_name')
if user_id: if user_name:
usages = self.queryset.filter(user_id=user_id) usages = self.queryset.filter(user__icontains=user_name)
serializer = self.get_serializer(usages, many=True) serializer = self.get_serializer(usages, many=True)
return Response(serializer.data) return Response(serializer.data)
return Response({'error': '请提供用户ID'}, status=status.HTTP_400_BAD_REQUEST) return Response({'error': '请提供用户姓名'}, status=status.HTTP_400_BAD_REQUEST)
class CategoryViewSet(viewsets.ModelViewSet): class CategoryViewSet(viewsets.ModelViewSet):
+7 -3
View File
@@ -115,14 +115,18 @@
<span>当前使用中的物品</span> <span>当前使用中的物品</span>
</template> </template>
<el-table :data="currentUsages" style="width: 100%" max-height="300"> <el-table :data="currentUsages" style="width: 100%" max-height="300">
<el-table-column prop="item.name" label="物品名称" /> <el-table-column prop="item_name" label="物品名称" />
<el-table-column prop="user.username" label="使用者" /> <el-table-column prop="user" label="使用者" />
<el-table-column prop="start_time" label="开始时间"> <el-table-column prop="start_time" label="开始时间">
<template #default="scope"> <template #default="scope">
{{ formatDate(scope.row.start_time) }} {{ formatDate(scope.row.start_time) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="purpose" label="使用目的" /> <el-table-column prop="purpose" label="使用目的">
<template #default="scope">
{{ scope.row.purpose || '无' }}
</template>
</el-table-column>
</el-table> </el-table>
</el-card> </el-card>
</el-col> </el-col>
+5 -5
View File
@@ -80,9 +80,8 @@
<span>当前使用者</span> <span>当前使用者</span>
</template> </template>
<el-descriptions :column="3" border> <el-descriptions :column="3" border>
<el-descriptions-item label="使用者">{{ item.current_user.username }}</el-descriptions-item> <el-descriptions-item label="使用者姓名">{{ item.current_user.username }}</el-descriptions-item>
<el-descriptions-item label="姓名">{{ item.current_user.first_name }} {{ item.current_user.last_name }}</el-descriptions-item> <el-descriptions-item label="联系方式">{{ item.current_user.contact }}</el-descriptions-item>
<el-descriptions-item label="邮箱">{{ item.current_user.email }}</el-descriptions-item>
</el-descriptions> </el-descriptions>
</el-card> </el-card>
@@ -125,14 +124,15 @@
<el-dialog v-model="showUsageDialog" title="使用记录详情" width="600px"> <el-dialog v-model="showUsageDialog" title="使用记录详情" width="600px">
<div v-if="selectedUsage"> <div v-if="selectedUsage">
<el-descriptions :column="2" border> <el-descriptions :column="2" border>
<el-descriptions-item label="使用者">{{ selectedUsage.user.username }}</el-descriptions-item> <el-descriptions-item label="使用者">{{ selectedUsage.user }}</el-descriptions-item>
<el-descriptions-item label="使用目的">{{ selectedUsage.purpose }}</el-descriptions-item> <el-descriptions-item label="联系方式">{{ selectedUsage.borrower_contact }}</el-descriptions-item>
<el-descriptions-item label="开始时间">{{ formatDate(selectedUsage.start_time) }}</el-descriptions-item> <el-descriptions-item label="开始时间">{{ formatDate(selectedUsage.start_time) }}</el-descriptions-item>
<el-descriptions-item label="结束时间"> <el-descriptions-item label="结束时间">
{{ selectedUsage.end_time ? formatDate(selectedUsage.end_time) : '使用中' }} {{ selectedUsage.end_time ? formatDate(selectedUsage.end_time) : '使用中' }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="使用前状况">{{ selectedUsage.condition_before || '无' }}</el-descriptions-item> <el-descriptions-item label="使用前状况">{{ selectedUsage.condition_before || '无' }}</el-descriptions-item>
<el-descriptions-item label="使用后状况">{{ selectedUsage.condition_after || '无' }}</el-descriptions-item> <el-descriptions-item label="使用后状况">{{ selectedUsage.condition_after || '无' }}</el-descriptions-item>
<el-descriptions-item label="使用目的">{{ selectedUsage.notes || '无' }}</el-descriptions-item>
<el-descriptions-item label="备注" :span="2">{{ selectedUsage.notes || '无' }}</el-descriptions-item> <el-descriptions-item label="备注" :span="2">{{ selectedUsage.notes || '无' }}</el-descriptions-item>
</el-descriptions> </el-descriptions>
</div> </div>
+10 -12
View File
@@ -124,14 +124,10 @@
<el-dialog v-model="showBorrowDialog" title="借用物品" width="500px"> <el-dialog v-model="showBorrowDialog" title="借用物品" width="500px">
<el-form :model="borrowForm" label-width="100px"> <el-form :model="borrowForm" label-width="100px">
<el-form-item label="使用者"> <el-form-item label="使用者">
<el-select v-model="borrowForm.user_id" placeholder="请选择使用者"> <el-input v-model="borrowForm.user_name" placeholder="请输入使用者姓名" />
<el-option </el-form-item>
v-for="user in users" <el-form-item label="联系方式">
:key="user.id" <el-input v-model="borrowForm.user_contact" placeholder="请输入联系方式(可选)" />
:label="user.username"
:value="user.id"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="使用目的"> <el-form-item label="使用目的">
<el-input v-model="borrowForm.purpose" /> <el-input v-model="borrowForm.purpose" />
@@ -245,7 +241,8 @@ export default {
owner: '' owner: ''
}, },
borrowForm: { borrowForm: {
user_id: null, user_name: '',
user_contact: '',
purpose: '', purpose: '',
condition_before: '', condition_before: '',
notes: '' notes: ''
@@ -333,7 +330,8 @@ export default {
borrowItem(item) { borrowItem(item) {
this.currentItem = item this.currentItem = item
this.borrowForm = { this.borrowForm = {
user_id: null, user_name: '',
user_contact: '',
purpose: '', purpose: '',
condition_before: '', condition_before: '',
notes: '' notes: ''
@@ -382,8 +380,8 @@ export default {
} }
}, },
async confirmBorrow() { async confirmBorrow() {
if (!this.borrowForm.user_id) { if (!this.borrowForm.user_name) {
ElMessage.error('请选择使用者') ElMessage.error('请输入使用者姓名')
return return
} }
+7 -11
View File
@@ -30,9 +30,9 @@
<el-card> <el-card>
<el-table :data="filteredUsages" style="width: 100%" v-loading="loading"> <el-table :data="filteredUsages" style="width: 100%" v-loading="loading">
<el-table-column prop="item.name" label="物品名称" /> <el-table-column prop="item_name" label="物品名称" />
<el-table-column prop="item.serial_number" label="序列号" /> <el-table-column prop="item_serial" label="序列号" />
<el-table-column prop="user.username" label="使用者" /> <el-table-column prop="user" label="使用者" />
<el-table-column prop="start_time" label="开始时间" width="160"> <el-table-column prop="start_time" label="开始时间" width="160">
<template #default="scope"> <template #default="scope">
{{ formatDate(scope.row.start_time) }} {{ formatDate(scope.row.start_time) }}
@@ -85,19 +85,15 @@
<el-col :span="12"> <el-col :span="12">
<h3>物品信息</h3> <h3>物品信息</h3>
<el-descriptions :column="1" border> <el-descriptions :column="1" border>
<el-descriptions-item label="物品名称">{{ selectedUsage.item.name }}</el-descriptions-item> <el-descriptions-item label="物品名称">{{ selectedUsage.item_name }}</el-descriptions-item>
<el-descriptions-item label="序列号">{{ selectedUsage.item.serial_number }}</el-descriptions-item> <el-descriptions-item label="序列号">{{ selectedUsage.item_serial }}</el-descriptions-item>
<el-descriptions-item label="类别">{{ selectedUsage.item.category }}</el-descriptions-item>
</el-descriptions> </el-descriptions>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<h3>使用者信息</h3> <h3>使用者信息</h3>
<el-descriptions :column="1" border> <el-descriptions :column="1" border>
<el-descriptions-item label="用户名">{{ selectedUsage.user.username }}</el-descriptions-item> <el-descriptions-item label="使用者">{{ selectedUsage.user }}</el-descriptions-item>
<el-descriptions-item label="姓名"> <el-descriptions-item label="联系方式">{{ selectedUsage.borrower_contact }}</el-descriptions-item>
{{ selectedUsage.user.first_name }} {{ selectedUsage.user.last_name }}
</el-descriptions-item>
<el-descriptions-item label="邮箱">{{ selectedUsage.user.email }}</el-descriptions-item>
</el-descriptions> </el-descriptions>
</el-col> </el-col>
</el-row> </el-row>