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号