一个NB的网站:

https://www.toolfk.com/

CDN:将用户的需求送到最近的节点:内容分发网络

有些是专门做CDN的工具

常用的markdown是需要知道的,短信有字数限制.

websocket:客户端与服务器,http是客户端向服务端发消息,服务端是找不到客户端的,怎么办?

  websocket是服务端也可以发消息发送给客户端,例如:网易的聊天室

短网站:

大纲内容:

1.表模型介绍

2.表结构介绍

3.前端ui插件介绍

4.用户列表

1.表模型介绍

domain是域名

   

2.表结构介绍

写在model里边的文件?数据库创建

from django.db import models
from django.contrib.auth.models import User, Group
from django.contrib.auth.models import AbstractUser # Create your models here.
status = (
("", "等待更新"),
("", "更新中"),
("", "等待测试"),
("", "测试通过"),
("", "更新完成"),
("", "更新失败"),
("", "回滚成功"),
("", "回滚失败")
) class Project(models.Model):
"""
项目表
"""
Language = (
("", 'python'),
("", "java"),
("", 'go'),
("", "php"),
("", "html")
)
name = models.CharField(verbose_name='项目名', max_length=200, unique=True)
boss = models.ManyToManyField('UserProfile', verbose_name='责任人', related_name="boss")
dev_user = models.ManyToManyField('UserProfile', verbose_name="研发人员", related_name="dev_user")
test_user = models.ManyToManyField('UserProfile', verbose_name="测试人员", related_name="test_user")
ops_user = models.ManyToManyField('UserProfile', verbose_name="运维人员", related_name="ops_user")
path = models.CharField(verbose_name='项目目录', max_length=200)
git_path = models.CharField(verbose_name='git地址', max_length=200)
nginx_host = models.ManyToManyField('Host', verbose_name='nginx机器', related_name="nginxhost")
nginx_conf = models.CharField(verbose_name='nginx配置文件', max_length=200, null=True, blank=True)
server_host = models.ManyToManyField('Host', verbose_name='后端主机', related_name="host")
language = models.CharField(verbose_name='语言', choices=Language, default="", max_length=20)
domain = models.CharField(verbose_name='域名', null=True, blank=True, max_length=100)
note = models.CharField(verbose_name='备注信息', max_length=218, null=True, blank=True)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
status = models.CharField(verbose_name="状态", choices=(("", "可用"), ("", "下线")), default="", max_length=2) class Meta:
ordering = ("-create_time",) #??? def __str__(self):
return self.name class Host(models.Model):
env = (
("", '开发'),
("", "测试"),
("", "预生产"),
("", "生产")
)
Type = (
("", "nginx"),
("", "redis"),
("", "db"),
("", "server"), )
status = (
("", "在线"),
("", "下线"),
("", "维修"),
)
name = models.CharField(verbose_name="主机名", max_length=200, unique=True)
hostip = models.GenericIPAddressField(verbose_name='主机ip地址')
env = models.CharField(verbose_name='环境', choices=env, default="", max_length=20)
version = models.CharField(verbose_name="系统版本", max_length=50, null=True, blank=True)
type = models.CharField(verbose_name="类型", choices=Type, default="", max_length=20)
ssh_port = models.CharField(verbose_name="ssh端口", default=22, max_length=10)
status = models.CharField(verbose_name="状态", choices=status, default="", max_length=2) def __str__(self):
return self.hostip class Issue(models.Model):
"""
# 更新表
"""
project = models.ForeignKey(Project, verbose_name='发布项目')
user = models.ForeignKey("UserProfile", verbose_name='发布人')
create_time = models.DateTimeField("创建时间", auto_now_add=True)
type = models.CharField(verbose_name='更新类型', choices=(("", "文件"), ("", "git")), default="", max_length=20, )
status = models.CharField(verbose_name='更新状态', choices=status, default="", max_length=20)
version = models.CharField(verbose_name="版本", null=True, blank=True, max_length=100)
backup = models.CharField(verbose_name='备份状态', choices=(("", "是"), ("", "否")), default="", max_length=20)
backup_path = models.CharField(verbose_name='备份文件路径', max_length=2048, null=True, blank=True)
upload_path = models.CharField(verbose_name='上传文件路径', max_length=2048, null=True, blank=True) class Meta:
ordering = ['-create_time'] class Host_Issue(models.Model):
"""
# 主机的更新信息表
"""
project = models.ForeignKey(Project, verbose_name='发布项目')
host = models.ForeignKey(Host, verbose_name='发布机器')
issue = models.ForeignKey(Issue, verbose_name='更新')
status = models.CharField(verbose_name='更新状态', choices=status, default="", max_length=20) class Command(models.Model):
"""
命令表
"""
command = models.CharField(verbose_name="命令", max_length=200)
result = models.CharField(verbose_name="结果", max_length=2000)
hosts_list = models.CharField(verbose_name="执行机器", max_length=20000)
user = models.ForeignKey('UserProfile', verbose_name='用户')
create_time = models.DateTimeField("创建时间", auto_now_add=True) class Meta:
ordering = ['-create_time'] class UserProfile(models.Model):
"""
用户表
"""
name = models.CharField(verbose_name="用户名称", max_length=200)
email = models.CharField(verbose_name="邮箱地址", max_length=200)
password = models.CharField(verbose_name="密码", max_length=200)
role = models.CharField(verbose_name='角色', choices=(("", "开发"), ("", "测试"), ("", '运维')), default="",max_length=10)
is_admin = models.CharField(verbose_name='管理员', choices=(("", "Admin"), ("", "普通")), default="",max_length=10)
is_unable = models.CharField(verbose_name='是否可用', choices=(("", "可用"), ("", "不可用")), default="",max_length=10)
department = models.CharField(verbose_name='部门', blank=True, null=True, max_length=10)
phone = models.CharField(verbose_name='手机号', blank=True, null=True, max_length=11)
create_time = models.DateTimeField("创建时间", auto_now_add=True) class Meta:
ordering = ['-create_time'] def __str__(self):
return self.name class Cron(models.Model):
"""
计划任务
"""
name = models.CharField(verbose_name="计划名称", unique=True, max_length=64)
hosts_list = models.ManyToManyField(Host, verbose_name="执行机器")
user = models.CharField(verbose_name="执行用户", null=True, blank=True, default='root', max_length=256)
job = models.CharField(verbose_name="计划", max_length=1024)
time = models.CharField(verbose_name="计划任务执行的时间", max_length=64)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
create_user = models.ForeignKey(UserProfile, verbose_name="创建者")
note = models.CharField(verbose_name="计划描述", null=True, blank=True, max_length=256) class Meta:
ordering = ['-create_time'] def __str__(self):
return self.name class Init(models.Model):
"""
初始化表
"""
name = models.CharField(verbose_name="名称", unique=True, max_length=64)
function = models.CharField(verbose_name="初始化功能", unique=True, max_length=64)
play_book = models.CharField(verbose_name="playbook路径", max_length=100)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
create_user = models.ForeignKey(UserProfile, verbose_name="创建者") class Meta:
ordering = ('-create_time',) def __str__(self):
return self.name class InitLog(models.Model):
"""
初始化日志表
"""
init = models.ForeignKey(Init, verbose_name="初始化功能")
hosts_list = models.ManyToManyField(Host, verbose_name="执行机器")
user = models.ForeignKey(UserProfile, verbose_name="创建者")
create_time = models.DateTimeField("创建时间", auto_now_add=True)
result=models.CharField(verbose_name="结果",max_length=1000,null=True,blank=True) class Meta:
ordering = ('-create_time',)

首先是,下图中的状态,

上图中的"可用",是针对项目而言的.

在多个字段对应同一张表中的用户

related_name代表别名.反向查询的作用

Meta用来定义表中的一些规则.

在数据库中倒序还是拿出来倒序?

str代表什么?显示object,写上就显示对应的return的值.

GenericIPAddressField字段表示什么?代表IPV4的地址和IPV4的地址
version表示版本
unique表示唯一
ssh_port默认是22

是否备份的状态,

3.前端ui插件介绍

两点:

所有项目添加和修改都需要,模态框modelform来做

ajax发送请求.

将原来的静态文件static单独拿出来,放在

js文件:

直接从"网络操作开始看",

看一下ui.msg的位置,跳转到下图的位置

点击113行的success,走到,上图289的success.

this代表执行自己的_showMsg方法,级别是success.

_showMsg也执行了一个函数.

swith代表循环

sco.js文件

上边显示的是两种效果.

如果不执行,就会调用回调函数.

在1000ms之后执行这个事件.

#刷新当前的界面

点击进入go

上图是跳转到百度首页

以上这个方法是直接关闭.

boxClose默认值是false.

如果图标icon不为空,就需要remove掉

上边是case为0,下面case为1,处理

如果是401和403,那么就没有权限.

上边是请求失败,404找不到页面,500是服务器错误.

$.ajax就是纯正的发送ajax请求.

下边的ajaxForm不用.

go和to的区别:go多了一个setup的时间,需要等待1000ms

confirm这个函数

在确认对话框中找到上边的内容,下图是传递的参数

下面是传递的方法.

上图是ui.common.js的位置

content显示的是内容.

box定义的信息.

直接return掉了.

jbox的小插件.

重新定义一个模态框.

在github上边点击一下红色位置

上图是设置的宽高和ajax请求.

点击按钮从sending=>AJAX得到请求

结束之后,设置的内容.

上边是定义关闭的类型,下面开始写一下.

上图是原来的样式,下面我们做一下修改.

添加一个主页:

在上边写一个div伪装成一个按钮.

btn代表按钮   btn-success代表颜色,create_btn代表重新命名.btn-sm表示制作一个小按钮.

class可以重复,但是id不可以重复.

导入静态文件.我们就可以使用静态文件中的box方法了.

这个时候,我们就有了"创建",这个按钮了.

这个时候,点击应该出来模态框,但是迟迟没有出来???

修改一下js.html文件和css.html文件

js.html文件:

{% load static %}
<!-- jQuery 3 -->
<script src="{% static 'plugins/jquery/jquery.min.js' %}"></script>
<!-- jQuery UI 1.11.4 -->
<script src="{% static 'plugins/jquery-ui/jquery-ui.min.js' %}"></script>
<!-- Resolve conflict in jQuery UI tooltip with Bootstrap tooltip -->
<script>
$.widget.bridge('uibutton', $.ui.button);
</script>
<!-- Bootstrap 3.3.7 -->
<script src="{% static 'plugins/bootstrap/js/bootstrap.min.js' %}"></script>
<!--img-->
<script src="{% static 'plugins/raphael/raphael.min.js' %}"></script>
<!-- Sparkline -->
<script src="{% static 'plugins/jquery-sparkline/jquery.sparkline.min.js' %}"></script>
<!-- jQuery Knob Chart -->
<script src="{% static 'plugins/jquery-knob/jquery.knob.min.js' %}"></script>
<!-- daterangepicker -->
<script src="{% static 'plugins/moment/min/moment.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap-daterangepicker/daterangepicker.js' %}"></script>
<!-- datepicker -->
<script src="{% static 'plugins/bootstrap-datetimepicker/js/bootstrap-datetimepicker.js' %}"></script>
<!-- FastClick -->
<script src="{% static 'plugins/fastclick/fastclick.js' %}"></script>
<!-- AdminLTE App -->
<script src="{% static 'AdminLTE/js/adminlte.min.js' %}"></script>
<!--使用新的模态框-->
<script type="text/javascript" src="{% static 'plugins/jBox/jBox.min.js'%}"></script>
<script src="{% static 'plugins/bootstrap-scojs/js/sco.modal.js' %}"></script>
<script src="{% static 'plugins/bootstrap-scojs/js/sco.confirm.js' %}"></script>
<script src="{% static 'plugins/bootstrap-scojs/js/sco.message.js' %}"></script>
<!--cookie-->
<script src="{% static 'plugins/jquery-cookie/jquery-cookie.js' %}"></script>
<!--多选-->
<script src="/static/plugins/select2/js/select2.min.js"></script> <!-- AdminLTE dashboard demo (This is only for demo purposes) 用来修改浏览器延时-->
<script src="{% static 'plugins/fastclick/fastclick.js' %}"></script> <script src="{% static 'AdminLTE/js/pages/dashboard.js' %}"></script>
<script src="{% static 'js/common/ui.common.js' %}"></script>
<!-- AdminLTE for demo purposes -->
<script src="{% static 'AdminLTE/js/demo.js' %}"></script>
<!--消息提醒,消息会在一段时间后自动消失,不需要单击"确定"按钮-->
<script src="{% static 'plugins/jquery-growl/jquery.grow.js' %}"></script> <!-- 上传文件 -->
<script src="{% static 'plugins/kartik-v-bootstrap-fileinput/js/fileinput.js' %}"></script>
<!-- highlight.js -->

css.html文件

{% load static %}
<!-- Bootstrap 3.3.7 -->
<link rel="stylesheet" href="{% static 'plugins/bootstrap/css/bootstrap.min.css' %}">
<!-- Font Awesome -->
<link rel="stylesheet" href="{% static 'plugins/font-awesome/css/font-awesome.min.css' %}">
<!-- Ionicons -->
<link rel="stylesheet" href="{% static 'plugins/Ionicons/css/ionicons.min.css' %}">
<!-- Theme style -->
<link rel="stylesheet" href="{% static 'AdminLTE/css/AdminLTE.min.css' %}">
<!-- AdminLTE Skins. Choose a skin from the css/skins
folder instead of downloading all of them to reduce the load. -->
<link rel="stylesheet" href="{% static 'AdminLTE/css/skins/_all-skins.min.css' %}">
<link rel="stylesheet" href="{% static 'plugins/jBox/jBox.css' %}">
<link rel="stylesheet" href="{% static 'plugins/jBox/themes/TooltipDark.css' %}">
<link rel="stylesheet" href="{% static 'plugins/bootstrap-scojs/css/scojs.css' %}">
<link rel="stylesheet" href="{% static 'plugins/bootstrap-scojs/css/sco.message.css' %}">
<!-- Date Picker -->
<link rel="stylesheet" href="{% static 'plugins/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css' %}">
<!-- Daterange picker -->
<link rel="stylesheet" href="{% static 'plugins/bootstrap-daterangepicker/daterangepicker.css' %}"> <link rel="stylesheet" href="{% static 'plugins/select2/css/select2.min.css' %}"> <link rel="stylesheet" href="{% static 'plugins/kartik-v-bootstrap-fileinput/css/fileinput.css' %}">
<link rel="stylesheet" href="{% static 'css/main.css' %}">

点击按钮:

弹出下面的窗体.

我们得到上边的三种触发点击方式.

draggable设置成title则可以拖动弹出的窗体.

ajax指代的就是下面的ajaxOptions的值.

源码中的ajax也就是默认请求的.

在上图中的Options中选择,

找到上图中的这个位置.integer代表可以填写的参数

Animation

footer原来默认是true,我们修改成false.

true的情况下,会出现下面右下角的脚标,因此设置成false就可以了

checkall代表全选,这个不用.

思考可不可以按照上图这样写?

remote目的就是弹出home2.下面,我们再添加一个别名home2.

刷新上图界面,

点击创建,得到上边的弹框"da".

下面,我们继续写视图函数.

点击"创建",

点击"创建home2",显示没有权限,也就是403错误

后端也没有获取到相应的值.

我们需要将settings.py里边的这个csrf注释掉

这个时候,我们再次点击,得到"请求发送失败".

思考,是谁调用的这个?"请求发送失败"

ctrl键可以找到上边的内容

但是服务端已经拿到数据了,这是怎么回事?

原因:服务器期待返回的是json数据类型.但是现在返回的是HttpResponse,因此存在问题.

导入上图这个模块.

这个时候,我们再重新启动,

刷新上边的界面,点击创建,再次尝试

这个时候,成功了.但是页面没有关闭,怎么处理呢?重新跳转到home页面

这个时候,我们再次启动,得到下面的结果:

这样点击home2中的创建就可以重新跳转回这个home页面了

上边js文件中的icon的作用是什么呢?

上图是我们需要获取的位置.

上边的home2页面中的小图标就会转动5s,才会跳转到home页面

上图中的btn在点击"创建home2"的时候,处于不可点击的状态,

因此,上图中的icon可以直接写死,

将原来的默认为null修改成$(".wait"),

注意,这个views.py还需要登录视图

get和post差不多,但是区别在于get很少用data

我们将上图中的btn修改成上图的默认值.

reload和go以及callback都是没有默认值的.

url代表url的地址.

上图是我们通过ui.box打开这个界面home2

4.用户列表

下面从简单的标签到form表单.

前端的列表用到的simple.html

前端的界面用上图中的样式就行.

将上边的simple.html放在项目中

创建一个userlist.html

Responsive Hover Table搜索这个词组

这个时候,我们只需要将这个div模块放在div里边就可以了.

这个时候,我们需要返回userlist.html文件

这个时候的弹出就会是上图的样子.

这个时候,上图就是我们得到的结果

这个时候,我们需要继承这个模板在上边的内容.

运行:得到下图的内容

按钮不太好看,将button换成div

注意,添加页面里边一定不要写submit.原因是submit走的是form.

运行,得到上边的界面

1.想办法将上图的两个位置变成用户列表

2.分页尽量用后端的,前端不能承受太大的压力.

回顾:

1.django

2.crm

3.分页

4.登录注册

5.增删改查

巨蟒python全栈开发-第11阶段 ansible_project2的更多相关文章

  1. 巨蟒python全栈开发-第11阶段 ansible_project3

    今日大纲: 1.用户创建 2.前端优化 3.用户编辑 4.用户删除 5.ansible api介绍 1.用户创建 新建一个user_create.html的页面 <form class=&quo ...

  2. 巨蟒python全栈开发-第11阶段 ansible_project1

    今日大纲: 1.前端页面介绍 2.发布流程 3.需求分析 4.表结构设计 5.前端页面设计 昨日内容回顾: 1.roles - tasks - handlers - files - templates ...

  3. 巨蟒python全栈开发-第11阶段 devops-git&&openpyxl2

    大纲 1.git分支 2.git tag 3.git 忽略文件 4.正则表达式 5.openpyxl写数据 6.openpyxl读数据 1.git分支 2.git tag 3.git 忽略文件 4.正 ...

  4. 巨蟒python全栈开发-第11阶段 devops-git入门1

    大纲 1.git命令初识 2.git reset与diff 3.git区域总结 4.git 远程仓库 5.git stash 1.git命令初识 2.git reset与diff 3.git区域总结 ...

  5. 巨蟒python全栈开发-第11阶段 ansible_project7

    今日大纲 1.发布详情页面 2.前端页面获取分支信息 3.前端界面获取commit信息与tag信息 4.获取线上最新版本 5.发布之实现nginx下线 6.发布之实现server发布 7.前端页面按钮 ...

  6. 巨蟒python全栈开发-第11阶段 ansible_project6

    今日大纲: 1.计划任务前端页面 2.计划任务新增实现 3.计划任务编辑 4.项目详情 5.文件上传 6.replace模块介绍 1.计划任务前端页面 2.计划任务新增实现 3.计划任务编辑 4.项目 ...

  7. 巨蟒python全栈开发-第11阶段 ansible_project5

    今日大纲 1.命令展示前端页面实现(下面有个断点) 2.命令下发后端展示

  8. 巨蟒python全栈开发-第11阶段 ansible_project4

    1.主机的增删改查 2.初始化的增删改查 3.项目的增删改查

  9. 巨蟒python全栈开发-第11阶段 ansible3_4

    1.ansible  roles 2.nginx+uwsgi扩展 3.celery异步任务 4.celery延时任务 5.周期任务 6.celery与django结合 7.网络基础 8.celery监 ...

随机推荐

  1. UVA11722 Jonining with Friend

    Joining with Friend You are going from Dhaka to Chittagong by train and you came to know one of your ...

  2. Django项目:CRM(客户关系管理系统)--50--41PerfectCRM实现全局账号密码修改

    # gbacc_urls.py # ————————38PerfectCRM实现全局账号登录注销———————— from django.conf.urls import url from gbacc ...

  3. 【noip】跟着洛谷刷noip题2

    noip好难呀. 上一个感觉有点长了,重开一个. 36.Vigenère 密码 粘个Openjudge上的代码 #include<cstdio> #include<iostream& ...

  4. poj 1144 Network(割点 入门)

    Network Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10907   Accepted: 5042 Descript ...

  5. 自定义确定框(confirm)

    1.先引入 confirm.css @charset "UTF-8"; lq-alert { width: 100%; height: 100%; background: rgba ...

  6. 为什么要使用ul li布局网站导航条?使用ul li布局网站网页导航必要性

    会布局的都知道网站导航条布局非常重要,可能一个导航条最终布局效果有时可以使用ul li列表标签布局,有时可以不用ul li布局,而是直接一个div盒子里直接放锚文本超链接的栏目名称,也能实现,看下图. ...

  7. Linux下安装docker,更改镜像仓库地址,并部署springboot应用

    今天做不成的事,明天也不会做好. 各位同学大家好,随着docker的快速发展,越来越多的人开始使用,一方面随着容器化这个趋势越来越火,docker成为了其中的佼佼者:二来容器化确实降低了运维的门槛,让 ...

  8. Win7。56个进程让我头疼

    乱七八糟的进程一个一个往外蹦,如此痛苦. 安装了一个VM9,进程数量+5,安装了卖咖啡的,进程数量+5. 除去这10个,系统进程数量还有46个....还是太多... 64位系统,真的很痛苦,还没有怎么 ...

  9. python 模拟实验

  10. 【模板】Vector存图 + SPFA

    最近愉快地决定要由边集数组转向Vector存图,顺便开始图论集训 老惯例,以题写模板 P1339 [USACO09OCT]热浪Heat Wave 题目描述 The good folks in Texa ...