Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
admin
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
4acd379d
authored
Jul 07, 2024
by
YunaiV
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of
https://gitee.com/yudaocode/yudao-ui-admin-vue3
into dev
parents
8a73fbe7
f341ba4d
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
98 additions
and
185 deletions
+98
-185
.env
+5
-0
README.md
+10
-11
src/api/mall/promotion/seckill/seckillConfig.ts
+1
-1
src/components/bpmnProcessDesigner/package/penal/flow-condition/FlowCondition.vue
+1
-1
src/utils/constants.ts
+8
-0
src/utils/index.ts
+1
-1
src/views/Login/components/LoginForm.vue
+3
-3
src/views/bpm/oa/leave/index.vue
+3
-3
src/views/bpm/processInstance/detail/index.vue
+1
-1
src/views/crm/contract/detail/index.vue
+1
-1
src/views/mall/home/components/TradeTrendCard.vue
+1
-1
src/views/mall/product/spu/form/ProductPropertyAddForm.vue
+1
-0
src/views/mp/account/index.vue
+1
-1
src/views/pay/app/components/channel/WeixinChannelForm.vue
+9
-6
src/views/pay/app/index.vue
+46
-153
src/views/pay/demo/order/index.vue
+1
-1
src/views/system/operatelog/index.vue
+2
-1
types/env.d.ts
+3
-0
No files found.
.env
View file @
4acd379d
...
...
@@ -18,3 +18,8 @@ VITE_APP_DOCALERT_ENABLE=true
# 百度统计
VITE_APP_BAIDU_CODE = a1ff8825baa73c3a78eb96aa40325abc
# 默认账户密码
VITE_APP_DEFAULT_LOGIN_TENANT = 芋道源码
VITE_APP_DEFAULT_LOGIN_USERNAME = admin
VITE_APP_DEFAULT_LOGIN_PASSWORD = admin123
README.md
View file @
4acd379d
...
...
@@ -54,17 +54,16 @@
推荐 VS Code 开发,配合插件如下:
| 插件名 | 功能 |
|-------------------------------|--------------------------|
| TypeScript Vue Plugin (Volar) | 用于 TypeScript 的 Vue 插件 |
| Vue Language Features (Volar) | Vue3.0 语法支持 |
| unocss | unocss for vscode |
| Iconify IntelliSense | Iconify 预览和搜索 |
| i18n Ally | 国际化智能提示 |
| Stylelint | Css 格式化 |
| Prettier | 代码格式化 |
| ESLint | 脚本代码检查 |
| DotENV | env 文件高亮 |
| 插件名 | 功能 |
|-------------------------------|---------------------|
| Vue - Official | Vue 与 TypeScript 支持 |
| unocss | unocss for vscode |
| Iconify IntelliSense | Iconify 预览和搜索 |
| i18n Ally | 国际化智能提示 |
| Stylelint | Css 格式化 |
| Prettier | 代码格式化 |
| ESLint | 脚本代码检查 |
| DotENV | env 文件高亮 |
## 🔥 后端架构
...
...
src/api/mall/promotion/seckill/seckillConfig.ts
View file @
4acd379d
...
...
@@ -19,7 +19,7 @@ export const SeckillConfigApi = {
// 查询秒杀时段列表
getSimpleSeckillConfigList
:
async
()
=>
{
return
await
request
.
get
({
url
:
`/promotion/seckill-config/
simple-
list`
})
return
await
request
.
get
({
url
:
`/promotion/seckill-config/list`
})
},
// 查询秒杀时段详情
...
...
src/components/bpmnProcessDesigner/package/penal/flow-condition/FlowCondition.vue
View file @
4acd379d
...
...
@@ -129,7 +129,7 @@ const updateFlowType = (flowType) => {
conditionExpression
:
null
})
bpmnInstances
().
modeling
.
updateProperties
(
toRaw
(
bpmnElementSource
.
value
),
{
default
:
bpmnElement
.
value
default
:
toRaw
(
bpmnElement
.
value
)
})
return
}
...
...
src/utils/constants.ts
View file @
4acd379d
...
...
@@ -109,6 +109,14 @@ export const PayChannelEnum = {
code
:
'wx_app'
,
name
:
'微信 APP 支付'
},
WX_NATIVE
:
{
code
:
'wx_native'
,
name
:
'微信 Native 支付'
},
WX_WAP
:
{
code
:
'wx_wap'
,
name
:
'微信 WAP 网站支付'
},
WX_BAR
:
{
code
:
'wx_bar'
,
name
:
'微信条码支付'
...
...
src/utils/index.ts
View file @
4acd379d
...
...
@@ -313,7 +313,7 @@ export const fenToYuan = (price: string | number): string => {
*/
export
const
calculateRelativeRate
=
(
value
?:
number
,
reference
?:
number
)
=>
{
// 防止除0
if
(
!
reference
)
return
0
if
(
!
reference
||
reference
==
0
)
return
0
return
((
100
*
((
value
||
0
)
-
reference
))
/
reference
).
toFixed
(
0
)
}
...
...
src/views/Login/components/LoginForm.vue
View file @
4acd379d
...
...
@@ -184,9 +184,9 @@ const loginData = reactive({
captchaEnable
:
import
.
meta
.
env
.
VITE_APP_CAPTCHA_ENABLE
,
tenantEnable
:
import
.
meta
.
env
.
VITE_APP_TENANT_ENABLE
,
loginForm
:
{
tenantName
:
'芋道源码
'
,
username
:
'admin
'
,
password
:
'admin123
'
,
tenantName
:
import
.
meta
.
env
.
VITE_APP_DEFAULT_LOGIN_TENANT
||
'
'
,
username
:
import
.
meta
.
env
.
VITE_APP_DEFAULT_LOGIN_USERNAME
||
'
'
,
password
:
import
.
meta
.
env
.
VITE_APP_DEFAULT_LOGIN_PASSWORD
||
'
'
,
captchaVerification
:
''
,
rememberMe
:
true
// 默认记录我。如果不需要,可手动修改
}
...
...
src/views/bpm/oa/leave/index.vue
View file @
4acd379d
...
...
@@ -36,9 +36,9 @@
value-format=
"YYYY-MM-DD HH:mm:ss"
/>
</el-form-item>
<el-form-item
label=
"审批结果"
prop=
"
result
"
>
<el-form-item
label=
"审批结果"
prop=
"
status
"
>
<el-select
v-model=
"queryParams.
result
"
v-model=
"queryParams.
status
"
class=
"!w-240px"
clearable
placeholder=
"请选择审批结果"
...
...
@@ -81,7 +81,7 @@
<ContentWrap>
<el-table
v-loading=
"loading"
:data=
"list"
>
<el-table-column
align=
"center"
label=
"申请编号"
prop=
"id"
/>
<el-table-column
align=
"center"
label=
"状态"
prop=
"
result
"
>
<el-table-column
align=
"center"
label=
"状态"
prop=
"
status
"
>
<template
#
default=
"scope"
>
<dict-tag
:type=
"DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS"
:value=
"scope.row.status"
/>
</
template
>
...
...
src/views/bpm/processInstance/detail/index.vue
View file @
4acd379d
...
...
@@ -363,7 +363,7 @@ const loadRunningTask = (tasks) => {
// 2.4 处理 approve 表单
if
(
task
.
formId
&&
task
.
formConf
)
{
const
approveForm
=
{}
setConfAndFields2
(
approveForm
,
task
.
formConf
,
task
.
formFields
,
task
.
formVariable
)
setConfAndFields2
(
approveForm
,
task
.
formConf
,
task
.
formFields
,
task
.
formVariable
s
)
approveForms
.
value
.
push
(
approveForm
)
}
else
{
approveForms
.
value
.
push
({})
// 占位,避免为空
...
...
src/views/crm/contract/detail/index.vue
View file @
4acd379d
...
...
@@ -36,7 +36,7 @@
ref=
"permissionListRef"
:biz-id=
"contract.id!"
:biz-type=
"BizTypeEnum.CRM_CONTRACT"
:show-action=
"false"
:show-action=
"
!permissionListRef?.isPool ||
false"
@
quit-team=
"close"
/>
</el-tab-pane>
...
...
src/views/mall/home/components/TradeTrendCard.vue
View file @
4acd379d
...
...
@@ -186,7 +186,7 @@ const getOrderCountTrendComparison = async (
dates
.
push
(
item
.
value
.
date
)
if
(
series
.
length
===
2
)
{
series
[
0
].
data
.
push
(
fenToYuan
(
item
?.
value
?.
orderPayPrice
||
0
))
// 当前金额
series
[
1
].
data
.
push
(
fenToYuan
(
item
?.
value
?.
orderPayCount
||
0
)
)
// 当前数量
series
[
1
].
data
.
push
(
item
?.
value
?.
orderPayCount
||
0
)
// 当前数量
}
else
{
series
[
0
].
data
.
push
(
fenToYuan
(
item
?.
reference
?.
orderPayPrice
||
0
))
// 对照金额
series
[
1
].
data
.
push
(
fenToYuan
(
item
?.
value
?.
orderPayPrice
||
0
))
// 当前金额
...
...
src/views/mall/product/spu/form/ProductPropertyAddForm.vue
View file @
4acd379d
...
...
@@ -7,6 +7,7 @@
:model=
"formData"
:rules=
"formRules"
label-width=
"80px"
@
keydown
.
enter
.
prevent=
"submitForm"
>
<el-form-item
label=
"属性名称"
prop=
"name"
>
<el-input
v-model=
"formData.name"
placeholder=
"请输入名称"
/>
...
...
src/views/mp/account/index.vue
View file @
4acd379d
...
...
@@ -37,7 +37,7 @@
<el-table-column
label=
"appId"
align=
"center"
prop=
"appId"
width=
"180"
/>
<el-table-column
label=
"服务器地址(URL)"
align=
"center"
prop=
"appId"
width=
"360"
>
<template
#
default=
"scope"
>
{{
'http://服务端地址/mp/open/'
+
scope
.
row
.
appId
}}
{{
'http://服务端地址/
admin-api/
mp/open/'
+
scope
.
row
.
appId
}}
</
template
>
</el-table-column>
<el-table-column
label=
"二维码"
align=
"center"
prop=
"qrCodeUrl"
>
...
...
src/views/pay/app/components/channel/WeixinChannelForm.vue
View file @
4acd379d
...
...
@@ -80,7 +80,8 @@
:http-request=
"keyContentUpload"
>
<el-button
type=
"primary"
>
<Icon
icon=
"ep:upload"
class=
"mr-5px"
/>
点击上传
<Icon
icon=
"ep:upload"
class=
"mr-5px"
/>
点击上传
</el-button>
</el-upload>
</el-form-item>
...
...
@@ -120,7 +121,8 @@
:http-request=
"privateKeyContentUpload"
>
<el-button
type=
"primary"
>
<Icon
icon=
"ep:upload"
class=
"mr-5px"
/>
点击上传
<Icon
icon=
"ep:upload"
class=
"mr-5px"
/>
点击上传
</el-button>
</el-upload>
</el-form-item>
...
...
@@ -148,7 +150,8 @@
:http-request=
"privateCertContentUpload"
>
<el-button
type=
"primary"
>
<Icon
icon=
"ep:upload"
class=
"mr-5px"
/>
点击上传
<Icon
icon=
"ep:upload"
class=
"mr-5px"
/>
点击上传
</el-button>
</el-upload>
</el-form-item>
...
...
@@ -310,7 +313,7 @@ const pemFileBeforeUpload = (file) => {
/**
* 读取 apiclient_key.pem 到 privateKeyContent 字段
*/
const
privateKeyContentUpload
=
(
event
)
=>
{
const
privateKeyContentUpload
=
async
(
event
)
=>
{
const
readFile
=
new
FileReader
()
readFile
.
onload
=
(
e
:
any
)
=>
{
formData
.
value
.
config
.
privateKeyContent
=
e
.
target
.
result
...
...
@@ -321,7 +324,7 @@ const privateKeyContentUpload = (event) => {
/**
* 读取 apiclient_cert.pem 到 privateCertContent 字段
*/
const
privateCertContentUpload
=
(
event
)
=>
{
const
privateCertContentUpload
=
async
(
event
)
=>
{
const
readFile
=
new
FileReader
()
readFile
.
onload
=
(
e
:
any
)
=>
{
formData
.
value
.
config
.
privateCertContent
=
e
.
target
.
result
...
...
@@ -332,7 +335,7 @@ const privateCertContentUpload = (event) => {
/**
* 读取 apiclient_cert.p12 到 keyContent 字段
*/
const
keyContentUpload
=
(
event
)
=>
{
const
keyContentUpload
=
async
(
event
)
=>
{
const
readFile
=
new
FileReader
()
readFile
.
onload
=
(
e
:
any
)
=>
{
formData
.
value
.
config
.
keyContent
=
e
.
target
.
result
.
split
(
','
)[
1
]
...
...
src/views/pay/app/index.vue
View file @
4acd379d
...
...
@@ -45,10 +45,17 @@
/>
</el-form-item>
<el-form-item>
<el-button
@
click=
"handleQuery"
>
<Icon
icon=
"ep:search"
class=
"mr-5px"
/>
搜索
</el-button>
<el-button
@
click=
"resetQuery"
>
<Icon
icon=
"ep:refresh"
class=
"mr-5px"
/>
重置
</el-button>
<el-button
@
click=
"handleQuery"
>
<Icon
icon=
"ep:search"
class=
"mr-5px"
/>
搜索
</el-button>
<el-button
@
click=
"resetQuery"
>
<Icon
icon=
"ep:refresh"
class=
"mr-5px"
/>
重置
</el-button>
<el-button
type=
"primary"
plain
@
click=
"openForm('create')"
v-hasPermi=
"['pay:app:create']"
>
<Icon
icon=
"ep:plus"
class=
"mr-5px"
/>
新增
<Icon
icon=
"ep:plus"
class=
"mr-5px"
/>
新增
</el-button>
</el-form-item>
</el-form>
...
...
@@ -70,93 +77,18 @@
</
template
>
</el-table-column>
<el-table-column
label=
"支付宝配置"
align=
"center"
>
<el-table-column
:label=
"PayChannelEnum.ALIPAY_APP.name"
align=
"center"
>
<
template
#
default=
"scope"
>
<el-button
type=
"success"
v-if=
"isChannelExists(scope.row.channelCodes, PayChannelEnum.ALIPAY_APP.code)"
@
click=
"openChannelForm(scope.row, PayChannelEnum.ALIPAY_APP.code)"
circle
>
<Icon
icon=
"ep:check"
/>
</el-button>
<el-button
v-else
type=
"danger"
circle
@
click=
"openChannelForm(scope.row, PayChannelEnum.ALIPAY_APP.code)"
>
<Icon
icon=
"ep:close"
/>
</el-button>
</
template
>
</el-table-column>
<el-table-column
:label=
"PayChannelEnum.ALIPAY_PC.name"
align=
"center"
>
<
template
#
default=
"scope"
>
<el-button
type=
"success"
circle
v-if=
"isChannelExists(scope.row.channelCodes, PayChannelEnum.ALIPAY_PC.code)"
@
click=
"openChannelForm(scope.row, PayChannelEnum.ALIPAY_PC.code)"
>
<Icon
icon=
"ep:check"
/>
</el-button>
<el-button
v-else
type=
"danger"
circle
@
click=
"openChannelForm(scope.row, PayChannelEnum.ALIPAY_PC.code)"
>
<Icon
icon=
"ep:close"
/>
</el-button>
</
template
>
</el-table-column>
<el-table-column
:label=
"PayChannelEnum.ALIPAY_WAP.name"
align=
"center"
>
<
template
#
default=
"scope"
>
<el-button
type=
"success"
circle
v-if=
"isChannelExists(scope.row.channelCodes, PayChannelEnum.ALIPAY_WAP.code)"
@
click=
"openChannelForm(scope.row, PayChannelEnum.ALIPAY_WAP.code)"
>
<Icon
icon=
"ep:check"
/>
</el-button>
<el-button
v-else
type=
"danger"
circle
@
click=
"openChannelForm(scope.row, PayChannelEnum.ALIPAY_WAP.code)"
>
<Icon
icon=
"ep:close"
/>
</el-button>
</
template
>
</el-table-column>
<el-table-column
:label=
"PayChannelEnum.ALIPAY_QR.name"
align=
"center"
>
<
template
#
default=
"scope"
>
<el-button
type=
"success"
circle
v-if=
"isChannelExists(scope.row.channelCodes, PayChannelEnum.ALIPAY_QR.code)"
@
click=
"openChannelForm(scope.row, PayChannelEnum.ALIPAY_QR.code)"
>
<Icon
icon=
"ep:check"
/>
</el-button>
<el-button
v-else
type=
"danger"
circle
@
click=
"openChannelForm(scope.row, PayChannelEnum.ALIPAY_QR.code)"
>
<Icon
icon=
"ep:close"
/>
</el-button>
</
template
>
</el-table-column>
<el-table-column
:label=
"PayChannelEnum.ALIPAY_BAR.name"
align=
"center"
>
<el-table-column
:label=
"channel.name"
align=
"center"
v-for=
"channel in alipayChannels"
:key=
"channel.code"
>
<
template
#
default=
"scope"
>
<el-button
type=
"success"
v-if=
"isChannelExists(scope.row.channelCodes, channel.code)"
@
click=
"openChannelForm(scope.row, channel.code)"
circle
v-if=
"isChannelExists(scope.row.channelCodes, PayChannelEnum.ALIPAY_BAR.code)"
@
click=
"openChannelForm(scope.row, PayChannelEnum.ALIPAY_BAR.code)"
>
<Icon
icon=
"ep:check"
/>
</el-button>
...
...
@@ -164,7 +96,7 @@
v-else
type=
"danger"
circle
@
click=
"openChannelForm(scope.row,
PayChannelEnum.ALIPAY_BAR
.code)"
@
click=
"openChannelForm(scope.row,
channel
.code)"
>
<Icon
icon=
"ep:close"
/>
</el-button>
...
...
@@ -172,73 +104,18 @@
</el-table-column>
</el-table-column>
<el-table-column
label=
"微信配置"
align=
"center"
>
<el-table-column
:label=
"PayChannelEnum.WX_LITE.name"
align=
"center"
>
<
template
#
default=
"scope"
>
<el-button
type=
"success"
circle
v-if=
"isChannelExists(scope.row.channelCodes, PayChannelEnum.WX_LITE.code)"
@
click=
"openChannelForm(scope.row, PayChannelEnum.WX_LITE.code)"
>
<Icon
icon=
"ep:check"
/>
</el-button>
<el-button
v-else
type=
"danger"
circle
@
click=
"openChannelForm(scope.row, PayChannelEnum.WX_LITE.code)"
>
<Icon
icon=
"ep:close"
/>
</el-button>
</
template
>
</el-table-column>
<el-table-column
:label=
"PayChannelEnum.WX_PUB.name"
align=
"center"
>
<
template
#
default=
"scope"
>
<el-button
type=
"success"
circle
v-if=
"isChannelExists(scope.row.channelCodes, PayChannelEnum.WX_PUB.code)"
@
click=
"openChannelForm(scope.row, PayChannelEnum.WX_PUB.code)"
>
<Icon
icon=
"ep:check"
/>
</el-button>
<el-button
v-else
type=
"danger"
circle
@
click=
"openChannelForm(scope.row, PayChannelEnum.WX_PUB.code)"
>
<Icon
icon=
"ep:close"
/>
</el-button>
</
template
>
</el-table-column>
<el-table-column
:label=
"PayChannelEnum.WX_APP.name"
align=
"center"
>
<
template
#
default=
"scope"
>
<el-button
type=
"success"
circle
v-if=
"isChannelExists(scope.row.channelCodes, PayChannelEnum.WX_APP.code)"
@
click=
"openChannelForm(scope.row, PayChannelEnum.WX_APP.code)"
>
<Icon
icon=
"ep:check"
/>
</el-button>
<el-button
v-else
type=
"danger"
circle
@
click=
"openChannelForm(scope.row, PayChannelEnum.WX_APP.code)"
>
<Icon
icon=
"ep:close"
/>
</el-button>
</
template
>
</el-table-column>
<el-table-column
:label=
"PayChannelEnum.WX_BAR.name"
align=
"center"
>
<el-table-column
:label=
"channel.name"
align=
"center"
v-for=
"channel in wxChannels"
:key=
"channel.code"
>
<
template
#
default=
"scope"
>
<el-button
type=
"success"
v-if=
"isChannelExists(scope.row.channelCodes, channel.code)"
@
click=
"openChannelForm(scope.row, channel.code)"
circle
v-if=
"isChannelExists(scope.row.channelCodes, PayChannelEnum.WX_BAR.code)"
@
click=
"openChannelForm(scope.row, PayChannelEnum.WX_BAR.code)"
>
<Icon
icon=
"ep:check"
/>
</el-button>
...
...
@@ -246,7 +123,7 @@
v-else
type=
"danger"
circle
@
click=
"openChannelForm(scope.row,
PayChannelEnum.WX_BAR
.code)"
@
click=
"openChannelForm(scope.row,
channel
.code)"
>
<Icon
icon=
"ep:close"
/>
</el-button>
...
...
@@ -338,12 +215,11 @@
import
{
DICT_TYPE
,
getIntDictOptions
}
from
'@/utils/dict'
import
*
as
AppApi
from
'@/api/pay/app'
import
AppForm
from
'./components/AppForm.vue'
import
{
PayChannelEnum
}
from
'@/utils/constants'
import
{
CommonStatusEnum
,
PayChannelEnum
}
from
'@/utils/constants'
import
AlipayChannelForm
from
'./components/channel/AlipayChannelForm.vue'
import
WeixinChannelForm
from
'./components/channel/WeixinChannelForm.vue'
import
MockChannelForm
from
'./components/channel/MockChannelForm.vue'
import
WalletChannelForm
from
'./components/channel/WalletChannelForm.vue'
import
{
CommonStatusEnum
}
from
'@/utils/constants'
defineOptions
({
name
:
'PayApp'
})
...
...
@@ -365,6 +241,23 @@ const queryParams = reactive({
})
const
queryFormRef
=
ref
()
// 搜索的表单
const
alipayChannels
=
[
PayChannelEnum
.
ALIPAY_APP
,
PayChannelEnum
.
ALIPAY_PC
,
PayChannelEnum
.
ALIPAY_WAP
,
PayChannelEnum
.
ALIPAY_QR
,
PayChannelEnum
.
ALIPAY_BAR
]
const
wxChannels
=
[
PayChannelEnum
.
WX_LITE
,
PayChannelEnum
.
WX_PUB
,
PayChannelEnum
.
WX_APP
,
PayChannelEnum
.
WX_NATIVE
,
PayChannelEnum
.
WX_WAP
,
PayChannelEnum
.
WX_BAR
,
]
/** 查询列表 */
const
getList
=
async
()
=>
{
loading
.
value
=
true
...
...
src/views/pay/demo/order/index.vue
View file @
4acd379d
...
...
@@ -147,7 +147,7 @@ const handlePay = (row: any) => {
name
:
'PayCashier'
,
query
:
{
id
:
row
.
payOrderId
,
returnUrl
:
encodeURIComponent
(
'/pay/demo
-
order?id='
+
row
.
id
)
returnUrl
:
encodeURIComponent
(
'/pay/demo
/
order?id='
+
row
.
id
)
}
})
}
...
...
src/views/system/operatelog/index.vue
View file @
4acd379d
...
...
@@ -13,7 +13,8 @@
<el-form-item
label=
"操作人"
prop=
"userId"
>
<el-select
v-model=
"queryParams.userId"
multiple
clearable
filterable
placeholder=
"请输入操作人员"
class=
"!w-240px"
>
...
...
types/env.d.ts
View file @
4acd379d
...
...
@@ -14,6 +14,9 @@ interface ImportMetaEnv {
readonly
VITE_DEV
:
string
readonly
VITE_APP_CAPTCHA_ENABLE
:
string
readonly
VITE_APP_TENANT_ENABLE
:
string
readonly
VITE_APP_DEFAULT_LOGIN_TENANT
:
string
readonly
VITE_APP_DEFAULT_LOGIN_USERNAME
:
string
readonly
VITE_APP_DEFAULT_LOGIN_PASSWORD
:
string
readonly
VITE_APP_DOCALERT_ENABLE
:
string
readonly
VITE_BASE_URL
:
string
readonly
VITE_UPLOAD_URL
:
string
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment