Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
U
uni-app-ddh-shop
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zhanhai
uni-app-ddh-shop
Commits
4ea05d26
Commit
4ea05d26
authored
2 weeks ago
by
caimeng
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
APP账号注销需求完成
parent
cb551012
Changes
12
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
413 additions
and
258 deletions
+413
-258
App.vue
App.vue
+9
-2
api.js
config/api.js
+1
-1
manifest.json
manifest.json
+2
-2
common.js
server/common.js
+17
-0
prolist.vue
subPackage/prolist/prolist.vue
+35
-34
index.less
subPackage/setting/index.less
+15
-2
setting.vue
subPackage/setting/setting.vue
+286
-213
uni-popup-dialog.vue
...ni-popup/components/uni-popup-dialog/uni-popup-dialog.vue
+7
-2
index.js
utils/index.js
+15
-0
request.js
utils/request.js
+1
-1
修改日志.md
修改日志.md
+3
-1
多典花.md
多典花.md
+22
-0
No files found.
App.vue
View file @
4ea05d26
...
...
@@ -11,8 +11,15 @@ export default {
const
appStart
=
uni
.
getStorageSync
(
'appStart'
)
if
(
appStart
)
{
uni
.
switchTab
({
url
:
"/pages/index/index"
,
// uni.switchTab({
// url: "/pages/index/index",
// success: function () {
// plus.navigator.closeSplashscreen()
// }
// })
uni
.
navigateTo
({
url
:
"/subPackage/setting/setting"
,
success
:
function
()
{
plus
.
navigator
.
closeSplashscreen
()
}
...
...
This diff is collapsed.
Click to expand it.
config/api.js
View file @
4ea05d26
...
...
@@ -5,7 +5,7 @@
// 开发环境
const
BASE
=
{
development
:
{
common
:
"http://192.168.
2.8
:8080"
,
common
:
"http://192.168.
1.2
:8080"
,
event
:
'http://118.31.124.88:21111'
,
h5
:
'http://192.168.0.23:8080/index.html'
},
...
...
This diff is collapsed.
Click to expand it.
manifest.json
View file @
4ea05d26
...
...
@@ -2,8 +2,8 @@
"name"
:
"多典花"
,
"appid"
:
"__UNI__DE04B13"
,
"description"
:
""
,
"versionName"
:
"1.
0.9
"
,
"versionCode"
:
1
09
,
"versionName"
:
"1.
1.1
"
,
"versionCode"
:
1
11
,
"transformPx"
:
false
,
/*
5
+App特有相关
*/
"app-plus"
:
{
...
...
This diff is collapsed.
Click to expand it.
server/common.js
View file @
4ea05d26
...
...
@@ -106,4 +106,21 @@ export default {
async
getfaceResult
(
data
)
{
return
request
(
'/app/v1/resultByUni'
,
'POST'
,
data
);
},
/** 设置页面
* 注销前校验
*/
async
userLogoffPreCheck
(
data
)
{
return
request
(
'/app/user/userCancelPreCheck'
,
'POST'
,
data
);
},
/** 注销 */
async
userLogoff
(
data
)
{
return
request
(
'/app/user/userCancellation'
,
'POST'
,
data
);
},
/** 退出登录 */
async
userLogout
(
data
)
{
return
request
(
'/app/user/loginOut'
,
'POST'
,
data
);
},
}
This diff is collapsed.
Click to expand it.
subPackage/prolist/prolist.vue
View file @
4ea05d26
<
template
>
<view
class=
'pro-page'
>
<view
class=
'pro-mian'
>
<view
class=
'main-lien'
v-for=
"item in proList"
:key=
"item.protocolName"
@
click=
'goIndex(item)'
>
<view
class=
"line-left"
>
{{
item
.
protocolName
}}
</view>
<view
class=
"pro-page"
>
<view
class=
"pro-mian"
>
<view
class=
"main-lien"
v-for=
"item in proList"
:key=
"item.protocolName"
@
click=
"jump(item)"
>
<view
class=
"line-left"
>
{{
item
.
protocolName
}}
</view>
<view
class=
"line-right"
></view>
</view>
</view>
...
...
@@ -10,31 +15,27 @@
</
template
>
<
script
>
export
default
{
export
default
{
data
()
{
return
{
proList
:[]
}
proList
:
[],
};
},
onLoad
(
options
){
console
.
log
(
options
,
'65'
)
if
(
options
){
this
.
proList
=
JSON
.
parse
(
options
.
mydata
)
onLoad
(
options
)
{
this
.
buryingPoint
(
"app:prolist_pageView"
);
if
(
options
)
{
this
.
proList
=
JSON
.
parse
(
options
.
mydata
);
}
else
{
this
.
proList
=
JSON
.
parse
(
uni
.
getStorageSync
(
"APP-SETTING"
).
protocol
);
}
this
.
buryingPoint
(
'app:prolist_pageView'
)
},
methods
:
{
// 参考链接:https://blog.csdn.net/cscj2010/article/details/128236662
goIndex
(
item
){
plus
.
runtime
.
openWeb
(
item
.
protocolUrl
)
}
jump
(
item
)
{
plus
.
runtime
.
openWeb
(
item
.
protocolUrl
);
},
onShow
(){
}
}
},
};
</
script
>
<
style
src=
'./index.less'
lang=
"less"
scoped
></
style
>
\ No newline at end of file
<
style
src=
"./index.less"
lang=
"less"
scoped
></
style
>
This diff is collapsed.
Click to expand it.
subPackage/setting/index.less
View file @
4ea05d26
.set-page {
width: 100%;
height: 100vh;
// min-height: 1624rpx;
background: #F7FAFF;
.set-main {
...
...
@@ -207,4 +206,18 @@
}
}
// uni-popup 样式
:deep(.uni-popup-dialog) {
.uni-dialog-title {
display: none;
}
.uni-dialog-content {
text-align: center;
}
}
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
subPackage/setting/setting.vue
View file @
4ea05d26
<
template
>
<view
class=
'set-page'
>
<view
class=
'set-main'
>
<view
class=
'main-line'
>
<view
class=
'line-item'
@
click=
'getProtol'
>
<view
class=
'item-text'
>
相关协议
</view>
<view
class=
'item-icon'
></view>
</view>
<view
class=
'line-item'
@
click=
'cancelSize'
>
<view
class=
'item-text'
>
清除缓存
</view>
<view
class=
'item-r'
>
<view
class=
'r-text'
>
{{
cacheSize
}}
</view>
<i
class=
'r-icon'
></i>
</view>
</view>
<view
class=
'line-item'
>
<view
class=
'item-text'
>
当前版本
</view>
<view
class=
'item-version'
>
{{
versionNumber
}}
</view>
</view>
</view>
<view
v-show=
"token != ''"
>
<view
class=
'line-des'
>
如果您今后不打算使用APP,您可以选择
<view
class=
'des-x'
@
click=
'goCancel'
>
注销账号
</view>
</view>
<view
class=
'line-tips'
>
注:该操作不可恢复
</view>
<view
class=
"set-page"
>
<view
class=
"set-main"
>
<view
class=
"main-line"
>
<view
class=
"line-item"
@
click=
"getProtol"
>
<view
class=
"item-text"
>
相关协议
</view>
<view
class=
"item-icon"
></view>
</view>
</view>
<view
v-show=
"token != ''"
class=
'set-footer'
@
click=
'goOut'
>
退出登录
</view>
<!-- 注销 -->
<view
:hidden=
"userFeedbackHidden"
class=
"popup_content"
>
<view
class=
"popup_title"
>
提示
</view>
<view
class=
'popup_main'
>
您一旦确认注销,您所有信息都会被清除,您确认注销账号?
</view>
<view
class=
'btn-main'
>
<view
class=
'btn-confirm'
@
click=
'cancelAccount()'
>
确认
</view>
<view
class=
'btn-cel'
@
click=
"hideDiv()"
>
取消
<view
class=
"line-item"
@
click=
"cancelSize"
>
<view
class=
"item-text"
>
清除缓存
</view>
<view
class=
"item-r"
>
<view
class=
"r-text"
>
{{
cacheSize
}}
</view>
<i
class=
"r-icon"
></i>
</view>
</view>
</view>
<view
class=
"popup_overlay"
:hidden=
"userFeedbackHidden"
></view>
<!-- 退出 -->
<view
:hidden=
"outHidden"
class=
"popup_content"
>
<view
class=
"popup_title"
>
提示
</view>
<view
class=
'popup_main'
>
您确定退出登录吗?
</view>
<view
class=
'btn-main'
>
<view
class=
'btn-confirm'
@
click=
'loginOut()'
>
确认
<view
class=
"line-item"
>
<view
class=
"item-text"
>
当前版本
</view>
<view
class=
"item-version"
>
{{
versionNumber
}}
</view>
</view>
<view
class=
'btn-cel'
@
click=
"loginCel()"
>
取消
</view>
<!-- 注销账号 -->
<view
class=
"line-des"
>
<text>
如果您今后不打算使用APP,您可以选择
</text
><text
class=
"des-x"
@
click=
"handleLogoffCheck"
>
注销账号
</text>
</view>
<view
class=
"line-tips"
>
注:该操作不可恢复
</view>
</view>
<view
class=
"popup_overlay"
:hidden=
"outHidden"
></view>
<view
class=
"set-footer"
@
click=
"handleLogout"
>
退出登录
</view>
<page-meta
:page-style=
"'overflow:' + (visible ? 'hidden' : 'visible')"
></page-meta>
<!-- 注销弹框 -->
<uni-popup
class=
"logoff-dialog"
ref=
"logoffDialog"
@
change=
"handlePopupChange"
type=
"dialog"
>
<uni-popup-dialog
type=
"info"
:cancelText=
"confirmText"
:confirmText=
"cancelText"
:content=
"message"
@
confirm=
"logoffCancel"
@
close=
"logoffConfirm"
></uni-popup-dialog>
</uni-popup>
<!-- 退出 -->
<uni-popup
class=
"logout-dialog"
ref=
"logoutDialog"
@
change=
"handlePopupChange"
type=
"dialog"
>
<uni-popup-dialog
type=
"info"
cancelText=
"取消"
confirmText=
"确认"
title=
"提示"
content=
"您确定退出登录吗?"
@
confirm=
"loginOut"
@
close=
"logoutCancel"
></uni-popup-dialog>
</uni-popup>
</view>
</
template
>
<
script
>
import
{
loadVersion
}
from
"@/utils"
;
import
API
from
"@/server/common.js"
;
export
default
{
data
()
{
return
{
userFeedbackHidden
:
true
,
//弹窗
outHidden
:
true
,
protocolList
:
[],
versionNumber
:
''
,
cacheSize
:
''
,
token
:
''
versionNumber
:
""
,
cacheSize
:
""
,
visible
:
false
,
message
:
"您一旦确认注销,您所有信息都会被清除,您确认注销账号?"
,
cancelText
:
"确认"
,
confirmText
:
"取消"
,
allowCancel
:
false
,
result
:
null
,
};
},
onShow
()
{
this
.
init
();
},
methods
:
{
// 页面初始化
async
init
()
{
try
{
// 埋点
this
.
buryingPoint
(
"app:setting_pageView"
);
// 获取设备版本号
this
.
versionNumber
=
await
loadVersion
();
// 初始化缓存
this
.
cacheSize
=
await
this
.
getDeviceCache
();
console
.
log
(
this
.
versionNumber
,
this
.
cacheSize
,
"初始化信息000000000000"
);
}
catch
(
err
)
{
console
.
log
(
err
,
"页面初始化报错"
);
}
},
onLoad
()
{
let
self
=
this
;
self
.
init
()
self
.
buryingPoint
(
'app:setting_pageView'
)
self
.
token
=
uni
.
getStorageSync
(
'token'
)
plus
.
cache
.
calculate
(
size
=>
{
toJSON
()
{},
// 获取设备缓存
getDeviceCache
()
{
let
cacheSize
;
return
new
Promise
((
resolve
)
=>
{
plus
.
cache
.
calculate
((
size
)
=>
{
if
(
size
<
1024
)
{
self
.
cacheSize
=
size
+
'B'
;
cacheSize
=
size
+
"B"
;
}
else
if
(
size
/
1024
>=
1
&&
size
/
1024
/
1024
<
1
)
{
self
.
cacheSize
=
Math
.
floor
((
size
/
1024
)
*
100
)
/
100
+
'KB'
;
cacheSize
=
Math
.
floor
((
size
/
1024
)
*
100
)
/
100
+
"KB"
;
}
else
if
(
size
/
1024
/
1024
>=
1
)
{
self
.
cacheSize
=
Math
.
floor
((
size
/
1024
/
1024
)
*
100
)
/
100
+
'M'
;
cacheSize
=
Math
.
floor
((
size
/
1024
/
1024
)
*
100
)
/
100
+
"M"
;
}
console
.
log
(
self
.
cacheSize
,
'size'
)
resolve
(
cacheSize
);
});
plus
.
runtime
.
getProperty
(
plus
.
runtime
.
appid
,
function
(
wgtinfo
)
{
if
(
wgtinfo
.
version
)
{
self
.
versionNumber
=
wgtinfo
.
version
;
}
else
{
self
.
versionNumber
=
plus
.
runtime
.
version
;
}
console
.
log
(
self
.
versionNumber
,
'version'
)
});
},
methods
:
{
toJSON
()
{
},
init
()
{
const
self
=
this
self
.
$request
(
'/app/version/getSetting'
,
'POST'
).
then
(
res
=>
{
const
{
protocol
,
phone
}
=
res
.
result
console
.
log
(
protocol
,
typeof
(
protocol
),
'setting'
)
if
(
protocol
)
{
console
.
log
(
typeof
(
protocol
),
'8888'
)
self
.
protocolList
=
JSON
.
parse
(
protocol
)
}
}).
catch
(
err
=>
{
console
.
log
(
err
,
'请求出错'
)
})
},
// 清除缓存
cancelSize
()
{
try
{
let
self
=
this
;
plus
.
cache
.
clear
(
res
=>
{
plus
.
cache
.
clear
(()
=>
{
uni
.
showToast
({
title
:
'清除成功!'
,
icon
:
'none'
,
title
:
"清除成功!"
,
icon
:
"none"
,
success
()
{
self
.
cacheSize
=
'0B'
;
}
self
.
cacheSize
=
"0B"
;
},
});
});
})
}
catch
(
error
)
{
console
.
log
(
error
,
"清除缓存出错"
);
}
},
// 跳转到协议列表页面
getProtol
()
{
uni
.
navigateTo
({
url
:
'/subPackage/prolist/prolist?mydata='
+
encodeURIComponent
(
JSON
.
stringify
(
this
.
protocolList
))
})
url
:
"/subPackage/prolist/prolist"
,
});
},
goCancel
()
{
this
.
userFeedbackHidden
=
false
handlePopupChange
(
e
)
{
console
.
log
(
e
,
"弹窗变化"
);
this
.
visible
=
e
.
show
;
},
goOut
()
{
// this.userHidden=false
this
.
outHidden
=
false
const
pages
=
getCurrentPages
();
console
.
log
(
pages
.
length
,
'写'
)
pages
.
forEach
(
page
=>
{
console
.
log
(
page
.
route
,
'路由信息'
)
})
// 账户注销前校验
async
handleLogoffCheck
()
{
try
{
const
res
=
await
API
.
userLogoffPreCheck
();
if
(
res
.
success
)
{
// res.result.status = "APPLY_LOAN";
const
{
tips
,
status
}
=
res
.
result
;
this
.
result
=
res
.
result
;
this
.
message
=
tips
;
},
cancelAccount
()
{
//注销账号
const
self
=
this
self
.
$request
(
'/app/user/userCancellation'
,
'POST'
).
then
(
res
=>
{
console
.
log
(
res
,
'myinit'
);
const
{
die
}
=
res
.
result
console
.
log
(
die
,
'die'
)
if
(
die
==
true
)
{
console
.
log
(
die
,
'die2'
)
self
.
userFeedbackHidden
=
false
uni
.
removeStorageSync
(
'token'
)
this
.
Go
(
'uni:/pages/index/index'
,
'tab'
)
switch
(
status
)
{
case
"APPLY_LOAN"
:
this
.
cancelText
=
"查看进度"
;
this
.
confirmText
=
"取消"
;
break
;
case
"NEED_REPAYMENT"
:
this
.
cancelText
=
"查看账单"
;
this
.
confirmText
=
"取消"
;
break
;
default
:
this
.
cancelText
=
"取消"
;
this
.
confirmText
=
"确认"
;
break
;
}
this
.
$refs
.
logoffDialog
.
open
();
}
else
{
uni
.
showToast
({
title
:
res
.
message
,
icon
:
"none"
,
});
}
}
catch
(
err
)
{
console
.
log
(
err
,
"注销前校验报错"
);
}
})
},
// 注销账号确认
async
logoffConfirm
()
{
try
{
const
{
status
}
=
this
.
result
;
switch
(
status
)
{
case
"APPLY_LOAN"
:
case
"NEED_REPAYMENT"
:
this
.
$refs
.
logoffDialog
.
close
();
break
;
default
:
const
res
=
await
API
.
userLogoff
();
if
(
res
.
success
)
{
uni
.
setTabBarItem
({
index
:
1
,
visible
:
false
,
});
uni
.
removeStorageSync
(
"token"
);
this
.
$refs
.
logoffDialog
.
close
();
this
.
Go
(
"uni:/pages/index/index"
,
"tab"
);
}
break
;
}
}
catch
(
err
)
{
console
.
log
(
err
,
"注销账号报错"
);
}
},
loginOut
()
{
const
pages
=
getCurrentPages
();
// 注销账号取消
logoffCancel
()
{
try
{
this
.
result
.
jumpPath
=
"bill"
;
const
{
status
,
jumpPath
}
=
this
.
result
;
switch
(
status
)
{
case
"APPLY_LOAN"
:
case
"NEED_REPAYMENT"
:
const
config
=
JSON
.
parse
(
uni
.
getStorageSync
(
"APP-SETTING"
));
const
timestamp
=
new
Date
().
getTime
();
const
token
=
uni
.
getStorageSync
(
"tokenFinance"
);
const
mobile
=
uni
.
getStorageSync
(
"l-mobile"
);
const
$src
=
config
[
"h5Url"
]
+
`?token=
${
token
}
&mobile=
${
mobile
}
×tamp=
${
timestamp
}
#/
${
jumpPath
}
`
;
const
newSrc
=
$src
.
split
(
"?"
);
const
targetSrc
=
`
${
newSrc
[
0
]}
?
${
encodeURIComponent
(
newSrc
[
1
])}
`
;
pages
.
forEach
(
page
=>
{
console
.
log
(
page
,
'页面'
)
const
isWebView
=
page
.
$getAppWebview
();
if
(
isWebView
)
{
let
currentPages
=
page
.
$getAppWebview
()
let
children
=
isWebView
.
children
()
if
(
children
.
length
)
{
children
[
0
].
close
()
uni
.
navigateTo
({
url
:
`/pages/web/websrc?url=
${
targetSrc
}
`
,
});
break
;
default
:
this
.
$refs
.
logoffDialog
.
close
();
break
;
}
}
catch
(
err
)
{
console
.
log
(
err
);
}
})
},
// 退出登录弹框展示
handleLogout
()
{
this
.
$refs
.
logoutDialog
.
open
();
},
//退出登录
const
self
=
this
console
.
log
(
333
)
self
.
$request
(
'/app/user/loginOut'
,
'POST'
).
then
(
res
=>
{
console
.
log
(
res
,
'logout'
);
// 退出登录确认
async
loginOut
()
{
try
{
const
res
=
await
API
.
userLogout
();
if
(
res
.
success
)
{
uni
.
setTabBarItem
({
index
:
1
,
visible
:
false
})
self
.
outHidden
=
false
uni
.
removeStorageSync
(
'token'
)
this
.
Go
(
'uni:/pages/index/index'
,
'tab'
)
})
},
loginCel
()
{
this
.
outHidden
=
true
visible
:
false
,
});
this
.
logoutCancel
();
uni
.
showToast
({
title
:
"退出登录成功"
,
icon
:
"success"
,
});
setTimeout
(()
=>
{
uni
.
removeStorageSync
(
"token"
);
uni
.
navigateBack
();
},
1000
);
}
}
catch
(
err
)
{
console
.
log
(
err
,
"退出登录报错"
);
}
},
hideDiv
()
{
//隐藏弹窗
this
.
userFeedbackHidden
=
true
this
.
userHidden
=
true
this
.
outHidden
=
true
// 退出登录取消
logoutCancel
()
{
this
.
$refs
.
logoutDialog
.
close
();
},
},
onShow
()
{
this
.
init
()
this
.
token
=
uni
.
getStorageSync
(
'token'
)
}
}
};
</
script
>
<
style
src=
'./index.less'
lang=
"less"
scoped
></
style
>
<
style
src=
"./index.less"
lang=
"less"
></
style
>
This diff is collapsed.
Click to expand it.
uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue
View file @
4ea05d26
<
template
>
<view
class=
"uni-popup-dialog"
>
<view
class=
"uni-dialog-title"
>
<view
v-if=
"showTitle"
class=
"uni-dialog-title"
>
<text
class=
"uni-dialog-title-text"
:class=
"['uni-popup__'+dialogType]"
>
{{
titleText
}}
</text>
</view>
<view
v-if=
"mode === 'base'"
class=
"uni-dialog-content"
>
...
...
@@ -63,6 +63,10 @@
mixins
:
[
popup
],
emits
:
[
'confirm'
,
'close'
,
'update:modelValue'
,
'input'
],
props
:
{
showTitle
:
{
type
:
Boolean
,
default
:
true
},
inputType
:
{
type
:
String
,
default
:
'text'
...
...
@@ -244,6 +248,7 @@
justify-content
:
center
;
align-items
:
center
;
padding
:
20px
;
text-align
:
center
;
}
.uni-dialog-content-text
{
...
...
This diff is collapsed.
Click to expand it.
utils/index.js
View file @
4ea05d26
...
...
@@ -226,3 +226,18 @@ export const loadLocation = () => {
})
})
}
/** 获取设备版本号 */
export
const
loadVersion
=
()
=>
{
let
versionNumber
;
return
new
Promise
((
resolve
,
reject
)
=>
{
plus
.
runtime
.
getProperty
(
plus
.
runtime
.
appid
,
function
(
wgtinfo
)
{
if
(
wgtinfo
.
version
)
{
versionNumber
=
wgtinfo
.
version
;
}
else
{
versionNumber
=
plus
.
runtime
.
version
;
}
resolve
(
versionNumber
)
});
});
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
utils/request.js
View file @
4ea05d26
...
...
@@ -33,7 +33,7 @@ const request = async (url, type, data) => {
data
:
{
...
data
},
timeout
:
5
000
,
timeout
:
10
000
,
header
:
{
Accept
:
"application/json;charset=UTF-8"
,
"Content-Type"
:
"application/json;charset=UTF-8"
,
...
...
This diff is collapsed.
Click to expand it.
修改日志.md
View file @
4ea05d26
...
...
@@ -3,7 +3,9 @@
1.
manifest.json 里面去掉实名认证的勾选
2.
删除uni-cloud云文件夹
3.
实名认证H5页面,对uni实名认证做兼容处理(或者不让后台配置uni实名认证)
2.
#### 2025-03-20
1.
设置页面注销前校验检查
...
...
This diff is collapsed.
Click to expand it.
多典花.md
0 → 100644
View file @
4ea05d26
#### 2025-03-13
1.
移除UNI的实名认证
1.
manifest.json 里面去掉实名认证的勾选
2.
删除uni-cloud云文件夹
3.
实名认证H5页面,对uni实名认证做兼容处理(或者不让后台配置uni实名认证)
2.
#### 待做需求
1.
优化APP更新
1.
需支持强更新、热更新
2.
更新设置需在后台配置
2.
代码优化
1.
埋点方法
2.
页面跳转方法
3.
vuex
4.
缓存
5.
项目配置
3.
\ No newline at end of file
This diff is collapsed.
Click to expand it.
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