巨蟒python全棧開發-第11階段 ansible_project2

一個NB的網站:javascript

https://www.toolfk.com/php

CDN:將用戶的需求送到最近的節點:內容分發網絡css

有些是專門作CDN的工具html

經常使用的markdown是須要知道的,短信有字數限制.前端

websocket:客戶端與服務器,http是客戶端向服務端發消息,服務端是找不到客戶端的,怎麼辦?java

  websocket是服務端也能夠發消息發送給客戶端,例如:網易的聊天室python

短網站:jquery

大綱內容:nginx

1.表模型介紹git

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 = (
    ("0", "等待更新"),
    ("1", "更新中"),
    ("2", "等待測試"),
    ("3", "測試經過"),
    ("4", "更新完成"),
    ("5", "更新失敗"),
    ("6", "回滾成功"),
    ("7", "回滾失敗")
)


class Project(models.Model):
    """
    項目表
    """
    Language = (
        ("0", 'python'),
        ("1", "java"),
        ("2", 'go'),
        ("3", "php"),
        ("4", "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="0", 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=(("0", "可用"), ("1", "下線")), default="0", max_length=2)

    class Meta:
        ordering = ("-create_time",) #???

    def __str__(self):
        return self.name


class Host(models.Model):
    env = (
        ("0", '開發'),
        ("1", "測試"),
        ("2", "預生產"),
        ("3", "生產")
    )
    Type = (
        ("0", "nginx"),
        ("1", "redis"),
        ("2", "db"),
        ("3", "server"),

    )
    status = (
        ("0", "在線"),
        ("1", "下線"),
        ("2", "維修"),
    )
    name = models.CharField(verbose_name="主機名", max_length=200, unique=True)
    hostip = models.GenericIPAddressField(verbose_name='主機ip地址')
    env = models.CharField(verbose_name='環境', choices=env, default="3", max_length=20)
    version = models.CharField(verbose_name="系統版本", max_length=50, null=True, blank=True)
    type = models.CharField(verbose_name="類型", choices=Type, default="3", max_length=20)
    ssh_port = models.CharField(verbose_name="ssh端口", default=22, max_length=10)
    status = models.CharField(verbose_name="狀態", choices=status, default="0", 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=(("0", "文件"), ("1", "git")), default="0", max_length=20, )
    status = models.CharField(verbose_name='更新狀態', choices=status, default="0", max_length=20)
    version = models.CharField(verbose_name="版本", null=True, blank=True, max_length=100)
    backup = models.CharField(verbose_name='備份狀態', choices=(("0", ""), ("1", "")), default="0", 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="0", 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=(("0", "開發"), ("1", "測試"), ("2", '運維')), default="0",max_length=10)
    is_admin = models.CharField(verbose_name='管理員', choices=(("0", "Admin"), ("1", "普通")), default="1",max_length=10)
    is_unable = models.CharField(verbose_name='是否可用', choices=(("0", "可用"), ("1", "不可用")), default="0",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',)
View Code

首先是,下圖中的狀態,

上圖中的"可用",是針對項目而言的.

在多個字段對應同一張表中的用戶

 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 -->
View Code

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' %}">
View Code

點擊按鈕:

 

彈出下面的窗體.

 

 

 

咱們獲得上邊的三種觸發點擊方式.

 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.增刪改查

相關文章
相關標籤/搜索