diff --git a/main/fclite.min.css b/main/fclite.min.css deleted file mode 100644 index c1f275f..0000000 --- a/main/fclite.min.css +++ /dev/null @@ -1 +0,0 @@ -:root{--text-color-light:#000000;--text-color-dark:#F7F7FA;--background-color-light:#f4f4f9;--background-color-dark:#181818;--container-bg-color-light:white;--container-bg-color-dark:#1D1E22;--hover-color:#3498db;--author-color-light:gray;--author-color-dark:#b3b3b3;--modal-bg-blur:25px;--shadow-color-light:rgba(0,0,0,0.1);--shadow-color-dark:rgba(255,255,255,0.1);--border-color-light:#e3e8f7;--border-color-dark:#42444a}[data-theme=light]{--text-color:var(--text-color-light);--background-color:var(--background-color-light);--tag-bg-color:#bfbfbf;--container-bg-color:var(--container-bg-color-light);--author-color:var(--author-color-light);--shadow-color:var(--shadow-color-light);--border-color:var(--border-color-light);--modal-bg-color:rgba(255,255,255,0.5);--modal-content-bg-color:rgba(239,250,255,0.5);--load-more-btn-bg-color:var(--container-bg-color)}[data-theme=dark]{--text-color:var(--text-color-dark);--background-color:var(--background-color-dark);--tag-bg-color:#474747;--container-bg-color:var(--container-bg-color-dark);--author-color:var(--author-color-dark);--shadow-color:var(--shadow-color-dark);--border-color:var(--border-color-dark);--modal-bg-color:rgba(0,0,0,0.3);--modal-content-bg-color:rgba(20,20,20,0.5);--load-more-btn-bg-color:var(--container-bg-color)}body{background-color:var(--background-color)}#friend-circle-lite-root{width:100%}#random-article{display:flex;position:relative;width:100%;margin:8px 0;background-color:var(--container-bg-color);border-radius:10px;border:1px solid var(--border-color);height:210px;transition:border 0.3s}.random-container{position:relative;margin:20px;width:90%;height:170px}.random-container:hover .random-title{font-size:32px}.random-author{font-size:14px;color:var(--author-color);margin-bottom:10px}.random-container-title{font-size:20px;font-weight:700;margin-bottom:20px}.random-title{margin-bottom:10px;font-size:30px;transition:font-size 0.3s ease-in-out;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.random-link-button{position:absolute;bottom:20px;right:20px;padding:10px 20px;border:none;border-radius:20px;background-color:var(--hover-color);color:#fff;cursor:pointer;font-size:14px;transition:background-color 0.3s ease-in-out}.modal{position:fixed;top:0;left:0;width:100%;height:100%;background-color:var(--modal-bg-color);backdrop-filter:blur(var(--modal-bg-blur));-webkit-backdrop-filter:blur(var(--modal-bg-blur));z-index:999;opacity:0;visibility:hidden;transition:opacity 0.3s}.modal-open{opacity:1;visibility:visible}.modal-content{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:350px;background-color:var(--modal-content-bg-color);padding:20px;border:1px solid var(--border-color);z-index:1000;max-height:90%;overflow-y:auto;border-radius:20px;transition:opacity 0.3s}@media screen and (max-width:440px){.modal-content{width:80%}}#modal-author-avatar{display:block;margin:0 auto;border-radius:50%;width:100px;height:100px;object-fit:cover}#modal-author-name-link{display:block;text-align:center;font-size:15px;margin:15px 0;color:var(--hover-color);text-decoration:none}#modal-author-name-link:hover{text-decoration:underline}.modal-content hr{margin:20px 0}#modal-articles-container{border-top:var(--hover-color) double 2px;margin-top:20px;padding-top:10px}.modal-article{display:flex;flex-wrap:wrap;margin-bottom:10px;padding-bottom:10px;border-bottom:var(--hover-color) dashed 1px}.modal-article .modal-article-title{color:var(--text-color);font-size:18px;line-height:1.2;cursor:pointer;height:2.5em;width:100%;margin-bottom:5px;text-decoration:none;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.modal-article .modal-article-title:hover{color:var(--hover-color);text-decoration:underline}.modal-article .modal-article-date{font-size:12px;width:100%;color:var(--author-color);padding:5px;cursor:default;text-align:right}.articles-container{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:8px;width:100%}.card{background-color:var(--container-bg-color);border-radius:10px;padding:10px;border:1px solid var(--border-color);position:relative;overflow:hidden;display:flex;flex-direction:column;justify-content:space-between;height:150px;transition:border 0.3s}.card:hover,#random-article:hover{border:1px solid var(--hover-color)}.card-title{z-index:1;font-size:17px;color:var(--text-color);font-weight:520;cursor:pointer;margin-bottom:10px;line-height:1.5;max-height:4.5em;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;transition:color 0.3s}.card-title:hover{color:var(--hover-color);text-decoration:underline}.card-author,.card-date{font-size:12px;color:var(--author-color);padding:5px;transition:box-shadow 0.2s}.card-author:hover{box-shadow:0 4px 8px rgba(0,0,0,0.2)}.card-author{cursor:pointer;background-color:var(--background-color);border:1px solid var(--border-color);border-radius:15px;display:flex;padding-right:10px;width:fit-content;height:26px;align-items:center}#friend-circle-lite-root .card-author img{border-radius:50%;width:15px;height:15px;margin:0 2px !important;object-fit:cover}.card-date{position:absolute;z-index:1;bottom:5px;cursor:default;right:10px;display:flex;align-items:center}#friend-circle-lite-root .card-bg{cursor:default;z-index:0;border-radius:50%;margin:0;position:absolute;bottom:-20px;right:-16px;width:140px;height:140px;opacity:0.4;transition:transform 0.6s ease,bottom 0.3s ease,right 0.3s ease}#friend-circle-lite-root .card:hover .card-bg{transform:scale(1.1);bottom:-10px;right:-8px}#load-more-btn{color:var(--text-color);font-size:15px;background-color:var(--container-bg-color);cursor:pointer;width:200px;border-radius:10px;border:1px solid var(--border-color);padding:3px;transition:all 0.3s;margin:20px auto;display:block}#load-more-btn:hover{background-color:var(--hover-color);width:300px;color:white}#stats-container{font-size:13px;text-align:right;margin-top:20px}#stats-container > *{margin-bottom:3px}#stats-container a{color:var(--author-color);text-decoration:none} \ No newline at end of file diff --git a/main/fclite.min.js b/main/fclite.min.js deleted file mode 100644 index 894cfb5..0000000 --- a/main/fclite.min.js +++ /dev/null @@ -1 +0,0 @@ -function initialize_fc_lite(){const root=document.getElementById('friend-circle-lite-root');if(!root)return;root.innerHTML='';const randomArticleContainer=document.createElement('div');randomArticleContainer.id='random-article';root.appendChild(randomArticleContainer);const container=document.createElement('div');container.className='articles-container';container.id='articles-container';root.appendChild(container);const loadMoreBtn=document.createElement('button');loadMoreBtn.id='load-more-btn';loadMoreBtn.innerText='再来亿点';root.appendChild(loadMoreBtn);const statsContainer=document.createElement('div');statsContainer.id='stats-container';root.appendChild(statsContainer);let start=0;let allArticles=[];function loadMoreArticles(){const cacheKey='friend-circle-lite-cache';const cacheTimeKey='friend-circle-lite-cache-time';const cacheTime=localStorage.getItem(cacheTimeKey);const now=new Date().getTime();if(cacheTime&&(now-cacheTime<10*60*1000)){const cachedData=JSON.parse(localStorage.getItem(cacheKey));if(cachedData){processArticles(cachedData);return}}fetch(`${UserConfig.private_api_url}all.json`).then(response=>response.json()).then(data=>{localStorage.setItem(cacheKey,JSON.stringify(data));localStorage.setItem(cacheTimeKey,now.toString());processArticles(data)}).finally(()=>{loadMoreBtn.innerText='再来亿点'})}function processArticles(data){allArticles=data.article_data;const stats=data.statistical_data;statsContainer.innerHTML=`
Powered by:FriendCircleLite
Designed By:LiuShen
订阅:${stats.friends_num}活跃:${stats.active_num}总文章数:${stats.article_num}
更新时间:${stats.last_updated_time}
`;const randomArticle=allArticles[Math.floor(Math.random()*allArticles.length)];randomArticleContainer.innerHTML=`
随机钓鱼
${randomArticle.title}
作者:${randomArticle.author}
`;const articles=allArticles.slice(start,start+UserConfig.page_turning_number);articles.forEach(article=>{const card=document.createElement('div');card.className='card';const title=document.createElement('div');title.className='card-title';title.innerText=article.title;card.appendChild(title);title.onclick=()=>window.open(article.link,'_blank');const author=document.createElement('div');author.className='card-author';const authorImg=document.createElement('img');authorImg.className='no-lightbox';authorImg.src=article.avatar||UserConfig.error_img;authorImg.onerror=()=>authorImg.src=UserConfig.error_img;author.appendChild(authorImg);author.appendChild(document.createTextNode(article.author));card.appendChild(author);author.onclick=()=>{showAuthorArticles(article.author,article.avatar,article.link)};const date=document.createElement('div');date.className='card-date';date.innerText="🗓️"+article.created.substring(0,10);card.appendChild(date);const bgImg=document.createElement('img');bgImg.className='card-bg no-lightbox';bgImg.src=article.avatar||UserConfig.error_img;bgImg.onerror=()=>bgImg.src=UserConfig.error_img;card.appendChild(bgImg);container.appendChild(card)});start+=UserConfig.page_turning_number;if(start>=allArticles.length){loadMoreBtn.style.display='none'}}function showAuthorArticles(author,avatar,link){if(!document.getElementById('modal')){const modal=document.createElement('div');modal.id='modal';modal.className='modal';modal.innerHTML=``;document.body.appendChild(modal)}const modal=document.getElementById('modal');const modalArticlesContainer=document.getElementById('modal-articles-container');const modalAuthorAvatar=document.getElementById('modal-author-avatar');const modalAuthorNameLink=document.getElementById('modal-author-name-link');modalArticlesContainer.innerHTML='';modalAuthorAvatar.src=avatar||UserConfig.error_img;modalAuthorAvatar.onerror=()=>modalAuthorAvatar.src=UserConfig.error_img;modalAuthorNameLink.innerText=author;modalAuthorNameLink.href=new URL(link).origin;const authorArticles=allArticles.filter(article=>article.author===author);authorArticles.slice(0,4).forEach(article=>{const articleDiv=document.createElement('div');articleDiv.className='modal-article';const title=document.createElement('a');title.className='modal-article-title';title.innerText=article.title;title.href=article.link;title.target='_blank';articleDiv.appendChild(title);const date=document.createElement('div');date.className='modal-article-date';date.innerText="📅"+article.created.substring(0,10);articleDiv.appendChild(date);modalArticlesContainer.appendChild(articleDiv)});modal.style.display='block';setTimeout(()=>{modal.classList.add('modal-open')},10)}function hideModal(){const modal=document.getElementById('modal');modal.classList.remove('modal-open');modal.addEventListener('transitionend',()=>{modal.style.display='none';document.body.removeChild(modal)},{once:true})}loadMoreArticles();loadMoreBtn.addEventListener('click',loadMoreArticles);window.onclick=function(event){const modal=document.getElementById('modal');if(event.target===modal){hideModal()}}};function whenDOMReady(){initialize_fc_lite()}whenDOMReady();document.addEventListener("pjax:complete",whenDOMReady); \ No newline at end of file diff --git a/readme.md b/readme.md index fc06992..698c00b 100644 --- a/readme.md +++ b/readme.md @@ -10,24 +10,30 @@ ## 开发进度 +### 2024-09-05 + +* 更新部署方式,将静态文件放到page分支下,主分支不放数据文件 +* 前后端分离,部署方式不变但更加直观方便 + ### 2024-09-03 * 添加特定RSS选项,用于指定部分友链特殊RSS地址 * 更新文档,添加特定RSS选项配置部分 -### 2024-08-28 +
+查看更多 + + +

2024-08-28

* 日常维护,修复issue中提出的时间为空导致错误的情况,使用更新时间代替 -### 2024-08-11 +

2024-08-11

* 添加服务器部署的情况下,合并github结果的选项 * 由于复杂性,决定将服务和定时抓取分开,使用面板自带进行配置,防止小白无法配置 * 修改文档,添加自部署部分 -
-查看更多 -

2024-08-03

* 将自部署分离为API服务和定时爬取 @@ -68,6 +74,7 @@ - **爬取文章**: 爬取所有友链的文章,结果放置在根目录的all.json文件中,方便读取并部署到前端。 - **邮箱推送更新(对作者推送所有友链更新)**: 作者可以通过邮箱订阅所有rss的更新(未来开发)。 - **issue邮箱订阅(对访客实时推送最新文章邮件)**: 基于`GitHub issue`的博客更新邮件订阅功能,游客可以通过简单的提交`issue`进行邮箱订阅站点更新,删除对应`issue`即可取消订阅。 +- **文件分离**: 将前后端分离,前端文件放在page分支,后端文件放在主分支 ## 特点介绍 @@ -86,33 +93,34 @@ * 邮箱推送 * 美观邮箱模板 * 自部署(2024-08-11添加) +* 前端单开分支(2024-09-05添加) @CCKNBC ## action部署使用方法 ### 前置工作 1. **Fork 本仓库:** - 点击页面右上角的 Fork 按钮,将本仓库复制到你自己的`GitHub`账号下。 + 点击页面右上角的 Fork 按钮,将本仓库复制到你自己的`GitHub`账号下,仅复刻main分支即可。 + ![](./static/fork.png) 2. **配置 Secrets:** 在你 Fork 的仓库中,依次进入 `Settings` -> `Secrets` -> `New repository secret`,添加以下 Secrets: - - `PAT_TOKEN`: GitHub 的个人访问令牌,用于访问 GitHub API。 - - `SMTP_PWD`: SMTP 服务器的密码,用于发送电子邮件。 + - `SMTP_PWD`(可选): SMTP 服务器的密码,用于发送电子邮件,如果你不需要,可以不进行配置。 ![](./static/1.png) -2. **配置action权限:** +3. **配置action权限:** 在设置中,点击`action`,拉到最下面,勾选`Read and write permissions`选项并保存,确保action有读写权限。 -3. **启用 GitHub Actions:** +4. **启用 GitHub Actions:** GitHub Actions 已经配置好在仓库的 `.github/workflows/*.yml` 文件中,当到一定时间时将自动执行,也可以手动运行。 其中,每个action功能如下: - - `friend_circle_lite.yml`实现核心功能,爬取并发送邮箱; + - `friend_circle_lite.yml`实现核心功能,爬取并发送邮箱,需要在Action中启用; - `deal_subscribe_issue.yml`处理固定格式的issue,打上固定标签,评论,并关闭issue; -4. **设置issue格式:** +5. **设置issue格式:** 这个我已经设置好了,你只需要检查issue部分是否有对应格式即可,可以自行修改对应参数以进行自定义。 ### 配置选项 @@ -138,7 +146,7 @@ `article_count`:每个作者留存文章个数。 - `marge_result`:是否合并多个json文件,若为true则会合并指定网络地址和本地地址的json文件 + `marge_result`:是否合并多个json文件,若为true则会合并指定网络地址和本地地址的json文件并去重 - `enable`:是否启用合并功能,该功能提供与自部署的友链合并功能,可以解决服务器部分国外网站,服务器无法访问的问题 @@ -174,7 +182,7 @@ `github_repo`:仓库名称,作用同上。 - `your_blog_url`:用来定时检测是否有最新文章。 + `your_blog_url`:用来定时检测是否有最新文章,请确保你的网站可以被FCLite抓取到 - **SMTP 配置** 使用配置中的相关信息实现邮件发送功能。 @@ -197,7 +205,7 @@ 这部分配置较为复杂,请自行学习使用。 - - ** 特定RSS配置 ** + - **特定 RSS 配置** 用于指定特定友链特殊RSS,样例如下: @@ -216,8 +224,12 @@ 2. **贡献与定制:** 欢迎对仓库进行贡献或根据需要进行定制。 +**如果你配置正常,那么等action运行一次(可以手动运行)应该就可以在page分支看到结果了,检查一下,如果结果无误,可以继续看下一步** + ### 友圈json生成 +**注意,以下可能仅适用于hexo-theme-butterfly或部分类butterfly主题,如果你是其他主题,可以自行适配,理论上只要存在友链数据文件都可以整理为该类型,甚至可以自行整理为对应json格式后放到 `/source` 目录下即可,格式可以参考:`https://blog.qyliu.top/friend.json` ** + 1. 将以下文件放置到博客根目录: ```javascript @@ -272,11 +284,27 @@ 如果是github action,可以在hexo g脚本前添加即可完整构建,注意需要安装yaml包才可解析yml文件。 -## 部署到网页 +## 部署静态网站 -首先,将该项目部署到vercel,部署到vercel的目的主要是利用vercel检测仓库并实时刷新的功能,及时获取all.json文件内容。任意平台均可。 +首先,将该项目部署到vercel,部署到vercel等平台的目的主要是检测仓库变动并实时更新数据,及时获取all.json文件内容。任意平台均可,但是注意,部署的分支为page分支。 -部署完成后,你将获得一个地址,建议自行绑定域名。 +1. vercel 部署完成后,检查对应页面,如果页面中没有数据,且 `/all.json` 路径无法访问可能是部署到main分支了,可以通过 `setting-git-Production Branch` ,填写为page并重新进行部署即可 + + ![](./static/vercel.png) + +2. zeabur 可以在部署时直接选择分支: + + ![](./static/zeabur.png) + +3. CloudFlare Page 也可以在构建时即选择对应的分支,这里不再细讲。 + + ![](./static/cloudflare.png) + +部署完成后,你将获得一个地址,如果是通过vercel部署的,建议自行绑定域名。 + +检查 `https://example.com/all.json` 是否有数据,如果有,则部署成功。 + +## 部署到你的页面 在前端页面的md文件中写入: diff --git a/static/cloudflare.png b/static/cloudflare.png new file mode 100644 index 0000000..2329d5d Binary files /dev/null and b/static/cloudflare.png differ diff --git a/static/fork.png b/static/fork.png new file mode 100644 index 0000000..fd15ef1 Binary files /dev/null and b/static/fork.png differ diff --git a/static/vercel.png b/static/vercel.png new file mode 100644 index 0000000..ed1d7c9 Binary files /dev/null and b/static/vercel.png differ diff --git a/static/zeabur.png b/static/zeabur.png new file mode 100644 index 0000000..890898e Binary files /dev/null and b/static/zeabur.png differ