golang基于gin实现简单api服务

golang版本:1.15

go代码

主程序

/* -*- coding:utf-8 -*-
author: cyz
time: 2022/1/5 15:32
*/

package main

import (
	"crypto/md5"
	"encoding/hex"
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/go-redis/redis"
	"os/exec"
	"src/internal/pkg/login"
	"strings"
)


func runPythonFileInCMD(py_file_path string,args ...string) interface{} {
	//py_file_path = "E:/Program/GoProject/src/internal/pkg/login/sql_login.py"
	py_file_name := strings.Split(py_file_path,"/")[len(strings.Split(py_file_path,"/")) -1] //切分字符与list切片
	program_path := strings.Replace(py_file_path,py_file_name,"",-1) // 替换字符
	//attributes := "" //默认参数
	//if len(args) > 0 {
	//	attributes = `"` + strings.Join(args[:], `" "`) + `"`
	//}
	//command := fmt.Sprintf(`%s  %s `,py_file_name, attributes) //字符format方法
	command := append([]string{py_file_name}, args...)
	cmd := exec.Command("python",command...) // cmd命令使用方法
	cmd.Dir = program_path                     // cmd命令执行根目设置
	out, err := cmd.Output()                  // cmd命令执行
	if err != nil {                           // 返回结果判读
		fmt.Println("Error: ", err)
	}
	result := string(out)
	fmt.Println(result)
	var dat interface{}
	err = json.Unmarshal([]byte(result), &dat)
	if err == redis.Nil || err != nil {
		fmt.Println("转换成json错误: : ",err)
		return nil
	}
	return dat
}

//

func md5V(str string) string  {
	h := md5.New()
	h.Write([]byte(str))
	return hex.EncodeToString(h.Sum(nil))
}

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {

		db, err := login.Engine_3308()
		if err != nil {
			fmt.Println("数据库链接错误", err)
		}
		//defer db.Close() // 延时关闭
		stmtOut := db.QueryRow("SELECT VERSION()")
		db.Close()
		var doc string
		stmtOut.Scan(&doc)

		c.JSON(200, gin.H{
			"mysql VERSION": doc,
		})
	})

	r.GET("/addr", func(c *gin.Context) {
		addr := c.DefaultQuery("addr","")
		GCJ02 :=runPythonFileInCMD("E:/Program/projects_etl/api封装层容器/src/空间类/地址经纬度返回.py", addr)
		//GCJ02 :=runPythonFileInCMD("E:/Program/GoProject/src/internal/pkg/login/sql_login.py", "",addr)

		c.JSON(200, gin.H{
			"addr": addr,
			"GCJ02":GCJ02,
		})
	})


	//r.GET("/addr", func(c *gin.Context) {
	//	addr := c.Query("addr")
	//	addr_md5 := md5V(addr)
	//
	//	c.JSON(200, gin.H{
	//		"message": addr,
	//		"addr_md5":addr_md5,
	//	})
	//})

	r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
	// http://localhost:8080/addr?addr=深圳南山

}


login_mysql

package login

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql" //导入mysql包
)

// 通过首字母大小写来控制的(包括函数和变量),大写表示可以被其他包访问,小写则不可以。
func Engine_3308() (conn *sql.DB,err error)  {
	host := "1.1.1.1"
	user := "user"
	password := "password"
	db := "db_test"
	port := 3308
	charset := "utf8mb4"
	data_source_name := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True",
		user,password,host,port,db,charset)
	conn, err = sql.Open("mysql", data_source_name)
	if err != nil {
		fmt.Println("数据库链接错误", err)
		return nil, err
	}
	//fmt.Println(reflect.TypeOf(db).String()) // 查询变量类型
	return conn, err
}

redis_login

/* -*- coding:utf-8 -*-
author: cyz
time: 2022/1/13 9:54
*/

package login

import (
	"encoding/json"
	"fmt"
	"strings"
	"time"
	"github.com/go-redis/redis"
)

var (
	client = &redisCluterClient{}
)

//RedisClusterClient struct
type redisCluterClient struct {
	c *redis.ClusterClient
}

//GetClient get the redis client
func initialize(hostnames string) *redisCluterClient {
	addr := strings.Split(hostnames, ",")
	c := redis.NewClusterClient(&redis.ClusterOptions{
		Addrs: addr,
	})
	if err := c.Ping().Err(); err != nil {
		panic("Unable to connect to redis " + err.Error())
	}
	client.c = c
	return client
}

//GetKey get key
//func (client *redisCluterClient) getKey(key string, src interface{}) error {
//	val, err := client.c.Get(key).Result()
//	if err == redis.Nil || err != nil {
//		return err
//	}
//	err = json.Unmarshal([]byte(val), &src)
//	if err != nil {
//		return err
//	}
//	return nil
//}

//SetKey set key
//func (client *redisCluterClient) setKey(key string, value interface{}, expiration time.Duration) error {
//	cacheEntry, err := json.Marshal(value)
//	if err != nil {
//		return err
//	}
//	err = client.c.Set(key, cacheEntry, expiration).Err()
//	if err != nil {
//		return err
//	}
//	return nil
//}

type valueEx struct {
	Name  string
	Email string
}

//	a,_ :=json.Marshal("value")
//	typeOfA := reflect.TypeOf(a)
//	fmt.Println(typeOfA.Name(), typeOfA.Kind())
func ConnectRedis(hostnames string) *redisCluterClient{
	redisCluterClient := initialize(hostnames)
	return redisCluterClient
}

func (client *redisCluterClient) getKey(key string) (src interface{},err error){
	val, err := client.c.Get(key).Result()
	//fmt.Println(reflect.TypeOf(val).String())
	if err == redis.Nil || err != nil {
		fmt.Println("redis获取数据错误: ",err)
		return nil, err
	}
	err = json.Unmarshal([]byte(val), &src)
	if err == redis.Nil || err != nil {
		fmt.Println("转换成json错误: : ",err)
		return nil, err
	}
	return src, err
}

func (client *redisCluterClient) setKey(key string, value interface{}, expiration time.Duration) error {
	cacheEntry, err := json.Marshal(value)
	if err != nil {
		return err
	}
	err = client.c.Set(key, cacheEntry, expiration).Err()
	if err != nil {
		return err
	}
	return nil
}

//func main() {
//	//Use your actually ip address here
//	//redisCluterClient := initialize("1.1.1.1:0000,1.1.1.1:0001,1.1.1.1:0002,")
//	//redisCluterClient := initialize("1.1.1.1:0000")
//	//key1 := "manager-system:test-golang-login"
//	//value1 := &valueEx{Name: "someName", Email: "someemail@abc.com"}
//	//err := redisCluterClient.setKey(key1, value1, time.Minute*1)
//	//if err != nil {
//	//	log.Fatalf("Error: %v", err.Error())
//	//}
//	//value2 := &valueEx{}
//	//err = redisCluterClient.getKey(key1, value2)
//	//if err != nil {
//	//	log.Fatalf("Error: %v", err.Error())
//	//}
//	//log.Printf("Name: %s", value2.Name)
//	//log.Printf("Email: %s", value2.Email)
//
//	cr := ConnectRedis("1.1.1.1:0000")
//	key1 := "manager-system:test-golang-login"
//	value1 := &valueEx{Name: "someName", Email: "someemail@abc.com"}
//	err := cr.setKey(key1, value1, time.Minute*1)
//	if err != nil {
//		fmt.Println(err)
//	}
//	val, err :=cr.getKey(key1)
//	fmt.Println(val, err)
//
//}

使用goland生成到linux运行文件。

参考文章:https://blog.csdn.net/baidu_34122324/article/details/90183394?utm_term=golang%E9%A1%B9%E7%9B%AE%E9%83%A8%E7%BD%B2%E8%BF%90%E8%A1%8C&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduweb~default-0-90183394&spm=3001.4430
参考文章:https://blog.csdn.net/weixin_42223531/article/details/107253727
参考文章:https://bbs.huaweicloud.com/forum/thread-132461-1-1.html
在这里插入图片描述
GOARCH=amd64;GOOS=linux
在这里插入图片描述
然后运行,运行后会生成linux的文件。
在这里插入图片描述

基于golang gin微信点餐小程序的设计与实现需要考虑以下几个方面: 1. 架构设计:可以使用MVC(Model-View-Controller)架构,将代码按功能模块划分成不同的包,便于管理和维护。 2. 数据库设计:根据需求,设计适当的数据库结构,存储菜单信息、用户信息、订单信息等。可以使用关系型数据库如MySQL或非关系型数据库如MongoDB。 3. 用户认证与授权:使用微信小程序的登录功能进行用户认证,获取用户的OpenID等信息。为了保护用户数据安全,可以使用JWT(JSON Web Token)生成访问令牌,并设置权限控制,确保只有授权的用户能够访问相关接口。 4. 页面设计与交互:根据需求设计小程序的首页、菜单页、购物车、订单页等页面,合理安排页面布局和交互逻辑。可以使用小程序自带的模板或自定义组件进行页面开发。 5. 菜单管理:实现菜单的增删改查功能,包括菜品的图片、名称、价格、描述等信息。为了提高用户体验,可以增加搜索和排序等功能。 6. 购物车与订单管理:用户选择菜品后,将菜品添加到购物车,并生成相应的订单。可以实现购物车的增删改查功能,以及订单的支付、取消等功能。 7. 接口设计与实现:根据需求设计合适的API接口,包括菜单管理接口、用户认证接口、购物车接口、订单接口等。使用golanggin框架实现这些接口,并进行参数校验、错误处理等。 8. 部署与测试:将小程序部署到服务器上,并进行测试,确保功能正常运行。可以使用Postman等工具对API接口进行测试,模拟用户操作验证功能是否正确。 基于以上几个方面的设计与实现,可以打造一个基于golang gin的微信点餐小程序,实现用户点餐、下单和支付的功能,提供便捷的餐饮服务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值