基于Admin.NET框架的前端的一些改进和代码生成处理

Admin.NET 是一套基于Furion/.NET 6实现的通用管理平台,模块插件式开发,框架包含了常规的权限管理、字典等管理模块,以及一些Vue3的Demo案例,框架前后端分离。后端基于基于Furion/.NET 6实现,底层集成SqlSugar;前端则是采用Vue-Next-Admin的前端框架,整体是一套非常不错的框架。本人比较喜欢研究一些技术框架,最近对该框架进行了一些研究分析,结合我自己开发框架的思路,对其前后端进行一定的修改调整,本篇随笔记录一些对该框架的相关修改内容。

Admin.NET官网的的地址:Admin.NET: 🔥基于.NET6(Furion)/SqlSugar实现的通用管理平台。整合最新技术,模块插件式开发,前后端分离,开箱即用。集成多租户、缓存、数据校验、鉴权、事件总线、动态API、通讯、远程请求、任务调度、gRPC等众多黑科技。代码简洁、易扩展,让开发更简单、更通用、更流行!,Vue-Next-Admin的官网地址:vue-next-admin | vue-next-admin,有兴趣可以分别到官网上进行预览了解。

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');

复制代码

对于没有标准CRUD接口的非常规API接口,我们可以让它继承NormalApi即可。

复制代码

import { BaseNormal} from './base-api';
import { ConstOutput } from '/@/api/models';

/**
 * 系统常量服务 管理Api
 */
class SysConstApi extends BaseNormal {  

     /**
     * 获取所有常量列表
    */
     list = async () => {
        const url = this.baseUrl + `/list`;
        return await this.axiosInstance.get<UnifyResult<Array<ConstOutput>>>(url, { params: null })
    }
}

export default new SysConstApi('/api/sysConst');

复制代码

有了这些内容我们就可以在实际业务视图中进行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文件。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
BootstrapAdmin是使用.NET Core + Bootstrap + PetaPoco + HTML 5 + jQuery构建的后台管理平台。可以用于所有的Web应用程序,目前版本已经升级到NET CORE具备跨平台能力。数据库方面同时支持多种数据库,详细列表见后面数据库的详细列表,切换数据源仅需更改配置文件无需重启应用程序,配置简单灵活。UI前端使用流行的Bootstrap框架布局对移动设备的兼容性非常好,自适应目前市场几乎所有终端设备。本系统还具备单一后台支持多前台的特色,提供单点登录(SSO)的能力。 BootstrapAdmin主要功能: 1、通过配置与前台网站集成 2、构建前台系统分层级菜单 3、提供单一后台支持多前台应用配置 4、提供单点登录 5、集成系统认证授权模块 6、提供角色,部门,用户,菜单,前台应用程序授权 6.1、角色对用户授权 6.2、角色对菜单授权 6.3、角色对部门授权 6.4、角色对应用程序授权(多个前台应用公用一个后台权限管理系统) 6.5、部门对用户授权 7、提供字典表用于前台网站个性化配置 8、完全响应式布局(支持电脑、平板、手机等所有主流设备) 9、内置多数据源支持,配置简单立即生效无需重启 10、内置数据内存缓存机制,页面快速响应 11、内置数据 操作日志 与用户 登录日志 跟踪记录用户 登录主机地点 浏览器 操作系统 信息 优势: 1、前台系统不用编写登录、授权、认证模块;只负责编写业务模块即可 2、后台系统无需任何二次开发,直接发布即可使用 3、前台与后台系统分离,分别为不同的系统(域名可独立) 4、可扩展为多租户应用
Spring Security可以与前端进行集成,以实现身份验证和授权的功能。通过使用前后端分离的架构,前端和后端可以独立开发和部署,提高系统的灵活性和可维护性。 在前后端分离的架构中,前端负责展示数据和用户界面,后端负责处理业务逻辑和数据访问。Spring Security可以通过提供一些接口和配置来与前端进行集成。 例如,前端可以发送登录请求到后端,后端使用Spring Security来验证用户的身份。验证成功后,后端可以生成一个认证令牌,并将其返回给前端前端在后续的请求中可以将该认证令牌作为身份凭证发送到后端,以验证用户的身份和权限。 在实际开发中,可以使用一些前端框架如Vue、React或Angular来开发前端页面。针对Spring Security的集成,可以参考一些开源的项目模板,如vue-admin-template。这些项目模板提供了前端和后端集成的示例代码和配置,可以作为参考和起点进行开发。 总结来说,Spring Security可以与前端进行集成,通过认证令牌的方式实现用户身份验证和授权。前端可以使用一些开源的项目模板和前端框架来开发与后端集成的用户界面。详细的集成步骤和配置可以参考相关的文档和示例代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Spring Security 前后端分离(前端篇)](https://blog.csdn.net/qq_31772441/article/details/127850872)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dunming_6725413

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值