sprint day2

1.项目预期任务量:15天
2.已花费时间:7天
3.剩余时间:8天
任务看板:

SCRUM会议照片:

产品状态:
课程管理模块完成
根据不同角色显示不同功能按钮
功能演示:



代码:

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>课程管理系统</title>
    <style>
        /* 整体页面样式 */
        body {
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 0;
            display: flex;
            min-height: 100vh;
        }

        /* 左侧导航栏样式 */
        .sidebar {
            width: 200px;
            background-color: #f4f4f4;
            padding: 20px;
            display: flex;
            flex-direction: column;
        }

        .sidebar button {
            margin-bottom: 10px;
            padding: 10px;
            border: none;
            border-radius: 4px;
            background-color: #4a90e2;
            color: white;
            cursor: pointer;
        }

        /* 右侧内容区域样式 */
        .main-content {
            flex: 1;
            display: flex;
            flex-direction: column;
        }

        /* 顶部角色栏样式 */
        .role-bar {
            display: flex;
            justify-content: space-between;
            align-items: center;
            padding: 10px 20px;
            background-color: #f8f9fa;
            border-bottom: 1px solid #ddd;
        }

        /* 角色栏中登录信息样式 */
        .login-info {
            font-size: 14px;
        }

        /* 角色栏中退出登录按钮样式 */
        .logout-btn {
            background-color: #ff4444;
            color: white;
            border: none;
            padding: 8px 16px;
            border-radius: 4px;
            cursor: pointer;
        }

        /* 课程信息表格样式 */
        .course-table {
            width: 100%;
            border-collapse: collapse;
            margin-top: 15px;
        }

        .course-table th,
        .course-table td {
            padding: 12px;
            text-align: left;
            border: 1px solid #ddd;
        }

        .course-table th {
            background-color: #f8f9fa;
            font-weight: 600;
        }

        /* 操作按钮样式 */
        .action-btn {
            padding: 6px 12px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            font-size: 12px;
            margin-right: 5px;
        }

        .online-btn {
            background-color: #4CAF50;
            color: white;
        }

        .offline-btn {
            background-color: #FF5733;
            color: white;
        }

        .delete-btn {
            background-color: #ff4444;
            color: white;
        }

        /* 表单容器样式 */
        .form-container {
            width: 100%;
            max-width: 500px;
            background-color: #f9fafb;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
            margin: 0 auto;
        }

        /* 表单组样式 */
        .form-group {
            margin-bottom: 15px;
        }

        /* 输入框样式 */
        input[type="text"],
        input[type="number"],
        textarea,
        select {
            width: 100%;
            padding: 10px;
            border: 1px solid #ddd;
            border-radius: 4px;
            box-sizing: border-box;
        }

        /* 按钮样式 */
        button {
            background-color: #4a90e2;
            color: white;
            padding: 10px 20px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            margin-top: 15px;
        }

        /* 隐藏元素 */
        [style*="display: none"] {
            display: none !important;
        }
    </style>
</head>

<body>
<!-- 左侧导航栏 -->
<div class="sidebar">
    <button id="browseCourseBtn" onclick="goToHomePage()">课程浏览</button>
    <button id="addCourseBtn" onclick="showAddCourseForm()">添加课程</button>
    <button id="queryCourseBtn" onclick="toggleSearchBox()">查询课程</button>
</div>

<!-- 右侧内容区域 -->
<div class="main-content">
    <!-- 顶部角色栏 -->
    <div class="role-bar">
        <div class="login-info" id="loginInfo"></div>
        <button class="logout-btn" onclick="logout()">退出登录</button>
    </div>

    <!-- 搜索框容器 -->
    <div id="searchBoxContainer" style="display: none;">
        <input type="text" class="search-input" id="searchInput" placeholder="搜索课程名称...">
        <button class="function-btn" onclick="searchCourse()">查询</button>
    </div>

    <!-- 课程表格容器 -->
    <div id="courseTableContainer">
        <table class="course-table" id="courseTable">
            <thead>
            <tr>
                <th>课程名称</th>
                <th>课程类型</th>
                <th>任课教师</th>
                <th>课程时长</th>
                <th>课程状态</th>
                <th>操作</th>
            </tr>
            </thead>
            <tbody id="courseBody"></tbody>
        </table>
    </div>

    <!-- 添加课程表单容器 -->
    <div id="addCourseFormContainer" style="display: none;">
        <h2 class="mb-4">添加课程信息</h2>
        <div class="form-container">
            <form id="courseForm" action="/addcourse" method="post"> <!-- POST 请求 -->
                <div class="form-group">
                    <label for="name">课程名称</label>
                    <input type="text" id="name" name="name" placeholder="请输入课程名称" required>
                </div>
                <div class="form-group">
                    <label for="type">课程类型</label>
                    <input type="text" id="type" name="type" placeholder="请输入课程类型">
                </div>
                <div class="form-group">
                    <label for="description">课程简介</label>
                    <textarea id="description" name="description" rows="4" placeholder="请输入课程简介"></textarea>
                </div>
                <div class="form-group">
                    <label for="duration">课程时长</label>
                    <input type="number" id="duration" name="duration" placeholder="请输入课程时长">
                </div>
                <div class="form-group">
                    <label for="instructor">任课教师</label>
                    <input type="text" id="instructor" name="instructor" placeholder="请输入任课教师">
                </div>
                <div class="form-group">
                    <label for="coursestatus">课程状态</label>
                    <select id="coursestatus" name="coursestatus">
                        <option value="待核审">待核审</option>
                        <option value="上线">上线</option>
                        <option value="下线">下线</option>
                    </select>
                </div>
                <div class="button-group">
                    <button type="submit">提交课程信息</button>
                    <button type="button" onclick="hideAddCourseForm()">返回</button>
                </div>
            </form>
        </div>
    </div>

    <!-- 修改课程表单容器 -->
    <div id="editCourseFormContainer" style="display: none;">
        <h2 class="mb-4">修改课程信息</h2>
        <div class="form-container">
            <form id="editCourseForm" action="/updatecourse" method="post">
                <input type="hidden" id="editCourseId" name="id">
                <div class="form-group">
                    <label for="editName">课程名称</label>
                    <input type="text" id="editName" name="name" placeholder="请输入课程名称" required>
                </div>
                <div class="form-group">
                    <label for="editType">课程类型</label>
                    <input type="text" id="editType" name="type" placeholder="请输入课程类型">
                </div>
                <div class="form-group">
                    <label for="editDescription">课程简介</label>
                    <textarea id="editDescription" name="description" rows="4" placeholder="请输入课程简介"></textarea>
                </div>
                <div class="form-group">
                    <label for="editDuration">课程时长</label>
                    <input type="number" id="editDuration" name="duration" placeholder="请输入课程时长">
                </div>
                <div class="form-group">
                    <label for="editInstructor">任课教师</label>
                    <input type="text" id="editInstructor" name="instructor" placeholder="请输入任课教师">
                </div>
                <div class="form-group">
                    <label for="editCoursestatus">课程状态</label>
                    <select id="editCoursestatus" name="coursestatus">
                        <option value="待核审">待核审</option>
                        <option value="上线">上线</option>
                        <option value="下线">下线</option>
                    </select>
                </div>
                <div class="button-group">
                    <button type="submit">提交修改信息</button>
                    <button type="button" onclick="hideEditCourseForm()">返回</button>
                </div>
            </form>
        </div>
    </div>
</div>

<script>
    let allCourses = [];
    let currentRole;

    // 页面加载时初始化
    window.addEventListener("load", () => {
        const urlParams = new URLSearchParams(window.location.search);
        const userData = {};
        urlParams.forEach((value, key) => {
            try {
                userData[key] = JSON.parse(value);
            } catch (error) {
                userData[key] = value;
            }
        });

        const username = userData.username;
        const name = userData.name;
        currentRole = userData.role;

        if (username && name && currentRole) {
            document.getElementById('loginInfo').textContent =
                `欢迎,${username}(姓名:${name},角色:${currentRole})`;
            // 隐藏学生的添加课程按钮
            if (currentRole === '学生') {
                document.getElementById('addCourseBtn').style.display = 'none';
            }
        }
        fetchCourses();

        // 监听添加课程表单提交事件
        const courseForm = document.getElementById('courseForm');
        courseForm.addEventListener('submit', function (e) {
            e.preventDefault();
            const formData = new FormData(courseForm);
            fetch('/addcourse', {
                method: 'POST',
                body: formData
            })
                .then(response => {
                    if (response.ok) {
                        alert('课程添加成功');
                        hideAddCourseForm();
                        fetchCourses();
                    } else {
                        alert('课程添加失败');
                    }
                })
                .catch(error => {
                    console.error('添加课程时出错:', error);
                    alert('添加课程时出现错误,请稍后重试');
                });
        });

        // 监听修改课程表单提交事件
        const editCourseForm = document.getElementById('editCourseForm');
        editCourseForm.addEventListener('submit', function (e) {
            e.preventDefault();
            const formData = new FormData(editCourseForm);
            fetch('/updatecourse', {
                method: 'POST',
                body: formData
            })
                .then(response => {
                    if (response.ok) {
                        alert('课程修改成功');
                        hideEditCourseForm();
                        fetchCourses();
                    } else {
                        alert('课程修改失败');
                    }
                })
                .catch(error => {
                    console.error('修改课程时出错:', error);
                    alert('修改课程时出现错误,请稍后重试');
                });
        });
    });

    // 获取课程数据并过滤
    function fetchCourses() {
        fetch('/select')
            .then(res => res.json())
            .then(data => {
                let filtered = data;
                // 角色过滤逻辑
                if (currentRole === '学生') {
                    filtered = data.filter(c => c.coursestatus === '上线');
                } else if (currentRole === '教师') {
                    filtered = data.filter(c => c.coursestatus !== '下线');
                }
                allCourses = filtered;
                renderCourses(filtered);
            })
            .catch(err => console.error('数据获取失败:', err));
    }

    // 渲染课程表格
    function renderCourses(courses) {
        const tbody = document.getElementById('courseBody');
        tbody.innerHTML = '';
        courses.forEach(course => {
            const row = document.createElement('tr');
            const actions = getActionButtons(course);
            row.innerHTML = `
                    <td>${course.name}</td>
                    <td>${course.type}</td>
                    <td>${course.instructor}</td>
                    <td>${course.duration}</td>
                    <td>${course.coursestatus}</td>
                    <td>${actions}</td>
                `;
            tbody.appendChild(row);
        });
    }

    // 根据角色生成操作按钮
    function getActionButtons(course) {
        if (currentRole === '管理员') {
            return `
                    <button class="action-btn online-btn"
                        onclick="updateCourseStatus(${course.id}, '上线')">上线</button>
                    <button class="action-btn offline-btn"
                        onclick="updateCourseStatus(${course.id}, '下线')">下线</button>
                    <button class="delete-btn"
                        onclick="deleteCourse(${course.id})">删除</button>
                    <button class="action-btn"
                        onclick="handleFileUpload(${course.id}, '${course.name}')">上传文件</button>
                    <a href="/download/${course.name}" class="action-btn" download>下载文件</a>
                    <button class="action-btn"
                        onclick="showEditCourseForm(${course.id})">修改</button>
                `;
        } else if (currentRole === '教师') {
            return `
                    <button class="action-btn"
                        onclick="handleFileUpload(${course.id}, '${course.name}')">上传文件</button>
                    <a href="/download/${course.name}" class="action-btn" download>下载文件</a>
                    <button class="action-btn"
                        onclick="showEditCourseForm(${course.id})">修改</button>
                `;
        } else if (currentRole === '学生') {
            return `
                    <a href="/download/${course.name}" class="action-btn" download>下载文件</a>
                `;
        }
        return '';
    }

    // 文件上传处理
    function handleFileUpload(courseId, courseName) {
        const input = document.createElement('input');
        input.type = 'file';
        input.accept = '*/*';
        input.onchange = e => {
            const file = e.target.files[0];
            if (!file) return;
            const formData = new FormData();
            formData.append('file', file);
            formData.append('courseName', courseName);
            formData.append('courseId', courseId); // 添加课程 id
            fetch('/upload', { method: 'POST', body: formData })
                .then(res => res.text())
                .then(res => {
                    if (res === 'success') {
                        alert('上传成功');
                        // 可以在这里添加根据 id 更新数据的逻辑,例如重新获取课程数据
                        fetchCourses();
                    } else {
                        alert('上传失败');
                    }
                })
                .catch(error => {
                    console.error('文件上传错误:', error);
                    alert('文件上传过程中出现错误');
                });
        };
        input.click();
    }

    // 课程状态更新
    function updateCourseStatus(courseId, status) {
        if (confirm(`确认将课程状态改为 ${status}?`)) {
            fetch(`/updatecoursestatus?id=${courseId}&coursestatus=${status}`)
                .then(res => res.ok ? fetchCourses() : alert('操作失败'));
        }
    }

    // 删除课程
    function deleteCourse(courseId) {
        if (confirm('确认删除该课程?')) {
            fetch(`/deletecourse?id=${courseId}`)
                .then(res => res.ok ? fetchCourses() : alert('删除失败'));
        }
    }

    // 显示添加课程表单
    function showAddCourseForm() {
        document.getElementById('courseTableContainer').style.display = 'none';
        document.getElementById('addCourseFormContainer').style.display = 'block';
    }

    // 隐藏添加课程表单
    function hideAddCourseForm() {
        document.getElementById('addCourseFormContainer').style.display = 'none';
        document.getElementById('courseTableContainer').style.display = 'block';
    }

    // 显示修改课程表单
    function showEditCourseForm(courseId) {
        const course = allCourses.find(c => c.id === courseId);
        if (course) {
            document.getElementById('editCourseId').value = course.id;
            document.getElementById('editName').value = course.name;
            document.getElementById('editType').value = course.type;
            document.getElementById('editDescription').value = course.description;
            document.getElementById('editDuration').value = course.duration;
            document.getElementById('editInstructor').value = course.instructor;
            document.getElementById('editCoursestatus').value = course.coursestatus;

            document.getElementById('courseTableContainer').style.display = 'none';
            document.getElementById('editCourseFormContainer').style.display = 'block';
        }
    }

    // 隐藏修改课程表单
    function hideEditCourseForm() {
        document.getElementById('editCourseFormContainer').style.display = 'none';
        document.getElementById('courseTableContainer').style.display = 'block';
    }

    // 退出登录
    function logout() {
        window.location.href = 'login.html';
    }

    // 搜索功能(预留接口)
    function searchCourse() {
        const keyword = document.getElementById('searchInput').value.trim();
        // 这里添加搜索逻辑,当前示例未实现
        fetchCourses(); // 简单刷新,实际需带搜索参数
    }

    // 回到首页
    function goToHomePage() {
        document.getElementById('searchBoxContainer').style.display = 'none';
        hideAddCourseForm();
        hideEditCourseForm();
        document.getElementById('searchInput').value = '';
        fetchCourses();
    }

    // 切换搜索框
    function toggleSearchBox() {
        const searchBox = document.getElementById('searchBoxContainer');
        searchBox.style.display = searchBox.style.display === 'none' ? 'block' : 'none';
        hideAddCourseForm();
        hideEditCourseForm();
    }
</script>
</body>

</html>

posted @ 2025-04-19 22:59  她会回来对不队  阅读(18)  评论(0)    收藏  举报