Những vấn đề pháp lý cần chuẩn bị khi vận hành website bán lẻ?
🌐 Những vấn đề pháp lý cần chuẩn bị khi vận hành website bán lẻ?<p>
Chào mọi người, em đang dựng một website bán lẻ (mô hình tương tự các cửa hàng tiện lợi online) cho gia đình. Phần kỹ thuật thì em dùng Spring Boot + Angular, triển khai cơ bản xong rồi, nhưng bước “vận hành thực tế” thì có thắc mắc liên quan khá nhiều vấn đề pháp lý.
</p>
<p>
Em muốn hỏi anh chị nào từng làm sản phẩm ecommerce hoặc có kinh nghiệm thực tế thì khi vận hành website bán lẻ, mình cần chuẩn bị những gì về mặt pháp lý ạ?
</p>
<p>
Em có nghĩ tới các điểm sau và có tham khảo trên mạng nhưng thấy chưa rõ ý lắm:
</p>
<p>
🔹 Điều khoản sử dụng (Terms of Service)
</p>
<p>
🔹 Chính sách bảo mật và cookie (Privacy Policy / Cookie Policy)
</p>
<p>
🔹 Chính sách đổi trả – bảo hành – giao hàng
</p>
<p>
🔹 Minh bạch giá, phí phát sinh, thuế
</p>
<p>
🔹 Xử lý dữ liệu cá nhân (đặc biệt là GDPR nếu có thị trường EU)
</p>
<p>
🔹 Đăng ký website với cơ quan quản lý
</p>
<p>
🔹 Điều kiện vận chuyển – lưu kho – thực phẩm đóng gói
</p>
<p>
Nhưng thực tế đi vào vận hành thì còn những giấy tờ / thủ tục / quy định nào bắt buộc phải tuân thủ nữa không ạ?
</p>
<p>
Ví dụ: giấy phép kinh doanh online, đăng ký thương mại điện tử, các yêu cầu bắt buộc phải hiển thị trên trang chủ, quy định về lưu trữ hóa đơn, chính sách hoàn tiền theo luật, v.v.
</p>
<p>
Anh chị nào đã từng triển khai sản phẩm bán lẻ (hoặc đã launch website thương mại điện tử thật) có thể chia sẻ giúp em checklist pháp lý cần có để không bị “gõ đầu” khi vận hành chính thức được không ạ? 🙏
</p>
<p>
Em cảm ơn mọi người!
</p>
So sánh giữa Odoo và Ezyplatform
So sánh giữa Odoo và Ezyplatform
Lỗi: Tiêu đề trang admin hiển thị "Không biết"
Tôi đang lập trình ezyplatform plugin, trang của tôi hiển thị tiêu đề "Không biết" hoặc "Unknown" là tại vì sao?
<img src="/api/v1/media/a38748e82b77e11837bf8bdfee8b5c50138aa7ad1ae052df89e50393fd659379.png" alt="Screenshot 2025-11-04 at 14.45.53.png">
Cho em hỏi là tại sao em không đăng ký được tài khoản admin ạ, cli.bat "console web" thì nó vẫn lên nhma phía admin thì lại bị như hình ạ
Cho em hỏi là tại sao em không đăng ký được tài khoản admin ạ, cli.bat "console web" thì nó vẫn lên nhma phía admin thì lại không load được css như hình ạ:
<img src="/api/v1/media/5b9b2a19182e560d6afb8f7e4c40e3583a98ac89c04020940543db33bbe1cc20.jpg" alt="z7181348986966_fe32d50879859be46a9f32749a2e093b.jpg">
<img src="/api/v1/media/4d38a97d426bfefbf2e1d78307af36156b65a6335fbb3c46ee8f37931d57ca69.jpg" alt="z7181348986968_c37d0231e2d4c76430cd61ced7320e6b.jpg">
Lỗi: No content to map due to end-of-input
Lỗi <div class="markdown-block position-relative overflow-auto source-java">
<pre>
com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
</pre>
</div>Xảy ra khi nào?
Lỗi: Path expected for join!
Vì sao lỗi <code class="markdown-inline">Path expected for join!</code> xảy ra với đoạn query dưới đây:<div class="markdown-block position-relative overflow-auto source-java">
<pre>
"SELECT e FROM UserGroupMember e <span class="pl-s">"</span> +
"INNER JOIN UserGroup a ON e.userGroupId = a.id <span class="pl-s">"</span> +
"INNER JOIN EzyCRMEventUserGroup b ON a.id = b.userGroupId <span class="pl-s">"</span> +
"INNERJOIN EzyCRMEvent c ON b.eventId = c.id <span class="pl-s">"</span> +
"INNER JOIN DataMapping d ON c.id = d.toDataId <span class="pl-s">"</span> +
"INNER JOIN EzyCRMUserGroup f ON d.fromDataId = f.id <span class="pl-s">"</span> +
"INNER JOIN EzyCRMEventUserGroup g ON f.id = g.userGroupId <span class="pl-s">"</span> +
"WHERE e.userId IN ?1 <span class="pl-s">"</span> +
"AND a.groupType = <span class="pl-s">'MATCH'</span> <span class="pl-s">"</span> +
"AND a.status = ?2 <span class="pl-s">"</span> +
"AND c.eventType = <span class="pl-s">'ROUND'</span> <span class="pl-s">"</span> +
"AND d.mappingName = <span class="pl-s">'player_group_round'</span> <span class="pl-s">"</span> +
"AND f.groupType = <span class="pl-s">'AGE_GROUP'</span> <span class="pl-s">"</span> +
"AND g.eventId = ?0 <span class="pl-s">"</span> +
"ORDER BY e.id DESC"
</pre>
</div><p>
Lỗi:
</p>
<div class="markdown-block position-relative overflow-auto source-java">
<pre>
Path expected <span class="pl-k">for</span> join! [SELECT e FROM org.youngmonkeys.ezycrm.entity.UserGroupMember e INNER JOIN org.youngmonkeys.ezycrm.entity.UserGroup a ON e.userGroupId = a.id INNER JOIN org.youngmonkeys.ezycrm.entity.EzyCRMEventUserGroup b ON a.id = b.userGroupId INNER JOIN org.youngmonkeys.ezycrm.entity.EzyCRMEvent c ON b.eventId = c.id INNER JOIN org.youngmonkeys.ezyplatform.entity.DataMapping d ON c.id = d.toDataId INNER JOIN EzyCRMUserGroup f ON d.fromDataId = f.id INNER JOIN org.youngmonkeys.ezycrm.entity.EzyCRMEventUserGroup g ON f.id = g.userGroupId WHERE e.userId IN ?1 AND a.groupType = <span class="pl-s">'MATCH'</span> AND a.status = ?2 AND c.eventType = <span class="pl-s">'ROUND'</span> AND d.mappingName = <span class="pl-s">'player_group_round'</span> AND f.groupType = <span class="pl-s">'AGE_GROUP'</span> AND g.eventId = ?0 ORDER BY e.id DESC]
</pre>
</div>
Ví dụ về lắng nghe sự kiện upload file của EzyPlatform
Ví dụ về lắng nghe sự kiện upload file của EzyPlatform
Cấu trúc dự án
Cho em hỏi trong 1 dự án Spring boot. Thì sẽ Controller -> Service -> Repo<p>
Vậy trong Service luôn gọi qua Service khác. hay gọi qua repo khác thì ổn hơn ạ.
</p>
<p>
Ví dụ: Service A có repo A, service B, repo C, D.. vì chỉ gọi những câu jpa đơn giản.
</p>
<p>
Best practice thì sẽ như nào ạ
</p>
Api có gửi file dùng spring boot
Cần truyền xuống thông tin là 1 list Customer gồm: name, type, và 1 danh sách Document gồm documentType và file <p>
public class CustomerInfo {
</p>
<p>
private String customerName;
</p>
<p>
private String customerType;
</p>
<p>
private List<CustomerFileDTO> files;
</p>
<p>
}
</p>
<p>
public class CustomerFileDTO {
</p>
<p>
private String documentType;
</p>
<p>
private MultipartFile file;
</p>
<p>
}
</p>
<p>
Cách nào là tối ưu nhất để xử lý đưa list customer này xuống và lấy được file vậy ạ. Cho e xin cách truyền request xuống dễ xử lý với ạ. list customer này max size =5 vì nó đẩy xuống để lưu thông tin của 1 phiếu xử lý
</p>
Ví dụ về combobox sử dụng jquery-ui
Ví dụ về combobox sử dụng jquery-ui
Gửi Nhận Cookie Từ Backend Và Frontend Khác Domain
Xin chào mọi người, hiện tại em làm một project cá nhân chạy trên localhost với spring và html thuần. Ở phía backend(port:8080) và frontend(port:8085) và cả 2 em đều đã cấu hình chạy trên https (<a href="https://localhost). " target="_blank">https://localhost). </a> Em có case như sau, khi thực hiện login từ backend em có set cookie như thế này:<div class="markdown-block position-relative overflow-auto source-java">
<pre>
private <span class="pl-k">void</span> setTokenCookie(String tokenType, String token, <span class="pl-k">long</span> ttl, HttpServletResponse servletResponse) {
<span class="pl-k">if</span> (servletResponse == null) {
<span class="pl-k">throw</span> <span class="pl-k">new</span> AppException(ErrorCode.INTERNAL_SERVER_ERROR, "HttpServletResponse is null");
}
ResponseCookie tokenCookie = ResponseCookie.from(tokenType, token)
.httpOnly(true)
.secure(true)
.path(<span class="pl-s">"/"</span>)
.maxAge(Duration.ofSeconds(ttl))
.sameSite(<span class="pl-s">"None"</span>)
.build();
servletResponse.addHeader(<span class="pl-s">"Set-Cookie"</span>, tokenCookie.toString());
}
</pre>
</div>- Tiếp theo khi thực hiện logout:<div class="markdown-block position-relative overflow-auto source-html">
<pre>
const response = await fetch(logoutApiUrl, {
method: <span class="pl-s">"POST"</span>,
credentials: <span class="pl-s">"include"</span>,
headers: {
<span class="pl-s">"Content-Type"</span>: <span class="pl-s">"application/json"</span>,
Authorization: `Bearer ${localStorage.getItem("accessToken")}`,
},
});
</pre>
</div><div class="markdown-block position-relative overflow-auto source-java">
<pre>
private String extractTokenFromCookie(HttpServletRequest request, String cookieName) {
<span class="pl-k">if</span> (request.getCookies() == null) {
<span class="pl-k">throw</span> ExceptionUtils.appException(ErrorCode.UNAUTHORIZED, "Cannot find cookies in request header or cookie <span class="pl-s">"</span> + (cookieName.equals(TokenType.ACCESS_TOKEN) ? "access token" : "refresh token"));
}
<span class="pl-k">for</span> (Cookie cookie : request.getCookies()) {
System.out.println(cookie.getName());
<span class="pl-k">if</span> (cookieName.equals(cookie.getName())) {
<span class="pl-k">return</span> cookie.getValue();
}
}
<span class="pl-k">throw</span> ExceptionUtils.appException(ErrorCode.UNAUTHORIZED, "Cannot find cookie with name: %s", cookieName);
}
</pre>
</div>- API logout ở backend có gọi đến extractTokenFromCookie để lấy refresh token, em debug thì request.getCookies() luôn là null. Nghĩa là frontend của em chưa nhận được cookie đúng không ạ? Em có tham khảo các bài viết cũng như AI nhưng vẫn chưa tìm được câu trả lời.<p>
Mọi người giúp em case này với a? Em cảm ơn ạ!
</p>