diff --git a/app/.idea/.gitignore b/app/.idea/.gitignore index e7e9d11..236ff8c 100644 --- a/app/.idea/.gitignore +++ b/app/.idea/.gitignore @@ -1,2 +1,3 @@ # Default ignored files /workspace.xml +/inspectionProfiles/Project_Default.xml diff --git a/app/public/obank_logo.svg b/app/public/obank_logo.svg new file mode 100644 index 0000000..2766aca --- /dev/null +++ b/app/public/obank_logo.svg @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/App.vue b/app/src/App.vue index e92298c..1abb018 100644 --- a/app/src/App.vue +++ b/app/src/App.vue @@ -22,14 +22,15 @@ setAuthenticated(user) { if (user) { localStorage.setItem('username', user.username); - localStorage.setItem('roles', user.roles); + localStorage.setItem('level', user.level); + localStorage.setItem('department', user.department); + this.$router.replace({ name: 'asset_group' }); } else { this.logout(); } - this.$router.replace({ name: 'asset_group' }); }, logout() { - this.$axios.get('/logout').then((resp) => { + this.$axios.get('/account/logout').then((resp) => { console.log(resp); }) .catch(function (resp) { diff --git a/app/src/components/AssetGroup.vue b/app/src/components/AssetGroup.vue index c0a3553..de488f5 100644 --- a/app/src/components/AssetGroup.vue +++ b/app/src/components/AssetGroup.vue @@ -1,201 +1,397 @@ - - 歷史報表檢視 - - - 歷史報表 -- 共 {{reports.length}} 筆 - - - - + + + - - - - - - - - + {{ item.text }} + + + + - 重新產生報表 + mdi-plus - 以選定日期重新產生報表, 不會發送 Email 及 FTP - + + + 新增資產群組 + + + + + + + + + + + + + + + + + 取消 + + + 新增 + + + + - - - - {{item.fileName}} - - - - - {{snackbarMessage}}. - + + + + + + + + mdi-pencil + + + + + 修改 + + + + + + + + + + + + + + 取消 + + + 修改 + + + + + + mdi-delete + + + + + + + + + 新增欄位 + + + + + 新增 + + + + + + + + + + + + + + 取消 + + + 修改 + + + + + + + + + + + diff --git a/app/src/components/Home.vue b/app/src/components/Home.vue index 291a2e3..7b98ed3 100644 --- a/app/src/components/Home.vue +++ b/app/src/components/Home.vue @@ -46,9 +46,9 @@ :to="item.route" class="px-0 pl-5" > - - - + + + {{ item.text }} @@ -65,33 +65,80 @@ dark dense > - + 資訊資產管理系統 - - - - - + + + + + + + {{ username.slice(1) }} + + + + + + + + + + mdi-account + + + + + {{ username }} + + + + + + + {{ item.icon }} + + + {{ item.title }} + + + + - - - + + + {{ message }} @@ -108,19 +155,51 @@ diff --git a/app/src/components/Login.vue b/app/src/components/Login.vue index 416b1e6..bd9e8a9 100644 --- a/app/src/components/Login.vue +++ b/app/src/components/Login.vue @@ -1,19 +1,26 @@ + + + + + - + - Login + 登入 @@ -68,7 +75,7 @@ data() { return { input: { - username: '', + account: '', password: '', }, loginError : false, @@ -81,28 +88,25 @@ this.$emit('authenticated', { 'username':'aaa', - 'roles': 'aaa', + 'department': 'aaa', + 'level': '1' }); }, login() { this.loginError = false; const _this = this; if(this.input.username !== '' && this.input.password !== '') { - const bodyFormData = new FormData(); - bodyFormData.set('username', this.input.username); - bodyFormData.set('password', this.input.password); - this.$axios.post('/login', this.input).then((resp) => { + this.$axios.post('/account/login', this.input).then((resp) => { if (resp.status === 200) { - //成功 const json = resp.data; - if (json.status === 'OK') { - + if (json.code === 200) { _this.$emit('authenticated', { - 'username': _this.input.username, - 'roles': json.data + 'username': json.data.username, + 'department': json.data.department, + 'level': json.data.level }); - _this.$router.replace({ name: 'report_view' }); + _this.$router.replace({ name: 'asset_group' }); } else { _this.message = json.message; _this.loginError = true; diff --git a/app/src/components/MockSearch.vue b/app/src/components/MockSearch.vue new file mode 100644 index 0000000..dd086f0 --- /dev/null +++ b/app/src/components/MockSearch.vue @@ -0,0 +1,220 @@ + + + + + + + + mdi-magnify + + + + + + 搜尋結果 + + + {{ item.text }} + + + + + + + + + + + mdi-file-export-outline + + + + + + diff --git a/app/src/components/Search.vue b/app/src/components/Search.vue new file mode 100644 index 0000000..8d896a9 --- /dev/null +++ b/app/src/components/Search.vue @@ -0,0 +1,178 @@ + + + + + + + + + + + 搜尋結果 + + + + mdi-file-export-outline + + + + + + + + diff --git a/app/src/components/xxx.vue b/app/src/components/xxx.vue new file mode 100644 index 0000000..c0a3553 --- /dev/null +++ b/app/src/components/xxx.vue @@ -0,0 +1,201 @@ + + + 歷史報表檢視 + + + 歷史報表 -- 共 {{reports.length}} 筆 + + + + + + + + + + + + + + 重新產生報表 + + + 以選定日期重新產生報表, 不會發送 Email 及 FTP + + + + + + {{item.fileName}} + + + + + {{snackbarMessage}}. + + + + diff --git a/app/src/router/index.js b/app/src/router/index.js index f303177..746b312 100644 --- a/app/src/router/index.js +++ b/app/src/router/index.js @@ -4,6 +4,8 @@ import Login from '@/components/Login' import Home from '../components/Home'; import AssetGroup from '../components/AssetGroup'; import Inventory from '../components/Inventory'; +// import Search from '../components/Search'; +import MockSearch from '../components/MockSearch'; Vue.use(Router); @@ -14,20 +16,25 @@ export const constantRoutes = [ component: Login, }, { - path: '/home', + path: '/', component: Home, name: 'home', children: [ { - path: '/asset_group', + path: 'asset_group', name: 'asset_group', component: AssetGroup }, { - path: '/inventory/:tablename', + path: 'inventory/:tablename', name: 'inventory', component: Inventory }, + { + path: 'search', + name: 'search', + component: MockSearch + }, ] } ]; diff --git a/src/main/java/com/moze/rms/config/JdbiFactory.java b/src/main/java/com/moze/rms/config/JdbiFactory.java index 608f789..b3c9630 100644 --- a/src/main/java/com/moze/rms/config/JdbiFactory.java +++ b/src/main/java/com/moze/rms/config/JdbiFactory.java @@ -1,8 +1,6 @@ package com.moze.rms.config; -import com.moze.rms.dao.InventoryDAO; -import com.moze.rms.dao.MappingColDAO; -import com.moze.rms.dao.MappingTableDAO; +import com.moze.rms.dao.*; import org.jdbi.v3.core.Jdbi; import org.jdbi.v3.core.statement.SqlLogger; import org.jdbi.v3.core.statement.StatementContext; @@ -66,4 +64,16 @@ public class JdbiFactory { public InventoryDAO inventoryDAO(Jdbi jdbi) { return jdbi.onDemand(InventoryDAO.class); } + + @Bean + public AccountDAO accountDAO(Jdbi jdbi) { + return jdbi.onDemand(AccountDAO.class); + } + + @Bean + public AssertDAO assertDAO(Jdbi jdbi) { + return jdbi.onDemand(AssertDAO.class); + } + + } diff --git a/src/main/java/com/moze/rms/controller/AccountController.java b/src/main/java/com/moze/rms/controller/AccountController.java index f9d7187..86fb9e2 100644 --- a/src/main/java/com/moze/rms/controller/AccountController.java +++ b/src/main/java/com/moze/rms/controller/AccountController.java @@ -1,10 +1,31 @@ package com.moze.rms.controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import com.moze.rms.dao.AccountDAO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; @RestController @RequestMapping("/api/account") public class AccountController { + + @Autowired + AccountDAO accountDAO; + + @PostMapping("/login") + public JsonResult login(@RequestBody Map data) { + Map user = accountDAO.findUser(data.get("account")); + if (user.get("pwd").equals(data.get("password"))) { + return new JsonResult(StatusCode.SUCCESS, user); + } else { + return new JsonResult(StatusCode.NOT_LOGIN, null); + } + } + + @PostMapping("/logout") + public JsonResult logout() { + return new JsonResult(StatusCode.SUCCESS, null); + } } diff --git a/src/main/java/com/moze/rms/controller/AssertGroupController.java b/src/main/java/com/moze/rms/controller/AssertGroupController.java new file mode 100644 index 0000000..f25ce3e --- /dev/null +++ b/src/main/java/com/moze/rms/controller/AssertGroupController.java @@ -0,0 +1,45 @@ +package com.moze.rms.controller; + +import com.moze.rms.dao.AssertDAO; +import com.moze.rms.entity.dto.SelectItemDTO; +import com.moze.rms.entity.model.MappingCol; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/api/assert") +public class AssertGroupController { + + @Autowired + AssertDAO assertDAO; + + + @GetMapping("/assertGroups") + public JsonResult getAsserts() { + + return new JsonResult(StatusCode.SUCCESS, assertDAO.findAssertGroups()); + + } + + @GetMapping("/Types") + public JsonResult getTypesByTable(@RequestParam String tablename) { + return new JsonResult(StatusCode.SUCCESS, assertDAO.findTypesByTable(tablename)); + } + + @GetMapping("/InventoryItems") + public JsonResult getInventoryItems(@RequestParam String tablename) { + +// return new JsonResult(StatusCode.SUCCESS, data.stream().collect(Collectors.groupingBy(SelectItemDTO::getColname))); + List data = assertDAO.findInventoryItems(); + + return new JsonResult(StatusCode.SUCCESS, data.stream().collect(Collectors.groupingBy(MappingCol::getTablename))); + } +} + diff --git a/src/main/java/com/moze/rms/controller/InventoryController.java b/src/main/java/com/moze/rms/controller/InventoryController.java index 1d612e1..3126792 100644 --- a/src/main/java/com/moze/rms/controller/InventoryController.java +++ b/src/main/java/com/moze/rms/controller/InventoryController.java @@ -4,10 +4,13 @@ package com.moze.rms.controller; import com.moze.rms.dao.InventoryDAO; import com.moze.rms.dao.MappingColDAO; import com.moze.rms.dao.MappingTableDAO; +import com.moze.rms.entity.dto.SelectItemDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import java.util.Map; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; @RestController @RequestMapping("/api") @@ -38,7 +41,6 @@ public class InventoryController { @GetMapping("/headers") public JsonResult getHeaders(@RequestParam String tablename) { - return new JsonResult(StatusCode.SUCCESS, mappingColDAO.findByTable(tablename)); } @GetMapping("/inventory") @@ -46,6 +48,13 @@ public class InventoryController { return new JsonResult(StatusCode.SUCCESS, inventoryDAO.getInventoryByTablename(tablename)); } + @PostMapping("/inventory") + public JsonResult insertInventory(@RequestBody Map data) { + System.out.println(data); + inventoryDAO.insertOne(data); + return new JsonResult(StatusCode.SUCCESS, null); + } + @PutMapping("/inventory") public JsonResult modifyInventory(@RequestBody Map data) { try { @@ -56,5 +65,18 @@ public class InventoryController { } } + @GetMapping("/selectItem") + public JsonResult getSelectItem(@RequestParam String tablename) { + + List data = inventoryDAO.getSelectItemByTable(tablename); + return new JsonResult(StatusCode.SUCCESS, data.stream().collect(Collectors.groupingBy(SelectItemDTO::getColname))); + } + @DeleteMapping("deleteOne") + public JsonResult deleteOne(@RequestParam String tablename, @RequestParam String id) { + System.out.println(tablename); + System.out.println(id); + inventoryDAO.deleteByTablenameAndId(tablename, id); + return new JsonResult(StatusCode.SUCCESS, null); + } } diff --git a/src/main/java/com/moze/rms/dao/AccountDAO.java b/src/main/java/com/moze/rms/dao/AccountDAO.java new file mode 100644 index 0000000..0b5f74f --- /dev/null +++ b/src/main/java/com/moze/rms/dao/AccountDAO.java @@ -0,0 +1,18 @@ +package com.moze.rms.dao; + +import org.jdbi.v3.core.Handle; +import org.jdbi.v3.sqlobject.SqlObject; +import org.jdbi.v3.sqlobject.config.RegisterBeanMapper; +import org.jdbi.v3.sqlobject.statement.SqlQuery; + +import java.util.Map; + +public interface AccountDAO extends SqlObject { + + @RegisterBeanMapper(Object.class) + default Map findUser(String account) { + Handle handle = this.getHandle(); + String sql = "select * from account where account = '" + account + "'"; + return handle.createQuery(sql).mapToMap().one(); + } +} diff --git a/src/main/java/com/moze/rms/dao/AssertDAO.java b/src/main/java/com/moze/rms/dao/AssertDAO.java new file mode 100644 index 0000000..c2405c2 --- /dev/null +++ b/src/main/java/com/moze/rms/dao/AssertDAO.java @@ -0,0 +1,49 @@ +package com.moze.rms.dao; + + +import com.moze.rms.entity.model.MappingCol; +import org.jdbi.v3.core.Handle; +import org.jdbi.v3.sqlobject.SqlObject; +import org.jdbi.v3.sqlobject.config.RegisterBeanMapper; +import org.jdbi.v3.sqlobject.statement.SqlQuery; + +import java.util.List; +import java.util.Map; + +public interface AssertDAO extends SqlObject { + + @RegisterBeanMapper(Object.class) + default List> findAssertGroups() { + Handle handle = this.getHandle(); + String sql = "select * from mapping.mapping_table;"; + return handle.createQuery(sql).mapToMap().list(); + } + + + default List> findTypesByTable(String tablename) { + List> assertGroup = findAssertGroups(); + + Handle handle = this.getHandle(); +// String sql = "select * from mapping.mapping_" + assertGroup.get(0).get("tablename"); +// for (int i = 1; i <= assertGroup.size() - 1; i++) { +// sql += " union select * from mapping.mapping_" + assertGroup.get(i).get("tablename"); +// } +// String sql = "select * from mapping.\"selectItem\" where tablename = '" + tablename + "' and colname = 'type' order by index;"; + String sql = "select * from mapping.mapping_" + tablename + " order by type"; + return handle.createQuery(sql).mapToMap().list(); + } + + +// default List> findInventoryItemByTable() { +// List> assertGroup = findAssertGroups(); +// +// Handle handle = this.getHandle(); +//// String sql = "select * from mapping.mapping_col where tablename = '" + tablename + "' order by index;"; +// String sql = "select * from mapping.mapping_col;"; +// return handle.createQuery(sql).mapToMap().list(); +// } + + @RegisterBeanMapper(MappingCol.class) + @SqlQuery("select * from mapping.mapping_col") + List findInventoryItems(); +} diff --git a/src/main/java/com/moze/rms/dao/InventoryDAO.java b/src/main/java/com/moze/rms/dao/InventoryDAO.java index edd7c8e..b1e59d5 100644 --- a/src/main/java/com/moze/rms/dao/InventoryDAO.java +++ b/src/main/java/com/moze/rms/dao/InventoryDAO.java @@ -1,12 +1,14 @@ package com.moze.rms.dao; +import com.moze.rms.entity.dto.SelectItemDTO; import org.jdbi.v3.core.Handle; import org.jdbi.v3.sqlobject.SqlObject; import org.jdbi.v3.sqlobject.config.RegisterBeanMapper; import org.jdbi.v3.sqlobject.statement.SqlQuery; import org.jdbi.v3.sqlobject.statement.SqlUpdate; +import java.util.Iterator; import java.util.List; import java.util.Map; @@ -26,10 +28,48 @@ public interface InventoryDAO extends SqlObject { String sql = "update " + data.get("tablename") + " set "; for (Map.Entry entry : data.entrySet()) { if (!entry.getKey().equals("id") && !entry.getKey().equals("tablename")) - sql += entry.getKey() + " = " + entry.getValue() + ","; + if (entry.getValue() != null) { + sql += entry.getKey() + " = '" + entry.getValue() + "',"; + } else { + sql += entry.getKey() + " = " + entry.getValue() + ","; + } } - sql = sql.substring(0, sql.length()-1); - sql += "where id = " + data.get("id"); + sql = sql.substring(0, sql.length() - 1); + sql += " where id = '" + data.get("id") + "'"; handle.createUpdate(sql).execute(); } + + @SqlQuery("select colname, item from mapping.\"selectItem\" where tablename = ? order by index;") + @RegisterBeanMapper(SelectItemDTO.class) + List getSelectItemByTable(String tablename); + + default void deleteByTablenameAndId(String tablename, String id) { + + Handle handle = this.getHandle(); + String sql = "delete from " + tablename + " where id = " + id; + handle.execute(sql); + } + + default void insertOne(Map data) { + Iterator> iterator = data.entrySet().iterator(); + String cols = ""; + String values = ""; + while (iterator.hasNext()) { + Map.Entry next = iterator.next(); + String key = next.getKey(); + Object value = next.getValue(); + System.out.println(key); + if (key != "tablename" && key != "id") { + cols += key + ", "; + values += "'" + value + "', "; + } + } + cols = cols.substring(0, cols.length() - 2); + values = values.substring(0, values.length() - 2); + + Handle handle = this.getHandle(); + String sql = "insert into " + data.get("tablename") + " ( " + cols + " ) " + " values ( " + values + " ) "; + handle.execute(sql); + } + } diff --git a/src/main/java/com/moze/rms/entity/dto/SelectItemDTO.java b/src/main/java/com/moze/rms/entity/dto/SelectItemDTO.java new file mode 100644 index 0000000..bf517b7 --- /dev/null +++ b/src/main/java/com/moze/rms/entity/dto/SelectItemDTO.java @@ -0,0 +1,12 @@ +package com.moze.rms.entity.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class SelectItemDTO { + + private String colname; + private String item; +} diff --git a/src/main/java/com/moze/rms/entity/model/MappingCol.java b/src/main/java/com/moze/rms/entity/model/MappingCol.java index 0f8e847..21df798 100644 --- a/src/main/java/com/moze/rms/entity/model/MappingCol.java +++ b/src/main/java/com/moze/rms/entity/model/MappingCol.java @@ -12,4 +12,8 @@ public class MappingCol { private Integer level; private String descript; private String type; + private String select; + private String search; + private String export; + private String require; }