Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
W
wangxiaolu-promotion-wechat
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
sfa
wangxiaolu-promotion-wechat
Commits
837cbfed
提交
837cbfed
authored
12月 05, 2024
作者:
lidongxu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
信息提交页面搭建完毕
上级
ee74a7a3
隐藏空白字符变更
内嵌
并排
正在显示
10 个修改的文件
包含
264 行增加
和
265 行删除
+264
-265
login.js
api/login.js
+5
-53
config.js
config.js
+10
-10
main.js
main.js
+3
-3
pages.json
pages.json
+9
-8
login.vue
pages/login.vue
+39
-22
register.vue
pages/register.vue
+192
-165
start.vue
pages/start.vue
+4
-2
getters.js
store/getters.js
+0
-1
constant.js
utils/constant.js
+1
-0
storage.js
utils/storage.js
+1
-1
没有找到文件。
api/login.js
浏览文件 @
837cbfed
import
request
from
'@/utils/request'
import
request
from
'@/utils/request'
// 登录方法
// 提交用户注册信息
export
function
login
(
username
,
password
,
code
,
uuid
)
{
export
function
submitUserInfo
(
data
)
{
const
data
=
{
username
,
password
,
code
,
uuid
}
return
request
({
return
request
({
'url'
:
'/auth/login'
,
'url'
:
'/user/wechat/core/temporary/enroll'
,
headers
:
{
isToken
:
false
},
'method'
:
'post'
,
'method'
:
'post'
,
'data'
:
data
'data'
:
data
})
})
}
}
\ No newline at end of file
// 注册方法
export
function
register
(
data
)
{
return
request
({
url
:
'/auth/register'
,
headers
:
{
isToken
:
false
},
method
:
'post'
,
data
:
data
})
}
// 获取用户详细信息
export
function
getInfo
()
{
return
request
({
'url'
:
'/system/user/getInfo'
,
'method'
:
'get'
})
}
// 退出方法
export
function
logout
()
{
return
request
({
'url'
:
'/auth/logout'
,
'method'
:
'DELETE'
})
}
// 获取验证码
export
function
getCodeImg
()
{
return
request
({
'url'
:
'/auth/captchaImage'
,
headers
:
{
isToken
:
false
},
method
:
'get'
,
timeout
:
20000
})
}
config.js
浏览文件 @
837cbfed
...
@@ -5,9 +5,9 @@ module.exports = {
...
@@ -5,9 +5,9 @@ module.exports = {
mapKey
:
'mryaav7xyp0Z3ItwUT3oMssYAmG8sTSU'
,
mapKey
:
'mryaav7xyp0Z3ItwUT3oMssYAmG8sTSU'
,
coordtype
:
'gcj02'
,
// 坐标类型(小程序获取和百度地图 API 使用类型要对应上)
coordtype
:
'gcj02'
,
// 坐标类型(小程序获取和百度地图 API 使用类型要对应上)
// baseUrl: 'http://localhost:8080',
// baseUrl: 'http://localhost:8080',
baseUrl
:
'http://
192.168.140.189:8080'
,
// 局域网请求
baseUrl
:
'http://
promotion.wxl66.cn:8010'
,
// 云 API 域名
// baseUrl: 'http://sfa.test.wxl66.cn:85/api', // 上线测试
wxAppId
:
'wx5d89065bb4725557'
,
// baseUrl: 'http://111.198.15.68:85/api
',
wxSecret
:
'7395e91baf6b49ca9b84b1301989f77e
'
,
// 应用信息
// 应用信息
appInfo
:
{
appInfo
:
{
// 应用名称
// 应用名称
...
@@ -20,13 +20,13 @@ module.exports = {
...
@@ -20,13 +20,13 @@ module.exports = {
site_url
:
"http://ruoyi.vip"
,
site_url
:
"http://ruoyi.vip"
,
// 政策协议
// 政策协议
agreements
:
[{
agreements
:
[{
title
:
"隐私政策"
,
title
:
"隐私政策"
,
url
:
"https://ruoyi.vip/protocol.html"
url
:
"https://ruoyi.vip/protocol.html"
},
},
{
{
title
:
"用户服务协议"
,
title
:
"用户服务协议"
,
url
:
"https://ruoyi.vip/protocol.html"
url
:
"https://ruoyi.vip/protocol.html"
}
}
]
]
}
}
}
}
main.js
浏览文件 @
837cbfed
...
@@ -4,14 +4,14 @@ import store from './store' // store
...
@@ -4,14 +4,14 @@ import store from './store' // store
import
plugins
from
'./plugins'
// plugins
import
plugins
from
'./plugins'
// plugins
import
'./permission'
// permission
import
'./permission'
// permission
import
*
as
auth
from
'./utils/auth.js'
import
*
as
auth
from
'./utils/auth.js'
import
config
from
'./config.js'
Vue
.
use
(
plugins
)
Vue
.
use
(
plugins
)
// 获取 access_token
// 获取 access_token
const
appid
=
'wx5d89065bb4725557'
const
secret
=
'7395e91baf6b49ca9b84b1301989f77e'
// 发起请求
// 发起请求
uni
.
request
({
uni
.
request
({
url
:
`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=
${
appid
}
&secret=
${
s
ecret
}
`
,
url
:
`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=
${
config
.
wxAppId
}
&secret=
${
config
.
wxS
ecret
}
`
,
success
:
function
(
res
)
{
success
:
function
(
res
)
{
auth
.
setAccessToken
(
res
.
data
.
access_token
)
auth
.
setAccessToken
(
res
.
data
.
access_token
)
},
},
...
...
pages.json
浏览文件 @
837cbfed
{
{
"pages"
:
[
"pages"
:
[
{
"path"
:
"pages/start"
,
"style"
:
{
"navigationBarTitleText"
:
"欢迎使用-小卤促销员平台"
}
},
{
{
"path"
:
"pages/login"
,
"path"
:
"pages/login"
,
"style"
:
{
"style"
:
{
...
@@ -7,9 +13,9 @@
...
@@ -7,9 +13,9 @@
}
}
},
},
{
{
"path"
:
"pages/
start
"
,
"path"
:
"pages/
register
"
,
"style"
:
{
"style"
:
{
"navigationBarTitleText"
:
"
欢迎使用-小卤促销员平台
"
"navigationBarTitleText"
:
"
促销员提交
"
}
}
},
},
{
{
...
@@ -30,12 +36,7 @@
...
@@ -30,12 +36,7 @@
"navigationBarTitleText"
:
"工作台"
"navigationBarTitleText"
:
"工作台"
}
}
},
},
{
"path"
:
"pages/register"
,
"style"
:
{
"navigationBarTitleText"
:
"注册"
}
},
{
{
"path"
:
"pages/mine/index"
,
"path"
:
"pages/mine/index"
,
"style"
:
{
"style"
:
{
...
...
pages/login.vue
浏览文件 @
837cbfed
...
@@ -48,38 +48,55 @@ export default {
...
@@ -48,38 +48,55 @@ export default {
},
},
methods
:
{
methods
:
{
// 手机号登录
// 手机号登录
getPhoneNumber
(
e
)
{
async
getPhoneNumber
(
e
)
{
this
.
$modal
.
loading
(
"登录中,请耐心等待..."
)
this
.
$modal
.
loading
(
"登录中,请耐心等待..."
)
// 通过微信小程序 API 获取手机号
// 通过微信小程序 API 获取手机号
uni
.
request
({
const
[,
phoneRes
]
=
await
uni
.
request
({
url
:
`https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=
${
getAccessToken
()}
`
,
url
:
`https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=
${
getAccessToken
()}
`
,
method
:
'POST'
,
method
:
'POST'
,
data
:
{
data
:
{
code
:
e
.
detail
.
code
code
:
e
.
detail
.
code
},
success
:
(
res
)
=>
{
console
.
log
(
'后端解密手机号成功,手机号为:'
,
res
);
storage
.
set
(
constant
.
loginPhone
,
res
.
data
.
phone_info
.
phoneNumber
)
this
.
$modal
.
closeLoading
()
this
.
$tab
.
reLaunch
(
'/pages/index'
)
},
fail
:
function
()
{
console
.
log
(
'后端解密手机号失败'
);
}
}
})
// 调用微信登录接口,获取 code
const
[,
loginRes
]
=
await
uni
.
login
({
provider
:
'weixin'
})
// 通过 code 获取 openid
const
[,
openRes
]
=
await
uni
.
request
({
url
:
`https://api.weixin.qq.com/sns/jscode2session?appid=
${
this
.
globalConfig
.
wxAppId
}
&secret=
${
this
.
globalConfig
.
wxSecret
}
&js_code=
${
loginRes
.
code
}
&grant_type=authorization_code`
});
});
// 获取用户信息-头像等
const
[,
userRes
]
=
await
uni
.
getUserInfo
({
provider
:
'weixin'
,
withCredentials
:
false
})
storage
.
set
(
constant
.
loginPhone
,
phoneRes
.
data
.
phone_info
.
phoneNumber
)
storage
.
set
(
constant
.
loginOpenId
,
openRes
.
data
.
openid
)
this
.
$store
.
commit
(
'SET_USER'
,
userRes
.
userInfo
)
this
.
$modal
.
closeLoading
()
this
.
$tab
.
reLaunch
(
'/pages/register'
)
},
},
// // 登录成功后,处理函数
fail
:
function
()
{
// async loginSuccess(result) {
console
.
log
(
'后端解密手机号失败'
);
// // 设置用户信息
// await this.$store.dispatch('GetInfo')
// await this.getAuth()
// this.$tab.reLaunch('/pages/index')
// },
// 登录成功后,开始获取各种权限
async
getAuth
()
{
// 获取地址位置
return
this
.
$store
.
dispatch
(
'GetLocation'
)
}
}
},
// // 登录成功后,处理函数
// async loginSuccess(result) {
// // 设置用户信息
// await this.$store.dispatch('GetInfo')
// await this.getAuth()
// this.$tab.reLaunch('/pages/index')
// },
// 登录成功后,开始获取各种权限
async
getAuth
()
{
// 获取地址位置
return
this
.
$store
.
dispatch
(
'GetLocation'
)
}
}
}
}
</
script
>
</
script
>
...
...
pages/register.vue
浏览文件 @
837cbfed
<
template
>
<
template
>
<view
class=
"normal-login-container"
>
<view
class=
"normal-register-container"
>
<view
class=
"logo-content align-center justify-center flex"
>
<!-- 基础表单校验 -->
<image
style=
"width: 100rpx;height: 100rpx;"
:src=
"globalConfig.appInfo.logo"
mode=
"widthFix"
>
<uni-forms
ref=
"valiForm"
</image>
:rules=
"rules"
<text
class=
"title"
>
若依移动端注册
</text>
:modelValue=
"formData"
>
</view>
<uni-forms-item
label=
"头像"
<view
class=
"login-form-content"
>
required
<view
class=
"input-item flex align-center"
>
name=
"avatar"
>
<view
class=
"iconfont icon-user icon"
></view>
<button
class=
"avatar"
<input
v-model=
"registerForm.username"
class=
"input"
type=
"text"
placeholder=
"请输入账号"
maxlength=
"30"
/>
open-type=
"chooseAvatar"
</view>
@
chooseavatar=
"chooseavatarFn"
>
<view
class=
"input-item flex align-center"
>
<img
class=
"avatar_img"
<view
class=
"iconfont icon-password icon"
></view>
:src=
"formData.avatarUrl"
/>
<input
v-model=
"registerForm.password"
type=
"password"
class=
"input"
placeholder=
"请输入密码"
maxlength=
"20"
/>
</button>
</view>
</uni-forms-item>
<view
class=
"input-item flex align-center"
>
<uni-forms-item
label=
"姓名"
<view
class=
"iconfont icon-password icon"
></view>
required
<input
v-model=
"registerForm.confirmPassword"
type=
"password"
class=
"input"
placeholder=
"请输入重复密码"
maxlength=
"20"
/>
name=
"name"
>
</view>
<uni-easyinput
v-model=
"formData.name"
<view
class=
"input-item flex align-center"
style=
"width: 60%;margin: 0px;"
v-if=
"captchaEnabled"
>
placeholder=
"请输入姓名"
/>
<view
class=
"iconfont icon-code icon"
></view>
</uni-forms-item>
<input
v-model=
"registerForm.code"
type=
"number"
class=
"input"
placeholder=
"请输入验证码"
maxlength=
"4"
/>
<uni-forms-item
label=
"身份证"
>
<view
class=
"login-code"
>
<view
class=
"id_card"
>
<image
:src=
"codeUrl"
@
click=
"getCode"
class=
"login-code-img"
></image>
<uni-file-picker
fileMediatype=
"image"
mode=
"grid"
limit=
"1"
return-type=
"object"
title=
"正面图片"
v-model=
"formData.idenFrontPhotoUrl"
@
select=
"selectIdenPhotoFn"
></uni-file-picker>
<uni-file-picker
fileMediatype=
"image"
mode=
"grid"
limit=
"1"
return-type=
"object"
title=
"反面图片"
v-model=
"formData.idenReversePhotoUrl"
@
select=
"selectIdenPhotoFn"
></uni-file-picker>
</view>
</view>
</view>
</uni-forms-item>
<view
class=
"action-btn"
>
<button
type=
"primary"
<button
@
click=
"handleRegister()"
class=
"register-btn cu-btn block bg-blue lg round"
>
注册
</button>
@
click=
"submit('valiForm')"
>
提交信息
</button>
</view>
</uni-forms>
</view>
<view
class=
"xieyi text-center"
>
<text
@
click=
"handleUserLogin"
class=
"text-blue"
>
使用已有账号登录
</text>
</view>
</view>
</view>
</
template
>
</
template
>
<
script
>
<
script
>
import
{
getCodeImg
,
register
}
from
'@/api/login'
import
{
mapGetters
}
from
'vuex'
import
{
submitUserInfo
}
from
'../api/login'
export
default
{
export
default
{
data
()
{
data
()
{
return
{
return
{
codeUrl
:
""
,
// 校验表单数据
captchaEnabled
:
true
,
formData
:
{
globalConfig
:
getApp
().
globalData
.
config
,
avatarUrl
:
''
,
registerForm
:
{
name
:
''
,
username
:
""
,
idenFrontPhotoUrl
:
[],
password
:
""
,
idenReversePhotoUrl
:
[],
confirmPassword
:
""
,
code
:
""
,
uuid
:
''
}
}
},
created
()
{
this
.
getCode
()
},
methods
:
{
// 用户登录
handleUserLogin
()
{
this
.
$tab
.
navigateTo
(
`/pages/login`
)
},
},
// 获取图形验证码
// 校验规则
getCode
()
{
rules
:
{
getCodeImg
().
then
(
res
=>
{
avatarUrl
:
{
this
.
captchaEnabled
=
res
.
captchaEnabled
===
undefined
?
true
:
res
.
captchaEnabled
rules
:
[{
if
(
this
.
captchaEnabled
)
{
required
:
true
,
this
.
codeUrl
=
'data:image/gif;base64,'
+
res
.
img
errorMessage
:
'头像不能为空'
this
.
registerForm
.
uuid
=
res
.
uuid
}]
}
},
})
name
:
{
},
rules
:
[{
// 注册方法
required
:
true
,
async
handleRegister
()
{
errorMessage
:
'名字不能为空'
if
(
this
.
registerForm
.
username
===
""
)
{
}]
this
.
$modal
.
msgError
(
"请输入您的账号"
)
}
else
if
(
this
.
registerForm
.
password
===
""
)
{
this
.
$modal
.
msgError
(
"请输入您的密码"
)
}
else
if
(
this
.
registerForm
.
confirmPassword
===
""
)
{
this
.
$modal
.
msgError
(
"请再次输入您的密码"
)
}
else
if
(
this
.
registerForm
.
password
!==
this
.
registerForm
.
confirmPassword
)
{
this
.
$modal
.
msgError
(
"两次输入的密码不一致"
)
}
else
if
(
this
.
registerForm
.
code
===
""
&&
this
.
captchaEnabled
)
{
this
.
$modal
.
msgError
(
"请输入验证码"
)
}
else
{
this
.
$modal
.
loading
(
"注册中,请耐心等待..."
)
this
.
register
()
}
}
},
},
// 用户注册
async
register
()
{
register
(
this
.
registerForm
).
then
(
res
=>
{
this
.
$modal
.
closeLoading
()
uni
.
showModal
({
title
:
"系统提示"
,
content
:
"恭喜你,您的账号 "
+
this
.
registerForm
.
username
+
" 注册成功!"
,
success
:
function
(
res
)
{
if
(
res
.
confirm
)
{
uni
.
redirectTo
({
url
:
`/pages/login`
});
}
}
})
}).
catch
(()
=>
{
if
(
this
.
captchaEnabled
)
{
this
.
getCode
()
}
})
},
// 注册成功后,处理函数
registerSuccess
(
result
)
{
// 设置用户信息
this
.
$store
.
dispatch
(
'GetInfo'
).
then
(
res
=>
{
this
.
$tab
.
reLaunch
(
'/pages/index'
)
})
}
}
}
}
},
computed
:
{
...
mapGetters
([
'user'
])
},
methods
:
{
// 选择了头像
chooseavatarFn
(
obj
)
{
this
.
formData
.
avatarUrl
=
obj
.
detail
.
avatarUrl
},
// 选择了身份证
selectIdenPhotoFn
(
obj
)
{
// console.log(obj.tempFiles[0]) // 文件对象-需要自己上传 OSS
},
submit
(
ref
)
{
this
.
$refs
[
ref
].
validate
().
then
(
res
=>
{
console
.
log
(
'success'
,
res
);
uni
.
showToast
({
title
:
`校验通过`
})
}).
catch
(
err
=>
{
console
.
log
(
'err'
,
err
);
})
},
},
created
()
{
this
.
formData
.
avatarUrl
=
this
.
user
.
avatarUrl
this
.
formData
.
name
=
this
.
user
.
nickName
},
}
</
script
>
</
script
>
<
style
lang=
"scss"
>
<
style
lang=
"scss"
>
page
{
page
{
background-color
:
#ffffff
;
background-color
:
#ffffff
;
}
.normal-register-container
{
width
:
100%
;
padding
:
40rpx
;
// 头像
.avatar
{
background
:
transparent
;
float
:
left
;
}
}
.normal-login-container
{
.
avatar
:
:
after
{
width
:
100%
;
border
:
none
;
}
.logo-content
{
.avatar_img
{
width
:
100%
;
width
:
120rpx
;
font-size
:
21px
;
height
:
120rpx
;
text-align
:
center
;
}
padding-top
:
15%
;
image
{
// 身份证
border-radius
:
4px
;
.id_card
{
}
display
:
flex
;
justify-content
:
space-between
;
}
.title
{
.uni-file-picker__header
text
:last-of-type
{
margin-left
:
10px
;
display
:
none
;
}
}
.uni-file-picker__container
{
padding
:
40rpx
;
padding-top
:
10rpx
;
}
.file-picker__box
{
height
:
200rpx
!
important
;
width
:
100%
!
important
;
background-color
:
#f1f1f1
;
.icon-add
{
background-color
:
#c9c9c9
;
}
}
}
.login-form-content
{
.logo-content
{
text-align
:
center
;
width
:
100%
;
margin
:
20px
auto
;
font-size
:
21px
;
margin-top
:
15%
;
text-align
:
center
;
width
:
80%
;
padding-top
:
15%
;
.input-item
{
margin
:
20px
auto
;
background-color
:
#f5f6f7
;
height
:
45px
;
border-radius
:
20px
;
.icon
{
font-size
:
38rpx
;
margin-left
:
10px
;
color
:
#999
;
}
.input
{
image
{
width
:
100%
;
border-radius
:
4px
;
font-size
:
14px
;
}
line-height
:
20px
;
text-align
:
left
;
padding-left
:
15px
;
}
}
.title
{
margin-left
:
10px
;
}
}
.login-form-content
{
text-align
:
center
;
margin
:
20px
auto
;
margin-top
:
15%
;
width
:
80%
;
.register-btn
{
.input-item
{
margin-top
:
40px
;
margin
:
20px
auto
;
height
:
45px
;
background-color
:
#f5f6f7
;
height
:
45px
;
border-radius
:
20px
;
.icon
{
font-size
:
38rpx
;
margin-left
:
10px
;
color
:
#999
;
}
}
.xieyi
{
.input
{
color
:
#333
;
width
:
100%
;
margin-top
:
20px
;
font-size
:
14px
;
line-height
:
20px
;
text-align
:
left
;
padding-left
:
15px
;
}
}
.login-code
{
}
.register-btn
{
margin-top
:
40px
;
height
:
45px
;
}
.xieyi
{
color
:
#333
;
margin-top
:
20px
;
}
.login-code
{
height
:
38px
;
float
:
right
;
.login-code-img
{
height
:
38px
;
height
:
38px
;
float
:
right
;
position
:
absolute
;
margin-left
:
10px
;
.login-code-img
{
width
:
200rpx
;
height
:
38px
;
position
:
absolute
;
margin-left
:
10px
;
width
:
200rpx
;
}
}
}
}
}
}
}
}
</
style
>
</
style
>
pages/start.vue
浏览文件 @
837cbfed
...
@@ -10,9 +10,11 @@ export default {
...
@@ -10,9 +10,11 @@ export default {
setTimeout
(()
=>
{
setTimeout
(()
=>
{
// this.$tab.redirectTo('/page_subject/pages/login')
// this.$tab.redirectTo('/page_subject/pages/login')
console
.
log
(
storage
.
get
(
constant
.
loginPhone
))
console
.
log
(
storage
.
get
(
constant
.
loginPhone
))
// TODO:下面重写:有手机号,判断注册信息填过没有,有就去首页,没有就去注册页
if
(
storage
.
get
(
constant
.
loginPhone
))
{
if
(
storage
.
get
(
constant
.
loginPhone
))
{
// 有存储过之前的登录手机号
// 有存储过之前的登录手机号+openId 也不对,需要注册成功,再去首页
this
.
$tab
.
switchTab
(
'/pages/index'
)
// this.$tab.switchTab('/pages/index')
this
.
$tab
.
redirectTo
(
'/pages/register'
)
}
else
{
}
else
{
this
.
$tab
.
redirectTo
(
'/pages/login'
)
this
.
$tab
.
redirectTo
(
'/pages/login'
)
}
}
...
...
store/getters.js
浏览文件 @
837cbfed
import
store
from
'@/store'
const
getters
=
{
const
getters
=
{
token
:
state
=>
state
.
user
.
token
,
token
:
state
=>
state
.
user
.
token
,
avatar
:
state
=>
state
.
user
.
avatar
,
avatar
:
state
=>
state
.
user
.
avatar
,
...
...
utils/constant.js
浏览文件 @
837cbfed
...
@@ -8,6 +8,7 @@ const constant = {
...
@@ -8,6 +8,7 @@ const constant = {
location
:
'vuex_location'
,
location
:
'vuex_location'
,
// 登录使用手机号
// 登录使用手机号
loginPhone
:
'vuex_login_phone'
,
loginPhone
:
'vuex_login_phone'
,
loginOpenId
:
'vuex_login_openid'
,
}
}
export
default
constant
export
default
constant
utils/storage.js
浏览文件 @
837cbfed
...
@@ -4,7 +4,7 @@ import constant from './constant'
...
@@ -4,7 +4,7 @@ import constant from './constant'
let
storageKey
=
'storage_data'
let
storageKey
=
'storage_data'
// 存储节点变量名
// 存储节点变量名
let
storageNodeKeys
=
[
constant
.
avatar
,
constant
.
name
,
constant
.
roles
,
constant
.
permissions
,
constant
.
user
,
constant
.
location
,
constant
.
loginPhone
]
let
storageNodeKeys
=
[
constant
.
avatar
,
constant
.
name
,
constant
.
roles
,
constant
.
permissions
,
constant
.
user
,
constant
.
location
,
constant
.
loginPhone
,
constant
.
loginOpenId
]
const
storage
=
{
const
storage
=
{
set
:
function
(
key
,
value
)
{
set
:
function
(
key
,
value
)
{
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论