-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit b6455a1
Showing
14 changed files
with
901 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
* linguist-language=GO |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |
Oops, something went wrong.