第六章作业---1.7

本文详细介绍了如何在Linux系统中设置不同目录的权限,包括公共目录/pub、生产部目录/sc、财务部目录/cw以及admin用户的特殊权限。同时,阐述了如何创建/test/data目录并赋予it组内用户写权限,以及设置临时目录/tmp/cat以便普通用户查看/etc/shadow文件。最后,讨论了在/test/dir目录下如何利用ACL实现文件自动归属及不同用户组的访问权限控制。

1、新建目录要求如下:

1)/pub目录为公共存储目录对所有用户可以读,写,执行,但用户只能删除属于自己的文件(t权限)

mkdir     /pub---创建目录

chmod   777   /pub---所有用户都有读,写,执行权限

chmod   o+t   /pub---其他用户只能删除自创文件

2)/sc目录为生产部存储目录只能对生产部人员可以写入,并且生产部人员所建立的文件都自动归属到shengchan中

mkdir   /sc---创建目录

chown   :shengchan   /sc---更改组

chmod   2770   /sc---2:自动归属到组;7:拥有者;7:组中用户

3)/cw目录为财务部存储目录只能对财务部人员可以写入并且财务部人员所建立的文件都自动属于caiwu组中

mkdir   /cw

chmod   2770   /cw

chgrp   caiwu   /cw

4) admin用户对于/sc和/cw目录可以读,写,执行(ACL)

useradd   admin---创建用户

setfacl   -m   u:admin:rwx    /cw    /sc

getfacl   /sc /cw---查看目录权限

2、设置特殊权限,要求如下:

1)创建目录/test/data,让it组内普通用户对其有写权限,且创建的所有文件的属组为目录所属的组,此外,每个用户仅能删除自己的文件

mkdir   -p   /test/data---快速创建

groupadd    it

chown   :it   /test/data

chmod    o+t   /test/data---只能删除自创文件

chmod   g+ws   /test/data---给写权限;自动归属到组

2)让普通用户能使用/tmp/cat去查看/etc/shadow文件

chmod   u+s   /test/data

3、设置ACL权限,要求如下:

在/test/dir里创建的新文件自动属于webs组,

mkdir  -p   /test/dir

groupadd   webs

chmod   g+s   /test/dir

chown   :webs   /test/dir

组apps的成员如:tomcat能对这些新文件有读写权限,

setfacl   -m   u:tomcat:rx   /test/dir

组dbs的成员如:mysql只能对新文件有读权限,

setfacl   -m   u:mysql:r   /test/dir

其它用户(不属于webs,apps,dbs)不能访问这个文件夹。

chmod   o=    /test/dir

以下是一个**作业与考试管理界面**的完整前端实现,适用于教师发布、管理作业和考试任务。该界面具备以下功能: - 添加作业/考试 - 设置截止时间、类型、描述 - 列表展示并支持状态标记(未开始 / 进行中 / 已截止) - 支持删除与查看操作 - 使用本地存储(`localStorage`)持久化数据 - 响应式设计,无外部图片依赖 - 界面简洁清晰,适合教学管理系统使用 --- ```html <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <title>作业与考试管理系统</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f5f7fb; color: #333; line-height: 1.7; } .container { width: 100%; max-width: 1000px; margin: 40px auto; padding: 20px; } header { text-align: center; margin-bottom: 30px; } h1 { color: #4a4a9e; font-size: 30px; } p { color: #666; } /* 表单区域 */ .form-group { display: flex; gap: 12px; margin-bottom: 20px; flex-wrap: wrap; } .form-group input, .form-group select, .form-group button { padding: 12px; border: 1px solid #ddd; border-radius: 6px; font-size: 14px; } .form-group input[type="text"] { flex: 2; min-width: 200px; } .form-group input[type="date"] { flex: 1; min-width: 130px; } .form-group select { flex: 1; min-width: 120px; } .btn-add { background-color: #667eea; color: white; border: none; cursor: pointer; width: 100px; } .btn-add:hover { background-color: #5a46a7; } /* 搜索与筛选 */ .filters { display: flex; gap: 12px; margin-bottom: 25px; flex-wrap: wrap; } .filters input, .filters select { flex: 1; min-width: 180px; padding: 10px; border: 1px solid #ddd; border-radius: 6px; font-size: 14px; } /* 任务列表 */ .tasks-list { list-style: none; } .task-item { background: white; border-radius: 10px; box-shadow: 0 3px 10px rgba(0, 0, 0, 0.08); padding: 16px; margin-bottom: 14px; transition: transform 0.2s; } .task-item:hover { transform: translateY(-3px); } .task-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 8px; } .task-title { font-weight: bold; font-size: 18px; color: #333; } .task-type { padding: 4px 10px; border-radius: 12px; font-size: 12px; color: white; background-color: #764ba2; } .task-body { margin-bottom: 10px; color: #666; } .task-meta { display: flex; gap: 15px; font-size: 13px; color: #888; } .task-meta span { display: flex; align-items: center; gap: 4px; } .task-actions { display: flex; gap: 10px; margin-top: 10px; } .btn { padding: 6px 10px; border: none; border-radius: 6px; font-size: 13px; cursor: pointer; } .btn-view { background-color: #4caf50; color: white; } .btn-delete { background-color: #e74c3c; color: white; } .btn:hover { opacity: 0.9; } .status { font-size: 13px; padding: 4px 8px; border-radius: 6px; margin-left: 10px; } .status.pending { background-color: #ffeb3b; color: #333; } .status.active { background-color: #2196f3; color: white; } .status.expired { background-color: #f44336; color: white; } .empty-message { text-align: center; padding: 30px; color: #999; font-style: italic; } @media (max-width: 768px) { .form-group, .filters { flex-direction: column; align-items: stretch; } .task-header, .task-meta { flex-direction: column; align-items: flex-start; } .task-actions { justify-content: flex-end; } } </style> </head> <body> <div class="container"> <header> <h1>📝 作业与考试管理系统</h1> <p>统一发布、管理和跟踪学生任务</p> </header> <!-- 添加任务表单 --> <div class="form-group"> <input type="text" id="titleInput" placeholder="请输入任务名称,如:Python 第三章作业" /> <select id="typeSelect"> <option value="作业">作业</option> <option value="小测验">小测验</option> <option value="期中考试">期中考试</option> <option value="期末考试">期末考试</option> <option value="项目">项目</option> </select> <input type="date" id="dateInput" required /> <button class="btn-add" id="addTaskBtn">添加</button> </div> <!-- 搜索与筛选 --> <div class="filters"> <input type="text" id="searchInput" placeholder="🔍 搜索任务名称..." /> <select id="categoryFilter"> <option value="">全部类型</option> <option value="作业">作业</option> <option value="小测验">小测验</option> <option value="期中考试">期中考试</option> <option value="期末考试">期末考试</option> <option value="项目">项目</option> </select> <select id="statusFilter"> <option value="">全部状态</option> <option value="pending">未开始</option> <option value="active">进行中</option> <option value="expired">已截止</option> </select> </div> <!-- 任务列表 --> <ul class="tasks-list" id="tasksList"> <!-- 动态渲染 --> </ul> </div> <script> // 模拟任务数据 let tasks = JSON.parse(localStorage.getItem('homeworkExams')) || [ { id: 1, title: "Python 第三章作业", type: "作业", dueDate: "2025-04-10", description: "完成课后练习题 3.1 - 3.5" }, { id: 2, title: "期中模拟考试", type: "期中考试", dueDate: "2025-04-15", description: "覆盖第1-5章知识点,在线限时90分钟" }, { id: 3, title: "UI设计项目提交", type: "项目", dueDate: "2025-04-25", description: "小组合作完成一个移动端APP原型设计" } ]; // 保存到 localStorage function saveTasks() { localStorage.setItem('homeworkExams', JSON.stringify(tasks)); } // 获取当前状态 function getStatus(dueDate) { const today = new Date().toISOString().split('T')[0]; if (dueDate > today) return 'pending'; if (dueDate === today) return 'active'; return 'expired'; } // 渲染任务列表 function renderTasks() { const list = document.getElementById('tasksList'); list.innerHTML = ''; const searchValue = document.getElementById('searchInput').value.toLowerCase(); const categoryValue = document.getElementById('categoryFilter').value; const statusValue = document.getElementById('statusFilter').value; const filtered = tasks.filter(task => { const matchesSearch = task.title.toLowerCase().includes(searchValue); const matchesCategory = categoryValue === '' || task.type === categoryValue; const status = getStatus(task.dueDate); const matchesStatus = statusValue === '' || status === statusValue; return matchesSearch && matchesCategory && matchesStatus; }); if (filtered.length === 0) { list.innerHTML = `<li class="empty-message">暂无符合条件的任务</li>`; return; } filtered.forEach(task => { const status = getStatus(task.dueDate); const statusText = status === 'pending' ? '未开始' : status === 'active' ? '进行中' : '已截止'; const statusColor = { pending: '#ffeb3b', active: '#2196f3', expired: '#f44336' }[status]; const item = document.createElement('li'); item.className = 'task-item'; item.setAttribute('data-id', task.id); item.innerHTML = ` <div class="task-header"> <div class="task-title">${task.title}</div> <div style="display: flex; align-items: center;"> <span class="task-type">${task.type}</span> <span class="status ${status}" style="background-color:${statusColor};">${statusText}</span> </div> </div> <div class="task-body"> ${task.description || '暂无详细说明'} </div> <div class="task-meta"> <span>📅 截止日期:${formatDate(task.dueDate)}</span> <span>⏳ 状态:<strong>${statusText}</strong></span> </div> <div class="task-actions"> <button class="btn btn-view" data-action="view">查看</button> <button class="btn btn-delete" data-action="delete">删除</button> </div> `; list.appendChild(item); }); // 绑定删除事件 document.querySelectorAll('.btn-delete').forEach(btn => { btn.addEventListener('click', function () { const id = parseInt(this.closest('.task-item').getAttribute('data-id')); deleteTask(id); }); }); // 查看详情(可扩展为弹窗或跳转页面) document.querySelectorAll('.btn-view').forEach(btn => { btn.addEventListener('click', function () { const item = this.closest('.task-item'); const title = item.querySelector('.task-title').textContent; const desc = item.querySelector('.task-body').textContent; const date = item.querySelector('[data-date]').textContent || item.querySelector('.task-meta span:nth-child(1)').textContent.replace('📅 ', ''); alert( `【任务详情】\n\n` + `名称:${title}\n` + `说明:${desc}\n` + `截止日期:${date}` ); }); }); } // 删除任务 function deleteTask(id) { if (confirm("确定要删除这个任务吗?")) { tasks = tasks.filter(t => t.id !== id); saveTasks(); renderTasks(); } } // 格式化日期显示 function formatDate(dateStr) { const [y, m, d] = dateStr.split('-'); return `${y}年${m}月${d}日`; } // 添加新任务 document.getElementById('addTaskBtn').addEventListener('click', function () { const titleInput = document.getElementById('titleInput'); const typeSelect = document.getElementById('typeSelect'); const dateInput = document.getElementById('dateInput'); const title = titleInput.value.trim(); const type = typeSelect.value; const dueDate = dateInput.value; if (!title) { alert("请填写任务名称!"); return; } if (!dueDate) { alert("请选择截止日期!"); return; } const newTask = { id: Date.now(), // 简单唯一ID title, type, dueDate, description: `请按时完成【${title}】任务` }; tasks.push(newTask); saveTasks(); renderTasks(); // 清空表单 titleInput.value = ''; dateInput.value = ''; }); // 实时搜索与筛选 document.getElementById('searchInput').addEventListener('input', renderTasks); document.getElementById('categoryFilter').addEventListener('change', renderTasks); document.getElementById('statusFilter').addEventListener('change', renderTasks); // 页面加载时渲染 window.onload = renderTasks; </script> </body> </html> ``` --- ### ✅ 功能亮点 | 功能 | 说明 | |------|------| | 📌 添加任务 | 支持自定义标题、类型、截止日期 | | 🔍 搜索过滤 | 按名称关键字实时查找 | | 🏷️ 多维度筛选 | 按“类型”、“状态”(未开始/进行中/已截止)筛选 | | 🗑️ 安全删除 | 删除前弹出确认框 | | 👁️ 查看详情 | 点击“查看”弹出信息摘要 | | 💾 数据持久化 | 使用 `localStorage` 存储,刷新不丢失 | | 📱 响应式布局 | 适配手机、平板、桌面 | --- ### 🧩 可扩展方向(生产环境) 1. **连接后端数据库**:将数据存储在服务器上,支持多用户访问。 2. **通知提醒**:临近截止日期自动提醒学生。 3. **文件上传**:允许附加 PDF、PPT 等资料。 4. **提交记录**:学生提交后显示“已提交/未提交”状态。 5. **成绩录入**:教师批改后可录入分数。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值