项目标题与描述

Alovoa是一个旨在成为首个广泛使用的免费开源约会网络平台。与其他平台不同,Alovoa具有以下核心价值:

  • 无广告
  • 不出售用户数据
  • 无付费功能(无"付费超级喜欢"、"付费滑动"、"付费查看资料"或"付费开始聊天")
  • 安全的服务器
  • 完全开源
  • 提供高级筛选功能避免看到不想见的人
  • 最隐私的数据采用安全加密

功能特性

核心功能

  • 用户注册与认证系统
  • 个人资料管理(包括图片、音频、个人描述等)
  • 基于地理位置和兴趣的匹配系统
  • 实时聊天功能
  • 验证码系统防止滥用
  • 管理员后台管理
  • 多语言支持
  • 响应式设计支持移动端

安全特性

  • 端到端文本加密
  • 验证码保护关键操作
  • 敏感数据加密存储
  • GDPR合规设计
  • 账户删除功能

技术亮点

  • 基于Spring Boot的后端架构
  • JPA/Hibernate数据持久层
  • Spring Security安全框架
  • RESTful API设计
  • 支持Docker部署
  • 支持MariaDB数据库

安装指南

系统要求

  • Java 17+
  • Maven
  • MariaDB数据库
  • 邮件服务器

本地开发环境安装

  1. 安装OpenJDK 17
  2. 安装Maven
  3. 设置MariaDB数据库
  4. 配置邮件服务器
  5. 在application.properties中配置数据库、邮件服务器和加密密钥
  6. 执行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 - 开源隐私优先的约会平台的更多相关文章

  1. ArtiPub:一款开源的一文多发平台

    文章来自我的博客:https://blog.ljyngup.com/archives/705.html/ 看到感觉挺有意思的,有空找个空闲的VPS搭建一下. 转自官方Github仓库 ArtiPub ...

  2. 基于 Markdown 的开源的 Node.js 知识库平台

    Raneto 是一个免费,开源的 Node.js 知识库平台,基于静态 Markdown 文件实现. Raneto 可以被称为静态网站生成器,因为它并不需要数据库支持.所有的内容都存储在 Markdo ...

  3. 国内外开源与 SaaS ,团队协作平台、项目管理工具整理

    整理一些开源与 SaaS ,团队协作平台.项目管理工具.还有哪些比较好的工具,可以推荐下? 名称 地址 备注 asana https://asana.com/ 国外 basecamp https:// ...

  4. AEAI ESB V3.5.4开源发布,应用集成平台

    AEAI ESB 应用集成平台为数通畅联的核心产品,本着分享传递的理念,数通畅联将ESB管理控制台项目开源,目的在于满足客户与伙伴的OEM需求,以及为广大IT爱好者的集成工具提供多一种选择,多一种便利 ...

  5. JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的 开源 Java EE快速开发平台

    JeeSite本身是以Spring Framework为核心容器,Spring MVC为模型视图控制器,MyBatis为数据访问层, Apache Shiro为权限授权层,Ehcahe对常用数据进行缓 ...

  6. Github开源项目(企业信息化基础平台)

    JEEPlatform 一款企业信息化开发基础平台,可以用于快速构建企业后台管理系统,集成了OA(办公自动化).SCM(供应链系统).ERP(企业资源管理系统).CMS(内容管理系统).CRM(客户关 ...

  7. SpringBoot开源项目(企业信息化基础平台)

    JEEPlatform 一款企业信息化开发基础平台,可以用于快速构建企业后台管理系统,集成了OA(办公自动化).SCM(供应链系统).ERP(企业资源管理系统).CMS(内容管理系统).CRM(客户关 ...

  8. ERP开源框架 + 二次开发平台 介绍

    经历了多年软件开发,深受网络大侠们的资源共享才得以有所成绩, 本人主要是做企业ERP软件,一直有个感受,开发具体某个功能不难,但随着需求的增加,管理庞大的代码却成了最大的问题 而为企业管理所做的开发, ...

  9. kettle系列-我的开源kettle调度、管理平台[kettle-manager]介绍

    kettle管理工具 专门为kettle这款优秀的ETL工具开发的web端调度.管理工具. 新版本 项目简介 kettle作为非常优秀的开源ETL工具得到了非常广泛的使用,一般的使用的都是使用客户端操 ...

  10. OpenNESS,开源的边缘网络服务平台

    目录 文章目录 目录 参考文章 OpenNESS 的电梯间演讲 OpenNESS 与 ETSI MEC Edge Controller Software 的功能清单 Edge Platform Sof ...

随机推荐

  1. Golang 语言学习路线

    学习Go语言是一个很好的选择,它具有高效的编译速度.强大的并发支持和简洁的语法.适用于初学者的Golang学习路线: 1. 学习基础: 安装Go:从官方网站下载并安装Go语言的最新版本. Hello, ...

  2. 【JVM之内存与垃圾回收篇】垃圾回收相关算法

    垃圾回收相关算法 标记阶段:引用计数算法 在堆里存放着几乎所有的 Java 对象实例,在 GC 执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象.只有被标记为己经死亡的对象, ...

  3. 学习Linux命令的正确姿势

    大家好,我是良许. 大家应该注意到了,最近我的公众号文章末尾都挂着自己录制的<Linux命令从小白到大神>课程. 这个课程我从开始录制到制作完成,足足花了一个半月.如果加上前期的资料收集与 ...

  4. SRAM的读、写操作、信息保持原理

    \(Vcc\)会使得\(T_3\)和\(T_4\)导通,但是哪个先导通是随机的,那么当\(T3\)先导通的时候,\(a\)点变为高电平,此时电流经由 \(a\) 点导通\(T2\),\(T2\)导通, ...

  5. 一条 SQL 语句在 MySQL 中的执行过程

    一条 SQL 语句在 MySQL 中的执行过程 当一条 SQL 语句被提交到 MySQL 时,它会经历多个步骤,包括解析.优化.执行等.以下以 SELECT 语句为例,详细描述整个执行流程. 1. 客 ...

  6. require、include、require_once和use的区别/命名空间的使用方法

    1.require.include require.include都是文件包含,不同的是require语句会输出错误信息,并且立即终止脚本处理.而include语句在没有找到文件时则会输出警告,不会终 ...

  7. 在IIS发布.net9 api程序踩坑总结

    参照:.NET 9.0 WebApi 发布到 IIS 详细步骤_webapi发布到iis-CSDN博客 环境搭建: 注意安装与程序版本对应的Windows Server Hosting,安装完成之后, ...

  8. C# 线程(一)——基础概念(线程与进程、前后台线程)

    一.基础概念 1.1线程与进程 线程--是一个可执行路径,它可以独立于其他线程执行. 进程--每个线程都在操作系统的进程(Process)内执行,而操作系统则提供了程序运行的独立环境,它提供了一个应用 ...

  9. scrcpy - Android手机投屏操作神器

    推荐一个Genymotion推出的投屏工具,跨平台,自定义码率,最重要的是开源,简直良心. Github:https://github.com/Genymobile/scrcpy 下载地址: http ...

  10. 使用 PyInstaller 打包 Python 应用并解决依赖问题

    使用 PyInstaller 打包 Python 应用并解决依赖问题 在 Python 开发中,有时需要将程序打包成独立的可执行文件,以便分发和部署.PyInstaller 是一个广泛使用的工具,可以 ...