- バックアップ一覧
- ソース を表示
- OpenSaaS1ExecEngineの開発で検討したこと。 は削除されています。
.NET 開発基盤部会 Wiki
目次 †
概要 †
OpenSaaS1ExecEngineの開発で検討したこと。
Tablet系 †
画面サイズ †
- 本SaaSはTablet横置きになる。
- 16(横):10(縦)に合わせて
- 16(横):9(縦)の場合、横を%指定のレスポンシブで広げて対応。
専用端末化 †
- Android/iOS両方で実現可能。
- ただし,OSバージョン縛りがあるので(特にAndroidは)要注意。
Android †
Android 5.0から追加された「画面の固定」機能を使えばアクティブなアプリを限定できる。
iOS †
iOS6から追加された「Single App Mode」が使える。
HTML系 †
オフライン †
- オンライン環境でない場合に、オフラインで動作する方法を検討する。
- 実装はHTML(HTML5)のWeb技術を使用する(スマホ・ネイティブ解らんので)。
- オフライン時にlocal-Storageに溜め込んでバッチ送信みたいなことを考えている。
- 色々考え、処理系を切り替える必要があるので結構難しそうだと感じた。
- 切り替えが面倒なので、一律、
- ローカルストレージに蓄積
- 定期的な情報送信を行う。
という方式が良いと考えた。
チェック †
window.navigator.onLineでチェック可能。
ポピュラーな、Key-ValueのWebStorageが良さそう。
定期的な情報送信 †
setTimeoutやsetIntervalなどを用いることで実現できる。
最新の「Web Workers」については、別に使用しなくていもイイかな。という感想。
JSON処理 †
- サーバー側(WCF)
web.configの書き方は、下記のosscons.jpのマイクロソフト系技術情報 Wikiが参考になる。
成功と失敗 †
- WebAPIの戻り値での判断は、二重登録の可能性があり、少々危険だと考える。
- トランザクションが成功した後にHTTPでエラーになると二重登録になる。
- HTTPで成功した後に、local-Storageのクリアに失敗した場合も、二重登録になる。
- 上記の二重登録の問題を解決するために、レコードにIDを付与する。
- 店舗ID + 端末ID + 時間 ( yyyy/MM/dd HH:mm:ss SSS )
- 店舗ID : ユーザアカウントから取得可能。
- 端末ID : HTMLから取得する方法が無い。
- 時間 : dateformat.jsを使用して取得可能。
二重クリックの防止 †
スキーマ †
- 分割キー(企業ID)
- 分割キー(企業ID)は、
- クラスタ化キーか、
- パーティション分割列か、
- シャーディング・キーか、
に使用する。
マスタ・データ †
企業テーブル †
店舗テーブル †
端末テーブル †
ユーザ・テーブル †
- ID
- 分割キー(企業ID)
- IsRoot?(IsAdmin?)
- ログイン・アカウント
- UID
メールアドレス(企業のドメインと一致するものを使用)
- PWD
PWDをDBに登録する場合は、SaltedPasswdを保存する。
画面初期化情報テーブル †
- 画面の初期化に必要になる情報
- 画面テンプレートを画面初期化情報で初期化して画面を表示する。
- 画面表示の前に、ユーザは店舗ID・端末ID(不足の情報)を指定する。
- 非構造化データ(JSON)
画面によって構造が異なるので、
- コントロールに関する情報を非構造化データに格納する。
- 非構造化データのフォーマットにはJSONを採用する。
- JSONのテンプレートは画面テーブルに設定しておく。
以下、画面初期化情報の項目情報。
- 共通
- ID
- 分割キー(企業ID)
- 画面ID
- 有効期限(履歴)
- 画面タイトル
- 追加の検索条件情報
追加の検索条件情報として登録する、
下記の非構造化データ(JSON)の
値のキー情報を登録しておく。
画面テーブル †
- ID
- 分割キー(企業ID)
- 説明
- JSONテンプレート
画像テーブル †
- ID
- 分割キー(企業ID)
- 店舗ID(オプション)
- 端末ID(オプション)
- 画像データ(バイナリ)
トランザクション・データ †
結果テーブル †
- 追加の検索条件
DBMSスキーマ上にあれば、集計処理で検索条件として使用できる。
例えば、非構造化データ(JSON)中の以下の項目を検索条件として追加する。
画面 †
コンテンツ画面 †
HTML/CSS/JavaScript技術を中心に使用して開発する。
カスタマイズ画面 †
エンプラ寄りのWeb Forms技術を中心に使用して開発する。
非構造化データ(JSONデータ)の入力・編集処理 †
- 非構造化データ(JSONデータ)の入力・編集処理の簡略化がキーポイント
- 画面の自動生成も面倒なので、JSONの生データを編集する方式にする。
- ・・・と考えていたが、リテラシのバラつきにより、
エンドユーザにはハードルが高いケースがあるらしいので、
JSON情報から、入力項目を自動生成する方向性に変更。
- 入力・編集を行うときは、JSONの情報から入力フィールドを自動生成する。
- 項目値
- 入力時のキャプション
- 入力・編集の可・不可
- 使用する値
条件検索と集計・グラフ表示機能 †
エンプラ寄りのWeb Forms技術を中心に使用して開発する。
ボタンIDの集計 †
- 集計処理
- 集計対象 : ボタンID(GROUP BY ボタンID)
- 集計関数 : COUNT(*)
期間の中での変化 †
- 集計処理
select
date_part('month', 日付) as 月,
count (CASE WHEN ボタンID = 1 THEN TRUE ELSE NULL END) AS AAAAA,
count (CASE WHEN ボタンID = 2 THEN TRUE ELSE NULL END) AS BBBBB,
count (CASE WHEN ボタンID = 3 THEN TRUE ELSE NULL END) AS CCCCC,
count (CASE WHEN ボタンID = 4 THEN TRUE ELSE NULL END) AS DDDDD
from
結果テーブルの条件検索の結果セット
group by
日付
order by
日付;
- 参考
- 積み上げ棒グラフで期間毎の結果を表示する。
- 月ごとの集計、条件付き集計(PostgreSQL)
上記を踏まえた技術選定 †
Open棟梁はコミュニティ連携のため前提で(笑)。
OS †
Windows †
DBMS †
PostgreSQL †
- スタートアップで人気。
- MosPで運用実績がある。
WAS †
IIS+ASP.NET †
.NET開発基盤部会だけに。
フレームワーク †
画面毎 †
- 基本
- ASP.NET Web Forms ( HTML サーバー コントロール )
- WCF ( DataContractJsonSerializer? )
- Ajax( jQuery )
- ADO.NET.
- 若しくは
- ASP.NET MVC
- ASP.NET Web API
- Ajax( jQuery )
- ADO.NET.
- その他の画面
- 特徴
- フレームワーク
- ASP.NET Web Forms ( ASP.NET Web サーバー コントロール )
- ADO.NET.
ASP.NET Web Forms †
ASP.NET Web Formsを選択した。
- ASP.NET MVCであっても・なくても良かった。
- 赤波線の件と、
- コントロールのキャプション置換がWeb Formsの方が楽だと思ったから。
- グラフ表示画面もあるので、ChartControlを使いたいと思ったから。
- B・D層を別DLL化して、必要ならUIサブシステムだけMVCに切替えるのはアリだと思う。
Ajax - REST ( JSON ) - WebAPI †
Web Formsだが、オフライン実装を考慮しPostBack?無しのWebAPIで実装。
- フレームワーク
- Ajax ( jQuery )
- REST ( REST JSON )
- WebAPI ( WCF ( DataContractJsonSerializer? ) )
ADO.NET †
ADO.NETでイイと考えた。
,etc. †
本開発 †
画面 †
メンテナンス画面 †
- ユーザ・テーブルのCRUD画面(ユーザ)
- R:サイン・イン、サイン・アウト
- C:サイン・アップ画面
- U:編集画面
- 企業テーブルのCRUD画面(ユーザ)
- R:企業検索
- C:企業登録
- U:企業編集
- D:企業削除
- 店舗テーブルのCRUD画面(ユーザ)
- R:店舗検索
- C:店舗登録
- U:店舗編集
- D:店舗削除
- 端末テーブルのCRUD画面(ユーザ)
- R:端末検索
- C:端末登録
- U:端末編集
- D:端末削除
- 画面
- 画面テーブルのCRUD画面
- R:画面検索(共通)
- C:画面登録(共通)
- U:画面編集(共通)
- D:画面削除(共通)
- 画像テーブルのCRUD画面(画像アップローダ)
- R:画面検索(共通)
- C:画面登録(システム)
- U:画面編集(システム)
- D:画面削除(システム)
- 画面初期化情報テーブルのCRUD画面
- R:画面初期化情報検索
- C:画面初期化情報登録
- U:画面初期化情報編集
- D:画面初期化情報削除
コンテンツ画面 †
集計画面 †
- 集計画面1
円グラフ/ドーナツ・グラフで結果を表示する。
- 集計画面2
積み上げ棒グラフで期間毎の結果(の変化)を表示する。
テーブル †
マスタ †
- ユーザー
- 企業テーブル
- 店舗テーブル
- 端末テーブル
- ユーザ・テーブル
- 画面
- 画面テーブル
- 画像テーブル
- 画面初期化情報テーブル
トランザクション †
SQL †
PostgreSQL
--------------------
-- TABLE:
--------------------
CREATE TABLE Enterprises(
ID integer NOT NULL,
Name VARCHAR(40) NOT NULL,
Phone VARCHAR(24),
CONSTRAINT PK_Enterprises PRIMARY KEY (ID)
);
CREATE TABLE Stores(
ID integer NOT NULL,
EnterprisesID integer NOT NULL,
Name VARCHAR(40) NOT NULL,
Description VARCHAR(40),
Phone VARCHAR(24),
CONSTRAINT PK_Stores PRIMARY KEY (ID)
);
CREATE TABLE Devices(
ID integer NOT NULL,
EnterprisesID integer NOT NULL,
StoresID integer NOT NULL,
Name VARCHAR(40) NOT NULL,
Description VARCHAR(40),
CONSTRAINT PK_Devices PRIMARY KEY (ID)
);
--------------------
-- Index:
--------------------
CREATE INDEX Split_key_Stores ON Stores (EnterprisesID);
CREATE INDEX Split_key_Devices ON Devices (EnterprisesID);
CLUSTER Stores USING Split_key_Stores;
CLUSTER Devices USING Split_key_Devices;
--------------------
-- Sequence:
--------------------
CREATE SEQUENCE TS_EnterpriseID;
CREATE SEQUENCE TS_StoreID;
CREATE SEQUENCE TS_DeviceID;
--------------------
-- INSERT
--------------------
INSERT INTO Enterprises (ID, Name, Phone) VALUES(nextval('TS_EnterpriseID'), 'AAAA', '1111');
INSERT INTO Stores (ID, EnterprisesID, Name, Description, Phone) VALUES(nextval('TS_StoreID'), currval('TS_EnterpriseID'), 'aaaa', '・・・・・', '1112');
INSERT INTO Devices (ID, EnterprisesID, StoresID, Name, Description) VALUES(nextval('TS_DeviceID'), currval('TS_EnterpriseID'), currval('TS_StoreID'), '001', '・・・・・');
--------------------
-- SELECT
--------------------
SELECT * FROM Enterprises;
SELECT * FROM Stores;
SELECT * FROM Devices;
プロト開発 †
Ph1 †
3 画面
コンテンツ画面 †
種々の情報は固定
集計画面 †
- 集計画面1
円グラフ/ドーナツ・グラフで結果を表示する。
- 集計画面2
積み上げ棒グラフで期間毎の結果(の変化)を表示する。
Ph2 †
6 画面追加
3 テーブル * CRUD画面は 2 画面(検索・詳細) = 6 画面
メンテナンス画面の追加 †
- 画面テーブルのCRUD画面
- 画像テーブルのCRUD画面
- 画面初期化情報テーブルのCRUD画面(ユーザ)
コンテンツ画面 †
種々の情報を可変に。
Ph3 †
8 画面追加
4 テーブル * CRUD画面は 2 画面(検索・詳細) = 8 画面
メンテナンス画面の追加 †
- ユーザ・テーブルのCRUD画面
- 企業テーブルのCRUD画面
- 店舗テーブルのCRUD画面
- 端末テーブルのCRUD画面
コンテンツ画面 †
サイン・イン、サイン・アウト(認証)に対応