Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .env.example

This file was deleted.

2 changes: 1 addition & 1 deletion .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,4 @@ jobs:
run: npm run build

- name: Prettier format check
run: npx prettier --check .
run: npm run format:check
2 changes: 1 addition & 1 deletion .github/workflows/git-push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ jobs:
destination-github-username: sasha-designer
destination-repository-name: 1zari
user-email: ${{ secrets.SASHA_ACCOUNT_EMAIL }}
commit-message: ${{ github.event.commits[0].message }}
commit-message: ${{ github.event.head_commit.message || 'Auto deployment' }}
target-branch: main
- name: Test get variable exported by push-to-another-repository
run: echo $DESTINATION_CLONED_DIRECTORY
29 changes: 29 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Dependencies
node_modules/
yarn.lock
package-lock.json

# Build outputs
.next/
out/
dist/
build/

# Documentation
README.md
*.md

# Config files
.env*
.gitignore
tsconfig.json
next.config.js
tailwind.config.js
postcss.config.cjs

# IDE
.vscode/
.idea/

# Logs
*.log
2 changes: 1 addition & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,4 @@
"source.fixAll": "explicit",
"source.fixAll.eslint": "explicit"
}
}
}
59 changes: 35 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,25 +1,31 @@
## 📖 프로젝트 소개

> 시니어내일은 5060 퇴직자 및 중장년층 구직를 위한 서비스
시니어 맞춤형 일자리 추천 알고리즘을 통해 다양한 채용공고를 접하고 간편이력서를 통해 지원까지 보다 쉽게 사용 가능한 반응형 웹 💚
---

## 시니어 맞춤형 일자리 추천 알고리즘을 통해 다양한 채용공고를 접하고 간편이력서를 통해 지원까지 보다 쉽게 사용 가능한 반응형 웹 💚

## :link: 배포 링크

> ### FE : https://senior-tomorrow.kro.kr/
>
> ### BE : https://senior-naeil.life/

---

## 🗣️ 프로젝트 발표 영상 & 발표 문서

> ### 🗓️ 2025.03.13
>
> ### [📺 발표 영상 예시]()
>
> ### [📑 발표 문서 예시]()

---

## 🧰 사용 스택

### FE

<div align="center">

<!-- 프레임워크 및 언어 -->
Expand All @@ -40,6 +46,7 @@
<br>

<!-- 협업 툴 -->
<img src="https://img.shields.io/badge/GitHub-181717?style=for-the-badge&logo=github&logoColor=white">
<img src="https://img.shields.io/badge/Figma-F24E1E?style=for-the-badge&logo=figma&logoColor=white">
<img src="https://img.shields.io/badge/Notion-000000?style=for-the-badge&logo=notion&logoColor=white">
<img src="https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white">
Expand All @@ -54,6 +61,7 @@
</div>

### BE

<div align="center">

<!-- 언어 & 프레임워크 -->
Expand Down Expand Up @@ -94,21 +102,21 @@

</div>


---
---

## :busts_in_silhouette: 팀 동료

### FE

| <a href="https://github.com/KIMDOTS"><img src="https://avatars.githubusercontent.com/u/168804702?v=4" width=100px/><br/><sub><b>@KIMDOTS</b></sub></a><br/> | <a href="https://github.com/chiyo-an"><img src="https://avatars.githubusercontent.com/u/52526916?v=4" width=100px/><br/><sub><b>@chiyo-an</b></sub></a><br/> | <a href="https://github.com/sasha-designer"><img src="https://avatars.githubusercontent.com/u/186126648?v=4" width=100px/><br/><sub><b>@sasha-designer</b></sub></a><br/> |
|:------------------------------------------------------------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------------------------------------------------------:|
| 김민정 | 안정은 | 박정현 |
| :---------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| 김민정 | 안정은 | 박정현 |

### BE

| <a href="https://github.com/Anianim"><img src="https://avatars.githubusercontent.com/u/188424203?v=4" width=100px/><br/><sub><b>@Anianim</b></sub></a><br/> | <a href="https://github.com/rodzlen"><img src="https://avatars.githubusercontent.com/u/162860800?v=4" width=100px/><br/><sub><b>@rodzlen</b></sub></a><br/> | <a href="https://github.com/parkh12"><img src="https://avatars.githubusercontent.com/u/186007221?v=4" width=100px/><br/><sub><b>@parkh12</b></sub></a><br/> |
|:-------------------------------------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------:|
| 고영주 | 김휘수 | 박현성 |
| :---------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------: |
| 고영주 | 김휘수 | 박현성 |

---

Expand Down Expand Up @@ -154,24 +162,26 @@ src/
```

### Branch Strategy
> - main / dev 브랜치 기본 생성

> - main / dev 브랜치 기본 생성
> - main과 dev로 직접 push 제한
> - PR 전 최소 2인 이상 승인 필수

### Git Convention

> 1. 적절한 커밋 접두사 작성
> 2. 커밋 메시지 내용 작성

>| 접두사 | 이모지 | 설명 |
>| ------------ | ------ | -------------------------------------------------------------------- |
>| Feat | ✨ | 새로운 기능 추가 |
>| Fix | 🐛 | 기능 수정 및 버그 수정 |
>| Chore | 💡 | 오타 수정, 주석 추가 등 기능 변경 없이 코드 수정 |
>| Docs | 📝 | 문서 수정 (예: README.md) |
>| Build | 🚚 | 빌드 관련 파일 수정 또는 삭제 |
>| Test | ✅ | 테스트 코드 추가 및 수정 (프로덕션 코드 변경 없음) |
>| Refactor | ♻️ | 코드 리팩토링 (기능 변화 없이 구조 개선) |
>| Hotfix | 🚑 | 긴급 수정
> | 접두사 | 이모지 | 설명 |
> | -------- | ------ | -------------------------------------------------- |
> | Feat | ✨ | 새로운 기능 추가 |
> | Fix | 🐛 | 기능 수정 및 버그 수정 |
> | Chore | 💡 | 오타 수정, 주석 추가 등 기능 변경 없이 코드 수정 |
> | Docs | 📝 | 문서 수정 (예: README.md) |
> | Build | 🚚 | 빌드 관련 파일 수정 또는 삭제 |
> | Test | ✅ | 테스트 코드 추가 및 수정 (프로덕션 코드 변경 없음) |
> | Refactor | ♻️ | 코드 리팩토링 (기능 변화 없이 구조 개선) |
> | Hotfix | 🚑 | 긴급 수정 |

---

Expand All @@ -180,16 +190,17 @@ src/
---

## :clipboard: Documents

> [📜 API 명세서](https://www.notion.so/API-1cfcaf5650aa80b6999bf3a2733a030f)
>
>
> [📜 사업기획팀 요구사항 정의서](https://www.notion.so/1cecaf5650aa80c1ae32ff4f2efff850)
>
>
> [📜 FE 요구사항 정의서](https://docs.google.com/document/d/1rmbJZBB7H0fK-2nM2vk_Fqd1gL9m1Rmp0jahHoRzJXg/edit?tab=t.0)
>
>
> [📜 BE 요구사항 정의서](https://docs.google.com/document/d/1DVcntERD_Ypr-7SBBtSy8bu_6zjl6Ka7e1It-mRyq0U/edit?tab=t.0)
>
>
> [📜 ERD](https://www.erdcloud.com/d/4Qn2DHKPTvoSmR9BQ)
>
>
> [📜 테이블 명세서](https://docs.google.com/spreadsheets/d/1MutR7L5QezUi0IUW9aGQy_QuUHMVsSGfpqtv0PHUV3s/edit?gid=0#gid=0)
>
> [📜 와이어프레임 및 화면정의서](https://www.figma.com/design/kcE3AdbnTxhmsYeaMLBWtH/1%ED%8C%80-%EC%82%AC%EB%B3%B8---%EC%8B%9C%EB%8B%88%EC%96%B4-%EB%82%B4%EC%9D%BC-%EC%99%80%EC%9D%B4%EC%96%B4%ED%94%84%EB%A0%88%EC%9E%84?node-id=92-5561&p=f&t=P4E3JUVuuh8WciXv-0))
Expand Down
7 changes: 4 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@
"type": "module",
"scripts": {
"dev": "next dev",
"build": "next build --no-lint",
"build": "next build",
"start": "next start",
"lint": "echo 'skipped lint check'",
"format": "prettier --write ."
"lint": "next lint",
"format": "prettier --write .",
"format:check": "prettier --check ."
},
"dependencies": {
"@auth/core": "^0.34.2",
Expand Down
2 changes: 1 addition & 1 deletion postcss.config.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ module.exports = {
"@tailwindcss/postcss": {},
autoprefixer: {},
},
}
};
1 change: 1 addition & 0 deletions src/api/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import type {
PhoneVerificationResponseDto,
VerifyCodeRequestDto,
VerifyCodeResponseDto,
UserProfileResponseDto,
} from "@/types/api/user";

export const userApi = {
Expand Down
10 changes: 5 additions & 5 deletions src/app/(auth)/auth/[type]/find-password/page.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
"use client";

import { useParams } from "next/navigation";
import UserFindPasswordForm from "@/features/auth-user/ui/login/UserFindPasswordForm";
import CompanyFindPasswordForm from "@/features/auth-company/ui/login/CompanyFindPasswordForm";
import UserFindPasswordForm from "@/features/auth-user/ui/login/UserFindPasswordForm";
import { useParams } from "next/navigation";

export default function FindPasswordPage() {
const params = useParams();
const type = params.type as "user" | "company";
const type = params.type as "normal" | "company";

if (type !== "user" && type !== "company") {
if (type !== "normal" && type !== "company") {
return null; // 또는 에러 페이지 컴포넌트
}

return <>{type === "user" ? <UserFindPasswordForm /> : <CompanyFindPasswordForm />}</>;
return <>{type === "normal" ? <UserFindPasswordForm /> : <CompanyFindPasswordForm />}</>;
}
12 changes: 10 additions & 2 deletions src/app/[type]/mypage/[userId]/edit/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { useSession } from "next-auth/react";
import useSWR from "swr";
import { fetcher } from "@/lib/fetcher";
import { API_ENDPOINTS } from "@/constants/apiEndPoints";
import { MOCK_COMPANY1, MOCK_USER1 } from "@/features/auth-common/mock/auth.mock";

const VALID_TYPES = ["normal", "company"] as const;

Expand Down Expand Up @@ -51,10 +52,17 @@ export default function InformationEditPage() {
return <p className="text-center text-red-500">잘못된 접근입니다. (userId mismatch)</p>;
}

// 2025.06.08) API 데이터를 사용하되 없을 경우 기본값 제공
return (
<>
{role === "company" && profile && <CompanyInformationEdit defaultValues={profile} />}
{role === "normal" && profile && <UserInformationEdit defaultValues={profile} />}
{role === "company" && (
<CompanyInformationEdit
defaultValues={(profile as typeof MOCK_COMPANY1) || MOCK_COMPANY1}
/>
)}
{role === "normal" && (
<UserInformationEdit defaultValues={(profile as typeof MOCK_USER1) || MOCK_USER1} />
)}
</>
);
}
82 changes: 77 additions & 5 deletions src/app/[type]/mypage/[userId]/resume/[resumeId]/edit/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,49 @@ import { resumeApi } from "@/api/resume";
import type { ResumeResponseDto } from "@/types/api/resume";
import type { ResumeFormData } from "@/features/resume/validation/resumeSchema";

const ErrorCard = ({
title,
message,
onRetry,
showRetry = true,
actionButton,
}: {
title: string;
message: string;
onRetry?: () => void;
showRetry?: boolean;
actionButton?: React.ReactNode;
}) => (
<div className="flex justify-center items-center flex-1">
<div className="bg-white rounded-lg shadow-md px-10 py-[80px] w-full max-w-[1000px]">
<div className="flex flex-col items-center justify-center space-y-6">
<div className="bg-red-50 border border-red-200 rounded-lg p-8 max-w-md text-center">
<div className="text-red-600 text-5xl mb-4">⚠️</div>
<h2 className="text-xl font-semibold text-red-700 mb-3">{title}</h2>
<p className="text-red-600 mb-6">{message}</p>

<div className="flex flex-col gap-3">
{showRetry && onRetry && (
<button
onClick={onRetry}
className="px-4 py-2 bg-red-600 text-white rounded-md hover:bg-red-700 transition-colors"
>
다시 시도
</button>
)}
{actionButton}
</div>
</div>
</div>
</div>
</div>
);

export default function ResumeEditPage() {
const router = useRouter();
const { data: session, status: sessionStatus } = useSession();
const { userId, resumeId } = useParams() as {
const { type, userId, resumeId } = useParams() as {
type: string;
userId: string;
resumeId: string;
};
Expand All @@ -33,6 +72,7 @@ export default function ResumeEditPage() {
data: detailData,
isLoading: isDetailLoading,
error: detailError,
refetch: refetchDetail,
} = useQuery<ResumeResponseDto, Error>({
queryKey: ["resumeDetail", resumeId],
queryFn: () => resumeApi.getDetail(resumeId!, session?.accessToken ?? ""),
Expand All @@ -42,17 +82,49 @@ export default function ResumeEditPage() {
if (sessionStatus === "loading" || isDetailLoading) {
return <Spinner />;
}

if (detailError) {
return <p className="text-red-500">이력서 불러오기 실패: {detailError.message}</p>;
// 확인요망
const getErrorMessage = (error: Error) => {
if (error.message.includes("404")) {
return "존재하지 않는 이력서이거나 삭제된 이력서입니다.";
}
if (error.message.includes("403")) {
return "이 이력서를 수정할 권한이 없습니다.";
}
return "이력서를 불러오는 중 문제가 발생했습니다. 네트워크 연결을 확인해주세요.";
};

return (
<ErrorCard
title="이력서를 불러올 수 없습니다"
message={getErrorMessage(detailError)}
onRetry={refetchDetail}
actionButton={
<div className="flex flex-col gap-2">
<button
onClick={() => router.push(`/${type}/mypage/${userId}`)}
className="px-4 py-2 bg-gray-500 text-white rounded-md hover:bg-gray-600 transition-colors"
>
마이페이지로 이동
</button>
<button
onClick={() => router.back()}
className="px-4 py-2 bg-primary text-white rounded-md hover:bg-primary/90 transition-colors"
>
이전 페이지로
</button>
</div>
}
/>
);
}

const dto = detailData!.resume;
// 2025.06.08)불필요한 name, phone, email 속성 제거하여 타입 에러 해결
const defaultValues: ResumeFormData = {
jobCategory: dto.job_category,
title: dto.resume_title,
name: dto.user.name,
phone: dto.user.phone_number,
email: session!.user.email ?? "",
schoolType: dto.education_level,
schoolName: dto.school_name,
graduationStatus: dto.education_state,
Expand Down
Loading