其他分享
首页 > 其他分享> > 「Fast AKash 1.0 ◎ 一个让开发回归本质,让业务主导需求的前后端分离式敏捷开发框架」正式发布

「Fast AKash 1.0 ◎ 一个让开发回归本质,让业务主导需求的前后端分离式敏捷开发框架」正式发布

作者:互联网

Fast AKash ◎ API

至纯 ◎ 至简 ◎ 质量 ◎ 效率
让开发回归本质 ◎ 让业务主导需求

文章目录


前言

省去繁杂配置,简化冗余代码,精准精确,逻辑至上
欢迎您选择并使用Fast AKash前后端分离式快速开发框架 w(゚Д゚)w
Fast Akash已为您集成了项目最基础的欢迎您选择并使用系统管理相关模块
!支持「多权限分配及切换」w(゚Д゚)w
只需经过简单学习,您就可以轻松玩转本框架 w(゚Д゚)w


一、技术选型

  1. Fast Akash For Java 「后端」

    • Spring Boot 2.X
    • Redis
    • Rabbit MQ
    • Druid
    • MySql 5.7+
    • JDK1.8+
    • MyBatis
  2. Fast Akash For Ant-Design-Vue 「前端」

    • Node.js
    • Ant Design Of Vue
    • Yarn
    • WebPack
    • @vue/cli ~3
    • eslint

二、项目地址

三、运行Fast Akash

在您正式运行Fast Akash相关项目前,请确保您的电脑已安装并配置了项目必备的运行环境

1.Fast AKash For JAVA

  1. 安装相关工具及依赖
  2. 选择拉取giteegithub的项目源码至本地
  3. 在mysql中执行src/main/resource/sqlinit目录下的fastAkash.sql
  4. 将项目导入IdeaMyEclipse 「建议使用idea
  5. 修改src/main/resource目录下的application-dev.yml文件,补全修改指定配置项
spring:
  rabbitmq:
     host: xxx
     port: 5672
     username: xxx
     password: xxx
  redis:
    database: 0
    host: xxx
    port: 6379
    password: xxx
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:xxxx/dataBasename?characterEncoding=utf8&useSSL=false&serverTimezone=CTT&useInformationSchema=true&
    username: root
    password: xxxx
akashConfig:
  defaultFilePath: d:/         # 系统默认的文件上传地址
  log_queue: xxx               # 日志服务使用的队列名称
  init:				  # 若您不想在后台反复修改本配置,建议您将init.enable设置为true即可
    enable: false     # 基础数据初始化 「关闭后系统启动时将不再自动对「数据库库表、字段」及「@schema逻辑层」进行数据同步」 
    baseInit: false  # 是否同步系统底层数据表 默认为「false」
    history:  false  # 是否保存历史字段及表信息 默认为「false」 设置为「true」时,同步数据会对原有数据进行备份
    tables:          # 在init.enable为「true」时,可以指定需要同步的数据表「多个间以,隔开」,为空视为同步指定数据库所有数据表
  access:
    enable: false  # 强制鉴权控制,测试时请根据需要打开[true]或关闭[false]本项
  1. 编译/启动项目
  2. 访问项目: localhost/fastAkash
  3. 项目目录
    在这里插入图片描述
  4. 开发时,您无需关心Controller层,Dao层及API层
    只需在schema「逻辑层」目录下编写您项目的核心逻辑代码即可

2.Fast AKash For Vue

纯后端的同学可以自行学习相关内容或在前端的同学的指导下操作 w(゚Д゚)w @

  1. 安装相关工具及依赖
  2. 选择拉取giteegithub的项目源码至本地
  3. 安装依赖: yarn install 「要在当前项目文件夹目录打开cmd窗口执行哦 w(゚Д゚)w 」
  4. 开发模式运行: yarn run serve
  5. 项目发布: yarn run build

「默认发布的代码在/dist目录下,也可以将build的地址更改至后端项目的/src/main/resource/static目录下或直接将/dist文件夹中的内容copy至后端项目的/src/main/resource/static目录中」

  1. 访问项目: localhost:8000/#/
  2. 项目基础配置地址:/src/config/defaultSetting.js
/**
 * 项目默认配置项
 * primaryColor - 默认主题色, 如果修改颜色不生效,请清理 localStorage
 * navTheme - sidebar theme ['dark', 'light'] 两种主题
 * colorWeak - 色盲模式
 * layout - 整体布局方式 ['sidemenu', 'topmenu'] 两种布局
 * fixedHeader - 固定 Header : boolean
 * fixSiderbar - 固定左侧菜单栏 : boolean
 * contentWidth - 内容区布局: 流式 |  固定
 *
 * storageOptions: {} - Vue-ls 插件配置项 (localStorage/sessionStorage)
 * url : 后台请求链接
 * accessLogin: 前端是否启用强制校验(测试时使用false)
 */

export default {
  url: '',
  accessLogin: true,
  navTheme: 'dark', // theme for nav menu
  primaryColor: '#1890ff', // primary color of ant design
  layout: 'sidemenu', // nav menu position: `sidemenu` or `topmenu`
  contentWidth: 'Fluid', // layout of content: `Fluid` or `Fixed`, only works when layout is topmenu
  fixedHeader: false, // sticky header
  fixSiderbar: false, // sticky siderbar
  multiTab: true,
  colorWeak: false,
  menu: {
    locale: false
  },
  title: 'AkashFast',
  pwa: false,
  iconfontUrl: '',
  production: process.env.NODE_ENV === 'production' && process.env.VUE_APP_PREVIEW !== 'true'
}

  1. 项目菜单路由配置地址:/src/config/router.config.js

「更详细的内容将在未来放出,敬请关注~w(゚Д゚)w 」

四 、 SQL引擎使用入门「Fast Akash For Java」


在本小节中,您将学习到Fast Akash开发中最为核心的功能引擎sqlEngine最简单的使用方式

这也将是您在未来使用Fast Akash For Java开发时不可或缺的一大助力w(゚Д゚)w


SQL 引擎使用示例①:↓
       private sqlEngine buildEngine(BaseData executeData) {
        BaseData data = StringKit.parseBaseData(executeData.getString("executeData"));

        sqlEngine st = new sqlEngine().execute("sys_user", "t")
                .joinBuild("sys_userrole","s", joinType.L)
                .joinColunm("s","uid","t","id")
                .joinFin();

        //TODO 参数匹配
        //请注意,若使用此类型进行数据操作时,请严格按照sqlEngine传参格式在key值前加入固定参数标识@,如@key

        Integer state = data.getInter("state");
        if (state != -1) {
            st.queryBuild(queryType.and, "t", "@state", conditionType.EQ, groupType.DEF, state + "");
        }

        // 权限查询
        String rid = data.getString("rid");
            st.queryBuild(queryType.and,"s","@rid",conditionType.QUERY_ROLE,groupType.DEF,!rid.isEmpty() ? rid : getRid(data));

        st.appointColumn("s",groupType.DEF,"rid,uid");
        st.appointColumn("t", groupType.DEF, "id,name,email,mobile,openid,last_ip,last_time,state,version,is_lock");
        st.groupBuild("s", "uid");
        st.dataSort("t","name", sortType.UTF_ASC);

        return st;
    }

    /**
     * 查询系统内已有的系统用户「顾问」
     *
     * @param executeData
     * @return
     */
    @Access({AccessType.SEL})
    public Map<String, Object> selectUserList(BaseData executeData) {
        return baseApi.selectPageBase(pageEngine(buildEngine(executeData), executeData, false).selectTotal());
    }

    /**
     * 根据查询列表设置的条件导出用户信息
     *
     * @param executeData
     * @return
     */
    @Access({AccessType.EXPORT})
    public ModelAndView exportUserData(BaseData executeData) {
        //1.设置xlxs的基本信息
        BaseData excelParams = new BaseData();
        excelParams.put("cellName", "name,email,mobile,note,is_lock");
        excelParams.put("cellParseName", "用户名,企业邮箱,联系方式,备注信息,是否锁定");

        //2.对特定字段转换
        BaseData parseParams = new BaseData();
        BaseData parseLock = new BaseData();
        parseLock.put("0","否");
        parseLock.put("1","是");

        parseParams.put("is_lock",parseLock);

        excelParams.put("parseCellValue", parseParams);
        excelParams.put("fileName", "系统用户信息");
        return excelImport.importExcel(baseApi.selectBase(buildEngine(executeData).selectFin("")), excelParams);
    }

以上代码为标准示例,也是更为推荐您在后期开发时使用的一种标准代码模板(查询及导出)
接下来我将带您使用SQL引擎创建一个最简单的SQL查询语句

// 声明并表示一个SQL引擎的开始及创建
sqlEngine st = new sqlEngine();
// 声明主表及主表别名
st.execute("table", "t");
// 结束标识,以此表示一个完整SQL的结束
st.selectFin('');

以上代码将生成 : select * from table as t;
怎么样,是不是很简单w(゚Д゚)w
接下来我将带您创建一个带条件的简单查询

// 声明并表示一个SQL引擎的开始及创建
sqlEngine st = new sqlEngine();
// 声明主表及主表别名
st.execute("table", "t");
// 声明一个查询条件
st.queryBuild(queryType.and, "t", "@state", conditionType.EQ, groupType.DEF, "0");
// 结束标识,以此表示一个完整SQL的结束
st.selectFin('');

以上代码将生成 : select * from table as t where t.state = 0 ;
难度要提升了哦,让我们来试试连表如何实现吧w(゚Д゚)w

// 声明并表示一个SQL引擎的开始及创建
sqlEngine st = new sqlEngine();
// 声明主表及主表别名
st.execute("table", "t");
// 声明外联表,外联表别名及连表规则,本示例中为L,即Left
st.joinBuild("table2","s", joinType.L)
// 声明外联表关系
st.joinColunm("s","uid","t","id")
// 声明当前外联关系的结束
st.joinFin();
st.queryBuild(queryType.and, "t", "@state", conditionType.EQ, groupType.DEF, "0");
// 结束标识,以此表示一个完整SQL的结束
st.selectFin('');

以上代码将生成 : select * from table as t left join table2 as s on s.uid=t.id where t.state = 0 ;
学到这里您是不是已经感觉迫不及待要自己尝试一下了呢?(๑•̀ㅂ•́)و✧
稍等一下,还有一样黑科技↓

st.queryBuild(queryType.and,"s","@rid",conditionType.QUERY_ROLE,groupType.DEF,rid);

他就是:QUERY_ROLE
想必您已经在最开始的示例中见过他了
他的作用就是根据给定的权限查询其权限及其全部子级权限
在您需要对数据加权时,他将会是您的得力助手哦o(*≧▽≦)ツ
只需要一句代码,您就可以轻而易举的实现权限层级的数据分离了,是不是很棒?
最后,让我们再认识几个常用的小伙伴吧~

 // 声明需要对查询结果进行排序
 // 目前支持ASC,DESC以及根据中文进行排序的UTF_ASC,UTF_DESC
 st.dataSort("t","name", sortType.UTF_ASC);
 // 声明需要定向查询的字段
 // 使用#可以为当前字段添加别名,即 select rid as role_id from xxx...
 // 用逗号(英文)隔开多个需要查询的字段
 // 多表使用时,再次声明即可
 st.appointColumn("s",groupType.DEF,"rid,uid");
 st.appointColumn("t",groupType.DEF,"rid#role_id");
 // 数据分页,limit 1,10 「正常情况下,使用时记得加上@标识哦」
 st.dataPaging("@1", "@10");
 // 结束标识,因为我很关键,所以我又来了
 st.selectFin('');

sql引擎的简单使用方式就暂时介绍到这里了,后期我会详细的写一篇API提供给大家,敬请关注~<( ̄︶ ̄)>

五 、业务功能开发「Fast Akash For Java」


在本小节中,您将学习在Fast Akash中如何快速开发您的逻辑代码

充分感受并体验到Akash为您带来的极致编码体验


在这里插入图片描述

在schema目录下创建一个java文件夹,如「business」
在「business」文件夹下创建您的业务逻辑代码类,如「businessSchema.java」

/**
 * business 业务逻辑类
 *       TODO : 业务逻辑类 
 * @author HaoNan Yan
 */
@Service
@Transactional(readOnly = true)
@Schema(code = "business", name = "业务逻辑类")
public class businessSchema extends BaseSchema {
   // ...
}

以下两点很关键!!这关系着系统是否可以正常的对外提供数据接口!!

  • schema业务类必须标注@Schema注解
  • 业务类相关schema必须继承BaseSchema

在您熟悉并了解@Schema注解后,我们现在开始编写一个逻辑方法

    /**
     * 「新增/创建」
     */
    @Access({AccessType.ADD})
    @Transactional(readOnly = false)
    public String add(BaseData executeData) {
        // ...
    }
    /**
     * 「删除」
     */
    @Access({AccessType.DEL})
    @Transactional(readOnly = false)
    public String del(BaseData executeData) {
        // ...
    }
    /**
     * 「更新」
     */
    @Access({AccessType.UPD})
    @Transactional(readOnly = false)
    public String upd(BaseData executeData) {
        // ...
    }
    // 查询
    @Access({AccessType.SEL})
    // 导出
    @Access({AccessType.EXPORT})
    // 导入/上传
    @Access({AccessType.UPLOAD})
    // ...

方法一定要加上@Access鉴权注解哦,系统会以此为标准对接口进行鉴权限制
请根据方法实际作用效果选择对应的AcessType
在简单的了解了类和方法的关键注解后,我们接下来学习一下对外的统一标准接口

 /**
     * 系统业务 ·  统一入口
     *
     *
     * @param schemaName    需要调用的业务逻辑名称,默认使用base
     * @param methodName    需要请求的方法名称
     * @param id            数据表id /  sql数据引擎id    TODO  ※ schemaName非base时,允许为空
     * @param data          封装参数  方法所需参数集合    TODO  ※ 允许为空,为空时建议传入 -> {}
     *                      {
     *                         *id  :
     *                         *executeData :
     *                         {
     *                             paramA :   ……参数A
     *                             paramB :   ……参数B
     *                                      ……
     *                         }
     *                      }
     * TODO   基础逻辑方法 「base」 :
     *                      1.  select          查询数据                      TODO  ※ 需要使用sql引擎id
     *                      2.  selectPage      查询数据「含分页」             TODO  ※ 需要使用sql引擎id
     *                      3.  selectByOne     根据数据id查询指定数据信息
     *                      4.  insertData      新增数据
     *                      5.  updateData      更新数据
     *                      6.  deleteDataSoft  数据软删除
     *                      7.  deleteData      数据暴力删除
     *                      TODO  3~7 demo示例可在AkashApplicationTests查看
     *
     * @return 请求结果
     */
    @CrossOrigin(origins = "*", maxAge = 3600)
    @RequestMapping(value = "/executeUnify",
            method = RequestMethod.POST,
            produces = "application/json;charset=UTF-8")
    public String executeUnify(
            @RequestParam(value = "schemaName", required = false, defaultValue = "base") String schemaName,
            @RequestParam(value = "methodName") String methodName,
            @RequestParam(value = "id", required = false, defaultValue = "") String id,
            @RequestParam(value = "data", required = false, defaultValue = "{}") String data) {
        if (accessTool.accessParamCheck(schemaName, methodName, id)) {
            //⚠ 检测到注入攻击
            Map<String, Object> result = new ConcurrentHashMap<>();
            result.put("result", "0");
            result.put("resultData", "⚠ 操作失败,请联系管理员");
            return JSON.toJSONString(result);
        } else {
            //数据正常,放行
            BaseData execute = StringKit.parseBaseData(data);
            return StringKit.formatSchemaData(invokeMethod(schemaName, methodName, id, execute));
        }
    }

executeUnify: 除导入上传及导出下载外,统一的标准型对外接口
这个接口具备统一的入参及返回值格式,即前端无需因为接口不统一的繁琐而增大工作量,后端也不用为了不同返回值的格式而浪费大量的时间
现在我们结合@Schema来实现一次接口调用

接口地址:localhost/executeUnify
{
	schemaName: business
	methodName: sel
	id: 
	data: {"state":1}
}
返回值:
{
result: "NAC"
resultData: "⚠ 操作失败:无数据访问权限"
}

聪明的你是不是已经发现了
schemaName就是@Schema注解的code
methodName就是schema中的sel方法
而返回值也是经过系统处理,变成了result + resultData的格式
至此,相关后台的简要学习就要结束了,更多相关本框架的学习内容敬请关注我的博客~

后记

有关BUG反馈,请提交至gitee或github的issue
如您或更好的想法及建议,请加Q群:515548799
如您想加入协作,请加Q群并联系群主
如果您喜欢Fast Akash,请在gitee或github点击watch/star或fork本项目
您的支持,就是Fast Akash攀向巅峰的最大助力!

Thaks for watch and change Fast Akash

标签:false,AKash,Fast,st,executeData,分离式,1.0,id,Akash
来源: https://blog.csdn.net/qq_27047215/article/details/115228902