Đề cương báo cáo thực tập tốt nghiệp
Trang 1- LỜI CẢM ƠN:
…
Trang 2
Trang 3
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: 3
NỘI DUNG THỰC TẬP: 4
4 Nhiệm vụ chính được giao thực tập: 4
5 Lịch làm việc tại công ty thực tập 4
6 Nội dung công việc thực tập 4
7 Tuần 1 4
8 Tuần 2 5
9 Tuần 3 5
10 Tuần 4 8
11 Tuần 5 8
12 Tuần 6 9
13 Tuần 7 11
14 Tuần 8 12
II KẾT QUẢ ĐẠT ĐƯỢC QUA ĐỢT THỰC TẬP 13
1 Những kiến thức lý thuyết đã được củng cố: 13
2 Những kỹ năng thực hành đã được học thêm: 13
3 Những kinh nghiệm thực tiễn đã tích lũy được: 13
III PHỤ LỤC: 14
Trang 4II 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: Báo Tuổi Trẻ
1
Trang 52 Sơ đồ tổ chức:
Mô tả:
- Phòng CNTT:
+ Phân tích, thiết kế chức năng của các dự án tùy theo nhu cầu của khách
hàng
+ Lập trình phần mềm, website, thiết bị di động
+ Sửa lỗi phản hồi từ nhóm testing
+ Bảo trì, bảo hành phần mềm
+ Vận hành ứng dụng tại công ty của khách hàng
- Phòng kế toán:
+ Thực hiện những công việc về nghiệp vụ chuyên môn tài chính kế toán
theo đúng quy định của Nhà nước về chuẩn mực kế toán, nguyên tắc kế
toán
+ Theo dõi, phản ánh sự vận động vốn kinh doanh của Công ty dưới mọi
hình thái và cố vấn cho Ban lãnh đạo về các vấn đề liên quan
+ Phân tích, đánh giá tài chính của các dự án, công trình trước khi trình
lãnh đạo Công ty quyết định
+ Thu thập và xử lý thông tin có liên quan đến nghiệp vụ kinh tế và tài
chính phát sinh trong công ty
+ Giữ bí mật về số liệu kế toán – tài chính và bí mật của công ty
+ Thực hiện một số chức năng khác khi được Giám đốc giao
- Phòng kinh doanh:
+ Tham mưu, cố vấn cho Giám đốc về các chính sách, định hướng kinh
doanh, phổ biến chủ trương, chính sách, hướng dẫn các thủ tục, quy định
của Nhà nước đối với hoạt động sản xuất và kinh doanh
+ Giao dịch trực tiếp để giúp Giám đốc thiết lập và mở rộng quan hệ khách
hàng trong và ngoài nước nhằm xây dựng, củng cố và phát triển ngày càng
vững tiềm năng hoạt động của công ty dưới sự chỉ đạo của Giám đốc
+ Lưu trữ hồ sơ, tài liệu có liên quan đến các thao tác, nghiệp vụ kinh
doanh của Phòng đã thực hiện
Trang 6+ Tìm kiếm đối tác kinh doanh theo chỉ đạo của Giám đốc, khảo sát thị
trường, tham gia các hội thảo, hội chợ, triển lãm trong và ngoài nước
+ Thực hiện các công việc khuếch trương và quảng bá thương hiệu của
công ty như quảng cáo trên báo chí, truyền thông, phát hành brochure, lịch,
thiệp mừng, quà tặng, giao tế, …
- Website ZOKIK.com:
+ Nhóm marketing: Nghiên cứu tiếp thị và thông tin; lập hồ sơ thị trường
và dự báo doanh thu, khảo sát hành vi của khách hàng tiềm năng; phân
khúc thị trường, xác định mục tiêu, định vị thương hiệu
+ Nhóm dịch vụ khách hàng: Triển khai, tổ chức việc tìm kiếm khách hàng
+ Nhóm giao nhận: Giao nhận hàng hóa
3 Phòng ban SV tham gia thực tập:
Phòng CNTT – Nhóm Lập trình
3
Trang 7NỘI DUNG THỰC TẬP:
4 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
5 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ó)
6 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
7 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 (emulator), 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 88 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 và
thử các lệnh Linux đã học, ví dụ các lệnh trong vim, tìm file, cd, ls, Em
cũng được làm quen với SVN để quản lý các revision (phiên bản code) của
mình Khi mạng yếu thì em chuyển sang làm trên localhost
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
9 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:
5
Trang 9Ngườ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 103) 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”:
- Yêu cầu: Khi đăng ký mở tài khoản trực tuyến tại
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 Khách hàng có thể download
phiếu đăng ký hoặc hợp đồng mẫu trên website và điền vào Nhân viên của
BMSC sẽ kiểm tra thông tin trong bảng open_account này và hẹn khách hàng
đến để làm hợp đồng, đồng thời check vào status “đang xử lý” hoặc “hoàn tấ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 và xóa tài khoản VD sử 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
7
Trang 1110 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ế
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
11 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 12là 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
12 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
CONTENT_ID khác null thì CONTENT_ID sẽ là ID của page (web tĩnh), lúc
này đây là quyền trên một trang web tĩnh cụ thể Module “account” và “page”
sẽ luôn có INSERT_PRIV là null
Ta sẽ lập trình để chắc chắn một điều rằng khi 4 field SELECT_PRIV,
INSERT_PRIV, UPDATE_PRIV, DELETE_PRIV khác 1 thì dòng này sẽ
được remove khỏi bảng privilege, nghĩa là bảng privilege chỉ lưu những quyền
9
Trang 13có í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
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