From 6fdaeed79219b3b6b54b4696fd68689af69ab514 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E8=8E=AB=E5=94=90=E5=B0=BC?= <1431128779@qq.com> Date: Sun, 25 Jun 2023 09:28:49 +0800 Subject: [PATCH 1/4] =?UTF-8?q?update=EF=BC=9A=E4=BF=AE=E6=94=B9README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 181 +++++++++++++++++++++++++++++------------------------- 1 file changed, 97 insertions(+), 84 deletions(-) diff --git a/README.md b/README.md index f666465..b3044da 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@

-

uni-halo 基于Halo一款现代化的开源博客/CMS系统API开发的多端系统,值得一试。

+

【uni-halo】 基于 uniapp + Halo API 开发的多端项目,值得一试。


@@ -16,94 +16,107 @@ --- -如果您觉得这个项目对您有帮助,可以帮作者买杯饮料鼓励鼓励! - - - - - - - -
-
- -
-
-
- -
-
-
- -
-
- - -## 🌸 快速开始 - -详细部署文档请查阅 [uni-halo-doc](https://uni-halo.925i.cn/) - -- 1、拉取或下载项目; -- 2、通过hbuilderx 导入项目; -- 3、命令行执行 npm i 安装依赖; -- 4、配置运行信息,找到项目根目录config目录,将`halo.config.template.js`修改为 `halo.config.js` 并设置相关信息; -- 5、点击hbuilderx 工具 右上角预览、或者点击工具栏 运行-内置浏览器运行; -- 6、项目发行: -- 发行小程序:点击工具栏 发行 -> 小程序-微信 -- 发行APP: 点击工具栏 发行 -> 原生App-云打包 - - -## ⭐️ 功能清单 - -### 用户部分 -1. - [x] 文章分类 -2. - [x] 文章详情&海报分享 -3. - [x] 文章归档 -4. - [x] 文章列表和搜索 -5. - [x] 数据统计展示 -6. - [x] 图库 -7. - [x] 友链 -8. - [x] 留言板 -9. - [x] 个人日记 - -### 管理部分 -1. - [x] 个人信息修改 -2. - [x] 个人密码修改 -3. - [x] 日记管理 -4. - [x] 文章管理 -5. - [x] 分类管理 -6. - [x] 标签管理 -7. - [x] 附件管理 -8. - [x] 友链管理 -9. - [x] 图库管理 -10. - [x] 评论管理 -11. - [x] 日志管理 -12. - [ ] 菜单设置 -13. - [ ] 系统设置 - -## 📃 TODO -1. - [ ] 暗黑模式 -2. - [ ] 国际化 - - -## 🌈 在线体验 - -微信小程序搜索:小莫唐尼 +如果您觉得这个项目对您有帮助,可以帮作者买杯饮料鼓励鼓励,同时为了项目能够持续发展,可以根据您的喜好支持一下本项目哦,非常感谢您的支持,作者也会更有动力持续维护和更新新的功能哦~ + +|支付宝 |微信 |QQ | +|:--: |:--: |:--: | +|![支付宝赞赏](https://b.925i.cn/skm/zf_zfb_skm.png)|![微信赞赏](https://b.925i.cn/skm/zf_wx_zsm.png) |![QQ赞赏](https://b.925i.cn/skm/zf_qq_skm.png) | + +## 🧐 功能介绍 + +#### 🍻 基础功能 + +几乎实现PC端后台的全功能,让您在手机端也可以管理您的博客。 + +- 用户端:文章列表、文章分类、文章详情、图库、留言板、友链、个人日记等 +- 管理端:资料修改、密码修改、日记管理、文章管理、分类管理、标签管理、附件管理、友链管理、评论管理、日志管理等 +
-![首页](https://uni-halo.925i.cn/assets/wx_white.51824be0.png) - -## 🌈 交流群 -QQ群号:632969367 +#### 💞 特色功能 + +- 恋爱日记:精心为您设计了秀恩爱的模块,秀出关于你们的故事、情侣甜蜜相册、恋爱记录清单,为您的恋爱保驾护航。 + +
+ +## 😎 文档源码 + +- 作者博客:[https://b.925i.cn/](https://b.925i.cn/) +- 官方文档:[https://uni-halo.925i.cn/](https://uni-halo.925i.cn/) +- Gitee :[https://gitee.com/ialley-workshop-open/uni-halo](https://gitee.com/ialley-workshop-open/uni-halo) +- Github :[https://github.com/ialley-workshop-open/uni-halo](https://github.com/ialley-workshop-open/uni-halo) + +
+ +## 😏 在线体验 + +说明:微信扫码、或搜索【小莫唐尼】即可在线体验已上线小程序!!! + +![https://img.925i.cn/file/a0c1a95b49b5db7f78248.png](https://img.925i.cn/file/a0c1a95b49b5db7f78248.png) + +
+ +## 😘 界面预览 + +##### 📱 用户端 + +说明:以下仅为部分截图 + +|首页|分类|图库|友链| +|:--:|:--:|:--:|:--:| +|![首页](https://uni-halo.925i.cn/assets/001.76053f5e.jpg)|![分类](https://uni-halo.925i.cn/assets/002.9479f5e4.jpg)|![相册](https://uni-halo.925i.cn/assets/003.0d1f4694.jpg)|![友链](https://uni-halo.925i.cn/assets/004.22b6a1e3.jpg)| + +|我的|归档|详情|留言板| +|:--:|:--:|:--:|:--:| +|![我的](https://uni-halo.925i.cn/assets/005.d1ccf84e.jpg)|![归档](https://uni-halo.925i.cn/assets/007.e481f0c1.jpg)|![详情](https://uni-halo.925i.cn/assets/008.a4f5af80.jpg)|![留言板](https://uni-halo.925i.cn/assets/006.fc80dc8c.jpg)| + +##### 💻 管理端 + +说明:以下仅为部分截图 + +|后台首页|文章管理| +|:--:|:--:| +|![后台首页](https://uni-halo.925i.cn/assets/009.707f9a85.jpg)|![文章管理](https://uni-halo.925i.cn/assets/010.0b018b02.jpg)| + +##### 📱 恋爱日记 + +说明:以下仅为部分截图 + +|主页 |恋爱相册 |恋爱清单 | +|:--: |:--: |-- | +|![主页](https://uni-halo.925i.cn/assets/love_001.6bf8b4e9.jpg) |![恋爱相册](https://uni-halo.925i.cn/assets/love_003.b8effd48.jpg) |![恋爱清单](https://uni-halo.925i.cn/assets/love_002.a08bd8d6.jpg) | + +
+ +## 🙋 使用交流 + +- 提交 issues:[Github Issues](https://github.com/ialley-workshop-open/uni-halo/issues) 丨 [Gitee Issues](https://gitee.com/ialley-workshop-open/uni-halo/issues) +- 微信交流群:由于微信交流群时效性太短,所以有需要的话可以先加入QQ群,再邀请进微信群 +- QQ 交流群:632969367 +- 快速加群:[![632969367](https://pub.idqqimg.com/wpa/images/group.png)](https://qm.qq.com/cgi-bin/qm/qr?k=cuam7lhrB_vHuvjw2mzUO1sOKdF9KRyM&jump_from=webapi&authKey=d6bJhNaqupTTfoMDWDIeYUTAs44Ax7p64SsM/5NRtFhXE09YexDO15Izuyth6XAi) + +![QQ群号:632969367](https://img.925i.cn/file/b83b9e79695779c4344f3.png) + +
+ +## 🎉 加入我们 + +uni-halo 还在持续更新中,本项目欢迎您的参与,共同维护,逐步完善,将项目做得更强。项目采用 AGPL-3.0 开源协议,本着一切免费的原则,原则上不会收取任何费用及版权,可以放心使用。 + +如果你想加入我们,可以多提供一些好的建议或者提交 pr,我们将会非常乐意接受您的建议和意见。 + +
-## 🔍 许可证 +## 🔍 开源许可 uni-halo 使用 AGPL-3.0 协议开源,请遵守开源协议。 -## 🏭 贡献 +
-贡献代码请查看 [代码贡献规范](https://uni-halo.925i.cn/standard/category.html) +## 🙋 致谢 +uni-halo 得益于以下优秀的技术支撑,我只是站在巨人的肩膀上捡了几根头发丝,但是非常感谢这些优秀的项目,带给了我们其他开发者和用户非常友好的体验! -## 🙆‍♂ Halo -- 接口文档地址(内容端): -- 接口文档地址(管理端): \ No newline at end of file +- [Halo:一款好用又强大的开源建站工具](https://halo.run/) +- [uni-app:是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码可编译到多个平台](https://uniapp.dcloud.net.cn/) +- [tm-vuetify:是一个为 uni-app 平台定制的颜值也非常高的 UI 框架](https://www.jx2d.cn/) +- [mp-html:一个强大的小程序富文本组件](https://jin-yufeng.gitee.io/mp-html/#/) \ No newline at end of file -- Gitee From ee28753094132d259f32a893eba18a2ea65155a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E8=8E=AB=E5=94=90=E5=B0=BC?= <1431128779@qq.com> Date: Thu, 3 Aug 2023 01:44:24 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=E5=8F=96?= =?UTF-8?q?=E6=B6=88=E5=8D=9A=E5=AE=A2=E9=A1=B5=E9=9D=A2=E7=9A=84loading?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/tabbar/category/category.vue | 8 ++++---- pages/tabbar/gallery/gallery.vue | 8 ++++---- pages/tabbar/home/home.vue | 8 ++++---- pages/tabbar/links/links.vue | 8 ++++---- pagesA/archives/archives.vue | 8 ++++---- pagesA/article-detail/article-detail.vue | 8 ++++---- pagesA/articles/articles.vue | 8 ++++---- pagesA/category-detail/category-detail.vue | 8 ++++---- pagesA/journal/journal.vue | 8 ++++---- pagesA/leaving/leaving.vue | 9 +++++---- pagesA/tag-detail/tag-detail.vue | 8 ++++---- 11 files changed, 45 insertions(+), 44 deletions(-) diff --git a/pages/tabbar/category/category.vue b/pages/tabbar/category/category.vue index 78ba610..42270de 100644 --- a/pages/tabbar/category/category.vue +++ b/pages/tabbar/category/category.vue @@ -105,10 +105,10 @@ fnGetAllCategory() { this.loading = 'loading'; - uni.showLoading({ - mask: true, - title: '加载中...' - }); + // uni.showLoading({ + // mask: true, + // title: '加载中...' + // }); this.$httpApi .getCategoryList({ more: true }) .then(res => { diff --git a/pages/tabbar/gallery/gallery.vue b/pages/tabbar/gallery/gallery.vue index bfa7ef5..f00b354 100644 --- a/pages/tabbar/gallery/gallery.vue +++ b/pages/tabbar/gallery/gallery.vue @@ -214,10 +214,10 @@ }); }, fnGetData() { - uni.showLoading({ - mask: true, - title: '加载中...' - }); + // uni.showLoading({ + // mask: true, + // title: '加载中...' + // }); // 设置状态为加载中 if (!this.isLoadMore) { this.loading = 'loading'; diff --git a/pages/tabbar/home/home.vue b/pages/tabbar/home/home.vue index 8fc7c35..3e1c9e5 100644 --- a/pages/tabbar/home/home.vue +++ b/pages/tabbar/home/home.vue @@ -262,10 +262,10 @@ }, // 文章列表 fnGetArticleList() { - uni.showLoading({ - mask: true, - title: '加载中...' - }); + // uni.showLoading({ + // mask: true, + // title: '加载中...' + // }); // 设置状态为加载中 if (!this.isLoadMore) { this.loading = 'loading'; diff --git a/pages/tabbar/links/links.vue b/pages/tabbar/links/links.vue index 9ae2ec6..869ec1b 100644 --- a/pages/tabbar/links/links.vue +++ b/pages/tabbar/links/links.vue @@ -210,10 +210,10 @@ fnGetData() { this.linkTotal = 0; this.loading = 'loading'; - uni.showLoading({ - mask: true, - title: '加载中...' - }); + // uni.showLoading({ + // mask: true, + // title: '加载中...' + // }); this.$httpApi .getLinkListByTeam() .then(res => { diff --git a/pagesA/archives/archives.vue b/pagesA/archives/archives.vue index 96de057..66db466 100644 --- a/pagesA/archives/archives.vue +++ b/pagesA/archives/archives.vue @@ -115,10 +115,10 @@ }, fnGetData() { this.loading = 'loading'; - uni.showLoading({ - mask: true, - title: '加载中...' - }); + // uni.showLoading({ + // mask: true, + // title: '加载中...' + // }); this.$httpApi[this.api](this.queryParams) .then(res => { this.result = res.data; diff --git a/pagesA/article-detail/article-detail.vue b/pagesA/article-detail/article-detail.vue index 18825d3..06a6fd3 100644 --- a/pagesA/article-detail/article-detail.vue +++ b/pagesA/article-detail/article-detail.vue @@ -364,10 +364,10 @@ methods: { fnGetData() { this.loading = 'loading'; - uni.showLoading({ - mask: true, - title: '加载中...' - }); + // uni.showLoading({ + // mask: true, + // title: '加载中...' + // }); this.$httpApi .getArticleDetail(this.queryParams.articleId) .then(res => { diff --git a/pagesA/articles/articles.vue b/pagesA/articles/articles.vue index 3897c28..77f12e2 100644 --- a/pagesA/articles/articles.vue +++ b/pagesA/articles/articles.vue @@ -133,10 +133,10 @@ this.fnGetData(); }, fnGetData() { - uni.showLoading({ - mask: true, - title: '加载中...' - }); + // uni.showLoading({ + // mask: true, + // title: '加载中...' + // }); // 设置状态为加载中 if (!this.isLoadMore) { this.loading = 'loading'; diff --git a/pagesA/category-detail/category-detail.vue b/pagesA/category-detail/category-detail.vue index 7578206..cb5a697 100644 --- a/pagesA/category-detail/category-detail.vue +++ b/pagesA/category-detail/category-detail.vue @@ -75,10 +75,10 @@ }, methods: { fnGetData() { - uni.showLoading({ - mask: true, - title: '加载中...' - }); + // uni.showLoading({ + // mask: true, + // title: '加载中...' + // }); // 设置状态为加载中 if (!this.isLoadMore) { this.loading = 'loading'; diff --git a/pagesA/journal/journal.vue b/pagesA/journal/journal.vue index b9cfff0..03bd7a7 100644 --- a/pagesA/journal/journal.vue +++ b/pagesA/journal/journal.vue @@ -78,10 +78,10 @@ }, methods: { fnGetData() { - uni.showLoading({ - mask: true, - title: '加载中...' - }); + // uni.showLoading({ + // mask: true, + // title: '加载中...' + // }); // 设置状态为加载中 if (!this.isLoadMore) { this.loading = 'loading'; diff --git a/pagesA/leaving/leaving.vue b/pagesA/leaving/leaving.vue index 038ef9c..65c0621 100644 --- a/pagesA/leaving/leaving.vue +++ b/pagesA/leaving/leaving.vue @@ -4,6 +4,7 @@ + @@ -133,10 +134,10 @@ methods: { fnGetData() { - uni.showLoading({ - mask: true, - title: '加载中...' - }); + // uni.showLoading({ + // mask: true, + // title: '加载中...' + // }); // 设置状态为加载中 if (!this.isLoadMore) { this.loading = 'loading'; diff --git a/pagesA/tag-detail/tag-detail.vue b/pagesA/tag-detail/tag-detail.vue index 90b33c3..dd5bfdc 100644 --- a/pagesA/tag-detail/tag-detail.vue +++ b/pagesA/tag-detail/tag-detail.vue @@ -75,10 +75,10 @@ }, methods: { fnGetData() { - uni.showLoading({ - mask: true, - title: '加载中...' - }); + // uni.showLoading({ + // mask: true, + // title: '加载中...' + // }); // 设置状态为加载中 if (!this.isLoadMore) { this.loading = 'loading'; -- Gitee From 70dc7cd0a70b136fd5f1362fb441dbae9189f767 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E8=8E=AB=E5=94=90=E5=B0=BC?= <1431128779@qq.com> Date: Thu, 3 Aug 2023 01:55:57 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=96=87=E7=AB=A0=E5=8D=A1=E7=89=87=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/article-card/article-card.vue | 488 ++++++++++-------- .../article-min-card/article-min-card.vue | 307 ++++++----- 2 files changed, 431 insertions(+), 364 deletions(-) diff --git a/components/article-card/article-card.vue b/components/article-card/article-card.vue index 061560c..4f64bd1 100644 --- a/components/article-card/article-card.vue +++ b/components/article-card/article-card.vue @@ -1,13 +1,7 @@ + \ No newline at end of file diff --git a/components/article-min-card/article-min-card.vue b/components/article-min-card/article-min-card.vue index b5d9856..76431a3 100644 --- a/components/article-min-card/article-min-card.vue +++ b/components/article-min-card/article-min-card.vue @@ -1,13 +1,7 @@ + \ No newline at end of file -- Gitee From a81c506a14e8ee2a9ae7b9e70b260d3bf735cbb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E8=8E=AB=E5=94=90=E5=B0=BC?= <1431128779@qq.com> Date: Thu, 3 Aug 2023 02:31:09 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=96=87=E7=AB=A0=E5=88=86=E7=B1=BB=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=AF=86=E7=A0=81=E9=AA=8C=E8=AF=81=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/http/interceptors.js | 97 ++++++++++++++++++++++--------------- 1 file changed, 59 insertions(+), 38 deletions(-) diff --git a/common/http/interceptors.js b/common/http/interceptors.js index 23e9ff2..8d7d281 100644 --- a/common/http/interceptors.js +++ b/common/http/interceptors.js @@ -16,6 +16,51 @@ import { delCache, setCache } from "@/utils/storage"; + +const getCategoryNameByUrl = (url) => { + const reg = '(?<=/api/content/categories/).+(?=/posts)' + return url.match(reg)[0] || '无分类名' +} +const showCategoryInputPasswordModal = (response, category) => { + uni.showModal({ + title: `[ ${category} ] 分类已加密`, // TODO 这里应该获取分类的名字,可以在弹窗之前请求后台拿到所有分类根据分类code拿到名称,但是不会在这之前发送请求 + content: '', + editable: true, + placeholderText: '请输入分类密码后访问', + confirmText: '验证密码', + cancelText: '暂不访问', + showCancel: true, + cancelColor: '#999999', + confirmColor: '#03a9f4', + success: (res) => { + if (res.confirm) { + // TODO 这里如果没有输入密码点击确认应该阻止窗口关闭,但是没找到方法 + if (!res.content) { + uni.showToast({ + title: '提示:请输入密码', + icon: 'none', + success: () => { + setTimeout(() => { + showCategoryInputPasswordModal(response, category); + }, 800) + } + }) + return; + } + // 根据请求URL正则匹配分类code,然后把输入的密码根据分类code放入缓存,然后在category.getCategoryPostList中获取,解决多个分类加密输入密码后点错的问题 + // 目前存在一个问题,比如前两个都需要密码,如果先输入第二个的密码之后,重新进来默认打开第一个还会弹窗,所以想在弹窗标题上增加分类名字 + // 另外有以下两种方式科技解决 + // TODO 1.其实这里获取到密码之后可以直接发送一个请求追加上password参数,因为后台会缓存权限,后续不输入密码也可以访问,可惜不会 + // TODO 2.另外也可以拿到密码之后,直接选中该分类追加password参数,重新请求,可惜也不会 + setCache('APP_CATEGORY_PWD_' + category, res.content) + uni.reLaunch({ + url: '/pages/tabbar/category/category' + }); + } else if (res.cancel) {} + }, + }) +} + export const setInterceptors = (http) => { http.interceptors.request.use( (config) => { @@ -61,10 +106,17 @@ export const setInterceptors = (http) => { uni.$tm.toast(response.data.message); // 如果是请求分类之后报401说明密码错误,那么清除该密码,下次点击会报403弹窗再次输入密码 if (response.config.url.indexOf('/api/content/categories') >= 0) { - let requestUrl = response.config.url; - var reg = '(?<=/api/content/categories/).+(?=/posts)' - let category = requestUrl.match(reg)[0] - delCache('APP_CATEGORY_PWD_' + category) + const category = getCategoryNameByUrl(response.config.url) + delCache('APP_CATEGORY_PWD_' + category); + uni.showToast({ + title: '提示:密码不正确', + icon: 'none', + success: () => { + setTimeout(() => { + showCategoryInputPasswordModal(response, category); + }, 800) + } + }) } else { // 其他情况维持原来的逻辑 delCache('APP_ADMIN_LOGIN_TOKEN'); @@ -89,39 +141,8 @@ export const setInterceptors = (http) => { } else if (response.data.status == 403) { // 如果报403是请求分类文章接口(您没有该分类的访问权限)的话说明是私密分类,需要输入密码请求 if (response.config.url.indexOf('/api/content/categories') >= 0) { - uni.showModal({ - title: '私密分类', // TODO 这里应该获取分类的名字,可以在弹窗之前请求后台拿到所有分类根据分类code拿到名称,但是不会在这之前发送请求 - content: '', - editable: true, - placeholderText: '请输入密码', - confirmText: '确认', - cancelText: '取消', - showCancel: true, - cancelColor: '#000000', - confirmColor: '#007aff', - success: (res) => { - if (res.confirm) { - // TODO 这里如果没有输入密码点击确认应该阻止窗口关闭,但是没找到方法 - if (!res.content) { - uni.$tm.toast('请输入密码'); - return - } - // 根据请求URL正则匹配分类code,然后把输入的密码根据分类code放入缓存,然后在category.getCategoryPostList中获取,解决多个分类加密输入密码后点错的问题 - // 目前存在一个问题,比如前两个都需要密码,如果先输入第二个的密码之后,重新进来默认打开第一个还会弹窗,所以想在弹窗标题上增加分类名字 - // 另外有以下两种方式科技解决 - // TODO 1.其实这里获取到密码之后可以直接发送一个请求追加上password参数,因为后台会缓存权限,后续不输入密码也可以访问,可惜不会 - // TODO 2.另外也可以拿到密码之后,直接选中该分类追加password参数,重新请求,可惜也不会 - let requestUrl = response.config.url; - var reg = '(?<=/api/content/categories/).+(?=/posts)' - let category = requestUrl.match(reg)[0] - setCache('APP_CATEGORY_PWD_' + category, res.content) - uni.reLaunch({ - url: '/pages/tabbar/category/category' - }); - } else if (res.cancel) { - } - }, - }) + const category = getCategoryNameByUrl(response.config.url); + showCategoryInputPasswordModal(response, category); } } else { return Promise.reject(response.data); @@ -129,4 +150,4 @@ export const setInterceptors = (http) => { } ); -}; +}; \ No newline at end of file -- Gitee