社团招新与成员管理应用


欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net

一、项目概述

运行效果图

image-20260410230643856

image-20260410230648612

image-20260410230652840

image-20260410230700760

1.1 应用简介

社团招新与成员管理是一款专为校园社团设计的综合管理应用,涵盖社团招新、成员管理、活动组织、通知公告等核心功能。应用内置社团展示、在线报名、成员审核、权限管理,让社团运营更高效。

应用以活力的橙色为主色调,象征青春与热情。涵盖社团广场、招新管理、成员中心、系统设置四大模块。社团管理员可以发布招新信息、审核报名申请、管理成员权限,学生可以浏览社团、在线报名、参与活动。

1.2 核心功能

功能模块 功能描述 实现方式
社团广场 浏览校园社团 列表展示
在线报名 提交入社申请 表单提交
成员审核 审核报名申请 审批流程
权限管理 管理成员角色 角色系统
活动发布 发布社团活动 活动管理

1.3 社团类型定义

序号 类型名称 Emoji 描述
1 学术科技 🔬 学术研究、科技创新
2 文艺娱乐 🎭 音乐、舞蹈、戏剧
3 体育运动 球类、健身、竞技
4 公益志愿 ❤️ 志愿服务、公益活动
5 创新创业 💡 创业实践、项目孵化
6 文化交流 🌏 语言、文化、交流
7 兴趣爱好 🎨 摄影、绘画、手工
8 综合类 🏛️ 综合性社团

1.4 成员角色定义

序号 角色名称 Emoji 权限描述
1 社长 👑 最高管理权限
2 副社长 协助管理社团
3 部长 🎖️ 管理部门事务
4 干事 📋 协助部门工作
5 普通成员 👤 参与社团活动

1.5 申请状态定义

序号 状态名称 Emoji 描述
1 待审核 等待审核
2 已通过 审核通过
3 已拒绝 审核拒绝
4 已撤回 ↩️ 申请撤回

1.6 技术栈

技术领域 技术选型 版本要求
开发框架 Flutter >= 3.0.0
编程语言 Dart >= 2.17.0
设计规范 Material Design 3 -
本地存储 shared_preferences -
目标平台 鸿蒙OS / Web API 21+

1.7 项目结构

lib/
└── main_club_management.dart
    ├── ClubManagementApp         # 应用入口
    ├── Club                      # 社团模型
    ├── Member                    # 成员模型
    ├── Application               # 申请模型
    ├── ClubType                  # 社团类型枚举
    ├── MemberRole                # 成员角色枚举
    ├── ApplicationStatus         # 申请状态枚举
    ├── ClubService               # 社团服务
    ├── ClubController            # 社团控制器
    ├── ClubManagementHomePage    # 主页面
    ├── _buildSquarePage          # 社团广场页面
    ├── _buildRecruitPage         # 招新管理页面
    ├── _buildMembersPage         # 成员中心页面
    └── _buildSettingsPage        # 系统设置页面

二、系统架构

2.1 整体架构图

Data Layer

Business Layer

Presentation Layer

主页面
ClubManagementHomePage

社团广场

招新管理

成员中心

系统设置

社团列表

社团详情

在线报名

申请列表

审核处理

成员列表

权限管理

个人信息

通知设置

社团控制器
ClubController

社团服务
ClubService

数据管理
DataManager

Club
社团模型

Member
成员模型

Application
申请模型

LocalStorage
本地存储

2.2 类图设计

uses

uses

manages

manages

processes

uses

uses

returns

ClubManagementApp

+Widget build()

Club

+String id

+String name

+String description

+ClubType type

+String logo

+int memberCount

+int maxMembers

+bool isRecruiting

+DateTime createdAt

Member

+String id

+String name

+String studentId

+String department

+MemberRole role

+DateTime joinDate

Application

+String id

+String clubId

+String applicantName

+String studentId

+String department

+String reason

+ApplicationStatus status

+DateTime createdAt

«enumeration»

ClubType

+String label

+String emoji

+academic()

+art()

+sports()

+charity()

+innovation()

+culture()

+hobby()

+comprehensive()

«enumeration»

MemberRole

+String label

+String emoji

+president()

+vicePresident()

+minister()

+officer()

+member()

«enumeration»

ApplicationStatus

+String label

+String emoji

+pending()

+approved()

+rejected()

+withdrawn()

ClubService

+List<Club> getAllClubs()

+List<Application> getApplications(String clubId)

+void submitApplication(Application app)

+void reviewApplication(String id, bool approved)

ClubController

+List<Club> clubs

+List<Application> applications

+List<Member> members

+Future loadClubs()

+void applyToClub(Application app)

+void reviewApplication(String id, bool approved)

2.3 页面导航流程

广场

招新

成员

设置

应用启动

社团广场

底部导航

浏览社团

招新管理

成员中心

系统设置

搜索社团

社团详情

提交申请

待审核列表

审核申请

通过/拒绝

成员列表

权限设置

个人信息

通知设置

2.4 招新审核流程

数据管理 社团控制器 社团广场 学生 数据管理 社团控制器 社团广场 学生 浏览社团 加载社团列表 获取社团数据 返回社团 更新显示 显示社团 提交申请 保存申请 存储申请 确认保存 申请成功 显示成功提示

三、核心模块设计

3.1 数据模型设计

3.1.1 社团模型 (Club)
class Club {
  final String id;
  final String name;
  final String description;
  final ClubType type;
  final String logo;
  final int memberCount;
  final int maxMembers;
  final bool isRecruiting;
  final String presidentName;
  final List<String> departments;
  final DateTime createdAt;
  
  Club({
    required this.id,
    required this.name,
    required this.description,
    required this.type,
    required this.logo,
    required this.memberCount,
    required this.maxMembers,
    required this.isRecruiting,
    required this.presidentName,
    required this.departments,
    required this.createdAt,
  });
}
3.1.2 成员模型 (Member)
class Member {
  final String id;
  final String clubId;
  final String name;
  final String studentId;
  final String department;
  final MemberRole role;
  final String phone;
  final String email;
  final DateTime joinDate;
  
  Member({
    required this.id,
    required this.clubId,
    required this.name,
    required this.studentId,
    required this.department,
    required this.role,
    required this.phone,
    required this.email,
    required this.joinDate,
  });
}
3.1.3 申请模型 (Application)
class Application {
  final String id;
  final String clubId;
  final String clubName;
  final String applicantName;
  final String studentId;
  final String major;
  final String grade;
  final String phone;
  final String reason;
  final String preferredDepartment;
  ApplicationStatus status;
  final DateTime createdAt;
  
  Application({
    required this.id,
    required this.clubId,
    required this.clubName,
    required this.applicantName,
    required this.studentId,
    required this.major,
    required this.grade,
    required this.phone,
    required this.reason,
    required this.preferredDepartment,
    required this.status,
    required this.createdAt,
  });
}
3.1.4 社团类型枚举 (ClubType)
enum ClubType {
  academic(label: '学术科技', emoji: '🔬'),
  art(label: '文艺娱乐', emoji: '🎭'),
  sports(label: '体育运动', emoji: '⚽'),
  charity(label: '公益志愿', emoji: '❤️'),
  innovation(label: '创新创业', emoji: '💡'),
  culture(label: '文化交流', emoji: '🌏'),
  hobby(label: '兴趣爱好', emoji: '🎨'),
  comprehensive(label: '综合类', emoji: '🏛️');

  final String label;
  final String emoji;

  const ClubType({required this.label, required this.emoji});
}
3.1.5 成员角色枚举 (MemberRole)
enum MemberRole {
  president(label: '社长', emoji: '👑'),
  vicePresident(label: '副社长', emoji: '⭐'),
  minister(label: '部长', emoji: '🎖️'),
  officer(label: '干事', emoji: '📋'),
  member(label: '普通成员', emoji: '👤');

  final String label;
  final String emoji;

  const MemberRole({required this.label, required this.emoji});
}
3.1.6 申请状态枚举 (ApplicationStatus)
enum ApplicationStatus {
  pending(label: '待审核', emoji: '⏳'),
  approved(label: '已通过', emoji: '✅'),
  rejected(label: '已拒绝', emoji: '❌'),
  withdrawn(label: '已撤回', emoji: '↩️');

  final String label;
  final String emoji;

  const ApplicationStatus({required this.label, required this.emoji});
}

3.2 页面结构设计

3.2.1 主页面布局

ClubManagementHomePage

IndexedStack

社团广场页面

招新管理页面

成员中心页面

系统设置页面

NavigationBar

广场 Tab

招新 Tab

成员 Tab

设置 Tab

3.2.2 社团广场页面结构

社团广场页面

搜索框

类型筛选

社团列表

关键词搜索

学术科技

文艺娱乐

体育运动

其他类型

社团卡片

社团Logo

名称人数

招新状态

3.2.3 招新管理页面结构

招新管理页面

申请列表

筛选标签

全部申请

待审核

已通过

已拒绝

申请卡片

申请人信息

申请理由

审核操作

通过

拒绝

3.2.4 成员中心页面结构

成员中心页面

成员统计

成员列表

角色筛选

总人数

本月新增

活跃成员

社长

部长

干事

普通成员

成员卡片

基本信息

角色权限

操作按钮

3.3 申请审核逻辑

通过

拒绝

收到申请

申请完整?

退回补充

进入审核队列

查看申请详情

审核决定

发送通过通知

添加为成员

分配初始角色

审核完成

发送拒绝通知

记录拒绝原因

3.4 成员权限管理逻辑

升级

降级

移除

选择成员

查看当前角色

选择新角色

确认升级

更新权限

发送通知

确认降级

更新权限

发送通知

确认移除

移除成员

发送通知

操作完成


四、UI设计规范

4.1 配色方案

应用以活力的橙色为主色调,象征青春与热情:

颜色类型 色值 用途
主色 #FF9800 (Orange) 导航、主题元素
辅助色 #FFB74D 按钮、强调
第三色 #FFCC80 背景、卡片
背景色 #F5F5F5 页面背景
卡片背景 #FFFFFF 信息卡片

4.2 状态色彩映射

状态 色值 视觉效果
待审核 #FF9800 橙色
已通过 #4CAF50 绿色
已拒绝 #F44336 红色
已撤回 #9E9E9E 灰色

4.3 角色色彩映射

角色 色值 视觉效果
社长 #FFD700 金色
副社长 #FF9800 橙色
部长 #2196F3 蓝色
干事 #4CAF50 绿色
普通成员 #9E9E9E 灰色

4.4 字体规范

元素 字号 字重 颜色
页面标题 24px Bold 主色
社团名称 18px Medium #333333
成员名称 16px Medium #333333
申请信息 14px Regular #666666
状态标签 12px Regular 对应状态色

4.5 组件规范

4.5.1 社团卡片
┌─────────────────────────────────────┐
│  ┌──────────┐                       │
│  │          │  计算机协会            │
│  │   Logo   │  🔬 学术科技           │
│  │          │                       │
│  └──────────┘  成员:128人          │
│                ✅ 正在招新           │
└─────────────────────────────────────┘
4.5.2 申请卡片
┌─────────────────────────────────────┐
│  张三  2021001                      │
│  ─────────────────────────────────  │
│  专业:计算机科学与技术              │
│  年级:2021级                       │
│  意向部门:技术部                    │
│                                     │
│  申请理由:对编程有浓厚兴趣...       │
│                                     │
│  ⏳ 待审核                          │
│                                     │
│  [通过] [拒绝] [查看详情]           │
└─────────────────────────────────────┘
4.5.3 成员卡片
┌─────────────────────────────────────┐
│  ┌──────────┐                       │
│  │   头像   │  李四                  │
│  │          │  👑 社长               │
│  └──────────┘                       │
│                                     │
│  学号:2020001                      │
│  部门:主席团                       │
│  入社:2020-09-01                   │
│                                     │
│  [修改角色] [查看详情]              │
└─────────────────────────────────────┘

五、核心功能实现

5.1 社团服务实现

class ClubService {
  final List<Club> _clubs = [];
  final List<Application> _applications = [];
  final List<Member> _members = [];

  List<Club> getAllClubs() {
    return _clubs;
  }

  List<Club> getClubsByType(ClubType type) {
    return _clubs.where((club) => club.type == type).toList();
  }

  List<Club> searchClubs(String query) {
    return _clubs.where((club) =>
      club.name.contains(query) ||
      club.description.contains(query)
    ).toList();
  }

  List<Application> getApplications(String clubId) {
    return _applications.where((app) => app.clubId == clubId).toList();
  }

  void submitApplication(Application application) {
    _applications.insert(0, application);
  }

  void reviewApplication(String id, bool approved) {
    final app = _applications.firstWhere((a) => a.id == id);
    app.status = approved ? ApplicationStatus.approved : ApplicationStatus.rejected;
    
    if (approved) {
      final member = Member(
        id: 'member_${DateTime.now().millisecondsSinceEpoch}',
        clubId: app.clubId,
        name: app.applicantName,
        studentId: app.studentId,
        department: app.preferredDepartment,
        role: MemberRole.member,
        phone: app.phone,
        email: '',
        joinDate: DateTime.now(),
      );
      _members.add(member);
    }
  }

  List<Member> getMembers(String clubId) {
    return _members.where((m) => m.clubId == clubId).toList();
  }

  void updateMemberRole(String memberId, MemberRole newRole) {
    final member = _members.firstWhere((m) => m.id == memberId);
    // 更新角色
  }
}

5.2 社团控制器实现

class ClubController {
  final ClubService _clubService;
  final DataManager _dataManager;
  List<Club> clubs = [];
  List<Application> applications = [];
  List<Member> members = [];

  ClubController(this._clubService, this._dataManager);

  Future<void> initialize() async {
    await loadClubs();
    await loadApplications();
    await loadMembers();
  }

  Future<void> loadClubs() async {
    clubs = _clubService.getAllClubs();
  }

  Future<void> loadApplications() async {
    applications = await _dataManager.loadApplications();
  }

  Future<void> loadMembers() async {
    members = await _dataManager.loadMembers();
  }

  void submitApplication(Application application) {
    _clubService.submitApplication(application);
    applications.insert(0, application);
    _dataManager.saveApplications(applications);
  }

  void reviewApplication(String id, bool approved) {
    _clubService.reviewApplication(id, approved);
    final app = applications.firstWhere((a) => a.id == id);
    app.status = approved ? ApplicationStatus.approved : ApplicationStatus.rejected;
    _dataManager.saveApplications(applications);
    
    if (approved) {
      loadMembers();
    }
  }

  List<Club> searchClubs(String query) {
    return _clubService.searchClubs(query);
  }

  List<Club> getClubsByType(ClubType type) {
    return _clubService.getClubsByType(type);
  }
}

5.3 数据管理实现

class DataManager {
  static const String _applicationsKey = 'applications';
  static const String _membersKey = 'members';

  static Map<String, String> _storage = {};

  Future<List<Application>> loadApplications() async {
    final jsonString = _storage[_applicationsKey];
    if (jsonString == null) return [];

    final jsonList = json.decode(jsonString) as List;
    return jsonList.map((data) => Application.fromJson(data)).toList();
  }

  Future<void> saveApplications(List<Application> applications) async {
    final jsonList = applications.map((app) => app.toJson()).toList();
    _storage[_applicationsKey] = json.encode(jsonList);
  }

  Future<List<Member>> loadMembers() async {
    final jsonString = _storage[_membersKey];
    if (jsonString == null) return [];

    final jsonList = json.decode(jsonString) as List;
    return jsonList.map((data) => Member.fromJson(data)).toList();
  }

  Future<void> saveMembers(List<Member> members) async {
    final jsonList = members.map((member) => member.toJson()).toList();
    _storage[_membersKey] = json.encode(jsonList);
  }
}

六、交互设计

6.1 社团浏览交互流程

社团服务 社团控制器 社团广场 学生 社团服务 社团控制器 社团广场 学生 打开应用 加载社团 获取社团列表 返回社团 更新显示 显示社团 筛选类型 筛选社团 获取类型社团 返回社团 更新显示 显示筛选结果

6.2 申请提交交互流程

选择社团

点击申请

填写申请表

信息完整?

提示补充

提交申请

申请成功

等待审核

6.3 审核处理交互流程

审核通过

审核拒绝

申请人撤回

待审核

已通过

已拒绝

已撤回


七、扩展功能规划

7.1 后续版本规划

2024-01-07 2024-01-14 2024-01-21 2024-01-28 2024-02-04 2024-02-11 2024-02-18 2024-02-25 2024-03-03 2024-03-10 2024-03-17 2024-03-24 基础UI框架 社团浏览功能 申请提交功能 审核管理功能 成员管理功能 权限系统 活动发布功能 通知推送系统 数据统计报表 V1.0 基础版本 V1.1 增强版本 V1.2 进阶版本 社团招新与成员管理应用开发计划

7.2 功能扩展建议

7.2.1 活动管理

活动功能:

  • 发布社团活动
  • 活动报名签到
  • 活动相册分享
  • 活动评价反馈
7.2.2 通知系统

通知功能:

  • 申请状态通知
  • 活动提醒通知
  • 公告推送通知
  • 系统消息通知
7.2.3 数据统计

统计功能:

  • 成员增长趋势
  • 活动参与统计
  • 社团活跃度分析
  • 申请转化率

八、注意事项

8.1 开发注意事项

  1. 权限控制:不同角色有不同的操作权限

  2. 数据安全:成员信息需要安全存储

  3. 审核流程:确保审核流程的完整性和可追溯性

  4. 用户体验:申请流程需要简洁明了

  5. 兼容性:确保在不同设备上的显示效果一致

8.2 常见问题

问题 原因 解决方案
申请提交失败 网络问题 检查网络连接
审核状态不同步 数据未刷新 手动刷新数据
权限操作失败 权限不足 检查用户角色
社团信息丢失 存储失败 增加错误处理
应用崩溃 空指针异常 增加空值检查

8.3 使用技巧

🏢 社团招新与成员管理使用技巧 🏢

社团浏览

  • 使用类型筛选快速定位
  • 关注招新状态
  • 查看社团详情
  • 了解社团活动

申请提交

  • 填写完整个人信息
  • 认真填写申请理由
  • 选择意向部门
  • 保持联系方式畅通

审核管理

  • 及时处理待审核申请
  • 查看申请人详情
  • 合理设置通过标准
  • 记录审核意见

成员管理

  • 定期更新成员信息
  • 合理分配角色权限
  • 关注成员活跃度
  • 维护社团氛围

九、运行说明

9.1 环境要求

环境 版本要求
Flutter SDK >= 3.0.0
Dart SDK >= 2.17.0
鸿蒙OS API 21+
Web浏览器 Chrome 90+

9.2 运行命令

# 查看可用设备
flutter devices

# 运行到Web服务器
flutter run -d web-server -t lib/main_club_management.dart --web-port 8157

# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_club_management.dart

# 代码分析
flutter analyze lib/main_club_management.dart

十、总结

社团招新与成员管理应用通过社团广场、招新管理、成员中心、系统设置四大模块,为校园社团提供了一个综合管理平台。社团管理员可以发布招新信息、审核报名申请、管理成员权限,学生可以浏览社团、在线报名、参与活动。

核心功能包括社团浏览、在线报名、成员审核、权限管理等。应用采用活力的橙色为主色调,象征青春与热情,界面简洁美观,交互流畅自然。

通过本应用,希望能够帮助校园社团更高效地进行招新和成员管理,促进社团健康发展,丰富校园文化生活。

社团招新与成员管理——让社团运营更高效


Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐