Git Product home page Git Product logo

gfast's Introduction

GFast-V3

GFast V3.2

goframe vue element plus typescript vite license

平台简介

  • 基于全新Go Frame 2.3+Vue3+Element Plus开发的全栈前后端分离的管理系统
  • 前端采用vue-next-admin 、Vue、Element UI。
  • 本项目由奇讯科技团队开发。
  • 如您想购买云服务器请先领取阿里云优惠券:点我进入,腾讯云优惠券:点我领取
  • 目前我们基于gfast开发了:吸vo( ̄▽ ̄)d毒人员风控平台、政府数据化招商平台、档案资源普查信息系统、扶贫资产管理系统、厂房消防安全风控平台、重点项目督办平台等。

特征

  • 高生产率:几分钟即可搭建一个后台管理系统
  • 模块化:单应用多系统的模式,将一个完整的应用拆分为多个系统,后续扩展更加便捷,增加代码复用性。
  • 插件化: 可通过插件的方式扩展系统功能
  • 认证机制:采用gtoken的用户状态认证及casbin的权限认证
  • 路由模式:得利于goframe2.0提供了规范化的路由注册方式,无需注解自动生成api文档
  • 面向接口开发

内置功能

  1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。
  2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。
  3. 岗位管理:配置系统用户所属担任职务。
  4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。
  5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。
  6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。
  7. 参数管理:对系统动态配置常用参数。
  8. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
  9. 登录日志:系统登录日志记录查询包含登录异常。
  10. 在线用户:当前系统中活跃用户状态监控。
  11. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。
  12. 代码生成:前后端代码的生成。
  13. 服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。
  14. 在线构建器:拖动表单元素生成相应的HTML代码。
  15. 文件上传,缓存标签等。

项目使用模块化与插件化的方式开发,目前正在升级的插件有:cms系统、万能模型、微信管理、工单系统、问答系统、工作流引擎...,同时也欢迎大家把写好的插件上传到商城,我们来帮您实现技术变现,获取收益!

GFast开源以来得到了大家的很多支持,如果您愿意为GFast贡献代码或提供建议,请加微信:qixun007(备注:gfast)

演示地址

http://v3.g-fast.cn/sys 账号:demo 密码:123456

配置

项目数据库文件 resource/data/db.sql 创建数据库导入后修改配置 manifest/config/config.yaml.bak 复制改为manifest/config/config.yaml

其中gfToken配置

gfToken:
  cacheKey: "gfToken_"   #缓存前缀
  timeOut: 10800         #token超时时间(秒)
  maxRefresh: 5400       #token自动刷新时间(秒)
  multiLogin: true       #是否允许一个账号多人同时登录
  encryptKey: "49c54195e750b04e74a8429b17896586"    #加密key (32位)
  cacheModel: "redis"    #存储引擎 (memory使用内存|redis使用redis)
  excludePaths:          #排除不做登录验证的路由地址
    - "/api/v1/system/login"

项目为前后端分离,前端地址:

github地址:https://github.com/tiger1103/gfast-ui

gitee地址:https://gitee.com/tiger1103/gfast-ui

文档地址

http://doc.g-fast.cn/docs/gfast32

相关视频

https://space.bilibili.com/254192571/channel/seriesdetail?sid=223204

演示图

感谢(排名不分先后)

gf框架 https://github.com/gogf/gf

vue-next-admin https://gitee.com/lyt-top/vue-next-admin

swaggo https://github.com/swaggo/swag

gtoken https://github.com/goflyfox/gtoken

casbin https://github.com/casbin/casbin

PHP开源工作流引擎tpflow https://gitee.com/ntdgg/tpflow

CCflow 国内最优秀的开源流程引擎 https://gitee.com/opencc/ccflow

交流QQ群

感谢你使用GFast,公司团队精力时间有限,因此我们不再提供免费的技术服务,目前Gfast QQ交流群有部分用户进行了捐赠,捐赠后请联系作者进vip用户群,vip群中问题将得到优先解答,同时也会根据您的需求进行分析和优先安排,vip群也会提供Gfast的其它福利。 同时您也可以联系我们,雇佣我们团队为您干活,谢谢合作! 快来加入群聊【Gfast框架交流群】(1群:865697297-已满,2群:444129379),发现精彩内容,记得备注加群来意。

免责声明:

1、Gfast仅限自己学习使用,一切商业行为与Gfast无关。

2、用户不得利用Gfast从事非法行为,用户应当合法合规的使用,发现用户在使用产品时有任何的非法行为,Gfast有权配合有关机关进行调查或向政府部门举报,Gfast不承担用户因非法行为造成的任何法律责任,一切法律责任由用户自行承担,如因用户使用造成第三方损害的,用户应当依法予以赔偿。

3、所有与使用Gfast相关的资源直接风险均由用户承担。

商用说明

商用注意事项 如果您将此项目用于商业用途,请遵守Apache2.0协议并保留作者技术支持声明。

  • GFast快速开发平台采用Apache-2.0技术协议
  • 二次开发如用于商业性质或开源竞品请不要删除和修改GFast源码头部的版权与作者声明及出处
  • 允许进行商用,但是不允许二次开源出来并进行收费
  • 我们已经申请了相关的软件著作权和相关登记(证书号:软著登字第7511736号)
  • 如果您在自己的项目中使用了我们项目中的扩展或模块,请在项目介绍中进行明确说明

开源版包含基础框架功能,如您需要更多功能,请使用授权版。

版本区别

权益对比 开源版 授权版
商用权限 仅供学习交流 企业外包、二次开发使用/商用
社区 QQ交流群 微信授权用户群
服务 QQ群答疑 微信团队答疑
后台基础管理框架 提供 提供
权限管理功能 基础版(基础rbac 权限管控) 增强版(角色上下级权限,数据权限,角色有效期权限)
代码生成 提供(支持字典选项,树形结构选项,表关联,上传功能,富文本,导入导出excel等功能生成)
消息队列 提供
websocket 提供(广播通知,私信通知)
技术咨询 提供
部署指导 提供
Bug修复 不定期 快速修复并提交
更新 不定期 及时更新

更新日志

V3.2.25

date:2024-05-07
  • 1、升级项目依赖包,更新存在安全风险的外部依赖包
  • 2、修复数据权限为全部权限时model返回错误的bug
  • 3、修复webscoket空指针异常,兼容gf2.7.0

V3.2.24

date:2024-04-30

  • 1、完善数据权限,简化数据权限接入

V3.2.23

date:2024-04-12

  • 1、修复用户选择器回显问题
  • 2、修复图片上传组件只上传一张图片时回显问题
  • 3、完善角色授权模式
  • 3.1、角色有效期和有效时间段设置,若设置了有效日期,只能在该时区内有权限访问
  • 3.2、数据权限功能完善,可针对不同菜单设置不同的数据权限,数据权限划分更细化

更多更新说明请查看更新日志

支持开源

如果您喜爱gfast,请给常熬夜的作者来杯咖啡吧! 点我送咖啡

avatar

gfast's People

Contributors

dependabot[bot] avatar feranwq avatar rock-rabbit avatar testwill avatar tiger1103 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gfast's Issues

gtoken同时使用的问题

我同时在一个电脑上跑两个gfast项目,配置不同的gtoken的信息,但是两个项目不能同时登录,不然会相互影响,提示用户信息验证失败,我用的gotken模式1,没用redis,难道是哪里还需要配置嘛?

app\commom\service\casbin.go的中加载策略重复

原函数:

func (a *adapterCasbin) initPolicy(ctx context.Context) {
	// Because the DB is empty at first,
	// so we need to load the policy from the file adapter (.CSV) first.
	e, err := casbin.NewSyncedEnforcer(g.Cfg().MustGet(ctx, "casbin.modelFile").String(), a)

	if err != nil {
		a.EnforcerErr = err
		return
	}

	// This is a trick to save the current policy to the DB.
	// We can't call e.SavePolicy() because the adapter in the enforcer is still the file adapter.
	// The current policy means the policy in the Casbin enforcer (aka in memory).
	//err = a.SavePolicy(e.GetModel())
	//if err != nil {
	//	return err
	//}
	//set adapter
	//e.SetAdapter(a)
	// Clear the current policy.
	e.ClearPolicy()
	a.Enforcer = e
	// Load the policy from DB.
	err = a.LoadPolicy(e.GetModel())
	if err != nil {
		a.EnforcerErr = err
		return
	}
}

这行代码:e, err := casbin.NewSyncedEnforcer(g.Cfg().MustGet(ctx, "casbin.modelFile").String(), a) (源码调用见casbin\casbin\[email protected]\enforcer.go第178行)

它内部会 *adapterCasbin 的 LoadPolicy方法。
而下面的代码又手动再调用了一次:err = a.LoadPolicy(e.GetModel())
这样它就在数据库里查了两次

cache set error

能不能把使用 说的详细一点,我登录报错这个,没找到问题在哪,能写一个使用手册更好了

新能功能建议: 文件上传可增加七牛或oss

我在 app/service/admin/upload_service/upload.go 中新增了oss上传代码,可作为参考

后台参数管理新增:
名称:文件上传驱动
键名:sys.uploadFile.driver
键值:oss | local

配置config.toml代码:

#OSS文件存储
[oss]
    accessID = ""
    accessSecret = ""
    bucketName = ""
    endpoint = "oss-cn-hangzhou.aliyuncs.com"
    resUrl = "http://www.xxxx.cn/"

upload.go

package upload_service

import (
	"fmt"
	"gfast/app/model/admin/sys_config"
	"gfast/app/service/admin/params_service"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"github.com/gogf/gf/errors/gerror"
	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/net/ghttp"
	"github.com/gogf/gf/os/gfile"
	"github.com/gogf/gf/os/gtime"
	"github.com/gogf/gf/text/gregex"
	"github.com/gogf/gf/text/gstr"
	"github.com/gogf/gf/util/gconv"
	"github.com/gogf/gf/util/grand"
	"strconv"
	"strings"
)

const (
	upPath      = "/pub_upload/"
	driverOSS   = "oss"
	driverLocal = "local"
)

var uploadPath string

//上传得文件信息
type FileInfo struct {
	FileName string `json:"fileName"`
	FileSize int64  `json:"fileSize"`
	FileUrl  string `json:"fileUrl"`
	FileType string `json:"fileType"`
}

func init() {
	uploadPath = g.Cfg().GetString("server.ServerRoot") + upPath
}

//上传图片
func UpImg(file *ghttp.UploadFile) (fileInfo *FileInfo, err error) {
	return upByType(file, "img")
}

//上传文件
func UpFile(file *ghttp.UploadFile) (fileInfo *FileInfo, err error) {
	return upByType(file, "file")
}

//批量上传图片
func UpImgs(files []*ghttp.UploadFile) (fileInfos []*FileInfo, err error) {
	return UpBathByType(files, "img")
}

//批量上传文件
func UpFiles(files []*ghttp.UploadFile) (fileInfos []*FileInfo, err error) {
	return UpBathByType(files, "file")
}

//文件上传 img|file
func upByType(file *ghttp.UploadFile, fType string) (fileInfo *FileInfo, err error) {
	if file == nil {
		err = gerror.New("未上传任何文件")
		return
	}
	var (
		typeKey string
		sizeKey string
	)
	if fType == "img" {
		typeKey = "sys.uploadFile.imageType"
		sizeKey = "sys.uploadFile.imageSize"
	} else if fType == "file" {
		typeKey = "sys.uploadFile.fileType"
		sizeKey = "sys.uploadFile.fileSize"
	}
	//获取上传类型配置
	config, err := getUpConfig(typeKey)
	if err != nil {
		return
	}

	//检测文件类型
	rightType := checkFileType(file.Filename, config.ConfigValue)
	if !rightType {
		err = gerror.New("上传文件类型错误,只能包含后缀为:" + config.ConfigValue + "的文件。")
		return
	}
	//获取上传大小配置
	config, err = getUpConfig(sizeKey)
	if err != nil {
		return
	}
	rightSize, err := checkSize(config.ConfigValue, file.Size)
	if err != nil {
		return
	}
	if !rightSize {
		err = gerror.New("上传文件超过最大尺寸:" + config.ConfigValue)
		return
	}

	//获取文件上传驱动
	config, err = getUpConfig("sys.uploadFile.driver")
	if err != nil {
		return
	}

	fileUrl := ""
	fileName := ""

	switch {
	case config.ConfigValue == driverOSS:
		fileName, err = uploadToOss(file)
		if err != nil {
			return
		}
		fileUrl = getOssUrl(fileName)
	case config.ConfigValue == driverLocal:
		path := getUpPath()
		fileName, err = file.Save(path, true)
		if err != nil {
			return
		}
		fileUrl = getUrl(path, fileName)

	default:
		err = gerror.New("未配置上传驱动,请在后台参数管理中新增配置Key=sys.uploadFile.driver")
		return
	}

	fileInfo = &FileInfo{
		FileName: file.Filename,
		FileSize: file.Size,
		FileUrl:  fileUrl,
		FileType: file.Header.Get("Content-type"),
	}
	return
}

//批量上传 img|file
func UpBathByType(files []*ghttp.UploadFile, fType string) (fileInfos []*FileInfo, err error) {
	if len(files) == 0 {
		err = gerror.New("未上传任何文件")
		return
	}
	var (
		typeKey string
		sizeKey string
	)
	if fType == "img" {
		typeKey = "sys.uploadFile.imageType"
		sizeKey = "sys.uploadFile.imageSize"
	} else if fType == "file" {
		typeKey = "sys.uploadFile.fileType"
		sizeKey = "sys.uploadFile.fileSize"
	}
	//获取上传类型配置
	configType, err := getUpConfig(typeKey)
	if err != nil {
		return
	}
	//获取上传大小配置
	configSize, err := getUpConfig(sizeKey)
	if err != nil {
		return
	}
	for _, file := range files {
		//检测文件类型
		rightType := checkFileType(file.Filename, configType.ConfigValue)
		if !rightType {
			err = gerror.New("上传文件类型错误,只能包含后缀为:" + configType.ConfigValue + "的文件。")
			return
		}
		var rightSize bool
		rightSize, err = checkSize(configSize.ConfigValue, file.Size)
		if err != nil {
			return
		}
		if !rightSize {
			err = gerror.New("上传文件超过最大尺寸:" + configSize.ConfigValue)
			return
		}
	}
	path := getUpPath()
	for _, file := range files {
		var fileName string
		fileName, err = file.Save(path, true)
		if err != nil {
			return
		}
		fileInfo := &FileInfo{
			FileName: file.Filename,
			FileSize: file.Size,
			FileUrl:  getUrl(path, fileName),
			FileType: file.Header.Get("Content-type"),
		}
		fileInfos = append(fileInfos, fileInfo)
	}
	return
}

//检查文件大小是否合法
func checkSize(configSize string, fileSize int64) (bool, error) {
	match, err := gregex.MatchString(`^([0-9]+)(?i:([a-z]*))$`, configSize)
	if err != nil {
		return false, err
	}
	if len(match) == 0 {
		err = gerror.New("上传文件大小未设置,请在后台配置,格式为(30M,30k,30MB)")
		return false, err
	}
	var cfSize int64
	switch gstr.ToUpper(match[2]) {
	case "MB", "M":
		cfSize = gconv.Int64(match[1]) * 1024 * 1024
	case "KB", "K":
		cfSize = gconv.Int64(match[1]) * 1024
	case "":
		cfSize = gconv.Int64(match[1])
	}
	if cfSize == 0 {
		err = gerror.New("上传文件大小未设置,请在后台配置,格式为(30M,30k,30MB),最大单位为MB")
		return false, err
	}
	return cfSize >= fileSize, nil
}

//获取上传配置
func getUpConfig(key string) (config *sys_config.Entity, err error) {
	config, err = params_service.GetConfigByKey(key)
	if err != nil {
		return
	}
	if config == nil {
		err = gerror.New("上传文件类型未设置,请在后台配置")
		return
	}
	return
}

//判断上传文件类型是否合法
func checkFileType(fileName, typeString string) bool {
	suffix := gstr.SubStrRune(fileName, gstr.PosRRune(fileName, ".")+1, gstr.LenRune(fileName)-1)
	imageType := gstr.Split(typeString, ",")
	rightType := false
	for _, v := range imageType {
		if gstr.Equal(suffix, v) {
			rightType = true
			break
		}
	}
	return rightType
}

func getUpPath() (upPath string) {
	upPath = uploadPath + gtime.Date() + "/"
	return
}

func getUrl(path, fileName string) string {

	url := gstr.SubStr(path, gstr.Pos(path, upPath)+1) + fileName
	return url
}

//--------------------------------OSS Upload-----------------------------------
const objPrefix = "admin/%s"

func getOssUrl(fileName string) string {
	resUrl := g.Cfg().GetString("oss.resUrl")
	objKey := fmt.Sprintf(objPrefix, fileName)
	return resUrl + objKey
}

func uploadToOss(file *ghttp.UploadFile) (string, error) {

	f, err := file.Open()
	if err != nil {
		g.Log().Error(err)
		return "", err
	}

	accessID := g.Cfg().GetString("oss.accessID")
	accessSecret := g.Cfg().GetString("oss.accessSecret")
	endpoint := g.Cfg().GetString("oss.endpoint")
	bucketName := g.Cfg().GetString("oss.bucketName")

	client, err := oss.New(endpoint, accessID, accessSecret)
	if err != nil {
		g.Log().Error(err)
		return "", err
	}

	//获取存储空间
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		g.Log().Error(err)
		return "", err
	}

	//生成随机文件名
	name := gfile.Basename(file.Filename)
	name = strings.ToLower(strconv.FormatInt(gtime.TimestampNano(), 36) + grand.S(10))
	name = name + gfile.Ext(file.Filename)

	objKey := fmt.Sprintf(objPrefix, name)

	//上传Byte数组
	if err := bucket.PutObject(objKey, f); err != nil {
		g.Log().Error(err)
		return "", err
	}

	if err := bucket.SetObjectACL(objKey, oss.ACLPublicRead); err != nil {
		g.Log().Error(err)
	}

	return name, nil
}

Add a security policy

Hello 👋

I run a security community that finds and fixes vulnerabilities in OSS. A researcher (@cokeBeer) has found a potential issue, which I would be eager to share with you.

Could you add a SECURITY.md file with an e-mail address for me to send further details to? GitHub recommends a security policy to ensure issues are responsibly disclosed, and it would help direct researchers in the future.

Looking forward to hearing from you 👍

(cc @huntr-helper)

代码生成器

你写的这个框架很完善很强大,要是在做一个代码生成器就更完美了。

开发命名规范

1、目录命名冗余 例如:
比如,service目录下,一些目录命名还带service

2、变量命名驼峰和下划线混用,建议变量命名用驼峰法

旧 gf 基础库引起的 绑定0.0.0.0:8080 错误

2.0.6存在无法将http修改为0.0.0.0:8080 的问题 会导致 too many colons in address 比较影响使用
建议开发者将库版本升级到 2.1.0 及以上
更换到 2.1.0 之后需要吧 _ "github.com/gogf/gf/contrib/drivers/mysql/v2" 加入到main

api路由的疑问

在os-v3里登出的路由是 api/v1/system/loginOut ,为什么使用loginOut 这个词语,是有意写成这样的吗?

ForceLogout

如果是用个gcache, ForceLogout 函数没有删除缓存

使用生成器生成的路由设置中间件token无效

使用生成器生成的路由即使设置了中间件后台权限验证依然可以无需登录直接获得内容

//扩展业务
	group.Group("/module", func(group *ghttp.RouterGroup) {
		group.Middleware(middleWare.Auth) //后台权限验证
		//后台操作日志记录
		group.Hook("/*", ghttp.HOOK_AFTER_OUTPUT, hook.OperationLog)

		group.ALL("/accounts", new(module.Fb_accounts))
	})

经测试直接通过

GET http://localhost:8200/module/accounts/list
Accept: application/json

可以获得内容,而不会提示“用户信息验证失败”。

代码生成 报 404

http://demo.g-fast.cn/tool/gen/batchGenCode?tables=user 404

看前端有

/** 生成代码操作 */
    handleGenTable(row) {
      const tableNames = row.tableName || this.tableNames;
      if (tableNames == "") {
        this.msgError("请选择要生成的数据");
        return;
      }
      downLoadZip("/tool/gen/batchGenCode?tables=" + tableNames, "ruoyi");
    },

后端代码并没有看到对应的接口

//代码生成
		group.Group("/tools", func(group *ghttp.RouterGroup) {
			group.ALL("/gen", new(admin.Gen))
		})

感谢开源

请问下下载文件怎么做

我用get请求,到服务端后需要下载文件,使用以下代码,浏览器并不会弹出下载,请问应该怎么做,谢谢

        file := "git-" + todayDate + ".xlsx"

	// 读取文件
	downFile := gfile.GetBytes(file)

	req.Response.Header().Set("Content-Type", "application/octet-stream")
	req.Response.Header().Set("Content-Disposition", "attachment; filename="+file)
	req.Response.Write(downFile)
        req.Exit()

iShot2021-12-23 17 10 05

iShot2021-12-23 17 11 00

导入数据库提示数据库数据库语句部分插入失败

数据库类型:utf8mb4 字符排序 utf8mb4_general_ci 插入编码:65001 UTF-8
插入提示:
SQL] Query gfast-v3 start
[ERR] 1292 - Incorrect datetime value: '0000-00-00 00:00:00' for column 'last_login_time' at row 1
[ERR]
INSERT INTO sys_login_log VALUES (643, 'zsa', '127.0.0.1', '内网IP', 'ApiPOST', '', 0, '账号密码错误', '2022-03-16 17:18:41', '系统后台');
INSERT INTO sys_login_log VALUES (644, 'zs', '127.0.0.1', '内网IP', 'ApiPOST', '', 0, '账号密码错误', '2022-03-16 17:18:48', '系统后台');
INSERT INTO sys_login_log VALUES (645, 'zs', '127.0.0.1', '内网IP', 'ApiPOST', '', 0, '账号密码错误', '2022-03-16 17:19:45', '系统后台');
INSERT INTO sys_login_log VALUES (646, 'demo55', '::1', '云南省 曲靖市', 'Chrome', 'Windows 10', 0, '账号密码错误', '2022-03-16 17:21:06', '系统后台');
INSERT INTO sys_login_log VALUES (647, 'demo4564646', '::1', '云南省 曲靖市', 'Chrome', 'Windows 10', 0, '账号密码错误', '2022-03-16 17:21:21', '系统后台');
INSERT INTO sys_login_log VALUES (648, 'demo', '::1', '云南省 曲靖市', 'Chrome', 'Windows 10', 1, '登录成功', '2022-03-16 17:21:56', '系统后台');
INSERT INTO sys_login_log VALUES (649, 'demo', '::1', '云南省 曲靖市', 'Chrome', 'Windows 10', 1, '登录成功', '2022-03-16 17:22:52', '系统后台');
INSERT INTO sys_login_log VALUES (650, 'demo2', '::1', '云南省 曲靖市', 'Chrome', 'Windows 10', 0, '账号密码错误', '2022-03-16 17:24:11', '系统后台');
INSERT INTO sys_login_log VALUES (651, 'demo', '::1', '云南省 曲靖市', 'Chrome', 'Windows 10', 1, '登录成功', '2022-03-16 17:24:37', '系统后台');
INSERT INTO sys_login_log VALUES (652, 'demo', '::1', '云南省 曲靖市', 'Chrome', 'Windows 10', 1, '登录成功', '2022-03-16 17:25:12', '系统后台');
INSERT INTO sys_login_log VALUES (653, 'demo', '::1', '云南省 曲靖市', 'Chrome', 'Windows 10', 1, '登录成功', '2022-03-16 17:25:22', '系统后台');
INSERT INTO sys_login_log VALUES (654, 'demo', '::1', '云南省 曲靖市', 'Chrome', 'Windows 10', 1, '登录成功', '2022-03-16 17:25:27', '系统后台');
INSERT INTO sys_login_log VALUES (655, 'zs', '127.0.0.1', '内网IP', 'ApiPOST', '', 0, '账号密码错误', '2022-03-16 17:25:56', '系统后台');
INSERT INTO sys_login_log VALUES (656, 'zs', '127.0.0.1', '内网IP', 'ApiPOST', '', 1, '登录成功', '2022-03-16 17:26:03', '系统后台');
INSERT INTO sys_login_log VALUES (657, 'zs', '::1', '云南省 曲靖市', 'Chrome', 'Windows 10', 1, '登录成功', '2022-03-16 17:26:08', '系统后台');
INSERT INTO sys_login_log VALUES (658, 'zs', '::1', '云南省 曲靖市', 'Chrome', 'Windows 10', 1, '登录成功', '2022-03-16 17:27:17', '系统后台');
INSERT INTO sys_login_log VALUES (659, 'zs', '::1', '云南省 曲靖市', 'Chrome', 'Windows 10', 1, '登录成功', '2022-03-16 17:27:52', '系统后台');
INSERT INTO sys_login_log VALUES (660, 'zs', '::1', '云南省 曲靖市', 'Chrome', 'Windows 10', 1, '登录成功', '2022-03-16 17:28:07', '系统后台');
INSERT INTO sys_login_log VALUES (661, 'zs', '::1', '云南省 曲靖市', 'Chrome', 'Windows 10', 1, '登录成功', '2022-03-16 17:28:10', '系统后台');
INSERT INTO sys_login_log VALUES (662, 'zs', '::1', '云南省 曲靖市', 'Chrome', 'Windows 10', 1, '登录成功', '2022-03-16 17:28:31', '系统后台');
INSERT INTO sys_login_log VALUES (663, 'zs', '::1', '云南省 曲靖市', 'Chrome', 'Windows 10', 1, '登录成功', '2022-03-16 17:29:00', '系统后台');
INSERT INTO sys_login_log VALUES (664, 'zs', '::1', '云南省 曲靖市', 'Chrome', 'Windows 10', 1, '登录成功', '2022-03-16 17:30:28', '系统后台');
INSERT INTO sys_login_log VALUES (665, 'zs', '127.0.0.1', '内网IP', 'ApiPOST', '', 1, '登录成功', '2022-03-16 17:30:46', '系统后台');
INSERT INTO sys_login_log VALUES (666, 'zs', '127.0.0.1', '内网IP', 'ApiPOST', '', 1, '登录成功', '2022-03-16 17:31:12', '系统后台');
INSERT INTO sys_login_log VALUES (667, 'zs', '127.0.0.1', '内网IP', 'ApiPOST', '', 1, '登录成功', '2022-03-16 17:31:13', '系统后台');
INSERT INTO sys_login_log VALUES (668, 'zs', '127.0.0.1', '内网IP', 'ApiPOST', '', 1, '登录成功', '2022-03-16 17:32:00', '系统后台');
INSERT INTO sys_login_log VALUES (669, 'zs', '127.0.0.1', '内网IP', 'ApiPOST', '', 1, '登录成功', '2022-03-16 17:37:39', '系统后台');
INSERT INTO sys_login_log VALUES (670, 'zs', '127.0.0.1', '内网IP', 'ApiPOST', '', 1, '登录成功', '2022-03-16 17:42:16', '系统后台');
INSERT INTO sys_login_log VALUES (671, 'zs', '127.0.0.1', '内网IP', 'ApiPOST', '', 1, '登录成功', '2022-03-16 17:44:00', '系统后台');
INSERT INTO sys_login_log VALUES (672, 'zsss', '::1', '云南省 曲靖市', 'Chrome', 'Windows 10', 0, '账号密码错误', '2022-03-16 17:45:23', '系统后台');
INSERT INTO sys_login_log VALUES (673, 'zsss', '::1', '云南省 曲靖市', 'Chrome', 'Windows 10', 0, '账号密码错误', '2022-03-16 17:45:2
[SQL] Finished with error

full English Version of gfast?

We are new to setting up of gfast, but I had set up gfast in the local by following all the steps, able to login, loaded data in MySQL tables, I'm able to see the Menu, pages and content are all in Mandarin language, I'm not able to convert to English and see, Is there any other way I can see the whole gfast application in English? Any other mandarin key fonts I need to install?

v3版本go 1.18下安装报错

☁ gfast [os-v3] ⚡ go mod tidy -v
go: downloading github.com/gogf/gf/v2 v2.1.0
go: finding module for package github.com/gogf/gf/v2/protocol/goai
github.com/tiger1103/gfast/v3/internal/cmd imports
github.com/gogf/gf/v2/protocol/goai: module github.com/gogf/gf/v2@latest found (v2.1.2, replaced by github.com/gogf/gf/[email protected]), but does not contain package github.com/gogf/gf/v2/protocol/goai

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.