mirror of
https://github.com/ialley-workshop-open/uni-halo.git
synced 2025-05-19 01:50:15 +09:00
update: 移除node_modules依赖
This commit is contained in:
parent
d0b3a42c1d
commit
d22224e2fc
@ -1,207 +0,0 @@
|
|||||||
<template>
|
|
||||||
<tm-poup v-model="show" position="bottom" height="auto" @change="fnClose">
|
|
||||||
<view class="poup-head pa-24 text-align-center text-weight-b ">{{ title }}</view>
|
|
||||||
<view class="poup-body pa-24 pt-0 pb-0">
|
|
||||||
<view v-if="loading != 'success'" class="loading-wrap flex flex-center">
|
|
||||||
<view v-if="loading == 'loading'" class="loading">加载中...</view>
|
|
||||||
<view v-else class="error" @click="fnGetData()">加载失败,点击刷新!</view>
|
|
||||||
</view>
|
|
||||||
<block v-else>
|
|
||||||
<view v-if="total == 0" class="empty">无附件</view>
|
|
||||||
<scroll-view v-else class="poup-content" :enable-flex="true" :scroll-y="true" @touchmove.stop>
|
|
||||||
<view class="card-content">
|
|
||||||
<view class="card pa-12" v-for="(file, index) in dataList" :key="index" @click="fnOnSelect(file, index)">
|
|
||||||
<view class="card-inner round-3" :class="{ 'is-select': selectIndex == index }">
|
|
||||||
<cache-image v-if="file.isImage" class="cover" height="160rpx" :url="file.thumbPath" :fileMd5="file.thumbPath" mode="aspectFill"></cache-image>
|
|
||||||
<view v-else class="cover flex pl-46 pr-46 flex-center bg-gradient-blue-grey-accent text-align-center text-size-m">{{ file.mediaType }}</view>
|
|
||||||
|
|
||||||
<view class="name text-overflow text-size-m pa-12">{{ file.name }}</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</scroll-view>
|
|
||||||
</block>
|
|
||||||
</view>
|
|
||||||
<view class="poup-foot pa-30 pb-12 pt-0">
|
|
||||||
<!-- 分页 -->
|
|
||||||
<view v-if="total > queryParams.size" class="mt-36 pl-24 pr-24">
|
|
||||||
<tm-pagination color="bg-gradient-blue-accent" :page.sync="queryParams.page" :total="total" :totalVisible="5" @change="fnGetPagingData"></tm-pagination>
|
|
||||||
</view>
|
|
||||||
<view class=" flex flex-center mt-12">
|
|
||||||
<tm-button size="m" theme="bg-gradient-blue-accent" @click="fnSava()">确定选用</tm-button>
|
|
||||||
<tm-button size="m" theme="bg-gradient-orange-accent" @click="fnUpload()">上传</tm-button>
|
|
||||||
<tm-button size="m" theme="bg-gradient-blue-grey-accent" @click="fnClose(false)">关 闭</tm-button>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</tm-poup>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import { getAdminAccessToken } from '@/utils/auth.js';
|
|
||||||
|
|
||||||
import tmPoup from '@/tm-vuetify/components/tm-poup/tm-poup.vue';
|
|
||||||
import tmPagination from '@/tm-vuetify/components/tm-pagination/tm-pagination.vue';
|
|
||||||
import tmButton from '@/tm-vuetify/components/tm-button/tm-button.vue';
|
|
||||||
export default {
|
|
||||||
name: 'attachment-select',
|
|
||||||
components: { tmPoup, tmPagination, tmButton },
|
|
||||||
props: {
|
|
||||||
title: {
|
|
||||||
type: String,
|
|
||||||
default: '附件列表'
|
|
||||||
},
|
|
||||||
selectType: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
show: true,
|
|
||||||
loading: 'loading',
|
|
||||||
total: 0,
|
|
||||||
queryParams: {
|
|
||||||
size: 6,
|
|
||||||
page: 1
|
|
||||||
},
|
|
||||||
dataList: [],
|
|
||||||
select: null,
|
|
||||||
selectIndex: -1
|
|
||||||
};
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
this.fnGetData();
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
fnGetData() {
|
|
||||||
this.queryParams.page = 1;
|
|
||||||
this.fnGetPagingData(1);
|
|
||||||
},
|
|
||||||
fnGetPagingData(page) {
|
|
||||||
this.loading = 'loading';
|
|
||||||
const _params = {
|
|
||||||
...this.queryParams
|
|
||||||
};
|
|
||||||
_params.page = page - 1;
|
|
||||||
this.$httpApi.admin
|
|
||||||
.getAttachmentsByPage(_params)
|
|
||||||
.then(res => {
|
|
||||||
if (res.status == 200) {
|
|
||||||
this.total = res.data.total;
|
|
||||||
this.dataList = res.data.content.map(file => {
|
|
||||||
if (this.$utils.fnCheckIsFileType('image', file) && file.size / 1024 / 1024 > 2) {
|
|
||||||
file.isImage = false;
|
|
||||||
file.desc = '图片过大无法显示缩略图';
|
|
||||||
} else {
|
|
||||||
file.isImage = this.$utils.fnCheckIsFileType('image', file);
|
|
||||||
}
|
|
||||||
file.thumbPath = this.$utils.checkThumbnailUrl(file.thumbPath);
|
|
||||||
return file;
|
|
||||||
});
|
|
||||||
this.loading = 'success';
|
|
||||||
} else {
|
|
||||||
uni.$tm.toast('加载失败,请重试!');
|
|
||||||
this.loading = 'error';
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
console.error(err);
|
|
||||||
uni.$tm.toast('加载失败,请重试!');
|
|
||||||
this.loading = 'error';
|
|
||||||
});
|
|
||||||
},
|
|
||||||
fnOnSelect(file, index) {
|
|
||||||
this.select = file;
|
|
||||||
this.selectIndex = index;
|
|
||||||
},
|
|
||||||
fnSava() {
|
|
||||||
if (this.selectType) {
|
|
||||||
if (this.$utils.fnCheckIsFileType(this.selectType, this.select)) {
|
|
||||||
this.$emit('on-select', this.select);
|
|
||||||
} else {
|
|
||||||
uni.$tm.toast('该附件类型不符合!');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.$emit('on-select', this.select);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
fnClose(e) {
|
|
||||||
if (!e) {
|
|
||||||
this.$emit('on-close');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
fnUpload() {
|
|
||||||
uni.chooseImage({
|
|
||||||
count: 1,
|
|
||||||
success: res => {
|
|
||||||
uni.uploadFile({
|
|
||||||
filePath: res.tempFilePaths[0],
|
|
||||||
header: {
|
|
||||||
'admin-authorization': getAdminAccessToken()
|
|
||||||
},
|
|
||||||
url: this.$baseApiUrl + '/api/admin/attachments/upload',
|
|
||||||
name: 'file',
|
|
||||||
success: upladRes => {
|
|
||||||
const _uploadRes = JSON.parse(upladRes.data);
|
|
||||||
if (_uploadRes.status == 200) {
|
|
||||||
uni.$tm.toast('上传成功!');
|
|
||||||
this.fnGetData(1);
|
|
||||||
} else {
|
|
||||||
uni.$tm.toast(_uploadRes.message);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
fail: err => {
|
|
||||||
uni.$tm.toast(err.message);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped lang="scss">
|
|
||||||
.poup-head {
|
|
||||||
}
|
|
||||||
.poup-body {
|
|
||||||
height: 50vh;
|
|
||||||
}
|
|
||||||
.loading-wrap {
|
|
||||||
height: 50vh;
|
|
||||||
background-color: #fafafa;
|
|
||||||
}
|
|
||||||
.poup-content {
|
|
||||||
height: inherit;
|
|
||||||
box-sizing: border-box;
|
|
||||||
.card-content {
|
|
||||||
height: inherit;
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.card {
|
|
||||||
width: 50%;
|
|
||||||
box-sizing: border-box;
|
|
||||||
&-inner {
|
|
||||||
box-sizing: border-box;
|
|
||||||
overflow: hidden;
|
|
||||||
box-shadow: 0rpx 4rpx 24rpx rgba(0, 0, 0, 0.05);
|
|
||||||
border: 4rpx solid transparent;
|
|
||||||
&.is-select {
|
|
||||||
border-color: rgb(13, 141, 242);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.cover {
|
|
||||||
width: 100%;
|
|
||||||
height: 160rpx;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
.name {
|
|
||||||
color: #303133;
|
|
||||||
box-sizing: border-box;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,194 +0,0 @@
|
|||||||
<template>
|
|
||||||
<view class="bottom-tool-bar">
|
|
||||||
<tm-translate :auto="true" animation-name="fadeUp">
|
|
||||||
<view class="content flex">
|
|
||||||
<view class="input" @click="fnToComment()">
|
|
||||||
<text class="icon iconfont icon-edit"></text>
|
|
||||||
<text class="text">(*^▽^*)说点啥吧~</text>
|
|
||||||
</view>
|
|
||||||
<view class="right flex">
|
|
||||||
<!-- 点赞 -->
|
|
||||||
<view class="item likes" @click="fnDoLikes()">
|
|
||||||
<view class="iconfont icon-like"></view>
|
|
||||||
<view class="text">{{ tempPost.likes }}</view>
|
|
||||||
</view>
|
|
||||||
<!-- 评论 -->
|
|
||||||
<view class="item comment">
|
|
||||||
<view class="iconfont icon-comment-dots"></view>
|
|
||||||
<view class="text">{{ tempPost.commentCount }}</view>
|
|
||||||
</view>
|
|
||||||
<!-- 分享 -->
|
|
||||||
<view class="item share" @click="fnOnShare()"><text class="iconfont icon-share1"></text></view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</tm-translate>
|
|
||||||
|
|
||||||
<tm-shareSheet @change="fnOnShareChange" :actions="share.list" title="分享文章" v-model="share.show"></tm-shareSheet>
|
|
||||||
</view>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import tmTranslate from '@/tm-vuetify/components/tm-translate/tm-translate.vue';
|
|
||||||
import tmShareSheet from '@/tm-vuetify/components/tm-shareSheet/tm-shareSheet.vue';
|
|
||||||
export default {
|
|
||||||
name: 'bottom-tool-bar',
|
|
||||||
components: {
|
|
||||||
tmTranslate,
|
|
||||||
tmShareSheet
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
// 文章数据
|
|
||||||
post: {
|
|
||||||
type: Object,
|
|
||||||
default: () => {}
|
|
||||||
},
|
|
||||||
// 其他参数
|
|
||||||
params: {
|
|
||||||
type: Object,
|
|
||||||
default: () => {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
share: {
|
|
||||||
show: false,
|
|
||||||
list: [
|
|
||||||
[
|
|
||||||
{ name: '微信好友', bgcolor: '#07c160', icon: 'icon-weixin', color: 'white' },
|
|
||||||
{ name: '朋友圈', bgcolor: '#04c887', icon: 'icon-pengyouquan', color: 'white' },
|
|
||||||
{ name: '生成海报', bgcolor: '#1dc0fd', icon: 'icon-QQ', color: 'white' }
|
|
||||||
]
|
|
||||||
]
|
|
||||||
},
|
|
||||||
tempPost: {}
|
|
||||||
};
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
post: {
|
|
||||||
deep: true,
|
|
||||||
handler(val) {
|
|
||||||
console.log('watch', val);
|
|
||||||
this.tempPost = this.$utils.deepClone(val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
console.log(this.post);
|
|
||||||
this.tempPost = this.$utils.deepClone(this.post);
|
|
||||||
console.log(this.tempPost);
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
fnToComment() {
|
|
||||||
this.$Router.push({
|
|
||||||
path: '/pagesA/comment/comment',
|
|
||||||
query: {
|
|
||||||
postId: this.post.id,
|
|
||||||
parentId: 0,
|
|
||||||
title: this.post.title,
|
|
||||||
formPage: 'comment_list',
|
|
||||||
type: 'post'
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
fnDoLikes() {
|
|
||||||
this.$httpApi
|
|
||||||
.postLikePost(this.post.id)
|
|
||||||
.then(res => {
|
|
||||||
if (res.status == 200) {
|
|
||||||
uni.showToast({
|
|
||||||
icon: 'none',
|
|
||||||
title: '点赞成功'
|
|
||||||
});
|
|
||||||
this.tempPost.likes += 1;
|
|
||||||
} else {
|
|
||||||
uni.showToast({
|
|
||||||
icon: 'none',
|
|
||||||
title: res.message
|
|
||||||
});
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
console.log(err);
|
|
||||||
uni.showToast({
|
|
||||||
icon: 'none',
|
|
||||||
title: err.message
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
fnOnShare() {
|
|
||||||
// this.$emit('on-share');
|
|
||||||
this.share.show = true;
|
|
||||||
},
|
|
||||||
fnOnShareChange(e) {
|
|
||||||
console.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped lang="scss">
|
|
||||||
.bottom-tool-bar {
|
|
||||||
width: 100vw;
|
|
||||||
position: fixed;
|
|
||||||
left: 0;
|
|
||||||
bottom: 0;
|
|
||||||
z-index: 401;
|
|
||||||
|
|
||||||
::v-deep {
|
|
||||||
.tm-shareSheet-wk .uni-scroll-view-content {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.content {
|
|
||||||
width: 100%;
|
|
||||||
justify-content: space-between;
|
|
||||||
box-sizing: border-box;
|
|
||||||
padding: 24rpx;
|
|
||||||
background-color: #ffffff;
|
|
||||||
box-shadow: 0rpx -4rpx 24rpx rgba(0, 0, 0, 0.07);
|
|
||||||
border-radius: 24rpx 24rpx 0 0;
|
|
||||||
.input {
|
|
||||||
width: 280rpx;
|
|
||||||
padding: 12rpx 24rpx;
|
|
||||||
background-color: #f5f5f5;
|
|
||||||
border-radius: 60rpx;
|
|
||||||
font-size: 24rpx;
|
|
||||||
color: #666;
|
|
||||||
.icon {
|
|
||||||
}
|
|
||||||
.text {
|
|
||||||
padding-left: 8rpx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.right {
|
|
||||||
width: 0;
|
|
||||||
flex-grow: 1;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
padding-left: 24rpx;
|
|
||||||
.item {
|
|
||||||
margin-left: 24rpx;
|
|
||||||
text-align: center;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
&.share {
|
|
||||||
.iconfont {
|
|
||||||
font-size: 36rpx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.iconfont {
|
|
||||||
font-size: 36rpx;
|
|
||||||
color: #333;
|
|
||||||
}
|
|
||||||
.text {
|
|
||||||
padding-left: 6rpx;
|
|
||||||
font-size: 32rpx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,159 +0,0 @@
|
|||||||
<template>
|
|
||||||
<view class="journal-card mb-24 round-3 bg-white ">
|
|
||||||
<view class="head pa-24 pb-0 flex flex-between">
|
|
||||||
<view class="left flex">
|
|
||||||
<cache-image class="avatar rounded" radius="50%" width="70rpx" height="70rpx" :url="bloggerInfo.avatar"
|
|
||||||
:fileMd5="bloggerInfo.avatar" mode="scaleToFill"></cache-image>
|
|
||||||
<view class="info pl-16 flex flex-col">
|
|
||||||
<view class="nickname text-weight-b text-grey-darken-4">{{ bloggerInfo.nickname }}</view>
|
|
||||||
<view class="mt-3 time text-size-m ">
|
|
||||||
{{ $tm.dayjs(journal.createTime).format('YYYY-MM-DD HH:mm:ss') }}</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<view class="right">
|
|
||||||
<tm-button v-if="useLike" :shadow="0" theme="light-blue" size="s"
|
|
||||||
@click="fnLike(journal)">点赞({{ journal.likes }})</tm-button>
|
|
||||||
<tm-button v-if="useEdit" :shadow="0" theme="light-blue" size="s"
|
|
||||||
@click="$emit('on-edit', journal)">编辑</tm-button>
|
|
||||||
<tm-button v-if="useDel" :shadow="0" theme="red" size="s" @click="fnDel(journal)">删除</tm-button>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<tm-more v-if="journal.content.length > 50" :maxHeight="100" label="查看全部内容" open-label="隐藏部分内容">
|
|
||||||
<mp-html class="evan-markdown" lazy-load :domain="markdownConfig.domain"
|
|
||||||
:loading-img="markdownConfig.loadingGif" :scroll-table="true" :selectable="true"
|
|
||||||
:tag-style="markdownConfig.tagStyle" :container-style="markdownConfig.containStyle"
|
|
||||||
:content="journal.content" :markdown="true" :showLineNumber="true" :showLanguageName="true"
|
|
||||||
:copyByLongPress="true" />
|
|
||||||
</tm-more>
|
|
||||||
<mp-html v-else class="evan-markdown" lazy-load :domain="markdownConfig.domain"
|
|
||||||
:loading-img="markdownConfig.loadingGif" :scroll-table="true" :selectable="true"
|
|
||||||
:tag-style="markdownConfig.tagStyle" :container-style="markdownConfig.containStyle"
|
|
||||||
:content="journal.content" :markdown="true" :showLineNumber="true" :showLanguageName="true"
|
|
||||||
:copyByLongPress="true" />
|
|
||||||
</view>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import MarkdownConfig from '@/common/markdown/markdown.config.js';
|
|
||||||
import mpHtml from '@/components/mp-html/components/mp-html/mp-html.vue';
|
|
||||||
import tmButton from '@/tm-vuetify/components/tm-button/tm-button.vue';
|
|
||||||
import tmMore from '@/tm-vuetify/components/tm-more/tm-more.vue';
|
|
||||||
export default {
|
|
||||||
name: 'journal-card',
|
|
||||||
components: {
|
|
||||||
mpHtml,
|
|
||||||
tmButton,
|
|
||||||
tmMore
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
isAdmin: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
},
|
|
||||||
journal: {
|
|
||||||
type: Object,
|
|
||||||
default: () => {}
|
|
||||||
},
|
|
||||||
useLike: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
},
|
|
||||||
useEdit: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
},
|
|
||||||
useDel: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
markdownConfig: MarkdownConfig
|
|
||||||
};
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
bloggerInfo() {
|
|
||||||
let blogger = this.$tm.vx.getters().getConfigs.authorConfig.blogger;
|
|
||||||
blogger.avatar = this.$utils.checkAvatarUrl(blogger.avatar, true);
|
|
||||||
return blogger;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
fnLike(journal) {
|
|
||||||
uni.showLoading({
|
|
||||||
mask: true,
|
|
||||||
title: '正在点赞中...'
|
|
||||||
});
|
|
||||||
this.$httpApi
|
|
||||||
.postJournalLikes(journal.id)
|
|
||||||
.then(res => {
|
|
||||||
if (res.status == 200) {
|
|
||||||
journal.likes += 1;
|
|
||||||
uni.$tm.toast('o( ̄▽ ̄)d点赞成功!');
|
|
||||||
} else {
|
|
||||||
uni.$tm.toast('Ծ‸Ծ点赞失败了~');
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
uni.$tm.toast('Ծ‸Ծ点赞失败了~');
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
fnDel(journal) {
|
|
||||||
uni.$eShowModal({
|
|
||||||
title: '提示',
|
|
||||||
content: '您确定要删除该日记吗?',
|
|
||||||
showCancel: true,
|
|
||||||
cancelText: '否',
|
|
||||||
cancelColor: '#999999',
|
|
||||||
confirmText: '是',
|
|
||||||
confirmColor: '#03a9f4'
|
|
||||||
})
|
|
||||||
.then(res => {
|
|
||||||
this.$httpApi.admin
|
|
||||||
.deleteJournalsById(journal.id)
|
|
||||||
.then(res => {
|
|
||||||
if (res.status == 200) {
|
|
||||||
this.$emit('on-del', journal);
|
|
||||||
uni.$tm.toast('删除成功!');
|
|
||||||
} else {
|
|
||||||
uni.$tm.toast('Ծ‸Ծ删除失败~');
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
uni.$tm.toast('Ծ‸Ծ删除失败~');
|
|
||||||
});
|
|
||||||
})
|
|
||||||
.catch(() => {});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped lang="scss">
|
|
||||||
.journal-card {
|
|
||||||
box-sizing: border-box;
|
|
||||||
box-shadow: 0rpx 2rpx 24rpx rgba(0, 0, 0, 0.05);
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
.avatar {
|
|
||||||
width: 70rpx;
|
|
||||||
height: 70rpx;
|
|
||||||
border: 6rpx solid #fff;
|
|
||||||
box-shadow: 0rpx 0rpx 24rpx rgba(0, 0, 0, 0.05);
|
|
||||||
}
|
|
||||||
|
|
||||||
.info {
|
|
||||||
justify-content: center;
|
|
||||||
|
|
||||||
.nickname {
|
|
||||||
font-size: 30rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.time {
|
|
||||||
font-size: 26rpx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
13
main.js
13
main.js
@ -1,10 +1,5 @@
|
|||||||
import App from "./App";
|
import App from "./App";
|
||||||
import Vue from "vue";
|
import Vue from "vue";
|
||||||
import {
|
|
||||||
router,
|
|
||||||
RouterMount
|
|
||||||
} from './router/router.js'
|
|
||||||
Vue.use(router)
|
|
||||||
|
|
||||||
// 挂载全局工具类
|
// 挂载全局工具类
|
||||||
import utils from "./utils/index.js";
|
import utils from "./utils/index.js";
|
||||||
@ -75,10 +70,4 @@ const app = new Vue({
|
|||||||
...App,
|
...App,
|
||||||
});
|
});
|
||||||
|
|
||||||
// #ifdef H5
|
app.$mount();
|
||||||
RouterMount(app, router, '#app')
|
|
||||||
// #endif
|
|
||||||
|
|
||||||
// #ifndef H5
|
|
||||||
app.$mount(); //为了兼容小程序及app端必须这样写才有效果
|
|
||||||
// #endif
|
|
||||||
|
28
package.json
28
package.json
@ -1,28 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "uni-halo",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"description": "<p align=\"center\">\r <img alt=\"logo\" src=\"https://b.925i.cn/uni_halo/uni_halo_logo.png\" width=\"120\" height=\"120\" style=\"margin-bottom: 10px;\">\r </p>\r <h3 align=\"center\" style=\"margin: 30px 0 30px;font-weight: bold;font-size:40px;\">uni-halo</h3>\r <h3 align=\"center\">uni-halo 基于Halo一款现代化的开源博客/CMS系统API开发的可多端编译应用</h3>",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://gitee.com/ialley-workshop-open/uni-halo.git"
|
|
||||||
},
|
|
||||||
"keywords": [
|
|
||||||
"uni-halo",
|
|
||||||
"小莫唐尼",
|
|
||||||
"巷子工坊"
|
|
||||||
],
|
|
||||||
"author": "巷子工坊丨小莫唐尼",
|
|
||||||
"license": "AGPL-3.0",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://gitee.com/ialley-workshop-open/uni-halo/issues"
|
|
||||||
},
|
|
||||||
"homepage": "https://uni-halo.925i.cn",
|
|
||||||
"devDependencies": {
|
|
||||||
"vue-i18n": "^9.1.10"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"qs": "^6.12.1",
|
|
||||||
"uni-read-pages": "^1.0.5",
|
|
||||||
"uni-simple-router": "^2.0.8-beta.4"
|
|
||||||
}
|
|
||||||
}
|
|
19
pages.json
19
pages.json
@ -186,19 +186,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"path": "journal/journal",
|
|
||||||
"style": {
|
|
||||||
"navigationBarTitleText": "个人日记",
|
|
||||||
"enablePullDownRefresh": true,
|
|
||||||
"app-plus": {
|
|
||||||
"pullToRefresh": {
|
|
||||||
"color": "#03a9f4",
|
|
||||||
"style": "circle"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"path": "articles/articles",
|
"path": "articles/articles",
|
||||||
"style": {
|
"style": {
|
||||||
@ -273,12 +260,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"path": "test-page/test-page",
|
|
||||||
"style": {
|
|
||||||
"navigationBarTitleText": ""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"path": "advertise/advertise",
|
"path": "advertise/advertise",
|
||||||
"style": {
|
"style": {
|
||||||
|
@ -174,8 +174,7 @@ export default {
|
|||||||
// #ifdef MP-WEIXIN
|
// #ifdef MP-WEIXIN
|
||||||
_isWx = true;
|
_isWx = true;
|
||||||
// #endif
|
// #endif
|
||||||
this.navList = [
|
this.navList = [{
|
||||||
{
|
|
||||||
key: 'archives',
|
key: 'archives',
|
||||||
title: '文章归档',
|
title: '文章归档',
|
||||||
leftIcon: 'halocoloricon-classify',
|
leftIcon: 'halocoloricon-classify',
|
||||||
@ -400,9 +399,9 @@ export default {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (type == 'page') {
|
} else if (type == 'page') {
|
||||||
this.$Router.push({
|
uni.navigateTo({
|
||||||
path: path
|
url: path
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -90,7 +90,6 @@ import tmIcons from '@/tm-vuetify/components/tm-icons/tm-icons.vue';
|
|||||||
import tmEmpty from '@/tm-vuetify/components/tm-empty/tm-empty.vue';
|
import tmEmpty from '@/tm-vuetify/components/tm-empty/tm-empty.vue';
|
||||||
|
|
||||||
import eSwiper from '@/components/e-swiper/e-swiper.vue';
|
import eSwiper from '@/components/e-swiper/e-swiper.vue';
|
||||||
import qs from 'qs'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
@ -209,15 +208,8 @@ export default {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const paramsStr = qs.stringify(this.queryParams, {
|
|
||||||
allowDots: true,
|
|
||||||
encodeValuesOnly: true,
|
|
||||||
skipNulls: true,
|
|
||||||
encode: true,
|
|
||||||
arrayFormat: 'repeat'
|
|
||||||
})
|
|
||||||
uni.request({
|
uni.request({
|
||||||
url: this.$baseApiUrl + '/apis/api.content.halo.run/v1alpha1/posts?' + paramsStr,
|
url: this.$baseApiUrl + '/apis/api.content.halo.run/v1alpha1/posts',
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
params: this.queryParams,
|
params: this.queryParams,
|
||||||
success: (res) => {
|
success: (res) => {
|
||||||
@ -241,25 +233,14 @@ export default {
|
|||||||
},
|
},
|
||||||
// 文章列表
|
// 文章列表
|
||||||
fnGetArticleList() {
|
fnGetArticleList() {
|
||||||
// uni.showLoading({
|
|
||||||
// mask: true,
|
|
||||||
// title: '加载中...'
|
|
||||||
// });
|
|
||||||
// 设置状态为加载中
|
// 设置状态为加载中
|
||||||
if (!this.isLoadMore) {
|
if (!this.isLoadMore) {
|
||||||
this.loading = 'loading';
|
this.loading = 'loading';
|
||||||
}
|
}
|
||||||
this.loadMoreText = '加载中...';
|
this.loadMoreText = '加载中...';
|
||||||
|
|
||||||
const paramsStr = qs.stringify(this.queryParams, {
|
|
||||||
allowDots: true,
|
|
||||||
encodeValuesOnly: true,
|
|
||||||
skipNulls: true,
|
|
||||||
encode: true,
|
|
||||||
arrayFormat: 'repeat'
|
|
||||||
})
|
|
||||||
uni.request({
|
uni.request({
|
||||||
url: this.$baseApiUrl + '/apis/api.content.halo.run/v1alpha1/posts?' + paramsStr,
|
url: this.$baseApiUrl + '/apis/api.content.halo.run/v1alpha1/posts?',
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
params: this.queryParams,
|
params: this.queryParams,
|
||||||
success: (res) => {
|
success: (res) => {
|
||||||
|
@ -1,135 +0,0 @@
|
|||||||
<template>
|
|
||||||
<view class="app-page">
|
|
||||||
<view v-if="loading != 'success'" class="loading-wrap">
|
|
||||||
<tm-skeleton model="listAvatr"></tm-skeleton>
|
|
||||||
<tm-skeleton model="listAvatr"></tm-skeleton>
|
|
||||||
<tm-skeleton model="listAvatr"></tm-skeleton>
|
|
||||||
</view>
|
|
||||||
<!-- 内容区域 -->
|
|
||||||
<view v-else class="app-page-content">
|
|
||||||
<view v-if="dataList.length == 0" class="content-empty flex flex-center">
|
|
||||||
<!-- 空布局 -->
|
|
||||||
<tm-empty icon="icon-shiliangzhinengduixiang-" label="该分类下暂无数据"></tm-empty>
|
|
||||||
</view>
|
|
||||||
<block v-else>
|
|
||||||
<block v-for="(item, index) in dataList" :key="index">
|
|
||||||
<!-- 卡片 -->
|
|
||||||
<tm-translate animation-name="fadeUp" :wait="(index + 1) * 50">
|
|
||||||
<!-- 列表项 -->
|
|
||||||
{{ item }}
|
|
||||||
</tm-translate>
|
|
||||||
</block>
|
|
||||||
<tm-flotbutton @click="fnToTopPage" size="m" color="light-blue" icon="icon-angle-up"></tm-flotbutton>
|
|
||||||
<view class="load-text">{{ loadMoreText }}</view>
|
|
||||||
</block>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import tmSkeleton from '@/tm-vuetify/components/tm-skeleton/tm-skeleton.vue';
|
|
||||||
import tmFlotbutton from '@/tm-vuetify/components/tm-flotbutton/tm-flotbutton.vue';
|
|
||||||
import tmTranslate from '@/tm-vuetify/components/tm-translate/tm-translate.vue';
|
|
||||||
import tmEmpty from '@/tm-vuetify/components/tm-empty/tm-empty.vue';
|
|
||||||
export default {
|
|
||||||
components: {
|
|
||||||
tmSkeleton,
|
|
||||||
tmFlotbutton,
|
|
||||||
tmTranslate,
|
|
||||||
tmEmpty
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
loading: 'loading',
|
|
||||||
queryParams: {
|
|
||||||
size: 10,
|
|
||||||
page: 0
|
|
||||||
},
|
|
||||||
result: null,
|
|
||||||
dataList: [],
|
|
||||||
hasNext:false,
|
|
||||||
isLoadMore: false,
|
|
||||||
loadMoreText: '加载中...'
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
onLoad() {
|
|
||||||
this.fnSetPageTitle();
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
this.fnGetData();
|
|
||||||
},
|
|
||||||
onPullDownRefresh() {
|
|
||||||
this.isLoadMore = false;
|
|
||||||
this.queryParams.page = 0;
|
|
||||||
this.fnGetData();
|
|
||||||
},
|
|
||||||
|
|
||||||
onReachBottom(e) {
|
|
||||||
if (this.result.hasNext) {
|
|
||||||
this.queryParams.page += 1;
|
|
||||||
this.isLoadMore = true;
|
|
||||||
this.fnGetData();
|
|
||||||
} else {
|
|
||||||
uni.showToast({
|
|
||||||
icon: 'none',
|
|
||||||
title: '没有更多数据了'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
fnGetData() {
|
|
||||||
return;
|
|
||||||
uni.showLoading({
|
|
||||||
mask: true,
|
|
||||||
title: '加载中...'
|
|
||||||
});
|
|
||||||
// 设置状态为加载中
|
|
||||||
if (!this.isLoadMore) {
|
|
||||||
this.loading = 'loading';
|
|
||||||
}
|
|
||||||
this.loadMoreText = '加载中...';
|
|
||||||
this.$httpApi
|
|
||||||
.getXXX(this.queryParams)
|
|
||||||
.then(res => {
|
|
||||||
console.log('请求结果:');
|
|
||||||
console.log(res);
|
|
||||||
|
|
||||||
this.loading = 'success';
|
|
||||||
this.loadMoreText = res.data.hasNext ? '上拉加载更多' : '呜呜,没有更多数据啦~';
|
|
||||||
// 处理数据
|
|
||||||
this.result = res.data;
|
|
||||||
if (this.isLoadMore) {
|
|
||||||
this.dataList = this.dataList.concat(res.data.content);
|
|
||||||
} else {
|
|
||||||
this.dataList = res.data.content;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
console.error(err);
|
|
||||||
this.loading = 'error';
|
|
||||||
this.loadMoreText = '加载失败,请下拉刷新!';
|
|
||||||
})
|
|
||||||
.finally(() => {
|
|
||||||
setTimeout(() => {
|
|
||||||
uni.hideLoading();
|
|
||||||
uni.stopPullDownRefresh();
|
|
||||||
}, 500);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.app-page {
|
|
||||||
width: 100vw;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
padding: 24rpx 0;
|
|
||||||
padding-bottom: 144rpx;
|
|
||||||
}
|
|
||||||
.loading-wrap {
|
|
||||||
padding: 24rpx;
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -290,9 +290,9 @@ export default {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
toSubmitLinkPage() {
|
toSubmitLinkPage() {
|
||||||
this.$Router.push({
|
uni.navigateTo({
|
||||||
path: '/pagesA/submit-link/submit-link'
|
url: '/pagesA/submit-link/submit-link'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1,137 +0,0 @@
|
|||||||
<template>
|
|
||||||
<view class="app-page">
|
|
||||||
<view v-if="loading != 'success'" class="loading-wrap pa-24">
|
|
||||||
<tm-skeleton model="listAvatr"></tm-skeleton>
|
|
||||||
<tm-skeleton model="listAvatr"></tm-skeleton>
|
|
||||||
<tm-skeleton model="listAvatr"></tm-skeleton>
|
|
||||||
</view>
|
|
||||||
<!-- 内容区域 -->
|
|
||||||
<view v-else class="app-page-content pa-24">
|
|
||||||
<view v-if="dataList.length == 0" class="content-empty flex flex-center">
|
|
||||||
<!-- 空布局 -->
|
|
||||||
<tm-empty icon="icon-shiliangzhinengduixiang-" label="博主还没有写任何日记"></tm-empty>
|
|
||||||
</view>
|
|
||||||
<block v-else>
|
|
||||||
<block v-for="(journal, index) in dataList" :key="index">
|
|
||||||
<tm-translate animation-name="fadeUp" :wait="calcAniWait(index)">
|
|
||||||
<!-- 日记卡片 -->
|
|
||||||
<journal-card :journal="journal" :useLike="true"></journal-card>
|
|
||||||
</tm-translate>
|
|
||||||
</block>
|
|
||||||
|
|
||||||
<tm-flotbutton @click="fnToTopPage" color="light-blue" size="m" icon="icon-angle-up"></tm-flotbutton>
|
|
||||||
<view class="load-text">{{ loadMoreText }}</view>
|
|
||||||
</block>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import MarkdownConfig from '@/common/markdown/markdown.config.js';
|
|
||||||
import mpHtml from '@/components/mp-html/components/mp-html/mp-html.vue';
|
|
||||||
import journalCard from '@/components/journal-card/journal-card.vue';
|
|
||||||
|
|
||||||
import tmSkeleton from '@/tm-vuetify/components/tm-skeleton/tm-skeleton.vue';
|
|
||||||
import tmEmpty from '@/tm-vuetify/components/tm-empty/tm-empty.vue';
|
|
||||||
import tmTranslate from '@/tm-vuetify/components/tm-translate/tm-translate.vue';
|
|
||||||
import tmFlotbutton from '@/tm-vuetify/components/tm-flotbutton/tm-flotbutton.vue';
|
|
||||||
|
|
||||||
export default {
|
|
||||||
components: {mpHtml, tmSkeleton, tmEmpty, tmTranslate, tmFlotbutton, journalCard},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
loading: 'loading',
|
|
||||||
markdownConfig: MarkdownConfig,
|
|
||||||
queryParams: {
|
|
||||||
size: 10,
|
|
||||||
page: 0
|
|
||||||
},
|
|
||||||
|
|
||||||
dataList: [],
|
|
||||||
hasNext: false,
|
|
||||||
isLoadMore: false,
|
|
||||||
loadMoreText: '加载中...'
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
onLoad() {
|
|
||||||
this.fnSetPageTitle('个人日记');
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
this.fnGetData();
|
|
||||||
},
|
|
||||||
onPullDownRefresh() {
|
|
||||||
this.isLoadMore = false;
|
|
||||||
this.queryParams.page = 0;
|
|
||||||
this.fnGetData();
|
|
||||||
},
|
|
||||||
onReachBottom(e) {
|
|
||||||
if (this.hasNext) {
|
|
||||||
this.queryParams.page += 1;
|
|
||||||
this.isLoadMore = true;
|
|
||||||
this.fnGetData();
|
|
||||||
} else {
|
|
||||||
uni.showToast({
|
|
||||||
icon: 'none',
|
|
||||||
title: '没有更多数据了'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
fnGetData() {
|
|
||||||
// uni.showLoading({
|
|
||||||
// mask: true,
|
|
||||||
// title: '加载中...'
|
|
||||||
// });
|
|
||||||
// 设置状态为加载中
|
|
||||||
if (!this.isLoadMore) {
|
|
||||||
this.loading = 'loading';
|
|
||||||
}
|
|
||||||
this.loadMoreText = '加载中...';
|
|
||||||
this.$httpApi
|
|
||||||
.getJournals(this.queryParams)
|
|
||||||
.then(res => {
|
|
||||||
this.loading = 'success';
|
|
||||||
this.loadMoreText = res.data.hasNext ? '上拉加载更多' : '呜呜,没有更多数据啦~';
|
|
||||||
// 处理数据
|
|
||||||
this.result = res.data;
|
|
||||||
if (this.isLoadMore) {
|
|
||||||
this.dataList = this.dataList.concat(res.data.content);
|
|
||||||
} else {
|
|
||||||
this.dataList = res.data.content;
|
|
||||||
}
|
|
||||||
this.loading = 'success';
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
console.error(err);
|
|
||||||
this.loading = 'error';
|
|
||||||
this.loadMoreText = '加载失败,请下拉刷新!';
|
|
||||||
})
|
|
||||||
.finally(() => {
|
|
||||||
setTimeout(() => {
|
|
||||||
uni.hideLoading();
|
|
||||||
uni.stopPullDownRefresh();
|
|
||||||
}, 500);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.app-page {
|
|
||||||
width: 100vw;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|
||||||
.loading-wrap {
|
|
||||||
}
|
|
||||||
|
|
||||||
.app-page-content {
|
|
||||||
}
|
|
||||||
|
|
||||||
.content-empty {
|
|
||||||
height: 60vh;
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -48,10 +48,10 @@
|
|||||||
<cover-view v-if="startConfig.title || startConfig.logo" class="title-container">
|
<cover-view v-if="startConfig.title || startConfig.logo" class="title-container">
|
||||||
|
|
||||||
<cover-view v-if="startConfig.logo" class="app-logo">
|
<cover-view v-if="startConfig.logo" class="app-logo">
|
||||||
<view class="app-logo-border">
|
<cover-view class="app-logo-border">
|
||||||
<cover-image class="app-logo-image" :src="$utils.checkImageUrl(startConfig.logo)"
|
<cover-image class="app-logo-image" :src="$utils.checkImageUrl(startConfig.logo)"
|
||||||
mode="aspectFill"></cover-image>
|
mode="aspectFill"></cover-image>
|
||||||
</view>
|
</cover-view>
|
||||||
</cover-view>
|
</cover-view>
|
||||||
|
|
||||||
<cover-view v-if="startConfig.title" class="app-title" :style="startConfig.titleStyle">
|
<cover-view v-if="startConfig.title" class="app-title" :style="startConfig.titleStyle">
|
||||||
|
@ -1,289 +0,0 @@
|
|||||||
<template>
|
|
||||||
<view class="app-page">
|
|
||||||
|
|
||||||
<view v-if="loading != 'success' && articleList.length===0" class="loading-wrap">
|
|
||||||
加载中
|
|
||||||
</view>
|
|
||||||
<block v-else>
|
|
||||||
|
|
||||||
<view v-if="articleList.length == 0" class="article-empty"><tm-empty icon="icon-shiliangzhinengduixiang-"
|
|
||||||
label="博主还没有发表任何文章~"></tm-empty></view>
|
|
||||||
<block v-else>
|
|
||||||
|
|
||||||
<view style="width: 100%;text-align: center;display: flex;flex-direction: column;align-items: center;"
|
|
||||||
v-for="(article, index) in articleList" :key="index">
|
|
||||||
<image style="width: 100%;height: 250rpx;" :src="article.cover"></image>
|
|
||||||
<view style="margin-top: 12rpx;">{{article.title}}</view>
|
|
||||||
</view>
|
|
||||||
<view class="load-text mt-12">{{ loadMoreText }}</view>
|
|
||||||
</block>
|
|
||||||
</block>
|
|
||||||
</view>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
components: {
|
|
||||||
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
loading: 'loading',
|
|
||||||
queryParams: {
|
|
||||||
size: 30,
|
|
||||||
page: 1
|
|
||||||
},
|
|
||||||
result: {},
|
|
||||||
isLoadMore: false,
|
|
||||||
loadMoreText: '加载中...',
|
|
||||||
bannerCurrent: 0,
|
|
||||||
bannerList: [],
|
|
||||||
noticeList: [],
|
|
||||||
articleList: [],
|
|
||||||
categoryList: [],
|
|
||||||
};
|
|
||||||
},
|
|
||||||
onLoad() {
|
|
||||||
this.fnQuery();
|
|
||||||
},
|
|
||||||
|
|
||||||
onPullDownRefresh() {
|
|
||||||
this.isLoadMore = false;
|
|
||||||
this.queryParams.page = 1;
|
|
||||||
this.fnQuery();
|
|
||||||
},
|
|
||||||
|
|
||||||
onReachBottom(e) {
|
|
||||||
if (this.result.hasNext) {
|
|
||||||
this.queryParams.page += 1;
|
|
||||||
this.isLoadMore = true;
|
|
||||||
this.fnGetArticleList();
|
|
||||||
} else {
|
|
||||||
uni.showToast({
|
|
||||||
icon: 'none',
|
|
||||||
title: '没有更多数据了'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
fnQuery() {
|
|
||||||
this.fnGetArticleList();
|
|
||||||
},
|
|
||||||
fnOnBannerChange(e) {
|
|
||||||
this.bannerCurrent = e.current;
|
|
||||||
},
|
|
||||||
fnOnBannerClick(item) {
|
|
||||||
if (item.id == '') return;
|
|
||||||
this.fnToArticleDetail({
|
|
||||||
metadata: {
|
|
||||||
name: item.id
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
fnGetArticleList() {
|
|
||||||
|
|
||||||
// 设置状态为加载中
|
|
||||||
if (!this.isLoadMore) {
|
|
||||||
this.loading = 'loading';
|
|
||||||
}
|
|
||||||
this.loadMoreText = '加载中...';
|
|
||||||
const list = new Array(30).fill(10).map(item => {
|
|
||||||
return {
|
|
||||||
title: '红红火火恍恍惚惚哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈发放',
|
|
||||||
cover: 'https://blog.925i.cn/upload/房间%20少女%20蓝色眼睛%20夏天的裙子%20室内绿色植物%20动漫壁纸_彼岸壁纸.webp'
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
setTimeout(() => {
|
|
||||||
setTimeout(() => {
|
|
||||||
this.result = {
|
|
||||||
hasNext: true
|
|
||||||
};
|
|
||||||
|
|
||||||
if (this.isLoadMore) {
|
|
||||||
this.articleList = this.articleList.concat(list);
|
|
||||||
} else {
|
|
||||||
this.articleList = list;
|
|
||||||
}
|
|
||||||
}, 200)
|
|
||||||
this.loading = 'success';
|
|
||||||
this.loadMoreText = this.result ? '上拉加载更多' : '呜呜,没有更多数据啦~';
|
|
||||||
uni.hideLoading();
|
|
||||||
uni.stopPullDownRefresh();
|
|
||||||
}, 300)
|
|
||||||
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
//跳转文章详情
|
|
||||||
fnToArticleDetail(article) {
|
|
||||||
uni.navigateTo({
|
|
||||||
url: '/pagesA/article-detail/article-detail?name=' + article.metadata.name,
|
|
||||||
animationType: 'slide-in-right'
|
|
||||||
});
|
|
||||||
},
|
|
||||||
// 快捷导航页面跳转
|
|
||||||
fnToNavPage(item) {
|
|
||||||
switch (item.type) {
|
|
||||||
case 'tabbar':
|
|
||||||
uni.switchTab({
|
|
||||||
url: item.path
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case 'page':
|
|
||||||
uni.navigateTo({
|
|
||||||
url: item.path
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// 分类页面
|
|
||||||
fnToCategoryPage() {
|
|
||||||
uni.switchTab({
|
|
||||||
url: '/pages/tabbar/category/category'
|
|
||||||
});
|
|
||||||
},
|
|
||||||
// 所有的文章列表页面
|
|
||||||
fnToArticlesPage() {
|
|
||||||
uni.navigateTo({
|
|
||||||
url: '/pagesA/articles/articles'
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
// 根据slug查询分类下的文章
|
|
||||||
fnToCategoryBy(category) {
|
|
||||||
uni.navigateTo({
|
|
||||||
url: `/pagesA/category-detail/category-detail?name=${category.metadata.name}&title=${category.spec.displayName}`
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
fnChangeMode() {
|
|
||||||
const isBlackTheme = this.$tm.vx.state().tmVuetify.black;
|
|
||||||
this.$tm.theme.setBlack(!isBlackTheme);
|
|
||||||
uni.setNavigationBarColor({
|
|
||||||
backgroundColor: !isBlackTheme ? '#0a0a0a' : '#ffffff',
|
|
||||||
frontColor: !isBlackTheme ? '#ffffff' : '#0a0a0a'
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
fnToSearch() {
|
|
||||||
uni.navigateTo({
|
|
||||||
url: '/pagesA/articles/articles'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.app-page {
|
|
||||||
width: 100vw;
|
|
||||||
min-height: 100vh;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
// background-color: #ffffff;
|
|
||||||
|
|
||||||
.logo {
|
|
||||||
width: 60rpx;
|
|
||||||
height: 60rpx;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep {
|
|
||||||
.tm-menubars .body .body_wk .left {
|
|
||||||
min-width: initial;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.loading-wrap {
|
|
||||||
padding: 24rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.search-input {
|
|
||||||
background-color: #f5f5f5;
|
|
||||||
align-items: center;
|
|
||||||
/* #ifdef MP-WEIXIN */
|
|
||||||
margin-right: 24rpx;
|
|
||||||
|
|
||||||
/* #endif */
|
|
||||||
&_icon {}
|
|
||||||
|
|
||||||
&_text {}
|
|
||||||
}
|
|
||||||
|
|
||||||
.show-more {
|
|
||||||
width: 42rpx;
|
|
||||||
height: 42rpx;
|
|
||||||
box-sizing: border-box;
|
|
||||||
box-shadow: 0rpx 0rpx 24rpx rgba(0, 0, 0, 0.03);
|
|
||||||
}
|
|
||||||
|
|
||||||
.banner {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.quick-nav {
|
|
||||||
background-color: #fff;
|
|
||||||
box-sizing: border-box;
|
|
||||||
|
|
||||||
// box-shadow: 0rpx 2rpx 24rpx rgba(0, 0, 0, 0.03);
|
|
||||||
.name {
|
|
||||||
color: var(--main-text-color);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.category {
|
|
||||||
width: 94vw;
|
|
||||||
display: flex;
|
|
||||||
height: 200rpx;
|
|
||||||
white-space: nowrap;
|
|
||||||
margin: 0 24rpx;
|
|
||||||
|
|
||||||
.content {
|
|
||||||
display: inline-block;
|
|
||||||
padding-left: 24rpx;
|
|
||||||
|
|
||||||
&:first-child {
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.cate-empty {
|
|
||||||
height: inherit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.page-item {
|
|
||||||
&_title {
|
|
||||||
position: relative;
|
|
||||||
padding-left: 24rpx;
|
|
||||||
font-size: 32rpx;
|
|
||||||
z-index: 1;
|
|
||||||
color: var(--main-text-color);
|
|
||||||
|
|
||||||
&:before {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
left: 0rpx;
|
|
||||||
top: 8rpx;
|
|
||||||
width: 8rpx;
|
|
||||||
height: 30rpx;
|
|
||||||
background-color: rgba(33, 150, 243, 1);
|
|
||||||
border-radius: 6rpx;
|
|
||||||
z-index: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.h_row_col2 {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
box-sizing: border-box;
|
|
||||||
padding: 0 12rpx;
|
|
||||||
|
|
||||||
.ani-item {
|
|
||||||
width: 50%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,24 +0,0 @@
|
|||||||
// router.js
|
|
||||||
import {
|
|
||||||
RouterMount,
|
|
||||||
createRouter
|
|
||||||
} from 'uni-simple-router';
|
|
||||||
|
|
||||||
const router = createRouter({
|
|
||||||
platform: process.env.VUE_APP_PLATFORM,
|
|
||||||
routes: [...ROUTES]
|
|
||||||
});
|
|
||||||
|
|
||||||
//全局路由前置守卫
|
|
||||||
router.beforeEach((to, from, next) => {
|
|
||||||
next();
|
|
||||||
});
|
|
||||||
// 全局路由后置守卫
|
|
||||||
router.afterEach((to, from) => {
|
|
||||||
console.log('跳转结束')
|
|
||||||
})
|
|
||||||
|
|
||||||
export {
|
|
||||||
router,
|
|
||||||
RouterMount
|
|
||||||
}
|
|
@ -1,8 +1,4 @@
|
|||||||
//vue.config.js
|
//vue.config.js
|
||||||
const TransformPages = require('uni-read-pages')
|
|
||||||
const {
|
|
||||||
webpack
|
|
||||||
} = new TransformPages()
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
devServer: {
|
devServer: {
|
||||||
disableHostCheck: true,
|
disableHostCheck: true,
|
||||||
@ -16,17 +12,5 @@ module.exports = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
configureWebpack: {
|
|
||||||
plugins: [
|
|
||||||
new webpack.DefinePlugin({
|
|
||||||
ROUTES: webpack.DefinePlugin.runtimeValue(() => {
|
|
||||||
const tfPages = new TransformPages({
|
|
||||||
includes: ['path', 'name', 'aliasPath', "meta"]
|
|
||||||
});
|
|
||||||
return JSON.stringify(tfPages.routes)
|
|
||||||
}, true)
|
|
||||||
})
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user