ToDoマネジメントシステム - 企業向けマルチユーザー対応
ポートフォリオ事例紹介
📊 プロジェクト概要
プロジェクト名: ToDoマネジメントシステム(企業向け)
開発期間: 2025年6月 集中開発・改修
役割: フルスタック開発者
技術スタック: Python (Flask), SQLAlchemy, SQLite, Bootstrap 5, Flask-WTF
🎯 プロジェクトの背景と目的
ターゲット課題
企業・組織における効率的なタスク管理の実現を目指し、個人向けタスク管理アプリでは対応できない以下の組織特有の課題を解決:
- 責任の明確化: 誰が・いつまでに・何をするかの明確な管理
- 進捗の可視化: 部門横断的なタスクの進行状況把握
- 期日管理の厳格化: ビジネス要求に応じた確実な納期管理
- データセキュリティ: 組織内でのデータ分離と権限管理
システム設計思想
「責任と効率性を重視した組織型タスク管理」
個人の習慣管理とは異なり、明確な責任体制と期日管理を核とした企業向けアプローチを採用。柔軟性よりも確実性を重視した設計思想で開発しました。
💡 過去プロジェクト(RoutineNavi)との設計思想比較
コンセプトの違い
観点 | RoutineNavi (個人習慣管理) | ToDoマネジメント (企業タスク管理) |
---|---|---|
基本思想 | 貯金型・柔軟性重視 | 責任・期日・効率性重視 |
ユーザー | 個人の習慣形成支援 | 企業・組織のタスク管理 |
時間概念 | 過去・現在・未来の柔軟実行 | 明確な開始日・期日・完了日 |
心理的負荷 | 完璧主義の排除、心理的負担軽減 | 責任感・達成感の強化 |
失敗の扱い | 調整可能、ポジティブ | 明確な遅延・未完了管理 |
評価軸 | 継続性・習慣化 | 効率性・生産性・期日遵守 |
技術アプローチの進化
RoutineNavi → ToDoマネジメント
- 認証: 個人認証 → マルチユーザー・権限管理
- データ管理: 個人データ → 組織データ・完全分離
- UI設計: 心理的配慮重視 → 効率性・視認性重視
- セキュリティ: 基本認証 → CSRF保護・セッション強化
🛠️ Phase 1: ユーザー認証システムの実装
課題:シングルユーザーからマルチユーザーへの大規模改修
技術的チャレンジ
1. データベース構造の根本的変更
-- 既存テーブルの改修
ALTER TABLE todo_tasks ADD COLUMN user_id INTEGER NOT NULL;
ALTER TABLE projects ADD COLUMN user_id INTEGER NOT NULL;
-- 新規テーブルの追加
CREATE TABLE users (
id INTEGER PRIMARY KEY,
username VARCHAR(80) UNIQUE NOT NULL,
email VARCHAR(120) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
is_admin BOOLEAN DEFAULT FALSE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
2. 既存データの安全な移行
def migrate_database():
"""既存データを保持したままユーザー認証対応に移行"""
# 管理者ユーザーの作成
admin_user = create_admin_user()
# 既存タスクを管理者に関連付け
existing_tasks = TodoTask.query.all()
for task in existing_tasks:
task.user_id = admin_user.id
db.session.commit()
セキュリティ実装
パスワード管理とCSRF対策
from werkzeug.security import generate_password_hash, check_password_hash
from flask_wtf import FlaskForm
class User(db.Model):
def set_password(self, password):
"""Werkzeugによる安全なパスワードハッシュ化"""
self.password_hash = generate_password_hash(password)
def check_password(self, password):
"""パスワード検証"""
return check_password_hash(self.password_hash, password)
カスタム認証システムの実装
def login_required(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if 'user_id' not in session:
return redirect(url_for('login'))
# セッション有効性チェック
current_user = get_current_user()
if not current_user:
session.pop('user_id', None)
return redirect(url_for('login'))
return f(*args, **kwargs)
return decorated_function
データ分離とアクセス制御
完全なユーザーデータ分離
@app.route('/tasks')
@login_required
def tasks():
current_user = get_current_user()
# 現在のユーザーのタスクのみを取得
user_tasks = TodoTask.query.filter_by(user_id=current_user.id)
# フィルタリング・ソート処理
tasks = apply_filters_and_sort(user_tasks, request.args)
return render_template('tasks.html', tasks=tasks)
統計データの動的計算
def calculate_user_statistics(user_id):
"""ユーザー固有の統計情報を計算"""
user_tasks = TodoTask.query.filter_by(user_id=user_id)
return {
'total_tasks': user_tasks.count(),
'completed_tasks': user_tasks.filter_by(status='完了').count(),
'overdue_tasks': user_tasks.filter(
TodoTask.due_date < date.today(),
TodoTask.status != '完了'
).count(),
'department_stats': get_department_statistics(user_id)
}
🎨 UI/UX設計:企業向けインターフェース
レスポンシブ認証システム
ログイン画面の設計思想
- セキュリティ重視: 明確なエラーメッセージと入力検証
- 効率性重視: 最小限のステップでのアクセス
- 企業ブランディング: プロフェッショナルなデザイン
<!-- 企業向けログイン画面 -->
<div class="login-container">
<div class="login-header">
<h2><i class="fas fa-tasks me-2"></i>ToDoマネジメント</h2>
<p>ログインして開始しましょう</p>
</div>
<form method="POST" class="login-form">
{{ form.hidden_tag() }}
<!-- CSRF保護とバリデーション -->
</form>
</div>
ユーザー管理インターフェース
権限表示とメニュー設計
<!-- 管理者権限の視覚化 -->
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown">
<i class="bi bi-person-circle me-1"></i>{{ current_user.username }}
{% if current_user.is_admin %}
<span class="badge bg-warning text-dark ms-1">管理者</span>
{% endif %}
</a>
📊 技術的課題と解決策
1. SQLAlchemy 2.0 互換性問題
課題: 既存コードの非推奨メソッド使用
# Before (非推奨)
user = User.query.get(user_id)
# After (SQLAlchemy 2.0対応)
user = db.session.get(User, user_id)
2. Flask-Login依存関係競合
課題: Flask-LoginとWerkzeugのバージョン競合
解決: カスタム認証システムの実装で依存関係を削減
3. データベース移行の安全性
課題: 本番データを失わない移行戦略
解決: バックアップ機能付き移行スクリプト
def safe_migrate():
# バックアップテーブル作成
cursor.execute('CREATE TABLE todo_tasks_backup AS SELECT * FROM todo_tasks')
# スキーマ変更
modify_table_structure()
# データ移行とバリデーション
migrate_data_with_validation()
🔧 開発プロセスと品質管理
段階的実装アプローチ
Phase 1: 認証基盤
1. ユーザーモデル設計・実装
2. 認証システム構築
3. 既存機能のマルチユーザー対応
4. セキュリティ強化
Phase 2: ガントチャート機能(予定)
- タスク依存関係管理
- 視覚的スケジュール表示
- リアルタイム進捗更新
品質保証
セキュリティテスト
- CSRF攻撃耐性確認
- SQLインジェクション対策検証
- セッションハイジャック対策
互換性テスト
- Python 3.10+ 対応確認
- クロスブラウザ動作検証
- レスポンシブデザイン確認
📈 RoutineNaviとの技術的差別化
アーキテクチャ比較
技術領域 | RoutineNavi | ToDoマネジメント |
---|---|---|
認証方式 | Flask-Login標準実装 | カスタム認証システム |
データモデル | 個人中心設計 | 組織・権限中心設計 |
セキュリティ | 基本レベル | エンタープライズレベル |
スケーラビリティ | 個人利用想定 | 組織拡張想定 |
学習と成長
RoutineNaviからの技術的進化
- 問題解決: 依存関係競合の独自解決
- 設計思想: 個人向け → 組織向けの思考転換
- セキュリティ: エンタープライズレベルへの向上
- データ管理: 単一ユーザー → マルチテナント設計
🚀 システムの成果と評価
実装成果
定量的成果
- 16ファイル変更: 2,479行追加、152行削除
- 認証セキュリティ: CSRF保護、パスワードハッシュ化実装
- データ分離: 100%のユーザーデータ分離達成
- レスポンシブ: 全デバイス対応の認証UI
技術的成果
- 依存関係問題の独自解決による学習
- エンタープライズ仕様のセキュリティ実装
- 既存データを保持した大規模リファクタリング
- 拡張性を考慮した設計パターンの確立
ビジネス価値
企業導入メリット
- 部門横断的なタスク管理の効率化
- セキュアなデータ管理による信頼性向上
- 管理者権限による組織統制の強化
- 将来的なガントチャート機能との統合基盤
🎯 今後の展開
Phase 2: ガントチャート実装予定
技術的アプローチ
- RoutineNaviの時系列ビュー知見活用
- Chart.js/D3.js による視覚化
- Ajax非同期更新(RoutineNaviパターン)
- タスク依存関係の高度な管理
長期的ビジョン
エンタープライズ機能拡張
- チーム管理・権限細分化
- API提供による外部システム連携
- 高度な分析・レポート機能
- 通知・アラートシステム
📝 プロジェクトから得られた知見
技術面
依存関係管理: パッケージ競合時の独自解決手法の重要性
リファクタリング: 既存システムの段階的改修手法の確立
セキュリティ: エンタープライズレベルのセキュリティ実装経験
設計面
コンセプト転換: 個人向け→組織向けの設計思想転換
スケーラビリティ: 将来拡張を見据えた基盤設計の重要性
ユーザビリティ: 企業ユーザーのニーズに特化したUI設計
プロジェクト管理
段階的実装: 大規模改修における段階的アプローチの有効性
品質管理: セキュリティを重視した開発プロセスの確立
このプロジェクトは、個人向けシステム(RoutineNavi)から企業向けシステムへの設計思想転換と、エンタープライズレベルのセキュリティ実装能力を示す事例です。単なる機能追加ではなく、根本的なアーキテクチャ改修を通じて、より高次元の技術的課題解決を実現しました。