主頁 > 企業開發 > 基于Admin.NET框架的前端的一些改進和代碼生成處理(2)

基于Admin.NET框架的前端的一些改進和代碼生成處理(2)

2023-03-30 13:59:42 企業開發

在上篇隨筆《基于Admin.NET框架的前端的一些改進和代碼生成處理(1)》中大致介紹了一些關于對Admin.NET框架的前端的改造作業,主要目的就是希望能夠增加前端代碼的簡潔性和可讀性,以及利用代碼生成工具來快速生成相關的代碼,從而減少開發程序中的繁瑣問題,本篇隨筆繼續探討一下,對其中一些模塊功能進行一些修改調整,涉及前后端的一起修改調整,

Admin.NET框架的后端基于基于Furion/.NET 6實作,底層集成SqlSugar;前端則是采用Vue-Next-Admin的前端框架,整體是一套非常不錯的框架,

1、增加批量添加字典專案

 Admin.NET框架的字典管理專案界面如下所示,

它通過列出字典大類,然后在右邊入口進行字典專案的管理,以前我傾向于使用左右視圖分拆的方式,從而實作字典大類和字典專案的快捷管理,

如在隨筆《在Vue&Element前端專案中,對于字典串列的顯示處理 》中介紹到的字典綜合展示方式如下所示,

我們這里暫且不修改這個頁面,繼續查看其字典專案管理的界面如下所示,

其串列里面只有一個新增的操作,如果對于初始化字典,則是一份苦差事,反復的打開錄入是比較費時間的,我們可以使用慣用的方式,來批量錄入字典專案,來提高字典專案初始化處理的效率,

我們在原有界面上增加一個批量錄入,和批量洗掉的操作,如下界面所示,

批量新增字典專案的界面,如下所示,

如果字典值和編碼內容不一致,可以使用如下效果進行批量新增

 

批量添加字典專案的頁面,我們是作為一個組件頁面的方式添加,然后在頁面中應用組件即可,如下代碼所示,

對應的批量添加頁面里面,提交的時候,呼叫對應的API介面就可以了,如下代碼所示,

// 保存資料處理
async function submitData() {
  var formEl = editRef.value;
  if (!formEl) return;

  await formEl.validate(async (valid) => {
    if (valid) {
      //驗證成功,執行下面方法
      var result = await dictdata.BatchAdd(editForm); //編輯保存

      if (result) {
        $u.message.success('批量添加字典成功!'); // 提示資訊
        emit('submit'); // 提示重繪資料
        closeDialog(); // 重置視窗狀態
      } else {
        $u.message.error('批量添加失敗');
      }
    }
  });
}

對應的業務API類里面,定義對應的介面函式,

/**
 * 系統字典值表 管理Api
 */
class SysDictDataApi extends BaseApi<SysDictData, AddDictDataInput, UpdateDictDataInput> {
     ............

    /** 批量添加字典專案 */
    BatchAdd = async (data: object) => {
        const url = this.baseUrl + `/BatchAdd`;
        return await this.axiosInstance.post<UnifyResult<void>>(url, data)
    }
}
export default new SysDictDataApi('/api/sysDictData');

后端增加對應的處理介面,實作資料的批量添加即可,

至此,批量添加字典專案的操作,配合前端后端一起,就可以完成該操作了, 

 

2、顯示/隱藏開發測驗選單

在Vue-Next-Admin的前端框架演示專案里面,本身提供了很多Demo案例的頁面展示,不過Admin.NET應該為了簡化框架的效果,從而把這些演示的案例選單移除了,不過視圖檔案依舊保存在專案里面,我們開發測驗程序中,有時候需要參考這些頁面效果,以便了解一些插件的功能和特點,因此可能偶爾需要使用了解下的,而在部署的時候,肯定是需要隱藏起來,不讓客戶使用這些Demo,否則增加煩惱,

為了更好的管控這些演示選單連接的入口,我們在原有選單的表里面增加一個Tag標簽,用來標識相關的選單功能,例如我們把測驗頁面的Tag標注為 dev, 而選單表里面本身有是否隱藏和是否啟用的設定,隱藏相對于選單而已不顯示(但包含路由),是否啟用相對于路由而言(禁用也就無法訪問選單的路由了),

我們通過這些設定資訊,可以對特定的標簽,啟用或者禁用,從而實作我們對開發測驗的選單頁面的顯示和隱藏操作,

 這個修改處理,必須結合后端進行相關資料表結構調整,以及相關的代碼屬性調整,在資料庫增加一個Tag屬性欄位,然后修改物體物件定義,

/// <summary>
/// 系統選單表
/// </summary>
[SugarTable(null, "系統選單表")]
[SystemTable]
public class SysMenu : EntityBase
{
    ....................

    /// <summary>
    /// 標簽
    /// </summary>
    [SugarColumn(ColumnDescription = "標簽", Length = 256)]
    [MaxLength(256)]
    public string? Tag { get; set; }

}

以及在相關的Dto物件上增加相關的屬性,

public class MenuInput
{
    /// <summary>
    /// 標題
    /// </summary>
    public string Title { get; set; }

    /// <summary>
    /// 標簽
    /// </summary>
    public string? Tag { get; set; }

    /// <summary>
    /// 選單型別(1目錄 2選單 3按鈕)
    /// </summary>
    public MenuTypeEnum? Type { get; set; }
}

為了隱藏或者顯示選單,我們需要在后端增加一個介面函式,介面函式會通過代理注入的方式提供相關的控制器介面入口,從而給前端訪問處理的,

    /// <summary>
    /// 隱藏/啟用開發測驗頁面選單(對標記tag為dev的,進行隱藏或者啟用)
    /// </summary>
    /// <returns></returns>
    [DisplayName("隱藏/啟用開發測驗頁面選單")]
    public async Task HideOrShowDevMenu()
    {
        var tagFlag = "dev";
        var hideState = await _sysMenuRep.IsAnyAsync(u => u.Tag == tagFlag && u.IsHide);

        var newHide = !hideState;
        var newState = hideState ? StatusEnum.Enable : StatusEnum.Disable;

        //更新特定欄位(同時隱藏和禁用)
        await _sysMenuRep.UpdateAsync(
            u => new SysMenu { IsHide = newHide, Status = newState },
            u => u.Tag == tagFlag);
    }

我們通過判斷當前記錄的隱藏狀態和啟用狀態,從而給他一個反轉值,然后根據條件更新相關的記錄即可,

前端開發的時候,我們除了也是相應增加對應的Tag屬性,也需要配合后端,手工添加一個對應的方法呼叫,如下代碼所示,

import { BaseApi } from './base-api';
import { SysMenu, UpdateMenuInput, AddMenuInput, MenuOutput } from '/@/api/models';

/** 選單管理Api */
class SysMenuApi extends BaseApi<SysMenu, AddMenuInput, UpdateMenuInput> {
    /**隱藏/啟用開發測驗頁面選單(對標記tag為dev的,進行隱藏或者啟用) */
    HideOrShowDevMenu = async () => {
        const url = this.baseUrl + `/HideOrShowDevMenu`;
        return await this.axiosInstance.post<UnifyResult<void>>(url, null)
    }
}

export default new SysMenuApi('/api/sysMenu');

這里只需要注意前端的呼叫api路徑,以及回傳結果即可,

根據Vue-Next-Admin的前端的測驗選單的頁面資訊,我們添加了相關的測驗案例選單,并給它們統一打上dev的標簽,添加后的選單串列界面如下所示,

 然后在界面上增加一個操作入口,如下所示,

來操作測驗案例選單的啟用或者禁用處理即可,

const hideOrShowDevMenu = () => {
    var tips = '您確認要隱藏/啟用開發測驗頁面?';
    //(對記錄標記tag為dev的,進行隱藏或者啟用)
    $u.message.confirm(tips).then(async () => {
        await menuApi.HideOrShowDevMenu();
        $u.message.success('操作成功,請重繪選單頁面,查看變化,');
        setTimeout(() => {
            window.location.reload();
        }, 1000);
    });
}

其中 $u.message 是我們注入的一個全域物件的呼叫方式,具體操作方式,請參考隨筆《在基于vue-next-admin的Vue3+TypeScript前端專案中,為了使用方便全域掛載物件介面》進行了解,

這樣顯示/禁用測驗案例的選單,就可以正常的隨意處理了,

 

3、檔案管理增加分組ID

 Admin.NET框架的檔案表結構如下所示,

 我在以前使用檔案的時候,傾向于添加一個附件組,這樣在實際業務處理的時候,不用記錄多個附件ID的記錄,只需要參考一個附件組的ID即可,因此我也希望保留這個方式來系結多個附件的展示處理,

因此在原有表的基礎上增加一個GroupId的欄位,如下所示,

 調整前后端的代碼,讓它和其他欄位一樣能夠生效,

例如后端進行分頁查詢的時候,我們增加對分組ID的判別,如下代碼所示,

    /// <summary>
    /// 獲取檔案分頁串列
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [DisplayName("獲取檔案分頁串列")]
    public async Task<SqlSugarPagedList<SysFile>> GetPage([FromQuery] PageFileInput input)
    {
        return await _sysFileRep.AsQueryable()
            .WhereIF(!string.IsNullOrWhiteSpace(input.FileName), u => u.FileName.Contains(input.FileName.Trim()))
            //增加分組ID查詢
            .WhereIF(!string.IsNullOrWhiteSpace(input.GroupId), u => u.GroupId.Equals(input.GroupId.Trim(), StringComparison.OrdinalIgnoreCase))
            .WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()) && !string.IsNullOrWhiteSpace(input.EndTime.ToString()),
                        u => u.CreateTime >= input.StartTime && u.CreateTime <= input.EndTime)
            .OrderBy(u => u.CreateTime, OrderByType.Desc)
            .ToPagedListAsync(input.Page, input.PageSize);
    }

另外我們增加一個根據分組ID進行查詢串列的操作,便于我們在前端根據分組獲得對應的檔案串列,

    /// <summary>
    /// 獲取指定附件組GUID的附件串列
    /// </summary>
    /// <param name="groupId">附件組GUID</param>
    /// <returns></returns>
    [DisplayName("獲取指定附件組GUID的附件串列")]
    public async Task<List<SysFile>> GetFilesByGroupId(string groupId)
    {
        var list = new List<SysFile>();
        if(!string.IsNullOrWhiteSpace(groupId))
        {
            list = await _sysFileRep.GetListAsync(u => u.GroupId == groupId);
        }
        return list;
    }

其他地方進行適當的調整,以便能夠使得分組ID真正的好用,便利即可,

在前端代碼里面,我們增加對應分組ID查詢檔案的介面,如下代碼所示,

import { BaseNormal } from './base-api';
import { FileInput, FileOutput, SysFile } from '/@/api/models';
/**
 * 系統檔案 管理Api
 */
class SysFileApi extends BaseNormal {
    .............
/**獲取指定附件組ID的附件串列 */ GetFilesByGroupId = async (groupId: string) => { const url = this.baseUrl + `/FilesByGroupId/${groupId}`; return await this.axiosInstance.get<UnifyResult<Array<SysFile>>>(url, { params: null }) } } export default new SysFileApi('/api/sysFile');

在查看附件或者上傳附件的時候,我們指定對應的groupId就可以了,由于為了方便展示附件串列,我們通過自定義組件的方式,系結它的分組ID進行處理,

        <div>
            <my-upload v-model="attachGroupId" :data="{ groupId: attachGroupId, path: '' }" :is-avatar-upload="false"
                :show-file-list="true" :is-show-tip="true" />
        </div>
        <div>
            <my-attachment v-model="attachGroupId"></my-attachment>
        </div>

例如附件串列,我們在請求資料的時候,如下代碼所示,

    getData() {
      // console.log(this.modelValue);
      if (!isEmpty(this.modelValue)) {
        fileApi.GetFilesByGroupId(this.modelValue).then(data =https://www.cnblogs.com/wuhuacong/archive/2023/03/29/> {
          this.attachFiles = data.data.result!;

          // 生成并添加預覽圖片串列
          this.imageList = [];
          this.attachFiles.map(item => {
            if (item.url && this.isImage(item)) {
              this.imageList.push(item.url!);
            }
          });
        });
      }

附件串列的界面效果如下所示,可以通過系結GroupId的方式,展示多個附件串列了,

如果需要上傳,那么使用封裝的上傳附件的控制元件展示,并系結對應的GroupId就可以展示多個檔案串列了

 

專注于代碼生成工具、.Net/.NetCore 框架架構及軟體開發,以及各種Vue.js的前端技術應用,著有Winform開發框架/混合式開發框架、微信開發框架、Bootstrap開發框架、ABP開發框架、SqlSugar開發框架等框架產品,
轉載請注明出處:撰寫人:伍華聰 http://www.iqidi.com

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

標籤:其他

上一篇:前端設計模式——依賴注入模式

下一篇:CSS選擇器之基礎選擇器和復合選擇器

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

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more