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 许可的开源软件。

编辑推荐精选

音述AI

音述AI

全球首个AI音乐社区

音述AI是全球首个AI音乐社区,致力让每个人都能用音乐表达自我。音述AI提供零门槛AI创作工具,独创GETI法则帮助用户精准定义音乐风格,AI润色功能支持自动优化作品质感。音述AI支持交流讨论、二次创作与价值变现。针对中文用户的语言习惯与文化背景进行专门优化,支持国风融合、C-pop等本土音乐标签,让技术更好地承载人文表达。

QoderWork

QoderWork

阿里Qoder团队推出的桌面端AI智能体

QoderWork 是阿里推出的本地优先桌面 AI 智能体,适配 macOS14+/Windows10+,以自然语言交互实现文件管理、数据分析、AI 视觉生成、浏览器自动化等办公任务,自主拆解执行复杂工作流,数据本地运行零上传,技能市场可无限扩展,是高效的 Agentic 生产力办公助手。

lynote.ai

lynote.ai

一站式搞定所有学习需求

不再被海量信息淹没,开始真正理解知识。Lynote 可摘要 YouTube 视频、PDF、文章等内容。即时创建笔记,检测 AI 内容并下载资料,将您的学习效率提升 10 倍。

AniShort

AniShort

为AI短剧协作而生

专为AI短剧协作而生的AniShort正式发布,深度重构AI短剧全流程生产模式,整合创意策划、制作执行、实时协作、在线审片、资产复用等全链路功能,独创无限画布、双轨并行工业化工作流与Ani智能体助手,集成多款主流AI大模型,破解素材零散、版本混乱、沟通低效等行业痛点,助力3人团队效率提升800%,打造标准化、可追溯的AI短剧量产体系,是AI短剧团队协同创作、提升制作效率的核心工具。

seedancetwo2.0

seedancetwo2.0

能听懂你表达的视频模型

Seedance two是基于seedance2.0的中国大模型,支持图像、视频、音频、文本四种模态输入,表达方式更丰富,生成也更可控。

nano-banana纳米香蕉中文站

nano-banana纳米香蕉中文站

国内直接访问,限时3折

输入简单文字,生成想要的图片,纳米香蕉中文站基于 Google 模型的 AI 图片生成网站,支持文字生图、图生图。官网价格限时3折活动

扣子-AI办公

扣子-AI办公

职场AI,就用扣子

AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!

堆友

堆友

多风格AI绘画神器

堆友平台由阿里巴巴设计团队创建,作为一款AI驱动的设计工具,专为设计师提供一站式增长服务。功能覆盖海量3D素材、AI绘画、实时渲染以及专业抠图,显著提升设计品质和效率。平台不仅提供工具,还是一个促进创意交流和个人发展的空间,界面友好,适合所有级别的设计师和创意工作者。

图像生成AI工具AI反应堆AI工具箱AI绘画GOAI艺术字堆友相机AI图像热门
码上飞

码上飞

零代码AI应用开发平台

零代码AI应用开发平台,用户只需一句话简单描述需求,AI能自动生成小程序、APP或H5网页应用,无需编写代码。

Vora

Vora

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

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

下拉加载更多