用 Go 语言基于Gin、Vue3、Typescript、vite、Arco Design、MySQL、reids等框架精心打造的一款模块化、插件化、高度自动化、高性能的前后端分离架构敏捷开发框架,可快速搭建前后端分离后台管理系统。本着简化开发、提升开发效率的初衷,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式,同时为了敏捷快速开发,框架特地集成了代码生成器一键生成管理后台的前后端代码,快速开发或生成api接口代码和接口文档、测试api接口等编辑,完全自主研发了自定义GO后端服务模板和前端Vue自定义模板,可以根据已建好的表结构,可以快速的一键生成整个模块的所有代码和增删改查等等功能业务,几秒即可生成应用端(小程序,app)调用的api接口。真正实现了低代码开发方式,极大的节省了人力成本的同时提高了开发效率,缩短了研发周期,是一款真正意义上实现组件化、可插拔式的敏捷开发框架。保证同等项目时间,您用GoFly的框架后,后台和接口可以减少7成时间,是否真实您自己体验,我们自己人不能崔牛了!企业版更加实用省时代码生成几乎不需修改代码就可到达使用效果。
开源版资源地址
框架官网地址:GoFly全栈开发者社区
框架源码下载地址:GoFly 后端快速开发框架源码
框架演示地址:GoFly快速开的应用演示
开源版界面
生成的管理后台效果
通用接口代码
package common
import (
"encoding/json"
"fmt"
"gofly/app/model"
"gofly/global"
"gofly/utils"
"gofly/utils/results"
"io/ioutil"
"reflect"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
)
// 用于自动注册路由
type Api struct {
}
func init() {
fpath := Api{}
utils.Register(&fpath, reflect.TypeOf(fpath).PkgPath())
}
// 获取成员列表
func (api *Api) Get_list(c *gin.Context) {
businessID := c.GetHeader("Businessid")
apiID := c.DefaultQuery("apiID", "")
title := c.DefaultQuery("title", "")
lastid := c.DefaultQuery("lastid", "")
_pageSize := c.DefaultQuery("pageSize", "10")
pageSize, _ := strconv.Atoi(_pageSize)
if apiID == "" {
results.Failed(c, "请传参数apiID", nil)
} else {
//获取接口数据信息
apitext, _ := model.DB().Table("common_apitext").Where("id", apiID).Fields("tablename,fields").First()
MDB := model.DB().Table(apitext["tablename"]).Fields(apitext["fields"].(string)).Where("businessID", businessID)
MDBC := model.DB().Table(apitext["tablename"]).Where("businessID", businessID)
if title != "" {
MDB.Where("title", "like", "%"+title+"%")
MDBC.Where("title", "like", "%"+title+"%")
}
if lastid != "" {
MDB.Where("id", "<", lastid)
}
list, err := MDB.Limit(pageSize).Order("id desc").Get()
if err != nil {
results.Failed(c, err.Error(), nil)
} else {
var new_lastid interface{}
rooturl, _ := model.DB().Table("common_config").Where("keyname", "rooturl").Value("keyvalue")
for key, val := range list {
if _, ok := val["image"]; ok && !strings.Contains(val["image"].(string), "http") && rooturl != nil {
val["image"] = rooturl.(string) + val["image"].(string)
}
fmt.Println(key)
if (key + 1) == len(list) {
new_lastid = val["id"]
}
}
var totalCount int64
totalCount, _ = MDBC.Count()
results.Success(c, "获取全部列表", map[string]interface{}{
"lastid": new_lastid,
"pageSize": pageSize,
"total": totalCount,
"items": list}, nil)
}
}
}
// 获取详情
func (api *Api) Get_detail(c *gin.Context) {
apiID := c.DefaultQuery("apiID", "")
id := c.DefaultQuery("id", "")
if apiID == "" {
results.Failed(c, "请传参数apiID", nil)
} else if id == "" {
results.Failed(c, "请传参数id", nil)
} else {
//获取接口数据信息
apitext, _ := model.DB().Table("common_apitext").Where("id", apiID).Fields("tablename,fields").First()
data, err := model.DB().Table(apitext["tablename"]).Where("id", id).Fields(apitext["fields"].(string)).First()
if err != nil {
results.Failed(c, "获取详情失败", err)
} else {
if data != nil {
rooturl, _ := model.DB().Table("common_config").Where("keyname", "rooturl").Value("keyvalue")
if _, ok := data["image"]; ok && !strings.Contains(data["image"].(string), "http") && rooturl != nil {
data["image"] = rooturl.(string) + data["image"].(string)
}
}
results.Success(c, "获取详情成功!", data, nil)
}
}
}
// 保存
func (api *Api) Save(c *gin.Context) {
apiID := c.DefaultQuery("apiID", "")
if apiID == "" {
results.Failed(c, "请传参数apiID", nil)
} else {
body, _ := ioutil.ReadAll(c.Request.Body)
var parameter map[string]interface{}
_ = json.Unmarshal(body, ¶meter)
var f_id float64 = 0
if parameter["id"] != nil {
f_id = parameter["id"].(float64)
}
apitext, _ := model.DB().Table("common_apitext").Where("id", apiID).Fields("tablename").First()
if f_id == 0 {
delete(parameter, "id")
if IsHaseField(apitext["tablename"].(string), "createtime") {
parameter["createtime"] = time.Now().Unix()
}
if IsHaseField(apitext["tablename"].(string), "businessID") {
parameter["businessID"] = c.GetHeader("Businessid")
}
addId, err := model.DB().Table(apitext["tablename"]).Data(parameter).InsertGetId()
if err != nil {
results.Failed(c, "添加失败", err)
} else {
if addId != 0 {
model.DB().Table(apitext["tablename"]).
Data(map[string]interface{}{"weigh": addId}).
Where("id", addId).
Update()
}
results.Success(c, "添加成功!", addId, nil)
}
} else {
res, err := model.DB().Table(apitext["tablename"]).
Data(parameter).
Where("id", f_id).
Update()
if err != nil {
results.Failed(c, "更新失败", err)
} else {
results.Success(c, "更新成功!", res, nil)
}
}
}
}
// 删除
func (api *Api) Del(c *gin.Context) {
apiID := c.DefaultQuery("apiID", "")
if apiID == "" {
results.Failed(c, "请传参数apiID", nil)
} else {
apitext, _ := model.DB().Table("common_apitext").Where("id", apiID).Fields("tablename").First()
body, _ := ioutil.ReadAll(c.Request.Body)
var parameter map[string]interface{}
_ = json.Unmarshal(body, ¶meter)
ids := parameter["ids"]
res2, err := model.DB().Table(apitext["tablename"]).WhereIn("id", ids.([]interface{})).Delete()
if err != nil {
results.Failed(c, "删除失败", err)
} else {
results.Success(c, "删除成功!", res2, nil)
}
}
}
// 判断某个数据表是否存在指定字段
// tablename=表名 field=字段
func IsHaseField(tablename, fields string) bool {
dbname := global.App.Config.DBconf.Name
dielddata, _ := model.DB().Query("select COLUMN_NAME from information_schema.columns where TABLE_SCHEMA='" + dbname + "' AND TABLE_NAME='" + tablename + "'")
var tablefields []interface{}
for _, val := range dielddata {
var valjson map[string]interface{}
mdata, _ := json.Marshal(val)
json.Unmarshal(mdata, &valjson)
tablefields = append(tablefields, valjson["COLUMN_NAME"].(string))
}
return utils.IsContain(tablefields, fields)
}
企业版资源
在开源版的基础上对基础框架重新升级,精简优化,让框架更适合企业多人协同开发,框架代码设计更简洁、基础能更全、企业版配技术支持可帮助开发者快速上手。我们的框架目标就是为开发者及企业减少开发成本,即使企业员工变更频繁,使用框架开发项目也可以让新来程序员快速接手项目,这是我们框架为科技公司提供统一的开发规范,完整的开发文档和开发视频(计划开课),这样科技公司就可以全心全意为客户服务,技术升级,新技术探索有我们社区团队为科技企业做,我们消化新技术后转换给企业,企业能以成本低提供质量最优的软件项目产出,我们也专心研究最优技术,两者可以合作共赢,在这降本增效时代可以更好发展。
1.Go快速开发框架企业版下载地址
2.Go快速开发框架企业版开发文档地址
3.admin管理后台在线预览
4.business业务后台在线预览
企业版后台页面
企业版功能、界面设计更加强大,经历了50+次更新升级。目前企业版已经为100+家企业用于项目开发,经客户反馈是可以帮助其企业节省开发成本,增加收入,比同行更有竞争力。使用企业科前往了解:企业版代码下载地址
感谢支持!一起开发,一起快乐!