用户信息
用户ID | 用户名 | 用户性别 | 部门 | 操作 |
---|
何为Django框架,它的优势是什么?
Django 项目是一个Python定制框架,它源自一个在线新闻 Web 站点,于 2005 年以开源的形式被释放出来。Django 框架的核心组件有:
优点
1、开源框架,有完美的文档支持
2、解决方案众多,内部功能支持较多
3、优雅的URL,完整的路由系统
4、自助式的后台管理
接下来使用Django框架 + jquery Ajax技术实现CRUD。
项目架构
settings.py文件(修改配置的代码)
"""
Django settings for djangoproject project.
Generated by 'django-admin startproject' using Django 2.2.6.
For more information on this file, see
https://docs.djangoproject.com/en/2.2/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.2/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '(46xri8ef295s*edox_(t=w%k$ks=wx0wmm=3@1yo!c=je81-p'
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'shopapp.apps.ShopappConfig'
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'djangoproject.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'djangoproject.wsgi.application'
# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db_test_shop1',
'HOST': '127.0.0.1',
'USER': 'root',
'PASSWORD':'root',
'PORT': '3306',
'OPTIONS':{'isolation_level':None}
}
}
# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/2.2/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR,"static"),
)
# 配置输出sql语句
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
urls.py文件(用于配置路由)
"""djangoproject URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from shopapp.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('', index),
path('gologin/', goLogin),
path('login/', login),
path('logout/', logout),
path('regist.do', regist),
path('upload.do', uploadFile),
path('goajaxjobtaskinfo/', goJobTaskInfo),
path('ajaxjobtaskinfo/', getJobTaskInfo),
path('ajaxjobsalary/', getJobSalary),
path('goajaxuserinfo/', goAjaxUserInfo),
path('ajaxuserinfo/', getUserInfo),
path('ajaxdeptinfo/', getDeptList)
]
userdata.js(Ajax)
function getUserData(currentPage, pageSize, opr, userId) {
var userName = document.searchForm.userName.value
var userSex = document.searchForm.userSex.value
var userDeptId = 0
if(opr == 'del'){
if(!confirm('确定要删除吗?')){
return false
}
}else if(opr == 'submitUpdate'){
userName = document.userForm.userName.value
userSex = document.userForm.userSex.value
userId = document.userForm.userId.value
userDeptId = document.userForm.userDeptId.value
currentPage = document.userForm.currentPage.value
pageSize = document.userForm.pageSize.value
}
$.ajax({
type: 'post', // 传数据的方式
url: '/ajaxuserinfo/',
dataType: 'json', // xml、json、script、html
data:JSON.stringify({
'userName': userName, // $('#userName') == document.getElementById('userName')
'userSex' : userSex,
'userId': userId,
'userDeptId': userDeptId,
'pageSize': pageSize,
'currentPage': currentPage,
'opr': opr // 重用一个ajax请求实现增加删除修改查询 CRUD
}),
error: function(xhr, err){
alert('请求失败,请检查,' + err + '!')
},
success: function(data, textStatus){ // success对应的回调函数的第一个参数,是服务器返回的数据
// data = JSON.parse(data)
if(data.code == 1 && opr != 'update'){
var htmlText = ""
for(var i =0;i ' +
' \n' +
' ' + data.userData[i].pk + ' \n' +
' ' + data.userData[i].fields.user_name + ' \n' +
' ' + (data.userData[i].fields.user_sex == 1?'男':'女') + ' \n' +
' ' + data.userData[i].fields.user_deptname + ' \n' +
' \n' +
' ' +
' '+
' \n' +
' \n'
}
pageText = ''+ '当前第' + data.currentPage + '页 总共有' + data.totalPage + '页 ';
if(data.currentPage <= 1) {
pageText += '首页 上一页 ';
}else{
pageText += '首页 ' +
'上一页 ';
}
if(data.currentPage >= data.totalPage){
pageText += '下一页 尾页 ';
}else {
pageText += '下一页 ' +
'尾页 ';
}
pageText +='总共有'+ data.counts + '条 '
$('#dataBody').empty()
$('#dataBody').append(htmlText)
$('#dataBody').append(pageText)
document.searchForm.currentPage.value = data.currentPage
document.searchForm.pageSize.value=data.pageSize
if( opr != 'search' && data.updateResult > 0 ) {
alert("操作成功")
$('#modal-default').modal('hide')
}else if(opr != 'search' && data.updateResult <= 0){
alert("操作失败")
}
}else if(data.code == 1 && opr == 'update'){
document.userForm.userName.value = data.userData.userName
if(data.userData.userSex == 1){
document.getElementById('male').checked = 'checked'
}else if(data.userData.userSex == 2){
document.getElementById('female').checked = 'checked'
}
document.userForm.userId.value = data.userData.userId
$('#userDept').html(data.userData.userDeptName)
document.userForm.userDeptId.value = data.userData.userDeptId
document.userForm.currentPage.value = data.currentPage
document.userForm.pageSize.value = data.pageSize
$('#modal-default').modal()
getDeptList(0, null, 1)
}
}
});
}
function getDeptList(parentId, obj, grade){
if(parentId == -1){
parentId = obj.value
document.userForm.userDeptId.value = obj.value
}else if(parentId == -99 || grade == 4){
return false
}
$.ajax({
type: 'get', // 传数据的方式
url: '/ajaxdeptinfo/',
data:{
'parentId': parentId, // $('#userName') == document.getElementById('userName')
},
error: function (xhr, err) {
alert('请求失败,请检查,' + err + '!')
},
success: function (data, textStatus) { // success对应的回调函数的第一个参数,是服务器返回的数据
// data = JSON.parse(data)
if(parentId == 0){
if(data.code == 1){
htmlText = ''
for(var i=0;i' + data.data[i].fields.dept_name + ''
}
$('#parentDept').html(htmlText)
}
}else{
if(data.code == 1 && grade == 2){
if(document.getElementById('gradeTwoDept')){
$('#gradeTwoDept').remove()
}
if(document.getElementById('gradeTreeDept')){
$('#gradeTreeDept').remove()
}
htmlText = '"
$('#deptContainer').append(htmlText)
}else if(data.code == 1 && grade == 3){
if(document.getElementById('gradeTreeDept')){
$('#gradeTreeDept').remove()
}
htmlText = '"
$('#deptContainer').append(htmlText)
}
}
}
})
}
$(document).ready(
function(){
getUserData(1, 10, 'search', 0)
}
)
admin.py文件
from django.contrib import admin
# Register your models here.
from shopapp.models import TUser
from shopapp.models import JobDept
admin.site.register(TUser)
admin.site.register(JobDept)
apps.py文件
from django.apps import AppConfig
class ShopappConfig(AppConfig):
name = 'shopapp'
models.py文件
# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:
# * Rearrange models' order
# * Make sure each model has one field with primary_key=True
# * Make sure each ForeignKey has `on_delete` set to the desired behavior.
# * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.
from django.db import models
class JobDept(models.Model):
dept_id = models.IntegerField(primary_key=True)
dept_name = models.CharField(unique=True, max_length=45, blank=True, null=True)
dept_parentid = models.IntegerField(blank=True, null=True)
class Meta:
managed = False
db_table = 'job_dept'
class TUser(models.Model):
user_id = models.AutoField(db_column='USER_ID', primary_key=True) # Field name made lowercase.
user_name = models.CharField(db_column='USER_NAME', unique=True, max_length=32) # Field name made lowercase.
user_pwd = models.CharField(db_column='USER_PWD', max_length=512) # Field name made lowercase.
user_age = models.IntegerField(db_column='USER_AGE', blank=True, null=True) # Field name made lowercase.
user_sex = models.IntegerField(db_column='USER_SEX', blank=True, null=True) # Field name made lowercase.
user_qq = models.IntegerField(db_column='USER_QQ', blank=True, null=True) # Field name made lowercase.
user_cellphone = models.CharField(db_column='USER_CELLPHONE', max_length=20, blank=True, null=True) # Field name made lowercase.
user_money = models.FloatField(db_column='USER_MONEY', blank=True, null=True) # Field name made lowercase.
user_status = models.IntegerField(db_column='USER_STATUS', blank=True, null=True) # Field name made lowercase.
user_pic = models.CharField(db_column='USER_PIC', max_length=128, blank=True, null=True) # Field name made lowercase.
user_role = models.IntegerField(db_column='USER_ROLE', blank=True, null=True) # Field name made lowercase.
jobDept= models.ForeignKey(JobDept, db_column='', on_delete=models.CASCADE, blank=True, null=True, to_field='dept_id') # null=True生成left join
user_birth = models.DateTimeField(db_column='USER_BIRTH', blank=True, null=True) # Field name made lowercase.
user_intro = models.TextField(db_column='USER_INTRO', blank=True, null=True) # Field name made lowercase.
class Meta:
managed = False
db_table = 't_user'
views.py文件(基于ORM机制的增删改查)
from django.shortcuts import render,redirect
from django.http.response import HttpResponse
from shopapp.service.userservice import UserService
from shopapp.service.jobtaskservice import JobTaskService
from shopapp.entity.jobtask import JobTask
import json
import hashlib
from .models import TUser
from .models import JobDept
from django.core import serializers
import os
from datetime import datetime
# Create your views here.
userService = UserService()
jobTaskService = JobTaskService()
def index(request):
return render(request, 'index.html')
pass
def goLogin(request):
return render(request, 'login.html')
pass
def login(request):
userName = request.POST.get('userName')
userPwd = request.POST.get('userPwd')
remeberMe = request.POST.get('rememberMe')
result = userService.findUserByUserName(userName)
isLogin = False
if result and (remeberMe == None or remeberMe == 'false'):
if result[0][2] == hashlib.md5(userPwd.encode(encoding='utf-8')).hexdigest():
isLogin = True
pass
elif result and remeberMe == 'true':
if result[0][2] == userPwd:
isLogin = True
pass
pass
if isLogin:
userItem = {}
userItem['userId'] = result[0][0]
userItem['userName'] = result[0][1]
userItem['userPic'] = result[0][9]
userItem['userRole'] = result[0][10]
request.session['user'] = userItem
response = render(request, 'main.html')
if remeberMe == 'false':
response.set_cookie('userName', userName)
response.set_cookie('userPwd', result[0][2])
response.set_cookie('rememberMe', 'true')
pass
elif remeberMe == None:
response = render(request, 'main.html')
response.delete_cookie('userName')
response.delete_cookie('userPwd')
response.delete_cookie('rememberMe')
pass
return response
else:
return render(request, 'login.html')
pass
def regist(request):
userDict = json.loads(request.body.decode('utf-8'))
'''
user = TUser()
user.user_name = userDict.get('userName') # 表单提交的数据使用request.form[]
user.user_pwd = hashlib.md5((userDict.get('userPwd')).encode(encoding='utf-8')).hexdigest()
user.user_pic = userDict.get('userPic')
user.user_birth = datetime.strptime(userDict.get('userBirth'), '%Y-%m-%d')
user.user_sex = userDict.get('userSex')
user.user_intro = userDict.get('userIntro')
result = user.save()
'''
result = TUser.objects.create(
user_name = userDict.get('userName'),
user_pwd=hashlib.md5((userDict.get('userPwd')).encode(encoding='utf-8')).hexdigest(),
user_pic=userDict.get('userPic'),
user_birth=datetime.strptime(userDict.get('userBirth'), '%Y-%m-%d'),
user_sex=userDict.get('userSex'),
user_intro=userDict.get('userIntro')
)
if result:
result = 1
else:
result = 0
return HttpResponse(json.dumps({'result': result}), content_type="application/json")
pass
def logout(request):
request.session.flush()
return render(request, 'login.html')
pass
def goJobTaskInfo(request):
return render(request, "jobinfo/jobtaskinfo.html")
pass
def getJobTaskInfo(request):
jobTaskData = request.body.decode('utf-8')
jobTaskDict = json.loads(jobTaskData)
tData = {}
jobTask = JobTask()
jobTask.taskTitle = jobTaskDict.get('taskTitle')
jobTask.taskURL = jobTaskDict.get('taskURL')
currentPage = int(jobTaskDict.get('currentPage'))
pageSize = int(jobTaskDict.get('pageSize'))
opr = jobTaskDict.get('opr')
taskId = int(jobTaskDict.get('taskId'))
jobTask.taskId = taskId
updateResult = 0
if opr == 'del':
updateResult = jobTaskService.removeJobTask(taskId)
pass
elif opr == 'update':
tTask = jobTaskService.findJobTaskByJobTaskId(taskId)
tData['taskId'] = tTask.taskId
tData['taskTitle'] = tTask.taskTitle
tData['taskURL'] = tTask.taskURL
returnData = {'code': 1, 'jobTaskData': tData, 'pageSize': pageSize, 'currentPage': currentPage, 'opr':'update'}
return HttpResponse(json.dumps(returnData), content_type="application/json")
elif opr == 'submitUpdate':
updateResult = jobTaskService.updateJobTask(jobTask)
pass
result = jobTaskService.findPageJobTaskList(jobTask, pageSize, currentPage)
counts = jobTaskService.countJobTasks(jobTask)
totalPage = 0
if(counts%pageSize == 0):
totalPage = counts//pageSize
else:
totalPage = counts // pageSize + 1
pass
returnData = {'code':1, 'jobTaskData':result, 'pageSize':pageSize, 'currentPage':currentPage, 'totalPage':totalPage, 'updateResult':updateResult, 'opr':'search','counts':counts}
return HttpResponse(json.dumps(returnData), content_type="application/json")
pass
def getJobSalary(request):
result = jobTaskService.findJobMeanSalary()
returnData = {'code':1, 'salary':result}
r = json.dumps(returnData)
return HttpResponse(json.dumps(returnData), content_type="application/json")
pass
def goAjaxUserInfo(request):
return render(request, "systeminfo/userinfo.html")
pass
def getUserInfo(request):
userData = request.body.decode('utf-8')
userDict = json.loads(userData)
tData = {}
user = TUser()
user.user_name = userDict.get('userName')
user.user_sex = userDict.get('userSex')
currentPage = int(userDict.get('currentPage'))
pageSize = int(userDict.get('pageSize'))
opr = userDict.get('opr')
userId = int(userDict.get('userId'))
user.user_id= userId
user.jobDept_id = int(userDict.get('userDeptId'))
updateResult = 0
if opr == 'del':
updateResult = user.delete()
pass
elif opr == 'update':
tUser = TUser.objects.filter(user_id=userId).values('user_id', 'user_name', 'user_sex', 'jobDept_id', 'jobDept__dept_name')
tData['userId'] = tUser[0].get('user_id')
tData['userName'] = tUser[0].get('user_name')
tData['userSex'] = tUser[0].get('user_sex')
tData['userDeptId'] = tUser[0].get('jobDept_id')
tData['userDeptName'] = tUser[0].get('jobDept__dept_name')
returnData = {'code': 1, 'userData': tData, 'pageSize': pageSize, 'currentPage': currentPage, 'opr':'update'}
return HttpResponse(json.dumps(returnData), content_type="application/json")
elif opr == 'submitUpdate':
currentPage = 1
updateResult = TUser.objects.filter(user_id=userId).update(user_sex=user.user_sex, jobDept_id=user.jobDept_id)
pass
query = TUser.objects
if user.user_name:
query = query.filter(user_name__contains=user.user_name)
if user.user_sex:
query = query.filter(user_sex=user.user_sex)
pass
startRow = (currentPage - 1)*pageSize
endRow = currentPage*pageSize
result = query.values('user_id', 'user_name', 'user_sex', 'jobDept__dept_name')[startRow:endRow] # 会生成 LIMIT 2 OFFSET 1
counts = query.count()
totalPage = 0
if(counts%pageSize == 0):
totalPage = counts//pageSize
else:
totalPage = counts // pageSize + 1
pass
# data = serializers.serialize("json", result, use_natural_foreign_keys=True)
# data = json.loads(data)
data = []
for tempUser in result:
dictItem = {'pk':tempUser.get('user_id')}
fieldsItem ={'user_name':tempUser.get('user_name'), 'user_sex':tempUser.get('user_sex'), 'user_deptname':tempUser.get('jobDept__dept_name')}
dictItem['fields'] = fieldsItem
data.append(dictItem)
pass
'''
for tempUser, tdata in zip(result, data):
tdata['fields']['user_deptname'] = tempUser.jobDept.dept_name # 获取外键关联的时候,是第二次查询
pass
'''
returnData = {'code':1, 'userData':data, 'pageSize':pageSize, 'currentPage':currentPage, 'totalPage':totalPage, 'updateResult':updateResult, 'opr':'search','counts':counts}
return HttpResponse(json.dumps(returnData), content_type="application/json")
pass
def getDeptList(request):
parentId = int(request.GET.get('parentId'))
if parentId ==0:
result = JobDept.objects.filter(dept_parentid__isnull=True).all()
else:
result = JobDept.objects.filter(dept_parentid=parentId).all()
data = serializers.serialize("json", result)
data = json.loads(data)
return HttpResponse(json.dumps({'code':1, 'data':data}), content_type="application/json")
pass
def uploadFile(request):
# 后缀需要检查的
file = request.FILES.get('upload')
if file:
try:
with open(os.path.dirname(__file__) + os.sep + '..' + os.sep + 'static' + os.sep + 'uploads'+ os.sep + file.name, "wb+") as fp:
for chunk in file.chunks():
fp.write(chunk)
pass
except Exception as e:
return HttpResponse(json.dumps({'uploaded': 0, 'fileName': "", 'url': ""}), content_type="application/json")
pass
return HttpResponse(json.dumps({'uploaded': 1, 'fileName':file.name, 'url': os.sep + 'static' + os.sep + 'uploads'+ os.sep + file.name}), content_type="application/json")
else:
return HttpResponse(json.dumps({'uploaded': 0, 'fileName': "", 'url': ""}), content_type="application/json")
pass
userinfo.html
{% include 'top.html' %}
{% include 'left.html' %}
系统管理
用户信息管理
用户信息
{{ message }}
用户ID
用户名
用户性别
部门
操作
{% include 'footer.html' %}
{% load static %}
增删改查就完成了,有的不重要的html代码没有粘贴,无伤大雅,每个人的前端页面都不一样。