Project

General

Profile

Cấu Trúc Ứng Dụng AKA-Form » History » Version 8

Lê Sĩ Quý, 08/28/2025 07:02 PM

1 2 Lê Sĩ Quý
{{TOC}}
2
3
Mỗi AKA-Form web app là 1 file Google Spreadsheet (sử dụng Google Apps Script phía sau), để tiết kiệm thời gian bạn nên bắt đầu với template có sẵn thay vì tạo mới mọi thứ từ đầu. Template bao gồm các sheet & Apps Script code project.
4
5 8 Lê Sĩ Quý
## Form Url
6
7
Các page/form của AKA-Form sẽ có địa chỉ theo format
8
9
**Địa chỉ publish webapp**?url=/form/**form-id**
10
11
```
12
https://script.google.com/macros/s/AKfycbwIjB-hULVZdfCtsXFPg4Af_8WoKx2AFf85KMVwnsO_WkeAXW3zarT6vZNFVfwccz1_sA/exec?url=/form/login
13
```
14
15
hoặc tham số đi kèm dạng **Địa chỉ publish webapp**?url=/form/**form-id**/ **tham-số**
16
17
```
18
https://script.google.com/macros/s/AKfycbwIjB-hULVZdfCtsXFPg4Af_8WoKx2AFf85KMVwnsO_WkeAXW3zarT6vZNFVfwccz1_sA/exec?url=/form/crud-employee/1
19
```
20
21
**1**  là record id truyền vào form CRUD Employee
22
23 2 Lê Sĩ Quý
Lưu ý: không nên đổi tên các SHEET dưới đây vì sẽ khiến app gặp lỗi
24
25
## Sheet Datasources
26
27
Sheet **Datasources** cấu hình nguồn dữ liệu (datasource) sử dụng với web app, hiện tại chỉ hỗ trợ datasource là Google Spreadsheets. Một datasouce có thể là 1 sheet cùng file với file spreadsheet app hoặc nằm bên ngoài. Các field bao gồm:
28
29
* **Id** : tên gợi nhớ để tham chiếu ở mục khác, không nên dùng  ký  tự trắng (space) trong giá trị của field Id.
30
* **Url** : chứa địa chỉ của file spreadsheet nếu sheet của datasouce không nằm cùng file spreadsheet bot 
31
* **Sheet**: tên sheet sẽ truy vấn.
32
* **Range**: vùng địa chỉ sẽ truy vấn, ví dụ: A1:J... 
33
* **Header**: số lượng dòng (row) làm header có trong Range dữ liệu
34
* **Cached**: Yes: cache data được load, tăng hiệu suất ứng dụng
35
* **Note**: Ghi chú bổ sung
36 3 Lê Sĩ Quý
37
## Sheet Users
38
39
Trường hợp app có sử dụng authentication, sheet **Users** cung cấp cách thức để quản lý user đơn giản. Người dùng đăng nhập với Email & Password. 
40
41
Sheet **Users** bao gồm các field :
42
* **Name** : tên gợi nhớ để tham chiếu ở mục khác.
43
* **Email** : Email để đăng nhập, không nhất thiết phải email có thực, định dạng giá trị phải là 1 email hợp lệ
44
* **Password**: Mật khẩu để đăng nhập. Password được mã hóa bằng hàm md5, ví dụ *md5("Hello") => 8b1a9953c4611296a827abf8c47804d7*
45
* **IsActive**: **Yes** : user đang hoạt động, **No** : User bị khóa
46
* **Note**: Ghi chú bổ sung
47 4 Lê Sĩ Quý
48
## Sheet Forms
49
50
AKA-Form web app là tập hợp các form/page độc lập. Sự liên hệ giữa các form được quy định trong từng form, ví dụ: để truy cập form Customers thì bắt buộc phải login trước. Logic này sẽ được cài đặt bằng Javascript trong form Customers, nếu thông tin đăng nhập không hợp lệ sẽ redirect sang form Login.
51
52
Sheet **Forms** bao gồm các field :
53
* **Id** : tên gợi nhớ để tham chiếu ở mục Url, không ký tự trắng (space) hoặc ký tự đặc biệt.
54
* **Name** : tên gợi nhớ để tham chiếu ở mục khác, có thể bao gồm khoảng trắng
55
* **Html**: HTML code (JS/CSS) để tạo nên front-end của form/page, hỗ trợ [Templated HTML](https://developers.google.com/apps-script/guides/html/templates)
56
* **Template**: Form JSON sinh ra bởi [Form.IO Builder](https://formio.github.io/formio.js/app/sandbox.html)
57
* **Database**: Tên datasource sẽ đọc dữ liệu, trong trường hợp form Edit sẽ kiểm tra Database có chứa record với id edit tương ứng
58
* **References**: Trường hợp các thành phần UI của form có sử dụng data lookup, ví dụ: trong form Order, combobox Products sẽ cần load danh sách product bằng cách tham chiếu đến Reference tương ứng cấu hình trong Form JSON
59
* **SubForms**: Phần nâng cao, dành cho form không sử dụng cơ chế lưu trữ Document mà lưu phẳng trong Spreadsheet
60 5 Lê Sĩ Quý
* **NewUrl**: Url để tạo mới record, cũng là template url sử dụng Google Form đóng vai trò làm backend lưu trữ, ví dụ: https://docs.google.com/forms/d/e/1FAIpQLScLnowNlnQXZvp8yFmTcuGFXi0C71K8I9mDNvk8Jha-rRcI3Q/formResponse?entry.779708373=Employees&entry.1745485693={Document}&entry.26640752={Id}&entry.967646527={CreatedBy}&entry.1408490212={ModifiedBy}&entry.2129865903={CreatedAt}&entry.95214425={ModifiedAt}&entry.988375443={IsDeleted}*
61
* **Link**: đơn thuần là lối tắt để truy cập form, format dạng *[web-app-published-url]?url=/form/<Id>* 
62 6 Lê Sĩ Quý
63
## Sheet SubForms
64
65
SubForm được sử dụng trường hợp lưu trữ dạng phẳng (flatten) thay vì dạng Document. Mô hình Document đơn giản trong việc cấu hình và query dữ liệu khi mọi data được tổ chức thành 1 document (nested objects). Dạng phẳng (flatten) được lưu trữ riêng biệt cho từng object trong form. Mỗi object được lưu ở 1 sheet riêng biệt. Dạng phẳng không cần tốn thêm công đoạn bóc tách dữ liệu bằng AKA-Bot để làm báo cáo.
66
67
Sheet **SubForms** bao gồm các field :
68
* **Id** : tên gợi nhớ để tham chiếu ở mục Url, không ký tự trắng (space) hoặc ký tự đặc biệt.
69
* **Name** : tên gợi nhớ để tham chiếu ở mục khác, có thể bao gồm khoảng trắng
70
* **Collection** : Thuộc tính tham chiếu trong đối tượng dữ  liệu JSON của form submission
71
* **Database**: Tên datasource sẽ đọc dữ liệu, trong trường hợp form Edit sẽ kiểm tra Database có chứa record với id edit tương ứng
72
* **NewUrl**: Url để tạo mới record, cũng là template url sử dụng Google Form đóng vai trò làm backend lưu trữ.
73 7 Lê Sĩ Quý
74
## Sheet System
75
Sheet **System**  lưu các setting/configuration dạng Key-Value để dùng trong module/app. Trong config, có thể truy cập các key bằng cú pháp template <#Key#>. Các field bao gồm:
76
77
* **Key** : tên gợi nhớ để tham chiếu ở mục khác, không nên dùng  ký  tự trắng (space) trong giá trị của field Key.
78
* **Value** : Giá trị mặc định. Giá trị không nhất thiết là giá trị tĩnh (static), bạn có thể sử dụng Google Sheets formula để tạo giá trị động (dynamic) phù hợp với yêu cầu business.
79
* **Note** : Ghi chú (tùy chọn)
80
81
## Sheet Log
82
App ghi nội dung log trong quá trình thực thi. Level gồm:
83
84
* Trace = 0
85
* Debug = 1
86
* Info = 2
87
* Warn = 3
88
* Error = 4
89
90
Apps Scripts Project Settings có thuộc tính app.logLevel đế set giá trị global cho log level
91
**Giá trị mặc là 2 => chỉ xuất ra sheet Log các log entry Level từ Info trở lên**