Alovoa - 开源隐私优先的约会平台
项目标题与描述
Alovoa是一个旨在成为首个广泛使用的免费开源约会网络平台。与其他平台不同,Alovoa具有以下核心价值:
- 无广告
- 不出售用户数据
- 无付费功能(无"付费超级喜欢"、"付费滑动"、"付费查看资料"或"付费开始聊天")
- 安全的服务器
- 完全开源
- 提供高级筛选功能避免看到不想见的人
- 最隐私的数据采用安全加密
功能特性
核心功能
- 用户注册与认证系统
- 个人资料管理(包括图片、音频、个人描述等)
- 基于地理位置和兴趣的匹配系统
- 实时聊天功能
- 验证码系统防止滥用
- 管理员后台管理
- 多语言支持
- 响应式设计支持移动端
安全特性
- 端到端文本加密
- 验证码保护关键操作
- 敏感数据加密存储
- GDPR合规设计
- 账户删除功能
技术亮点
- 基于Spring Boot的后端架构
- JPA/Hibernate数据持久层
- Spring Security安全框架
- RESTful API设计
- 支持Docker部署
- 支持MariaDB数据库
安装指南
系统要求
- Java 17+
- Maven
- MariaDB数据库
- 邮件服务器
本地开发环境安装
- 安装OpenJDK 17
- 安装Maven
- 设置MariaDB数据库
- 配置邮件服务器
- 在application.properties中配置数据库、邮件服务器和加密密钥
- 执行
mvn install
Docker部署
docker-compose build
docker-compose up -d
docker-compose logs -f
数据库设置
# 开发数据库
mysql -uroot -e "CREATE DATABASE alovoa DEFAULT CHARACTER SET utf8"
mysql -uroot -e "CREATE USER 'alovoa'@'localhost' IDENTIFIED BY 'alovoa'"
mysql -uroot -e "GRANT ALL PRIVILEGES ON alovoa.* TO 'alovoa'@'localhost'"
# 测试数据库
mysql -uroot -e "CREATE DATABASE alovoa_test DEFAULT CHARACTER SET utf8"
mysql -uroot -e "CREATE USER 'alovoa_test'@'localhost' IDENTIFIED BY 'alovoa_test'"
mysql -uroot -e "GRANT ALL PRIVILEGES ON alovoa_test.* TO 'alovoa_test'@'localhost'"
使用说明
API使用示例
获取验证码
@RestController
@RequestMapping("/captcha")
public class CaptchaController {
@Autowired
private CaptchaService captchaService;
@GetMapping("/generate")
public Captcha generate() throws NoSuchAlgorithmException, IOException {
return captchaService.generate();
}
}
用户注册
@RestController
@RequestMapping("/")
public class RegisterController {
@Autowired
private RegisterService registerService;
@PostMapping(value = "/register", consumes = "application/json")
public void register(@RequestBody RegisterDto dto) throws Exception {
registerService.register(dto);
}
}
搜索用户
@Controller
@RequestMapping("/search")
public class SearchController {
@Autowired
private SearchService searchService;
@GetMapping("/users/default")
public String getUsersDefault(Model model) throws Exception {
model.addAttribute("dto", searchService.searchComplete());
return "fragments :: search-users";
}
}
核心代码
应用主入口
@SpringBootApplication
@EnableJpaRepositories("com.nonononoki.alovoa.repo")
@EntityScan("com.nonononoki.alovoa.entity")
@EnableCaching
@EnableScheduling
public class AlovoaApplication {
public static void main(String[] args) {
Security.addProvider(new BouncyCastleProvider());
SpringApplication.run(AlovoaApplication.class, args);
}
}
用户实体类
@Entity
public class User implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
@Convert(converter = TextEncryptorConverter.class)
@JsonIgnore
private String email;
@JsonIgnore
private String password;
@Convert(converter = TextEncryptorConverter.class)
private String firstName;
private String description;
private int units;
private boolean showZodiac;
private int preferedMinAge;
private int preferedMaxAge;
// 其他字段和方法...
}
文本加密转换器
@Component
public class TextEncryptorConverter implements AttributeConverter<String, String> {
@Value("${app.text.key}")
private String key;
@Value("${app.text.salt}")
private String salt;
private static final String TRANSFORMATION = "AES/CBC/PKCS5PADDING";
@Override
public String convertToDatabaseColumn(String attribute) {
try {
return encode(attribute);
} catch (Exception e) {
throw new DatabaseRuntimeException(e);
}
}
private String encode(String attribute) throws Exception {
if(attribute == null) return null;
byte[] ba = getEnCipher().doFinal(attribute.getBytes(StandardCharsets.UTF_8));
return Base64.getUrlEncoder().encodeToString(ba);
}
// 其他方法...
}
验证码服务
@Service
public class CaptchaService {
@Autowired
private CaptchaRepository captchaRepo;
public Captcha generate() throws NoSuchAlgorithmException, IOException {
OxCaptcha ox = generateCaptchaImage();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(ox.getImage(), "webp", baos);
byte[] ba = baos.toByteArray();
String encoded = Base64.getEncoder().encodeToString(ba);
Captcha captcha = new Captcha();
captcha.setImage(encoded);
captcha.setText(ox.getText());
return captchaRepo.saveAndFlush(captcha);
}
// 其他方法...
}
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码

Alovoa - 开源隐私优先的约会平台的更多相关文章
- ArtiPub:一款开源的一文多发平台
文章来自我的博客:https://blog.ljyngup.com/archives/705.html/ 看到感觉挺有意思的,有空找个空闲的VPS搭建一下. 转自官方Github仓库 ArtiPub ...
- 基于 Markdown 的开源的 Node.js 知识库平台
Raneto 是一个免费,开源的 Node.js 知识库平台,基于静态 Markdown 文件实现. Raneto 可以被称为静态网站生成器,因为它并不需要数据库支持.所有的内容都存储在 Markdo ...
- 国内外开源与 SaaS ,团队协作平台、项目管理工具整理
整理一些开源与 SaaS ,团队协作平台.项目管理工具.还有哪些比较好的工具,可以推荐下? 名称 地址 备注 asana https://asana.com/ 国外 basecamp https:// ...
- AEAI ESB V3.5.4开源发布,应用集成平台
AEAI ESB 应用集成平台为数通畅联的核心产品,本着分享传递的理念,数通畅联将ESB管理控制台项目开源,目的在于满足客户与伙伴的OEM需求,以及为广大IT爱好者的集成工具提供多一种选择,多一种便利 ...
- JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的 开源 Java EE快速开发平台
JeeSite本身是以Spring Framework为核心容器,Spring MVC为模型视图控制器,MyBatis为数据访问层, Apache Shiro为权限授权层,Ehcahe对常用数据进行缓 ...
- Github开源项目(企业信息化基础平台)
JEEPlatform 一款企业信息化开发基础平台,可以用于快速构建企业后台管理系统,集成了OA(办公自动化).SCM(供应链系统).ERP(企业资源管理系统).CMS(内容管理系统).CRM(客户关 ...
- SpringBoot开源项目(企业信息化基础平台)
JEEPlatform 一款企业信息化开发基础平台,可以用于快速构建企业后台管理系统,集成了OA(办公自动化).SCM(供应链系统).ERP(企业资源管理系统).CMS(内容管理系统).CRM(客户关 ...
- ERP开源框架 + 二次开发平台 介绍
经历了多年软件开发,深受网络大侠们的资源共享才得以有所成绩, 本人主要是做企业ERP软件,一直有个感受,开发具体某个功能不难,但随着需求的增加,管理庞大的代码却成了最大的问题 而为企业管理所做的开发, ...
- kettle系列-我的开源kettle调度、管理平台[kettle-manager]介绍
kettle管理工具 专门为kettle这款优秀的ETL工具开发的web端调度.管理工具. 新版本 项目简介 kettle作为非常优秀的开源ETL工具得到了非常广泛的使用,一般的使用的都是使用客户端操 ...
- OpenNESS,开源的边缘网络服务平台
目录 文章目录 目录 参考文章 OpenNESS 的电梯间演讲 OpenNESS 与 ETSI MEC Edge Controller Software 的功能清单 Edge Platform Sof ...
随机推荐
- Golang 语言学习路线
学习Go语言是一个很好的选择,它具有高效的编译速度.强大的并发支持和简洁的语法.适用于初学者的Golang学习路线: 1. 学习基础: 安装Go:从官方网站下载并安装Go语言的最新版本. Hello, ...
- 【JVM之内存与垃圾回收篇】垃圾回收相关算法
垃圾回收相关算法 标记阶段:引用计数算法 在堆里存放着几乎所有的 Java 对象实例,在 GC 执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象.只有被标记为己经死亡的对象, ...
- 学习Linux命令的正确姿势
大家好,我是良许. 大家应该注意到了,最近我的公众号文章末尾都挂着自己录制的<Linux命令从小白到大神>课程. 这个课程我从开始录制到制作完成,足足花了一个半月.如果加上前期的资料收集与 ...
- SRAM的读、写操作、信息保持原理
\(Vcc\)会使得\(T_3\)和\(T_4\)导通,但是哪个先导通是随机的,那么当\(T3\)先导通的时候,\(a\)点变为高电平,此时电流经由 \(a\) 点导通\(T2\),\(T2\)导通, ...
- 一条 SQL 语句在 MySQL 中的执行过程
一条 SQL 语句在 MySQL 中的执行过程 当一条 SQL 语句被提交到 MySQL 时,它会经历多个步骤,包括解析.优化.执行等.以下以 SELECT 语句为例,详细描述整个执行流程. 1. 客 ...
- require、include、require_once和use的区别/命名空间的使用方法
1.require.include require.include都是文件包含,不同的是require语句会输出错误信息,并且立即终止脚本处理.而include语句在没有找到文件时则会输出警告,不会终 ...
- 在IIS发布.net9 api程序踩坑总结
参照:.NET 9.0 WebApi 发布到 IIS 详细步骤_webapi发布到iis-CSDN博客 环境搭建: 注意安装与程序版本对应的Windows Server Hosting,安装完成之后, ...
- C# 线程(一)——基础概念(线程与进程、前后台线程)
一.基础概念 1.1线程与进程 线程--是一个可执行路径,它可以独立于其他线程执行. 进程--每个线程都在操作系统的进程(Process)内执行,而操作系统则提供了程序运行的独立环境,它提供了一个应用 ...
- scrcpy - Android手机投屏操作神器
推荐一个Genymotion推出的投屏工具,跨平台,自定义码率,最重要的是开源,简直良心. Github:https://github.com/Genymobile/scrcpy 下载地址: http ...
- 使用 PyInstaller 打包 Python 应用并解决依赖问题
使用 PyInstaller 打包 Python 应用并解决依赖问题 在 Python 开发中,有时需要将程序打包成独立的可执行文件,以便分发和部署.PyInstaller 是一个广泛使用的工具,可以 ...