kamera

kamera

开源摄影作品展示与管理系统

Kamera 是基于 Nuxt 3 开发的开源摄影作品管理系统。它提供瀑布流展示、EXIF 信息预览和多种存储方式支持。该系统可轻松上传管理照片,支持首页精选展示,兼容常见图片格式,并适配 PC 和移动端。Kamera 为摄影爱好者提供了便捷的作品展示和管理平台。

Kamera摄影网站Nuxt 3图片管理瀑布流Github开源项目
<h1 align="center"> <img width="28" src="https://yellow-cdn.veclightyear.com/835a84d5/f43933c0-68fa-475f-bae0-8bb247b552c9.png"> Kamera </h1> <p align="center"> <a href="https://github.com/besscroft/kamera/blob/main/LICENSE"><img src="https://img.shields.io/github/license/besscroft/kamera?style=flat-square" alt="许可证"></a> <img src="https://img.shields.io/github/repo-size/besscroft/kamera?style=flat-square&color=328657" alt="存储库大小"> </p>

这是一个专为摄影爱好者设计的记录网站,基于 Nuxt 3 开发,采用瀑布流展示图片,支持预览图片及 EXIF 信息,兼容常见的图片格式。 它可以读取 EXIF 信息并上传、管理维护图片数据,首页展示精品照片,子页面分类展示等功能。 图片存储兼容 S3 API、AList API,并支持 CDN 配置。同时适配了 PC 和移动端的样式与交互。 今天又是想成为二次元摄影高手的一天呢!

试试 kamera 的下一个版本 PicImpact

无障碍支持

我们正在努力支持无障碍功能,主要基于 WAI-ARIA 规范,有爱,无障碍!

如何部署

你可以 Fork 后点击下面的按钮来一键部署到 Vercel(自定义配置及容器部署请往下看)

<a href="https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fbesscroft%2Fkamera&env=Postgre_HOST,Postgre_PORT,Postgre_DATABASE,Postgre_USERNAME,Postgre_PASSWORD"><img src="https://vercel.com/button" alt="Deploy with Vercel"/></a>

当然,如果你想部署到其它平台或者自部署也是可以的,只需要改一下预设即可 nuxt.config.ts

nitro: { preset: 'vercel' // 可选 vercel、netlify、node-server,或者删除这一行,构建时也会自适应的。 }

数据库

数据库请选择兼容 PostgreSQL 的数据库,我推荐 SupaBase,它的每月免费额度足够个人使用了! 创建数据库后,将 doc/sql/schema.sql 导入到数据库执行。在 DashboardSettings 找到 Database 部分,你就能查看连接信息了。 当然,只要是兼容 pg 的数据库都是可以选择的,不必局限于某个平台。

注:从 2024-01-26 起,将删除通过 IPv4 和 pgBouncer 的数据库访问方式。 在这之前部署且数据库使用 SupaBase 的用户,请更新数据库连接信息。 在 Connection parameters 里勾选 Use connection pooling 选项即可。

请确保您的数据库用户配置了正确的 Row Level Security(行级别安全性)权限,否则将无法正常访问。

如果您是第一次部署,仅需要执行 schema.sql 即可,如果您是升级到涉及数据库变更的版本,请在执行对应版本编号的 sql 后再升级部署!

系统默认账号密码为:admin / 666666

图片存储

存储你可以选择 AWS S3、阿里云 OSS 或者自建 MinIO(理论上来说兼容 S3 的都行),也可以交由你正在用的 AList 来维护。

环境变量

请在部署前设置您的环境变量,程序会去读这些值,用以更改构建步骤或函数执行期间的行为。

所有值都经过静态加密,并且对有权访问该项目的任何用户都可见。使用非敏感数据和敏感数据都是安全的。但请注意您自己不要泄露环境变量的值!

如果您更改了环境变量,它不会影响当前的部署,您需要重新构建部署后才会生效!

当然,如果您是容器化部署的,更改环境变量后只需要重启容器就行了,无需重新构建!

受限于 Nuxt3 的局限性,某些设计可能不是特别人性化(主要还是懒),望理解!

请注意,平台部署请在平台控制台填写环境变量,会自动覆盖 .env.production 的值,以免发生机密信息泄露!

项目内默认的 key 都是用作演示用途!

Key备注
Postgre_HOSTPostgre 数据库主机,如:db.kamera.supabase.co
Postgre_PORTPostgre 数据库端口,默认值:5432
Postgre_DATABASEPostgre 数据库名称,默认值:postgres
Postgre_USERNAMEPostgre 数据库用户名,默认值:postgres
Postgre_PASSWORDPostgre 数据库密码,默认值:postgres

页面配置

我们支持自定义相册页面的标题和链接,当然也是支持多个相册页面的。 你需要在 constants\photos.json 文件中,进行如下配置:

[ { "title": "Cosplay", "url": "/cosplay", "icon": "i-carbon-camera" }, { "title": "集邮", "url": "/tietie", "icon": "i-carbon-face-wink" }, { "title": "时光相册", "url": "/timeline", "icon": "i-carbon-image" } ]

顾名思义,titleurl 对应的就是页面标题和页面地址,如果您想正常使用的话,还请照葫芦画瓢,而不是乱填。 图标可以在 Icones 找到,用相同的规则填写在 icon 中.

每配置一个页面,都会对应的增添一个图片类别选项,在您的对象存储中,也会增加对应的文件夹。

同时也会被配置成 pre-rendered,从而在某些情况下加快 Hydration,带来更快的页面加载,以及更好的 SEO。

注意添加的页面,别忘了配置白名单哦!

白名单配置

我们提供了客户端路由中间件和服务端接口中间件,默认情况下你不需要管,但如果你想自定义白名单,这里提供了配置方案。 在 app.config.ts 文件中,可以看到如下默认配置:

export default defineAppConfig({ noLoginPageWhiteList: [ '/', '/login', '/tietie', '/cosplay', '/timeline', '/about', '/error', ], loginPageWhiteList: [ '/admin', '/admin/upload', '/admin/list', '/admin/system', ], apiWhiteList: [ '/api/login', '/api/verify', '/api/getImageList', ] })

noLoginPageWhiteList 对于客户端路由中间件和服务端接口中间件来说,不需要登录就能访问的页面。

loginPageWhiteList 对于客户端路由中间件来说,需要 token 才能访问;对于服务端接口中间件来说,必须要填写才能访问的页面。

apiWhiteList 不需要 token 就能访问的接口。

网站配置

constants/index.ts 文件,可以配置:

Key备注
appName网站标题
appDescription网站描述

app.config.ts 文件中,可以配置:

Key备注
mobileRow移动端瀑布流显示列数,可选值[1, 2]

容器部署

我把容器部署往后放,是不希望前面的内容被跳过,这样你在构建/部署时才能得心应手!

直接部署

如果你想用我的镜像(由 GitHub Actions 构建),就意味着你的某些配置与我相同,比如网站的几个目录。 但实际上你肯定得改一下网站标题,配置子页面啊之类的,改一下音乐播放器里面的歌之类的。

所以我的镜像只适合你快速体验预览之类的,还是建议你自己构建(反正也很方便),或者你直接部署到 Vercel 之类的平台。 如果你要运行我的镜像,你只需要执行下面的命令即可部署:

docker run -d --name kamera \ -p 3000:3000 \ -e Postgre_HOST="db.supabase.co" \ -e Postgre_PORT="5432" \ -e Postgre_DATABASE="postgres" \ -e Postgre_USERNAME="postgres" \ -e Postgre_PASSWORD="postgres" \ besscroft/kamera:latest

看到这里您应该明白,环境变量当然要换成自己的!

自己构建镜像

无需多说,直接 fork 本项目,然后更改任意文件并 commit 后,会自动触发 GitHub Actions 构建。 当然在那之前,你需要先在你 fork 的仓库创建 2 个机密,具体看为存储库创建机密

DOCKERHUB_USERNAMEDOCKERHUB_TOKEN 这两个,这样才能在构建后,上传到你自己的 docker 仓库去。

在构建好镜像之后,你可以用上面的命令执行(记得镜像换成你自己构建的哈),如果你要 Docker Compose 执行:

version: '3' services: kamera: image: besscroft/kamera:latest container_name: kamera ports: - 3000:3000 environment: - Postgre_HOST="db.supabase.co" - Postgre_PORT=5432 - Postgre_DATABASE="postgres" - Postgre_USERNAME="postgres" - Postgre_PASSWORD="postgres"

一样的,参考上面的环境变量表格,配置你自己的环境变量。

构建镜像 Q&A

问:我 fork 仓库后,修改了网站设置为自己的,构建的镜像被他人使用会有风险吗?

答:原则上没有风险,但如果你自己在文件中填写了机密信息,那就是你自己的问题! 除非你自己泄露,否则别人是不知道你的环境变量值的!

问:为什么使用你这个工具这么麻烦?其他人的都能把数据存在数据库里,访问时动态获取。

答:基于 SSR 的特性,大部分配置内容是在编译期处理的,比如我们配置的那些自定义页面。原则上来说,能放进数据库的配置,我已经尽可能放进去了!

自行编译并部署

这种方式适合那些想自己打包直接在 Node 上运行的朋友。

git clone https://github.com/besscroft/kamera.git pnpm i pnpm run build

构建完成后,你会看到一个 .output 文件夹,你可以使用如下命令运行:

node /app/.output/server/index.mjs

如果你选择这种部署方式,我相信你是会使用 Node 的。

服务器面板

对于使用宝塔面板、1Panel 等面板的用户,以及使用 Nginx 来提供访问服务的用户,记得配置反向代理:

location ^~ / { proxy_pass http://localhost:3000; }

端口和路径等设置,取决于你自己部署时的具体配置。

本地开发

克隆到本地进行开发:

git clone https://github.com/besscroft/kamera.git pnpm i pnpm run dev

如果您有任何建议,欢迎反馈!

代码贡献

提出新想法 & 提交 Bug | Fork & Pull Request

Kamera 欢迎各种形式的贡献,包括但不限于改进、新功能、文档和代码改进、问题和错误报告。dev 分支接受 PR

有需求和建议都可以提出,有空的话我会处理,但受限于 Nuxt3 / SSR 的⌈局限性⌋,很多功能的设计上可能会有取舍。

隐私安全

使用本程序时,您需要自行维护各个平台的配置信息(毕竟与我们无关,需要在相应的平台进行配置),以及对象存储的读写权限、访问控制、防盗链、跨域设置、缓存策略和 CDN 等配置,以最大程度地避免天价账单。

如您有更多疑问,可以提交 Issue

浏览器支持

  • Chrome、Firefox、Safari 和 Edge 的最新两个版本
  • Firefox ESR

实际上,只要不是过于老旧的浏览器,通常都是可以使用的。

技术栈

感谢

本项目使用 JetBrains 的开源许可证,基于 IntelliJ IDEA 开发,感谢!

JetBrains 徽标(主要) logo

IntelliJ IDEA logo

许可证

Kamera 是基于 MIT 许可的开源软件。

编辑推荐精选

Vora

Vora

免费创建高清无水印Sora视频

Vora是一个免费创建高清无水印Sora视频的AI工具

Refly.AI

Refly.AI

最适合小白的AI自动化工作流平台

无需编码,轻松生成可复用、可变现的AI自动化工作流

酷表ChatExcel

酷表ChatExcel

大模型驱动的Excel数据处理工具

基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。

AI工具酷表ChatExcelAI智能客服AI营销产品使用教程
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
AIWritePaper论文写作

AIWritePaper论文写作

AI论文写作指导平台

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

AI辅助写作AI工具AI论文工具论文写作智能生成大纲数据安全AI助手热门
博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

AI办公办公工具AI工具博思AIPPTAI生成PPT智能排版海量精品模板AI创作热门
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

iTerms

iTerms

企业专属的AI法律顾问

iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。

SimilarWeb流量提升

SimilarWeb流量提升

稳定高效的流量提升解决方案,助力品牌曝光

稳定高效的流量提升解决方案,助力品牌曝光

Sora2视频免费生成

Sora2视频免费生成

最新版Sora2模型免费使用,一键生成无水印视频

最新版Sora2模型免费使用,一键生成无水印视频

下拉加载更多