小说小程序前端代码仓库(小程序)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

232 lines
4.8 KiB

<template>
<view class="page">
<navbar title="新建章节" leftClick @leftClick="$utils.navigateBack" />
<view class="form-box top-fixed">
<view class="form-item">
<text class="required">*</text>
<text class="label">章节名称</text>
<input class="input" type="text" placeholder='请输入章节号与章节名。例如:"第十章天降奇缘"' v-model="form.title" />
</view>
<view class="form-item">
<text class="required">*</text>
<text class="label">章节内容</text>
<textarea class="textarea" placeholder="请输入章节内容" v-model="form.content" />
</view>
</view>
<view class="footer-btns">
<button class="btn save-btn" @click="onSave">保存</button>
<button class="btn publish-btn" @click="onPublish">发布</button>
</view>
</view>
</template>
<script>
export default {
data() {
return {
formats: {},
form: {
title: '',
content: '',
},
}
},
onLoad() {
},
methods: {
onInput(e){
console.log(e.detail);
},
onEditorReady() {
uni.createSelectorQuery().select('#editor').context((res) => {
this.editorCtx = res.context
}).exec()
},
undo() {
this.editorCtx.undo()
},
redo() {
this.editorCtx.redo()
},
format(e) {
let {
name,
value
} = e.target.dataset
if (!name) return
// console.log('format', name, value)
this.editorCtx.format(name, value)
},
onStatusChange(e) {
const formats = e.detail
this.formats = formats
},
insertDivider() {
this.editorCtx.insertDivider({
success: function() {
console.log('insert divider success')
}
})
},
clear() {
uni.showModal({
title: '清空编辑器',
content: '确定清空编辑器全部内容?',
success: res => {
if (res.confirm) {
this.editorCtx.clear({
success: function(res) {
console.log("clear success")
}
})
}
}
})
},
removeFormat() {
this.editorCtx.removeFormat()
},
insertDate() {
const date = new Date()
const formatDate = `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()}`
this.editorCtx.insertText({
text: formatDate
})
},
insertImage() {
uni.chooseImage({
count: 1,
success: (res) => {
this.editorCtx.insertImage({
src: res.tempFilePaths[0],
alt: '图像',
success: function() {
console.log('insert image success')
}
})
}
})
},
onSave() {
// 保存逻辑
const newChapter = {
title: this.form.title,
content: this.form.content
};
// 获取原有章节
let chapters = uni.getStorageSync('chapters') || [];
chapters.push(newChapter);
uni.setStorageSync('chapters', chapters);
// 跳转并传递参数
uni.redirectTo({
url: '/pages_order/novel/chapterList?fromSave=1'
});
},
onPublish() {
// 发布逻辑
const newChapter = {
title: this.form.title,
content: this.form.content,
time: Date.now()
};
// 保存到已发布章节
let publishedChapters = uni.getStorageSync('publishedChapters') || [];
publishedChapters.push(newChapter);
uni.setStorageSync('publishedChapters', publishedChapters);
// 跳转到bookshelf作品tab并弹窗
uni.redirectTo({
url: '/pages/index/bookshelf?fromPublish=1'
});
},
}
}
</script>
<style scoped lang="scss">
.page {
margin-top: -920rpx;
margin-left: 30rpx;
margin-right: 30rpx;
min-height: 100vh;
background: #f7f8fa;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.form-box {
background: #fff;
margin: 0;
padding: 0 32rpx 0 32rpx;
border-radius: 0;
position: relative;
}
.top-fixed {
margin-top: 0;
}
.form-item {
display: flex;
flex-direction: column;
margin-top: 32rpx;
position: relative;
}
.label {
font-size: 28rpx;
color: #222;
margin-bottom: 12rpx;
margin-left: 32rpx;
}
.required {
color: #f44;
position: absolute;
left: 0;
top: 0;
font-size: 32rpx;
}
.input {
border: none;
border-bottom: 1rpx solid #eee;
font-size: 28rpx;
padding: 16rpx 0;
background: transparent;
}
.textarea {
min-height: 180rpx;
border: none;
border-bottom: 1rpx solid #eee;
font-size: 28rpx;
padding: 16rpx 0;
background: transparent;
resize: none;
}
.footer-btns {
position: fixed;
left: 0;
bottom: 0;
width: 100vw;
background: #fff;
display: flex;
justify-content: space-between;
padding: 24rpx 48rpx 32rpx 48rpx;
box-sizing: border-box;
z-index: 10;
box-shadow: 0 -2rpx 12rpx rgba(0,0,0,0.03);
}
.btn {
flex: 1;
height: 80rpx;
font-size: 32rpx;
border-radius: 40rpx;
margin: 0 12rpx;
font-weight: 500;
}
.save-btn {
background: #fff;
color: #0a225f;
border: 2rpx solid #0a225f;
}
.publish-btn {
background: #0a225f;
color: #fff;
border: none;
}
</style>