8.用戶管理專欄主頁面開發

用戶管理專欄主頁面開發

  • 寫在前面
  • 用戶權限控制
  • 用戶列表接口設計
  • 主頁面開發
    • 前端
      • account/Index.vue
      • langs/zh.js
      • store.js
    • 后端
      • Paginator
        • 概述
        • 基本用法
        • 代碼示例
        • 屬性與方法
      • urls.py
      • views.py
    • 運行效果
  • 總結

歡迎加入Gerapy二次開發教程專欄!
本專欄專為新手開發者精心策劃了一系列內容,旨在引領你深入探索Gerapy框架的二次迭代之旅。
本專欄將全面剖析Gerapy與Vue的源碼架構,讓你從內部了解它們的運作機制。
我們將分享實用的技巧,教你如何有效修復Gerapy中的異常問題,如何在現有基礎上添加多樣化的功能,以及如何對已有功能進行重構優化。

寫在前面

讀完本篇博客你可以學習到的知識:

  • 如何進行用戶權限控制
  • 如何設計列表頁(翻頁)接口
  • 加深前后端開發經驗,利用Django Paginator實現翻頁請求

用戶權限控制

一般情況下,超級管理員只會有一兩個,我們想在前端知道登錄用戶的身份的話,必須要后端提供對應標識,但是現在已知的接口和緩存都沒有存儲用戶身份標識,那么就需要我們重新開發提供了。

再來看下auth_user表,is_superuser就是用來標識超級管理員身份

在這里插入圖片描述

這里就有兩個方案了:

  1. 單獨開一個接口獲取當前登錄用戶身份
  2. 由于剛好是操作auth_user表用到,可以在拿auth_user表數據時順便計算返回

這里看大家自己的選擇,下面我用的是第二個方案,也就是每次請求列表頁時,會返回is_superuser字段標識用戶身份。

用戶列表接口設計

  • 接口:/api/account/list?pageSize=10&currentPage=1
  • 請求:GET
  • 頁數參數:pageSize,頁碼參數:currentPage
  • 響應接口字段:在這里插入圖片描述

主頁面開發

這是后續我們需要用到的四個文件的作用,Status.vue不需要用到,刪除即可

在這里插入圖片描述

前端

account/Index.vue

下面是全部代碼,有些注釋,具體的大家得自己熟悉熟悉,沒法仔細講,不過流程是清晰的。

<template><div class="panel"><panel-title :title="$lang.objects.accounts"><!--新增按鈕實現--><router-link :to="{ name: 'accountCreate' }" tag="span"><el-button size="mini" type="success"><i class="fa fa-plus"></i>{{ $lang.buttons.create }}</el-button></router-link></panel-title><div class="panel-body"><!--遍歷accounts--><el-tablev-loading="loading":data="accounts":element-loading-text="$lang.messages.loading":empty-text="$lang.messages.noData":style="{ width: '100%;' }"><!--各字段呈現實現--><el-table-column:label="$lang.columns.username"align="center"prop="username"min-width="30%"></el-table-column><el-table-column:label="$lang.columns.email"align="center"prop="email"min-width="30%"></el-table-column><el-table-column :label="$lang.columns.is_superuser" align="center" min-width="30%"><template slot-scope="props"><span v-if="props.row.is_superuser"><el-button icon="el-icon-check" round size="mini" type="primary"></el-button></span><span v-else><el-button icon="el-icon-close" round size="mini" type="primary"></el-button></span></template></el-table-column><el-table-column :label="$lang.columns.is_staff" align="center" min-width="30%"><template slot-scope="props"><span v-if="props.row.is_staff"><el-button icon="el-icon-check" round size="mini" type="primary"></el-button></span><span v-else><el-button icon="el-icon-close" round size="mini" type="primary"></el-button></span></template></el-table-column><el-table-column :label="$lang.columns.is_active" align="center" min-width="30%"><template slot-scope="props"><span v-if="props.row.is_active"><el-button icon="el-icon-check" round size="mini" type="primary"></el-button></span><span v-else><el-button icon="el-icon-close" round size="mini" type="primary"></el-button></span></template></el-table-column><el-table-column:label="$lang.columns.date_joined"align="center"prop="date_joined"min-width="30%"></el-table-column><el-table-column:label="$lang.columns.last_login"align="center"prop="last_login"min-width="30%"></el-table-column><!--isSupperUserLogin標識超級管理員身份--><el-table-column v-if="isSupperUserLogin" :label="$lang.columns.operations" align="center" min-width="50%"><template slot-scope="props"><router-link :to="{ name: 'accountEdit', params: { id: props.row.id } }" tag="span"><!--指定列跳轉編輯頁--><el-button size="mini" type="info"><i class="fa fa-edit"></i>{{ $lang.buttons.edit }}</el-button></router-link><!--指定列刪除--><el-button size="mini" type="danger" @click="onSingleDelete(props.row.id)"><i class="fa fa-remove"></i>{{ $lang.buttons.delete }}</el-button></template></el-table-column></el-table></div></div>
</template>
<script type="text/javascript">
import PanelTitle from "../../components/PanelTitle";export default {data() {return {accounts: [],  // 用戶數據列表loading: true,  // 加載中isSupperUserLogin: true,  // 是否是超級管理員身份totalCount: 0,  // 用戶數據總數currentPage: 1,  // 當前頁碼pageSize: 10,  // 頁數};},components: {PanelTitle,},created() {// 頁面創建時請求數據this.getAccountData(this.currentPage, this.pageSize);},methods: {// 請求用戶數據getAccountData(current_page, page_size) {this.loading = true;// GET傳參方式this.$http.get(this.$store.state.url.account.list, {'params': {pageSize: page_size,currentPage: current_page,}}).then(({data: data}) => {this.accounts = data['rows'];this.totalCount = data['count'];this.isSupperUserLogin = data['is_superuser'];this.loading = false;}).catch(() => {this.loading = false;});},// 刪除指定用戶deleteAccount(id) {this.$http.post(this.formatString(this.$store.state.url.account.remove, {id: id,})).then(() => {this.$message.success(this.$store.getters.$lang.messages.successDelete);this.loading = false;this.getAccountData(this.currentPage, this.pageSize);}).catch(() => {this.$message.error(this.$store.getters.$lang.messages.errorDelete);this.loading = false;});},// 提交刪除用戶onSingleDelete(id) {this.$confirm(this.$store.getters.$lang.messages.confirm,this.$store.getters.$lang.buttons.confirm,{confirmButtonText: this.$store.getters.$lang.buttons.yes,cancelButtonText: this.$store.getters.$lang.buttons.no,type: "warning",}).then(() => {this.deleteAccount(id);});},},
};
</script>

langs/zh.js

需要在columns下增加些配置參數
在這里插入圖片描述

is_superuser: '超級用戶',
is_staff: '工作人員',
is_active: '狀態',
date_joined: '加入時間',
last_login: '最后登錄時間',
deployed_user_name: '部署者',
deployed_client_name: '部署主機',
deployed_project_name: '部署項目',
deployed_description: '部署描述',
deployed_at: '部署時間',
priority: '優先級',

store.js

需要在url下增加些配置參數
在這里插入圖片描述
在這里插入圖片描述

account: {list: "/api/account/list",create: "/api/account/create",info: "/api/account/{id}/info",update: "/api/account/{id}/update",remove: "/api/account/{id}/remove",
},

后端

Paginator

這里我們先了解一下Django的翻頁器Paginator

概述

?DjangoPaginator是一個內置的分頁組件,用于將大量數據分頁顯示,從而改善用戶體驗并減輕服務器壓力?。使用Paginator可以指定每頁顯示的數據項數量,并生成一個分頁對象,該對象包含了關于總頁數、當前頁碼等信息的方法。

基本用法

?引入Paginator類?:首先需要從django.core.paginator模塊中引入Paginator類。
?創建Paginator對象?:使用Paginator(object_list, per_page)創建一個分頁器對象,其中object_list是要分頁的數據列表,per_page是每頁顯示的數據條數。
?獲取頁面數據?:通過調用分頁器對象的page(page_number)方法獲取特定頁面的數據,其中page_number是頁碼。返回的是一個Page對象,該對象提供了當前頁的數據項列表以及其他分頁信息,如是否有下一頁、上一頁等。

代碼示例
from django.core.paginator import Paginator# 假設有一個包含100條數據的列表
objects = ['item1', 'item2', ..., 'item100']
# 創建Paginator對象,每頁顯示10條數據
paginator = Paginator(objects, 10)# 獲取第一頁的數據
page1 = paginator.page(1)
print(page1.object_list)  # 輸出當前頁的數據項列表
print(page1.has_next())  # 檢查是否有下一頁
print(page1.has_previous())  # 檢查是否有上一頁
print(page1.number)  # 當前頁碼
屬性與方法
  • paginator.count: 總數據項數
  • paginator.num_pages: 總頁數
  • paginator.page_range: 一個范圍對象,包含所有頁碼
  • page.object_list: 當前頁的數據項列表
  • page.number: 當前頁碼
  • page.has_next(): 是否有下一頁
  • page.has_previous(): 是否有上一頁
  • page.next_page_number(): 下一頁的頁碼(如果有的話)
  • page.previous_page_number(): 上一頁的頁碼(如果有的話)

urls.py

新增兩個接口映射

url(r'^api/account/list', views.account_list, name='account_list'),
url(r'^api/account/(\d+)/remove', views.account_remove, name='account_remove'),

views.py

導入需要的包

from django.contrib.auth.models import User
from django.core.paginator import Paginator

方法代碼開發,具體實現代碼有注釋

@log_exception()
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def account_list(request):"""account list:param request: request object:return: json"""if request.method == 'GET':# 獲取單頁頁數page_size = int(request.query_params.get('pageSize'))# 拿到當前頁current_page = int(request.query_params.get('currentPage'))# 根據主鍵id順序排序拿到全部數據對象accounts = User.objects.order_by('id')# 創建翻頁器Paginator對象,全部數據 單頁頁數paginator = Paginator(accounts, page_size)# 提取指定頁碼的數據page_obj = paginator.get_page(current_page)# model_to_dict:模型數據轉字典,定義導出的字段fields = ['id', 'username', 'email', 'is_superuser', 'date_joined', 'last_login', 'is_staff', 'is_active']# 最后拼接數據返回return JsonResponse({'currentPage': current_page, 'pageSize': page_size, 'count': paginator.count,'num_pages': paginator.num_pages, 'is_superuser': request.user.is_superuser,'rows': [model_to_dict(item, fields=fields) for item in page_obj.object_list]})@log_exception()
@api_view(['POST'])
@permission_classes([IsAuthenticated])
def account_remove(request, account_id):"""remove account by account_id:param request: request object:param account_id: account id:return: json"""if request.method == 'POST':# 根據用戶id查詢并刪除User.objects.filter(id=account_id).delete()return JsonResponse({'result': '1'})

運行效果

處理好后,打包Vue代碼,重新啟動后端服務,刷新瀏覽器。

在這里插入圖片描述

這里留個坑給大家自己實現,就是刪除按鈕應該給超級管理員隱藏或者不可用,畢竟他要是刪了自己賬號還管理個啥!

總結

到這里,我們就實現了主頁面開發了,接下來將實現其他頁面~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900356.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900356.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900356.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

http://noi.openjudge.cn/_2.5基本算法之搜索_1804:小游戲

文章目錄 題目深搜代碼寬搜代碼深搜數據演示圖總結 題目 1804:小游戲 總時間限制: 1000ms 內存限制: 65536kB 描述 一天早上&#xff0c;你起床的時候想&#xff1a;“我編程序這么牛&#xff0c;為什么不能靠這個賺點小錢呢&#xff1f;”因此你決定編寫一個小游戲。 游戲在一…

發生梯度消失, 梯度爆炸問題的原因,怎么解決?

目錄 一、梯度消失的原因 二、梯度爆炸的原因 三、共同的結構性原因 四、解決辦法 五、補充知識 一、梯度消失的原因 梯度消失指的是在反向傳播過程中&#xff0c;梯度隨著層數的增加指數級減小&#xff08;趨近于0&#xff09;&#xff0c;導致淺層網絡的權重幾乎無法更新…

【USRP】srsRAN 開源 4G 軟件無線電套件

srsRAN 是SRS開發的開源 4G 軟件無線電套件。 srsRAN套件包括&#xff1a; srsUE - 具有原型 5G 功能的全棧 SDR 4G UE 應用程序srsENB - 全棧 SDR 4G eNodeB 應用程序srsEPC——具有 MME、HSS 和 S/P-GW 的輕量級 4G 核心網絡實現 安裝系統 Ubuntu 20.04 USRP B210 sudo …

ChatGPT 4:解鎖AI文案、繪畫與視頻創作新紀元

文章目錄 一、ChatGPT 4的技術革新二、AI文案創作&#xff1a;精準生成與個性化定制三、AI繪畫藝術&#xff1a;從文字到圖像的神奇轉化四、AI視頻制作&#xff1a;自動化剪輯與創意實現五、知識庫與ChatGPT 4的深度融合六、全新的變革和機遇《ChatGPT 4 應用詳解&#xff1a;A…

在js中數組相關用法講解

數組 uniqueArray 簡單數組去重 /*** 簡單數組去重* param arr* returns*/ export const uniqueArray <T>(arr: T[]) > [...new Set(arr)];const arr1 [1,1,1,1 2, 3];uniqueArray(arr); // [1,2,3]uniqueArrayByKey 根據 key 數組去重 /*** 根據key數組去重* …

RT-Thread ulog 日志組件深度分析

一、ulog 組件核心功能解析 輕量化與實時性 ? 資源占用&#xff1a;ulog 核心代碼僅需 ROM<1KB&#xff0c;RAM<0.2KB&#xff0c;支持在資源受限的MCU&#xff08;如STM32F103&#xff09;中運行。 ? 異步/同步模式&#xff1a;默認采用異步環形緩沖區&#xff08;rt_…

T113s3遠程部署Qt應用(dropbear)

T113-S3 是一款先進的應用處理器&#xff0c;專為汽車和工業控制市場而設計。 它集成了雙核CortexTM-A7 CPU和單核HiFi4 DSP&#xff0c;提供高效的計算能力。 T113-S3 支持 H.265、H.264、MPEG-1/2/4、JPEG、VC1 等全格式解碼。 獨立的硬件編碼器可以編碼為 JPEG 或 MJPEG。 集…

12.青龍面板自動化我的生活

安裝 docker方式 docker run -dit \ -v /root/ql:/ql/data \ -p 5700:5700 \ -e ENABLE_HANGUPtrue \ -e ENABLE_WEB_PANELtrue \ --name qinglong \ --hostname qinglong \ --restart always \ whyour/qinglongk8s方式 https://truecharts.org/charts/stable/qinglong/ he…

Maven 遠程倉庫推送方法

步驟 1&#xff1a;配置 pom.xml 中的遠程倉庫地址 在項目的 pom.xml 文件中添加 distributionManagement 配置&#xff0c;指定遠程倉庫的 URL。 xml 復制 <project>...<distributionManagement><!-- 快照版本倉庫 --><snapshotRepository><id…

Spring Boot 日志 配置 SLF4J 和 Logback

文章目錄 一、前言二、案例一&#xff1a;初識日志三、案例二&#xff1a;使用Lombok輸出日志四、案例三&#xff1a;配置Logback 一、前言 在開發 Java 應用時&#xff0c;日志記錄是不可或缺的一部分。日志可以記錄應用的運行狀態、錯誤信息和調試信息&#xff0c;幫助開發者…

JS API 事件監聽

焦點事件案例&#xff1a;搜索框激活下拉菜單 事件對象 事件對象存儲事件觸發時的相關信息 可以判斷用戶按鍵&#xff0c;點擊元素等內容 如何獲取 事件綁定的回調函數中的第一個形參就是事件對象 一般命名為e,event 事件對象常用屬性 type類型 click mouseenter client…

DDD與MVC擴展能力對比

一、架構設計理念的差異二、擴展性差異的具體表現三、DDD擴展性優勢的深層原因四、MVC擴展性不足的典型場景五、總結&#xff1a;架構的本質與選擇六、例子1&#xff09;場景描述2&#xff09;MVC實現示例&#xff08;三層架構&#xff09;3&#xff09;DDD實現示例&#xff08…

針對 SQL 查詢中 IN 子句性能優化 以及 等值 JOIN 和不等值 JOIN 對比 的詳細解決方案、代碼示例及表格總結

以下是針對 SQL 查詢中 IN 子句性能優化 以及 等值 JOIN 和不等值 JOIN 對比 的詳細解決方案、代碼示例及表格總結&#xff1a; 問題 1&#xff1a;IN 的候選值過多&#xff08;如超過 1000 個&#xff09; 問題描述 當 IN 列表中的值過多時&#xff0c;SQL 會逐個比較每個值…

手部穴位檢測技術:基于OpenCV和MediaPipe的實現

手部穴位檢測是醫學和健康管理領域的重要技術之一。通過準確識別手部的關鍵穴位,可以為中醫診斷、康復治療以及健康監測提供支持。本文將介紹一種基于OpenCV和MediaPipe的手部穴位檢測方法,展示如何利用計算機視覺技術實現手部關鍵點的檢測,并進一步標注手部的穴位位置。 技…

Day20 -自動化信息收集工具--ARL燈塔的部署

準備&#xff1a; 純凈的Docker環境 ARL的包 一、Docker的部署 00x1 更新系統包 sudo apt update 00x2 安裝必要的依賴包 sudo apt install -y apt-transport-https ca-certificates curl software-properties-common 00x3 下載docker和docker-compose apt-get install do…

sqlalchemy查詢json

第一種&#xff1a;字段op是json格式&#xff1a; {"uid": "cxb123456789","role": 2,"op_start_time": 1743513707504,"op_end_time": 1743513707504,"op_start_id": "op_001","op_end_id"…

搭建K8S-1.23

0、簡介 這里只用3臺服務器來做一個簡單的集群 地址主機名192.168.160.40kuber-master-1192.168.160.41kuber-master-2192.168.160.42kuber-node-1 1、關閉三個服務 &#xff08;1&#xff09;防火墻 systemctl stop firewalld &#xff08;2&#xff09;Selinux setenf…

初階數據結構--樹

1. 樹的概念與結構 樹是?種?線性的數據結構&#xff0c;它是由 n&#xff08;n>0&#xff09; 個有限結點組成?個具有層次關系的集合。把它叫做 樹是因為它看起來像?棵倒掛的樹&#xff0c;也就是說它是根朝上&#xff0c;?葉朝下的。 有?個特殊的結點&#xff0c;稱…

硬件工程師面試問題(五):藍牙面試問題與詳解

藍牙技術作為物聯網與智能設備的核心無線協議&#xff0c;其硬件設計能力直接影響產品連接穩定性、功耗及兼容性。面試是評估候選人射頻電路設計、天線優化、協議棧調試等綜合技能的關鍵環節&#xff0c;尤其在BLE低功耗設計、共存抗干擾等場景中&#xff0c;硬件工程師的實踐經…

Redis-基本數據類型

Redis支持的基本數據類型&#xff1a;String、hash、list、Set、Zset 一、String 特點 可以存儲三種類型 int、float、string 運用場景 緩存&#xff1a;存儲HTML片段、用戶會話&#xff08;Session&#xff09;計數器&#xff1a;網站訪問量、點贊數&#xff08;incr方法&am…