Widget là View, cung cấp những phần tử như button, text field, checkbox, … Layout là ViewGroup, nó bố trí các view theo một trật tự, ví dụ như LinearLayout, TableLayout, … - Mỗi ứng dụng
Trang 1Đề cương báo cáo thực tập tốt nghiệp
- LỜI CẢM ƠN:
Text here
Trang 2- ĐÁNH GIÁ KẾT QUẢ THỰC TẬP CỦA KHOA
Trang 3
- MỤC LỤC
I GIỚI THIỆU CÔNG TY THỰC TẬP 1
1 Giới thiệu công ty: 1
2 Sơ đồ tổ chức: 2
3 Phòng ban SV tham gia thực tập: 2
II NỘI DUNG THỰC TẬP: 3
1 Nhiệm vụ chính được giao thực tập: 3
2 Lịch làm việc tại công ty thực tập 3
3 Nội dung công việc thực tập 3
4 Tuần 1 3
5 Tuần 2 4
6 Tuần 3 4
7 Tuần 4 7
8 Tuần 5 7
9 Tuần 6 8
10 Tuần 7 10
11 Tuần 8 10
III KẾT QUẢ ĐẠT ĐƯỢC QUA ĐỢT THỰC TẬP 11
1 Những kiến thức lý thuyết đã được củng cố: 11
2 Những kỹ năng thực hành đã được học thêm: 11
3 Những kinh nghiệm thực tiễn đã tích lũy được: 11
IV PHỤ LỤC: 12
Trang 4I GIỚI THIỆU CÔNG TY THỰC TẬP
1 Giới thiệu công ty:
VONLINE được thành lập từ năm 2009, hoạt động trong lĩnh vực thương mại điện tử và thanh toán trực tuyến, chuyên cung cấp các dịch vụ tin học hỗ trợ các lĩnh vực tài chính: sàn giao dịch chứng khoán, sàn giao dịch vàng, sàn giao dịch hàng hóa… và các dịch vụ thương mại điện tử
Các sản phẩm chính của VONLINE:
Website ZoKIK.com: là website thương mại điện tử, bán hàng qua mạng,
thanh toán trực tuyến và giao hàng tận nơi trên toàn quốc
Website do chính đội ngũ nhân viên của VONLINE phát triển và vận hành hoạt động
Phần mềm vOnlineTrading: phần mềm đặt lệnh chứng khoán trực tuyến
cung cấp khả năng kết nối với phần mềm lõi chứng khoán (core securities)
và cung cấp dịch vụ đặt lệnh chứng khoán trực tuyến qua mạng cho nhà đầu tư
Khách hàng:
o Công ty Cổ phần Chứng khoán Bảo Minh (BMSC)
Phần mềm vOnlineBoard: phần mềm bảng giá chứng khoán, hàng hóa trực
tuyến, cập nhật giá theo thời gian thật (realtime)
Khách hàng:
o Ngân hàng TMCP Sài Gòn Thương Tín (Sacombank)
o Sàn giao dịch hàng hóa Sài Gòn Thương Tín (Sacom-STE)
o Công ty Cổ phần Chứng khoán Bảo Minh (BMSC)
Phần mềm vPublishing: phần mềm quản lý nghiệp vụ phát hành báo chí
Khách hàng:
o Báo Tuổi Trẻ
Trang 52 Sơ đồ tổ chức:
-Giám đốc
- Phòng CNTT
- Lập trình
- Thiết kế (graphics design)
- Testing
- Networking
- Phòng Kinh doanh
- Phòng Kế toán
- Website ZoKIK.com
- Marketing
- Dịch vụ khách hàng
- Giao nhận
3 Phòng ban SV tham gia thực tập: Phòng CNTT – Nhóm Lập trình
Trang 6II NỘI DUNG THỰC TẬP:
1 Nhiệm vụ chính được giao thực tập:
- Lập trình công cụ admin website VONLINE.vn
- Lập trình công cụ admin website BMSC
- Tìm hiểu về lập trình ứng dụng trên nền tảng Android
2 Lịch làm việc tại công ty thực tập
Tất cả các ngày trong tuần (ngoại trừ khi đến lớp – nếu có)
3 Nội dung công việc thực tập
Lập trình công cụ admin website VONLINE.vn Đây là phần admin quản lý tin tức của website công ty, giới thiệu các sản phẩm của công ty
4 Tuần 1
Đọc hiểu source code của website STE-Steel (một website thương mại, bán thép, điều, cao su), để từ đó chỉnh sửa thành website admin VONLINE Cụ thể hơn là nhận CSDL STE và tái tạo lại STE để hiểu về website này Website này được viết bằng PHP5, Zend Framework, Smarty, Query, JQuery UI, AJAX và CSDL là MySQL
Link: http://admin.vonline.vn/
Tuần này chủ yếu là đọc source code và làm quen môi trường lập trình, cũng như nghiên cứu về Android
*** Tóm tắt về android sau khi đọc hiểu:
- Sơ lược: Android là một hệ điều hành được viết dựa trên Linux Hệ điều hành
này chạy trên điện thoại di động Phiên bản Android mới nhất hiện tại là 3.5 Honeycomb Android có công cụ hỗ trợ lập trình là Android SDK, công cụ này
có bộ mô phỏng điện thoại là thiết bị ảo, cấu hình của thiết bị là cấu hình thật được sử dụng trên điện thoại
- Cấu trúc: Ứng dụng Android được tổ chức thành các Activity Activity là một
màn hình (screen) cung cấp giao diện và tương tác cho người dùng Mỗi
Activity gồm có nhiều bộ phận gọi chung là: Widget và Layout Widget là View, cung cấp những phần tử như button, text field, checkbox, … Layout là ViewGroup, nó bố trí các view theo một trật tự, ví dụ như LinearLayout, TableLayout, …
- Mỗi ứng dụng chỉ có một Main Activity, được chạy đầu tiên trong ứng dụng,
mỗi Activity có thể start Activity khác, mỗi lần chỉ có một active Activity, khi một Activity active thì Activity trước đó được push vào stack theo cơ chế “Last
in, first out” Khi một Activity hoàn tất, được pop khỏi stack và bị destroy, thì Activity trước đó sẽ resume Các Activity hoạt động giao tiếp với nhau dựa vào Intent, Intent giống nhưng thông điệp, được gửi cho event handler để thực thi…
Trang 75 Tuần 2
Bắt đầu chỉnh sửa và code VONLINE, làm phần liệt kê, thêm, xóa, sửa tin tức của công ty, gặp chút khó khăn là không biết nhiều về Javascript, mà code toàn javascript và khá nhiều thư viện third-party Ví dụ như: Jquery UI, KCFinder (là tiện ích quản lý file được viết bằng JQuery), CKEditor (là một WYSIWYG Editor được viết bằng Javascript và JQuery), …
Mặt khác, em cũng đang làm quen với việc upload code lên hosting thật, log bằng SSH vào Linux và xem log file, thao tác trên tài khoản MySQL thật, đã từng học lệnh nào là thử luôn, ví dụ các lệnh trong vim, tìm file, cd, ls, Em cũng được làm quen với SVN, mặc dù chưa quen nhưng cũng ổn Dạo này mạng chập chờn nên cũng khó khăn, nhiều khi phải làm trên local
Làm quen với Smarty, tích hợp Smarty vào Zend Framework Smarty là một template engine giúp tách biệt giao diện với code xử lý, giúp phân chia công việc giữa developer và designer thật rõ ràng Developer chỉ cần quan tâm đến chức năng của website và cung cấp biến trên Smarty template Còn designer không cần biết về ngôn ngữ lập trình như PHP, mà chỉ cần biết thiết kế giao diện dựa trên những biến được cung cấp trong Smarty template Smarty giống như một ngôn ngữ trung gian đơn giản dùng để kết nối giữa developer và designer
6 Tuần 3
Sau khi được hướng dẫn, em làm tiếp những phần còn thiếu của Bảo Minh admin panel Link: http://admin.bmsc.com.vn/
*** Quản lý banner: Người hướng dẫn muốn tạo phần quản lý banner để lưu banner của những công ty đối tác với Bảo Minh, để khi click vào banner trên trang chủ thì sẽ dẫn tới trang của đối tác Cấu trúc bảng banner như sau:
Trang 8Người hướng dẫn muốn dùng AJAX để làm mọi thao tác trên bảng này: liệt kê, thêm, xóa, sửa Anh ấy có đưa source code để tham khảo và làm theo
1) Liệt kê banner :
- Yêu cầu: Khi chọn loại banner thì list những banner tương ứng Hiện tại có 2
loại banner: “Trang chủ” và “Đối tác” Khi chọn “Trang chủ” thì list những banner nằm trên trang chủ, khi chọn đối tác thì list banner của đối tác
- Cách làm: Khi chọn trên select control thì lấy BANNER_TYPE_ID tương ứng Sau đó gọi hàm $.post của JQuery đến action controller ‘/banner/list’ Action controller này sẽ truy vấn dựa trên banner type nhận được và trả về danh sách banner, danh sách này được encode thành đối tượng JSON và trả về cho client (JQuery script) Script lấy thông tin này hiển thị lên table
2) Thêm banner :
- Yêu cầu: Khi chọn nút “Thêm mới” thì hiện dialog Ngoài những input text bình thường thì dialog phải có component uploadify Link:
http://www.uploadify.com/
Uploadify hỗ trợ upload file lên server một cách nhanh và mượt hơn Người hướng dẫn yêu cầu phải dùng 3.0 Beta, mà 3.0 lại chưa có documentation nên
em phải down 2.x về để đối chiếu Thư viện thay đổi thông số nhiều nên phải đọc và sửa source của họ
- Cách làm: Uploadify hỗ trợ chỉ cần chọn file là file tự động được upload,
nhưng nếu ta chọn file upload rồi, sau đó lại nhấn cancel thì sao? Nghĩa là file
đó đã được upload và tồn tại trên server, mà ta lại không chính thức tạo banner
đó, suy ra banner phải được xóa khi nhấn cancel, uploadify không hỗ trợ điều này Có một cách làm đơn giản là tạo thư mục temp trên server, khi cancel thì file vẫn ở temp, thư mục temp có lẽ sẽ được xóa rác sau một khoảng thời gian nào đó Khi upload thành công thì copy file trong temp qua thư mục chứa banner thật sự
Khi chọn “Tạo banner” từ dialog “Thêm mới”, JQuery serialize thông tin của form thành chuỗi URI với cú pháp ‘param1=value1¶m2=value2’, sau đó truyền cho action controller ‘/banner/add’ Action controller này tạo banner bằng SQL rồi trả về mã báo thành công cho client Client gọi loadBanner để refresh lại table
Trang 93) Sửa, xóa banner :
- Yêu cầu: Sửa và xóa phải update cách field UPDATE_BY, UPDATE_DATE.
Khi xóa thì set IS_DELETE = 1
- Cách làm: Khi người dùng login vào website, thông tin của họ được lưu vào
session Khi update hoặc delete, thông tin email của họ sẽ được điền vào UPDATE_BY để xác định ai đã sửa, xóa thông tin
Phần này còn dùng một số plugin nữa, không thể kể hết được
Tất cả các truy vấn trên CSDL đều phải dùng stored procedured Có một số chỗ em phải làm lại do người hướng dẫn không đồng ý Phải viết theo code style có sẵn nên cũng thấy hơi gò bó
*** Quản lý “Tài khoản trực tuyến”:
Khi đăng ký mở tài khoản trực tuyến http://bmsc.com.vn/account/open, thông tin của khách hàng sẽ được lưu vào bảng open_account để xem xét và giải quyết
Status là trạng thái của tài khoản, có 2 loại là: “đang xử lý” và “hoàn tất” Người hướng dẫn yêu cầu liệt kê danh sách tài khoản trực tuyến và tạo chức năng sửa trạng thái VD từ “đang xử lý” thành “hoàn tất” Các field
INFORMATION_FILE, CONTRACT_FILE, AUTHORIZE_FILE phải link tới tài liệu hợp đồng nào đó, thư mục tài liệu này nằm trên server
Cách làm: Giống như banner
Trang 107 Tuần 4
Giống như tuần 3 nhưng xin công ty nghỉ 3 ngày để dọn nhà sang chỗ mới Cộng thêm việc sửa lại tab “Tin tức”, thêm checkbox “Tin mới” để thể hiện tin mới của công ty Bảng tin tức như sau:
Ở phần này chỉ có một chỗ khó là tìm hiểu checkbox được submit như thế nào Sau khi xem link này
http://www.w3.org/TR/html401/interact/forms.html#radio thì em biết là chỉ những “on” checkbox mới được submit
Có một lần em tạo tin rác để test mà quên xóa thì khách hàng gọi điện than phiền với người hướng dẫn, kết quả là em bị mắng và chạy về nhà và sửa lại
8 Tuần 5
Làm module quản lý nhân viên Website chỉ có 2 loại là admin và nhân viên Admin là người được liệt kệ, thêm, xóa, sửa tất cả nhân viên Nhân viên chỉ được sửa chính mình Yêu cầu của module này cũng giống module banner là liệt kê, thêm, xóa, sửa
Module này giống module news, banner Có một profile panel chứa tên đang đăng nhập ở góc phải phía trên Có một điểm đặc biệt là phần authorization (kiểm tra quyền) Ở tab này, em quy tất cả thao tác về để xử lý trên JQuery và AJAX, khi kiểm tra có phải là admin không thì cũng gửi truy vấn từ client script đến server rồi nhận về biến isAdmin để vẽ profile panel và chức năng cho đúng Nhưng cú gọi AJAX bình thường để truy vấn là bất đồng bộ, nghĩa
Trang 11là khi liệt kê nhân viên và vẽ profile panel nó sẽ không đợi isAdmin được trả
về, và nó sẽ vẽ sai Do đó, em chuyển thành gọi đồng bộ đối đối với truy vấn lấy isAdmin Nghĩa là trong khi truy vấn này đang diễn ra thì không có truy vấn nào khác được thực hiện Sau khi có isAdmin thì các lời gọi bất đồng bộ mới được tiến hành hàng loạt
*** Nghiên cứu thêm về Android:
Trong Android, để test code có chạy đúng không thì có một cách là xoay màn hình 90 độ Việc này sẽ khiến cho hệ thống gọi lần lượt các event pause, stop, destroy và create Activity mới, Activity sẽ được chạy lại từ đầu Trên emulator thì nhấn Ctrl + F11
Android cung cấp các dịch vụ (services) như Google Translate API, GPS API Android cũng cung cấp khả năng chơi video, video phải được đặt trong SD card Âm thanh được đặt trong thư mục raw của resources
9 Tuần 6
- Yêu cầu: BMSC yêu cầu phân quyền trên mỗi module với các quyền: xem, thêm, xóa, sửa Module “Tài khoản trực tuyến” (account) và module “Web tĩnh” (page) không có chức năng “Thêm” nên field INSERT_PRIV sẽ luôn là null Đối với module “page” thì cần phân quyền đối với từng trang web tĩnh
Ví dụ: Người môi giới chỉ được cập nhật trên các trang về môi giới, người của phòng phân tích chỉ được cập nhật những nội dung liên quan đến phân tích Người hướng dẫn yêu cầu phải có một giải pháp tổng quát và đơn giản cho tất
cả trường hợp Sau nhiều thiết kế không được đồng ý, em đã tạo ra bảng
privilege này và được sự đồng ý của người hướng dẫn
- Giải thích thiết kế: Quyền của module “news”, “banner”, “account” và
“page” đều được quản lý theo cách này Khi CONTENT_ID bằng null nghĩa là quyền này ở trên module “news”, “banner” hoặc “account” Khi
Trang 12có ít nhất 1 trong 4 cái trên bằng 1 Nói cách khác, quyền nào không được dùng thì là null, không có quyền là 0 và có quyền là 1
Thiết kế này có khá nhiều lỏng lẻo về tính nhất quán Ví dụ vì một lỗi nào đó
mà xuất hiện 2 dòng quyền đối với một module “news” thì truy vấn có thể sẽ sai, tất nhiên website sẽ đảm bảo không xảy ra điều đó bằng một cách nào đó (check trên code, dùng transaction hoặc trigger), nhưng khi đã dùng transaction
và trigger thì performance cũng giảm đáng kể Đây cũng là một tradeoff đáng suy nghĩ, ta đã đánh đổi sự an toàn để lấy sự tiện lợi, ngắn gọn, đơn giản và tổng quát: tất cả quyền của tất cả module đều chỉ được lưu trong một bảng Cũng giống như thiết kế EAV (Entity Attribute Value) của một số CMS, họ đánh đổi performance để lấy tính mở rộng (extensibility) Truy vấn của thiết kế này vô cùng phức tạp nhưng khả năng mở rộng thuộc tính (attribute) là gần như không giới hạn
- Cách làm: Liệt kê quyền cũng giống như những module trước, tạo quyền và sửa quyền thì khác Có 4 checkbox tương ứng với 4 quyền CRUD (Create-Read-Update-Delete), sau khi nhân viên check vào các quyền mong muốn thì nhấn “Cập nhật” Các checkbox có trạng thái “on” sẽ được submit, tham khảo link sau để hiểu thêm về checkbox:
http://www.w3.org/TR/html401/interact/forms.html#checkbox
Sau đó insert dòng tương ứng vào bảng privilege Update và delete cũng tương
tự Tiếp đến, phần phân quyền cho web tĩnh hơi khó hơn Đầu tiên khi click vào “Sửa quyền” trên mỗi nhân viên thì liệt kê ra danh sách trang web tĩnh, với mỗi dòng sẽ có 4 checkbox tương ứng với 4 quyền CRUD Sau khi đã check những quyền mong muốn thì click “Cập nhật” Hệ thống sẽ truyền đi 2 mảng checkbox, một mảng chứa những quyền cũ, một mảng chứa những quyền mới
Giả sử A là mảng chứa các quyền cũ, B là mảng chứa các quyền mới (sau khi
đã thay đổi) Thuật giải để insert, update, delete quyền như sau:
+ Chọn các phần tử có trong A mà không có trong B, đưa vào mảng C
+ Chọn các phần tử có trong B mà không có trong A, đưa vào mảng D
=> Mảng C là những quyền cần delete Mảng D là những quyền cần insert hoặc update Nếu quyền đó chưa tồn tại trong bảng thì insert, ngược lại thì update
Sau khi đã lấy được mảng C và D thì tiến hành lặp qua 2 mảng này và thao tác trên dữ liệu Kết quả trả về của hành vi cập nhật quyền là “affected rows” của tất cả thao tác insert, update, delete kể trên Ví dụ: Sau khi chọn quyền và bỏ quyền rồi click “Cập nhật” thì số dòng được insert là 2, số dòng được update là
2, số dòng bị delete là 1 Tổng của 3 thao tác này là 5 affected rows sẽ được trả
về Mục đích của con số này thì chưa được dùng đến