diff --git a/app/src/components/Inventory.vue b/app/src/components/Inventory.vue index 127e345..a5a56c6 100644 --- a/app/src/components/Inventory.vue +++ b/app/src/components/Inventory.vue @@ -399,6 +399,7 @@ watch: { async tablename() { if (this.$route.params.tablename) { + this.haveSearch = false; this.progress = true; this.title = ''; await this.getHeaders(); @@ -430,6 +431,7 @@ this.headers = []; this.headers.push({'text': '', 'value': 'actions', sortable: false}); this.insertItem = {}; + this.searchItem = {}; this.cols = resp.data.data; resp.data.data.forEach((item) => { let header = {'text': null, 'value': null}; @@ -470,6 +472,7 @@ delete this.insertItem.tablename; this.getInventories(); this.close(); + alert('已新增'); } ); }, @@ -504,7 +507,11 @@ let yes = confirm('確定刪除'); if (yes) { this.$axios.delete(`/deleteOne?tablename=${this.tablename}&&id=${item.id}`).then(() => { - this.getInventories(); + if (this.haveSearch === true) { + this.search(); + } else { + this.getInventories(); + } alert('已刪除'); }); } @@ -546,6 +553,7 @@ } }, importFile() { + this.progress = true; const formData = new FormData(); formData.append('tablename', this.tablename); formData.append('file', this.file); @@ -553,6 +561,7 @@ document.getElementById('file').value = null; this.getInventories(); this.file = null; + this.progress = false; this.dialogImport = false; }); diff --git a/app/src/plugins/axios.js b/app/src/plugins/axios.js index a36d4fa..e2698ab 100644 --- a/app/src/plugins/axios.js +++ b/app/src/plugins/axios.js @@ -2,7 +2,7 @@ import axios from 'axios'; //在開發環境中的測試 development if(process.env.NODE_ENV === 'development') { - axios.defaults.baseURL = '/api' + axios.defaults.baseURL = '/rms/api' } //在生產環境中的測試 production if(process.env.NODE_ENV === 'production') { diff --git a/app/vue.config.js b/app/vue.config.js index b6c4cb9..577edc7 100644 --- a/app/vue.config.js +++ b/app/vue.config.js @@ -17,10 +17,10 @@ module.exports= { devServer: { proxy: { '/api': { - target: 'http://localhost:8081/api/', + target: 'http://localhost:8080/rms/api/', changeOrigin: true, pathRewrite: { - '^/api': '', + '^/rms/api': '', }, }, }, diff --git a/pom.xml b/pom.xml index 7762ae0..5e67b77 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ com.moze rms - 0.0.1-SNAPSHOT + 1.0 war rms diff --git a/src/main/java/com/moze/rms/RequestInterceptor.java b/src/main/java/com/moze/rms/RequestInterceptor.java new file mode 100644 index 0000000..a192f01 --- /dev/null +++ b/src/main/java/com/moze/rms/RequestInterceptor.java @@ -0,0 +1,33 @@ +package com.moze.rms; + + +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.RequestDispatcher; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@Component +public class RequestInterceptor implements HandlerInterceptor { + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + + String uri = request.getRequestURI().substring(request.getContextPath().length()); +// //當呼叫後端api + if (uri.startsWith("/api/")) { + return true; + } else { + if (uri.equals("/index.html")) { + return true; + } else if (uri.startsWith("/js/") || uri.startsWith("/manifest") || uri.startsWith("/img") || uri.startsWith("/fonts") || uri.startsWith("/css")) { + return true; + } else { + RequestDispatcher dispatcher = request.getRequestDispatcher("/index.html"); + dispatcher.forward(request, response); + return false; + } + } + } +} diff --git a/src/main/java/com/moze/rms/config/JdbiFactory.java b/src/main/java/com/moze/rms/config/JdbiFactory.java index c44f60f..5fe3f2c 100644 --- a/src/main/java/com/moze/rms/config/JdbiFactory.java +++ b/src/main/java/com/moze/rms/config/JdbiFactory.java @@ -23,21 +23,21 @@ public class JdbiFactory { public Jdbi getInstance() { TransactionAwareDataSourceProxy proxy = new TransactionAwareDataSourceProxy(dataSource); Jdbi jdbi = Jdbi.create(proxy); - jdbi.setSqlLogger(new SqlLogger() { - @Override - public void logBeforeExecution(StatementContext ctx) { - if (ctx.getStatement() != null) - System.out.println(ctx.getStatement().toString()); - } +// jdbi.setSqlLogger(new SqlLogger() { // @Override -// public void logAfterExecution(StatementContext context) { -//// jdbi.setSqlLogger(SqlLogger.NOP_SQL_LOGGER); +// public void logBeforeExecution(StatementContext ctx) { +// if (ctx.getStatement() != null) +//// System.out.println(ctx.getStatement().toString()); // } -// @Override -// public void logException(StatementContext context, SQLException ex) { -//// jdbi.setSqlLogger(SqlLogger.NOP_SQL_LOGGER); -// } - }); +//// @Override +//// public void logAfterExecution(StatementContext context) { +////// jdbi.setSqlLogger(SqlLogger.NOP_SQL_LOGGER); +//// } +//// @Override +//// public void logException(StatementContext context, SQLException ex) { +////// jdbi.setSqlLogger(SqlLogger.NOP_SQL_LOGGER); +//// } +// }); return jdbi.installPlugin(new SqlObjectPlugin()); } // @Bean diff --git a/src/main/java/com/moze/rms/config/WebConfig.java b/src/main/java/com/moze/rms/config/WebConfig.java new file mode 100644 index 0000000..ac5a9b5 --- /dev/null +++ b/src/main/java/com/moze/rms/config/WebConfig.java @@ -0,0 +1,34 @@ +package com.moze.rms.config; + + +import com.moze.rms.RequestInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@EnableWebMvc +public class WebConfig implements WebMvcConfigurer { + + @Autowired + private RequestInterceptor interceptor; + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(interceptor).addPathPatterns("/**"); + } + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + + registry.addResourceHandler("/**").addResourceLocations( + "classpath:/resources/*", + "classpath:/resources/public/*", + "classpath:/public/", + "classpath:/public/", + "/**"); + } + +} diff --git a/src/main/java/com/moze/rms/controller/AccountController.java b/src/main/java/com/moze/rms/controller/AccountController.java index 9d16853..3b86f4f 100644 --- a/src/main/java/com/moze/rms/controller/AccountController.java +++ b/src/main/java/com/moze/rms/controller/AccountController.java @@ -7,6 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.Map; +import java.util.Optional; @RestController @RequestMapping("/api/account") @@ -17,8 +18,8 @@ public class AccountController { @PostMapping("/login") public JsonResult login(@RequestBody Map data) { - Map user = accountDAO.findUser(data.get("account")); - if (user.get("pwd").equals(data.get("password"))) { + Optional> user = accountDAO.findUser(data.get("account")); + if (user.isPresent() && user.get().get("pwd").equals(data.get("password"))) { return new JsonResult(StatusCode.SUCCESS, user); } else { return new JsonResult(StatusCode.NOT_LOGIN, null); diff --git a/src/main/java/com/moze/rms/controller/InventoryController.java b/src/main/java/com/moze/rms/controller/InventoryController.java index cf3fd05..1c6d1e6 100644 --- a/src/main/java/com/moze/rms/controller/InventoryController.java +++ b/src/main/java/com/moze/rms/controller/InventoryController.java @@ -111,12 +111,15 @@ public class InventoryController { file.transferTo(f); ExcelImporter excelImporter = new ExcelImporter(f); + List> data = excelImporter.readAll().get("工作表1"); + System.out.println(data); data.remove(data.get(0)); -// List mappingCols = mappingColDAO.findByTable(tablename); -// -// inventoryDAO.importInventories(tablename, mappingCols, data, searchDAO); -// f.deleteOnExit(); + List mappingCols = mappingColDAO.findByTable(tablename); + inventoryDAO.truncateTable(tablename); + searchDAO.deleteByTablename(tablename); + inventoryDAO.importInventories(tablename, mappingCols, data, searchDAO); + f.deleteOnExit(); 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 index dff78a1..38d7c18 100644 --- a/src/main/java/com/moze/rms/dao/AccountDAO.java +++ b/src/main/java/com/moze/rms/dao/AccountDAO.java @@ -8,14 +8,15 @@ import org.jdbi.v3.sqlobject.statement.SqlQuery; import java.util.List; import java.util.Map; +import java.util.Optional; public interface AccountDAO extends SqlObject { @RegisterBeanMapper(Object.class) - default Map findUser(String account) { + default Optional> findUser(String account) { Handle handle = this.getHandle(); String sql = "select * from account where account = '" + account + "'"; - return handle.createQuery(sql).mapToMap().one(); + return handle.createQuery(sql).mapToMap().findOne(); } @RegisterBeanMapper(Account.class) diff --git a/src/main/java/com/moze/rms/dao/AssertDAO.java b/src/main/java/com/moze/rms/dao/AssertDAO.java index b68f751..8ee3a49 100644 --- a/src/main/java/com/moze/rms/dao/AssertDAO.java +++ b/src/main/java/com/moze/rms/dao/AssertDAO.java @@ -281,7 +281,7 @@ public interface AssertDAO extends SqlObject { default void deleteColFromTable(String tablename, String colname) { Handle handle = this.getHandle(); - String sql = "ALTER TABLE " + tablename + " DROP " + colname; + String sql = "ALTER TABLE " + tablename + " DROP column " + colname; handle.createUpdate(sql).execute(); } diff --git a/src/main/java/com/moze/rms/dao/InventoryDAO.java b/src/main/java/com/moze/rms/dao/InventoryDAO.java index d7bfd86..de79bde 100644 --- a/src/main/java/com/moze/rms/dao/InventoryDAO.java +++ b/src/main/java/com/moze/rms/dao/InventoryDAO.java @@ -78,12 +78,12 @@ public interface InventoryDAO extends SqlObject { Handle handle = this.getHandle(); - String sql = "select id from " + data.get("tablename") + " where "; + String sql = "select top 1 id from " + data.get("tablename") + " where "; Iterator> iterator = data.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry next = iterator.next(); String key = next.getKey(); - Object value = next.getValue().toString(); + Object value = next.getValue() != null ? next.getValue().toString() : ""; if (key != "tablename" && key != "id") { if (value != null) { sql += key + " = '" + value + "' and "; @@ -135,6 +135,9 @@ public interface InventoryDAO extends SqlObject { String key = next.getKey(); Object value = next.getValue(); if (key != "tablename" && key != "id" && value != null) { + if (value.toString().startsWith(" ") || value.toString().endsWith(" ")) { + value = value.toString().trim(); + } sql += " " + key + " like '%" + value + "%' and"; } } @@ -181,4 +184,9 @@ public interface InventoryDAO extends SqlObject { } + default void truncateTable(String tablename) { + + Handle handle = this.getHandle(); + handle.createUpdate("truncate table " + tablename).execute(); + } } diff --git a/src/main/java/com/moze/rms/dao/SearchDAO.java b/src/main/java/com/moze/rms/dao/SearchDAO.java index bc9daea..7f49130 100644 --- a/src/main/java/com/moze/rms/dao/SearchDAO.java +++ b/src/main/java/com/moze/rms/dao/SearchDAO.java @@ -38,11 +38,14 @@ public interface SearchDAO extends SqlObject { Handle handle = this.getHandle(); String sql = "select "; sql += tablename + ".*"; - sql += "from search "; - sql += "join " + tablename + " on search.id = " + tablename + ".id "; + sql += " from search "; + sql += " join " + tablename + " on search.id = " + tablename + ".id "; sql += " and search.tablename = '" + tablename + "' "; - sql += "where text like '%' + '" + text + "' + '%' order by id"; - + if (text.startsWith(" ") || text.endsWith(" ")) { + text = text.trim(); + } + sql += "where upper(text) like upper('%" + text + "%') order by id"; + System.out.println(sql); return handle.createQuery(sql).mapToMap().list(); } @@ -55,7 +58,7 @@ public interface SearchDAO extends SqlObject { while (iterator.hasNext()) { Map.Entry next = iterator.next(); String key = next.getKey(); - Object value = next.getValue().toString(); + Object value = next.getValue() != null ? next.getValue().toString() : ""; if (key != "id" && key != "tablename" && value != null) { text += value + " "; } @@ -86,6 +89,7 @@ public interface SearchDAO extends SqlObject { sql += "'" + id + "',"; sql += "'" + text + "'"; sql += ")"; + System.out.println(sql); handle.createUpdate(sql).execute(); } @@ -114,6 +118,9 @@ public interface SearchDAO extends SqlObject { @SqlUpdate("delete from search where tablename = ? and id = ?") void deleteFromSearch(String tablename, String id); + @SqlUpdate("delete from search where tablename = ?") + void deleteByTablename(String tablename); + // default void bulkinsertSearch(String tablename, String id , List> datas) { // Handle handle = this.getHandle(); // } diff --git a/src/main/java/com/moze/rms/utils/ExcelExpoter.java b/src/main/java/com/moze/rms/utils/ExcelExpoter.java index c0a66ce..a3f5f70 100644 --- a/src/main/java/com/moze/rms/utils/ExcelExpoter.java +++ b/src/main/java/com/moze/rms/utils/ExcelExpoter.java @@ -199,7 +199,7 @@ public class ExcelExpoter { //寫入300000條後切換到下個工作表 if (rowNo % 300000 == 0) { System.out.println("Current Sheet:" + rowNo / 300000); - sheet = wb.createSheet("工作簿" + (rowNo / 300000));//建立新的sheet物件 + sheet = wb.createSheet("工作表1");//建立新的sheet物件 sheet = wb.getSheetAt(rowNo / 300000); //動態指定當前的工作表 pageRowNo = 0; //新建了工作表,重置工作表的行號為0 // -----------定義表頭----------- diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 8e042c2..ec38a5e 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -2,6 +2,6 @@ spring.datasource.url=jdbc:sqlserver://172.105.222.191:1433;databaseName=rms; spring.datasource.username=sa spring.datasource.password=Moze794064,! -server.port=8081 +server.port=8080