diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/util/StatVo.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/util/StatVo.java new file mode 100644 index 00000000..a19b97f2 --- /dev/null +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/util/StatVo.java @@ -0,0 +1,31 @@ +package org.linlinjava.litemall.admin.util; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +public class StatVo { + private String[] columns = new String[0]; + private List rows = new ArrayList<>(); + + public String[] getColumns() { + return columns; + } + + public void setColumns(String[] columns) { + this.columns = columns; + } + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public void add(Map ... r) { + rows.addAll(Arrays.asList(r)); + } +} diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminStatController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminStatController.java new file mode 100644 index 00000000..72a89c2c --- /dev/null +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminStatController.java @@ -0,0 +1,72 @@ +package org.linlinjava.litemall.admin.web; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.linlinjava.litemall.admin.annotation.LoginAdmin; +import org.linlinjava.litemall.admin.util.StatVo; +import org.linlinjava.litemall.core.util.ResponseUtil; +import org.linlinjava.litemall.db.dao.StatMapper; +import org.linlinjava.litemall.db.service.LitemallOrderService; +import org.linlinjava.litemall.db.service.StatService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/admin/stat") +public class AdminStatController { + private final Log logger = LogFactory.getLog(AdminStatController.class); + + @Autowired + private StatService statService; + + @GetMapping("/user") + public Object statUser(@LoginAdmin Integer adminId){ + if(adminId == null){ + return ResponseUtil.unlogin(); + } + + List rows = statService.statUser(); + String[] columns = new String[]{"day", "users"}; + StatVo statVo = new StatVo(); + statVo.setColumns(columns); + statVo.setRows(rows); + + return ResponseUtil.ok(statVo); + } + + @GetMapping("/order") + public Object statOrder(@LoginAdmin Integer adminId){ + if(adminId == null){ + return ResponseUtil.unlogin(); + } + + List rows = statService.statOrder(); + String[] columns = new String[]{"day", "orders", "customers", "amount", "pcr"}; + StatVo statVo = new StatVo(); + statVo.setColumns(columns); + statVo.setRows(rows); + + return ResponseUtil.ok(statVo); + } + + @GetMapping("/goods") + public Object statGoods(@LoginAdmin Integer adminId){ + if(adminId == null){ + return ResponseUtil.unlogin(); + } + + List rows = statService.statGoods(); + String[] columns = new String[]{"day", "orders", "products", "amount"}; + StatVo statVo = new StatVo(); + statVo.setColumns(columns); + statVo.setRows(rows); + + + return ResponseUtil.ok(statVo); + } + +} diff --git a/litemall-admin/package.json b/litemall-admin/package.json index 049ffeb3..1ad6a5fb 100644 --- a/litemall-admin/package.json +++ b/litemall-admin/package.json @@ -13,9 +13,10 @@ "test": "npm run lint" }, "dependencies": { + "@tinymce/tinymce-vue": "^1.0.8", "axios": "0.17.1", "clipboard": "1.7.1", - "echarts": "3.8.5", + "echarts": "^4.1.0", "element-ui": "2.0.8", "file-saver": "1.3.3", "font-awesome": "4.7.0", @@ -24,13 +25,13 @@ "normalize.css": "7.0.0", "nprogress": "0.2.0", "screenfull": "3.3.2", + "v-charts": "^1.16.19", "vue": "2.5.10", "vue-count-to": "1.0.13", "vue-router": "3.0.1", "vue-splitpane": "1.0.2", "vuex": "3.0.1", - "xlsx": "^0.11.16", - "@tinymce/tinymce-vue": "1.0.8" + "xlsx": "^0.11.16" }, "devDependencies": { "autoprefixer": "7.2.3", diff --git a/litemall-admin/src/api/stat.js b/litemall-admin/src/api/stat.js new file mode 100644 index 00000000..0aa70587 --- /dev/null +++ b/litemall-admin/src/api/stat.js @@ -0,0 +1,25 @@ +import request from '@/utils/request' + +export function statUser(query) { + return request({ + url: '/stat/user', + method: 'get', + params: query + }) +} + +export function statOrder(query) { + return request({ + url: '/stat/order', + method: 'get', + params: query + }) +} + +export function statGoods(query) { + return request({ + url: '/stat/goods', + method: 'get', + params: query + }) +} diff --git a/litemall-admin/src/router/index.js b/litemall-admin/src/router/index.js index de73dd83..35b95a6c 100644 --- a/litemall-admin/src/router/index.js +++ b/litemall-admin/src/router/index.js @@ -106,6 +106,7 @@ export const asyncRouterMap = [ { path: 'comment', component: _import('goods/comment'), name: 'comment', meta: { title: '用户评论', noCache: true }} ] }, + { path: '/promotion', component: Layout, @@ -120,6 +121,7 @@ export const asyncRouterMap = [ { path: 'topic', component: _import('promotion/topic'), name: 'topic', meta: { title: '专题管理', noCache: true }} ] }, + { path: '/sys', component: Layout, @@ -135,5 +137,21 @@ export const asyncRouterMap = [ ] }, + { + path: '/stat', + component: Layout, + redirect: 'noredirect', + name: 'statManage', + meta: { + title: '统计', + icon: 'chart' + }, + children: [ + { path: 'user', component: _import('stat/user'), name: 'statUser', meta: { title: '用户统计', noCache: true }}, + { path: 'order', component: _import('stat/order'), name: 'statOrder', meta: { title: '订单统计', noCache: true }}, + { path: 'goods', component: _import('stat/goods'), name: 'statGoods', meta: { title: '商品统计', noCache: true }} + ] + }, + { path: '*', redirect: '/404', hidden: true } ] diff --git a/litemall-admin/src/views/stat/goods.vue b/litemall-admin/src/views/stat/goods.vue new file mode 100644 index 00000000..0bf80ae4 --- /dev/null +++ b/litemall-admin/src/views/stat/goods.vue @@ -0,0 +1,37 @@ + + + \ No newline at end of file diff --git a/litemall-admin/src/views/stat/order.vue b/litemall-admin/src/views/stat/order.vue new file mode 100644 index 00000000..d348aea6 --- /dev/null +++ b/litemall-admin/src/views/stat/order.vue @@ -0,0 +1,37 @@ + + + \ No newline at end of file diff --git a/litemall-admin/src/views/stat/user.vue b/litemall-admin/src/views/stat/user.vue new file mode 100644 index 00000000..a89073ab --- /dev/null +++ b/litemall-admin/src/views/stat/user.vue @@ -0,0 +1,38 @@ + + + \ No newline at end of file diff --git a/litemall-db/src/main/java/org/linlinjava/litemall/db/dao/StatMapper.java b/litemall-db/src/main/java/org/linlinjava/litemall/db/dao/StatMapper.java new file mode 100644 index 00000000..4d57a60e --- /dev/null +++ b/litemall-db/src/main/java/org/linlinjava/litemall/db/dao/StatMapper.java @@ -0,0 +1,13 @@ +package org.linlinjava.litemall.db.dao; + +import org.apache.ibatis.annotations.Param; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public interface StatMapper { + List statUser(); + List statOrder(); + List statGoods(); +} \ No newline at end of file diff --git a/litemall-db/src/main/java/org/linlinjava/litemall/db/service/StatService.java b/litemall-db/src/main/java/org/linlinjava/litemall/db/service/StatService.java new file mode 100644 index 00000000..0e39bde1 --- /dev/null +++ b/litemall-db/src/main/java/org/linlinjava/litemall/db/service/StatService.java @@ -0,0 +1,32 @@ +package org.linlinjava.litemall.db.service; + +import com.github.pagehelper.PageHelper; +import org.linlinjava.litemall.db.dao.LitemallUserMapper; +import org.linlinjava.litemall.db.dao.StatMapper; +import org.linlinjava.litemall.db.domain.LitemallUser; +import org.linlinjava.litemall.db.domain.LitemallUserExample; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; + +@Service +public class StatService { + @Resource + private StatMapper statMapper; + + + public List statUser() { + return statMapper.statUser(); + } + + public List statOrder(){ + return statMapper.statOrder(); + } + + public List statGoods(){ + return statMapper.statGoods(); + } +} diff --git a/litemall-db/src/main/resources/org/linlinjava/litemall/db/dao/StatMapper.xml b/litemall-db/src/main/resources/org/linlinjava/litemall/db/dao/StatMapper.xml new file mode 100644 index 00000000..bef392e7 --- /dev/null +++ b/litemall-db/src/main/resources/org/linlinjava/litemall/db/dao/StatMapper.xml @@ -0,0 +1,31 @@ + + + + + + + \ No newline at end of file diff --git a/litemall-db/src/test/java/org/linlinjava/litemall/db/StatMapperTest.java b/litemall-db/src/test/java/org/linlinjava/litemall/db/StatMapperTest.java new file mode 100644 index 00000000..fc3cd751 --- /dev/null +++ b/litemall-db/src/test/java/org/linlinjava/litemall/db/StatMapperTest.java @@ -0,0 +1,46 @@ +package org.linlinjava.litemall.db; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.linlinjava.litemall.db.dao.StatMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; + +import java.util.List; +import java.util.Map; + +@WebAppConfiguration +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest +public class StatMapperTest { + + @Autowired + private StatMapper statMapper; + + @Test + public void testUser() { + List result = statMapper.statUser(); + for(Map m : result) { + m.forEach((k, v) -> System.out.println("key:value = " + k + ":" + v)); + } + } + + @Test + public void testOrder() { + List result = statMapper.statOrder(); + for(Map m : result) { + m.forEach((k, v) -> System.out.println("key:value = " + k + ":" + v)); + } + } + + @Test + public void testGoods() { + List result = statMapper.statGoods(); + for(Map m : result) { + m.forEach((k, v) -> System.out.println("key:value = " + k + ":" + v)); + } + } + +}