基于Admin.NET框架的前端的一些改进和代码生成处理(1)
Admin.NET 是一套基于Furion/.NET 6实现的通用管理平台,模块插件式开发,框架包含了常规的权限管理、字典等管理模块,以及一些Vue3的Demo案例,框架前后端分离。后端基于基于Furion/.NET 6实现,底层集成SqlSugar;前端则是采用Vue-Next-Admin的前端框架,整体是一套非常不错的框架。本人比较喜欢研究一些技术框架,最近对该框架进行了一些研究分析,结合我自己开发框架的思路,对其前后端进行一定的修改调整,本篇随笔记录一些对该框架的相关修改内容。
Admin.NET官网的的地址:https://gitee.com/zuohuaijun/Admin.NET,Vue-Next-Admin的官网地址:https://lyt-top.gitee.io/vue-next-admin-doc-preview/,有兴趣可以分别到官网上进行预览了解。
1、API及对象接口的处理
一般的前端,为了访问后端接口,以及转换对象,都需要构建后端接口的API代理类,以及相关的对象接口定义,Admin.NET的前端这部分内容放在 api-services 目录 下,包含了apis和models两个目录
不过由于它们可能使用基于类似 generator-swagger-2-ts 插件的方式进行前端代码的生成,因此代码显得非常臃肿,一个简单的API需要来回的封装接口进行调用,以字典API为例,每个API的类代码都显得很臃肿,接近1000行代码,这个和我们实际的API调用不太匹配,我们一般只需要简单的调用就可以做到了,太多的代码不利于阅读和维护。
在我的随笔《基于SqlSugar的开发框架循序渐进介绍(10)-- 利用axios组件的封装,实现对后端API数据的访问和基类的统一封装处理》中介绍过前端的API调用过程场景,如下所示。
前端一般根据框架后端的接口进行前端JS端的类的封装处理,引入了ES6类的概念实现业务基类接口的统一封装,简化代码。
一般我们在基类BaseApi中创建一些常用API的调用处理,那么常用的业务类继承BaseApi,就会具有相关的接口了,如下所示继承关系。
这样我们代码就会变得简洁很多,维护阅读都非常方便。
我们遵循Admin.NET的目录结构,如下所示放置Api接口和业务对象接口类。
根据是否具有常规接口的后台接口定义,我们创建两个不同的基类BaseNormal 和 BaseApi ,这样我们便于实际的业务类Api的封装抽象。
如下是常规的基类,不具有任何基类接口,只是为了方便构造一些参数
/**
* 此类作为普通API的基类,不继承常规的通用CRUD方法,如文件操作,服务器信息等类
*/
export class BaseNormal {
/**
* 服务器请求的起始路径, 类似 'http://localhost:**
*/
protected basePath = serveConfig.basePath; /**
* Api路径。子类通过构造函数修改, 其中api转义为具体的路径,如'/api/test'
*/
protected apiPath = '/api/test'; /**
* 请求完整路径(除了方法名),类似 `http://localhost:**\/api/test`
*/
protected baseUrl = this.basePath + this.apiPath;// /**
* 定义一个axios变量,便于子类访问
*/
protected axiosInstance = axiosInstance; /**
* 构造函数,接受Api路径,如'/api/test'
*/
constructor(apiPath: string) {
// 构造函数
this.apiPath = apiPath;
this.baseUrl = this.basePath + this.apiPath;
}
}
下面是一个具有数据访问CRUD的操作接口,如下所示。
/**
* 服务器请求基础类
*/
export class BaseApi<EntityType = any, AddType = any, UpdateType = any> extends BaseNormal {
/**
* 分页获取列表
*/
page = async (data: object | null) => {
const url = this.baseUrl + `/page`;
return await this.axiosInstance.get<UnifyResult<SqlSugarPagedList<EntityType>>>(url, { params: data })
} /**
* 获取列表
*/
list = async (data: object | null) => {
const url = this.baseUrl + `/list`;
return await this.axiosInstance.get<UnifyResult<Array<EntityType>>>(url, { params: data })
} /**
* 新增记录
*/
add = async (data: AddType) => {
const url = this.baseUrl + `/add`;
return await this.axiosInstance.post<UnifyResult<void>>(url, data)
}
/**
* 更新记录
*/
update = async (data: UpdateType) => {
const url = this.baseUrl + `/update`;
return await this.axiosInstance.post<UnifyResult<void>>(url, data)
}
/**
* 删除记录
*/
delete = async (data: object) => {
const url = this.baseUrl + `/delete`;
return await this.axiosInstance.post<UnifyResult<void>>(url, data)
} /** 批量删除 */
batchDelete = async (data: object) => {
const url = this.baseUrl + `/BatchDelete`;
return await this.axiosInstance.post<UnifyResult<void>>(url, data)
}
}
根据接口返回的内容,其中UnifyResult 对象接口是统一接口返回的处理对象,我们在types目录中定义即可,而SqlSugarPagedList则是Admin.NET分页返回的结果集合,这些基础类接口也是定义types目录中即可。
而对于对应后端业务类对象接口的定义,我们倾向于把它按业务区分,一个业务类对应的放在一个独立的文件中定义即可,如下所示。
一般包含一个标准的对象接口,增加对象、修改对象、查询对象等接口对象。
业务API代理类的定义,这是根据这些模型的信息进行简单的声明即可,如下对于菜单,如果不考虑除了增删改查的其他额外的接口,那么只需要简单的继承BaseApi即可。
import { BaseApi } from './base-api';
import { SysMenu, UpdateMenuInput, AddMenuInput, MenuOutput } from '/@/api/models'; /**
* 菜单管理Api
*/
class SysMenuApi extends BaseApi<SysMenu, AddMenuInput, UpdateMenuInput> { ............./*其他接口定义*/ } export default new SysMenuApi('/api/sysMenu');
有了这些内容我们就可以在实际业务视图中进行API接口的调用了。
对于原先的Admin.NET的业务接口调用,他们需要先引入一个工厂类,然后构造处理才能调用接口,如下定义:
import { getAPI } from '/@/utils/axios-utils';
import { SysMenuApi } from '/@/api-services/api';
原先的Admin.NET视图组件中的实际的调用代码如下所示。
// 查询操作
const handleQuery = async () => {
state.loading = true;
var res = await getAPI(SysMenuApi).apiSysMenuListGet(state.queryParams.title, state.queryParams.type);
state.menuData = res.data.result ?? [];
state.loading = false;
};
由于他们是采用Swagger的接口生成,因此默认接口名称都带有api的前缀,Get或者Post的后缀,感觉不是那么易读。
而对于我们重构过的处理逻辑,定义代码如下所示。
import { SysMenu } from '/@/api/models';
import menuApi from '/@/api/apis/sys-menu-api'
实际视图或者组件中的调用代码如下所示。
// 查询操作
const handleQuery = async () => {
state.loading = true;
var res = await menuApi.list(state.queryParams);
state.menuData = res.data.result ?? [];
state.loading = false;
};
实际调用代码简单只是一点点,但是Api的定义代码,从上千行调用代码则锐减到仅仅几行代码就可以了,减少了大量重复的累赘接口定义,以及很多模型接口重复定义操作(例如对于分页返回的对象,他们每次都生成一遍重读的类型,而这里则是使用泛型基于SqlSugarPagedList的方式进行简化)。
2、基于代码生成工具的生成
有些人说他们虽然代码多了一点,贵在能够根据接口自动生成前端代码呀,确实能自动生成代码是非常不错的一件事情,可以极大提高效率。
那么我们也根据接口的通用性,来构建代码生成的相关规则即可。由于这些接口的生成,大多数情况下,都是以数据库表和字段的规则进行生成的,因此我把它整合在代码生成工具的功能上生成即可。
最后我们把生成的Api部分代码放在目录中
视图代码放在views目录里面对应的目录即可,如下是测试生成的页面,包括有index.vue 页面,以及edit.vue,以及import.vue的页面。
其中index是主页面查询及列表展示内容,edit.vue是新增和编辑界面内容,而import.vue这是导入界面内容。
目录文件如下图所示。
自动生成的index.vue页面代码,根据预定义的模板进行生成,经过多次的校准,已经比较完美的根据数据库表字段及备注信息,生成视图代码了。
生成的页面,进行一定的微调即可用于实际的生产业务中了。
该测试页面添加完成后,在后端创建一个菜单指向它即可,编译运行界面效果如下所示。
我改变了一下常规的界面功能,增加了导入、导出、批量删除的操作入口。
默认进行折叠,展开则列出所有条件,如下界面所示。
导入界面是改进了ele-Import插件,得到界面效果如下所示。
导出则是利用xlsx的插件进行导出Excel文件。
如果需要了解代码生成,可以下载Database2Sharp代码生成工具 进行了解。
基于Admin.NET框架的前端的一些改进和代码生成处理(1)的更多相关文章
- 在基于ABP框架的前端项目Vue&Element项目中采用电子签名的处理
在前面随笔介绍了<在基于ABP框架的前端项目Vue&Element项目中采用电子签章处理文件和打印处理>的处理,有的时候,我们在流程中或者一些文件签署的时候,需要签上自己的大名,一 ...
- Uwl.Admin开源框架(一)
1.前言 作为一个忠实的软粉,一直期待微软出跨平台,一直在等待.Net Core,因为刚毕业对于.Net的很多东西不是很熟知,就开始了.Net Core的摸索,一路上坎坎坷坷,对于新技术一直很期待,就 ...
- 基于AngularJS的个推前端云组件探秘
基于AngularJS的个推前端云组件探秘 AngularJS是google设计和开发的一套前端开发框架,帮助开发人员简化前端开发的负担.AngularJS将帮助标准化的开发web应用结构并且提供了针 ...
- 基于AngularJS的企业软件前端架构[转载]
这篇是我参加QCon北京2014的演讲内容: 提纲: 企业应用在软件行业中占有很大的比重,而这类软件多数现在也都采用B/S的模式开发,在这个日新月异的时代,它们的前端开发技术找到了什么改进点呢? B/ ...
- 基于Java Netty框架构建高性能的部标808协议的GPS服务器
使用Java语言开发一个高质量和高性能的jt808 协议的GPS通信服务器,并不是一件简单容易的事情,开发出来一段程序和能够承受数十万台车载接入是两码事,除去开发部标808协议的固有复杂性和几个月长周 ...
- 基于Typecho CMS框架开发大中型应用
基于Typecho CMS框架开发大中型应用 大中型应用暂且定义为:大于等于3个数据表的应用!汗吧! Typecho原本是一款博客系统,其框架体系有别于市面上一般意义MVC框架,主体代码以自创的Wid ...
- 基于layui的框架模版,采用模块化设计,接口分离,组件化思想
代码地址如下:http://www.demodashi.com/demo/13362.html 1. 准备工作 编辑器vscode,需要安装liveServer插件在前端开启静态服务器 或者使用hbu ...
- 基于React的PC网站前端架构分析
代码地址如下:http://www.demodashi.com/demo/12252.html 本文适合对象 有过一定开发经验的初级前端工程师: 有过完整项目的开发经验,不论大小: 对node有所了解 ...
- 微信公众号开发系列-13、基于RDIFramework.NET框架整合微信开发应用效果展示
1.前言 通过前面一系列文章的学习,我们对微信公众号开发已经有了一个比较深入和全面的了解. 微信公众号开发为企业解决那些问题呢? 我们经常看到微信公众号定制开发.微信公众平台定制开发,都不知道这些能给 ...
- 基于asp.net(C#)MVC+前端bootstrap+ztree+lodash+jquery技术-Angel工作室通用权限管理
一.Angel工作室简单通用权限系统简介 AngelRM(Asp.net MVC Web api)是基于asp.net(C#)MVC+前端bootstrap+ztree+lodash+jquery技术 ...
随机推荐
- Hive. 函数 instr 的用法
INSTR(C1,C2,I,J) 在一个字符串中搜索指定的字符,返回发现指定的字符的位置; C1 被搜索的字符串 C2 希望搜索的字符串 I 搜索的开始位置,默认为1 J 出现的位置,默认为1 sel ...
- 随机生成不重复的几个数(Unity)
using System.Collections.Generic; using UnityEngine; /// <summary> /// 随机数管理类 /// </summary ...
- Vue3父组件调用子组件内部的方法
1. 子组件中定义方法并通过defineExpose暴露出去 import { reactive, defineExpose } from "vue"; const state = ...
- 使用Python实现给企业微信发送allure报告,并实现微信查看
1.注册企业微信 搜索企业微信直接注册 2.创建应用 3.查看企业id.Secret.应用id.部门id 4.发送代码 import os import jenkins import requests ...
- #AI 绘图 #GitHub GitHub上这几个项目教你怎么用,让你成为神笔马良
1.前情提要 前两天在 GitHub Trending 上看到个利用 AI 自动给图片上色的项目(style2paints)火起来了. 在 AI 大行其道的时代,工程师们也开始思考如何用这项技术来解决 ...
- 关于Python文件读取时,默认把\r\n换成\n
Python在非二进制形式读取文件时,自动把\r\n换成\n.(window下换行是\r\n) 建立一个test1.txt文件, aaaa bbbb 1.在utf8方式下读取 读取四个字符 1 f=o ...
- StringIO 和 BytesIO
StringIO 要把 str 字符串写入内存中,我们需要创建一个 StringIO 对象,然后像文件一样对读取内容.其中 StringIO 中多了一个 getvalue() 方法,目的是用于获取写入 ...
- cadence-ADE反相器仿真
Cadence-ADE仿真 连接电路 鼠标移至schematic绘制区域,单击放置inv i键继续添加gnd, vdc(3.3V), vpulse(0-3.3V,Period 1us,Pulse wi ...
- 基于Nginx以及web服务器搭建在线视频播放
安装Nginx Nginx官网下载地址 网址打开后如图 下载windows版本的Nginx,这里下载最新的1.18.0版本 Nginx在windows下的安装只需要将其解压缩即可.建议将解压后的目录移 ...
- jquery 时间戳转化为日期时间格式,年月日 时分秒
<script type="text/javascript"> var strDate = ''; $(function(){ // 获取时间戳 时间戳为10位需*10 ...