python 报障系统(完)
python 报障系统(完)
一、报障系统原理:
原理:
1. 简单管理 2. 角色多管理(权限)
a. 登录
session放置用户信息(检测是否已经登录)
session放置权限信息(检测是否有权访问)
{
'/index.html':[GET,EDIT],
'/order.html':[GET,EDIT],
'/xxx.html':[GET,EDIT...],
'/xxx.html':[GET,EDIT...],
'/xxx.html':[GET,EDIT...],
'/xxx.html':[GET,EDIT...],
'/xxx.html':[GET,EDIT...],
'/xxx.html':[GET,EDIT...],
'/xxx.html':[GET,EDIT...],
'/xxx.html':[GET,EDIT...],
'/xxx.html':[GET,EDIT...],
'/xxx.html':[GET,EDIT...],
'/xxx.html':[GET,EDIT...],
} session放置菜单权限信息(用于生成动态多级菜单) b. 访问网站其他功能: http://www.baiuc.om/xxx.hmtl
- 获取当前访问的URL, request.path_info
-
/xxx.hmtl?md=get
匹配1
/xxx.hmtl
session放置权限信息(检测是否有权访问)
{
'/index.html':[GET,EDIT],
'/order.html':[GET,EDIT],
'/xxx.html':[GET,EDIT...],
} 匹配2
/xxx.hmtl
session放置权限信息(检测是否有权访问)
{
'/index.html':[GET,EDIT],
'/order.html':[GET,EDIT],
'/xxx.html':[GET,EDIT...],
} request.permission_code = "EDIT"
request.permission_code_list = [GET,EDIT...] PS: 中间件实现 c. 视图函数 def xxx(request):
request.permission_code = "EDIT" # 业务逻辑的编写
request.permission_code_list = [GET,EDIT...] # 前端显示功能按钮 d. 模板 e. 创建动态菜单【多级菜单】
session中获取菜单权限信息(用于生成动态多级菜单)
- 当前用户权限
- 所有菜单
1. 权限挂到菜单上
2. 菜单父子关系处理
3. 递归生成菜单 辅助:
css
js 推荐:simple_tag
二、导入rbac包
rbac包中包含有
- 表
- 中间件
- service
- simple_tag settings中注册app 初始化权限信息: service.initail_permission(request,user_id) settings中配置中间件 {% rbac_menu reqeust %}
三、相关操作
"""
Django settings for s4rbacdemo project. Generated by 'django-admin startproject' using Django 1.11.2. For more information on this file, see
https://docs.djangoproject.com/en/1.11/topics/settings/ For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.11/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/1.11/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '8=2t3)nie8!gu3x25p%-%7h$^m#gx14we_v+tv+s%!r!)x&7a9' # 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',
'web',
'rbac', ] 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',
'rbac.middleware.rbac.RbacMiddleware'
] ROOT_URLCONF = 's4rbacdemo.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 = 's4rbacdemo.wsgi.application' # Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
} # Password validation
# https://docs.djangoproject.com/en/1.11/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/1.11/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/1.11/howto/static-files/ STATIC_URL = '/static/'
STATICFILES_DIRS=[
os.path.join(BASE_DIR,'static'),
] #无需权限控制的URL
RBAC_NO_AUTH_URL=[
'/login.html',
'/index.html',
'trouble.html',
'/register.html',
'/admin.*',
'/rbac.*'
] #Session中保存权限信息的Key
RBAC_PERMISSION_SESSION_KEY = "rbac_permission_session_key" #Http请求中传入的参数,根据其获取GET、POST、EDIT等检测用户是否具有相应权限
# 例如:
# http://www.example.com?md=get 表示获取
# http://www.example.com?md=post 表示添加
# http://www.example.com?md=delete 表示删除 RBAC_QUERY_KEY = "md" RBAC_DEFAULT_QUERY_VALUE="LOOK" #无权访问时,页面提示信息
RBAC_PERMISSION_MSG = "无权限访问" #Session中保存菜单和权限信息的Key
RBAC_MENU_PERMISSION_SESSION_KEY = "rbac_menu_permission_session_key"
RBAC_MENU_KEY = "rbac_menu_key"
RBAC_MENU_PERMISSION_KEY = "rbac_menu_permission_key" #菜单主题
RBAC_THEME = "default"
settings
from django.conf.urls import url
from django.contrib import admin
from web import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login.html$',views.login),
url(r'^index.html$', views.index),
url(r'^trouble.html$', views.trouble),
url(r'^trouble-kill.html$', views.trouble_kill),
url(r'^report.html$', views.report),
]
from django.shortcuts import render,HttpResponse,redirect
from web import models
from django.db.models import Count
from rbac.service import initial_permission #导入初始值权限
from django.db.models import Q
import datetime
import json def login(request):
if request.method == "GET":
return render(request,'login.html')
else:
u=request.POST.get("username")
p=request.POST.get("password")
obj=models.UserInfo.objects.filter(user__username=u,user__password=p).first()
# 从数据库中匹配用户密码
if obj: #登录成功 获取当前用户权限和菜单 去配置文件中获取key,写入session中
request.session["user_info"]={'username':u,'password':p,'nickname':obj.nickname,'nid':obj.id}
initial_permission(request,obj.user_id)
#通过用户id 和request进行初始化权限
#初始化权限,获取当前用户权限并添加到session中
#将当前用户权限信息转换为以下格式,并将其添 Session中
return redirect('/index.html')
#如果用户和密码存在数据库中就跳转到主页
else:
return redirect('/login.html')
#否则就跳转到登录页面
login.views
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form action="/login.html" method="POST">
{% csrf_token %}
<input type="text" name="username" />
<input type="password" name="password" />
<input type="submit" value="提交" />
</form>
</body>
</html>
{% load rbac %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style>
body{
margin: 0;
}
.pd-header{
height: 48px;
background-color: brown;
}
.pd-body .menu{
float: left;
width: 20%;
}
.pd-body .content{
float: left;
width: 80%;
} {% rbac_css %}
</style>
{% block css %}{% endblock %}
</head>
<body>
<div class="pd-header"></div>
<div class="pd-body">
<div class="menu">{% rbac_menu request %}</div>
<div class="content">{% block content %}{% endblock %}</div>
</div> <script src="/static/jquery-3.2.1.js"></script>
<script>
{% rbac_js %}
</script>
{% block js %}{% endblock %}
</body>
</html>
母板.html
主页
def index(request):
if not request.session.get('user_info'):
# 如果session中没有值
return render(request,'login.html')
#就跳转到登录页面
return render(request,'index.html')
#session中有值,就跳转到主页
主页.html(继承里母板)
{% extends 'layout.html' %} {% block content %}
欢迎登录:{{ request.session.user_info.nickname }}
{% endblock %}
报障相关.views
def trouble(request):
if request.permission_code == 'LOOK':
# 判断当前用户的权限是LOOK
trouble_list=models.Order.objects.filter(create_user_id=request.session['user_info']['nid'])
# 通过session中的id查看当前用户的的信息
return render(request,'trouble.html',{'trouble_list':trouble_list})
#把得到当前用户详细信息返回给html页面渲染
elif request.permission_code == 'DEL':
# 判断当前用户的权限是DEL
nid=request.GET.get('nid')
# 获取通过 get请求携带的id
models.Order.objects.filter(create_user_id=request.session['user_info']['nid'],id=nid).delete()
# 获取当前的用户id和创建订单的用户id在进行删除(为了防止,通过id删除别的用户的报障内容)
return redirect('/trouble.html')
#重定向到/trouble.html url
elif request.permission_code == 'POST':
# 判断当前用户的权限是POST
if request.method == 'GET':
# 如果是以GET方式访问
return render(request,'trouble_add.html')
#就返回一个html页面进行渲染
else:
# 不是以GET请求来的请求
title=request.POST.get('title')
# 获取标题
content=request.POST.get('content')
# 获取内容
models.Order.objects.create(title=title,detail=content,create_user_id=request.session['user_info']['nid'])
# 增加一条新的数据,标题等于刚获取到,内容也前端页面获取到的,发布报障用户id等于session中携带的id
return redirect('/trouble.html')
#重定向到 /trouble.html url
elif request.permission_code == 'EDIT':
# 判断当前用户的权限是EDIT
if request.method == 'GET':
# 如果是以GET请求执行下边代码
order_list=models.Order.objects.filter(create_user_id=request.session['user_info']['nid'])
# 通过当前登录的用户查询相关的报障信息
return render(request,'trouble_edit.html',{'order_list':order_list})
#把查询到报障信息返回到前端页面
else:
title=request.POST.get('title')
# 通过请求体中获取数据
detail=request.POST.get('detail')
# 通过请求体中获取数据
models.Order.objects.filter(create_user_id=request.session['user_info']['nid']).update(title=title,detail=detail)
# 找到发布报障人的id和当前的登录人的id相同的报障单进行更新修改
return redirect('/trouble.html')
#修改完成后重定向到 /trouble.html url
elif request.permission_code == 'DETAIL':
# 判断通过中间件重写的方法是不是等于DETAIL
ordet_list=models.Order.objects.filter(create_user_id=request.session['user_info']['nid'])
#通过当前登录的用户查询相关的报障信息
return render(request,'trouble_detail.html',{'ordet_list':ordet_list})
# 把查询到报障信息返回到前端页面
{% extends 'layout.html' %} {% block content %}
<div>
{% if "POST" in request.permission_code_list %}
{#通过的当前用户的所有操作列表判断,访问过来的操作在不在列表中#}
<a href="/trouble.html?md=post">添加</a>
{#如果在列表中就是显示添加#}
{% endif %}
</div>
<div>
<table border="">
{% for row in trouble_list%}
{#循环当前用户的保障信息#}
<tr>
<td>{{ row.title }}</td>
{#循环显示保障的标题#}
<td>{{ row.status }}</td>
{#循环显示保障的详细#}
<td>
{% if 'EDIT' in request.permission_code_list %}
{#通过的当前用户的所有操作列表判断,访问过来的操作在不在列表中#}
<a href="/trouble.html?md=edit&nid={{ row.id }}">编辑</a>
{#在当前页面显示编辑按钮#}
{% endif %}
{% if 'DEL' in request.permission_code_list %}
{#通过的当前用户的所有操作列表判断,访问过来的操作在不在列表中#}
<a href="/trouble.html?md=del&nid={{ row.id }}">删除</a>
{#在当前页面显示编辑按钮#}
{% endif %}
{% if 'DETAIL' in request.permission_code_list %}
{#通过的当前用户的所有操作列表判断,访问过来的操作在不在列表中#}
<a href="/trouble.html?md=detail&nid={{ row.id }}">查看详细</a>
{#在当前页面显示编辑按钮#}
{% endif %} </td>
</tr>
{% endfor %}
</table>
</div>
{% endblock %}
trouble.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form action="/trouble.html?md=post" method="POST">
{#创建一个form表单#}
{% csrf_token %}
{#设置 csrf_token #}
<input type="text" name="title" />
{#标题#}
<textarea name="content"></textarea>
{#内容#}
<input type="submit" value="提交" />
{#提交按钮#}
</form>
</body>
</html>
trouble_add.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/trouble.html?md=edit&nid={{ order_list.0.id }}" method="POST">
{#创建一个form表单#}
{% csrf_token %}
{#设置csrf_token #}
{% for i in order_list %}
{#循环后端返回的对象#}
<input type="text" value="{{ i.title }}" name="title">
{#标题内容是对象的title#}
<textarea name="detail">{{ i.detail }}</textarea>
{#报障内容是对象的detail#}
{% endfor %}
<input type="submit" value="提交">
{#设置一个提交按钮#}
</form> </body>
</html>
trouble_edit.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/trouble.html?md=edit&nid={{ order_list.0.id }}" method="POST">
{#创建一个form表单#}
{% csrf_token %}
{#设置csrf_token #}
{% for i in order_list %}
{#循环后端返回的对象#}
<input type="text" value="{{ i.title }}" name="title">
{#标题内容是对象的title#}
<textarea name="detail">{{ i.detail }}</textarea>
{#报障内容是对象的detail#}
{% endfor %}
<input type="submit" value="提交">
{#设置一个提交按钮#}
</form> </body>
</html>
trouble_detail.html
运维处理报障.views
def trouble_kill(request):
nid = request.session['user_info']['nid']
# 获取当前登录用户的id
if request.permission_code == 'LOOK':
# 判断通过中间件重新赋值的操作是不是查看
if request.method == 'GET':
# 判断是不是get请求
ordet_list = models.Order.objects.filter(Q(status=1)|Q(processor=nid))
# 获取报障单是未完成,以及和自己处理过的报障内容
return render(request, 'trouble_kill.html',{'ordet_list': ordet_list, })
# 把获取的未完成和已完成的列表返回给前端页面
elif request.permission_code == 'EDIT':
# 判断通过中间件重新赋值的操作是不是编辑
if request.method == 'GET':
# 判断是不是get请求
ordr_id=request.GET.get('nid')
# 获取报障单的id
if models.Order.objects.filter(id=ordr_id,processor_id=nid,status=2):
#通过报障的id和当前登录的用户和故障处理人查看,如果为真就表示抢单成功,但是未处理
obj = models.Order.objects.filter(id=ordr_id).first()
#获取报障单是提交时携带的id的内容
return render(request,'trouble_kill_edit.html',{'obj':obj})
#获取到报障单的相关信息,返回给前端页面
v = models.Order.objects.filter(id=ordr_id,status=1).update(processor_id=nid,status=2)
#通过报障单的id,同时进行抢单,抢到单后就执行更新数据(在更新后v会得到一个数据,数据是受影响的行数)
if not v:
#如果v不为True,就是代表报障单没抢到
return HttpResponse('小伙子,手速太慢了,回家多练练吧!!!')
# 在前前端显示提示
else:
obj = models.Order.objects.filter(id=ordr_id).first()
#获取当前报障单id相同的相关信息,表示抢到报障单
return render(request,'trouble_kill_ed it.html',{'obj':obj})
#获取报障单的相关信息返回给前端
else:
# 否则
solution=request.POST.get('solution')
# 通过请求体中获取数据
order_id=request.GET.get('nid')
# 通过请求头中获取数据
models.Order.objects.filter(id=order_id,processor_id=nid).update(status=3,solution=solution,ptime=datetime.datetime.now())
# 通过查询报障单id号,和当前的用户的id获取的内容更新内容,状态标识符改成3,处理意见内容,时间是date当前时间
return redirect('/trouble-kill.html')
#更新完数据后就跳转带 /trouble-kill.html url
{% extends 'layout.html' %}
{#继承母板#}
{% block content %}
{#重写模板的内容#}
<table border="">
{% for row in ordet_list %}
{#循环后端返回的对象#}
<tr>
<td>{{ row.title }}</td>
{#从对象中获取标题#}
<td>{{ row.create_user.nickname }}</td>
{#从对象中获取发布报障人的昵称#}
<td>{{ row.ctime|date:'Y-m-d H:i:s' }}</td>
{#从对象中获取时间并进行格式化处理#}
<td>{{ row.get_status_display }}</td>
{#从对象中获取这个字段元组中最后的内容#}
{% if 'EDIT' in request.permission_code_list %}
{#判断如果当前用户的操作列表只有EDIT方法#}
<td><a href="trouble-kill.html?md=edit&nid={{ row.id }}">处理</a></td>
{#显示这个标签,可以让运维人员进行抢单,以a标签显示#}
</tr>
{% endif %}
{% endfor %}
</table>
{% endblock %}
trouble_kill.html
{% extends 'layout.html' %}
{#继承母板#}
{% block content %}
{#重写模板的内容#}
<form action="/trouble-kill.html?md=edit&nid={{ obj.id }}" method="POST">
{#创建一个form表单#}
{% csrf_token %}
{#设置 csrf_token #}
<div>
<p>{{ obj.title }}</p>
{#通过对象获取标题#}
<p>{{ obj.detail }}</p>
{#通过对象获取内容#}
<p>{{ obj.ctime }}</p>
{#通过对象获取时间#}
</div>
<textarea name="solution"></textarea>
{#创建一个文本编辑框#}
<input type="submit" value="提交">
{#设置一个提交按钮#}
</form>
{% endblock %}
trouble_kill_edit.html
量化运维人员工作量视图
def report(request):
if request.permission_code == 'LOOK':
#判断通过中间件重写的值是不是等于LOOK
if request.method == 'GET':
#判断是不是以get请求
return render(request,'report.html')
#到前端显示内容
else:
result=models.Order.objects.filter(status=3).values_list('processor__nickname').annotate(C=Count(1))
# 查询报障单的状态码等于3的,通过处理人的名称进行去重分组,(注意报障人姓名要设置成唯一的不然数据会出现混乱)
ymd_list = models.Order.objects.filter(status=3).extra(
select={'ymd': "strftime('%%s',strftime('%%Y-%%m-%%d',ptime))"}).values(
'processor_id',
'processor__nickname',
'ymd').annotate(ct=Count('id'))
# 查询报障单的状态码等于3的,在通过额外的查询把数据库的时间格式化成年月日并进行去重和组合后又格式化成时间戳秒显示的格式,在以解决报障的人的id和名称进行分组,并统计总数
ymd_dict={}
# 创建一个新字典
for row in ymd_list:
# 循环刚刚以时间组合的列表
key = row['processor_id']
# 获取到每次循环的内容赋值到key变量中
if key in ymd_dict:
# 判断如果变量 key的值在字典ymd_dict中
ymd_dict[key]['data'].append([float(row['ymd'])*1000,row['ct']])
# 通过key找到值,因为是字典嵌套字典又通过['data']找到列表把数据追加到列表中
else:
ymd_dict[key] = {'name': row['processor__nickname'],'data': [[float(row['ymd'])*1000, row['ct']], ]}
# 判断如果字典中没有变量key就创建一个字典,键就是key变量,值是一个字典,
response={
# 定一个字典,字典中存放俩组数据
'pie':list(result),
# 饼图对应的数据
'zhexian':list(ymd_dict.values())
#折线对应的数据是字典,只把字典的值以列表的形式存放
}
return HttpResponse(json.dumps(response))
#把刚创建的字典通过json序列化成字符串返回
{% extends 'layout.html' %}
{#继承母板#}
{% block content %}
{#重写母板内容#}
<div id="container" style="min-width: 300px;height: 300px"></div>
{#这个是饼图的显示大小#}
<div id="container2" style="min-width: 500px;height: 500px"></div>
{#这个是折线的显示大小#}
{% endblock %} {% block js %}
{#重写母板的js#}
<script src="https://img.hcharts.cn/highcharts/highcharts.js"></script>
<script src="https://img.hcharts.cn/highcharts/modules/exporting.js"></script>
<script src="https://img.hcharts.cn/highcharts-plugins/highcharts-zh_CN.js"></script>
{#使用在线插件#}
<script>
$(function () {
{#页面加载时执行这个函数#}
Highcharts.setOptions({
{##}
global: {
useUTC: false
}
});
$.ajax({
{#通过ajax向后台获取数据#}
url: '/report.html',
{#后台url#}
type: "POST",
{#提交方式#}
data: {'csrfmiddlewaretoken': '{{ csrf_token }}'},
{#通过data把 csrf_token携带上#}
dataType: 'JSON',
{#以json格式转换数据#}
success: function (arg) {
{#设置回调函数,获取后台返回的值#}
console.log(arg);
{#打印后台返回的值#}
$('#container').highcharts({
{#找到标签设置图例的属性和参数#}
chart: {
plotBackgroundColor: null,
plotBorderWidth: null,
plotShadow: false
},
title: {
text: '运维人员处理报障占比'
{#饼图的标题#}
},
tooltip: {
headerFormat: '{series.name}<br>',
pointFormat: '{point.name}: <b>{point.percentage:.1f}%</b>'
},
plotOptions: {
pie: {
allowPointSelect: true,
cursor: 'pointer',
dataLabels: {
enabled: true,
format: '<b>{point.name}</b>: {point.percentage:.1f} %',
style: {
color: (Highcharts.theme && Highcharts.theme.contrastTextColor) || 'black'
}
}
}
},
series: [{
type: 'pie',
name: '运维人员处理报障占比',
data: arg.pie
}]
}); Highcharts.chart('container2', {
title: {
text: '每日处理订单详细',
x: -20 //center
},
subtitle: {
text: '...',
x: -20
},
legend: {
layout: 'horizontal', align: 'center',
verticalAlign: 'bottom',
borderWidth: 1
},
xAxis:{
type:'datetime',
labels:{
formatter:function(){
return Highcharts.dateFormat("%Y-%m-%d",this.value);
//return this.value;
}
},
{# minTickInterval:24#}
},
series: arg.zhexian
});
}
}); })
</script> {% endblock %}
report.html
python 报障系统(完)的更多相关文章
- 十分钟快速入门 Python,看完即会,不用收藏!
本文以 Eric Matthes 的<Python编程:从入门到实践>为基础,以有一定其他语言经验的程序员视角,对书中内容提炼总结,化繁为简,将这本书的精髓融合成一篇10分钟能读完的文章. ...
- Python入门教程完整版(懂中文就能学会)
前几天给大家分享<从零学会Photoshop经典教程300集>的教程受到了广泛的关注,有人不知道怎么领取,居然称小编为"骗子". 不过小编的内心是强大的,网友虐我千百遍 ...
- Python云端系统开发入门——框架基础
Django框架基础 这是我学习北京理工大学嵩天老师的<Python云端系统开发入门>课程的笔记,在此我特别感谢老师的精彩讲解和对我的引导. 1.Django简介与安装 Django是一个 ...
- python 保障系统(一)
python 保障系统 from django.shortcuts import render,redirect,HttpResponse from app01 import models from ...
- Python云端系统开发入门 pycharm代码
html <!DOCTYPE html><html><head> <meta charset="UTF-8"> <title& ...
- 【转】Python之系统交互(subprocess)
[转]Python之系统交互(subprocess) 本节内容 os与commands模块 subprocess模块 subprocess.Popen类 总结 我们几乎可以在任何操作系统上通过命令行指 ...
- python获取系统内存占用信息的实例方法
psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要应用于系统监控, ...
- python选课系统
程序名称: 选课系统 角色:学校.学员.课程.讲师 要求: 1. 创建北京.上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海 ...
- 举例讲解Linux系统下Python调用系统Shell的方法
有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的.那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法:1. os 模块 ...
随机推荐
- 【redis源码阅读】redis对象
结构定义 在redis中,对象的数据结构定义如下: typedef struct redisObject { unsigned type:4; unsgined encoding:4; uns ...
- NGUI_Label
五.Label是标签,一般是用来显示文字使用,当然NGUI的扩展性很强,可以通过添加相关的控件组成组合控件来进行复杂功能的使用. 1. 设置字体:可以设置NGUI中的字体,也可以设置Unity中的字体 ...
- 常用的Oracle函数收集
to_char(); count(); avg(); sum(); to_date('时间','格式'); NVL(,); NVL2(); substr(); case when then ...
- SqlSever数据库实践周
资源下载 进行了为期5天的数据库设计,虽然以前用过数据库,但是这一次是使用书上规范的设计流程设计的数据库,感觉有必要记录一下,希望对其他人有帮助. 我的收获:在这个博客中会体现到我的收获,对于将要进行 ...
- http,socks4,socks5代理的区别
HTTP代理 能够代理客户机的HTTP访问,主要是代理浏览器访问网页,它的端口一般为80.8080.3128等: SOCKS代理 SOCKS代理与其他类型的代理不同,它只是简单地传递数据包,而并不关心 ...
- 转载--MYSQL5.7:Access denied for user 'root'@'localhost' (using password:YES)解决方法
1.打开MySQL目录下的my.ini文件,在文件的最后添加一行"skip-grant-tables",保存并关闭文件; 2.重启MySQL服务; 3.通过cmd行进入MySQL的 ...
- php设计模式八-----装饰器模式
1.介绍: 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- EM算法的直观描述
解决含有隐变量的问题有三种方法,其中第三种方法就是通常所说的em算法.下面以统计学习方法中给出的三硬币问题为例来分别描述这三种方法.(a,b,c三硬币抛出来为正的概率分别为pai,p,q,每轮抛硬币先 ...
- 『开源』设置系统 主音量(0~100 静音) VolumeHelper 兼容 Xp Win7 .Net 20 AnyCPU
背景: 近来的生活一团乱麻,没心态写高大上的代码,于是就着手 写了几个 辅助类. 在整理 InkFx.Utils 时,发现有几个 辅助类 只写了定义,没有实现函数体,于是就 花了1天时间 完善了一下. ...
- 第1次作业:这是我的一个响亮的标题X!
1.我是回答问题的部分 part 1: 从小学开始,我就觉得写作文是一件很痛苦的事情.(痛苦ing) 所以呢,选择工科好像就是理所当然的. 至于为什么选择计算机,主要原因就是不知道应该选什么,正好看到 ...