Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
C
center-book
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
center-book
Commits
79d2dbd6
提交
79d2dbd6
authored
6月 17, 2024
作者:
王鹏飞
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
chore: update
上级
18db76fd
显示空白字符变更
内嵌
并排
正在显示
9 个修改的文件
包含
348 行增加
和
224 行删除
+348
-224
package-lock.json
package-lock.json
+0
-1
index.jsx
src/layout/index.jsx
+5
-1
index.css
src/pages/css/index.css
+0
-28
index.css
src/pages/user-module/css/index.css
+0
-105
baseRouter.jsx
src/routes/baseRouter.jsx
+0
-31
index.jsx
src/routes/index.jsx
+3
-39
lazyLoadAndDelay.jsx
src/routes/lazyLoadAndDelay.jsx
+13
-18
routes.jsx
src/routes/routes.jsx
+326
-0
user.js
src/store/modules/user.js
+1
-1
没有找到文件。
package-lock.json
浏览文件 @
79d2dbd6
...
...
@@ -11,7 +11,6 @@
"@ant-design/icons"
:
"^5.3.7"
,
"@fortaine/fetch-event-source"
:
"^3.0.6"
,
"@reduxjs/toolkit"
:
"^1.9.7"
,
"@rollup/rollup-linux-x64-gnu"
:
"*"
,
"@wangeditor/editor"
:
"^5.1.23"
,
"@wangeditor/editor-for-react"
:
"^1.0.6"
,
"@wangeditor/plugin-link-card"
:
"^1.0.0"
,
...
...
src/layout/index.jsx
浏览文件 @
79d2dbd6
import
{
useState
,
useEffect
}
from
'react'
import
{
useState
,
useEffect
,
Suspense
}
from
'react'
import
{
Layout
,
Flex
}
from
'antd'
import
{
Outlet
,
Link
}
from
'react-router-dom'
import
{
useDispatch
}
from
'react-redux'
...
...
@@ -66,16 +66,20 @@ export default function AppLayout() {
</
Link
>
</
div
>
<
Menu
menuList=
{
menuList
}
></
Menu
>
{
menuList
.
length
?
(
<
Flex
align=
"center"
gap=
"small"
>
<
Message
></
Message
>
<
User
></
User
>
<
Logout
></
Logout
>
</
Flex
>
)
:
null
}
</
Header
>
<
Breadcrumb
menuList=
{
menuList
}
></
Breadcrumb
>
</
div
>
<
Content
className=
"layout-content"
>
<
Suspense
>
<
Outlet
/>
</
Suspense
>
</
Content
>
</
Layout
>
)
...
...
src/pages/css/index.css
deleted
100644 → 0
浏览文件 @
18db76fd
.ant-modal
.ant-modal-close
{
inset-inline-end
:
initial
;
}
.delModal
.ant-btn-primary
,
.footer
.ant-btn-primary
{
background
:
#aa1941
;
border-radius
:
4px
;
color
:
#ffffff
;
font-size
:
14px
;
}
.delModal
.ant-btn-primary
:hover
,
.footer
.ant-btn-primary
:hover
{
background
:
#aa194283
!important
;
}
.delModal
.ant-btn-default
,
.footer
.ant-btn-default
{
background
:
#ffffff
;
border-radius
:
4px
;
border
:
1px
solid
#aa1941
;
font-size
:
14px
;
color
:
#aa1941
;
}
.delModal
.ant-btn-default
:hover
,
.footer
.ant-btn-default
:hover
{
background
:
#ffffff7
c
!important
;
border-color
:
#aa194283
!important
;
color
:
#aa194283
!important
;
}
src/pages/user-module/css/index.css
deleted
100644 → 0
浏览文件 @
18db76fd
.normal-container
{
width
:
calc
(
100%
-
50px
);
margin
:
0
auto
;
}
.normal-container
.ant-form-item
,
.normal-container
.ant-form-item
span
,
.normal-container
Input
{
background
:
none
!important
;
}
.normal-container
.ant-Input
-affix-wrapper
{
border-radius
:
0
;
border
:
none
;
border-bottom
:
1px
solid
#bfbfbf
;
}
.normal-container
.ant-Input
-affix-wrapper
:focus
,
.normal-container
.ant-Input
-affix-wrapper
:focus-within
{
box-shadow
:
none
!important
;
}
.normal-container
.ant-Input
-affix-wrapper
:focus
{
border-color
:
#af1c40
;
}
.normal-container
.login-header
{
font-size
:
24px
;
font-family
:
'Source Han Sans CN'
;
font-weight
:
bold
;
font-style
:
italic
;
color
:
#000000
;
}
.normal-container
.img-logo
{
text-align
:
left
;
}
.normal-container
.img-logo
.img
{
display
:
block
;
margin-bottom
:
20px
;
}
.normal-container
.form-data-container
{
padding
:
50px
0px
0
;
}
.normal-container
.form-data-container
.captcha
{
height
:
100%
;
width
:
100%
;
box-sizing
:
border-box
;
border
:
1px
solid
#d8d8d8
;
border-radius
:
5px
;
cursor
:
pointer
;
}
.normal-container
.login-submit-btn
button
{
width
:
100%
;
border-radius
:
0
;
background-color
:
#af1c40
;
}
.captcha-container
{
width
:
450px
;
height
:
480px
;
background
:
#ffffff
;
box-shadow
:
0px
5px
18px
0px
rgba
(
139
,
139
,
139
,
0.33
);
width
:
calc
(
100%
-
50px
);
margin
:
0
auto
;
margin-bottom
:
20px
;
}
.captcha-container
.rotateWrap
button
{
width
:
300px
;
line-height
:
30px
;
}
.captcha-container
.rotateWrap
.top-s
{
font-size
:
12px
;
color
:
#ccc
;
display
:
block
;
text-align
:
center
;
margin-left
:
25px
;
margin-top
:
25px
;
padding-top
:
40px
;
margin-bottom
:
5px
;
}
.captcha-container
.rotateWrap
.top-x
{
font-size
:
18px
;
color
:
black
;
display
:
block
;
text-align
:
center
;
margin-bottom
:
45px
;
}
.captcha-container
.rotateWrap
.cuo
{
float
:
right
;
margin-right
:
10px
;
margin-top
:
5px
;
cursor
:
pointer
;
padding-top
:
20px
;
padding-right
:
20px
;
}
.captcha-container
.rotateWrap
.control-bor-active
{
border
:
1px
solid
#9b2a5d
;
}
.captcha-container
.rotateWrap
.slideDragBtn
{
background-color
:
#9b2a5d
;
}
.captcha-container
.rotateWrap
.slideDragBtn
.control-btn-ico
{
background
:
url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAAyCAYAAAATIfj2AAAAAXNSR0IArs4c6QAAAoRJREFUaAXtmb9OVFEQxjcQKGyspIPK2FvrA+gDAC8AL6C+gGIidvx5ABtqeABCDZSEFjtNLLTRwoLo+jvZJcBhvpnrLlPs5kzyhT3z5/vOzM1y757b6zVrE2gTaBNoE5iWCfT7/VnwAXwbonyeHbe/wgHunTfcF6KboLZPYWGQAGEKbyDb6yFcroxl62GxkwBhCq8jOQg5wr+JPQ0JREIWr5C7diP8ESj7TODhdXb3T9Sl8IY7QPgBOAfKDkISIwGyFF5D6q4L8Sfgp+oI/5u7VbEnizdWJgPxZaehS2LPOxFVSVm8lYy9RHzbaeorsQW70vdm8fqqRBGeA8dA2RGBmZCoSqAmhbeSsZeIL4LvQNl7u9L3QpbC66sOo4i/AH9FR8X/shNRlZTFW8nYS8TfioaK+wdYsit9L3UpvL4qUYRnwCFQdkpgPiSqEqhJ4a1k7CXij8AXoGzXrvS9kKXw+qrDKOLPQLkPKVvtRFQlQZbCW8nYS8RfqW7w/wKP7Urfm8Xrqw6jiO8DZXudSIwkCFN4DanbLoSXwB/R0dnt7O6rUXj/+84utrOFX3Gdi5ou7ixerc0UX4srU9zjfIdSeHUnRNhwyn+jLN6omeh+seMSiCDNpPAKuYEb0ZQ7ehav20wJIvwOKCtP46M+y6Xwug2x2el52qaZ6HfLhjsNEcziFXIDN6Lll+UJUHZEQN2LJDc1KbxS8CqA8PScKdDMClBWnrZHPfVJ4b26COZfNjs953I0k3LCmcVrXpGbToS9M+gL4hln2yPz3ty7+ZkNq9ceE/v2QTW0Zk6go9MZ1Fi8oTzCm6C2iX6DV78LLQ1mvGO9F97wCrWENoE2gTaBiZ/AP+8/LMb6T9MeAAAAAElFTkSuQmCC)
no-repeat
center
center
;
background-size
:
100%
100%
;
}
.captcha-container
.rotateWrap
body
{
-webkit-user-select
:
none
;
-moz-user-select
:
none
;
-ms-user-select
:
none
;
user-select
:
none
;
}
src/routes/baseRouter.jsx
deleted
100644 → 0
浏览文件 @
18db76fd
import
{
lazy
}
from
'react'
// import { Navigate } from 'react-router-dom'
import
{
authComponent
}
from
'./lazyLoadAndDelay'
// 添加一个固定的延迟时间,以便你可以看到加载状态
import
Layout
from
'@/layout/index'
const
baseRouter
=
[
{
path
:
'/'
,
element
:
authComponent
(
Layout
),
children
:
[
{
path
:
'/userinfo'
,
Component
:
lazy
(()
=>
import
(
'@/pages/user-module/userInfo'
))
}
]
},
{
path
:
'/login'
,
Component
:
lazy
(()
=>
import
(
'@/pages/user-module'
)),
children
:
[
{
index
:
true
,
Component
:
lazy
(()
=>
import
(
'@/pages/user-module/login'
))
}
]
}
// { path: '*', element: <Navigate to="/" /> }
]
export
default
baseRouter
src/routes/index.jsx
浏览文件 @
79d2dbd6
import
{
useEffect
}
from
'react'
import
{
useRoutes
,
Navigate
}
from
'react-router-dom'
import
{
filterAsyncRouter
}
from
'./lazyLoadAndDelay'
import
{
useSelector
}
from
'react-redux'
import
baseRouter
from
'./baseRouter'
const
addDefaultNavigation
=
(
menuRoutes
)
=>
{
menuRoutes
.
forEach
((
item
)
=>
{
const
children
=
item
.
children
if
(
children
&&
children
.
length
>
0
)
{
// 如果有子项,递归调用 addDefaultNavigation
addDefaultNavigation
(
children
)
// 在 children 数组的开头添加默认导航项
children
.
unshift
({
index
:
true
,
element
:
<
Navigate
to=
{
children
[
0
].
path
}
/>
})
}
})
return
menuRoutes
}
import
{
useRoutes
}
from
'react-router-dom'
import
routes
from
'./routes'
const
GetRoutesDynamic
=
()
=>
{
// 合并路由
const
{
menuRouter
}
=
useSelector
((
state
)
=>
state
.
user
)
useEffect
(()
=>
{
if
(
menuRouter
?.
length
)
{
const
menuRoutes
=
filterAsyncRouter
(
menuRouter
)
const
hasRoute
=
baseRouter
[
0
].
children
const
newMenus
=
addDefaultNavigation
(
menuRoutes
)
const
firstObj
=
{
index
:
true
,
element
:
<
Navigate
to=
{
newMenus
[
0
].
path
}
/>
}
baseRouter
[
0
].
children
=
[
firstObj
,
...
newMenus
,
...
hasRoute
]
}
},
[
menuRouter
])
console
.
log
(
baseRouter
)
const
element
=
useRoutes
(
baseRouter
)
const
element
=
useRoutes
(
routes
)
return
<>
{
element
}
</>
}
...
...
src/routes/lazyLoadAndDelay.jsx
浏览文件 @
79d2dbd6
import
{
lazy
,
Suspense
}
from
'react'
;
import
{
useRoutes
,
Navigate
}
from
'react-router-dom'
;
import
{
Spin
}
from
'antd'
;
import
{
lazy
,
Suspense
}
from
'react'
import
{
Navigate
}
from
'react-router-dom'
import
{
Spin
}
from
'antd'
/*** 实现路由懒加载* @param Comp 懒加载组件* @returns */
const
lazyLoad
=
(
Comp
)
=>
{
return
(
<
Suspense
fallback=
{
<
Spin
/>
}
>
<
Comp
/>
</
Suspense
>
);
};
const
delayForDemo
=
(
promise
)
=>
{
return
new
Promise
((
resolve
)
=>
{
setTimeout
(
resolve
,
2000
);
}).
then
(()
=>
promise
);
};
)
}
const
Modules
=
import
.
meta
.
glob
(
'../pages/**/*.jsx'
)
// 在vite中必须这样动态引入所有组件地址
const
lazyLoadModule
=
(
moduleName
)
=>
{
...
...
@@ -28,7 +23,7 @@ const lazyLoadModule = (moduleName) => {
}
const
filterAsyncRouter
=
(
menuData
)
=>
{
let
temp
=
[]
;
let
temp
=
[]
menuData
.
forEach
((
item
)
=>
{
const
route
=
{
name
:
item
.
name
,
...
...
@@ -40,14 +35,14 @@ const filterAsyncRouter = (menuData) => {
route
.
children
=
filterAsyncRouter
(
item
.
children
)
// 如有有嵌套路由则递归加载
}
temp
.
push
(
route
)
})
;
})
return
temp
;
return
temp
}
const
authComponent
=
(
Com
)
=>
{
const
token
=
localStorage
.
getItem
(
'kiwi.token'
)
||
true
;
return
token
?
lazyLoad
(
Com
)
:
<
Navigate
to=
'/login'
/>;
}
;
const
token
=
localStorage
.
getItem
(
'kiwi.token'
)
||
true
return
token
?
lazyLoad
(
Com
)
:
<
Navigate
to=
"/login"
/>
}
export
{
lazyLoad
,
lazyLoadModule
,
delayForDemo
,
authComponent
,
filterAsyncRouter
};
export
{
lazyLoad
,
lazyLoadModule
,
authComponent
,
filterAsyncRouter
}
src/routes/routes.jsx
0 → 100644
浏览文件 @
79d2dbd6
import
{
lazy
}
from
'react'
import
{
Navigate
}
from
'react-router-dom'
import
{
authComponent
}
from
'./lazyLoadAndDelay'
// 添加一个固定的延迟时间,以便你可以看到加载状态
import
Layout
from
'@/layout/index'
const
baseRouter
=
[
{
path
:
'/'
,
element
:
authComponent
(
Layout
),
children
:
[
{
index
:
true
,
element
:
<
Navigate
to=
"/books/management"
/>
},
// 书籍管理
{
path
:
'books'
,
title
:
'书籍管理'
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/index'
)),
children
:
[
{
index
:
true
,
element
:
<
Navigate
to=
"management"
/>
},
{
path
:
'management'
,
title
:
'写书管理'
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/management/index'
)),
children
:
[
{
index
:
true
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/management/list/index'
))
},
{
path
:
'list'
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/management/list/index'
))
},
{
path
:
'add-edit'
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/management/addedit/index'
))
},
{
path
:
'chapter'
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/section/index'
))
}
]
},
{
path
:
'audit'
,
title
:
'书籍审核'
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/audit/index'
)),
children
:
[
{
index
:
true
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/audit/table'
))
},
{
path
:
'/books/audit/dataset'
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/audit/table'
))
},
{
path
:
'/books/audit/detail'
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/audit/detail'
))
}
]
},
{
path
:
'/books/classify'
,
title
:
'书籍分类'
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/classify/index'
))
},
{
path
:
'/books/label'
,
title
:
'书籍标签'
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/label/index'
))
},
{
path
:
'/books/sale'
,
title
:
'在售书籍'
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/sale/index'
)),
children
:
[
{
index
:
true
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/sale/table'
))
},
{
path
:
'/books/sale/dataset'
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/sale/table'
))
},
{
path
:
'/books/sale/detail'
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/sale/edit'
))
},
{
path
:
'/books/sale/discussP'
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/sale/discussList/index'
))
},
{
path
:
'/books/sale/discuss-detail'
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/sale/discussDetail/index'
))
}
]
},
{
path
:
'/books/question-bank'
,
title
:
'题库管理'
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/question-bank/index'
))
},
{
path
:
'/books/discussion'
,
title
:
'讨论互动'
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/discussion/index'
))
},
{
path
:
'/books/order-management'
,
title
:
'订单管理'
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/order-management/index'
)),
children
:
[
{
index
:
true
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/order-management/tab/table'
))
},
{
path
:
'/books/order-management/dataset'
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/order-management/tab/table'
))
},
{
path
:
'/books/order-management/sale-statistics'
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/order-management/tab/salesStatistics'
))
}
]
},
{
path
:
'/books/design'
,
title
:
'在线设计'
,
Component
:
lazy
(()
=>
import
(
'@/pages/books/design/index'
))
}
]
},
// 用户管理
{
path
:
'member'
,
title
:
'用户管理'
,
Component
:
lazy
(()
=>
import
(
'@/pages/member/index'
)),
children
:
[
{
index
:
true
,
element
:
<
Navigate
to=
"/member/list"
/>
},
{
path
:
'/member/list'
,
title
:
'用户管理'
,
Component
:
lazy
(()
=>
import
(
'@/pages/member/list/index'
)),
children
:
[
{
index
:
true
,
Component
:
lazy
(()
=>
import
(
'@/pages/member/list/list'
))
},
{
path
:
'/member/list/query'
,
Component
:
lazy
(()
=>
import
(
'@/pages/member/list/list'
))
},
{
path
:
'/member/list/detail'
,
Component
:
lazy
(()
=>
import
(
'@/pages/member/detail/index'
))
}
]
},
{
path
:
'/member/userlevel'
,
title
:
'用户等级'
,
Component
:
lazy
(()
=>
import
(
'@/pages/member/userlevel/index'
))
}
]
},
// 广告管理
{
path
:
'advertisement'
,
title
:
'广告管理'
,
Component
:
lazy
(()
=>
import
(
'@/pages/advertisement/index'
)),
children
:
[
{
index
:
true
,
element
:
<
Navigate
to=
"/advertisement/advert"
/>
},
{
path
:
'/advertisement/advert'
,
title
:
'广告管理'
,
Component
:
lazy
(()
=>
import
(
'@/pages/advertisement/advert/index'
))
},
{
path
:
'/advertisement/adsense'
,
title
:
'广告位管理'
,
Component
:
lazy
(()
=>
import
(
'@/pages/advertisement/adsense/index'
))
}
]
},
// 系统设置
{
path
:
'setting'
,
title
:
'系统设置'
,
Component
:
lazy
(()
=>
import
(
'@/pages/setting/index'
)),
children
:
[
{
index
:
true
,
element
:
<
Navigate
to=
"/setting/applied"
/>
},
{
path
:
'/setting/help'
,
title
:
'帮助中心'
,
Component
:
lazy
(()
=>
import
(
'@/pages/setting/help/index'
)),
children
:
[
{
index
:
true
,
element
:
<
Navigate
to=
"/setting/help/list"
/>
},
{
path
:
'/setting/help/list'
,
Component
:
lazy
(()
=>
import
(
'@/pages/setting/help/table'
))
},
{
path
:
'/setting/help/addedit'
,
Component
:
lazy
(()
=>
import
(
'@/pages/setting/help/addedit/index'
))
}
]
},
{
path
:
'/setting/applied'
,
title
:
'应用管理'
,
Component
:
lazy
(()
=>
import
(
'@/pages/setting/applied/index'
))
},
{
path
:
'/setting/personalized-setting'
,
title
:
'个性化设置'
,
Component
:
lazy
(()
=>
import
(
'@/pages/setting/personalized-setting/index'
))
},
{
path
:
'/setting/point-management'
,
title
:
'积分管理'
,
Component
:
lazy
(()
=>
import
(
'@/pages/setting/point-management/index'
))
},
{
path
:
'/setting/app-version'
,
title
:
'APP版本管理'
,
Component
:
lazy
(()
=>
import
(
'@/pages/setting/app-version/index'
))
},
{
path
:
'/setting/coupon'
,
title
:
'优惠卷管理'
,
Component
:
lazy
(()
=>
import
(
'@/pages/setting/coupon/index'
))
},
{
path
:
'/setting/sensitive'
,
title
:
'敏感词搜索'
,
Component
:
lazy
(()
=>
import
(
'@/pages/setting/sensitive/index'
))
},
{
path
:
'/setting/feedback'
,
title
:
'意见反馈'
,
Component
:
lazy
(()
=>
import
(
'@/pages/setting/feedback/index'
))
}
]
},
// 权限管理
{
path
:
'jurisdiction'
,
title
:
'权限管理'
,
Component
:
lazy
(()
=>
import
(
'@/pages/jurisdiction/index'
)),
children
:
[
{
index
:
true
,
element
:
<
Navigate
to=
"/jurisdiction/role"
/>
},
{
path
:
'/jurisdiction/admin'
,
title
:
'管理员管理'
,
Component
:
lazy
(()
=>
import
(
'@/pages/jurisdiction/admin/index'
))
},
{
path
:
'/jurisdiction/role'
,
title
:
'角色管理'
,
Component
:
lazy
(()
=>
import
(
'@/pages/jurisdiction/role/index'
))
}
]
},
// 老师管理
{
path
:
'teacher'
,
title
:
'老师管理'
,
Component
:
lazy
(()
=>
import
(
'@/pages/teacher/index'
)),
children
:
[
{
index
:
true
,
element
:
<
Navigate
to=
"/teacher/list"
/>
},
{
path
:
'/teacher/list'
,
title
:
'老师管理'
,
Component
:
lazy
(()
=>
import
(
'@/pages/teacher/query/index'
))
}
]
},
{
path
:
'userinfo'
,
Component
:
lazy
(()
=>
import
(
'@/pages/user-module/userInfo'
))
}
]
},
{
path
:
'login'
,
Component
:
lazy
(()
=>
import
(
'@/pages/user-module'
)),
children
:
[
{
index
:
true
,
Component
:
lazy
(()
=>
import
(
'@/pages/user-module/login'
))
}
]
},
{
path
:
'*'
,
element
:
<
Navigate
to=
"/"
/>
}
]
export
default
baseRouter
src/store/modules/user.js
浏览文件 @
79d2dbd6
...
...
@@ -5,7 +5,7 @@ const initialState = {
menuRouter
:
[],
menuListRouter
:
[],
userInfo
:
{},
operationPermissionsList
:
{}
,
operationPermissionsList
:
[]
,
treeChapter
:
{
saveBookId
:
''
,
saveChapterId
:
''
,
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论