Техническая архитектура
Язык разработки: Java
Базы данных: MySQL, SQL Server, Oracle
Слой поддержки баз данных: Alibaba Druid
Основные фреймворки: Spring, Spring MVC, Hibernate
Кэширование: Memcache
Полнотекстовый поиск: Lucene, Hibernate Search
Шаблоны и представления: Velocity, HTML, CSS, jQuery
Управление доступом: Spring Security
Технические особенности
Разработан на языке Java, использует концепции объектно-ориентированного программирования (OOP), обеспечивает высокую безопасность, отличную производительность и удобство расширения;
Низкая внутренняя耦合度,模块化开发,便于多服务器拆分部署,提高系统性能;
多层次的安全控制机制,采用MVC开发模式,使用Spring Security管理权限,七层过滤器彻底解决安全问题;
应用Memcache缓存框架,数据缓存和资源缓存并存机制,提高系统数据加载效率,支持分布式缓存管理;
Lucene全文本检索原生API深度开发,完美支持电商平台,支持自定义词库管理,使得商城检索功能更加完善;
内置自定义Velocity缓存标签,补充完善开源缓存框架不足,解决各类资源缓存,提升系统性能
电商平台配属体系强大,完备的产品体系包含手机商城、微信商城、桌面助手等多种相关电商系统;
系统支持的支付方式:平台统一支付(收款到平台账户,卖家申请提现后财务打款给卖家)和店铺支付(直接收款到卖家自己的账户)
系统支持的在线支付方式:
PC端(见PayTools. java, shop/goods_cart3. html):微信扫码支付、支付宝支付、财付通支付、网银在线支付、贝宝支付、快钱支付
WAP端(见CartViewAction. java, wap/goods_cart3. html):微信公众号支付(只有在微信内打开显示)、支付宝手机网页支付(只有普通浏览器内打开显示,微信内打开不显示)
开发和推荐部署环境:Windows操作系统64-битная версия, JDK 1. 7 64-битная версия и Tomcat 7 64-битная версия
PC-фронтенд главная страница: http://j15b548420.imwork.net/index.htm
Мобильный WAP-фронтенд главная страница: http://j15b548420.imwork.net/wap/indexhtm
Административная панель: http://j15b548420.imwork.net/admin/login.htm
Администратор: admin/123456
Панель покупателя: http://j15b548420.imwork.net/buyer/index.htm
Покупатель: zhangsan/123456, test3/123456
Панель продавца: http://j15b548420.imwork.net/seller/index.htm
Продавец: wemall/123456, liying/123456
Администратор: admin/123456
Покупатель: zhangsan/123456, test3/123456
Продавец: wemall/123456, liying/123456
Шаги для вторичной разработки:
- Восстановите базу данных. Откройте файл wemall-demo.sql в блокноте, убедитесь, что китайские символы не искажены, скопируйте содержимое SQL в окно запроса инструмента Navicat для выполнения; после импорта проверьте, есть ли искажение символов в таблице wemall_goods, если нет, значит всё в порядке;
- Импортируйте проект wemall в среду разработки IDEA/eclipse/myeclipse;
- Настройте среду разработки JDK, параметры отладки и параметры для Tomcat;
- Измените mysqlbase.sid, mysqlbase.user и mysqlbase.password в src/jdbc.properties на ваши настройки MySQL, где mysqlbase.password необходимо зашифровать с помощью класса com.wemall.core.tools.DruidDecrypt;
- Запустите отладку в среде разработки;Шаги по переводу проекта eclipse/myeclipse в IDEA:
- Импортируйте проект eclipse/myeclipse в среду разработки IDEA;
- file->project structure->project настройте SDK;
- file->project structure->project настройте путь компиляции проекта на XXX\web\WEB-INF\classes;
- file->project structure->modules настройте paths, выберите use module compile output path и установите output path на XXX\web\WEB-INF\classes;
- file->project structure->Libraries добавьте проект XXX\web\WEB-INF\lib в библиотеки;
- Настройте локальную среду отладки Tomcat, в IDEA в правом верхнем углу настройте configurations на Tomcat server->local, настройте deployment на web-директорию проекта, чтобы можно было локально отладить;
- Проблема с отображением китайских символов в виде знака вопроса в базе данных
Решение: замените источник данных dbcp на alibaba, измените конфигурации в jdbc.properties и applicationContext-configuration.xml;
Результат: система работает корректно, но задачи по расписанию выдают ошибку:
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.wemall.foundation.domain.Group.gg_list, no session or session was closed
Также при обновлении dbcp с версии 1.2 до 1.4 символы всё ещё искажены, при обновлении до версии 2.1 система не запускается
Внимание: база данных использует кодировку UTF-8, по умолчанию пароль root123, если ваш пароль MySQL отличается, используйте класс DruidDecrypt для шифрования и измените конфигурацию jdbc.properties в директории classes.
- Просмотр параметров в логах Hibernate
#log4j.appender.STDOUT.Threshold=trace
#log4j.category.org.hibernate.SQL=trace
#log4j.category.org.hibernate.type=trace
- Структура проектаBase предоставляет базовую поддержку системы, объекты для персистентного хранения таблиц базы данных, интерфейсы для базовых операций с таблицами и функции загрузки файлов. Core ядро всей системы, включающее кэширование, безопасность, использование Spring для проксирования Hibernate через ORM-компоненты для выполнения операций с базой данных, создание унифицированных DAO, QueryService и т. д.
Buyer реализация управления покупателями, включающая центр пользователя, сообщения, закладки, заказы и т. д.
Admin управление системой на основе возможностей администратора, включающее бизнес-процессы, доступные для управления.
Login-plug возможность использования других методов входа в систему, таких как QQ, Weibo и т. д., реализованная в этом компоненте.
Lucene предоставление быстрого полнотекстового индексирования системы, магазинов и товаров.
Pay поддержка различных методов оплаты заказов, включая Alipay, Online Banking, PayPal и Tenpay.
Seller управление бизнесом продавцов, включающее управление товарами и заказами.
Timer реализация различных задач по расписанию и статистических задач, механизмы работы в фоновом режиме.
Uc поддержка интеграции с ucenter, включающая одноразовую регистрацию, вход и выход пользователя, а также взаимодействие с другими данными сообщества.
View реализация функций просмотра, включающая независимую упаковку компонентов для запросов для удобства будущей оптимизации. ==================Анализ структуры кода==================
Код, связанный с продуктами goods:
action-класс: com.wemall.view.web.action.GoodsViewAction.java
модель domain: com.wemall.foundation.domain.Goods.java
запрос query: com.wemall.foundation.domain.query.GoodsQueryObject.java
DAO-класс: com.wemall.foundation.GoodsDAO.java
интерфейс сервиса: com.wemall.foundation.service.IGoodsService.java
реализация сервиса: com.wemall.foundation.service.impl.GoodsServiceImpl.java
html-страницы:
Передняя часть: templates/zh_cn/shop/default/goods_list.html, good_detail.html
Системный администратор: templates/zh_cn/system/admin/blue/goods_list.html, goods_manage.html
Центр пользователя: templates/zh_cn/user/default/usercenter/goods.html
==================Анализ структуры кода==================
- Шаблоны Velocity
"#" используется для обозначения инструкций Velocity, включая #set, #if, #else, #end, #foreach, #end, #include, #parse, #macro и т. д.
- 1 Проверка условия
#if($info.imgs)

#else

#end
4. 2 Цикл
#foreach($info in $hotList1)
$!info.title
#end
4. 3 Логические операторы: == && ||
5. Появление диалогового окна
Схема 1: схема использования wemall
Страница ссылается на <script src="$!webPath/resources/js/jquery.shop.common.js"></script>
<script type="text/javascript" src="js"></script>
Отправить жалобу на этот товар
Вариант два: использование компонента layer для отображения модальных окон, важно помнить, что jQuery должен быть версии 1.8.3 или выше
Включение скрипта на странице `<script src="$! webPath/resources/layer/layer.js"></script>`
6. Исправление функции импорта из Тайваня, шаблон находится в `resources/data/taobao.csv`
7. Не следует произвольно обновлять jar-пакеты Spring и Spring MVC, система использует Spring MVC 2.5.6. Обновление до Spring 3.4/3.11 может привести к невозможности запуска системы
8. Использование AJAX
Метод один:
На сервере Java:
```java
@RequestMapping(value = "/get_trans_area.htm", method = RequestMethod.POST)
public void get_trans_area(HttpServletRequest request, HttpServletResponse response, String parentId) {
if (StringUtils.isEmpty(parentId)) {
parentId = "100000";
}
TransArea transArea = this.transareaService.getObjById(Long.valueOf(Long.parseLong(parentId)));
List> list = new ArrayList<>();
for (TransArea area : transArea.getChilds()) {
Map map = new HashMap<>();
map.put("id", area.getId());
map.put("areaName", area.getAreaName());
list.add(map);
}
String result = Json.toJson(list, JsonFormat.compact());
response.setContentType("text/html");
response.setHeader("Cache-Control", "no-cache");
response.setCharacterEncoding("UTF-8");
try {
PrintWriter writer = response.getWriter();
writer.print(result);
} catch (IOException e) {
e.printStackTrace();
}
}
```
На клиенте JavaScript:
```javascript
jQuery.ajax({
type: "POST",
url: "$! webPath/get_trans_area.htm",
data: {parentId: id},
dataType: "json",
success: function(data) {
if (id == "") {
$("#area_tab span").eq(0).addClass("this");
}
var text = "";
var last_id = "";
var last_level = "";
var last_name = "";
var city_id = $("#area_tab span[class='this']").find("a").attr("city_id");
jQuery.each(data, function(i, item) {
last_id = item.id;
last_level = item.level;
last_name = item.areaName;
if (item.id == city_id) {
text = text + "
" + item.areaName + "";
} else {
``````
```markdown
9. Общекитайские регионы, логистика доставки, таблица адресов получения:
```Фронтенд выбора региона доставки trans_area
Таблица адресов получения area
- Основные бизнес-модели
Store: модель магазина, таблица wemall_store
StoreGrade: уровень магазина, таблица wemall_storegrade
StoreClass: тип магазина, таблица wemall_storeclass
User: модель пользователя, таблица wemall_user
Goods: модель товара, таблица wemall_goods, запасы и цены на товары в поле goods_inventory_detail, а стили, материалы и длина в поле goods_property
GoodsSpecification: модель определения спецификаций товаров, таблица wemall_goodsspecification
GoodsSpecProperty: модель определения свойств спецификаций товаров, таблица wemall_goodsspecproperty
Примечание: таблица wemall_goods_spec определяет отношения между таблицами wemall_goods и wemall_goodsspecproperty
GoodsClass: модель типа товара, таблица wemall_goodsclass
UserGoodsClass: модель пользовательских классификаций товаров, таблица wemall_usergoodsclass
Примечание: таблица wemall_goods_ugc определяет отношения между таблицами wemall_goods и wemall_usergoodsclass
GoodsBrand: модель бренда, таблица wemall_goodsbrand
GroupGoods: модель товаров для групповых покупок, таблица wemall_group_goods
Group: модель групповых покупок, таблица wemall_group
BargainGoods: модель товаров со скидкой, таблица wemall_bargain_goods
```javascript
jQuery.ajax({
type: 'POST',
url: '$!webPath/seller/transport_area.htm',
data: {"trans_city_type": trans_city_type, "trans_index": trans_index},
success: function(data) {
jQuery(".main").append(data);
}
});
``````java
@RequestMapping({"/seller/transport_area.htm"})
public ModelAndView transport_area(HttpServletRequest request, HttpServletResponse response, String id, String trans_city_type, String trans_index) {
ModelAndView mv = new JModelAndView(
"user/default/usercenter/transport_area.html", this.configService
.getSysConfig(),
this.userConfigService.getUserConfig(), 0, request, response);
List objs = this.transAreaService
.query(
"select obj from TransArea obj where obj.parent.id is null order by obj.sequence asc",
null, -1, -1);
mv.addObject("objs", objs);
mv.addObject("trans_city_type", trans_city_type);
mv.addObject("trans_index", trans_index);
return mv;
}
ДоставкаТоваров: Модель для доставки товаров, таблица wemall_delivery_goods
АкцииТоваров: Модель для товаров в акциях, таблица wemall_activity_goods
КорзинаПокупок: Модель для корзины покупок, таблица wemall_storecart
ДеталиПокупок: Модель для деталей покупок, таблица wemall_cart_gsp
Заказы: Модель для заказов, таблица wemall_orderform
Платежи: Модель для платежей, таблица wemall_payment
Вложения: Модель для вложений, таблица wemall_accessory
Оценки: Модель для оценок, таблица wemall_evaluate
ДинамическиеДанные: Модель для динамических данных, таблица wemall_dynamic11. Ключевые атрибуты заказа
Способ оплаты payment
alipay: Алипей
wxcodepay: Оплата через WeChat
weixin_wap: Оплата через WeChat (веб-версия)
chinabank: Онлайн-банкинг
bill: QuickMoney
tenpay: Tenpay
outline: Оплата наличными
balance: Оплата с предоплаты
payafter: Оплата после доставки
paypal: PayPal
-
Статус заказа order_status
10: Ожидание оплаты
15: Ожидание проверки наличной оплаты
16: Ожидание отправки для оплаты после доставки
20: Ожидание отправки
30: Отправлено
40: Получено
50: Завершено, оценено
60: Завершено
0: Отменено
-
Статус магазина store_status
1: Ожидание проверки
2: Активен
3: Закрыт за нарушение правил
-
Статус товара goods_status
0: В продаже
1: В запасах
-1: Снято с продажи
-2: Снято с продажи за нарушение правил
Опубликовать ( 0 )