主頁 > 後端開發 > Django筆記三十五之admin后臺界面介紹

Django筆記三十五之admin后臺界面介紹

2023-05-05 08:19:27 後端開發

本文首發于公眾號:Hunter后端

原文鏈接:Django筆記三十五之admin后臺界面介紹

這一篇介紹一下 Django 的后臺界面使用,

Django 自帶了一套后臺管理界面,可用于我們直接操作資料庫資料,本篇筆記目錄如下:

  1. 創建后臺賬號以及登錄操作
  2. 注冊后臺顯示的資料表
  3. 串列欄位的顯示操作
  4. 欄位值的修改操作
  5. 串列頁的執行操作

1、創建后臺賬號以及登錄操作

首先我們需要創建一個可以訪問后臺的賬號,以下命令在系統的根目錄下進行:

python3 manage.py createsuperuser

然后他會提示我們輸入賬號的名稱,郵箱以及兩遍密碼用于確認,

Username (leave blank to use 'hunter'): admin
Email address: [email protected]
Password: 
Password (again): 

在這個程序中,如果我們輸入的密碼少于8位或者過于簡單,他會給我們提示說密碼過于簡單等,可以設定復雜點的,也可以直接確認,

創建好賬號密碼后,運行我們的系統:

python3 manage.py runserver 0:9898

然后就可以在瀏覽器里訪問我們的后臺系統了:

http://localhost:9898/admin

在下面的圖里輸入賬號密碼就可以進入系統了:

image

這里需要注意一點的是,如果你是按照我們的筆記一路操作過來,在前面我們的用戶登錄限制里可能限制了 login 和 register 介面才允許不登錄,那么我們在相應的驗證中間件里可以簡單做一下操作:

class AuthMiddleware:

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        path = request.path

        # url 路徑為 /users/register 和 /users/login 的介面不需要進行判斷驗證
        if path not in [
            "/users/register",
            "/users/login",
        ]:
            if path.startswith("/admin"):
                return self.get_response(request)
            session = request.session
            if not session.get("username"):
                return JsonResponse({"code": -1, "msg": "not login"}, status=401)
        response = self.get_response(request)
        return response

這里我們將 /admin 開頭的介面都設定為了不需要登錄驗證,

2、注冊后臺顯示的資料表

輸入賬號密碼登錄后臺系統后,如果之前沒有做過后臺注冊的相關操作的話,可能只會看到 Django 系統自帶的 Users 和 Groups 表,它們是默認在后臺顯示的,

image

如果你點擊進入 Users 表,可以看到我們剛剛創建的這個用于登錄的管理員賬號 admin,

如果我們想要使得我們創建的其他表也在后臺顯示,則需要手動去注冊一下,

注冊的流程很簡單,我們這里以 blog 這個 application 為例,修改 blog/admin.py,對于需要顯示的表,我們直接使用 admin.site.register() 操作,即可在后臺顯示,比如:

# blog/admin.py
from django.contrib import admin
from blog.models import Blog

admin.site.register(Blog)

重啟系統后,就可以看到多了一個 Blog 的 application 以及其下的 Blog 表了,

再點擊進入表,可以看到一條條 Blog 表里的資料了,但是表的欄位在串列頁都是被隱藏的,只有在點擊進入單條資料詳情頁時,才會顯示具體的欄位值,

image

3、串列欄位的顯示操作

前面介紹了如何注冊一個 model,使其在后臺界面顯示,但是有一個問題就是資料串列每條都只有一個欄位表示,而沒有每個欄位的具體值顯示,接下來我們就對具體欄位值的顯示做介紹,

首先,我們使用的 model 定義如下:

class Blog(models.Model):
    PUBLISHED = 1
    UNPUBLISHED = 0
    PUBLISHED_STATUS = (
        (PUBLISHED, "published"),
        (UNPUBLISHED, "not_published"),
    )

    name = models.CharField(max_length=100, unique=True)
    tag_line = models.TextField()
    char_count = models.IntegerField(verbose_name="文章字數", default=0)
    is_published = models.BooleanField(choices=PUBLISHED_STATUS, default=UNPUBLISHED)
    pub_datetime = models.DateTimeField(verbose_name="發布日期", null=True, default=None)

定義好后的 migration 相關操作可以自己去完成,

注冊操作

前面介紹了 model 在后臺顯示的注冊操作:

# blog/admin.py
from django.contrib import admin
from blog.models import Blog

admin.site.register(Blog)

但是這種操作只能在后臺顯示串列資訊,具體的欄位資訊不會在串列顯示,如果要實作這種操作,我們需要進行另一種注冊方式:

# blog/admin.py

from django.contrib import admin
from blog.models import Blog


class BlogAdmin(admin.ModelAdmin):
    pass


admin.site.register(Blog, BlogAdmin)

接下來,我們的具體操作都會在 BlogAdmin 中實作,

串列顯示欄位

如果我們想要在串列中就顯示資料的具體欄位,比如 id, name,is_published,pub_datetime 三個欄位,我們可以使用 list_display 屬性:

class BlogAdmin(admin.ModelAdmin):
    list_display = ("id", "name", "is_published", "pub_datetime")

重啟系統后,就可以在串列看到相應的欄位顯示了:
image

注意:在這里,is_published 這里直接顯示了該欄位的用于顯示的值,這個和之前介紹的 get_field_display() 的方式是一致的,

可以看到,這個串列的表頭就是我們定義的 model 里的 verbose_name 的值,如果沒有定義該屬性,則會直接顯示欄位名,

資料格式化顯示

可以注意到日期的顯示并不利于直觀的查看,所以可以對日期欄位做一個格式化處理回傳顯示,

以下是對 model 的處理:

# blog/models.py

from django.contrib import admin

class Blog(models.Model):
    # 欄位在這里省略
    pass
    
    @admin.display(description="發布時間")
    def format_pub_datetime(self):
        return self.pub_datetime.strftime("%Y-%m-%d %H:%M:%S")

以下是對 BlogAdmin 的處理:

class BlogAdmin(admin.ModelAdmin):
    list_display = ("id", "name", "is_published", "format_pub_datetime")

這樣在串列頁就會多一列,表頭為【發布時間】,

這里我們其實可以這樣理解,我們對 Blog 這個 model 添加了一個名為 format_pub_datetime 的屬性,這個屬性用 admin.display() 作為裝飾器,這個屬性可以作為被 admin 的 list_display 使用作為串列的展示項,

在這里我們是直接對 pub_datetime 欄位做格式化處理,當然也可以對非時間欄位做其他的處理,主要看想要實作的效果,

注意: 這里還有需要注意的一點是,pub_datetime 欄位是允許為 null 的,所以這里最好是做一下適配處理,比如說 return 的時候判斷一下:

    @admin.display(description="發布時間")
    def format_pub_datetime(self):
        return self.pub_datetime.strftime("%Y-%m-%d %H:%M:%S") if self.pub_datetime else ""

上面這種方式是在 model 下定義的函式,我們也可以直接在 BlogAdmin 定義該函式操作:

class BlogAdmin(admin.ModelAdmin):
    list_display = ("id", "name", "is_published", "char_count", "format_pub_datetime")

    @admin.display(description="發布時間")
    def format_pub_datetime(self, obj):
        return obj.pub_datetime.strftime("%Y-%m-%d %H:%M:%S") if obj.pub_datetime else ""

串列資料排序

串列的資料默認是按照 id 的倒序排列回傳的,如果想要按照其他欄位排序回傳,比如 char_count,可以使用 ordering 屬性:

class BlogAdmin(admin.ModelAdmin):
    list_display = ("id", "name", "is_published", "char_count", "format_pub_datetime")
    ordering = ("char_count",)

如果是想要倒序排列,欄位前加一個 - 即可:

ordering = ("-char_count",)

4、欄位值的修改操作

如果我們想要在 admin 的頁面修改資料的欄位值,目前我們能做的操作就是點擊每條資料前面的 id,他會進入這條資料的詳情頁,每個欄位都是默認可修改的,

指定欄位點擊進入編輯頁

我們也可以指定某個,或者某幾個欄位進入這條資料的詳情頁進行編輯,用到的屬性是 list_display_links,這個屬性的值默認是 id 主鍵欄位,但如果我們想點擊 id 和 name 欄位的時候都進入詳情頁,可以如下操作:

class BlogAdmin(admin.ModelAdmin):
    list_display = ("id", "name", "is_published", "format_pub_datetime")
    list_display_links = ("id", "name",)

直接在串列頁面修改欄位值

如果某個欄位是需要經常修改的,我們想要在串列頁面就修改而不用進入資料的詳情頁,可以加上 list_editable 屬性,比如我們直接在串列頁修改 name 欄位的值:

class BlogAdmin(admin.ModelAdmin):
    list_display = ("id", "name", "is_published", "format_pub_datetime")
    list_editable = ("name", )

需要注意的是,list_editable 和 list_display_links 這兩個屬性是相斥的,也就是說這兩個的欄位串列不能擁有同一個欄位值,

詳情頁欄位的顯示與否

點擊進入資料的編輯詳情頁,默認所有欄位是可以修改的,如果想要某些欄位在詳情頁顯示或者不顯示,可以使用 fields 和 exclude 屬性,分別表示顯示和不顯示的欄位,

顯示 name 和 is_published 欄位:

class BlogAdmin(admin.ModelAdmin):
    list_display = ("id", "name", "is_published", "format_pub_datetime")
    fields = ("name", "is_published")

隱藏 name 和 is_published 欄位:

class BlogAdmin(admin.ModelAdmin):
    list_display = ("id", "name", "is_published", "format_pub_datetime")
    exclude = ("name", "is_published")

欄位僅可讀

有一些比較重要的欄位,如果在詳情頁不希望能夠被修改,可以使用 readonly_fields 屬性,比如不希望 name 欄位被修改:

class BlogAdmin(admin.ModelAdmin):
    list_display = ("id", "name", "is_published", "format_pub_datetime")
    readonly_fields = ("name",)

重啟系統后,就可以在串列頁看到 name 欄位沒有修改框,為僅可讀狀態了,

注意: 需要提醒的一點是,上面所有的添加欄位屬性的操作的值都需要是串列或者元組,

save_as 屬性

save_as,這是一個在資料詳情頁保存時的屬性,目前進入資料的詳情頁,右下角有三個按鈕,左邊的第一個是 save_and_add_another,意思是保存操作之后會自動進入新的頁面,可用于創建資料,

當我們設定 save_as=True 之后:

class BlogAdmin(admin.ModelAdmin):
    list_display = ("id", "name", "is_published", "char_count", "format_pub_datetime")
    save_as = True

再看這三個按鈕,第一個按鈕就會變成 save as new,意思是在原資料上修改了之后,點擊可以保存為一條新資料,原資料保持不變,

image

這個操作程序可以理解成我們前面一篇筆記中介紹如何新建一條資料的方式,就是在原資料上將 id 欄位變成 None 然后進行 save 操作,就會在原資料的基礎上創建一條新資料,

這個程序可以去看 Django筆記的第十八篇中自增的主鍵那一段,

5、串列頁的執行操作

在串列頁,目前僅有一個可供執行的操作,那就是選中 id 那一欄的資料之后,點擊 action 旁邊的下拉框,有一個 delete 操作,意思是洗掉選中的資料:

image

快速搜索過濾操作

對于某些值的種類比較少的資料,比如 is_published 欄位,或者日期欄位,想要實作快速搜索的操作,可以使用 list_filter 屬性:

class BlogAdmin(admin.ModelAdmin):
    list_display = ("id", "name", "is_published", "char_count", "format_pub_datetime")
    list_filter = ("is_published", "pub_datetime")

重啟系統后可以看到串列頁面右側出現了一個篩選串列:

image

對于非日期欄位,這里有一些固定的日期的選擇,對于其他欄位,則是會列出所有欄位值作為篩選項,

指定欄位搜索

如果想要對某個或者某幾個欄位進行模糊搜索,可以使用 search_fields 屬性,比如想要搜索 name 和 pub_datetime 欄位:

class BlogAdmin(admin.ModelAdmin):
    list_display = ("id", "name", "is_published", "char_count", "format_pub_datetime")
    search_fields = ("name", "pub_datetime")

重啟系統后,頁面的左上角會出現一個搜索框,比如我們搜索 python,就會去查找 name 和 pub_datetime 欄位中包含 python 的資料,

image

如果我們搜索的時候使用空格將搜索的關鍵字分隔開,那么系統會自動為我們進行 split() 操作,然后搜索,比如這里我們搜索的是 python 2021,那么系統轉化的 sql 就會是:

where (name like '%python%' or pub_datetime like '%python%') and (name like '%2021%' or pub_datetime like '%2021%')

如果希望搜索的內容是一個整體,可以使用單引號或者雙引號括起來 'python 2021'

日期分級篩選

前面介紹了一個快速搜索過濾的操作,這里針對于日期欄位介紹一下另一種篩選過濾的方式,比如我們對 pub_datetime 欄位進行操作:

class BlogAdmin(admin.ModelAdmin):
    list_display = ("id", "name", "is_published", "char_count", "format_pub_datetime")
    date_hierarchy = "pub_datetime"

重啟系統后,可以在頁面左上角看到 2021,2022,2023 幾個年份,都是根據當前表里的資料統計出來的結果,然后點擊進入相當于是進行了一次年份的篩選,在第二層頁面繼續點擊選擇則是一次新的篩選:

image

save_model()

前面在 Django筆記第十八篇中有介紹過一條資料的保存 save() 操作的繼承處理,我們可以通過自定義一些邏輯使得資料在保存前進行一些操作,在這里,save_model() 的操作也可以提供同樣的功能:

class BlogAdmin(admin.ModelAdmin):
    list_display = ("id", "name", "is_published", "char_count", "format_pub_datetime")

    def save_model(self, request, obj, form, change):
        print("do something")
        super().save_model(request, obj, form, change)

actions 自定義執行任務

假設說我們想要實作一些批量執行的操作,比如選中串列頁某些資料,將 is_published 欄位批量更新成 True(即已發布),我們就可以用到 actions 來實作,

目前在頁面的左上角有一個 action 和旁邊的下拉框,系統實作了一個默認的函式邏輯,即洗掉選中項,我們可以來實作一個更新選中項的功能:

class BlogAdmin(admin.ModelAdmin):
    list_display = ("id", "name", "is_published", "char_count", "format_pub_datetime")
    
    actions = ["make_published"]

    @admin.action(description="make queryset published")
    def make_published(self, request, queryset):
        queryset.update(is_published=True)

使用 admin.action 作為裝飾器來裝飾一個函式,然后將函式名稱作為值放入 actions 串列中,在這里 queryset 引數即為頁面選中的資料,它是一個 queryset 型別,所以這里可以直接進行 update() 操作,

如果想執行一些更深入的操作,我們也可以對 request 引數進行操作決議,它即為我們前端選中執行傳過來的請求,

重啟系統后,重繪頁面,點開 action 旁邊的下拉框,就可以看到我們定義的函式了,選中資料,點擊旁邊的 Go 按鈕即可執行,

image

可以定義多個執行函式,記得添加到 actions 串列進行注冊即可,

如果想獲取更多后端相關文章,可掃碼關注閱讀:
image

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/551611.html

標籤:其他

上一篇:訊息推送平臺終于要發布啦!

下一篇:返回列表

標籤雲
其他(158404) Python(38117) JavaScript(25399) Java(18012) C(15221) 區塊鏈(8261) C#(7972) AI(7469) 爪哇(7425) MySQL(7157) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5334) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4565) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1964) Web開發(1951) HtmlCss(1931) python-3.x(1918) 弹簧靴(1913) C++(1912) xml(1889) PostgreSQL(1874) .NETCore(1857) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Django筆記三十五之admin后臺界面介紹

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記三十五之admin后臺界面介紹 這一篇介紹一下 Django 的后臺界面使用。 Django 自帶了一套后臺管理界面,可用于我們直接操作資料庫資料,本篇筆記目錄如下: 創建后臺賬號以及登錄操作 注冊后臺顯示的資料表 串列欄位的顯示操作 字 ......

    uj5u.com 2023-05-05 08:19:27 more
  • 訊息推送平臺終于要發布啦!

    我的開源專案訊息推送平臺Austin終于要上線了,迎來在線演示的第一版! 🔥專案在線演示地址:http://139.9.73.20:3000/ 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuc ......

    uj5u.com 2023-05-05 08:19:13 more
  • 20基于java的科研管理系統設計與實作

    為解決傳統高校科技管理作業中存在的資訊失誤率高、傳遞速度緩慢等一系列缺陷,設計開發了基于Java EE的高校科技管理系統,為高校科技管理作業提供了極大的便利。同時還可以用于大創專案,政府類的創新類專案,科研類專案申報管理系統平臺,互聯網+專案申報系統。 ......

    uj5u.com 2023-05-05 08:18:57 more
  • 命令列編譯和執行java代碼

    雖然現在IDE很強大又很智能,但是平常隨意寫點練手的代碼的時候,直接在命令列中使用vim和java命令更為方便快捷,可以做到無滑鼠純鍵盤的操作。 首先保證將java相關指令添加到了環境變數中; 1.編譯class檔案: javac -d ./ Test.java 編譯好的class檔案會放置到環境當 ......

    uj5u.com 2023-05-05 08:18:48 more
  • Java讀取資料庫表(二)

    Java讀取資料庫表(二) application.properties db.driver.name=com.mysql.cj.jdbc.Driver db.url=jdbc:mysql://localhost:3306/easycrud?useUnicode=true&characterEnco ......

    uj5u.com 2023-05-05 08:18:42 more
  • Spring原始碼:Bean生命周期(三)

    在之前的文章中,我們已經對 `bean` 的準備作業進行了講解,包括 `bean` 定義和 `FactoryBean` 判斷等。在這個基礎上,我們可以更加深入地理解 `getBean` 方法的實作邏輯,并在后續的學習中更好地掌握`createBean` 方法的實作細節。 ......

    uj5u.com 2023-05-05 08:18:35 more
  • Java 雙指標專案中的實際應用

    背景說明 最近在做財務相關的系統,對賬單核銷預付款從技術角度來看就是將兩個陣列進行合并 對賬單核銷預付款前提條件: 對賬單總金額必須等于未核銷金額 資料示例 對賬單資料 | 單號 | 金額 | | | | | B0001 | 100 | | B0002 | 80 | | B0003 | 120 | ......

    uj5u.com 2023-05-05 08:18:30 more
  • Java練手專案(尚硅谷的),不涉及框架,資料庫等。

    軟體:idea 我是先建立了一個空白的專案,自己創建的src包和其下面的包。 **問題一:**建立包之后發現格式為src.com.tjp.bean 沒辦法建立其他與bean同級的service test utils view 等。只允許繼續建立bean的子包。 解決: 這是因為idea自動會折疊空白 ......

    uj5u.com 2023-05-05 08:12:43 more
  • Python教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Python由荷蘭數學和計算機科學研究學會的吉多·范羅蘇姆于1990年代初設計,作為一門叫做ABC語言的替代品。 Python提供了高效的高級資料結構,還能簡單有效地面向物件編程。Python語法和動態型別,以及解釋型語言的本質,使它成為多數平臺上寫腳本和快速開發應用的編程語言, [2] ......

    uj5u.com 2023-05-05 08:06:50 more
  • JUC并發編程原理精講(原始碼分析)

    并發編程是指在程式中使用多執行緒技術來實作并行處理的能力。多執行緒機制使得程式可以分解成互不干擾的任務,從而提高了程式執行的效率。并發編程可以通過對執行緒的創建,管理和協作進行控制,以實作更加高效的并發執行。并發編程的優點包括:① 提高程式執行效率:通過多執行緒并行處理,程式的處理速度可以顯著提高。② 增強... ......

    uj5u.com 2023-05-05 08:00:35 more