Index.dml是主页面,显示一个用Bootstrap5编写的登录界面。
模型的路径:src\main\resources\org\xworker\web\Index.dml。模型XML作为文本编辑,但一般建议使用模型编辑器来编辑。
<?xml version="1.0" encoding="utf-8"?> <SimpleControl name="Index" th_createTime="1757227503320" descriptors="xworker.web.controls.SimpleControl" mappingPath="/"> <view title="欢迎来到XWorker"> <code name="style" _xmeta_id_="code" appendTo="head"> <code><![CDATA[<style> body { background: linear-gradient(135deg, #6a11cb 0%, #2575fc 100%); height: 100vh; display: flex; align-items: center; justify-content: center; } .login-card { border-radius: 15px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); overflow: hidden; width: 100%; max-width: 400px; } .card-header { background: #fff; border-bottom: none; padding: 2rem 1rem 1rem; text-align: center; } .card-body { padding: 2rem; } .form-control { padding: 0.75rem 1rem; border-radius: 0.5rem; } .input-group-text { background: transparent; border-right: none; } .form-control:focus { box-shadow: none; border-color: #6a11cb; } .btn-login { background: linear-gradient(135deg, #6a11cb 0%, #2575fc 100%); border: none; padding: 0.75rem; border-radius: 0.5rem; font-weight: 600; } .divider { display: flex; align-items: center; margin: 1.5rem 0; } .divider::before, .divider::after { content: ""; flex: 1; border-bottom: 1px solid #ddd; } .divider span { padding: 0 1rem; color: #777; } </style>]]></code> </code> <bootstrap5 descriptors="xworker.bootstrap.v5.Bootstrap5"> <code name="code"> <code><![CDATA[<div class="container"> <div class="row justify-content-center"> <div class="col-12 col-md-8 col-lg-6"> <div class="card login-card"> <div class="card-header"> <h2 class="mb-3 fw-bold">欢迎来到XWorker</h2> <p class="text-muted">请输入您的账号信息登录系统</p> </div> <div class="card-body"> <form id="loginForm"> <div class="mb-3"> <label for="username" class="form-label">用户名</label> <div class="input-group"> <span class="input-group-text"><i class="bi bi-person"></i></span> <input type="text" class="form-control" id="username" name="username" placeholder="请输入用户名" required> </div> </div> <div class="mb-4"> <label for="password" class="form-label">密码</label> <div class="input-group"> <span class="input-group-text"><i class="bi bi-lock"></i></span> <input type="password" class="form-control" id="password" name="password" placeholder="请输入密码" required> </div> </div> <div class="mb-3 form-check"> <input type="checkbox" class="form-check-input" id="rememberMe"> <label class="form-check-label" for="rememberMe">记住我</label> <a href="#" class="float-end text-decoration-none">忘记密码?</a> </div> <div class="d-grid gap-2"> <button type="submit" class="btn btn-primary btn-login">登录</button> </div> </form> </div> <div class="card-footer text-center py-3"> <p class="mb-0">还没有账号? <a href="#" class="text-decoration-none">立即注册</a></p> </div> </div> </div> </div> </div> <div class="position-fixed bottom-0 end-0 p-3"> <div id="liveToast" class="toast hide" role="alert" aria-live="assertive" aria-atomic="true"> <div class="toast-header"> 登录 <button type="button" class="btn-close" data-bs-dismiss="toast"></button> </div> <div class="toast-body"> 登录成功,欢迎:<span id="userNameSpan"></span> </div> </div> </div>]]></code> </code> </bootstrap5> <code name="script" appendTo="bottom"> <code><![CDATA[<script> // 初始化Toast const toastEl = document.getElementById('liveToast'); const toast = new bootstrap.Toast(toastEl, { delay: 3000 }); // 表单验证和提交 document.getElementById('loginForm').addEventListener('submit', async function(event) { event.preventDefault(); // 简单的表单验证 const username = document.getElementById('username').value; const password = document.getElementById('password').value; if (!username || !password) { alert('请填写用户名和密码'); return; } // 显示加载状态 const submitBtn = this.querySelector('button[type="submit"]'); const originalText = submitBtn.innerHTML; submitBtn.innerHTML = '<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> 登录中...'; submitBtn.disabled = true; try { // 发送POST请求到API const response = await fetch('${(request.contextPath)?if_exists}/api/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username: username, password: password }) }); // 解析JSON响应 const data = await response.json(); if (data.success) { // 登录成功 document.getElementById('userNameSpan').html = data.userName; toast.show(); // 在实际应用中,这里可以跳转到其他页面或执行其他操作 // window.location.href = '/dashboard'; } else { // 登录失败 alert('登录失败,请检查用户名和密码'); } } catch (error) { console.error('登录请求错误:', error); alert('登录请求失败,请稍后重试'); } finally { // 恢复按钮状态 submitBtn.innerHTML = originalText; submitBtn.disabled = false; } }); </script>]]></code> </code> </view> <result name="success" value="org.xworker.web.Index/@view"></result> </SimpleControl>
Copyright © 2007-2019 XWorker.org 版权所有 沪ICP备08000575号