feat:명함 이미지 저장 및 표시 기능 추가

- SalesProspect 모델에 business_card_image 필드 추가
- hasBusinessCard(), business_card_url 접근자 추가
- SalesProspectController store/update에 이미지 저장 로직
- create.blade.php에 이미지 데이터 전송 hidden input 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
pro
2026-01-27 23:36:41 +09:00
parent 57e8e5d131
commit e9f77cb5f1
3 changed files with 75 additions and 0 deletions

View File

@@ -8,6 +8,7 @@
use App\Models\Sales\SalesProspectProduct;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Storage;
use Illuminate\View\View;
/**
@@ -92,8 +93,15 @@ public function store(Request $request)
'email' => 'nullable|email|max:100',
'address' => 'nullable|string|max:500',
'status' => 'required|in:lead,prospect,negotiation,contracted,lost',
'business_card_image_data' => 'nullable|string',
]);
// 명함 이미지 저장 (Base64)
if (!empty($validated['business_card_image_data'])) {
$validated['business_card_image'] = $this->saveBusinessCardImage($validated['business_card_image_data']);
unset($validated['business_card_image_data']);
}
$prospect = SalesProspect::create($validated);
return redirect()->route('sales.prospects.show', $prospect->id)
@@ -148,8 +156,21 @@ public function update(Request $request, int $id)
'email' => 'nullable|email|max:100',
'address' => 'nullable|string|max:500',
'status' => 'required|in:lead,prospect,negotiation,contracted,lost',
'business_card' => 'nullable|image|max:5120',
]);
// 명함 이미지 업로드 처리
if ($request->hasFile('business_card')) {
// 기존 이미지 삭제
if ($prospect->business_card_image) {
Storage::disk('public')->delete($prospect->business_card_image);
}
$validated['business_card_image'] = $request->file('business_card')
->store('business-cards', 'public');
}
unset($validated['business_card']);
$prospect->update($validated);
return redirect()->route('sales.prospects.show', $prospect->id)
@@ -162,9 +183,39 @@ public function update(Request $request, int $id)
public function destroy(int $id)
{
$prospect = SalesProspect::findOrFail($id);
// 명함 이미지 삭제
if ($prospect->business_card_image) {
Storage::disk('public')->delete($prospect->business_card_image);
}
$prospect->delete();
return redirect()->route('sales.prospects.index')
->with('success', '가망고객이 삭제되었습니다.');
}
/**
* Base64 명함 이미지 저장
*/
private function saveBusinessCardImage(string $base64Data): ?string
{
// data:image/jpeg;base64,... 형식에서 데이터 추출
if (preg_match('/^data:image\/(\w+);base64,/', $base64Data, $matches)) {
$extension = $matches[1];
$base64Data = preg_replace('/^data:image\/\w+;base64,/', '', $base64Data);
} else {
$extension = 'jpg';
}
$imageData = base64_decode($base64Data);
if ($imageData === false) {
return null;
}
$filename = 'business-cards/' . date('Ymd') . '_' . uniqid() . '.' . $extension;
Storage::disk('public')->put($filename, $imageData);
return $filename;
}
}