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

编辑推荐精选

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

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

AI工具TraeAI IDE协作生产力转型热门
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

Hunyuan3D-2

Hunyuan3D-2

高分辨率纹理 3D 资产生成

Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。

3FS

3FS

一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。

3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。

下拉加载更多