Compare commits
31 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3dc5a03484 | |||
| 0dd68c3649 | |||
| a7dbf52eea | |||
| 302785b60b | |||
| e91e607d14 | |||
| 986bd08e5f | |||
| 2181547184 | |||
| 4793dc9c17 | |||
| ba7a43e637 | |||
| ba587a40cb | |||
| e9909784c7 | |||
| 554ef1d15d | |||
| 39443b95ab | |||
| 23134517ce | |||
| 47ce0da13a | |||
| d4d9543a98 | |||
| 0326535eb6 | |||
| 38d6b8234a | |||
| 6fe098bc5b | |||
| 5c644545b8 | |||
| d3fef38796 | |||
| 381115a443 | |||
| 6eff207bbc | |||
| 9439662328 | |||
| 9b6e188df8 | |||
| ee6b2a8919 | |||
| 0f551bd5c7 | |||
| 109c09d2a3 | |||
| 1fd3b689c8 | |||
| bab7e02b02 | |||
| 69e8b767ff |
@@ -0,0 +1 @@
|
|||||||
|
.svn/
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"type": "java",
|
||||||
|
"name": "Debug (Launch) - SisvietnamvnApp",
|
||||||
|
"request": "launch",
|
||||||
|
"mainClass": "com.sisvietnamvn.web.SisvietnamvnApp",
|
||||||
|
"projectName": "sisvietnamvn",
|
||||||
|
"cwd": "${workspaceFolder}/sisvietnamvn_main",
|
||||||
|
"vmArgs": "-Dspring.profiles.active=dev"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "java",
|
||||||
|
"name": "Debug (Attach) - Port 5005",
|
||||||
|
"request": "attach",
|
||||||
|
"hostName": "127.0.0.1",
|
||||||
|
"port": 5005,
|
||||||
|
"projectName": "sisvietnamvn"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,4 +1,13 @@
|
|||||||
{
|
{
|
||||||
"java.configuration.updateBuildConfiguration": "interactive",
|
"java.compile.nullAnalysis.mode": "automatic",
|
||||||
"java.compile.nullAnalysis.mode": "automatic"
|
"jdk.jdkhome": "/usr/lib/jvm/java-21-openjdk-amd64",
|
||||||
|
"java.jdt.ls.java.home": "/usr/lib/jvm/java-21-openjdk-amd64",
|
||||||
|
"java.configuration.runtimes": [
|
||||||
|
{
|
||||||
|
"name": "JavaSE-21",
|
||||||
|
"path": "/usr/lib/jvm/java-21-openjdk-amd64",
|
||||||
|
"default": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"java.configuration.updateBuildConfiguration": "interactive"
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
Dưới đây là danh sách đầy đủ toàn bộ các chức năng của trang quản trị WordPress (WordPress Admin Dashboard), được chia làm hai phần chính: Giao diện người dùng (UI/UX) và Các hàm PHP/APIs dành cho Lập trình viên để phát triển/tùy biến trang admin.
|
||||||
|
|
||||||
|
PHẦN 1: CÁC CHỨC NĂNG TRÊN GISAO DIỆN ADMIN (UI MENUS)
|
||||||
|
Đây là các chức năng mặc định xuất hiện ở thanh Menu bên trái (Sidebar) của trang quản trị:
|
||||||
|
|
||||||
|
Menu chính Menu con Chức năng chi tiết
|
||||||
|
(done)1. Dashboard (Bảng điều khiển) Home Xem tổng quan trạng thái website (Site Health, số lượng bài viết/trang, bình luận gần đây, hoạt động viết nháp nhanh).
|
||||||
|
Updates Cập nhật phiên bản WordPress Core, Themes, Plugins và các gói dịch vụ ngôn ngữ.
|
||||||
|
(Done) 2. Posts (Bài viết) All Posts Quản lý toàn bộ bài viết tin tức, blog, lọc theo ngày/chuyên mục.
|
||||||
|
Add New Soạn thảo bài viết mới bằng Block Editor (Gutenberg) hoặc Classic Editor.
|
||||||
|
Categories Tạo và quản lý các Chuyên mục (thư mục phân loại bài viết).
|
||||||
|
Tags Tạo và quản lý các Thẻ (nhãn từ khóa tìm kiếm nhanh).
|
||||||
|
(Done) 3. Media (Thư viện) Library Quản lý toàn bộ hình ảnh, tài liệu (PDF, Docx), video, âm thanh đã tải lên.
|
||||||
|
Add New Tải tệp tin mới lên máy chủ.
|
||||||
|
(Done) 4. Pages (Trang) All Pages Quản lý các trang tĩnh (ví dụ: Trang chủ, Trang liên hệ, Giới thiệu bệnh viện, Giờ làm việc...).
|
||||||
|
Add New Tạo trang tĩnh mới.
|
||||||
|
(done) 6. Appearance (Giao diện) Themes Cài đặt, kích hoạt hoặc xóa các giao diện hiển thị của website.
|
||||||
|
Customize Chỉnh sửa giao diện trực quan theo thời gian thực (Header, Footer, Colors, Font, v.v.).
|
||||||
|
Widgets Quản lý các khối nội dung ở Sidebar hoặc Footer.
|
||||||
|
Menus Thiết kế menu điều hướng chính ở đầu trang và chân trang.
|
||||||
|
Theme File Editor Chỉnh sửa trực tiếp file code của giao diện (chỉ dùng cho lập trình viên).
|
||||||
|
(done)7. Plugins (Gói mở rộng) Installed Plugins Quản lý, kích hoạt, vô hiệu hóa hoặc xóa các Plugin đang có trên hệ thống.
|
||||||
|
Add New Tìm kiếm và cài đặt Plugin mới từ thư viện WordPress.org hoặc upload file .zip.
|
||||||
|
Plugin File Editor Chỉnh sửa mã nguồn của các Plugin trực tiếp từ admin.
|
||||||
|
(done) 8. Users (Thành viên) All Users Quản lý danh sách toàn bộ tài khoản đăng ký trên hệ thống.
|
||||||
|
Add New Tạo tài khoản người dùng mới và chỉ định vai trò (Role).
|
||||||
|
Profile Chỉnh sửa thông tin cá nhân của tài khoản đang đăng nhập (đổi pass, ngôn ngữ hiển thị).
|
||||||
|
(done) 9. Tools (Công cụ) Available Tools Các công cụ hỗ trợ chuyển đổi dữ liệu.
|
||||||
|
(done) Import / Export Nhập/Xuất toàn bộ bài viết, trang, media sang file .xml để sao lưu hoặc chuyển host.
|
||||||
|
(done) Site Health Kiểm tra sức khỏe hệ thống (phiên bản PHP, MySQL, các lỗi bảo mật).
|
||||||
|
(done) Export / Erase Personal Data Xuất hoặc xóa dữ liệu cá nhân của người dùng để tuân thủ luật bảo mật (GDPR).
|
||||||
|
(done) 10. Settings (Cài đặt) General Thiết lập tên website, câu khẩu hiệu, địa chỉ email admin, múi giờ, định dạng ngày tháng.
|
||||||
|
Writing Cấu hình mặc định khi soạn thảo văn bản và gửi bài viết qua email.
|
||||||
|
Reading Thiết lập trang chủ hiển thị, số lượng bài viết tối đa trên một trang blog, chặn công cụ tìm kiếm.
|
||||||
|
Discussion Cấu hình bình luận (yêu cầu phê duyệt, chặn từ ngữ nhạy cảm).
|
||||||
|
Media Cài đặt kích thước mặc định cho ảnh khi upload (Thumbnail, Medium, Large).
|
||||||
|
Permalinks Định dạng cấu trúc đường dẫn tĩnh (URL) tối ưu cho SEO (ví dụ: /post-name/).
|
||||||
|
Privacy Thiết lập trang chính sách bảo mật cho website.
|
||||||
|
|
||||||
|
|
||||||
|
PHẦN 2: CÁC HÀM PHP & HOOKS ĐỂ PHÁT TRIỂN TRANG ADMIN (DEVELOPER API)
|
||||||
|
Nếu bạn đang lập trình tùy biến trang admin (hoặc xây dựng CMS tương tự), WordPress cung cấp bộ API để tạo và kiểm soát trang admin sau:
|
||||||
|
|
||||||
|
1. Các hàm tạo Menu & Submenu trong Admin
|
||||||
|
add_menu_page(): Thêm một Menu chính mới (cấp cao nhất) ở thanh sidebar bên trái.
|
||||||
|
add_submenu_page(): Thêm một Menu con (Submenu) vào dưới một Menu chính bất kỳ.
|
||||||
|
Các hàm phái sinh viết nhanh (Helper functions):
|
||||||
|
add_options_page(): Thêm trang con vào menu Settings (Cài đặt).
|
||||||
|
add_theme_page(): Thêm trang con vào menu Appearance (Giao diện).
|
||||||
|
add_plugins_page(): Thêm trang con vào menu Plugins.
|
||||||
|
add_users_page(): Thêm trang con vào menu Users (Thành viên).
|
||||||
|
add_dashboard_page(): Thêm trang con vào menu Dashboard (Bảng điều khiển).
|
||||||
|
add_management_page(): Thêm trang con vào menu Tools (Công cụ).
|
||||||
|
2. Các Action Hooks quan trọng trong Admin
|
||||||
|
admin_menu: Chạy khi cấu trúc menu admin đang được khởi tạo. Đây là nơi bắt buộc để gọi các hàm add_menu_page() và add_submenu_page().
|
||||||
|
admin_init: Chạy khi trang admin được tải và khởi tạo. Thường dùng để đăng ký cấu hình (Settings API), kiểm tra quyền hoặc xử lý form gửi lên.
|
||||||
|
admin_enqueue_scripts: Hook chuẩn duy nhất để tải thêm file CSS và JavaScript tùy chỉnh vào trang quản trị (tránh làm ảnh hưởng đến các plugin khác).
|
||||||
|
admin_post_{action} & admin_post_nopriv_{action}: Xử lý các yêu cầu gửi Form (POST/GET) từ trang quản trị một cách an toàn.
|
||||||
|
3. Các hàm kiểm tra Phân quyền & Trạng thái
|
||||||
|
is_admin(): Kiểm tra xem trang hiện tại người dùng đang truy cập có thuộc phân hệ quản trị (backend /wp-admin/) hay không.
|
||||||
|
current_user_can( $capability ): Kiểm tra người dùng hiện tại có đủ quyền thực hiện hành động hay không (ví dụ: current_user_can('manage_options') để kiểm tra quyền Admin).
|
||||||
|
get_current_screen(): Lấy thông tin chi tiết về trang admin hiện tại đang hiển thị (ID, Base, Post Type).
|
||||||
|
4. Settings API (Quản lý và lưu trữ thiết lập)
|
||||||
|
register_setting(): Đăng ký một tùy chọn (option) mới trong cơ sở dữ liệu để lưu trữ cấu hình.
|
||||||
|
add_settings_section(): Tạo ra một vùng chứa (section) trên trang để gom nhóm các trường cài đặt.
|
||||||
|
add_settings_field(): Thêm một trường nhập liệu (Input, Checkbox, Select) vào vùng chứa đã tạo.
|
||||||
|
settings_fields() & do_settings_sections(): Các hàm render giao diện form cấu hình tự động và tạo mã bảo mật Token (Nonce).
|
||||||
|
TIP
|
||||||
|
|
||||||
|
Ứng dụng cho dự án Spring Boot hiện tại: Nếu bạn đang chuyển đổi hoặc xây dựng mới phân hệ Quản trị (Admin Panel) cho dự án website bệnh viện S.I.S Cần Thơ, bạn có thể ánh xạ các chức năng của WordPress như trên thành các Controller trong Spring Boot (ví dụ: @Controller @RequestMapping("/admin")), chia các chức năng quản lý thành các REST API và phân quyền truy cập thông qua Spring Security (tương đương với current_user_can trong WordPress).
|
||||||
|
After Width: | Height: | Size: 154 KiB |
|
After Width: | Height: | Size: 1.0 MiB |
@@ -0,0 +1,29 @@
|
|||||||
|
1. "Trust & Clean" (Xanh Da Trời & Trắng Sứ)
|
||||||
|
Đây là phong cách rất phổ biến cho các nền tảng y tế hiện đại, mang lại cảm giác sạch sẽ, công nghệ cao và đáng tin cậy.
|
||||||
|
|
||||||
|
Màu chủ đạo (Primary): Xanh Cerulean (#0077B6 hoặc #0284C7) - Sáng và thân thiện hơn màu xanh Navy truyền thống.
|
||||||
|
Màu phụ trợ (Secondary): Xanh ngọc bích nhạt (#48CAE4).
|
||||||
|
Màu nền (Background): Trắng sứ (#FFFFFF) và Xám nhạt (#F8FAFC).
|
||||||
|
Màu nhấn (Accent): Cam nhạt hoặc Vàng rực (#F59E0B) cho các nút Call-to-Action (Đặt lịch khám, Cấp cứu).
|
||||||
|
2. "Healing & Nature" (Xanh Mòng Két & Xanh Lá Nhạt)
|
||||||
|
Gam màu này mang lại cảm giác chữa lành, bình yên, rất phù hợp với môi trường chăm sóc sức khỏe.
|
||||||
|
|
||||||
|
Màu chủ đạo: Xanh mòng két / Teal (#0F766E hoặc #008080).
|
||||||
|
Màu phụ trợ: Xanh lá cây nhạt (Mint Green - #A7F3D0).
|
||||||
|
Màu nền: Trắng kem (#FAFAFA) giúp giao diện không bị chói mắt.
|
||||||
|
Màu nhấn: San hô (Coral - #FF7F50) để tạo điểm nhấn ấm áp, xóa đi sự lạnh lẽo của bệnh viện.
|
||||||
|
3. "Modern Academic" (Tím Than & Xanh Cyan)
|
||||||
|
Vì đây không chỉ là bệnh viện mà còn là Đại học, gam màu tím than/xanh đen mang lại vẻ học thuật, nghiên cứu chuyên sâu, kết hợp với màu xanh Cyan trẻ trung.
|
||||||
|
|
||||||
|
Màu chủ đạo: Tím than / Midnight Blue (#1E293B hoặc #172554).
|
||||||
|
Màu phụ trợ: Xanh dương sáng (Cyan - #06B6D4).
|
||||||
|
Màu nền: Xám trắng (#F1F5F9).
|
||||||
|
Màu nhấn: Vàng kim (Gold - #EAB308) - giữ lại một chút yếu tố truyền thống của ĐHYD.
|
||||||
|
4. "Soft & Accessible" (Xanh Pastel & Xám Slate)
|
||||||
|
Thiết kế tập trung vào tính tiếp cận, dễ nhìn cho mọi lứa tuổi (đặc biệt là người lớn tuổi khi dùng web bệnh viện).
|
||||||
|
|
||||||
|
Màu chủ đạo: Xanh dương nhạt / Soft Blue (#3B82F6).
|
||||||
|
Màu chữ chính: Xám đậm Slate (#334155) thay vì màu đen tuyền để giảm độ tương phản gắt.
|
||||||
|
Màu nền: Trắng tinh (#FFFFFF).
|
||||||
|
Màu nhấn: Hồng y tế / Đỏ nhạt (#EF4444) dùng riêng cho các cảnh báo, cấp cứu hoặc thông báo quan trọng.
|
||||||
|
Bạn cảm thấy ấn tượng với phong cách nào nhất trong số trên? Nếu bạn muốn, tôi có thể dùng công cụ để thử lên ý tưởng giao diện (Generate Image) hoặc áp dụng màu mới này vào mã nguồn CSS của bạn! Bạn chỉ cần cho tôi biết bạn đang lưu trữ mã nguồn ở đâu nhé.
|
||||||
|
After Width: | Height: | Size: 8.6 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 584 KiB |
@@ -0,0 +1,27 @@
|
|||||||
|
# Phân Tích Cách Phối Màu (Color Scheme) Của Trang Chủ UMass Amherst
|
||||||
|
Dựa vào giao diện trang chủ của Đại học UMass Amherst, trang web này sử dụng một phong cách phối màu **độ tương phản cao (High-contrast), hiện đại và đậm chất thương hiệu**.
|
||||||
|
Dưới đây là phân tích chi tiết về cách họ sử dụng màu sắc:
|
||||||
|
## 1. Màu thương hiệu chủ đạo (Primary Brand Color): Đỏ sậm (Maroon)
|
||||||
|
* **Màu Đỏ sậm (Maroon/Dark Red)** là màu nhận diện thương hiệu cốt lõi của trường.
|
||||||
|
* **Cách sử dụng:** Nó được dùng vô cùng chiến lược để điều hướng sự chú ý của người dùng. Bạn có thể thấy màu này xuất hiện ở:
|
||||||
|
* Logo ở góc trái.
|
||||||
|
* Thanh điều hướng (Navigation bar) dưới banner chính.
|
||||||
|
* Các nút bấm quan trọng (Call-to-Action) như: nút tìm kiếm (kính lúp), nút "LEARN MORE", và các nút "APPLY TODAY", "VISIT", "DONATE".
|
||||||
|
* Các điểm nhấn chữ (Typography accents): chữ "YOUR FUTURE", số "#1", "251", "Top 50" và icon ngày tháng trong mục Sự kiện (Events).
|
||||||
|
* **Hiệu ứng:** Màu đỏ sậm mang lại cảm giác truyền thống, uy tín (đặc trưng của ngành giáo dục), nhưng khi đặt trên nền tối nó lại tạo ra sự năng động và nổi bật.
|
||||||
|
## 2. Các màu nền tạo nhịp điệu (Rhythm & Contrast): Trắng, Đen và Xám nhạt
|
||||||
|
Trang web không dùng một màu nền duy nhất mà chia thành các dải ngang (color blocks) đan xen nhau để phân tách nội dung rõ ràng, giúp mắt không bị mỏi khi cuộn trang dài:
|
||||||
|
* **Màu Trắng (White):** Được dùng làm nền cho các phần chứa nhiều chữ hoặc số liệu (phần thống kê #1, Apply Today, News & Events). Nền trắng giúp văn bản màu đen dễ đọc nhất, tạo cảm giác không gian mở, thoáng đãng (negative space).
|
||||||
|
* **Màu Đen / Xám đen rất đậm (Black / Dark Charcoal):** Được sử dụng cho các khối nội dung lớn (phần "WHAT'S LIFE LIKE AT UMASS?" và "BLAZE YOUR OWN TRAIL") và chân trang (Footer). Việc dùng nền đen xen kẽ nền trắng tạo ra sự tương phản cực mạnh, mang lại cảm giác mạnh mẽ, hiện đại và cao cấp (premium).
|
||||||
|
* **Màu Xám nhạt (Light Gray):** Xuất hiện ở phần "I'M LOOKING FOR...". Đây là một màu chuyển tiếp tinh tế. Thay vì chuyển gắt từ Trắng sang Đen, màu xám nhạt giúp phân tách phần này với phần nền trắng bên trên mà không làm tổng thể bị nặng nề.
|
||||||
|
## 3. Màu sắc văn bản (Typography)
|
||||||
|
* Để đảm bảo **khả năng truy cập (Accessibility - WCAG)**, trang web tuân thủ nghiêm ngặt nguyên tắc tương phản:
|
||||||
|
* Văn bản màu **Đen** hoặc **Xám đậm** đặt trên nền Trắng/Xám nhạt.
|
||||||
|
* Văn bản màu **Trắng** đặt trên nền Đen/Đỏ sậm.
|
||||||
|
* Họ không dùng các màu sắc sặc sỡ cho chữ thường, giữ cho tổng thể rất chuyên nghiệp và dễ đọc.
|
||||||
|
## 4. Màu sắc bổ trợ từ Hình ảnh (Photography)
|
||||||
|
* Vì bộ màu UI cốt lõi rất trung tính và sắc nét (Đỏ - Đen - Trắng), màu sắc rực rỡ và sinh động của trang web chủ yếu đến từ **hình ảnh và video**.
|
||||||
|
* Màu xanh lá cây của cây cối, màu xanh dương của bầu trời/nước, và màu da ấm áp của sinh viên trong các bức ảnh giúp trung hòa lại sự khô cứng của các khối màu phẳng, mang lại sức sống và sự thân thiện cho giao diện.
|
||||||
|
---
|
||||||
|
**Tổng kết:**
|
||||||
|
Cách phối màu này được gọi là **Block Color** kết hợp **Monochromatic Accents** (Dùng khối màu lớn xen kẽ và nhấn bằng một màu thương hiệu duy nhất). Thiết kế này rất hiệu quả cho các tổ chức lớn, vừa giữ được sự sang trọng, uy tín, vừa đảm bảo tính hiện đại và khả năng điều hướng người dùng (UX) cực kỳ tốt.
|
||||||
|
After Width: | Height: | Size: 106 KiB |
|
After Width: | Height: | Size: 2.9 MiB |
|
After Width: | Height: | Size: 636 KiB |
|
After Width: | Height: | Size: 4.7 MiB |
|
After Width: | Height: | Size: 2.7 KiB |
@@ -0,0 +1,64 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
version="1.0"
|
||||||
|
width="64pt"
|
||||||
|
height="64pt"
|
||||||
|
viewBox="0 0 64 64"
|
||||||
|
preserveAspectRatio="xMidYMid"
|
||||||
|
id="svg3"
|
||||||
|
sodipodi:docname="anesthesia.svg"
|
||||||
|
inkscape:version="1.4.4 (dcaf3e7, 2026-05-05)"
|
||||||
|
inkscape:export-filename="D:\website_sisvietnam_moi\website_sisvietnam.vn\Media\sisvietnamvn\anesthesia.png"
|
||||||
|
inkscape:export-xdpi="96"
|
||||||
|
inkscape:export-ydpi="96"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs3" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview3"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#000000"
|
||||||
|
borderopacity="0.25"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:document-units="pt"
|
||||||
|
inkscape:zoom="8.9648437"
|
||||||
|
inkscape:cx="30.731155"
|
||||||
|
inkscape:cy="42.332026"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1009"
|
||||||
|
inkscape:window-x="1912"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg3" />
|
||||||
|
<g
|
||||||
|
id="g4"
|
||||||
|
transform="translate(12.000012,11.987487)"
|
||||||
|
style="fill:#ffffff">
|
||||||
|
<g
|
||||||
|
transform="matrix(0.00782777,0,0,-0.00782777,-0.03910335,40.064165)"
|
||||||
|
fill="#000000"
|
||||||
|
stroke="none"
|
||||||
|
id="g3"
|
||||||
|
style="fill:#ffffff">
|
||||||
|
<path
|
||||||
|
d="m 2390,5114 c -484,-46 -883,-202 -1231,-482 -84,-68 -245,-232 -304,-309 l -39,-53 H 705 C 494,4270 353,4213 209,4070 145,4006 114,3965 83,3905 3,3749 5,3773 5,3080 5,2524 7,2459 23,2400 61,2260 151,2118 256,2036 l 52,-41 3,-308 4,-309 24,-19 c 30,-25 62,-24 95,2 l 26,20 v 269 268 l 53,-16 c 43,-13 124,-16 463,-19 l 412,-4 42,-50 c 53,-63 173,-166 266,-228 l 70,-47 -83,-78 c -247,-230 -392,-546 -410,-891 -8,-165 23,-272 112,-389 l 36,-47 -398,3 -398,3 -46,27 c -51,30 -92,84 -108,143 -7,25 -11,176 -11,407 v 367 l -26,20 c -35,28 -69,26 -99,-4 l -25,-24 V 726 C 310,494 314,342 321,308 347,187 424,91 538,37 L 605,5 h 1955 1955 l 67,32 c 114,54 191,150 217,271 8,37 11,306 12,870 v 817 l 60,48 c 105,84 187,215 226,357 16,59 18,121 18,680 0,693 2,669 -78,825 -31,60 -62,101 -126,165 -142,141 -285,200 -486,200 h -103 l -58,73 c -75,93 -210,228 -299,298 -113,90 -238,169 -265,169 -58,0 -95,-60 -66,-105 9,-13 62,-55 118,-94 387,-264 649,-656 723,-1086 35,-196 17,-498 -37,-643 -41,-110 -174,-215 -289,-229 l -50,-6 8,54 c 4,30 7,104 7,164 0,127 -13,169 -93,303 -80,135 -160,238 -259,339 -78,79 -213,190 -267,221 -12,6 -10,17 10,57 33,70 51,177 35,214 -11,27 -46,51 -74,51 -7,0 -25,-9 -38,-20 -19,-15 -27,-32 -32,-75 -7,-59 -33,-135 -47,-135 -4,0 -48,17 -96,39 -164,71 -327,115 -503,135 l -105,12 -3,106 c -3,102 -4,108 -29,128 -42,33 -85,25 -108,-21 -10,-19 -15,-59 -15,-122 v -94 l -87,-7 c -167,-13 -406,-77 -542,-145 -33,-17 -65,-31 -70,-31 -18,0 -41,57 -50,126 -11,75 -22,91 -68,100 -26,5 -37,1 -59,-21 -25,-25 -26,-31 -21,-94 3,-38 17,-95 30,-129 l 25,-61 -96,-77 c -225,-179 -425,-429 -499,-623 -30,-77 -41,-215 -26,-325 l 10,-68 -47,4 c -67,7 -153,50 -208,105 -102,102 -137,236 -136,528 0,209 14,298 74,477 146,436 520,829 979,1028 487,211 1052,237 1552,70 141,-47 161,-49 188,-14 40,50 24,92 -46,122 -147,63 -403,122 -618,142 -102,9 -303,11 -385,4 z M 663,4013 C 496,3675 448,3276 531,2921 c 26,-113 70,-193 149,-271 95,-95 173,-129 351,-155 35,-5 36,-7 66,-98 33,-98 92,-229 142,-314 l 31,-53 H 947 c -357,0 -389,4 -507,63 -136,67 -256,233 -280,387 -6,38 -10,291 -10,605 0,596 3,624 62,745 41,85 142,186 228,230 83,42 140,58 215,59 l 61,1 z m 3934,82 c 186,-63 318,-210 358,-400 12,-57 15,-172 15,-610 0,-314 -4,-567 -10,-605 -24,-154 -143,-319 -281,-387 -116,-59 -150,-63 -502,-63 h -318 l 19,28 c 38,53 116,218 153,322 41,118 24,104 164,129 179,32 339,178 399,366 45,141 63,457 37,630 -29,185 -87,368 -170,533 l -41,82 h 51 c 28,0 85,-11 126,-25 z M 2820,3834 c 240,-41 481,-144 676,-290 157,-118 336,-332 432,-518 36,-70 37,-73 36,-181 -4,-345 -152,-692 -403,-945 -87,-88 -224,-200 -244,-200 -5,0 -5,21 0,48 25,152 -6,362 -77,508 -191,396 -633,549 -1014,351 -62,-31 -102,-63 -171,-132 -133,-133 -207,-279 -236,-466 -11,-73 -8,-257 6,-291 12,-30 -10,-20 -97,44 -334,247 -551,667 -553,1068 0,120 1,128 31,191 70,147 217,337 353,456 347,304 806,433 1261,357 z M 2719,2523 c 211,-58 375,-235 437,-473 35,-130 15,-353 -40,-458 l -14,-26 -7,43 c -4,24 -25,78 -46,122 -144,286 -506,384 -778,210 -100,-64 -188,-185 -222,-301 -18,-64 -24,-66 -43,-17 -69,182 -59,391 29,572 130,270 410,404 684,328 z M 4650,334 c -6,-28 -21,-65 -34,-83 l -23,-31 -7,65 c -25,241 -212,454 -448,510 -37,9 -113,15 -185,15 h -121 l -12,53 c -49,204 -167,404 -341,582 -60,60 -107,110 -106,110 76,46 186,134 271,217 l 110,107 401,4 c 316,3 410,7 450,18 l 50,15 3,-765 c 2,-528 0,-782 -8,-817 z M 2715,1850 c 45,-17 77,-40 126,-89 87,-88 113,-150 114,-277 0,-84 -2,-95 -38,-166 -43,-88 -102,-146 -187,-187 -49,-23 -67,-26 -165,-26 -104,0 -113,2 -170,32 -77,40 -147,112 -182,188 -25,54 -28,71 -28,165 0,92 3,112 26,160 50,106 154,192 265,219 60,16 172,6 239,-19 z m -786,-406 c 14,-31 91,-134 116,-154 10,-8 29,-33 43,-55 51,-83 104,-144 161,-183 l 58,-41 6,-133 c 4,-106 10,-146 30,-200 54,-148 146,-255 273,-317 116,-57 155,-61 612,-61 h 412 l -15,-24 c -25,-37 -113,-93 -176,-111 -50,-14 -154,-15 -905,-13 l -849,3 -48,22 c -142,66 -227,200 -227,356 2,333 156,661 410,874 41,35 78,63 81,63 3,0 11,-12 18,-26 z m 1462,-121 c 85,-89 174,-216 216,-310 21,-49 73,-189 73,-200 0,-2 -189,-3 -420,-3 -485,0 -440,-12 -440,118 v 79 l 48,31 c 61,39 130,112 167,177 16,28 53,76 82,108 29,32 64,78 79,102 l 26,45 45,-32 c 24,-18 80,-70 124,-115 z M 2670,893 c 0,-75 14,-125 47,-163 57,-68 20,-64 738,-70 645,-5 650,-5 705,-27 112,-46 210,-145 251,-253 26,-69 37,-193 19,-215 -16,-19 -169,-22 -188,-3 -7,7 -12,30 -12,53 0,63 -18,113 -57,156 -71,79 -22,73 -748,79 -647,5 -650,5 -705,28 -162,66 -246,191 -257,380 l -6,92 h 107 106 z M 4059,274 c 15,-19 21,-41 21,-75 v -49 h -181 -181 l 30,38 c 17,21 38,54 48,75 l 18,37 h 112 c 110,0 113,-1 133,-26 z"
|
||||||
|
id="path1"
|
||||||
|
style="fill:#ffffff" />
|
||||||
|
<path
|
||||||
|
d="m 1783,2978 c -50,-24 -50,-90 -2,-134 50,-46 110,-68 184,-68 61,0 78,4 125,30 63,35 103,86 94,118 -7,27 -50,66 -73,66 -9,0 -33,-12 -52,-26 -71,-54 -120.0375,-55.047 -184,-4 -40.0375,31.953 -57,35 -92,18 z"
|
||||||
|
id="path2"
|
||||||
|
sodipodi:nodetypes="ccsccscsc"
|
||||||
|
style="fill:#ffffff" />
|
||||||
|
<path
|
||||||
|
d="m 2975,2965 c -38,-37 -33,-71 20,-121 44,-43 118,-74 175,-74 93,0 220,82 220,142 0,18 -10,39 -26,55 -31,31 -70,27 -116,-12 -55,-47 -100,-45 -163,5 -46,36 -78,38 -110,5 z"
|
||||||
|
id="path3"
|
||||||
|
style="fill:#ffffff" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 6.7 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 9.6 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 433 KiB |
|
After Width: | Height: | Size: 470 KiB |
|
After Width: | Height: | Size: 452 KiB |
|
After Width: | Height: | Size: 375 KiB |
|
After Width: | Height: | Size: 261 KiB |
@@ -2,6 +2,28 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Database Configuration
|
||||||
|
|
||||||
|
### Development Database (H2 Console)
|
||||||
|
- **Profile**: `dev`
|
||||||
|
- **Database Type**: H2 (File-based, embedded)
|
||||||
|
- **JDBC URL**: `jdbc:h2:file:./build/h2db/db/sisvietnamvn`
|
||||||
|
- **Username**: `sisvietnamvn`
|
||||||
|
- **Password**: *(leave blank)*
|
||||||
|
- **Console Access**: [http://localhost:8080/h2-console](http://localhost:8080/h2-console) (requires app running in dev profile)
|
||||||
|
- **Config File**: [application-dev.yml](file:///d:/website_sisvietnam_moi/website_sisvietnam.vn/sisvietnamvn/src/main/resources/config/application-dev.yml)
|
||||||
|
|
||||||
|
### Production Database
|
||||||
|
- **Profile**: `prod`
|
||||||
|
- **Database Type**: Oracle Database
|
||||||
|
- **JDBC URL**: `jdbc:oracle:thin:@localhost:1521:xe`
|
||||||
|
- **Username**: `sisvietnamvn`
|
||||||
|
- **Config File**: [application-prod.yml](file:///d:/website_sisvietnam_moi/website_sisvietnam.vn/sisvietnamvn/src/main/resources/config/application-prod.yml)
|
||||||
|
|
||||||
|
### Schema Management
|
||||||
|
- **Tool**: Liquibase
|
||||||
|
- **Changelog Folder**: [src/main/resources/config/liquibase/](file:///d:/website_sisvietnam_moi/website_sisvietnam.vn/sisvietnamvn/src/main/resources/config/liquibase/)
|
||||||
|
|
||||||
## Getting started
|
## Getting started
|
||||||
|
|
||||||
To make it easy for you to get started with GitLab, here's a list of recommended next steps.
|
To make it easy for you to get started with GitLab, here's a list of recommended next steps.
|
||||||
@@ -97,3 +119,11 @@ cd ..\sisvietnamvn\
|
|||||||
.\gradlew bootRun
|
.\gradlew bootRun
|
||||||
|
|
||||||
dùng JHipster
|
dùng JHipster
|
||||||
|
|
||||||
|
Lỗi "build failed" vừa rồi khả năng cao là do bộ kiểm tra định dạng code khắt khe spotless của dự án báo lỗi vì tôi đã thay đổi file Java (SecurityConfiguration.java và HomeController.java) mà chưa chuẩn hoá lại khoảng trắng/thụt lề theo đúng chuẩn của hệ thống.
|
||||||
|
|
||||||
|
Tôi đã chạy lệnh ./gradlew spotlessApply để tự động dọn dẹp và sửa lại toàn bộ lỗi định dạng này. Hiện tại lệnh ./gradlew classes và ứng dụng đã hoạt động bình thường, URL /lien-he trả về mã 200 thành công.
|
||||||
|
|
||||||
|
(Lưu ý: Có một lỗi riêng trong lệnh chạy test ./gradlew test liên quan đến cấu hình taskExecutor bị thiếu của dự án gốc đối với môi trường test, nhưng nó hoàn toàn không ảnh hưởng đến việc chạy ứng dụng thực tế bằng ./gradlew bootRun).
|
||||||
|
|
||||||
|
Bạn có thể refresh lại trang web để kiểm tra màu sắc trên menu header nhé, nó đã được sửa lại thành màu đen rồi!
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
/* @license GPL-2.0-or-later https://www.drupal.org/licensing/faq */
|
||||||
|
.c--card-grid [data-component-id="umass_base:description"].f--description a.field-stat-link{display:inline-flex;justify-content:center;align-items:center;position:relative;width:auto;min-width:10.625rem;height:3.125rem;padding:0 0.9375rem;font-family:'Open Sans',Arial,Helvetica,sans-serif;font-size:0.875rem;font-weight:800;line-height:1.2858;text-align:center;text-decoration:none;text-transform:uppercase;white-space:normal;appearance:none;border:0;border-radius:0;color:#fff;background-color:#881c1c;transition:background-color 0.1s ease-in-out;}.c--card-grid [data-component-id="umass_base:description"].f--description a.field-stat-link:hover{background-color:var(--color-brand-dark);color:var(--color-white);}
|
||||||
|
.is-chrome .fi--form-item input[type="date"]::after{top:1rem;}
|
||||||
|
.block-microsite-menu-block svg.ext,.block-microsite-menu-block svg.mailto,.block-microsite-menu-block svg.tel{fill:#ffffff;}.block-microsite-menu-block svg.ext path,.block-microsite-menu-block svg.mailto path,.block-microsite-menu-block svg.tel path{stroke:#ffffff;}
|
||||||
|
.page-node-type-story .publication-date,.story-listing .publication-date{display:none;}.story-listing .f--field.f--eyebrow{display:none;}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
/* @license GPL-2.0-or-later https://www.drupal.org/licensing/faq */
|
||||||
|
.progress{position:relative;}.progress__track{min-width:100px;max-width:100%;height:16px;margin-top:5px;border:1px solid;background-color:#fff;}.progress__bar{width:3%;min-width:3%;max-width:100%;height:1.5em;background-color:#000;}.progress__description,.progress__percentage{overflow:hidden;margin-top:0.2em;color:#555;font-size:0.875em;}.progress__description{float:left;}[dir="rtl"] .progress__description{float:right;}.progress__percentage{float:right;}[dir="rtl"] .progress__percentage{float:left;}.progress--small .progress__track{height:7px;}.progress--small .progress__bar{height:7px;background-size:20px 20px;}
|
||||||
|
.ajax-progress{display:inline-block;padding:1px 5px 2px 5px;}[dir="rtl"] .ajax-progress{float:right;}.ajax-progress-throbber .throbber{display:inline;padding:1px 5px 2px;background:transparent url(/themes/contrib/stable/images/core/throbber-active.gif) no-repeat 0 center;}.ajax-progress-throbber .message{display:inline;padding:1px 5px 2px;}tr .ajax-progress-throbber .throbber{margin:0 2px;}.ajax-progress-bar{width:16em;}.ajax-progress-fullscreen{position:fixed;z-index:1000;top:48.5%;left:49%;width:24px;height:24px;padding:4px;opacity:0.9;border-radius:7px;background-color:#232323;background-image:url(/themes/contrib/stable/images/core/loading-small.gif);background-repeat:no-repeat;background-position:center center;}[dir="rtl"] .ajax-progress-fullscreen{right:49%;left:auto;}
|
||||||
|
.text-align-left{text-align:left;}.text-align-right{text-align:right;}.text-align-center{text-align:center;}.text-align-justify{text-align:justify;}.align-left{float:left;}.align-right{float:right;}.align-center{display:block;margin-right:auto;margin-left:auto;}
|
||||||
|
.container-inline div,.container-inline label{display:inline;}.container-inline .details-wrapper{display:block;}
|
||||||
|
.clearfix:after{display:table;clear:both;content:"";}
|
||||||
|
.hidden{display:none;}.visually-hidden{position:absolute !important;overflow:hidden;clip:rect(1px,1px,1px,1px);width:1px;height:1px;word-wrap:normal;}.visually-hidden.focusable:active,.visually-hidden.focusable:focus{position:static !important;overflow:visible;clip:auto;width:auto;height:auto;}.invisible{visibility:hidden;}
|
||||||
|
.js .js-hide{display:none;}.js-show{display:none;}.js .js-show{display:block;}
|
||||||
|
.cc_banner-wrapper{z-index:9001;position:relative}.cc_container .cc_btn{cursor:pointer;text-align:center;font-size:0.6em;transition:font-size 200ms;line-height:1em}.cc_container .cc_message{font-size:0.6em;transition:font-size 200ms;margin:0;padding:0;line-height:1.5em}.cc_container .cc_logo{display:none;text-indent:-1000px;overflow:hidden;width:100px;height:22px;background-size:cover;background-image:url(//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/1.0.10/logo.png);opacity:0.9;transition:opacity 200ms}.cc_container .cc_logo:hover,.cc_container .cc_logo:active{opacity:1}@media screen and (min-width:500px){.cc_container .cc_btn{font-size:0.8em}.cc_container .cc_message{font-size:0.8em}}@media screen and (min-width:768px){.cc_container .cc_btn{font-size:1em}.cc_container .cc_message{font-size:1em;line-height:1em}}@media screen and (min-width:992px){.cc_container .cc_message{font-size:1em}}@media print{.cc_banner-wrapper,.cc_container{display:none}}.cc_container{position:fixed;left:0;right:0;bottom:0;overflow:hidden;padding:10px}.cc_container .cc_btn{padding:8px 10px;background-color:#f1d600;cursor:pointer;transition:font-size 200ms;text-align:center;font-size:0.6em;display:block;width:33%;margin-left:10px;float:right;max-width:120px}.cc_container .cc_message{transition:font-size 200ms;font-size:0.6em;display:block}@media screen and (min-width:500px){.cc_container .cc_btn{font-size:0.8em}.cc_container .cc_message{margin-top:0.5em;font-size:0.8em}}@media screen and (min-width:768px){.cc_container{padding:15px 30px 15px}.cc_container .cc_btn{font-size:1em;padding:8px 15px}.cc_container .cc_message{font-size:1em}}@media screen and (min-width:992px){.cc_container .cc_message{font-size:1em}}.cc_container{background:#222;color:#fff;font-size:17px;font-family:"Helvetica Neue Light","HelveticaNeue-Light","Helvetica Neue",Calibri,Helvetica,Arial;box-sizing:border-box}.cc_container ::-moz-selection{background:#ff5e99;color:#fff;text-shadow:none}.cc_container .cc_btn,.cc_container .cc_btn:visited{color:#000;background-color:#f1d600;transition:background 200ms ease-in-out,color 200ms ease-in-out,box-shadow 200ms ease-in-out;-webkit-transition:background 200ms ease-in-out,color 200ms ease-in-out,box-shadow 200ms ease-in-out;border-radius:5px;-webkit-border-radius:5px}.cc_container .cc_btn:hover,.cc_container .cc_btn:active{background-color:#fff;color:#000}.cc_container a,.cc_container a:visited{text-decoration:none;color:#31a8f0;transition:200ms color}.cc_container a:hover,.cc_container a:active{color:#b2f7ff}@-webkit-keyframes slideUp{0%{-webkit-transform:translateY(66px);transform:translateY(66px)}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideUp{0%{-webkit-transform:translateY(66px);-ms-transform:translateY(66px);transform:translateY(66px)}100%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.cc_container,.cc_message,.cc_btn{animation-duration:0.8s;-webkit-animation-duration:0.8s;-moz-animation-duration:0.8s;-o-animation-duration:0.8s;-webkit-animation-name:slideUp;animation-name:slideUp}
|
||||||
|
span.ext{width:10px;height:10px;padding-right:12px;text-decoration:none;background:url(/modules/contrib/extlink/images/extlink_s.png) 2px center no-repeat;}span.mailto{width:10px;height:10px;padding-right:12px;text-decoration:none;background:url(/modules/contrib/extlink/images/extlink_s.png) -20px center no-repeat;}span.tel{width:10px;height:10px;padding-right:12px;text-decoration:none;background:url(/modules/contrib/extlink/images/extlink_s.png) -42px center no-repeat;}svg.ext{width:14px;height:14px;fill:#727272;font-weight:900;}svg.mailto,svg.tel{width:14px;height:14px;fill:#727272;}[data-extlink-placement='prepend'],[data-extlink-placement='before']{padding-right:0.2rem;}[data-extlink-placement='append'],[data-extlink-placement='after']{padding-left:0.2rem;}svg.ext path,svg.mailto path,svg.tel path{stroke:#727272;stroke-width:3;}@media print{svg.ext,svg.mailto,svg.tel,span.ext,span.mailto,span.tel{display:none;padding:0;}}.extlink i{padding-left:0.2em;}.extlink-nobreak{white-space:nowrap;}
|
||||||
|
.paragraph--unpublished{background-color:#fff4f4;}
|
||||||