Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
為了豐富 Naive Admin 生態(tài),近期我們一直在精雕細琢,日夜奮戰(zhàn),終于又迎來了Arco Vue Pro 正式發(fā)布上線!
ArcoDesign 是由字節(jié)跳動 GIP UED 團隊和架構前端團隊聯(lián)合推出的企業(yè)級設計系統(tǒng),在打磨了近 3 年之后,通過字節(jié)內部大量業(yè)務沉淀和驗證,開源了 ArcoDesign 設計系統(tǒng),旨在讓社區(qū)聽見更多的聲音,為更多中小型企業(yè)及個人設計師和開發(fā)者提效,創(chuàng)造更多高效美觀的“最佳實踐”。
Naive Admin Arco 是一個基于 Vue3.0、Vite、 Arco Vue、TypeScript 中后臺解決方案。
Naive Admin Arco 企業(yè)級中后臺前端框架,使用最新的前端技術棧,并提煉了典型的業(yè)務模型,頁面,包括二次封裝組件、動態(tài)菜單、權限校驗、粒子化權限控制等功能,它可以幫助你快速搭建企業(yè)級中后臺項目
響應式、多主題,多配置,快速集成,開箱即用
最新技術棧,使用 Vue 3、Typescript、Pinia、Vite 等前端前沿技術
強大的鑒權系統(tǒng),對路由、菜單、功能點等支持 3 種鑒權模式,滿足不同的業(yè)務鑒權需求
持續(xù)更新,實用性頁面模板功能和交互,隨意搭配組合,讓構建頁面變得簡單化
更多頁面、功能,組件,請直接在線預覽查看
AdminPro
Naive Admin NaiveUi 生態(tài)最優(yōu)秀的中后臺框架,全面的系統(tǒng)配置,優(yōu)質模板,常用組件,真正一站式開箱即用
天給大家分享一個Vue3.0框架搭建的后臺管理模板Vue3.xAdmin。
vue3.x-admin 使用vue3開發(fā)的后臺管理系統(tǒng)。主要包括CSS3特效、可拖拽的div、圖表、益智小游戲、vuex4.x 存儲用戶信息等功能。
技術棧
Vue3.x + vue-router4.x + vuex4.x + Less + Echarts
目錄結構
快速安裝
通過如下步驟快速本地構建項目。
# 克隆項目
git clone https://github.com/Tyf2345/vue3.x-admin.git
# 進入目錄
cd vue-admin-ele
# 安裝依賴包
yarn install
# 本地調試
yarn serve
結構非常簡單的一款后臺模板,需要快速上手vue3的不可錯過。
# 預覽地址
http://114.215.147.221:8086/login
# 倉庫地址
https://github.com/tyf2345/vue3.x-admin
好了,就分享到這里。感謝各位的閱讀!
Django最強大的部分之一是自動生成的Admin界面。它讀取模型數(shù)據來提供一個強大的、生產環(huán)境就緒的界面,使內容提供者能立即用它向站點中添加內容。
它可以快速的開發(fā)出一個后臺管理界面,但是界面整體看起來一般般,之前為了學習練手,也是為了更美觀,都是自己手寫后臺管理系統(tǒng),這次是因為一些活需要快速開發(fā),就直接使用了自帶的后臺管理系統(tǒng),順便也整理一部分。
1)確保在settings.py中的INSTALLED_APPS安裝了
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
]
2)在模板上下文中添加以下依賴。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
...
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
3)在中間件中添加以下依賴。
MIDDLEWARE = [
...
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
]
4)遷移數(shù)據
python manage.py makemigrations # 創(chuàng)建數(shù)據庫遷移文件
python manage.py migrate # 根據數(shù)據庫遷移文件生成對應SQL語句并執(zhí)行
5)創(chuàng)建超級管理員賬戶,創(chuàng)建的用戶是保存在auth_user表中。
python manage.py createsuperuser
6)運行程序,登陸django自帶admin后臺管理系統(tǒng)
python manage.py runserver 0.0.0.0:8080
7)在瀏覽器上輸入地址:http://127.0.0.1:8080/admin
8)admin 界面默認是英文,如需要修改成中文,修改settings.py中的屬性。
LANGUAGE_CODE = 'zh-Hans'
現(xiàn)在后臺管理里面只顯示默認的2個模型,那要將我們定義的模型也顯示在后臺管理里面,應該怎么樣呢?
這就需要我們自定義admin,把需要管理的模型添加到admin中。
1)首先要在INSTALLED_APPS中添加對應的應用。
INSTALLED_APPS = [
...
'decoration',
]
2)在應用app的admin.py中注冊。
@admin.register(MaterialCategory)
class MaterialCategoryAdmin(admin.ModelAdmin):
pass
3)刷新,可以看到有顯示了,但是上面app顯示的還是英文。
4)修改app顯示名稱,所有跟app相關的內容配置,可以實現(xiàn)一個Appconfig類的子類來完成,django一般會默認在apps.py中建立一個。
class DecorationConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'decoration'
verbose_name = '裝修選材' # 顯示中文
1、修改展示的列表項,即模型中其他字段內容,可以在admin.py中用 list_display修改展示的列表項。
@admin.register(Material)
class MaterialAdmin(admin.ModelAdmin):
list_display = ['id', 'category', 'name', 'brand', 'specs', 'price', 'remarks']
注意:list_display不支持多對多的,需要再進行處理,例如:
# 模型
materials = models.ManyToManyField('Material', verbose_name='包含材料')
# 注冊
@admin.register(ComboPlatter)
class ComboPlatterAdmin(admin.ModelAdmin):
list_display = ['id', 'materials','total_price', 'remarks']
我們可以通過自定義個方法,來處理這個多對多字段:
@admin.register(ComboPlatter)
class ComboPlatterAdmin(admin.ModelAdmin):
list_display = ['id', 'name', 'total_price', 'material_list', 'remarks']
empty_value_display = "--"
# 自定義list_display
# list_display選項不能用于顯示多對多的字段(如materials)。
# 如果需要通過list_display選項顯示多對多的字段或模型中原本不存在的字段或方法,我們需要新增自定義的list_play方法。
def material_list(self, obj):
return [material.name for material in obj.materials.all()] # 獲取材料圖片所有對象,然后再迭代獲取對應名稱組成列表
material_list.short_description = '可選材料'
當然上面自定義方法不局限于多對多,有些特殊的也可以自定義,比如要顯示什么顏色。
例如,當銷量大于0時,紅色顯示,默認是直接顯示字段:
list_display = ['id', 'name', 'total_price', 'material_list', 'remarks', 'sale_nums']
我們可以重新定義方法:
list_display = ['id', 'name', 'total_price', 'material_list', 'remarks', 'sale_nums_display_color']
def sale_nums_display_color(self, obj):
if obj.sale_nums > 0:
color_code = 'red'
else:
color_code = '#000'
return format_html(
'<span style="color:{}">{}</span>', color_code, obj.sale_nums
)
sale_nums_display_color.short_description = '套餐銷量'
類似的,如果我們想要顯示圖片的HTML:
return format_html(
'<img src={} style="width:50px;height:50px;">', obj.avatar
)
2、可以根據設置項進行過濾。
# 設置過濾選項
list_filter = ['category']
注意:過濾器如果是外鍵需要遵循這樣的語法:
# 設置過濾選項
# 過濾器如果是外鍵需要遵循這樣的語法:本表外鍵字段__主表要顯示的字段。如:“category__id”
# 多個是 &&的關系
list_filter = ['category__id', 'category'] # 也可以直接外鍵字段,默認就是模型的__str__輸出值
3、每頁顯示記錄數(shù)。
# 每頁顯示條目數(shù)
list_per_page = 4
4、搜索
# 搜索字段
search_fields =['name']
search_fields,在使用admin 系統(tǒng)中的搜索時可能會出現(xiàn)“related Field has invalid lookup: icontains”錯誤,主要原因是外鍵查詢是需要指定相應的字段的。外鍵不應該只是一個model,而該是另一個表的明確的一個字段。所以我們需要指定特定的字段"本表外鍵字段__主表需查詢字段"。
例如上面category是一個外鍵,如果我們設置:
# 搜索字段
search_fields =['category']
修改為即可:
# 搜索字段
search_fields =['category__name']
5、django默認給字段為空的,顯示-,
我們可以修改默認顯示樣式:
empty_value_display = "--"
6、對于一多,有時候我們2個單獨編輯,非常麻煩
先需要添加完【材料】才能添加【材料圖片】,非常麻煩,我們可以再增加【材料】同時添加【材料圖片】:
# @admin.register(MaterialImg)
# class MaterialImgAdmin(admin.ModelAdmin):
class MaterialImgInline(admin.TabularInline):
model = MaterialImg # 關聯(lián)模型
list_display = ['id', 'material','img']
@admin.register(Material)
class MaterialAdmin(admin.ModelAdmin):
# 設置列表可顯示的字段
list_display = ['id', 'category', 'name', 'brand', 'specs', 'price', 'remarks']
# 設置過濾選項
list_filter = ['category']
# 每頁顯示條目數(shù)
list_per_page = 10
# 搜索字段
search_fields =['category__name']
inlines = [MaterialImgInline]
點擊添加或者編輯,可以看到已經嵌入到材料一起了:
7、默認可以點擊每條記錄第一個字段的值可以進入編輯界面。我們可以設置其他字段也可以點擊鏈接進入編輯界面,例如我們點擊名稱進入界面。
#設置哪些字段可以點擊進入編輯界面
list_display_links = ['id', 'name'] # 注意,默認的也要包含進去,否則會沖掉
8、調整頁面頭部顯示內容和頁面標題
admin.site.site_header = '裝修管理系統(tǒng)'
admin.site.site_title = '裝修管理系統(tǒng)'
9、如何將一個應用下的模型顯示到另外個應用app下呢?可以在model類中通過app_label指定應用:
class OrderInfo(models.Model):
...
class Meta:
db_table = 't_order_info'
verbose_name = '訂單'
verbose_name_plural = verbose_name
app_label = 'user' # 使用app_label指定需要顯示到的應用下
10、 有時候,我們需要為應用定義一些自定義的頁面,提供一些admin site+ORM無法直接提供的功能,比如根據數(shù)據統(tǒng)計,匯總展示每天的銷售整體處理情況,然后需要在admin site頁面中對應的app 模塊下加入跳轉鏈接。下面分兩步記錄一下實現(xiàn)步驟。
首先,自定義Django template頁面,編寫一個簡單的模板文件:
{% extends "admin/base_site.html" %}
{% load static %}
{% block content %}
<div>
<label><h2>數(shù)據統(tǒng)計</h2> </label>
</br>
<table class="table" table-layout="fixed" width="600px">
<thead>
<tr>
<th> 日期 </th>
<th> 銷售總額 </th>
</tr>
</thead>
<tbody>
{% for order in order_queryset %}
<tr>
<td>{{ order.day }}</td>
<td>{{ order.total_amount }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<br/>
<table class="table" table-layout="fixed" width="600px">
<thead>
<tr>
<th> 材料名稱 </th>
<th> 銷售總額 </th>
</tr>
</thead>
<tbody>
{% for good in goods_queryset %}
<tr>
<td>{{ good.material__name }}</td>
<td>{{ good.price }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}
在views.py文件中,渲染模板:
from django.db import connection
from django.db.models import Sum
def data_static(request):
if request.method == 'GET':
# 按天分類
select = {'day': connection.ops.date_trunc_sql('day', 'create_time')}
# values在annotate之后表示select, 在annotate之前表示group by
order_queryset = OrderInfo.objects.extra(select=select).values('day').annotate(total_amount=Sum('total_amount'))
print(order_queryset)
# 按照分類進行統(tǒng)計
goods_queryset = OrderGoods.objects.values('material__name').annotate(price=Sum('price'))
print(goods_queryset)
return render(request, 'static.html', context={'goods_queryset': goods_queryset, 'order_queryset': order_queryset})
配置路由:
urlpatterns = [
....
path('admin/user/datastat/', data_static),
]
先直接在頁面上上如,查看效果:
到這里,我們已經實現(xiàn)了自定義統(tǒng)計頁面的功能。
那怎么樣將這個鏈接添加到admin下呢?
要在admin site中添加一個自定義的跳轉鏈接,首先考慮要如何才能在對應的app下添加一個新的跳轉鏈接,
最常見的情況顯然就是在其下增加一個對數(shù)據庫進行映射的model,以及對應的modeladmin。
那我們可以按照這個方式來試下,首先定義模型。
由于對應的數(shù)據表model其實只是提供了一個生成admin site下跳轉鏈接的功能,其實際并沒有被訪問過,所以并不需要為其定義任何實際字段,構造一個空的model即可:
class DataStat(models.Model):
class Meta:
# db_table = 't_order_goods'
verbose_name = '數(shù)據統(tǒng)計'
verbose_name_plural = verbose_name
app_label = 'user' # 強行使其在user應用下
在admin.py中進行注冊,并重寫負責默認頁面渲染行為的changelist_view函數(shù)實現(xiàn)了對自定義頁面的渲染:
from decoration.models import DataStat
from decoration.views import data_static
@admin.register(DataStat)
class DataStatAdmin(admin.ModelAdmin):
def changelist_view(self, request, extra_content=None):
return data_static(request)
添加如上代碼后,admin site頁面如下:
11、Django admin默認的action只有刪除(delete)。
那如果我們需要實現(xiàn)其他功能,比如將勾選的訂單狀態(tài)修改。
那我們需要自定義action。
# action即動作,是你對一個選定查詢集(queryset)要進行的操作。當你選定一個查詢集(queryset)后,
# 你可以點擊action下拉菜單選擇action,然后點擊Go對其進行批量操作(如下所示)。Django admin默認的action只有刪除(delete)。
'''自定義actions'''
actions = ['order_stauts_change']
def order_stauts_change(self, request, queryset):
# 將狀態(tài)和人置空
queryset.update(order_status=3)
order_stauts_change.short_description = "所選訂單狀態(tài)修改為待收貨"
12、有時候,我們想在數(shù)據保存時進行一些額外的操作(通過重寫ModelAdmin的save_model實現(xiàn)),
例如,之前做的點餐系統(tǒng),當收拾完桌子的時候,將預定人也清空。
#將桌釋放的時候,前面對應使用人為空
def save_model(self, request, obj, form, change):
if change: # 更改的時候
if obj.table_statue == '0':
# 將使用人為空
obj.table_user = None
super(TableAdmin, self).save_model(request, obj, form, change)
self.food_list(obj)
else:
super(TableAdmin, self).save_model(request, obj, form, change)
還有一些其他的操作,可以根據具體業(yè)務進行挖掘開發(fā)。
1)安裝:
pip install django-ckeditor
# 如果要在富文本里添加圖片還需要
pip install pillow
2)注冊:
INSTALLED_APPS = [
...
'ckeditor',
'ckeditor_uploader', # 圖片
]
3)如果要處理圖片,還需要在settings.py里面添加如下設置:
# 前面兩個可能已經設置了,是存放用戶上傳文件的地方
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
CKEDITOR_UPLOAD_PATH = 'img/cases/'
CKEDITOR_CONFIGS = { # 添加個性化的配置
'default': {
'image_previewText':' ', # 替換圖片顯示區(qū)域那一串搞不懂的字符串
'tabSpaces': 4,
}
}
4)另外還需要添加一個路由用于上傳請求,在項目的urls.py:
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
...
path('ckeditor/', include('ckeditor_uploader.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
5)模型里面對應的字段設置。
from ckeditor.fields import RichTextField
from ckeditor_uploader.fields import RichTextUploadingField
#description = models.TextField(verbose_name='案例詳細介紹')
#description = RichTextField(verbose_name='案例詳細介紹') # 不帶圖片
description = RichTextUploadingField(verbose_name='案例詳細介紹') # 帶有上傳圖片功能的富文本編輯
6)重新遷移。
但是有些問題,
1)顯示的是繁體中文:
檢查后發(fā)現(xiàn)原因在于CKEditor會使用settings.py文件中的語言設置。
而我們settings.py中設置的LANGUAGE_CODE = 'zh-hans'簡體中文,這是因為Django2以上文件夾中沒有zh-cn文件夾,簡體中文是zh_Hans文件夾
直接設置LANGUAGE_CODE = ‘zh-cn’會導致異常。但是這樣設置又會導致ckeditor找不到名為zh-Hans.js的語言文件,當找不到文件時,CKEditor會找到第一個名稱包含zh的js文件去調用。而zh.js中是繁體字。
解決方案:
將ckeditor語言文件名稱,將zh.js字典內容替換成了zh-cn.js中的簡體內容。
ckeditor語言文件所在路徑:env_decoration\Lib\site-packages\ckeditor\static\ckeditor\ckeditor\lang
2)因為我們在富文本里面編輯內容,在數(shù)據庫中插入的是帶html代碼的樣式。
如果直接獲取不處理的話,就會顯示類似這種:
原因分析:
在文章詳情頁沒有看到預期的效果,而是類似于一堆亂碼一樣的HTML 標簽,這些標簽本應該在瀏覽器顯示它本身的格式,但是 Django 出于安全方面的考慮,任何的HTML 代碼在 Django 的模板中都會被轉義(即顯示原始的 HTML 代碼,而不是經瀏覽器渲染后的格式)。
所以我們需要在顯示的時候處理下,使其正常顯示。
解決:
方案1:為了解除轉義,只需在模板標簽使用 safe 過濾器即可,告訴 Django,這段文本是安全的,你什么也不用做。
對于如果傳遞給其他前端的,比如小程序,則有相對應的處理方式。
更多學習筆記整理于微信公號【Python野路子】
*請認真填寫需求信息,我們會在24小時內與您取得聯(lián)系。