作者主頁(yè):編程指南針
作者簡(jiǎn)介:Java領(lǐng)域優(yōu)質(zhì)創(chuàng)作者、CSDN博客專家 、掘金特邀作者、多年架構(gòu)師設(shè)計(jì)經(jīng)驗(yàn)、騰訊課堂常駐講師
主要內(nèi)容:Java項(xiàng)目、簡(jiǎn)歷模板、學(xué)習(xí)資料、面試題庫(kù)、技術(shù)互助
收藏點(diǎn)贊不迷路? 關(guān)注作者有好處
文末獲取源碼?
項(xiàng)目編號(hào):BS-Python-006
一,環(huán)境介紹
語(yǔ)言環(huán)境:Python3.7
數(shù)據(jù)庫(kù):Mysql: mysql5.7
開(kāi)發(fā)工具:IDEA 或其它
開(kāi)發(fā)技術(shù):Django框架,前端使用Layui+html
二,項(xiàng)目簡(jiǎn)介
本項(xiàng)目基于Python語(yǔ)言開(kāi)發(fā)實(shí)現(xiàn),使用了Django WEB框架開(kāi)發(fā),前端使用Layui+HTML進(jìn)行頁(yè)面開(kāi)發(fā),提供了登錄驗(yàn)證碼和圖形報(bào)表統(tǒng)計(jì),以及數(shù)據(jù)導(dǎo)入導(dǎo)出的基本功能。
系統(tǒng)的用戶角色可以靈活的自定義實(shí)現(xiàn),目前設(shè)定的有管理員、班主任和普通用戶等,可以根據(jù)需求自定義角色和權(quán)限,系統(tǒng)權(quán)限分為菜單級(jí)和按鈕級(jí),控制的十分細(xì)致,完全根據(jù)需要來(lái)控制對(duì)某些數(shù)據(jù)的增刪改查操作,并根據(jù)需要給相應(yīng)的用戶授予相應(yīng)的權(quán)限。
系統(tǒng)的主要功能模塊包含:
用戶管理:完成對(duì)用戶信息的新增、查詢和刪除、導(dǎo)出等操作。
角色管理:完成對(duì)角色信息的新增、查詢和編輯、刪除、導(dǎo)出等操作。為角色授于不同的權(quán)限功能。
權(quán)限管理:完成對(duì)權(quán)限信息的新增、查詢和刪除、導(dǎo)出和啟用等操作。
日志管理:主要對(duì)用戶的操作日志進(jìn)行查看和刪除操作。
學(xué)校管理:完成對(duì)學(xué)校信息的新增、查詢和刪除操作。
年級(jí)管理:完成對(duì)年級(jí)信息的新增、查詢和刪除操作。
班級(jí)管理:完成對(duì)班級(jí)信息的新增、查詢和刪除操作。
課程管理:完成對(duì)課程信息的新增、查詢和刪除操作。
學(xué)生管理:完成對(duì)學(xué)生信息的新增、查詢和刪除操作,并可以進(jìn)行批量導(dǎo)入和導(dǎo)出。
成績(jī)錄入:為每個(gè)學(xué)生進(jìn)行成績(jī)錄入。
班級(jí)成績(jī):查詢統(tǒng)計(jì)各學(xué)校各班級(jí)各學(xué)科的參考人數(shù)及各分?jǐn)?shù)段的人數(shù)。
學(xué)生成績(jī):對(duì)所有學(xué)生的成績(jī)信息進(jìn)行管理和數(shù)據(jù)導(dǎo)入等操作。
數(shù)據(jù)統(tǒng)計(jì):通過(guò)Echart圖形報(bào)表完成相關(guān)數(shù)據(jù)統(tǒng)計(jì)。
個(gè)人資料修改:完成個(gè)人資料和密碼的修改操作。
三,系統(tǒng)展示
用戶登錄:
后臺(tái)管理首頁(yè):
用戶管理:
角色管理:
分配權(quán)限:
權(quán)限管理
日志管理
學(xué)校管理
年級(jí)管理
班級(jí)管理
課程管理
學(xué)生管理
成績(jī)錄入
班級(jí)成績(jī)統(tǒng)計(jì)
學(xué)生成績(jī)管理
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-505111.html
四,核心代碼展示
# encoding:utf-8
import json
from io import BytesIO
from django.contrib.auth import logout
from django.contrib.auth.hashers import check_password, make_password
from django.http import JsonResponse, HttpResponse
from django.shortcuts import render, redirect
# Create your views here.
from common.API import res_josn_data
from common.API.auth import add_auth_session, login_required
from common.API.captcha import make_captcha
from common.API.code import check_code
from common.API.echarts import echarts_pie, json_response
from common.API.log import login_log
from login.models import Logo, Log
from sys_manage.models import User, Role, Power, RolePower
from student_score import models as m_model
def index(request):
if request.method == 'GET':
return redirect('/login')
def home(request):
if request.method == 'GET':
return render(request, 'login/home.html')
def login(request):
if request.method == 'GET':
return render(request, 'login/login.html')
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
code = request.POST.get('captcha')
if not username or not password or not code:
return res_josn_data.fail_api(msg="用戶名或密碼沒(méi)有輸入")
s_code = request.session.get("code", None)
print('驗(yàn)證碼:', code, s_code)
user_ip = request.META.get('REMOTE_ADDR')
print(user_ip)
request.session["code"] = None
if not all([code, s_code]):
# login_log(request, uid=username, is_access=False, desc='驗(yàn)證碼錯(cuò)誤,請(qǐng)刷新驗(yàn)證碼')
return res_josn_data.fail_api(msg="驗(yàn)證碼錯(cuò)誤,請(qǐng)刷新驗(yàn)證碼!")
if code != s_code:
login_log(request, uid=username, is_access=False, desc='驗(yàn)證碼錯(cuò)誤')
return res_josn_data.fail_api(msg="驗(yàn)證碼錯(cuò)誤")
user = User.objects.filter(id_number=username).first()
if user is None:
login_log(request, uid=username, is_access=False, desc='用戶不存在')
return res_josn_data.fail_api(msg="用戶不存在!")
if user.user_status == 0:
login_log(request, uid=user.id_number, is_access=False, desc='用戶被禁用')
return res_josn_data.fail_api(msg="用戶被禁用!")
if username == user.id_number and check_password(password, user.id_password):
# 設(shè)置session過(guò)期時(shí)間
request.session.set_expiry(60 * 60 * 2)
# 登錄
request.session["user_id"] = user.id_number
request.session["user_name"] = user.user_name
request.session["role_id"] = user.role_id
request.session["role_des"] = user.role_des
request.session["id"] = user.id
# 學(xué)校名稱
request.session["department"] = user.department
# 年級(jí)
request.session["position"] = user.position
# 科目
request.session["email"] = user.email
# 記錄登錄日志
login_log(request, uid=user.id_number, is_access=True, desc='登錄成功')
# 存入權(quán)限
add_auth_session(request)
return res_josn_data.success_api(msg="登錄成功")
else:
login_log(request, uid=user.id_number, is_access=False, desc='密碼錯(cuò)誤')
return res_josn_data.fail_api(msg="密碼錯(cuò)誤")
def image_code(request):
""" 生成圖片驗(yàn)證碼 """
# 調(diào)用pillow函數(shù),生成圖片
img, code_string = check_code()
# 寫入到自己的session中(以便于后續(xù)獲取驗(yàn)證碼再進(jìn)行校驗(yàn))
request.session['image_code'] = code_string
# 給Session設(shè)置60s超時(shí)
request.session.set_expiry(60)
stream = BytesIO()
img.save(stream, 'png')
return HttpResponse(stream.getvalue())
def get_captcha(request):
return make_captcha(request)
def login_in(request):
user_id = request.session.get('user_id')
if user_id:
return render(request, "login/index.html", {'user_id': user_id})
def login_out(request):
user_id = request.session.get('user_id')
login_log(request, uid=user_id, is_access=True, desc='退出登錄')
logout(request)
return redirect('/login')
@login_required
def web_menu(request):
home_info = Logo.objects.filter(type='0').first()
logo_info = Logo.objects.filter(type='1').first()
title_info = Logo.objects.filter(type='2').first()
menu_info = Power.objects.filter(type=0).order_by('sort') # 目錄
# 查詢權(quán)限ID
menu_id = RolePower.objects.values_list('power_id').filter(role_id=request.session.get('role_id'))
permission_id = [i[0] for i in menu_id]
print(f'當(dāng)前用戶權(quán)限ID:{permission_id}')
menu_data = {
"homeInfo": {
"title": f"{home_info.name}",
"href": f"{home_info.url}"
},
"logoInfo": {
"title": f"{logo_info.name}",
"image": f"{logo_info.icon}",
"href": f"{logo_info.url}"
},
"menuInfo": [
{
"title": f"{title_info.name}",
"icon": f"{title_info.icon}",
"href": f"{title_info.url}",
"target": "_self",
"child": []
}
]
}
for item in menu_info:
if item.id in permission_id:
menu_data["menuInfo"][0]["child"].append({
"title": f"{item.name}",
"icon": f"{item.icon}",
"href": f"{item.code}",
"target": "_self",
"child": []
})
# 查詢子菜單
sub_menu_info = Power.objects.filter(parent_id=item.id).order_by('sort')
for sub_item in sub_menu_info:
if sub_item.id in permission_id:
menu_data["menuInfo"][0]["child"][-1]["child"].append({
"title": f"{sub_item.name}",
"icon": f"{sub_item.icon}",
"href": f"{sub_item.code}",
"target": "_self"
})
return JsonResponse(menu_data, safe=False)
@login_required
def echarts(request):
if request.method == 'POST':
n_type = ['用戶', '角色', '權(quán)限', '日志']
user_count = User.objects.count()
role_count = Role.objects.count()
role_power_count = RolePower.objects.count()
log_count = Log.objects.count()
data_list = [user_count, role_count, role_power_count, log_count]
title = '1.數(shù)量統(tǒng)計(jì)'
c = echarts_pie(n_type, data_list, title)
return json_response(json.loads(c))
@login_required
def user_setting(request):
if request.method == 'GET':
return render(request, "login/user_setting.html")
if request.method == "POST":
post_data = request.POST
print(post_data)
field_user_id = post_data['userID']
field_name = post_data['userName']
field_dep = post_data['department']
field_pos = post_data['position']
field_email = post_data['email']
update_dict = {
'user_name': field_name,
'department': field_dep,
'position': field_pos,
'email': field_email
}
User.objects.filter(id_number=field_user_id).update(**update_dict)
return res_josn_data.success_api(msg=f'用戶:{field_user_id} 更新成功')
@login_required
def user_info_query(request):
data_list = []
post_data = request.POST
print('AJAX數(shù)據(jù):', post_data)
login_id = post_data['login_id'].strip()
user_info = User.objects.filter(id_number=login_id).first()
role_info = Role.objects.filter(role_value=user_info.role_id).first()
return res_josn_data.user_setting_api(login_id, user_info.user_name, user_info.department, user_info.position,
role_info.name, user_info.email, data_list)
@login_required
def user_password(request):
if request.method == 'GET':
return render(request, "login/user_password.html")
if request.method == "POST":
post_data = request.POST
print(post_data)
login_id = post_data['login_id'].strip()
old_password = post_data['Param[old_password]']
new_password = post_data['Param[new_password]']
again_password = post_data['Param[again_password]']
user_obj = User.objects.filter(id_number=login_id).first()
if not user_obj:
return res_josn_data.fail_api(msg="用戶不存在!")
if not check_password(old_password, user_obj.id_password):
return res_josn_data.fail_api(msg="舊密碼錯(cuò)誤!")
if new_password != again_password:
return res_josn_data.fail_api(msg="兩次密碼不一致!")
User.objects.filter(id_number=login_id).update(**{'id_password': make_password(new_password)})
return res_josn_data.success_api(msg="修改成功!")
# def page_not_found(request, exception):
# return render(request, "errors/404.html", exception)
#
#
# def page_error(request):
# return render(request, "errors/500.html")
# encoding:utf-8
import json
from django.contrib.auth.hashers import make_password
from django.core.paginator import Paginator
from django.shortcuts import render
from student_score import models as m_model
# Create your views here.
from common.API import res_josn_data
from common.API.auth import login_required, authorize
from sys_manage.models import User, Role
@login_required
def user_manage(request):
return render(request, 'sys_manage/user_manage/user_main.html')
@login_required
def user_query(request):
data_list = []
page = request.POST.get('page', 1)
limit = request.POST.get('limit', 10)
post_data_str = request.POST.get('Params', None)
if post_data_str is None:
user_obj = User.objects.all().order_by('id')
# return res_josn_data.table_api(data=data_list, count=0)
else:
post_data = json.loads(post_data_str)
id_number = post_data['idNumber']
user_name = post_data['userName']
user_dep = post_data['dep']
user_pos = post_data['position']
user_status = post_data['status']
user_role = post_data['role']
filters = {} # 查詢參數(shù)構(gòu)造
# model或數(shù)據(jù)庫(kù)對(duì)應(yīng)字段
orm_field = ['__gt', '__gte', '__lt', '__lte', '__exact', '__iexact', '__contains', '__icontains',
'__startswith', '__istartswith', '__endswith', '__iendswith', '__range', '__isnull', '__in']
filed_dict = {0: 'id_number', 1: 'user_name', 2: 'department', 3: 'position', 4: 'user_status', 5: 'role_id'}
param_list = [id_number, user_name, user_dep, user_pos, user_status, user_role]
for i in range(len(param_list)):
if param_list[i] not in (None, ''):
db_field = filed_dict[i] + orm_field[7]
filters[db_field] = param_list[i]
print('filters:', filters)
user_obj = User.objects.filter(**filters).order_by('id')
page_data = Paginator(user_obj, limit).page(page)
# 序號(hào)
count = (int(page) - 1) * int(limit)
for item in page_data:
count += 1
item_data = {
"id": count,
"fieldID": item.id,
"userID": item.id_number,
"name": item.user_name,
"department": item.department,
"position": item.position,
"email": item.email,
"status": item.user_status,
"role": item.role_des,
}
data_list.append(item_data)
return res_josn_data.table_api(count=len(user_obj), data=data_list)
@authorize(power='user:add', log=True)
def user_add(request):
if request.method == 'GET':
return render(request, 'sys_manage/user_manage/user_add.html')
if request.method == 'POST':
post_data = request.POST
print(request.POST)
user_id = post_data['userID']
user_password = post_data['password']
user_name = post_data['userName']
user_dep = post_data['department']
user_position = post_data['position']
user_email = post_data['email']
user_enable = post_data['enable']
role_value = post_data['role']
user_password_sha256 = make_password(user_password, salt=None, hasher='default')
role_obj = Role.objects.filter(role_value=role_value).first()
new_obj = User(
id_number=user_id,
id_password=user_password_sha256,
user_name=user_name,
department=user_dep,
position=user_position,
role_id=role_value,
role_des=role_obj.name,
user_status=user_enable,
email=user_email,
)
new_obj.save()
return res_josn_data.success_api(msg=f'用戶:{user_name} 添加成功')
@login_required
def user_role_query(request):
if request.method == 'POST':
data_list = []
role_data = Role.objects.all()
for item in role_data:
item_data = {
"roleID": item.role_value,
"roleName": item.name
}
data_list.append(item_data)
print(data_list)
return res_josn_data.table_api(data=data_list, count=len(role_data))
def school_query(request):
if request.method == 'POST':
data_list = []
school_data = m_model.College.objects.all()
for item in school_data:
item_data = {
"schoolID": item.id,
"schoolName": item.name
}
data_list.append(item_data)
return res_josn_data.table_api(data=data_list, count=len(school_data))
@authorize(power='user:delete', log=True)
def user_delete(request):
if request.method == 'POST':
post_data = request.POST
print('AJAX數(shù)據(jù):', post_data)
db_id = post_data['fieldID']
user_name = post_data['name']
User.objects.filter(id=db_id).delete()
return res_josn_data.success_api(f'用戶:{user_name} 刪除成功')
else:
return res_josn_data.fail_api(msg='請(qǐng)求權(quán)限不夠!')
@authorize(power='user:delete', log=True)
def user_multi_delete(request):
if request.method == 'POST':
user_list = []
post_data_str = request.POST.get('Params', None)
post_data = json.loads(post_data_str)
for item in post_data:
db_id = item['fieldID']
user_name = item['name']
User.objects.filter(id=db_id).delete()
user_list.append(user_name)
return res_josn_data.success_api(f'用戶:{user_list} 刪除成功')
@login_required
def user_cell_edit(request):
# 前端字段和數(shù)據(jù)庫(kù)字段對(duì)應(yīng)dict
filed_dict = {
'userID': 'id_number',
'name': 'user_name',
'department': 'department',
'position': 'position',
'email': 'email',
}
if request.method == 'POST':
post_data = request.POST
print('AJAX數(shù)據(jù):', post_data)
field_name = post_data['field']
field_value = post_data['value']
field_id = post_data['dbID']
User.objects.filter(id=field_id).update(**{filed_dict[field_name]: field_value})
return res_josn_data.success_api(f'更新成功')
@login_required
def user_role_edit(request):
if request.method == 'GET':
return render(request, 'sys_manage/user_manage/user_role_edit.html')
if request.method == 'POST':
post_data = request.POST
print(post_data)
user_id = post_data['userID']
role_id = post_data['role']
role_obj = Role.objects.filter(role_value=role_id).first()
update_dict = {
'role_id': role_id,
'role_des': role_obj.name
}
User.objects.filter(id_number=user_id).update(**update_dict)
return res_josn_data.success_api(msg=f'{user_id} 角色更新成功')
@authorize(power='user:enable', log=True)
def user_enable(request):
if request.method == 'POST':
post_data = request.POST
print('AJAX數(shù)據(jù):', post_data)
field_id = post_data['userID']
enable_value = post_data['enableValue'] # 0禁用 1啟用
enable_dict = {'enable': 1, 'disable': 0}
enable_dict_cn = {'enable': '啟用', 'disable': '禁用'}
role_obj = User.objects.filter(id=field_id)
role_obj.update(**{'user_status': enable_dict[enable_value]})
return res_josn_data.success_api(msg=f'{role_obj[0].user_name} {enable_dict_cn[enable_value]}成功')
五,項(xiàng)目總結(jié)
本次基于Python開(kāi)發(fā)實(shí)現(xiàn)的學(xué)生成績(jī)管理系統(tǒng),也可作為學(xué)生管理系統(tǒng)使用,題目根據(jù)需要可以更改,功能實(shí)現(xiàn)較為完整,界面設(shè)計(jì)美觀大方,適合作為畢業(yè)設(shè)計(jì)和課程設(shè)計(jì)使用。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-505111.html
到了這里,關(guān)于基于Python+Django實(shí)現(xiàn)的學(xué)生成績(jī)管理系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!