Skip to content

Commit

Permalink
xx
Browse files Browse the repository at this point in the history
  • Loading branch information
fainc committed Mar 19, 2024
0 parents commit b6455a1
Show file tree
Hide file tree
Showing 14 changed files with 901 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* linguist-language=GO
25 changes: 25 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
.buildpath
.hgignore.swp
.project
.orig
.swp
.idea/
.settings/
.vscode/
vender/
log/
composer.lock
gitpush.sh
pkg/
bin/
cbuild
*/.DS_Store
main
main.go
gf-empty
.vscode
/app/
/config/
/router/
/logs/
/testing/
Empty file added README.MD
Empty file.
19 changes: 19 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
module github.com/fainc/gowork

require (
github.com/alibabacloud-go/darabonba-openapi v0.1.14
github.com/alibabacloud-go/dysmsapi-20170525/v2 v2.0.9
github.com/alibabacloud-go/tea v1.1.17
github.com/aliyun/aliyun-oss-go-sdk v2.2.0+incompatible
github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f // indirect
github.com/go-pay/gopay v1.5.74
github.com/gogf/gf v1.16.7
github.com/golang-jwt/jwt/v4 v4.2.0
github.com/satori/go.uuid v1.2.0 // indirect
github.com/shopspring/decimal v1.3.1
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
)

go 1.14
164 changes: 164 additions & 0 deletions go.sum

Large diffs are not rendered by default.

184 changes: 184 additions & 0 deletions library/aliyun/oss/oss.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
package oss

import (
"errors"
"os"

"github.com/aliyun/aliyun-oss-go-sdk/oss"
"github.com/gogf/gf/util/guid"
)

var Service = ossService{}

type ossService struct{}

type BaseParams struct {
Endpoint string
AccessKeyId string
AccessKeySecret string
UseCname bool // 是否绑定自定义域名
Bucket string
ObjectKey string // 目标地址
}
type UploadParams struct {
*BaseParams
ForbidOverWrite bool
ACL string // 文件权限
LocalFilePath string // (可选)本地文件地址
FileStream *os.File // (可选)文件流
}
type DownloadParams struct {
*BaseParams
LocalFilePath string // 本地文件地址
FileStream *os.File // (可选)文件流
}

type SignUrlParams struct {
*BaseParams
ACL string // (可选)上传时权限控制参数
Timeout int64
ContentType string
}

type ListObjectsParams struct {
*BaseParams
Page int64
MaxKeys int
Marker string
Prefix string
}

type DeleteObjectsParams struct {
*BaseParams
ObjectKeys []string
}

func (s *ossService) InitClient(Endpoint string, AccessKeyId string, AccessKeySecret string, UseCname bool) (client *oss.Client, err error) {
client, err = oss.New(Endpoint, AccessKeyId, AccessKeySecret, oss.UseCname(UseCname), oss.Timeout(30, 120))
return
}

func (s *ossService) InitBucket(Endpoint string, AccessKeyId string, AccessKeySecret string, UseCname bool, Bucket string) (bucket *oss.Bucket, err error) {
client, err := s.InitClient(Endpoint, AccessKeyId, AccessKeySecret, UseCname)
if err != nil {
return nil, errors.New("初始化OSS失败,请检查密钥或配置,错误信息:" + err.Error())
}
bucket, err = client.Bucket(Bucket)
if err != nil {
return bucket, errors.New("设置OSS存储空间失败,错误信息:" + err.Error())
}
return
}

// UploadLocalFile 上传本地文件
func (s *ossService) UploadLocalFile(params *UploadParams) (err error) {
bucket, err := s.InitBucket(params.Endpoint, params.AccessKeyId, params.AccessKeySecret, params.UseCname, params.Bucket)
if err != nil {
return err
}
err = bucket.PutObjectFromFile(params.ObjectKey, params.LocalFilePath, oss.ForbidOverWrite(params.ForbidOverWrite), oss.ObjectACL(oss.ACLType(params.ACL)))
if err != nil {
return errors.New("上传文件失败,错误信息:" + err.Error())
}
return nil
}

// UploadFileStream 上传文件流
func (s *ossService) UploadFileStream(params *UploadParams) (err error) {
bucket, err := s.InitBucket(params.Endpoint, params.AccessKeyId, params.AccessKeySecret, params.UseCname, params.Bucket)
if err != nil {
return err
}
err = bucket.PutObject(params.ObjectKey, params.FileStream, oss.ForbidOverWrite(params.ForbidOverWrite), oss.ObjectACL(oss.ACLType(params.ACL)))
if err != nil {
return errors.New("上传文件失败,错误信息:" + err.Error())
}
return nil
}

// GetObjectToFile 下载文件到本地
func (s *ossService) GetObjectToFile(params *DownloadParams) (err error) {
bucket, err := s.InitBucket(params.Endpoint, params.AccessKeyId, params.AccessKeySecret, params.UseCname, params.Bucket)
if err != nil {
return err
}
err = bucket.GetObjectToFile(params.ObjectKey, params.LocalFilePath)
if err != nil {
return errors.New("文件下载失败,错误信息:" + err.Error())
}
return nil
}

// CreateSignedPutUrl 创建临时上传签名URL
func (s *ossService) CreateSignedPutUrl(params *SignUrlParams) (signedURL string, err error) {
bucket, err := s.InitBucket(params.Endpoint, params.AccessKeyId, params.AccessKeySecret, params.UseCname, params.Bucket)
if err != nil {
return "", err
}
options := []oss.Option{
oss.ObjectACL(oss.ACLType(params.ACL)),
oss.ContentType(params.ContentType),
oss.ResponseContentType("json"),
}
signedURL, err = bucket.SignURL(params.ObjectKey, oss.HTTPPut, params.Timeout, options...)
if err != nil {
return "", errors.New("OSS签名授权失败,错误信息:" + err.Error())
}
return
}

// CreateSignedGetUrl 创建临时下载/访问签名URL
func (s *ossService) CreateSignedGetUrl(params *SignUrlParams) (signedURL string, err error) {
bucket, err := s.InitBucket(params.Endpoint, params.AccessKeyId, params.AccessKeySecret, params.UseCname, params.Bucket)
if err != nil {
return "", err
}
signedURL, err = bucket.SignURL(params.ObjectKey, oss.HTTPGet, params.Timeout)
if err != nil {
return "", errors.New("OSS签名授权失败,错误信息:" + err.Error())
}
return
}

// ListBucketObjects 分页列举OSS文件
func (s *ossService) ListBucketObjects(params *ListObjectsParams) (lsRes oss.ListObjectsResult, err error) {
bucket, err := s.InitBucket(params.Endpoint, params.AccessKeyId, params.AccessKeySecret, params.UseCname, params.Bucket)
if err != nil {
return
}
marker := oss.Marker(params.Marker)
lsRes, err = bucket.ListObjects(oss.MaxKeys(params.MaxKeys), marker, oss.Prefix(params.Prefix))
return
}

// DeleteObject 删除单个OSS存储文件
func (s *ossService) DeleteObject(params *BaseParams) (err error) {
bucket, err := s.InitBucket(params.Endpoint, params.AccessKeyId, params.AccessKeySecret, params.UseCname, params.Bucket)
if err != nil {
return err
}
err = bucket.DeleteObject(params.ObjectKey)
if err != nil {
return errors.New("删除OSS文件失败,错误信息:" + err.Error())
}
return
}

// DeleteObjects 删除多个OSS存储文件
func (s *ossService) DeleteObjects(params *DeleteObjectsParams) (err error) {
bucket, err := s.InitBucket(params.Endpoint, params.AccessKeyId, params.AccessKeySecret, params.UseCname, params.Bucket)
if err != nil {
return err
}
_, err = bucket.DeleteObjects(params.ObjectKeys, oss.DeleteObjectsQuiet(true))
if err != nil {
return errors.New("删除OSS文件失败,错误信息:" + err.Error())
}
return
}

// RandomObjectKey 随机唯一文件名
func (s *ossService) RandomObjectKey(prefix string, suffix string) string {
randomKey := guid.S()
return prefix + randomKey + "." + suffix
}
78 changes: 78 additions & 0 deletions library/aliyun/sms/sms.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package sms

import (
"errors"

openapi "github.com/alibabacloud-go/darabonba-openapi/client"
dysms "github.com/alibabacloud-go/dysmsapi-20170525/v2/client"
"github.com/alibabacloud-go/tea/tea"
)

var Service = smsService{}

type smsService struct{}

func (s *smsService) createClient(accessKeyId *string, accessKeySecret *string) (_result *dysms.Client, _err error) {
config := &openapi.Config{
AccessKeyId: accessKeyId,
AccessKeySecret: accessKeySecret,
}
config.Endpoint = tea.String("dysmsapi.aliyuncs.com")
_result, _err = dysms.NewClient(config)
return _result, _err
}

type SendSmsParams struct {
PhoneNumbers string `dc:"手机号码,多号码用,分隔"`
SignName string `dc:"签名"`
TemplateCode string `dc:"短信模板编码"`
AccessKeyId string `dc:"阿里云 AccessKeyId"`
AccessKeySecret string `dc:"阿里云 AccessKeySecret"`
TemplateParam string `dc:"(可选)短信模板变量参数,接受JSON字符串"`
}

// SendSms 接口是短信发送接口,支持在一次请求中向多个不同的手机号码发送同样内容的短信。
func (s *smsService) SendSms(params *SendSmsParams) (err error) {
client, dyErr := s.createClient(tea.String(params.AccessKeyId), tea.String(params.AccessKeySecret))
if dyErr != nil {
return errors.New("短信对接错误,阿里云短信账户初始化异常")
}
sendSmsRequest := &dysms.SendSmsRequest{
PhoneNumbers: tea.String(params.PhoneNumbers),
SignName: tea.String(params.SignName),
TemplateCode: tea.String(params.TemplateCode),
TemplateParam: tea.String(params.TemplateParam),
}
result, dyErr := client.SendSms(sendSmsRequest)
if dyErr != nil {
return errors.New("短信对接错误,请检查阿里云短信密钥是否可用、参数是否完整")
}
if tea.StringValue(result.Body.Code) != "OK" {
return errors.New("短信发送失败," + tea.StringValue(result.Body.Message))
}
return nil
}

// SendBatchSms 接口是短信批量发送接口,支持在一次请求中分别向多个不同的手机号码发送不同签名的短信。
// 手机号码等参数均为JSON格式,字段个数相同,一一对应,短信服务根据字段在JSON中的顺序判断发往指定手机号码的签名。
// 如果您需要往多个手机号码中发送同样签名的短信,请使用SendSms接口实现。
func (s *smsService) SendBatchSms(params *SendSmsParams) (err error) {
client, dyErr := s.createClient(tea.String(params.AccessKeyId), tea.String(params.AccessKeySecret))
if dyErr != nil {
return errors.New("短信对接错误,阿里云短信账户初始化异常")
}
sendSmsRequest := &dysms.SendBatchSmsRequest{
PhoneNumberJson: tea.String(params.PhoneNumbers),
SignNameJson: tea.String(params.SignName),
TemplateCode: tea.String(params.TemplateCode),
TemplateParamJson: tea.String(params.TemplateParam),
}
result, dyErr := client.SendBatchSms(sendSmsRequest)
if dyErr != nil {
return errors.New("短信对接错误,请检查阿里云短信密钥是否可用、参数是否完整")
}
if tea.StringValue(result.Body.Code) != "OK" {
return errors.New("短信发送失败," + tea.StringValue(result.Body.Message))
}
return nil
}
10 changes: 10 additions & 0 deletions library/cors/cors.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package cors

import "github.com/gogf/gf/net/ghttp"

func Standard(r *ghttp.Request) {
corsOptions := r.Response.DefaultCORSOptions()
corsOptions.AllowDomain = []string{"*"}
r.Response.CORS(corsOptions)
r.Middleware.Next()
}
52 changes: 52 additions & 0 deletions library/email/email.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package email

import (
"crypto/tls"
"errors"

"gopkg.in/gomail.v2"
)

type ConfigParams struct {
Host string
Port int
User string
Password string
InsecureSkipVerify bool
}

type SendEMailParams struct {
From string // 发送人完整邮箱账户
FromName string // 发送人账户别名(收件方显示的发件人名称,如不设置默认显示邮箱号开头英文)
To []string // 收件人邮箱号(支持多邮箱)
Subject string // 邮件主题
Body string // 邮件正文(html格式)
AttachPath string // (可选)附件本地文件地址
CcAddress []string // (可选)抄送 完整邮箱账户(支持多邮箱)
ConfigParams *ConfigParams // 基本配置
}

func SendEMail(params *SendEMailParams) (err error) {
if len(params.To) == 0 {
return errors.New("邮件收件人列表不得为空")
}
m := gomail.NewMessage()
m.SetHeader("From", m.FormatAddress(params.From, params.FromName))
m.SetHeader("To", params.To...)
if len(params.To) != 0 {
m.SetHeader("Cc", params.CcAddress...)
}
m.SetHeader("Subject", params.Subject)
m.SetBody("text/html", params.Body)
if params.AttachPath != "" {
m.Attach(params.AttachPath)
}
d := gomail.NewDialer(params.ConfigParams.Host, params.ConfigParams.Port, params.ConfigParams.User, params.ConfigParams.Password)
if params.ConfigParams.InsecureSkipVerify {
d.TLSConfig = &tls.Config{InsecureSkipVerify: true}
}
if err := d.DialAndSend(m); err != nil {
return err
}
return nil
}
Loading

0 comments on commit b6455a1

Please sign in to comment.