用 Go 语言基于Gin、Vue3、Typescript、vite、Arco Design、MySQL、reids等框架精心打造的一款模块化、插件化、高度自动化、高性能的前后端分离架构敏捷开发框架,可快速搭建前后端分离后台管理系统。本着简化开发、提升开发效率的初衷,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式,同时为了敏捷快速开发,框架特地集成了代码生成器一键生成管理后台的前后端代码,快速开发或生成api接口代码和接口文档、测试api接口等编辑,完全自主研发了自定义GO后端服务模板和前端Vue自定义模板,可以根据已建好的表结构,可以快速的一键生成整个模块的所有代码和增删改查等等功能业务,几秒即可生成应用端(小程序,app)调用的api接口。真正实现了低代码开发方式,极大的节省了人力成本的同时提高了开发效率,缩短了研发周期,是一款真正意义上实现组件化、可插拔式的敏捷开发框架。保证同等项目时间,您用GoFly的框架后,后台和接口可以减少7成时间,是否真实您自己体验,我们自己人不能崔牛了!企业版更加实用省时代码生成几乎不需修改代码就可到达使用效果

开源版资源地址

框架官网地址:GoFly全栈开发者社区

框架源码下载地址:GoFly 后端快速开发框架源码

框架演示地址:GoFly快速开的应用演示

开源版界面

b7d1e637ecb740acbc2a2bbf36ea18bb.png

0e0d0bee4f974730b2af2d9252591a4d.png

 2770fb26813c40c5bd801cfb55c8ea8e.png

268eb392f80e4f35bf97db01eef37448.png 生成的管理后台效果

cad4c86058094a92acb83693a79c12b9.png

 c3ca63aa35e945ef98b1881f95b052e9.png72aebdec95bc4bc38952dee5a1c3aabd.png

通用接口代码

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, &parameter)
		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, &parameter)
		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+家企业用于项目开发,经客户反馈是可以帮助其企业节省开发成本,增加收入,比同行更有竞争力。使用企业科前往了解:企业版代码下载地址

暗黑主题

按钮角色权限

插件
代码插件-一键打包

上传打包后代码包-方便后期使用


简单便捷的定时任务管理-不依赖系统

感谢支持!一起开发,一起快乐!

Logo

前往低代码交流专区

更多推荐