iT邦幫忙

2025 iThome 鐵人賽

DAY 19
0
佛心分享-SideProject30

最近的工程師真沒用系列 第 19

第十九天-註冊登入登出前後端串接

  • 分享至 

  • xImage
  •  

svelte 接後端還挺簡單的,只要這樣寫就可以惹,綁定變數
bind:value

<script>
	const userPattern = '[A-Za-z][A-Za-z0-9\\-]*';
	const passwordPattern = '(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,}';
	let username = '';
	let password = '';
	let showModal = false;
	let registerTitle = '';

	let registerMsg = '';
	async function register() {
		const res = await fetch('/api/register', {
			method: 'POST',
			headers: { 'Content-Type': 'application/json' },
			body: JSON.stringify({ username, password })
		});

		const data = await res.json();
		console.log(data);
		if (res.ok) {
			registerTitle = '🎉 恭喜!';
			registerMsg = '註冊成功!';
		} else {
			registerTitle = '';
			registerMsg = '註冊失敗!';
		}
		showModal = true;
	}

	async function login() {
		const res = await fetch('/api/login', {
			method: 'POST',
			headers: { 'Content-Type': 'application/json' },
			body: JSON.stringify({ username, password })
		});
		console.log(await res.json());
	}
	function confirmSuccess() {
		showModal = false;
		registerTitle = '';
		registerMsg = '';
		location.reload(); // 模擬 F5
	}
</script>

<div class="min-h-screen flex justify-center items-center bg-base-200 px-4">
	{#if showModal}
		<dialog class="modal modal-open">
			<div class="modal-box">
				<h3 class="font-bold text-lg">{registerTitle}</h3>
				<p class="py-4">{registerMsg}</p>
				<div class="modal-action">
					<button class="btn btn-primary" on:click={confirmSuccess}>OK</button>
				</div>
			</div>
		</dialog>
	{/if}
	<div class="card bg-base-100 shadow-xl p-8 w-full max-w-md">
		<h2 class="text-2xl font-bold text-center mb-6">Login</h2>

		<!-- Username -->
		<label class="input input-bordered flex items-center gap-2 mb-4 w-full">
			<svg
				class="h-5 w-5 opacity-50"
				xmlns="http://www.w3.org/2000/svg"
				fill="none"
				stroke="currentColor"
				stroke-width="2"
				viewBox="0 0 24 24"
			>
				<path
					stroke-linecap="round"
					stroke-linejoin="round"
					d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"
				/>
				<circle cx="12" cy="7" r="4"></circle>
			</svg>
			<input
				type="text"
				required
				bind:value={username}
				placeholder="Username"
				pattern={userPattern}
				minlength="3"
				maxlength="30"
				title="Only letters, numbers or dash"
				class="grow"
			/>
		</label>
		<p class="text-sm text-gray-500 mb-4">
			Must be 3 to 30 characters, only letters, numbers or dash
		</p>

		<!-- Password -->
		<label class="input input-bordered flex items-center gap-2 mb-4 w-full">
			<svg
				class="h-5 w-5 opacity-50"
				xmlns="http://www.w3.org/2000/svg"
				fill="none"
				stroke="currentColor"
				stroke-width="2"
				viewBox="0 0 24 24"
			>
				<path
					stroke-linecap="round"
					stroke-linejoin="round"
					d="M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z"
				/>
				<circle cx="16.5" cy="7.5" r=".5" fill="currentColor"></circle>
			</svg>
			<input
				type="password"
				required
				bind:value={password}
				placeholder="Password"
				minlength="8"
				pattern={passwordPattern}
				title="Must be more than 8 characters, including number, lowercase letter, uppercase letter"
				class="grow"
			/>
		</label>
		<p class="text-sm text-gray-500 mb-6">
			Must be at least 8 characters, include number, lowercase and uppercase
		</p>

		<!-- Submit Button -->
		<button class="btn btn-primary w-full" on:click={login}>Login</button>
		<button class="btn btn-accent w-full" on:click={register}>Register</button>
	</div>
</div>

然後按鈕觸發 function 可以用
on:click={方法名稱}

但是現在還有一個問題是,登入失敗,API 有回傳錯誤訊息了,但是前端畫面沒有東西,沒有提示使用者現在要幹嘛

今天的情緒抒發:
都快 20 天,我還沒進入到 cloudflare
/images/emoticon/emoticon02.gif
我的餅畫太大了


上一篇
第十八天-註冊登入登出後端實作
系列文
最近的工程師真沒用19
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言