Merge branch 'dev' into main
Deploy / deploy (push) Failing after 12m39s
CI / build (push) Failing after 13m52s

This commit is contained in:
ByungCheol
2026-05-31 21:47:05 +09:00
3 changed files with 28 additions and 12 deletions
+6 -7
View File
@@ -1,11 +1,10 @@
# 앱(Capacitor) 빌드 전용 환경변수 — `vite build --mode capacitor` 가 로드합니다. # 앱(Capacitor) 빌드 전용 환경변수 — `vite build --mode capacitor` 가 로드합니다.
# 앱 안에서는 상대경로(/api)가 서버로 가지 않으므로 백엔드 절대 URL 을 지정해야 합니다. # 앱 안에서는 상대경로(/api)가 서버로 가지 않으므로 백엔드 절대 URL 을 지정해야 합니다.
# #
# [로컬 + 에뮬레이터 테스트] 에뮬레이터에서 10.0.2.2 = PC의 localhost # [운영 서버 HTTPS] app.sblog.kr 의 /api 를 Nginx 가 백엔드로 프록시
VITE_API_BASE_URL=http://10.0.2.2:8080/api VITE_API_BASE_URL=https://app.sblog.kr/api
# #
# [실기기 테스트] 같은 Wi-Fi 의 PC LAN IP 로 (예) # [로컬 PC + 실기기] 같은 Wi-Fi
# VITE_API_BASE_URL=http://192.168.0.10:8080/api # VITE_API_BASE_URL=http://172.30.1.43:8080/api
# # [에뮬레이터]
# [배포 서버(HTTPS)] 운영 시 # VITE_API_BASE_URL=http://10.0.2.2:8080/api
# VITE_API_BASE_URL=https://yourdomain.com/api
+20 -3
View File
@@ -13,17 +13,18 @@ function goSignup() {
ui.openSignup() ui.openSignup()
} }
const form = reactive({ loginId: '', password: '' }) const form = reactive({ loginId: '', password: '', rememberMe: true })
const loading = ref(false) const loading = ref(false)
const error = ref(null) const error = ref(null)
// 팝업이 열릴 때마다 입력값 초기화 // 팝업이 열릴 때마다 입력값 초기화 (로그인 상태 유지는 기본 켜둠)
watch( watch(
() => ui.loginOpen, () => ui.loginOpen,
(open) => { (open) => {
if (open) { if (open) {
form.loginId = '' form.loginId = ''
form.password = '' form.password = ''
form.rememberMe = true
error.value = null error.value = null
} }
}, },
@@ -37,7 +38,7 @@ async function handleLogin() {
} }
loading.value = true loading.value = true
try { try {
await auth.login(form.loginId, form.password) await auth.login(form.loginId, form.password, form.rememberMe)
const redirect = ui.redirectPath const redirect = ui.redirectPath
ui.closeLogin() ui.closeLogin()
if (redirect) router.push(redirect) if (redirect) router.push(redirect)
@@ -71,6 +72,10 @@ onUnmounted(() => window.removeEventListener('keydown', onKeydown))
<form class="form" @submit.prevent="handleLogin"> <form class="form" @submit.prevent="handleLogin">
<input v-model="form.loginId" type="text" placeholder="아이디" autocomplete="username" :disabled="loading" /> <input v-model="form.loginId" type="text" placeholder="아이디" autocomplete="username" :disabled="loading" />
<input v-model="form.password" type="password" placeholder="비밀번호" autocomplete="current-password" :disabled="loading" /> <input v-model="form.password" type="password" placeholder="비밀번호" autocomplete="current-password" :disabled="loading" />
<label class="remember">
<input v-model="form.rememberMe" type="checkbox" :disabled="loading" />
로그인 상태 유지
</label>
<button class="submit" type="submit" :disabled="loading">{{ loading ? '로그인 중...' : '로그인' }}</button> <button class="submit" type="submit" :disabled="loading">{{ loading ? '로그인 중...' : '로그인' }}</button>
</form> </form>
@@ -141,6 +146,18 @@ h2 {
background: var(--color-background-soft); background: var(--color-background-soft);
color: var(--color-text); color: var(--color-text);
} }
.remember {
display: flex;
align-items: center;
gap: 0.4rem;
font-size: 0.88rem;
cursor: pointer;
}
.remember input {
width: auto;
padding: 0;
cursor: pointer;
}
.submit, .submit,
.naver { .naver {
padding: 0.6rem 1rem; padding: 0.6rem 1rem;
+2 -2
View File
@@ -20,8 +20,8 @@ export const useAuthStore = defineStore('auth', () => {
else localStorage.removeItem(USER_KEY) else localStorage.removeItem(USER_KEY)
} }
async function login(loginId, password) { async function login(loginId, password, rememberMe = false) {
const res = await authApi.login({ loginId, password }) const res = await authApi.login({ loginId, password, rememberMe })
token.value = res.token token.value = res.token
user.value = res.member user.value = res.member
persist() persist()