This commit is contained in:
2023-09-11 14:45:35 +08:00
14 changed files with 508 additions and 66 deletions

43
lib/core/file/csv.go Normal file
View File

@@ -0,0 +1,43 @@
package file
import (
"encoding/csv"
"os"
"path/filepath"
"ems.agt/lib/log"
)
// 写入CSV文件需要转换数据
// 例如:
// data := [][]string{}
// data = append(data, []string{"姓名", "年龄", "城市"})
// data = append(data, []string{"1", "2", "3"})
// err := file.WriterCSVFile(data, filePath)
func WriterCSVFile(data [][]string, filePath string) error {
// 获取文件所在的目录路径
dirPath := filepath.Dir(filePath)
// 确保文件夹路径存在
err := os.MkdirAll(dirPath, os.ModePerm)
if err != nil {
log.Errorf("创建文件夹失败 CreateFile %v", err)
}
// 创建或打开文件
file, err := os.Create(filePath)
if err != nil {
return err
}
defer file.Close()
// 创建CSV编写器
writer := csv.NewWriter(file)
defer writer.Flush()
// 写入数据
for _, row := range data {
writer.Write(row)
}
return nil
}

View File

@@ -0,0 +1,88 @@
package mmlclient
import (
"bufio"
"fmt"
"io"
"net"
"time"
"ems.agt/lib/core/conf"
)
// 定义MMLClient结构体
type MMLClient struct {
awaitTime time.Duration // 等待时间
conn net.Conn
reader *bufio.Reader
size int // 包含字符
}
// 封装NewMMLClient函数用于创建MMLClient实例
// 网元UDM的IP地址 "198.51.100.1"
func NewMMLClient(ip string) (*MMLClient, error) {
// 创建TCP连接
portMML := conf.Get("mml.port").(int)
hostMML := fmt.Sprintf("%s:%d", ip, portMML)
conn, err := net.Dial("tcp", hostMML)
if err != nil {
return nil, err
}
// 进行登录
usernameMML := conf.Get("mml.user").(string)
passwordMML := conf.Get("mml.password").(string)
fmt.Fprintln(conn, usernameMML)
fmt.Fprintln(conn, passwordMML)
// 发送后等待
sleepTime := conf.Get("mml.sleep").(int)
awaitTime := time.Duration(sleepTime) * time.Millisecond
time.Sleep(awaitTime)
// 读取内容
buf := make([]byte, 1024*8)
n, err := conn.Read(buf)
if err != nil {
return nil, err
}
// 创建MMLClient实例
client := &MMLClient{
conn: conn,
reader: bufio.NewReader(conn),
awaitTime: awaitTime,
size: n,
}
return client, nil
}
// 封装Send函数用于向TCP连接发送数据
func (c *MMLClient) Send(msg string) error {
_, err := fmt.Fprintln(c.conn, msg)
if err != nil {
return err
}
time.Sleep(c.awaitTime)
return nil
}
// 封装Receive函数用于从TCP连接中接收数据
func (c *MMLClient) Receive() (string, error) {
buf := make([]byte, 1024*8)
n, err := c.reader.Read(buf)
if err != nil {
if err == io.EOF {
return "", fmt.Errorf("server closed the connection")
}
return "", err
}
return string(buf[0:n]), nil
}
// 封装Close函数用于关闭TCP连接
func (c *MMLClient) Close() error {
return c.conn.Close()
}

View File

@@ -0,0 +1,74 @@
package mmlclient
import (
"fmt"
"strings"
)
// 发送MML
// ip 网元IP地址
// msg 指令
func MMLSendMsgToString(ip, msg string) (string, error) {
// 创建MMLClient实例
client, err := NewMMLClient(ip)
if err != nil {
return "", fmt.Errorf("创建MMLClient实例失败%v", err)
}
defer client.Close()
// 发送数据
err = client.Send(msg)
if err != nil {
return "", fmt.Errorf("发送数据失败:%v", err)
}
// 接收数据
data, err := client.Receive()
if err != nil {
return "", fmt.Errorf("接收数据失败:%v", err)
}
return data, nil
}
// 发送MML
// ip 网元IP地址
// msg 指令
func MMLSendMsgToMap(ip, msg string) (map[string]string, error) {
// 发送获取数据
str, err := MMLSendMsgToString(ip, msg)
// 初始化一个map用于存储拆分后的键值对
m := make(map[string]string)
var items []string
// 按照分隔符"\r\n"进行拆分
if strings.Contains(str, "\r\n") {
items = strings.Split(str, "\r\n")
}
// 按照分隔符"\n"进行拆分
if strings.Contains(str, "\n") {
items = strings.Split(str, "\n")
}
// 遍历拆分后的结果
for _, item := range items {
var pair []string
// 按照分隔符"="进行拆分键值对
if strings.Contains(item, "=") {
pair = strings.Split(item, "=")
}
// 按照分隔符":"进行拆分键值对
if strings.Contains(item, ":") {
pair = strings.Split(item, ":")
}
if len(pair) == 2 {
// 将键值对存入map中
m[pair[0]] = pair[1]
}
}
return m, err
}

View File

@@ -5,6 +5,7 @@ import (
"fmt"
"io"
"net/http"
"net/url"
"ems.agt/lib/core/vo"
"github.com/gorilla/mux"
@@ -59,6 +60,13 @@ func JSON(w http.ResponseWriter, code int, data any) {
}
}
// 将文件导出到外部下载
func FileAttachment(w http.ResponseWriter, r *http.Request, filepath, filename string) {
w.Header().Set("Content-Disposition", `attachment; filename=`+url.QueryEscape(filename))
w.Header().Set("Content-Type", "application/octet-stream")
http.ServeFile(w, r, filepath)
}
/// ==== 登录用户信息, 通过中间件后预置入
// 定义自定义类型作为键

View File

@@ -48,10 +48,12 @@ func Cors(next http.Handler) http.Handler {
// 允许请求头
allowHeaders := []string{
"Accesstoken",
"Content-Type",
"operationtype",
}
w.Header().Set("Access-Control-Allow-Headers", strings.Join(allowHeaders, ","))
w.WriteHeader(500)
w.WriteHeader(204)
return
}

View File

@@ -883,15 +883,16 @@ func ResponseErrorWithJson(w http.ResponseWriter, code int, nameValue interface{
}
func SetCommonResponseHeader(w http.ResponseWriter) {
// 设置Vary头部
w.Header().Set("Vary", "Origin")
w.Header().Set("Keep-Alive", "timeout=5")
// To solve cross domain issue
w.Header().Set("Access-Control-Allow-Origin", "*")
// w.Header().Set("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS")
w.Header().Set("Access-Control-Allow-Methods", "*")
w.Header().Set("Access-Control-Allow-Headers", "*")
// w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
// w.Header().Set("Access-Control-Allow-Headers", "AccessToken")
w.Header().Set("Access-Control-Expose-Headers", "Access-Control-Allow-Headers, Token")
w.Header().Set("Access-Control-Allow-Credentials", "true")
// 响应最大时间值
w.Header().Set("Access-Control-Max-Age", "31536000")
}
func SetResponseHeader(w http.ResponseWriter) {