任务信息
任务ID | 任务名称 | 操作 |
---|
Django是利用Python语言从事Web开发的首选框架。
Django在发展过程中,为了达到非常高效率的网站结构搭建,提供给开发人员一个干净的项目结构,让开发人员更多精力集中在功能开发上,而不是技术实现上,所有Django对于常规的MVT处理进行了升级——MVT处理模式。
MVT处理模式:实在MVT处理模式上,升级得到的一种更加符合实际项目开发流程的处理思路,在这种处理模式中,将功能比较单一的控制器Controller部分,封装成了路由,由路由来完成请求的分发操作【路由是通过配置实现的】
M(model)模型层、类以及跟数据库相关的代码;
V(view)视图层
T(templates)模板层
其优点也很多,比如功能完善,要素齐全;强大的数据库访问组件;先进的App设计理念;自助式的管理系统admin以及其debug信息全面和完善的文档等。
djangoproject(项目文件名)
—djangoproject(初始文件夹)
——settings.py(配置文件)
——urls.py(路由文件)
——wsgi.py(WSGI机制)
—shopapp(右击选中Terminal 键入python manage.py startapp shopapp命令行生成该文件,包含如下子文件)
——migrations(不需要操作)
——static(包含js文件和css文件)
———js(js文件)
————jquery-3.2.1.min.js(引入jquery框架)
————shop.js(ajax具体应用)
——admin.py(注册model中的类)
——apps.py(注册app)
——model.py(右击选中Terminal 键入python manage.py inspectdb > shopapp/models.py 自动生成settings.py中配置的数据库中的各个表的数据列)
——tests.py
——views.py(CRUD的具体实现)
—templates(html文件)
——jobtaskinfo.html(html文件)
—manage.py(启动文件)
以下是所有文件代码(顺序同上):
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
from django.contrib import admin
from django.urls import path
from shopapp.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('', index),
path('gologin.do', 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)
]
wsgi.py
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoproject.settings')
application = get_wsgi_application()
shop.js
function getJobTaskData(currentPage, pageSize, opr, taskId) {
var taskTitle = document.searchForm.taskTitle.value
var taskURL = document.searchForm.taskURL.value
if(opr == 'del'){
if(!confirm('确定要删除吗?')){
return false
}
}else if(opr == 'submitUpdate'){
taskTitle = document.taskForm.taskTitle.value
taskURL = document.taskForm.taskURL.value
taskId = document.taskForm.taskId.value
currentPage = document.taskForm.currentPage.value
pageSize = document.taskForm.pageSize.value
$('#modal-default').modal('hide')
}
$.ajax({
type: 'post', // 传数据的方式
url: '/ajaxjobtaskinfo/',
dataType: 'json', // xml、json、script、html
data:JSON.stringify({
'taskTitle': taskTitle, // $('#taskTitle') == document.getElementById('taskTitle')
'taskURL' : taskURL,
'taskId': taskId,
'pageSize': pageSize,
'currentPage': currentPage,
'opr': opr
}),
error: function(xhr, err){
alert('请求失败,请检查,' + err + '!')
},
success: function(data, textStatus){ // success对应的回调函数的第一个参数,是服务器返回的数据
// 查询后、删除后、修改后都走这个if
if(data.code == 1 && opr != 'update'){
var htmlText = ""
for(var i =0;i ' +
' \n' +
' ' + data.jobTaskData[i][0] + ' \n' +
' ' + data.jobTaskData[i][1] + ' \n' +
' ' + data.jobTaskData[i][2] + ' \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("操作成功")
}else if(opr != 'search' && data.updateResult <= 0){
alert("操作失败")
}
}else if(data.code == 1 && opr == 'update'){
document.taskForm.taskTitle.value = data.jobTaskData.taskTitle
document.taskForm.taskURL.value = data.jobTaskData.taskURL
document.taskForm.taskId.value = data.jobTaskData.taskId
document.taskForm.currentPage.value = data.currentPage
document.taskForm.pageSize.value = data.pageSize
$('#modal-default').modal()
}
}
});
}
$(document).ready(
function(){
getJobTaskData(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'
model.py
from django.db import models
class JobDept(models.Model):
dept_id = models.IntegerField(primary_key=True)
dept_name = models.TextField(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, on_delete=models.DO_NOTHING, blank=True, null=True) # jobDept__dept_id/
user_birth = models.DateTimeField(db_column = ' USER_BIRTH', blank = True, null = True) #Field name madelowercase.
user_intro = models.DateTimeField(db_column = ' USER_INTRO', blank = True, null = True)
class Meta:
managed = False
db_table = 't_user'
views.py
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')
rememberMe = request.POST.get('rememberMe')
result = userService.findUserByUserName(userName)
isLogin = False
if result and (rememberMe == None or rememberMe == 'false'):
if result[0][2] == hashlib.md5(userPwd.encode(encoding='utf-8')).hexdigest():
isLogin = True
elif result and rememberMe == 'false':
if result[0][2] == userPwd:
isLogin = True
result = userService.findUserByUserName(userName)
if result and result[0][2] == hashlib.md5(userPwd.encode(encoding='utf-8')).hexdigest():
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 rememberMe == 'false':
response.set_cookie('userName', userName)
response.set_cookie('userPwd', result[0][2])
response.set_cookie('rememberMe', 'true')
elif rememberMe == 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('userId')
# user.user_pwd = hashlib.md5((userDict.get('userPwd')). encode(encoding='utf-8')).hexdigest() # 表单提交的数据使用request.form[]
# user.user_pic = userDict.get('userPic')
# user.user_birth = datetime.strftime(userDict.get('userBirth'), '%Y-%m-%d')
# user.user_sex = userDict.get('userSex')
# user.user_intro = userDict.get('userIntro')
result = TUser.objects.create(
user_name=userDict.get('userId'),
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)
#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)
# 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:
# 将上传文件拆分成多个块(当上传文件大于2.5MB时,自动拆分),使用文件对象.chunks()函数。
for chunk in file.chunks():
fp.write(chunk)
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
jobtaskinfo.html
{% include 'top.html' %}
{% include 'left.html' %}
{% load static %}
系统管理
任务信息管理
任务信息
{{ message }}
任务ID
任务名称
操作
{% include 'footer.html' %}
manage.py
import os
import sys
def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoproject.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()