Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
飞鱼0526
gin-vue-admin
提交
ac60596a
G
gin-vue-admin
项目概览
飞鱼0526
/
gin-vue-admin
与 Fork 源项目一致
Fork自
FLIPPED-AURORA / gin-vue-admin
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
gin-vue-admin
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
ac60596a
编写于
9月 01, 2021
作者:
Mr.奇淼(
提交者:
GitHub
9月 01, 2021
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'gva-vue3-2.4.5' into gva_gormv2_dev
上级
baafb593
2f8a3e35
变更
28
隐藏空白更改
内联
并排
Showing
28 changed file
with
299 addition
and
894 deletion
+299
-894
README.md
README.md
+1
-1
server/docs/docs.go
server/docs/docs.go
+52
-102
server/docs/swagger.json
server/docs/swagger.json
+52
-102
server/docs/swagger.yaml
server/docs/swagger.yaml
+33
-62
server/go.mod
server/go.mod
+1
-22
server/initialize/plugin.go
server/initialize/plugin.go
+4
-12
server/plugin/notify/README.MD
server/plugin/notify/README.MD
+0
-74
server/plugin/notify/api/api.go
server/plugin/notify/api/api.go
+0
-67
server/plugin/notify/api/enter.go
server/plugin/notify/api/enter.go
+0
-7
server/plugin/notify/config/dingding.go
server/plugin/notify/config/dingding.go
+0
-7
server/plugin/notify/global/global.go
server/plugin/notify/global/global.go
+0
-5
server/plugin/notify/main.go
server/plugin/notify/main.go
+0
-28
server/plugin/notify/model/response/notify.go
server/plugin/notify/model/response/notify.go
+0
-21
server/plugin/notify/router/enter.go
server/plugin/notify/router/enter.go
+0
-7
server/plugin/notify/router/router.go
server/plugin/notify/router/router.go
+0
-18
server/plugin/notify/service/enter.go
server/plugin/notify/service/enter.go
+0
-7
server/plugin/notify/service/notify.go
server/plugin/notify/service/notify.go
+0
-157
server/plugin/notify/utils/utils.go
server/plugin/notify/utils/utils.go
+0
-1
web/package-lock.json
web/package-lock.json
+80
-130
web/package.json
web/package.json
+1
-5
web/src/core/gin-vue-admin.js
web/src/core/gin-vue-admin.js
+2
-8
web/src/core/global.js
web/src/core/global.js
+11
-0
web/src/utils/request.js
web/src/utils/request.js
+28
-13
web/src/view/about/index.vue
web/src/view/about/index.vue
+18
-20
web/src/view/dashboard/index.vue
web/src/view/dashboard/index.vue
+7
-13
web/src/view/layout/aside/historyComponent/history.vue
web/src/view/layout/aside/historyComponent/history.vue
+7
-2
web/src/view/layout/index.vue
web/src/view/layout/index.vue
+1
-1
web/src/view/superAdmin/user/user.vue
web/src/view/superAdmin/user/user.vue
+1
-2
未找到文件。
README.md
浏览文件 @
ac60596a
...
...
@@ -16,7 +16,7 @@
[
github地址
](
https://github.com/flipped-aurora/gin-vue-admin
)
: https://github.com/flipped-aurora/gin-vue-admin
[
vue3版本分支地址
](
https://github.com/flipped-aurora/gin-vue-admin/tree/vue3Develop
)
: https://github.com/flipped-aurora/gin-vue-admin/tree/vue3Develop
[
插件仓库以及开发规范
](
https://github.com/flipped-aurora/gva-plugins
)
:https://github.com/flipped-aurora/gva-plugins
[
审批流分支
](
https://github.com/flipped-aurora/gin-vue-admin/tree/gva_workflow
)
: https://github.com/flipped-aurora/gin-vue-admin/tree/gva_workflow
...
...
server/docs/docs.go
浏览文件 @
ac60596a
...
...
@@ -24,108 +24,6 @@ var doc = `{
"host": "{{.Host}}",
"basePath": "{{.BasePath}}",
"paths": {
"/SimpleUploaderApi/checkFileMd5": {
"get": {
"security": [
{
"ApiKeyAuth": []
}
],
"produces": [
"application/json"
],
"tags": [
"SimpleUploader"
],
"summary": "断点续传插件版示例",
"parameters": [
{
"type": "string",
"description": "md5",
"name": "md5",
"in": "query",
"required": true
}
],
"responses": {
"200": {
"description": "{\"success\":true,\"data\":{},\"msg\":\"查询成功\"}",
"schema": {
"type": "string"
}
}
}
}
},
"/SimpleUploaderApi/mergeFileMd5": {
"get": {
"security": [
{
"ApiKeyAuth": []
}
],
"produces": [
"application/json"
],
"tags": [
"SimpleUploader"
],
"summary": "合并文件",
"parameters": [
{
"type": "string",
"description": "md5",
"name": "md5",
"in": "query",
"required": true
}
],
"responses": {
"200": {
"description": "{\"success\":true,\"data\":{},\"msg\":\"合并成功\"}",
"schema": {
"type": "string"
}
}
}
}
},
"/SimpleUploaderApi/upload": {
"post": {
"security": [
{
"ApiKeyAuth": []
}
],
"consumes": [
"multipart/form-data"
],
"produces": [
"application/json"
],
"tags": [
"SimpleUploader"
],
"summary": "断点续传插件版示例",
"parameters": [
{
"type": "file",
"description": "断点续传插件版示例",
"name": "file",
"in": "formData",
"required": true
}
],
"responses": {
"200": {
"description": "{\"success\":true,\"data\":{},\"msg\":\"切片创建成功\"}",
"schema": {
"type": "string"
}
}
}
}
},
"/api/createApi": {
"post": {
"security": [
...
...
@@ -1527,6 +1425,41 @@ var doc = `{
}
}
},
"/email/sendEmail": {
"post": {
"security": [
{
"ApiKeyAuth": []
}
],
"produces": [
"application/json"
],
"tags": [
"System"
],
"summary": "发送邮件",
"parameters": [
{
"description": "发送邮件必须的参数",
"name": "data",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/response.Email"
}
}
],
"responses": {
"200": {
"description": "{\"success\":true,\"data\":{},\"msg\":\"发送成功\"}",
"schema": {
"type": "string"
}
}
}
}
},
"/excel/downloadTemplate": {
"get": {
"security": [
...
...
@@ -4376,6 +4309,23 @@ var doc = `{
}
}
},
"response.Email": {
"type": "object",
"properties": {
"body": {
"description": "邮件内容",
"type": "string"
},
"subject": {
"description": "邮件标题",
"type": "string"
},
"to": {
"description": "邮件发送给谁",
"type": "string"
}
}
},
"response.SysAuthorityCopyResponse": {
"type": "object",
"properties": {
...
...
server/docs/swagger.json
浏览文件 @
ac60596a
...
...
@@ -8,108 +8,6 @@
},
"basePath"
:
"/"
,
"paths"
:
{
"/SimpleUploaderApi/checkFileMd5"
:
{
"get"
:
{
"security"
:
[
{
"ApiKeyAuth"
:
[]
}
],
"produces"
:
[
"application/json"
],
"tags"
:
[
"SimpleUploader"
],
"summary"
:
"断点续传插件版示例"
,
"parameters"
:
[
{
"type"
:
"string"
,
"description"
:
"md5"
,
"name"
:
"md5"
,
"in"
:
"query"
,
"required"
:
true
}
],
"responses"
:
{
"200"
:
{
"description"
:
"{
\"
success
\"
:true,
\"
data
\"
:{},
\"
msg
\"
:
\"
查询成功
\"
}"
,
"schema"
:
{
"type"
:
"string"
}
}
}
}
},
"/SimpleUploaderApi/mergeFileMd5"
:
{
"get"
:
{
"security"
:
[
{
"ApiKeyAuth"
:
[]
}
],
"produces"
:
[
"application/json"
],
"tags"
:
[
"SimpleUploader"
],
"summary"
:
"合并文件"
,
"parameters"
:
[
{
"type"
:
"string"
,
"description"
:
"md5"
,
"name"
:
"md5"
,
"in"
:
"query"
,
"required"
:
true
}
],
"responses"
:
{
"200"
:
{
"description"
:
"{
\"
success
\"
:true,
\"
data
\"
:{},
\"
msg
\"
:
\"
合并成功
\"
}"
,
"schema"
:
{
"type"
:
"string"
}
}
}
}
},
"/SimpleUploaderApi/upload"
:
{
"post"
:
{
"security"
:
[
{
"ApiKeyAuth"
:
[]
}
],
"consumes"
:
[
"multipart/form-data"
],
"produces"
:
[
"application/json"
],
"tags"
:
[
"SimpleUploader"
],
"summary"
:
"断点续传插件版示例"
,
"parameters"
:
[
{
"type"
:
"file"
,
"description"
:
"断点续传插件版示例"
,
"name"
:
"file"
,
"in"
:
"formData"
,
"required"
:
true
}
],
"responses"
:
{
"200"
:
{
"description"
:
"{
\"
success
\"
:true,
\"
data
\"
:{},
\"
msg
\"
:
\"
切片创建成功
\"
}"
,
"schema"
:
{
"type"
:
"string"
}
}
}
}
},
"/api/createApi"
:
{
"post"
:
{
"security"
:
[
...
...
@@ -1511,6 +1409,41 @@
}
}
},
"/email/sendEmail"
:
{
"post"
:
{
"security"
:
[
{
"ApiKeyAuth"
:
[]
}
],
"produces"
:
[
"application/json"
],
"tags"
:
[
"System"
],
"summary"
:
"发送邮件"
,
"parameters"
:
[
{
"description"
:
"发送邮件必须的参数"
,
"name"
:
"data"
,
"in"
:
"body"
,
"required"
:
true
,
"schema"
:
{
"$ref"
:
"#/definitions/response.Email"
}
}
],
"responses"
:
{
"200"
:
{
"description"
:
"{
\"
success
\"
:true,
\"
data
\"
:{},
\"
msg
\"
:
\"
发送成功
\"
}"
,
"schema"
:
{
"type"
:
"string"
}
}
}
}
},
"/excel/downloadTemplate"
:
{
"get"
:
{
"security"
:
[
...
...
@@ -4360,6 +4293,23 @@
}
}
},
"response.Email"
:
{
"type"
:
"object"
,
"properties"
:
{
"body"
:
{
"description"
:
"邮件内容"
,
"type"
:
"string"
},
"subject"
:
{
"description"
:
"邮件标题"
,
"type"
:
"string"
},
"to"
:
{
"description"
:
"邮件发送给谁"
,
"type"
:
"string"
}
}
},
"response.SysAuthorityCopyResponse"
:
{
"type"
:
"object"
,
"properties"
:
{
...
...
server/docs/swagger.yaml
浏览文件 @
ac60596a
...
...
@@ -567,6 +567,18 @@ definitions:
description
:
每页大小
type
:
integer
type
:
object
response.Email
:
properties
:
body
:
description
:
邮件内容
type
:
string
subject
:
description
:
邮件标题
type
:
string
to
:
description
:
邮件发送给谁
type
:
string
type
:
object
response.SysAuthorityCopyResponse
:
properties
:
authority
:
...
...
@@ -930,68 +942,6 @@ info:
title
:
Swagger Example API
version
:
0.0.1
paths
:
/SimpleUploaderApi/checkFileMd5
:
get
:
parameters
:
-
description
:
md5
in
:
query
name
:
md5
required
:
true
type
:
string
produces
:
-
application/json
responses
:
"
200"
:
description
:
'
{"success":true,"data":{},"msg":"查询成功"}'
schema
:
type
:
string
security
:
-
ApiKeyAuth
:
[]
summary
:
断点续传插件版示例
tags
:
-
SimpleUploader
/SimpleUploaderApi/mergeFileMd5
:
get
:
parameters
:
-
description
:
md5
in
:
query
name
:
md5
required
:
true
type
:
string
produces
:
-
application/json
responses
:
"
200"
:
description
:
'
{"success":true,"data":{},"msg":"合并成功"}'
schema
:
type
:
string
security
:
-
ApiKeyAuth
:
[]
summary
:
合并文件
tags
:
-
SimpleUploader
/SimpleUploaderApi/upload
:
post
:
consumes
:
-
multipart/form-data
parameters
:
-
description
:
断点续传插件版示例
in
:
formData
name
:
file
required
:
true
type
:
file
produces
:
-
application/json
responses
:
"
200"
:
description
:
'
{"success":true,"data":{},"msg":"切片创建成功"}'
schema
:
type
:
string
security
:
-
ApiKeyAuth
:
[]
summary
:
断点续传插件版示例
tags
:
-
SimpleUploader
/api/createApi
:
post
:
consumes
:
...
...
@@ -1844,6 +1794,27 @@ paths:
summary
:
发送测试邮件
tags
:
-
System
/email/sendEmail
:
post
:
parameters
:
-
description
:
发送邮件必须的参数
in
:
body
name
:
data
required
:
true
schema
:
$ref
:
'
#/definitions/response.Email'
produces
:
-
application/json
responses
:
"
200"
:
description
:
'
{"success":true,"data":{},"msg":"发送成功"}'
schema
:
type
:
string
security
:
-
ApiKeyAuth
:
[]
summary
:
发送邮件
tags
:
-
System
/excel/downloadTemplate
:
get
:
consumes
:
...
...
server/go.mod
浏览文件 @
ac60596a
...
...
@@ -5,52 +5,31 @@ go 1.16
require (
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
github.com/aliyun/aliyun-oss-go-sdk v2.1.6+incompatible
github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f // indirect
github.com/casbin/casbin/v2 v2.11.0
github.com/casbin/gorm-adapter/v3 v3.0.2
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 // indirect
github.com/flipped-aurora/ws v1.0.1
github.com/flipped-aurora/gva-plugins v0.0.0-20210828060501-fc8b729b9a4a
github.com/fsnotify/fsnotify v1.4.9
github.com/fvbock/endless v0.0.0-20170109170031-447134032cb6
github.com/gin-gonic/gin v1.6.3
github.com/go-openapi/jsonreference v0.19.6 // indirect
github.com/go-openapi/spec v0.20.3 // indirect
github.com/go-openapi/swag v0.19.15 // indirect
github.com/go-playground/validator/v10 v10.3.0 // indirect
github.com/go-redis/redis/v8 v8.11.0
github.com/go-sql-driver/mysql v1.5.0
github.com/gookit/color v1.3.1
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 // indirect
github.com/jordan-wright/email v0.0.0-20200824153738-3f5bafa1cd84
github.com/json-iterator/go v1.1.10 // indirect
github.com/lestrrat-go/file-rotatelogs v2.3.0+incompatible
github.com/lestrrat-go/strftime v1.0.3 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mitchellh/mapstructure v1.2.2 // indirect
github.com/mojocn/base64Captcha v1.3.1
github.com/pelletier/go-toml v1.6.0 // indirect
github.com/qiniu/api.v7/v7 v7.4.1
github.com/robfig/cron/v3 v3.0.1
github.com/satori/go.uuid v1.2.0
github.com/shirou/gopsutil v3.21.1+incompatible
github.com/songzhibin97/gkit v1.1.1
github.com/spf13/afero v1.2.2 // indirect
github.com/spf13/cast v1.3.1 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/spf13/viper v1.7.0
github.com/swaggo/gin-swagger v1.3.0
github.com/swaggo/swag v1.7.0
github.com/tebeka/strftime v0.1.3 // indirect
github.com/tencentyun/cos-go-sdk-v5 v0.7.19
github.com/unrolled/secure v1.0.7
github.com/xuri/excelize/v2 v2.4.1
go.uber.org/zap v1.16.0
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect
golang.org/x/tools v0.1.5 // indirect
gopkg.in/ini.v1 v1.55.0 // indirect
gorm.io/driver/mysql v1.0.1
gorm.io/gorm v1.20.7
nhooyr.io/websocket v1.8.6
...
...
server/initialize/plugin.go
浏览文件 @
ac60596a
...
...
@@ -2,11 +2,8 @@ package initialize
import
(
"github.com/flipped-aurora/gin-vue-admin/server/global"
"github.com/flipped-aurora/gin-vue-admin/server/plugin/ws"
"go.uber.org/zap"
"github.com/flipped-aurora/gin-vue-admin/server/plugin/notify"
//email "github.com/flipped-aurora/gva-plug-email" // 在线仓库模式
"github.com/flipped-aurora/gin-vue-admin/server/plugin/email"
// 本地插件仓库地址模式
email
"github.com/flipped-aurora/gva-plugins/email"
// 在线仓库模式go
//"github.com/flipped-aurora/gin-vue-admin/server/plugin/email" // 本地插件仓库地址模式
"github.com/flipped-aurora/gin-vue-admin/server/plugin/example_plugin"
"github.com/flipped-aurora/gin-vue-admin/server/utils/plugin"
"github.com/gin-gonic/gin"
...
...
@@ -21,8 +18,8 @@ func PluginInit(group *gin.RouterGroup, Plugin ...plugin.Plugin) {
func
InstallPlugin
(
PublicGroup
*
gin
.
RouterGroup
,
PrivateGroup
*
gin
.
RouterGroup
)
{
// 添加开放权限的插件 示例
PluginInit
(
PublicGroup
,
example_plugin
.
ExamplePlugin
,
ws
.
GenerateWs
(
zap
.
L
(),
100
,
ws
.
DefaultCheckMap
())
)
PluginInit
(
PublicGroup
,
example_plugin
.
ExamplePlugin
)
// 添加跟角色挂钩权限的插件 示例 本地示例模式于在线仓库模式注意上方的import 可以自行切换 效果相同
PluginInit
(
PrivateGroup
,
email
.
CreateEmailPlug
(
...
...
@@ -35,9 +32,4 @@ func InstallPlugin(PublicGroup *gin.RouterGroup, PrivateGroup *gin.RouterGroup)
global
.
GVA_CONFIG
.
Email
.
IsSSL
,
))
// 钉钉通知,暂时开放权限
PluginInit
(
PublicGroup
,
notify
.
CreateDDPlug
(
"https://oapi.dingtalk.com/robot/send"
,
"8ded23f91917dc4f6275f44ba5ef243e6ed1d2cc74de83f01a6f5f5f39905671"
,
"SECaecf452bd6e671ab0d47469c3ad933e32fcc47b335333049a1b8961606192f38"
))
}
server/plugin/notify/README.MD
已删除
100644 → 0
浏览文件 @
baafb593
## GVA 钉钉群通知插件
本插件用于向钉钉群推送消息
### 1. 使用场景
-
当服务运行异常时,可以向钉钉推送异常信息,便于及时发现解决问题
-
推送一些关键业务的运行日志等
### 2. 配置说明
钉钉 token 等相关信息的获取,请参考
[
钉钉官网
](
https://developers.dingtalk.com/document/robots/custom-robot-access?spm=ding_open_doc.document.0.0.7f8710afbfzduV#topic-2026027
)
在
`plugin/notify/global/global.go`
文件中配置钉钉通知的URL ,Token 等
```
go
// 在gin-vue-admin 主程序的initialize中的plugin的InstallPlugin 函数中写入如下代码
PluginInit
(
PublicGroup
,
notify
.
CreateDDPlug
(
URL
,
Token
,
密钥
))
}
```
### 3 参数说明
#### 3-1 全局参数说明
```
go
Url
string
`mapstructure:"url" json:"url" yaml:"url"`
// Url
Token
string
`mapstructure:"token" json:"token" yaml:"token"`
// access_token
Secret
string
`mapstructure:"secret" json:"secret" yaml:"secret"`
// 密钥
```
#### 3-2 请求入参说明
```
go
```
### 3方法API(可调用方法)
```
go
//content 发送的内容
//atMobiles 需要艾特的人的手机号
//isAtAll 是否艾特全体
SendTextMessage
(
content
string
,
atMobiles
[]
string
,
isAtAll
bool
)
//content 发送的内容
//title 内容标题
//picUrl 配图
//messageUrl 点击跳转路径
SendLinkMessage
(
content
,
title
,
picUrl
,
messageUrl
string
)
//content 发送的内容(markdown语法)
//title 内容标题
//atMobiles 需要艾特的人的手机号
//isAtAll 是否艾特全体
SendMarkdownMessage
(
content
,
title
string
,
atMobiles
[]
string
,
isAtAll
bool
)
```
### 4. 可直接调用接口
发送文字消息接口: /notify/sendTextMessage [post] 已配置swagger
发送图文链接消息接口: /notify/sendLinkMessage [post] 已配置swagger
发送markdown消息接口: /notify/sendMarkdownMessage [post] 已配置swagger
入参:
type Email struct {
To string `json:"to"` // 邮件发送给谁
Subject string `json:"subject"` // 邮件标题
Body string `json:"body"` // 邮件内容
}
server/plugin/notify/api/api.go
已删除
100644 → 0
浏览文件 @
baafb593
package
api
import
(
"github.com/flipped-aurora/gin-vue-admin/server/global"
"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
notify_response
"github.com/flipped-aurora/gin-vue-admin/server/plugin/notify/model/response"
"github.com/flipped-aurora/gin-vue-admin/server/plugin/notify/service"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
)
type
Api
struct
{
}
// @Tags Notify
// @Summary 发送文字消息接口
// @Security ApiKeyAuth
// @Produce application/json
// @Param data body notify_response.TextNotify true "发送文字消息的参数"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"发送成功"}"
// @Router /notify/sendTextMessage [post]
func
(
s
*
Api
)
SendTextMessage
(
c
*
gin
.
Context
)
{
var
textNotify
notify_response
.
TextNotify
_
=
c
.
ShouldBindJSON
(
&
textNotify
)
if
err
:=
service
.
ServiceGroupApp
.
SendTextMessage
(
textNotify
.
Content
,
textNotify
.
AtMobiles
,
textNotify
.
IsAtAll
);
err
!=
nil
{
global
.
GVA_LOG
.
Error
(
"发送失败!"
,
zap
.
Any
(
"err"
,
err
))
response
.
FailWithMessage
(
"发送失败"
,
c
)
}
else
{
response
.
OkWithData
(
"发送成功"
,
c
)
}
}
// @Tags Notify
// @Summary 发送图文链接消息接口
// @Security ApiKeyAuth
// @Produce application/json
// @Param data body notify_response.LinkNotify true "发送图文链接消息的参数"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"发送成功"}"
// @Router /notify/sendLinkMessage [post]
func
(
s
*
Api
)
SendLinkMessage
(
c
*
gin
.
Context
)
{
var
linkNotify
notify_response
.
LinkNotify
_
=
c
.
ShouldBindJSON
(
&
linkNotify
)
if
err
:=
service
.
ServiceGroupApp
.
SendLinkMessage
(
linkNotify
.
Content
,
linkNotify
.
Title
,
linkNotify
.
PicUrl
,
linkNotify
.
MessageUrl
);
err
!=
nil
{
global
.
GVA_LOG
.
Error
(
"发送失败!"
,
zap
.
Any
(
"err"
,
err
))
response
.
FailWithMessage
(
"发送失败"
,
c
)
}
else
{
response
.
OkWithData
(
"发送成功"
,
c
)
}
}
// @Tags Notify
// @Summary 发送markdown消息接口
// @Security ApiKeyAuth
// @Produce application/json
// @Param data body notify_response.MarkdownNotify true "发送markdown消息的参数"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"发送成功"}"
// @Router /notify/sendMarkdownMessage [post]
func
(
s
*
Api
)
SendMarkdownMessage
(
c
*
gin
.
Context
)
{
var
markdownNotify
notify_response
.
MarkdownNotify
_
=
c
.
ShouldBindJSON
(
&
markdownNotify
)
if
err
:=
service
.
ServiceGroupApp
.
SendMarkdownMessage
(
markdownNotify
.
Content
,
markdownNotify
.
Title
,
markdownNotify
.
AtMobiles
,
markdownNotify
.
IsAtAll
);
err
!=
nil
{
global
.
GVA_LOG
.
Error
(
"发送失败!"
,
zap
.
Any
(
"err"
,
err
))
response
.
FailWithMessage
(
"发送失败"
,
c
)
}
else
{
response
.
OkWithData
(
"发送成功"
,
c
)
}
}
server/plugin/notify/api/enter.go
已删除
100644 → 0
浏览文件 @
baafb593
package
api
type
ApiGroup
struct
{
Api
}
var
ApiGroupApp
=
new
(
ApiGroup
)
server/plugin/notify/config/dingding.go
已删除
100644 → 0
浏览文件 @
baafb593
package
config
type
DingDing
struct
{
Url
string
`mapstructure:"url" json:"url" yaml:"url"`
// Url
Token
string
`mapstructure:"token" json:"token" yaml:"token"`
// access_token
Secret
string
`mapstructure:"secret" json:"secret" yaml:"secret"`
// 密钥
}
server/plugin/notify/global/global.go
已删除
100644 → 0
浏览文件 @
baafb593
package
global
import
"github.com/flipped-aurora/gin-vue-admin/server/plugin/notify/config"
var
GlobalConfig_
=
&
config
.
DingDing
{}
server/plugin/notify/main.go
已删除
100644 → 0
浏览文件 @
baafb593
package
notify
import
(
"github.com/flipped-aurora/gin-vue-admin/server/plugin/notify/global"
"github.com/flipped-aurora/gin-vue-admin/server/plugin/notify/router"
"github.com/gin-gonic/gin"
)
type
ddPlugin
struct
{
Secret
string
Token
string
Url
string
}
func
CreateDDPlug
(
url
,
Token
,
Secret
string
)
*
ddPlugin
{
global
.
GlobalConfig_
.
Url
=
url
global
.
GlobalConfig_
.
Token
=
Token
global
.
GlobalConfig_
.
Secret
=
Secret
return
&
ddPlugin
{}
}
func
(
*
ddPlugin
)
Register
(
group
*
gin
.
RouterGroup
)
{
router
.
RouterGroupApp
.
InitRouter
(
group
)
}
func
(
*
ddPlugin
)
RouterPath
()
string
{
return
"notify"
}
server/plugin/notify/model/response/notify.go
已删除
100644 → 0
浏览文件 @
baafb593
package
response
type
TextNotify
struct
{
// 文字信息
Content
string
`json:"content"`
// 发送的内容
AtMobiles
[]
string
`json:"atMobiles"`
// 需要艾特的人的手机号
IsAtAll
bool
`json:"isAtAll"`
// 是否艾特全体
}
type
LinkNotify
struct
{
// 图文链接信息
Content
string
`json:"content"`
// 发送的内容
Title
string
`json:"title"`
// 内容标题
PicUrl
string
`json:"picUrl"`
// 配图
MessageUrl
string
`json:"messageUrl"`
// 点击跳转路径
}
type
MarkdownNotify
struct
{
// markdown信息
Title
string
`json:"title"`
// 内容标题
Content
string
`json:"content"`
// 发送的内容
AtMobiles
[]
string
`json:"atMobiles"`
// 需要艾特的人的手机号
IsAtAll
bool
`json:"isAtAll"`
// 是否艾特全体
}
server/plugin/notify/router/enter.go
已删除
100644 → 0
浏览文件 @
baafb593
package
router
type
RouterGroup
struct
{
NotifyRouter
}
var
RouterGroupApp
=
new
(
RouterGroup
)
server/plugin/notify/router/router.go
已删除
100644 → 0
浏览文件 @
baafb593
package
router
import
(
"github.com/flipped-aurora/gin-vue-admin/server/middleware"
"github.com/flipped-aurora/gin-vue-admin/server/plugin/notify/api"
"github.com/gin-gonic/gin"
)
type
NotifyRouter
struct
{
}
func
(
s
*
NotifyRouter
)
InitRouter
(
Router
*
gin
.
RouterGroup
)
{
router
:=
Router
.
Use
(
middleware
.
OperationRecord
())
var
SendTextMessage
=
api
.
ApiGroupApp
.
Api
.
SendTextMessage
{
router
.
POST
(
"sendTextMessage"
,
SendTextMessage
)
}
}
server/plugin/notify/service/enter.go
已删除
100644 → 0
浏览文件 @
baafb593
package
service
type
ServiceGroup
struct
{
NotifyService
}
var
ServiceGroupApp
=
new
(
ServiceGroup
)
server/plugin/notify/service/notify.go
已删除
100644 → 0
浏览文件 @
baafb593
package
service
import
(
"bytes"
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"encoding/json"
"fmt"
"github.com/flipped-aurora/gin-vue-admin/server/plugin/notify/global"
"io/ioutil"
"net/http"
"net/url"
"time"
)
type
NotifyService
struct
{
}
//@author: [Espoir](https://github.com/nightsimon)
//@function: SendTextMessage
//@description: 发送钉钉文字信息
//@params content string发送的文字内容
//@params atMobiles []string 艾特的手机号
//@params isAtAll bool 是否艾特全体
//@return: err error
func
(
e
*
NotifyService
)
SendTextMessage
(
content
string
,
atMobiles
[]
string
,
isAtAll
bool
)
(
err
error
)
{
msg
:=
map
[
string
]
interface
{}{
"msgtype"
:
"text"
,
"text"
:
map
[
string
]
string
{
"content"
:
content
,
},
"at"
:
map
[
string
]
interface
{}{
"atMobiles"
:
atMobiles
,
"isAtAll"
:
isAtAll
,
},
}
return
SendMessage
(
msg
)
}
//@author: [Espoir](https://github.com/nightsimon)
//@function: SendLinkMessage
//@description: 发送钉钉图文链接信息
//@params content string 发送的文字内容
//@params title string 发送的标题
//@params picUrl string 艾特的手机号
//@params messageUrl string 是否艾特全体
//@return: err error
func
(
e
*
NotifyService
)
SendLinkMessage
(
content
,
title
,
picUrl
,
messageUrl
string
)
(
err
error
)
{
msg
:=
map
[
string
]
interface
{}{
"msgtype"
:
"link"
,
"link"
:
map
[
string
]
string
{
"text"
:
content
,
"title"
:
title
,
"picUrl"
:
picUrl
,
"messageUrl"
:
messageUrl
,
},
}
return
SendMessage
(
msg
)
}
//@author: [Espoir](https://github.com/nightsimon)
//@function: SendMarkdownMessage
//@description: 发送钉钉Markdown信息
//@params content 发送的文字内容
//@params title 发送的标题
//@params atMobiles []string 艾特的手机号
//@params isAtAll bool 是否艾特全体
//@return: err error
func
(
e
*
NotifyService
)
SendMarkdownMessage
(
content
,
title
string
,
atMobiles
[]
string
,
isAtAll
bool
)
(
err
error
)
{
msg
:=
map
[
string
]
interface
{}{
"msgtype"
:
"markdown"
,
"markdown"
:
map
[
string
]
string
{
"text"
:
content
,
"title"
:
title
,
},
"at"
:
map
[
string
]
interface
{}{
"atMobiles"
:
atMobiles
,
"isAtAll"
:
isAtAll
,
},
}
return
SendMessage
(
msg
)
}
func
SendMessage
(
msg
interface
{})
error
{
body
:=
bytes
.
NewBuffer
(
nil
)
err
:=
json
.
NewEncoder
(
body
)
.
Encode
(
msg
)
if
err
!=
nil
{
return
fmt
.
Errorf
(
"msg json failed, msg: %v, err: %v"
,
msg
,
err
.
Error
())
}
value
:=
url
.
Values
{}
value
.
Set
(
"access_token"
,
global
.
GlobalConfig_
.
Token
)
if
global
.
GlobalConfig_
.
Secret
!=
""
{
t
:=
time
.
Now
()
.
UnixNano
()
/
1e6
value
.
Set
(
"timestamp"
,
fmt
.
Sprintf
(
"%d"
,
t
))
value
.
Set
(
"sign"
,
sign
(
t
,
global
.
GlobalConfig_
.
Secret
))
}
request
,
err
:=
http
.
NewRequest
(
http
.
MethodPost
,
global
.
GlobalConfig_
.
Url
,
body
)
if
err
!=
nil
{
return
fmt
.
Errorf
(
"error request: %v"
,
err
.
Error
())
}
request
.
URL
.
RawQuery
=
value
.
Encode
()
request
.
Header
.
Add
(
"Content-Type"
,
"application/json"
)
res
,
err
:=
(
&
http
.
Client
{})
.
Do
(
request
)
if
err
!=
nil
{
return
fmt
.
Errorf
(
"send dingTalk message failed, error: %v"
,
err
.
Error
())
}
defer
func
()
{
_
=
res
.
Body
.
Close
()
}()
result
,
err
:=
ioutil
.
ReadAll
(
res
.
Body
)
if
res
.
StatusCode
!=
200
{
return
fmt
.
Errorf
(
"send dingTalk message failed, %s"
,
httpError
(
request
,
res
,
result
,
"http code is not 200"
))
}
if
err
!=
nil
{
return
fmt
.
Errorf
(
"send dingTalk message failed, %s"
,
httpError
(
request
,
res
,
result
,
err
.
Error
()))
}
type
response
struct
{
ErrCode
int
`json:"errcode"`
}
var
ret
response
if
err
:=
json
.
Unmarshal
(
result
,
&
ret
);
err
!=
nil
{
return
fmt
.
Errorf
(
"send dingTalk message failed, %s"
,
httpError
(
request
,
res
,
result
,
err
.
Error
()))
}
if
ret
.
ErrCode
!=
0
{
return
fmt
.
Errorf
(
"send dingTalk message failed, %s"
,
httpError
(
request
,
res
,
result
,
"errcode is not 0"
))
}
return
nil
}
func
httpError
(
request
*
http
.
Request
,
response
*
http
.
Response
,
body
[]
byte
,
error
string
)
string
{
return
fmt
.
Sprintf
(
"http request failure, error: %s, status code: %d, %s %s, body:
\n
%s"
,
error
,
response
.
StatusCode
,
request
.
Method
,
request
.
URL
.
String
(),
string
(
body
),
)
}
func
sign
(
t
int64
,
secret
string
)
string
{
strToHash
:=
fmt
.
Sprintf
(
"%d
\n
%s"
,
t
,
secret
)
hmac256
:=
hmac
.
New
(
sha256
.
New
,
[]
byte
(
secret
))
hmac256
.
Write
([]
byte
(
strToHash
))
data
:=
hmac256
.
Sum
(
nil
)
return
base64
.
StdEncoding
.
EncodeToString
(
data
)
}
// 其余方法请参考 https://developers.dingtalk.com/document/robots/custom-robot-access?spm=ding_open_doc.document.0.0.7f8710afbfzduV#topic-2026027
server/plugin/notify/utils/utils.go
已删除
100644 → 0
浏览文件 @
baafb593
package
utils
web/package-lock.json
浏览文件 @
ac60596a
{
"name"
:
"g
vav3
"
,
"name"
:
"g
in-vue-admin
"
,
"version"
:
"0.1.0"
,
"lockfileVersion"
:
1
,
"requires"
:
true
,
...
...
@@ -1156,21 +1156,6 @@
"postcss"
:
"^7.0.0"
}
},
"@moefe/vue-aplayer"
:
{
"version"
:
"2.0.0-beta.5"
,
"resolved"
:
"https://registry.npmjs.org/@moefe/vue-aplayer/-/vue-aplayer-2.0.0-beta.5.tgz"
,
"integrity"
:
"sha512-ytzp4GStzjftuh7H1rIS/ziqwV1FO67iTLSkDxgN0J2bqlO+rBgDDr83Y+pZKBIgRUc30uu/UZHqmE4QiBHHeg=="
,
"requires"
:
{
"vue"
:
"^2.5.17"
},
"dependencies"
:
{
"vue"
:
{
"version"
:
"2.6.14"
,
"resolved"
:
"https://registry.npmjs.org/vue/-/vue-2.6.14.tgz"
,
"integrity"
:
"sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ=="
}
}
},
"@mrmlnc/readdir-enhanced"
:
{
"version"
:
"2.2.1"
,
"resolved"
:
"https://registry.npm.taobao.org/@mrmlnc/readdir-enhanced/download/@mrmlnc/readdir-enhanced-2.2.1.tgz"
,
...
...
@@ -1780,6 +1765,63 @@
"integrity"
:
"sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo="
,
"dev"
:
true
},
"ansi-styles"
:
{
"version"
:
"4.3.0"
,
"resolved"
:
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
,
"integrity"
:
"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="
,
"dev"
:
true
,
"optional"
:
true
,
"requires"
:
{
"color-convert"
:
"^2.0.1"
}
},
"chalk"
:
{
"version"
:
"4.1.2"
,
"resolved"
:
"https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
,
"integrity"
:
"sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="
,
"dev"
:
true
,
"optional"
:
true
,
"requires"
:
{
"ansi-styles"
:
"^4.1.0"
,
"supports-color"
:
"^7.1.0"
}
},
"color-convert"
:
{
"version"
:
"2.0.1"
,
"resolved"
:
"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
,
"integrity"
:
"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="
,
"dev"
:
true
,
"optional"
:
true
,
"requires"
:
{
"color-name"
:
"~1.1.4"
}
},
"color-name"
:
{
"version"
:
"1.1.4"
,
"resolved"
:
"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
,
"integrity"
:
"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
,
"dev"
:
true
,
"optional"
:
true
},
"has-flag"
:
{
"version"
:
"4.0.0"
,
"resolved"
:
"https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
,
"integrity"
:
"sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
,
"dev"
:
true
,
"optional"
:
true
},
"loader-utils"
:
{
"version"
:
"2.0.0"
,
"resolved"
:
"https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz"
,
"integrity"
:
"sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ=="
,
"dev"
:
true
,
"optional"
:
true
,
"requires"
:
{
"big.js"
:
"^5.2.2"
,
"emojis-list"
:
"^3.0.0"
,
"json5"
:
"^2.1.2"
}
},
"ssri"
:
{
"version"
:
"8.0.1"
,
"resolved"
:
"https://registry.nlark.com/ssri/download/ssri-8.0.1.tgz"
,
...
...
@@ -1788,6 +1830,28 @@
"requires"
:
{
"minipass"
:
"^3.1.1"
}
},
"supports-color"
:
{
"version"
:
"7.2.0"
,
"resolved"
:
"https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
,
"integrity"
:
"sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="
,
"dev"
:
true
,
"optional"
:
true
,
"requires"
:
{
"has-flag"
:
"^4.0.0"
}
},
"vue-loader-v16"
:
{
"version"
:
"npm:vue-loader@16.5.0"
,
"resolved"
:
"https://registry.npmjs.org/vue-loader/-/vue-loader-16.5.0.tgz"
,
"integrity"
:
"sha512-WXh+7AgFxGTgb5QAkQtFeUcHNIEq3PGVQ8WskY5ZiFbWBkOwcCPRs4w/2tVyTbh2q6TVRlO3xfvIukUtjsu62A=="
,
"dev"
:
true
,
"optional"
:
true
,
"requires"
:
{
"chalk"
:
"^4.1.0"
,
"hash-sum"
:
"^2.0.0"
,
"loader-utils"
:
"^2.0.0"
}
}
}
},
...
...
@@ -10113,11 +10177,6 @@
}
}
},
"simple-uploader.js"
:
{
"version"
:
"0.5.6"
,
"resolved"
:
"https://registry.npmjs.org/simple-uploader.js/-/simple-uploader.js-0.5.6.tgz"
,
"integrity"
:
"sha512-ukjL0wZhK1dNMaQa6sd+UpCSmnUjblaUGbAd/B8f5IFrChMzDsC/7eFSK4bs4BS5NPJFSZVLI+l6Ri7THTkQtw=="
},
"slash"
:
{
"version"
:
"2.0.0"
,
"resolved"
:
"https://registry.npm.taobao.org/slash/download/slash-2.0.0.tgz"
,
...
...
@@ -10962,21 +11021,6 @@
"integrity"
:
"sha1-Wrr3FKlAXbBQRzK7zNLO3Z75U30="
,
"dev"
:
true
},
"timeline-vuejs"
:
{
"version"
:
"1.1.1"
,
"resolved"
:
"https://registry.npmjs.org/timeline-vuejs/-/timeline-vuejs-1.1.1.tgz"
,
"integrity"
:
"sha512-jsdr0xNCBH/GBiW7qsOTbBxZuyk7WKD5YmtTGP1sm0su0fy+iBsEJLDyhHhQ4nTAxca8MkSbJhKGUgF5eNoEfA=="
,
"requires"
:
{
"vue"
:
"^2.5.17"
},
"dependencies"
:
{
"vue"
:
{
"version"
:
"2.6.14"
,
"resolved"
:
"https://registry.npmjs.org/vue/-/vue-2.6.14.tgz"
,
"integrity"
:
"sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ=="
}
}
},
"timers-browserify"
:
{
"version"
:
"2.0.12"
,
"resolved"
:
"https://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.12.tgz?cache=0&sync_timestamp=1603793712916&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftimers-browserify%2Fdownload%2Ftimers-browserify-2.0.12.tgz"
,
...
...
@@ -11544,87 +11588,6 @@
}
}
},
"vue-loader-v16"
:
{
"version"
:
"npm:vue-loader@16.5.0"
,
"resolved"
:
"https://registry.npmjs.org/vue-loader/-/vue-loader-16.5.0.tgz"
,
"integrity"
:
"sha512-WXh+7AgFxGTgb5QAkQtFeUcHNIEq3PGVQ8WskY5ZiFbWBkOwcCPRs4w/2tVyTbh2q6TVRlO3xfvIukUtjsu62A=="
,
"dev"
:
true
,
"optional"
:
true
,
"requires"
:
{
"chalk"
:
"^4.1.0"
,
"hash-sum"
:
"^2.0.0"
,
"loader-utils"
:
"^2.0.0"
},
"dependencies"
:
{
"ansi-styles"
:
{
"version"
:
"4.3.0"
,
"resolved"
:
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
,
"integrity"
:
"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="
,
"dev"
:
true
,
"optional"
:
true
,
"requires"
:
{
"color-convert"
:
"^2.0.1"
}
},
"chalk"
:
{
"version"
:
"4.1.2"
,
"resolved"
:
"https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
,
"integrity"
:
"sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="
,
"dev"
:
true
,
"optional"
:
true
,
"requires"
:
{
"ansi-styles"
:
"^4.1.0"
,
"supports-color"
:
"^7.1.0"
}
},
"color-convert"
:
{
"version"
:
"2.0.1"
,
"resolved"
:
"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
,
"integrity"
:
"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="
,
"dev"
:
true
,
"optional"
:
true
,
"requires"
:
{
"color-name"
:
"~1.1.4"
}
},
"color-name"
:
{
"version"
:
"1.1.4"
,
"resolved"
:
"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
,
"integrity"
:
"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
,
"dev"
:
true
,
"optional"
:
true
},
"has-flag"
:
{
"version"
:
"4.0.0"
,
"resolved"
:
"https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
,
"integrity"
:
"sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
,
"dev"
:
true
,
"optional"
:
true
},
"loader-utils"
:
{
"version"
:
"2.0.0"
,
"resolved"
:
"https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz"
,
"integrity"
:
"sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ=="
,
"dev"
:
true
,
"optional"
:
true
,
"requires"
:
{
"big.js"
:
"^5.2.2"
,
"emojis-list"
:
"^3.0.0"
,
"json5"
:
"^2.1.2"
}
},
"supports-color"
:
{
"version"
:
"7.2.0"
,
"resolved"
:
"https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
,
"integrity"
:
"sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="
,
"dev"
:
true
,
"optional"
:
true
,
"requires"
:
{
"has-flag"
:
"^4.0.0"
}
}
}
},
"vue-particle-line"
:
{
"version"
:
"0.1.4"
,
"resolved"
:
"https://registry.npmjs.org/vue-particle-line/-/vue-particle-line-0.1.4.tgz"
,
...
...
@@ -11648,14 +11611,6 @@
"@vue/devtools-api"
:
"^6.0.0-beta.14"
}
},
"vue-simple-uploader"
:
{
"version"
:
"0.7.6"
,
"resolved"
:
"https://registry.npmjs.org/vue-simple-uploader/-/vue-simple-uploader-0.7.6.tgz"
,
"integrity"
:
"sha512-DYddedNi+ZZzqxmKgW2t4lBN3aiB66oKOxgAfS9Hz9J1FHv7Xt+u1Pq8F48BFS4vG0+MFHCNzjzS2xaEUOIcHQ=="
,
"requires"
:
{
"simple-uploader.js"
:
"^0.5.6"
}
},
"vue-style-loader"
:
{
"version"
:
"4.1.3"
,
"resolved"
:
"https://registry.npm.taobao.org/vue-style-loader/download/vue-style-loader-4.1.3.tgz?cache=0&sync_timestamp=1614758661292&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-style-loader%2Fdownload%2Fvue-style-loader-4.1.3.tgz"
,
...
...
@@ -11680,11 +11635,6 @@
"integrity"
:
"sha1-HuO8mhbsv1EYvjNLsV+cRvgvWCU="
,
"dev"
:
true
},
"vuescroll"
:
{
"version"
:
"4.17.3"
,
"resolved"
:
"https://registry.npmjs.org/vuescroll/-/vuescroll-4.17.3.tgz"
,
"integrity"
:
"sha512-5P3hje/fYjo1eAB0Y8zboLbaq/mnPNczYyZ1aPHHM6wIFKcqal9Mi42CBCZizUnEtoXtbsGlnyLcVbnalTNptA=="
},
"vuex"
:
{
"version"
:
"4.0.2"
,
"resolved"
:
"https://registry.nlark.com/vuex/download/vuex-4.0.2.tgz?cache=0&sync_timestamp=1623945253165&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvuex%2Fdownload%2Fvuex-4.0.2.tgz"
,
...
...
web/package.json
浏览文件 @
ac60596a
{
"name"
:
"g
vav3
"
,
"name"
:
"g
in-vue-admin
"
,
"version"
:
"0.1.0"
,
"private"
:
true
,
"scripts"
:
{
...
...
@@ -8,7 +8,6 @@
"lint"
:
"vue-cli-service lint"
},
"dependencies"
:
{
"@moefe/vue-aplayer"
:
"^2.0.0-beta.5"
,
"axios"
:
"^0.19.2"
,
"core-js"
:
"^3.6.5"
,
"element-plus"
:
"^1.1.0-beta.4"
,
...
...
@@ -22,12 +21,9 @@
"screenfull"
:
"^5.0.2"
,
"script-ext-html-webpack-plugin"
:
"^2.1.4"
,
"spark-md5"
:
"^3.0.1"
,
"timeline-vuejs"
:
"1.1.1"
,
"vue"
:
"^3.0.0"
,
"vue-particle-line"
:
"^0.1.4"
,
"vue-router"
:
"^4.0.0-0"
,
"vue-simple-uploader"
:
"^0.7.4"
,
"vuescroll"
:
"^4.14.4"
,
"vuex"
:
"^4.0.0-0"
,
"vuex-persist"
:
"^2.1.0"
},
...
...
web/src/core/gin-vue-admin.js
浏览文件 @
ac60596a
...
...
@@ -2,17 +2,11 @@
* gin-vue-admin web框架组
*
* */
// time line css
import
'
../../node_modules/timeline-vuejs/dist/timeline-vuejs.css
'
// 加载网站配置文件夹
import
config
from
'
./config
'
import
{
register
}
from
'
./global
'
export
const
run
=
function
(
app
)
{
app
.
config
.
globalProperties
.
$GIN_VUE_ADMIN
=
config
// app.use(uploader)
register
(
app
)
console
.
log
(
`
欢迎使用 Gin-Vue-Admin
当前版本:V2.4.5 alpha
...
...
web/src/core/global.js
0 → 100644
浏览文件 @
ac60596a
import
config
from
'
./config
'
import
{
emitter
}
from
'
@/utils/bus.js
'
const
closeThisPage
=
()
=>
{
emitter
.
emit
(
'
closeThisPage
'
)
}
export
const
register
=
(
app
)
=>
{
app
.
config
.
globalProperties
.
$GIN_VUE_ADMIN
=
config
app
.
config
.
globalProperties
.
$CloseThisPage
=
closeThisPage
}
web/src/utils/request.js
浏览文件 @
ac60596a
...
...
@@ -81,19 +81,34 @@ service.interceptors.response.use(
},
error
=>
{
closeLoading
()
ElMessageBox
.
confirm
(
`
<p>检测到接口错误
${
error
}
</p>
<p>错误码500:此类错误内容常见于后台panic,如果影响您正常使用可强制登出清理缓存</p>
<p>错误码404:此类错误多为接口未注册(或未重启)或者请求路径(方法)与api路径(方法)不符</p>
`
,
'
接口报错
'
,
{
dangerouslyUseHTMLString
:
true
,
distinguishCancelAndClose
:
true
,
confirmButtonText
:
'
清理缓存
'
,
cancelButtonText
:
'
取消
'
})
.
then
(()
=>
{
store
.
commit
(
'
user/LoginOut
'
)
})
switch
(
error
.
response
.
status
)
{
case
500
:
ElMessageBox
.
confirm
(
`
<p>检测到接口错误
${
error
}
</p>
<p>错误码<span style="color:red"> 500 </span>:此类错误内容常见于后台panic,请先查看后台日志,如果影响您正常使用可强制登出清理缓存</p>
`
,
'
接口报错
'
,
{
dangerouslyUseHTMLString
:
true
,
distinguishCancelAndClose
:
true
,
confirmButtonText
:
'
清理缓存
'
,
cancelButtonText
:
'
取消
'
})
.
then
(()
=>
{
store
.
commit
(
'
user/LoginOut
'
)
})
break
case
404
:
ElMessageBox
.
confirm
(
`
<p>检测到接口错误
${
error
}
</p>
<p>错误码<span style="color:red"> 404 </span>:此类错误多为接口未注册(或未重启)或者请求路径(方法)与api路径(方法)不符--如果为自动化代码请检查是否存在空格</p>
`
,
'
接口报错
'
,
{
dangerouslyUseHTMLString
:
true
,
distinguishCancelAndClose
:
true
,
confirmButtonText
:
'
我知道了
'
,
cancelButtonText
:
'
取消
'
})
break
}
return
error
}
)
...
...
web/src/view/about/index.vue
浏览文件 @
ac60596a
...
...
@@ -79,20 +79,22 @@
<el-col
:span=
"12"
>
<el-card>
<
template
#header
>
<div>
提交记录
</div>
<div>
提交记录
</div>
</
template
>
<div>
<Timeline
:timeline-items=
"dataTimeline"
:message-when-no-items=
"messageWhenNoItems"
:unique-timeline=
"true"
:unique-year=
"true"
:show-day-and-month=
"true"
order=
"desc"
date-locale=
"zh-CN"
/>
<el-timeline>
<el-timeline-item
v-for=
"(item,index) in dataTimeline"
:key=
"index"
timestamp=
"2018/4/12"
placement=
"top"
>
<el-card>
<h4>
{{ item.title }}
</h4>
<p>
{{ item.message }}
</p>
</el-card>
</el-timeline-item>
</el-timeline>
</div>
<el-button
class=
"load-more"
...
...
@@ -107,18 +109,14 @@
<
script
>
import
{
Commits
,
Members
}
from
'
@/api/github
'
import
Timeline
from
'
timeline-vuejs
'
export
default
{
name
:
'
About
'
,
components
:
{
Timeline
},
data
()
{
return
{
messageWhenNoItems
:
'
There arent commits
'
,
members
:
[],
dataTimeline
:
[],
page
:
0
page
:
0
,
}
},
created
()
{
...
...
@@ -138,7 +136,7 @@ export default {
from
:
new
Date
(
element
.
commit
.
author
.
date
),
title
:
element
.
commit
.
author
.
name
,
showDayAndMonth
:
true
,
description
:
`<a style="color: #26191b" href="
${
element
.
html_url
}
">
${
element
.
commit
.
message
}
</a>`
message
:
element
.
commit
.
message
,
})
}
})
...
...
@@ -149,8 +147,8 @@ export default {
this
.
members
=
data
this
.
members
.
sort
()
})
}
}
}
,
}
,
}
</
script
>
...
...
web/src/view/dashboard/index.vue
浏览文件 @
ac60596a
...
...
@@ -57,11 +57,11 @@
<el-col>
<el-card
shadow=
"hover"
>
<h2>
使用教学:
<a
style=
"color:#409EFF"
target=
"view_window"
href=
"https://www.bilibili.com/video/BV1
fV411y7dT/"
>
https://www.bilibili.com/video/BV1fV411y7dT
/
</a>
使用教学:
<a
style=
"color:#409EFF"
target=
"view_window"
href=
"https://www.bilibili.com/video/BV1
Rg411u7xH/"
>
https://www.bilibili.com/video/BV1Rg411u7xH
/
</a>
</h2>
<br>
<h2>
工作流教学:
<a
style=
"color:#409EFF"
target=
"view_window"
href=
"https://www.bilibili.com/video/BV1Ka411F7Ji/"
>
https://www.bilibili.com/video/BV1Ka411F7Ji/
</a>
插件仓库:
<a
style=
"color:#409EFF"
target=
"view_window"
href=
"https://github.com/flipped-aurora/gva-plugins"
>
https://github.com/flipped-aurora/gva-plugins
</a>
</h2>
<div
/>
</el-card>
...
...
@@ -83,16 +83,6 @@
</el-col>
</el-row>
</div>
<div
class=
"bottom"
>
<el-row
:gutter=
"32"
>
<el-col
:xs=
"24"
:sm=
"24"
:lg=
"12"
>
<div
class=
"chart-player"
/>
</el-col>
<el-col
:xs=
"24"
:sm=
"24"
:lg=
"12"
>
<div
class=
"chart-player"
/>
</el-col>
</el-row>
</div>
</div>
</
template
>
...
...
@@ -187,7 +177,7 @@ export default {
}
.bottom
{
width
:
100%
;
height
:
30
0px
;
height
:
42
0px
;
// margin: 20px 0;
.el-row
{
margin-right
:
4px
!
important
;
...
...
@@ -198,6 +188,10 @@ export default {
padding
:
10px
;
background-color
:
#fff
;
}
.iPlayer
{
width
:
100%
;
height
:
100%
;
}
}
}
</
style
>
web/src/view/layout/aside/historyComponent/history.vue
浏览文件 @
ac60596a
...
...
@@ -17,7 +17,7 @@
class=
"gva-tab"
>
<template
#label
>
<span
:style=
"
{color: activeValue===name(item)?activeColor:'#333'}">
<i
class=
"dot"
:style=
"
{backgroundColor:activeValue===name(item)?activeColor:'#ddd'}" />
{{
item
.
meta
.
title
}}
</span>
<span
:style=
"
{color: activeValue===name(item)?activeColor:'#333'}">
<i
class=
"dot"
:style=
"
{
backgroundColor:activeValue===name(item)?activeColor:'#ddd'}" />
{{
item
.
meta
.
title
}}
</span>
</
template
>
</el-tab-pane>
</el-tabs>
...
...
@@ -109,7 +109,12 @@ export default {
}
this
.
setTab
(
this
.
$route
)
},
mounted
()
{
// 全局监听 关闭当前页面函数
emitter
.
on
(
'
closeThisPage
'
,
()
=>
{
this
.
removeTab
(
this
.
name
(
this
.
$route
))
})
},
beforeDestroy
()
{
emitter
.
off
(
'
collapse
'
)
emitter
.
off
(
'
mobile
'
)
...
...
web/src/view/layout/index.vue
浏览文件 @
ac60596a
...
...
@@ -75,7 +75,7 @@
<!-- 当前面包屑用路由自动生成可根据需求修改 -->
<!--
:to="{ path: item.path }" 暂时注释不用-->
<HistoryComponent
/>
<HistoryComponent
ref=
"layoutHistoryComponent"
/>
</div>
</transition>
<router-view
v-if=
"$route.meta.keepAlive && reloadFlag"
v-slot=
"{ Component }"
v-loading=
"loadingFlag"
element-loading-text=
"正在加载中"
class=
"admin-box"
>
...
...
web/src/view/superAdmin/user/user.vue
浏览文件 @
ac60596a
...
...
@@ -74,8 +74,7 @@
</el-form-item>
<el-form-item
label=
"用户角色"
label-width=
"80px"
prop=
"authorityId"
>
<el-cascader
v-if=
"userInfo"
v-model:visible=
"userInfo.authorityIds"
v-model=
"userInfo.authorityIds"
:options=
"authOptions"
:show-all-levels=
"false"
:props=
"{ multiple:true,checkStrictly: true,label:'authorityName',value:'authorityId',disabled:'disabled',emitPath:false}"
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录