DataBase

【PHP】自作グループウェアの作成

とても久しぶりの更新になりました
今回、久しぶりにPHPを使用して開発するプロジェクトに関わることになったので、PHPでの開発の練習がてら簡単なグループウェアを作成してみました

今回の開発ではサーバーサイドもフロントエンドも、フレームワークを利用せず作成したので、WEB開発初心者の方でも簡単にコードを追う事ができ、ご自身の環境に合わせてカスタマイズが可能となっているかと思います

近年、企業や組織におけるコミュニケーションと業務効率の向上を目的として、グループウェアの重要性が高まっています。​
私自身が所属する会社でも、組織内の情報共有や業務プロセスの効率化を実現するために、独自のグループウェアシステムを開発し使用しております。

開発の背景と目的

一番の目的はPHPでの開発に関わることが久しぶりなので、感覚を戻す為に作ってみた(笑)というどうしようもない目的です
ただ、多くの既存グループウェアは高機能ですが、組織の特定のニーズに完全に適合しない場合が多いです。​また、カスタマイズ性や拡張性に制約があることも少なくありません。
​そこで、拡張性に優れ、誰でも簡単に利用できるものを作ろうと思い公開しました。
​このプロジェクトの主な狙いは次になります​

  • 組織の特性に合わせた柔軟なカスタマイズ性:​組織の構造や業務フローに応じて、機能やUIを調整できるシステムを目指しました。​
  • ユーザーフレンドリーなインターフェースの実現:​直感的で使いやすいUI/UXを設計し、ユーザーの負担を軽減を目指しました。​
  • オープンソースとしての公開:​他の開発者や組織が自由に利用・改良できるよう、ソースコードを公開しました。

グループウェアの主要機能

本グループウェアは、組織内のコミュニケーションと業務管理をサポートする以下の主要機能を実装しました

1. 組織管理

組織の階層構造を直感的に管理できる機能です。​部署やチームの追加・編集・削除が可能で、各組織単位に対して詳細情報を設定できます。​これにより、組織全体の構造を明確にし、役割分担や責任範囲を明確化します。​

2. ユーザー管理

ユーザー情報の一元管理を実現します。​新規ユーザーの登録、既存ユーザーの情報更新、権限設定などが行えます。​また、ユーザーを特定の組織単位に割り当てることで、組織内の役割や所属を明確にします。​

3. スケジュール管理

日、週、月単位でのスケジュール管理が可能です。​個人の予定だけでなく、チームやプロジェクト単位での共有カレンダーも提供し、全員が最新の予定を把握できます。​リマインダー機能も搭載し、重要なイベントの見落としを防止します。​

4. メッセージ機能

組織内のユーザー間でリアルタイムにメッセージをやり取りできる機能です。​個別メッセージ、グループメッセージの両方が可能でし、ファイル添付や既読確認などの便利な機能も備えています。​
メッセージ機能はメールと違いアドレスは不要です

5. ワークフロー機能

稟議や申請手続きをデジタル化し、効率的な承認プロセスを実現します。​テンプレートの作成、承認経路の設定、進捗状況のトラッキングなどが可能で、ペーパーレス化と業務効率の向上に寄与します。​

6. WEBデータベース

ユーザーが定義したフィールドでデータベースを作りデータを管理することができます
プリザンターやエクスメントなどのカスタムアプリを想像いただけると良いです

エクスメントなどの様に作り込んでいないので、機能は最小限になります
フィルターやテーブルのリレーション機能などを作成すると前述のアプリケーションに負けないくらいの機能になります

7.タスク管理

ユーザー毎、組織毎、カスタムチーム毎にタスクを管理できます
リストの作成やラベルの作成、ボードの作成、カンバンの作成、進捗グラフ表示、フィルタ機能などタスクやプロジェクト管理としては十分な機能を有しています

8. ホーム画面及びシステム設定

通知メールの設定や基本設定を行います
通知メールはCronで設定しメールを送信するスクリプトを実行します

ホーム画面はスケジュールやメッセージ、ユーザーが関連するタスクなどが一望できます

技術的な詳細

本グループウェアの開発には、以下の技術スタックを採用しました

使用技術

  • バックエンド:​PHP 7.4以上
  • データベース:​MySQL 5.7以上
  • フロントエンド:​HTML5、CSS3、JavaScript
  • Webサーバー:​Apache​

ディレクトリ構成

プロジェクトのディレクトリ構成は以下の通りです


groupware/
├── Controllers/       # コントローラークラス
├── Core/              # コア機能やベースクラス
├── Models/            # データベースモデル
├── config/            # 設定ファイル
├── db/                # データベーススキーマ
├── public/            # 公開ディレクトリ(ドキュメントルート)
├── scripts/           # 補助スクリプト
└── views/             # ビュー(テンプレート)ファイル

ファイル構成

プロジェクトのディレクトリと各ファイルは次の通りです

groupware/
├── api/                                # API関連
├── composer.json                       # Composer設定
├── composer.lock                       # Composer依存関係
├── config/                             # 設定ファイル
│   ├── config.php                      # システム設定
│   ├── config_sample.php               # 設定サンプル
│   ├── database.php                    # DB接続設定
│   ├── database_sample.php             # DB接続設定サンプル
│   └── temp/                           # 一時設定ファイル
├── Controllers/                        # コントローラー
│   ├── HomeController.php              # ホーム
│   ├── MessageController.php           # メッセージ管理
│   ├── NotificationController.php      # 通知管理
│   ├── OrganizationController.php      # 組織管理
│   ├── ScheduleController.php          # スケジュール管理
│   ├── SettingController.php           # システム設定管理
│   ├── TaskController.php              # タスク管理
│   ├── UserController.php              # ユーザー管理
│   ├── WebDatabaseController.php       # Webデータベース管理
│   └── WorkflowController.php          # ワークフロー管理
├── Core/                               # システムのコア
│   ├── Auth.php                        # 認証処理
│   ├── Controller.php                  # ベースコントローラー
│   ├── Database.php                    # DBアクセスクラス
│   └── Router.php                      # ルーティング
├── db/
│   └── schema.sql                      # データベーススキーマ
├── exports/
│   └── workflow/                       # ワークフロー出力ファイル
├── Models/                             # データモデル
│   ├── Message.php                     # メッセージモデル
│   ├── Notification.php                # 通知モデル
│   ├── Organization.php                # 組織モデル
│   ├── Schedule.php                    # スケジュールモデル
│   ├── Setting.php                     # システム設定モデル
│   ├── Task.php                        # タスクモデル
│   ├── Team.php                        # チームモデル
│   ├── User.php                        # ユーザーモデル
│   ├── WebDatabase.php                 # WebDBモデル
│   └── Workflow.php                    # ワークフローモデル
├── project-structure.txt               # 本ファイル
├── public/                             # 公開ファイル
│   ├── css/
│   │   ├── home.css
│   │   ├── style.css
│   │   └── task.css
│   ├── img/
│   ├── index.php                       # アプリケーションエントリーポイント
│   ├── js/
│   │   ├── app.js
│   │   ├── home.js
│   │   ├── js_constants.php
│   │   ├── message.js
│   │   ├── notification.js
│   │   ├── organization.js
│   │   ├── schedule.js
│   │   ├── setting.js
│   │   ├── task-board.js
│   │   ├── task.js
│   │   ├── user.js
│   │   ├── webdatabase-export.js
│   │   ├── webdatabase-field.js
│   │   ├── webdatabase-import.js
│   │   ├── webdatabase.js
│   │   ├── webdatabase-record.js
│   │   ├── workflow-form-designer.js
│   │   ├── workflow.js
│   │   └── workflow-route-designer.js
│   └── uploads/
│       ├── messages/                   # メッセージ添付ファイル
│       ├── webdatabase/                # WebDB関連ファイル
│       └── workflow/                   # ワークフロー添付ファイル
├── readme.md                           # プロジェクト説明
├── reset_admin_password.php            # 管理者パスワードリセット
├── scripts/
│   └── process_email_queue.php         # メール送信バッチスクリプト
├── vendor/                             # Composerライブラリ(省略)
└── views/                              # テンプレートビュー
    ├── auth/
    │   └── login.php
    ├── home/
    │   └── index.php
    ├── layouts/
    │   ├── footer.php
    │   ├── header.php
    │   └── notification_dropdown.php
    ├── message/
    ├── notification/
    ├── organization/
    ├── schedule/
    ├── setting/
    ├── task/
    ├── user/
    ├── webdatabase/
    └── workflow/

DB構造

データベースはそれぞれの機能に合わせて最低限の実装を心がけました
ただ、適切なインデックス設定などのパフォーマンスチューニングを実施していないので、ご使用になられる場合、それらを適切に設定して下さい

GroupWareで使用されているデータベースの構造を詳細に説明します

1. 組織 (organizations)

  • id: 組織を一意に識別するID
  • name: 組織名
  • code: 組織コード(ユニーク)
  • parent_id: 親組織のID(階層構造)
  • level: 組織階層のレベル
  • sort_order: 表示順
  • description: 組織の説明

2. ユーザー (users)

  • id: ユーザーを一意に識別するID
  • username: ユーザー名(ログイン時使用)
  • email: メールアドレス
  • organization_id: 所属組織ID
  • status: ユーザーの状態(有効、無効、停止)
  • role: ユーザーの役割(管理者、マネージャー、一般ユーザー)

3. ユーザー組織関連 (user_organizations)

  • user_id: ユーザーID
  • organization_id: 組織ID
  • is_primary: メインの所属組織かどうか

4. スケジュール (schedules)

  • id: スケジュールの一意識別ID
  • title: スケジュールのタイトル
  • start_time/end_time: 開始日時/終了日時
  • creator_id: 作成者のユーザーID

5. スケジュール参加者 (schedule_participants)

  • schedule_id: スケジュールID
  • user_id: ユーザーID
  • status: 参加状況(承認待ち、承認済み、不参加)

6. ワークフローテンプレート (workflow_templates)

  • id: テンプレートを識別するID
  • name: テンプレート名
  • status: 有効または無効
  • creator_id: テンプレート作成者のユーザーID

7. ワークフロー申請 (workflow_requests)

  • id: 申請を識別するID
  • template_id: 使用するテンプレートのID
  • requester_id: 申請者のユーザーID
  • status: 申請の状態(下書き、承認待ち、承認済み、却下)

8. メッセージ (messages)

  • id: メッセージのID
  • subject: 件名
  • sender_id: 送信者のユーザーID
  • parent_id: 親メッセージのID(返信メッセージの場合)

9. メッセージ受信者 (message_recipients)

  • message_id: メッセージのID
  • user_id: 受信者のユーザーID
  • is_read: 既読状態

10. 通知 (notifications)

  • id: 通知のID
  • user_id: 通知対象ユーザーのID
  • type: 通知タイプ(スケジュール、ワークフロー、メッセージ、システム)
  • is_read: 既読状態

11. WEBデータベース (web_databases)

  • id: WEBデータベースのID
  • name: データベース名
  • creator_id: 作成者のユーザーID

12. タスクボード (task_boards)

  • id: ボードのID
  • name: ボード名
  • owner_id: 所有者のID(ユーザーまたはチーム)

13. タスクリスト (task_lists)

  • id: リストのID
  • board_id: ボードのID
  • name: リスト名

14. タスクカード (task_cards)

  • id: タスクのID
  • list_id: リストのID
  • title: タスクのタイトル
  • created_by: タスクを作成したユーザーのID

15. チーム (teams)

  • id: チームのID
  • name: チーム名
  • created_by: チーム作成者のユーザーID

セキュリティ対策

主なセキュリティ対策として以下の項目を実施しました

  • セッション管理と認証の強化:ユーザー認証にはセキュアなハッシュアルゴリズム(bcrypt)を採用し、セッションの有効期限設定や安全なクッキー設定を施しました。
  • 入力データの検証とサニタイズ:すべてのユーザー入力を厳密に検証し、XSS(クロスサイトスクリプティング)攻撃を防ぐための適切なサニタイズ処理を行っています。
  • SQLインジェクション対策:ORM(オブジェクトリレーショナルマッピング)やプリペアドステートメントを徹底利用することで、SQLインジェクションの脅威を排除しました。
  • CSRF(クロスサイトリクエストフォージェリ)対策:トークンベースのCSRF保護を実装し、リクエストの真正性を確保しました。

今後拡張するとしたら

現在の実装で最低限グループウェアとして機能するかと思いますが、本グループウェアを今後拡張するとしたら次の様な部分から手をつけると良いかと思います

  • モバイルアプリ化
  • 日報管理機能議
  • WEBデータベース機能強化
  • 掲示板・回覧板など
  • 他システムとの連携(例えばGoogleカレンダーなどは直ぐ実装できます)

など挙げていけばキリがないです

後、今回はユニットテストなどを作っていませんが、本来開発を進めるなら、必ずテストコードは書いたほうが良いです


使用する用途に合わせて柔軟に拡張してご使用いただけると嬉しいです

まとめ

思ったよりも時間がかかりましたが形になってよかったです
今回の自作グループウェアは、組織のニーズに柔軟に対応できるシステムを構築するという目標をある程度達成できたかなと思います
今後も需要があれば拡張しようかと考えています
PHPも大分、思い出せたので良かったです(笑)

GitHubでソースコードを公開していますので、お暇がございましたら見て見て下さい
不明点などが、ございましたらお気軽にコメントください

最後まで読んでいただきありがとうございました!!

おまけ

ChatGPTでポスターを生成してみました
最近のAIの進化は恐ろしいです(笑)

Groupware

みんなでつくる、みんなとつながる。
アニメの世界のようにワクワクするグループウェア!

Groupwareポスター
スケジュール管理

スケジュール管理

日・週・月表示で
チームの予定が一目瞭然!

メッセージ機能

メッセージ機能

メンバー間のやりとりを
トピックごとに整理

タスク管理

タスク管理

進捗をみんなで見える化
プロジェクトの管理もラクラク

📦 GitHubで開発中!
https://github.com/Yuusuke9228/groupware