Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
FLIPPED-AURORA
gin-vue-admin
提交
9ff1933c
G
gin-vue-admin
项目概览
FLIPPED-AURORA
/
gin-vue-admin
大约 1 年 前同步成功
通知
332
Star
18154
Fork
5505
代码
文件
提交
分支
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,发现更多精彩内容 >>
未验证
提交
9ff1933c
编写于
7月 10, 2021
作者:
Mr.奇淼(
提交者:
GitHub
7月 10, 2021
浏览文件
操作
浏览文件
下载
差异文件
v2.4.3发版
v2.4.3发版
上级
d252134f
a29fde37
变更
12
隐藏空白更改
内联
并排
Showing
12 changed file
with
94 addition
and
122 deletion
+94
-122
server/README.md
server/README.md
+53
-43
server/config.yaml
server/config.yaml
+1
-0
server/config/gorm.go
server/config/gorm.go
+2
-2
server/config/oss.go
server/config/oss.go
+1
-0
server/core/server.go
server/core/server.go
+1
-1
server/initialize/gorm.go
server/initialize/gorm.go
+5
-11
server/initialize/internal/logger.go
server/initialize/internal/logger.go
+21
-51
server/initialize/timer.go
server/initialize/timer.go
+0
-1
server/utils/upload/aliyun_oss.go
server/utils/upload/aliyun_oss.go
+2
-2
web/src/components/upload/image.vue
web/src/components/upload/image.vue
+6
-9
web/src/core/gin-vue-admin.js
web/src/core/gin-vue-admin.js
+1
-1
web/src/view/example/upload/upload.vue
web/src/view/example/upload/upload.vue
+1
-1
未找到文件。
server/README.md
浏览文件 @
9ff1933c
## server项目结构
```
shell
├── api
│ └── v1
├── config
├── core
├── docs
├── global
├── initialize
│ └── internal
├── middleware
├── model
│ ├── request
│ └── response
├── packfile
├── resource
│ ├── excel
│ ├── page
│ └── template
├── router
├── service
├──
source
└── utils
├── timer
└── upload
```
| 文件夹 | 说明 | 描述 |
| ------------ | ----------------------- | --------------------------- |
|
`api`
| api层 | api层 |
|
`--v1`
| v1版本接口 | v1版本接口 |
|
`config`
| 配置包 | config.yaml对应的配置结构体 |
|
`core`
| 核心文件 | 核心组件(zap, viper, server)的初始化 |
|
`docs`
| swagger文档目录 | swagger文档目录 |
|
`global`
| 全局对象 | 全局对象 |
|
`initialize`
| 初始化 | router,redis,gorm,validator, timer的初始化 |
|
`--internal`
| 初始化内部函数 | gorm 的 longger 自定义,在此文件夹的函数只能由
`initialize`
层进行调用 |
|
`middleware`
| 中间件层 | 用于存放
`gin`
中间件代码 |
|
`model`
| 模型层 | 模型对应数据表 |
|
`--request`
| 入参结构体 | 接收前端发送到后端的数据。 |
|
`--response`
| 出参结构体 | 返回给前端的数据结构体 |
|
`packfile`
| 静态文件打包 | 静态文件打包 |
|
`resource`
| 静态资源文件夹 | 负责存放静态文件 |
|
`--excel`
| excel导入导出默认路径 | excel导入导出默认路径 |
|
`--page`
| 表单生成器 | 表单生成器 打包后的dist |
|
`--template`
| 模板 | 模板文件夹,存放的是代码生成器的模板 |
|
`router`
| 路由层 | 路由层 |
|
`service`
| service层 | 存放业务逻辑问题 |
|
`source`
| source层 | 存放初始化数据的函数 |
|
`utils`
| 工具包 | 工具函数封装 |
|
`--timer`
| timer | 定时器接口封装 |
|
`--upload`
| oss | oss接口封装 |
整理代码结构
```
lua
web
├──
api
/
v1
-- 主要API
|
├──
sys_initdb
.
go
-- ico
|
└──
sys_user
.
go
--
├──
config
-- 配置文件 设定操作的结构体
|
├──
auto_code
.
go
-- ico captcha.go
|
├──
...
-- ico captcha.go
|
└──
zap
.
go
-- core
├──
core
-- 主要结构代码
|
├──
server_other
.
go
-- ico captcha.go
|
├──
...
-- ico captcha.go
|
└──
zap
.
go
--
├──
docs
-- 文档系统
|
├──
docs
.
go
-- ico captcha.go
|
├──
swagger
.
json
-- json
|
└──
swagger
.
yaml
-- yaml
├──
global
-- global
├──
initialize
-- initialize
├──
middleware
-- 中间键
├──
model
-- global
│
├──
request
-- 所有请求model结构体
|
|
├──
common
.
go
|
|
├──
...
|
|
└──
sys_user
.
go
-- yaml
|
├──
response
-- 返回数据
|
|
├──
common
.
go
|
|
├──
...
|
|
└──
sys_user
.
go
-- yaml
├──
packfile
-- 文件写入
├──
resource
-- 资源文件
├──
router
-- 路由
├──
service
-- service层
├──
source
-- 文件目录操作
├──
utils
├──
config
.
yaml
--
├──
Dockerfile
-- docker配置
├──
go
.
mod
-- mod 配置
├──
go
.
sum
-- sum
├──
latest_log
-- vue-cli 配置
└──
main
.
go
-- package.json
```
\ No newline at end of file
server/config.yaml
浏览文件 @
9ff1933c
...
...
@@ -104,6 +104,7 @@ aliyun-oss:
access-key-secret
:
'
yourAccessKeySecret'
bucket-name
:
'
yourBucketName'
bucket-url
:
'
yourBucketUrl'
base-path
:
'
yourBasePath'
# tencent cos configuration
tencent-cos
:
...
...
server/config/gorm.go
浏览文件 @
9ff1933c
...
...
@@ -8,8 +8,8 @@ type Mysql struct {
Password
string
`mapstructure:"password" json:"password" yaml:"password"`
// 数据库密码
MaxIdleConns
int
`mapstructure:"max-idle-conns" json:"maxIdleConns" yaml:"max-idle-conns"`
// 空闲中的最大连接数
MaxOpenConns
int
`mapstructure:"max-open-conns" json:"maxOpenConns" yaml:"max-open-conns"`
// 打开到数据库的最大连接数
LogMode
bool
`mapstructure:"log-mode" json:"logMode" yaml:"log-mode"`
// 是否开启Gorm全局日志
LogZap
string
`mapstructure:"log-zap" json:"logZap" yaml:"log-zap"`
LogMode
string
`mapstructure:"log-mode" json:"logMode" yaml:"log-mode"`
// 是否开启Gorm全局日志
LogZap
bool
`mapstructure:"log-zap" json:"logZap" yaml:"log-zap"`
// 是否通过zap写入日志文件
}
func
(
m
*
Mysql
)
Dsn
()
string
{
...
...
server/config/oss.go
浏览文件 @
9ff1933c
...
...
@@ -20,6 +20,7 @@ type AliyunOSS struct {
AccessKeySecret
string
`mapstructure:"access-key-secret" json:"accessKeySecret" yaml:"access-key-secret"`
BucketName
string
`mapstructure:"bucket-name" json:"bucketName" yaml:"bucket-name"`
BucketUrl
string
`mapstructure:"bucket-url" json:"bucketUrl" yaml:"bucket-url"`
BasePath
string
`mapstructure:"base-path" json:"basePath" yaml:"base-path"`
}
type
TencentCOS
struct
{
Bucket
string
`mapstructure:"bucket" json:"bucket" yaml:"bucket"`
...
...
server/core/server.go
浏览文件 @
9ff1933c
...
...
@@ -29,7 +29,7 @@ func RunWindowsServer() {
fmt
.
Printf
(
`
欢迎使用 Gin-Vue-Admin
当前版本:V2.4.
2
当前版本:V2.4.
3
加群方式:微信号:shouzi_1994 QQ群:622360840
默认自动化文档地址:http://127.0.0.1%s/swagger/index.html
默认前端文件运行地址:http://127.0.0.1:8080
...
...
server/initialize/gorm.go
浏览文件 @
9ff1933c
...
...
@@ -78,7 +78,7 @@ func GormMysql() *gorm.DB {
DontSupportRenameColumn
:
true
,
// 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
SkipInitializeWithVersion
:
false
,
// 根据版本自动配置
}
if
db
,
err
:=
gorm
.
Open
(
mysql
.
New
(
mysqlConfig
),
gormConfig
(
m
.
LogMode
));
err
!=
nil
{
if
db
,
err
:=
gorm
.
Open
(
mysql
.
New
(
mysqlConfig
),
gormConfig
());
err
!=
nil
{
//global.GVA_LOG.Error("MySQL启动异常", zap.Any("err", err))
//os.Exit(0)
//return nil
...
...
@@ -97,9 +97,9 @@ func GormMysql() *gorm.DB {
//@param: mod bool
//@return: *gorm.Config
func
gormConfig
(
mod
bool
)
*
gorm
.
Config
{
var
config
=
&
gorm
.
Config
{
DisableForeignKeyConstraintWhenMigrating
:
true
}
switch
global
.
GVA_CONFIG
.
Mysql
.
Log
Zap
{
func
gormConfig
()
*
gorm
.
Config
{
config
:
=
&
gorm
.
Config
{
DisableForeignKeyConstraintWhenMigrating
:
true
}
switch
global
.
GVA_CONFIG
.
Mysql
.
Log
Mode
{
case
"silent"
,
"Silent"
:
config
.
Logger
=
internal
.
Default
.
LogMode
(
logger
.
Silent
)
case
"error"
,
"Error"
:
...
...
@@ -108,14 +108,8 @@ func gormConfig(mod bool) *gorm.Config {
config
.
Logger
=
internal
.
Default
.
LogMode
(
logger
.
Warn
)
case
"info"
,
"Info"
:
config
.
Logger
=
internal
.
Default
.
LogMode
(
logger
.
Info
)
case
"zap"
,
"Zap"
:
config
.
Logger
=
internal
.
Default
.
LogMode
(
logger
.
Info
)
default
:
if
mod
{
config
.
Logger
=
internal
.
Default
.
LogMode
(
logger
.
Info
)
break
}
config
.
Logger
=
internal
.
Default
.
LogMode
(
logger
.
Silent
)
config
.
Logger
=
internal
.
Default
.
LogMode
(
logger
.
Info
)
}
return
config
}
server/initialize/internal/logger.go
浏览文件 @
9ff1933c
...
...
@@ -4,7 +4,6 @@ import (
"context"
"fmt"
"gin-vue-admin/global"
"go.uber.org/zap"
"gorm.io/gorm/logger"
"gorm.io/gorm/utils"
"io/ioutil"
...
...
@@ -13,11 +12,6 @@ import (
"time"
)
// writer log writer interface
type
writer
interface
{
Printf
(
string
,
...
interface
{})
}
type
config
struct
{
SlowThreshold
time
.
Duration
Colorful
bool
...
...
@@ -34,27 +28,27 @@ var (
Recorder
=
traceRecorder
{
Interface
:
Default
,
BeginAt
:
time
.
Now
()}
)
func
New
(
writer
w
riter
,
config
config
)
logger
.
Interface
{
func
New
(
writer
logger
.
W
riter
,
config
config
)
logger
.
Interface
{
var
(
infoStr
=
"%s
\n
[info] "
warnStr
=
"%s
\n
[warn] "
errStr
=
"%s
\n
[error] "
traceStr
=
"%s
\n
[%.3fms] [rows:%v] %s"
traceWarnStr
=
"%s %s
\n
[%.3fms] [rows:%v] %s"
traceErrStr
=
"%s %s
\n
[%.3fms] [rows:%v] %s"
traceStr
=
"%s
\n
[%.3fms] [rows:%v] %s
\n
"
traceWarnStr
=
"%s %s
\n
[%.3fms] [rows:%v] %s
\n
"
traceErrStr
=
"%s %s
\n
[%.3fms] [rows:%v] %s
\n
"
)
if
config
.
Colorful
{
infoStr
=
logger
.
Green
+
"%s
\n
"
+
logger
.
Reset
+
logger
.
Green
+
"[info] "
+
logger
.
Reset
warnStr
=
logger
.
BlueBold
+
"%s
\n
"
+
logger
.
Reset
+
logger
.
Magenta
+
"[warn] "
+
logger
.
Reset
errStr
=
logger
.
Magenta
+
"%s
\n
"
+
logger
.
Reset
+
logger
.
Red
+
"[error] "
+
logger
.
Reset
traceStr
=
logger
.
Green
+
"%s
\n
"
+
logger
.
Reset
+
logger
.
Yellow
+
"[%.3fms] "
+
logger
.
BlueBold
+
"[rows:%v]"
+
logger
.
Reset
+
" %s"
traceWarnStr
=
logger
.
Green
+
"%s "
+
logger
.
Yellow
+
"%s
\n
"
+
logger
.
Reset
+
logger
.
RedBold
+
"[%.3fms] "
+
logger
.
Yellow
+
"[rows:%v]"
+
logger
.
Magenta
+
" %s"
+
logger
.
Reset
traceErrStr
=
logger
.
RedBold
+
"%s "
+
logger
.
MagentaBold
+
"%s
\n
"
+
logger
.
Reset
+
logger
.
Yellow
+
"[%.3fms] "
+
logger
.
BlueBold
+
"[rows:%v]"
+
logger
.
Reset
+
" %s"
traceStr
=
logger
.
Green
+
"%s
\n
"
+
logger
.
Reset
+
logger
.
Yellow
+
"[%.3fms] "
+
logger
.
BlueBold
+
"[rows:%v]"
+
logger
.
Reset
+
" %s
\n
"
traceWarnStr
=
logger
.
Green
+
"%s "
+
logger
.
Yellow
+
"%s
\n
"
+
logger
.
Reset
+
logger
.
RedBold
+
"[%.3fms] "
+
logger
.
Yellow
+
"[rows:%v]"
+
logger
.
Magenta
+
" %s
\n
"
+
logger
.
Reset
traceErrStr
=
logger
.
RedBold
+
"%s "
+
logger
.
MagentaBold
+
"%s
\n
"
+
logger
.
Reset
+
logger
.
Yellow
+
"[%.3fms] "
+
logger
.
BlueBold
+
"[rows:%v]"
+
logger
.
Reset
+
" %s
\n
"
}
return
&
customL
ogger
{
w
riter
:
writer
,
return
&
_l
ogger
{
W
riter
:
writer
,
config
:
config
,
infoStr
:
infoStr
,
warnStr
:
warnStr
,
...
...
@@ -65,43 +59,43 @@ func New(writer writer, config config) logger.Interface {
}
}
type
customLogger
struct
{
writer
type
_logger
struct
{
config
logger
.
Writer
infoStr
,
warnStr
,
errStr
string
traceStr
,
traceErrStr
,
traceWarnStr
string
}
// LogMode log mode
func
(
c
*
customL
ogger
)
LogMode
(
level
logger
.
LogLevel
)
logger
.
Interface
{
func
(
c
*
_l
ogger
)
LogMode
(
level
logger
.
LogLevel
)
logger
.
Interface
{
newLogger
:=
*
c
newLogger
.
LogLevel
=
level
return
&
newLogger
}
// Info print info
func
(
c
*
customL
ogger
)
Info
(
ctx
context
.
Context
,
message
string
,
data
...
interface
{})
{
func
(
c
*
_l
ogger
)
Info
(
ctx
context
.
Context
,
message
string
,
data
...
interface
{})
{
if
c
.
LogLevel
>=
logger
.
Info
{
c
.
Printf
(
c
.
infoStr
+
message
,
append
([]
interface
{}{
utils
.
FileWithLineNum
()},
data
...
)
...
)
}
}
// Warn print warn messages
func
(
c
*
customL
ogger
)
Warn
(
ctx
context
.
Context
,
message
string
,
data
...
interface
{})
{
func
(
c
*
_l
ogger
)
Warn
(
ctx
context
.
Context
,
message
string
,
data
...
interface
{})
{
if
c
.
LogLevel
>=
logger
.
Warn
{
c
.
Printf
(
c
.
warnStr
+
message
,
append
([]
interface
{}{
utils
.
FileWithLineNum
()},
data
...
)
...
)
}
}
// Error print error messages
func
(
c
*
customL
ogger
)
Error
(
ctx
context
.
Context
,
message
string
,
data
...
interface
{})
{
func
(
c
*
_l
ogger
)
Error
(
ctx
context
.
Context
,
message
string
,
data
...
interface
{})
{
if
c
.
LogLevel
>=
logger
.
Error
{
c
.
Printf
(
c
.
errStr
+
message
,
append
([]
interface
{}{
utils
.
FileWithLineNum
()},
data
...
)
...
)
}
}
// Trace print sql message
func
(
c
*
customL
ogger
)
Trace
(
ctx
context
.
Context
,
begin
time
.
Time
,
fc
func
()
(
string
,
int64
),
err
error
)
{
func
(
c
*
_l
ogger
)
Trace
(
ctx
context
.
Context
,
begin
time
.
Time
,
fc
func
()
(
string
,
int64
),
err
error
)
{
if
c
.
LogLevel
>
0
{
elapsed
:=
time
.
Since
(
begin
)
switch
{
...
...
@@ -131,35 +125,11 @@ func (c *customLogger) Trace(ctx context.Context, begin time.Time, fc func() (st
}
}
func
(
c
*
customLogger
)
Printf
(
message
string
,
data
...
interface
{})
{
if
global
.
GVA_CONFIG
.
Mysql
.
LogZap
!=
""
{
switch
len
(
data
)
{
case
0
:
global
.
GVA_LOG
.
Info
(
message
)
case
1
:
global
.
GVA_LOG
.
Info
(
"gorm"
,
zap
.
Any
(
"src"
,
data
[
0
]))
case
2
:
global
.
GVA_LOG
.
Info
(
"gorm"
,
zap
.
Any
(
"src"
,
data
[
0
]),
zap
.
Any
(
"duration"
,
data
[
1
]))
case
3
:
global
.
GVA_LOG
.
Info
(
"gorm"
,
zap
.
Any
(
"src"
,
data
[
0
]),
zap
.
Any
(
"duration"
,
data
[
1
]),
zap
.
Any
(
"rows"
,
data
[
2
]))
case
4
:
global
.
GVA_LOG
.
Info
(
"gorm"
,
zap
.
Any
(
"src"
,
data
[
0
]),
zap
.
Any
(
"duration"
,
data
[
1
]),
zap
.
Any
(
"rows"
,
data
[
2
]),
zap
.
Any
(
"sql"
,
data
[
3
]))
}
return
}
switch
len
(
data
)
{
case
0
:
c
.
writer
.
Printf
(
message
,
""
)
case
1
:
c
.
writer
.
Printf
(
message
,
data
[
0
])
case
2
:
c
.
writer
.
Printf
(
message
,
data
[
0
],
data
[
1
])
case
3
:
c
.
writer
.
Printf
(
message
,
data
[
0
],
data
[
1
],
data
[
2
])
case
4
:
c
.
writer
.
Printf
(
message
,
data
[
0
],
data
[
1
],
data
[
2
],
data
[
3
])
case
5
:
c
.
writer
.
Printf
(
message
,
data
[
0
],
data
[
1
],
data
[
2
],
data
[
3
],
data
[
4
])
func
(
c
*
_logger
)
Printf
(
message
string
,
data
...
interface
{})
{
if
global
.
GVA_CONFIG
.
Mysql
.
LogZap
{
global
.
GVA_LOG
.
Info
(
fmt
.
Sprintf
(
message
,
data
...
))
}
else
{
c
.
Writer
.
Printf
(
message
,
data
...
)
}
}
...
...
server/initialize/timer.go
浏览文件 @
9ff1933c
...
...
@@ -10,7 +10,6 @@ import (
func
Timer
()
{
if
global
.
GVA_CONFIG
.
Timer
.
Start
{
for
_
,
detail
:=
range
global
.
GVA_CONFIG
.
Timer
.
Detail
{
fmt
.
Println
(
detail
)
go
func
(
detail
config
.
Detail
)
{
global
.
GVA_Timer
.
AddTaskByFunc
(
"ClearDB"
,
global
.
GVA_CONFIG
.
Timer
.
Spec
,
func
()
{
err
:=
utils
.
ClearTable
(
global
.
GVA_DB
,
detail
.
TableName
,
detail
.
CompareField
,
detail
.
Interval
)
...
...
server/utils/upload/aliyun_oss.go
浏览文件 @
9ff1933c
...
...
@@ -6,7 +6,6 @@ import (
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"go.uber.org/zap"
"mime/multipart"
"path/filepath"
"time"
)
...
...
@@ -27,7 +26,8 @@ func (*AliyunOSS) UploadFile(file *multipart.FileHeader) (string, string, error)
}
defer
f
.
Close
()
// 创建文件 defer 关闭
// 上传阿里云路径 文件名格式 自己可以改 建议保证唯一性
yunFileTmpPath
:=
filepath
.
Join
(
"uploads"
,
time
.
Now
()
.
Format
(
"2006-01-02"
))
+
"/"
+
file
.
Filename
//yunFileTmpPath := filepath.Join("uploads", time.Now().Format("2006-01-02")) + "/" + file.Filename
yunFileTmpPath
:=
global
.
GVA_CONFIG
.
AliyunOSS
.
BasePath
+
"/"
+
"uploads"
+
"/"
+
time
.
Now
()
.
Format
(
"2006-01-02"
)
+
"/"
+
file
.
Filename
// 上传文件流。
err
=
bucket
.
PutObject
(
yunFileTmpPath
,
f
)
...
...
web/src/components/upload/image.vue
浏览文件 @
9ff1933c
<!--
<div>
带压缩的上传
<upload-image v-model="imageUrl" :fileSize="512" />
已上传文件 {{ imageUrl }}
</div>
-->
<
template
>
<div>
...
...
@@ -17,7 +10,7 @@
:before-upload="beforeImageUpload"
:multiple="false"
>
<img
v-if=
"imageUrl"
:src=
"
path + i
mageUrl"
class=
"image"
>
<img
v-if=
"imageUrl"
:src=
"
showI
mageUrl"
class=
"image"
>
<i
v-else
class=
"el-icon-plus image-uploader-icon"
/>
</el-upload>
</div>
...
...
@@ -53,7 +46,10 @@ export default {
}
},
computed
:
{
...
mapGetters
(
'
user
'
,
[
'
userInfo
'
,
'
token
'
])
...
mapGetters
(
'
user
'
,
[
'
userInfo
'
,
'
token
'
]),
showImageUrl
()
{
return
(
this
.
imageUrl
&&
this
.
imageUrl
.
slice
(
0
,
4
)
!==
'
http
'
)
?
path
+
this
.
imageUrl
:
this
.
imageUrl
}
},
methods
:
{
beforeImageUpload
(
file
)
{
...
...
@@ -70,6 +66,7 @@ export default {
const
{
data
}
=
res
if
(
data
.
file
)
{
this
.
$emit
(
'
change
'
,
data
.
file
.
url
)
this
.
$emit
(
'
on-success
'
)
}
}
}
...
...
web/src/core/gin-vue-admin.js
浏览文件 @
9ff1933c
...
...
@@ -22,7 +22,7 @@ Vue.use(uploader)
console
.
log
(
`
欢迎使用 Gin-Vue-Admin
当前版本:V2.4.
2
当前版本:V2.4.
3
加群方式:微信:shouzi_1994 QQ群:622360840
默认自动化文档地址:http://127.0.0.1:
${
process
.
env
.
VUE_APP_SERVER_PORT
}
/swagger/index.html
默认前端文件运行地址:http://127.0.0.1:
${
process
.
env
.
VUE_APP_CLI_PORT
}
...
...
web/src/view/example/upload/upload.vue
浏览文件 @
9ff1933c
...
...
@@ -17,7 +17,7 @@
</el-col>
<el-col
:span=
"12"
>
带压缩的上传, (512(k)为压缩限制)
<upload-image
v-model=
"imageUrl"
:file-size=
"512"
:max-w-h=
"1080"
/>
<upload-image
v-model=
"imageUrl"
:file-size=
"512"
:max-w-h=
"1080"
@
on-success=
"getTableData"
/>
已上传文件
{{
imageUrl
}}
</el-col>
</el-row>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录