团队作业(五):冲刺总结3
团队作业(五):冲刺总结3
项目名:电子公文传输系统
成员分工:熊悠越(前端开发)、罗杰逊+谷丰宇(后端开发)、陈夏林(数据库管理)、董准(系统测试与维护)
日期:2023.12.10
今日任务完成情况
前端部分代码
{% load static %}
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="csrf-token" content="{{ csrf_token }}">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>公文传输系统</title>
<link rel="stylesheet" href="{% static 'css/style-syspage.css' %}">
<link rel="stylesheet" href="{% static 'css/style-newnavi.css' %}">
<link rel="stylesheet" href="{% static 'css/sidebarContainer.css' %}">
<link rel="stylesheet" href="{% static 'css/homepage.css' %}">
<link rel="stylesheet" href="{% static 'css/textmanagerpage.css' %}">
<link rel="stylesheet" href="{% static 'css/textpage.css' %}">
<link rel="stylesheet" href="{% static 'css/usermanagerpage.css' %}">
<script src="https://cdn.jsdelivr.net/npm/vue@3.0.11/dist/vue.global.prod.js"></script>
<!-- 在<head>标签中引入Quill.js的CSS文件 -->
<link href="https://cdn.quilljs.com/1.3.6/quill.snow.css" rel="stylesheet">
<!-- 在<body>标签中引入Quill.js的JavaScript文件 -->
<script src="https://cdn.quilljs.com/1.3.6/quill.js"></script>
</head>
<body>
<div>
<div class="navbar-top">
<div class="menu-content">
<div class="menu-icon">☰</div>
<input type="text" class="search-box" placeholder="搜索...">
<div class="user-info">
<span class="user-name">{{ username }},你来啦!</span>
<input type="hidden" id="loggedInUserId" value="{{ user_id }}">
</div>
</div>
</div>
<div>
<div class="navbar-left">
<div class="Avatar">
<span>{{ username }}</span>
</div>
<div class="sys">
公文传输系统
</div>
<div class="navbar-left">
<div class="header">
<div class="Avatar">{{ username }}</div>
<div class="sys-title">公文传输系统</div>
</div>
<ul class="nav-links">
<li><a href="#" @click="handleTabClick('首页')">首页</a></li>
<li><a href="#" @click="handleTabClick('公文管理')">公文管理</a></li>
<li><a href="#" @click="handleTabClick('公文审核')">公文审核</a></li>
<li><a href="#" @click="handleTabClick('用户管理')">用户管理</a></li>
<li><a href="#" @click="handleTabClick('日志管理')">日志管理</a></li>
<li><a href="#" @click="handleTabClick('公文草拟')">公文草拟</a></li>
<!-- ...其他链接,根据需要添加 -->
</ul>
<div class="footer">
<a href="#" class="quit" id="logoutButton">退出系统</a>
</div>
</div>
<a href="#" class="quit" id="logoutButton">
退出系统
</a>
</div>
<div id="sidebarContainer"></div>
</div>
</div>
<script>
const userNameElement = document.querySelector('.user-name');
userNameElement.addEventListener('click', (event) => {
event.preventDefault(); // 阻止默认的跳转行为
// 获取当前页面的 URL
const currentPageURL = window.location.href;
// 在这里添加您需要的逻辑,例如弹出用户信息框、切换到用户界面等
// 示例:在控制台输出当前页面的 URL
console.log('当前页面的 URL:', currentPageURL);
});
</script>
<script src="{% static 'js/main.js' %}"></script>
<script>
window.accessLevel = {{ access_level|default_if_none:0 }};
const logoutButton = document.getElementById('logoutButton');
logoutButton.addEventListener('click', (event) => {
event.preventDefault();
fetch('/logout/', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': getCookie('csrftoken') // 替换为获取CSRF令牌的函数,这是一个示例
},
// ...其他请求数据
})
.then(response => {
if (response.redirected) {
// 延迟3秒后执行重定向
setTimeout(() => {
window.location.href = response.url; // 重定向到指定页面
}, 1000);
}
})
.catch(error => {
console.error('退出时出错:', error);
});
});
function getCookie(name) {
const cookieValue = document.cookie.match('(^|;)\\s*' + name + '\\s*=\\s*([^;]+)');
return cookieValue ? cookieValue.pop() : '';
}
</script>
</body>
</html>
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户权限管理</title>
<link href="../static/images/icon.ico" rel="icon" type="icon">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="{% static 'css/manage.css' %}">
</head>
<body>
<h1>用户权限管理</h1>
<p>用户 ID: {{ user.id }}</p>
<p>用户名: {{ user.username_up }}</p>
<p>邮箱: {{ user.email }}</p>
<p>密码: {{ user.password_up }}</p>
<form method="post" action="{% url 'manage_permission' user.id %}">
{% csrf_token %}
<label for="accessLevel">访问权限:</label>
<select id="accessLevel" name="access_level">
<option value="0" {% if user.access_level == 0 %} selected {% endif %}>0</option>
<option value="1" {% if user.access_level == 1 %} selected {% endif %}>1</option>
<option value="2" {% if user.access_level == 2 %} selected {% endif %}>2</option>
<option value="3" {% if user.access_level == 3 %} selected {% endif %}>3</option>
</select>
<button type="submit">保存权限</button>
<a href="{% url 'index' %}">取消</a>
<!-- 提示用户权限含义 -->
<p>
0: 普通用户<br>
1: 管理员<br>
2: 不能发送公文的普通用户<br>
3: 黑名单用户,无法进行任何操作
</p>
</form>
<script>
document.addEventListener('DOMContentLoaded', function() {
document.querySelector('form').addEventListener('submit', function(event) {
event.preventDefault(); // 阻止表单默认提交行为
// 提交表单后,等待 3 秒后跳转到 index 页面
setTimeout(function() {
document.querySelector('form').submit(); // 提交表单
}, 3000); // 等待 3 秒
});
});
</script>
</body>
</html>
后端部分代码
部分模块
def login(request):
if request.method == 'POST':
id_in = request.POST['id_in']
password_in = request.POST['password_in']
# 查询数据库,检查用户是否存在
try:
user_profile = UserProfile.objects.get(id=id_in, password_up=password_in)
except UserProfile.DoesNotExist:
messages.error(request, '学号或密码错误,请重新输入。')
return redirect('login')
# 登录成功,将用户信息存储到session中
request.session['user_id'] = user_profile.id
request.session['username'] = user_profile.username_up
LogData = Log.objects.create(
username = user_profile.username_up,
documentname = "无",
operation = f'用户{user_profile.username_up}于{timezone.now()}登录了系统。'
)
LogData.save()
# 可以在这里添加其他处理,例如重定向到成功页面或显示成功消息
# 登录成功,添加消息
time.sleep(3)
return redirect('index')
return render(request, 'login.html') # 替换为你的模板路径
def register(request):
if request.method == 'POST':
id = request.POST['id']
username_up = request.POST['username_up']
email = request.POST['email']
password_up = request.POST['password_up']
priKey = PrivateKey()
pubKey = priKey.publicKey()
new_user = UserProfile.objects.create(
id=id,
username_up=username_up,
email=email,
password_up=password_up,
public_key=pubKey.toString(compressed=False), # 存储公钥
private_key=priKey.toString(), # 存储私钥
avatar='avatars/default_avatar.png'
)
new_user.save()
LogData = Log.objects.create(
username = new_user.username_up,
documentname = "无",
operation = f'用户{new_user.username_up}于{timezone.now()}注册了账号。'
)
LogData.save()
# 添加成功消息
messages.success(request, '注册成功,请登录。')
time.sleep(3)
return redirect('login')
return render(request, 'register.html') # 替换为你的模板路径
def index(request):
# 检查用户是否登录
if 'user_id' in request.session:
user_id = request.session['user_id']
username = request.session['username']
try:
# 根据用户名查询用户的访问权限
user_profile = UserProfile.objects.get(username_up=username)
access_level = user_profile.access_level
# 不再处理用户头像,直接渲染模板
return render(request, 'index.html', {
'user_id': user_id,
'username': username,
'access_level': access_level,
# 可以选择提供默认头像的 URL 或完全去除头像 URL
'user_avatar_url': '/path/to/default/avatar.png' # 示例路径,根据需要修改
})
except UserProfile.DoesNotExist:
# 处理未找到用户的情况
pass
else:
# 用户未登录,可以重定向到登录页面或其他处理
return redirect('login')
def create_user(request):
current_user = request.session['username']
if request.method == 'POST':
form = UserForm(request.POST)
if form.is_valid():
# 获取表单数据并保存到数据库
id = form.cleaned_data['id']
username = form.cleaned_data['username_up']
email = form.cleaned_data['email']
password = form.cleaned_data['password_up']
priKey = PrivateKey()
pubKey = priKey.publicKey()
# 保存到数据库中
UserProfile.objects.create(
id=id,
username_up=username,
email=email,
password_up=password,
public_key=pubKey.toString(compressed=False), # 存储公钥
private_key=priKey.toString(), # 存储私钥
avatar='avatars/default_avatar.png'
)
LogData = Log.objects.create(
username=current_user,
documentname="无",
operation=f'用户{current_user}于{timezone.now()}创建了新用户{username}。'
)
LogData.save()
# 重定向到 index 页面,使用 HttpResponseRedirect 对象
return HttpResponseRedirect(reverse('index'))
else:
form = UserForm()
return render(request, 'adduser.html', {'form': form})
以上代码均已托管至公文传输系统实现代码/冲刺
冲刺第三天
第三天 | 负责人 | 工作量 |
---|---|---|
调试数据库 | 陈夏林 | 2 |
完善接口 | 陈夏林 | 2 |
数据库初始化设置 | 陈夏林 | 1 |
完善文件上传下载模块 | 谷丰宇、罗杰逊 | 3 |
基于角色的权限控制设计 | 谷丰宇、罗杰逊 | 1 |
适配增加的功能 | 谷丰宇、罗杰逊 | 1 |
管理员功能开发 | 陈夏林 | 2 |
完善用户功能接口 | 董准、熊悠越 | 2 |
根据后端接口完善前端界面 | 董准、熊悠越 | 2 |
继续完善用户数据的相关内容 | 董准、熊悠越 | 2 |
明日任务安排 | 熊悠越 | 1 |
明日任务安排
第三天 | 工作量 |
---|---|
继续调试数据库 | 2 |
完善接口 | 3 |
完成数据库初始化设置 | 2 |
主干功能完善 | 2 |
功能测试 | 4 |
完善文件上传下载模块 | 2 |
适配增加的功能 | 2 |
风格化样式 | 2 |
增加验证码 | 2 |
根据后端接口完善前端界面 | 3 |
继续完善用户数据的相关内容 | 2 |
明日任务安排 | 1 |