找回密码
 立即注册
首页 业界区 业界 Alovoa - 开源隐私优先的约会平台

Alovoa - 开源隐私优先的约会平台

摹熹 2025-6-29 18:09:19
项目标题与描述

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部署
  1. docker-compose build
  2. docker-compose up -d
  3. docker-compose logs -f
复制代码
数据库设置
  1. # 开发数据库
  2. mysql -uroot -e "CREATE DATABASE alovoa DEFAULT CHARACTER SET utf8"
  3. mysql -uroot -e "CREATE USER 'alovoa'@'localhost' IDENTIFIED BY 'alovoa'"
  4. mysql -uroot -e "GRANT ALL PRIVILEGES ON alovoa.* TO 'alovoa'@'localhost'"
  5. # 测试数据库
  6. mysql -uroot -e "CREATE DATABASE alovoa_test DEFAULT CHARACTER SET utf8"
  7. mysql -uroot -e "CREATE USER 'alovoa_test'@'localhost' IDENTIFIED BY 'alovoa_test'"
  8. mysql -uroot -e "GRANT ALL PRIVILEGES ON alovoa_test.* TO 'alovoa_test'@'localhost'"
复制代码
使用说明

API使用示例

获取验证码
  1. @RestController
  2. @RequestMapping("/captcha")
  3. public class CaptchaController {
  4.     @Autowired
  5.     private CaptchaService captchaService;
  6.     @GetMapping("/generate")
  7.     public Captcha generate() throws NoSuchAlgorithmException, IOException {
  8.         return captchaService.generate();
  9.     }
  10. }
复制代码
用户注册
  1. @RestController
  2. @RequestMapping("/")
  3. public class RegisterController {
  4.     @Autowired
  5.     private RegisterService registerService;
  6.     @PostMapping(value = "/register", consumes = "application/json")
  7.     public void register(@RequestBody RegisterDto dto) throws Exception {
  8.         registerService.register(dto);
  9.     }
  10. }
复制代码
搜索用户
  1. @Controller
  2. @RequestMapping("/search")
  3. public class SearchController {
  4.     @Autowired
  5.     private SearchService searchService;
  6.     @GetMapping("/users/default")
  7.     public String getUsersDefault(Model model) throws Exception {
  8.         model.addAttribute("dto", searchService.searchComplete());
  9.         return "fragments :: search-users";
  10.     }
  11. }
复制代码
核心代码

应用主入口
  1. @SpringBootApplication
  2. @EnableJpaRepositories("com.nonononoki.alovoa.repo")
  3. @EntityScan("com.nonononoki.alovoa.entity")
  4. @EnableCaching
  5. @EnableScheduling
  6. public class AlovoaApplication {
  7.     public static void main(String[] args) {
  8.         Security.addProvider(new BouncyCastleProvider());
  9.         SpringApplication.run(AlovoaApplication.class, args);
  10.     }
  11. }
复制代码
用户实体类
  1. @Entity
  2. public class User implements UserDetails {
  3.     @Id
  4.     @GeneratedValue(strategy = GenerationType.IDENTITY)
  5.     private Long id;
  6.    
  7.     @Column(nullable = false, unique = true)
  8.     @Convert(converter = TextEncryptorConverter.class)
  9.     @JsonIgnore
  10.     private String email;
  11.    
  12.     @JsonIgnore
  13.     private String password;
  14.    
  15.     @Convert(converter = TextEncryptorConverter.class)
  16.     private String firstName;
  17.    
  18.     private String description;
  19.     private int units;
  20.     private boolean showZodiac;
  21.     private int preferedMinAge;
  22.     private int preferedMaxAge;
  23.    
  24.     // 其他字段和方法...
  25. }
复制代码
文本加密转换器
  1. @Component
  2. public class TextEncryptorConverter implements AttributeConverter<String, String> {
  3.     @Value("${app.text.key}")
  4.     private String key;
  5.    
  6.     @Value("${app.text.salt}")
  7.     private String salt;
  8.     private static final String TRANSFORMATION = "AES/CBC/PKCS5PADDING";
  9.     @Override
  10.     public String convertToDatabaseColumn(String attribute) {
  11.         try {
  12.             return encode(attribute);
  13.         } catch (Exception e) {
  14.             throw new DatabaseRuntimeException(e);
  15.         }
  16.     }
  17.     private String encode(String attribute) throws Exception {
  18.         if(attribute == null) return null;
  19.         byte[] ba = getEnCipher().doFinal(attribute.getBytes(StandardCharsets.UTF_8));
  20.         return Base64.getUrlEncoder().encodeToString(ba);
  21.     }
  22.     // 其他方法...
  23. }
复制代码
验证码服务
  1. @Service
  2. public class CaptchaService {
  3.     @Autowired
  4.     private CaptchaRepository captchaRepo;
  5.     public Captcha generate() throws NoSuchAlgorithmException, IOException {
  6.         OxCaptcha ox = generateCaptchaImage();
  7.         ByteArrayOutputStream baos = new ByteArrayOutputStream();
  8.         ImageIO.write(ox.getImage(), "webp", baos);
  9.         byte[] ba = baos.toByteArray();
  10.         String encoded = Base64.getEncoder().encodeToString(ba);
  11.         
  12.         Captcha captcha = new Captcha();
  13.         captcha.setImage(encoded);
  14.         captcha.setText(ox.getText());
  15.         return captchaRepo.saveAndFlush(captcha);
  16.     }
  17.     // 其他方法...
  18. }
复制代码
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码
1.png


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册