智能銷(xiāo)售系統(tǒng)(九)POI項(xiàng)目/數(shù)據(jù)字典

1.項(xiàng)目中添加POISpringMVC集成

?1.1?導(dǎo)出

???1.1.1?Employee
@Entity
@Table(name = "employee")
public class Employee extends BaseDomain{
    @Excel(name = "用戶(hù)名")//一定要和Excel表上面對(duì)應(yīng)上
    private String username;
    private String password;
    @Excel(name = "郵件")
    private String email;
    @Excel(name = "年齡")
    private Integer age;
    @Excel(name = "頭像",type = 2,savePath = "/images/head")
    private String headImage;//圖片  頭像

    @ManyToOne(fetch = FetchType.LAZY)//多對(duì)一.多個(gè)員工屬于一個(gè)部門(mén)
    @JoinColumn(name = "department_id")
    @ExcelEntity
    private Department department;//部門(mén)
  • Department
@Entity
@Table(name = "department")
public class Department extends BaseDomain{

    @Excel(name = "部門(mén)")
    private String name;
???1.1.2?準(zhǔn)備一個(gè)按鈕《導(dǎo)出》---Employss.jsp
<button type="submit" class="easyui-linkbutton" iconCls="icon-search">下載</button>
image.png
???1.1.3?EmployeeController加一個(gè)導(dǎo)出功能
    //download下載
    @RequestMapping("/download")
    public String download(ModelMap map, EmployeeQuery query, HttpServletRequest request){
        //要導(dǎo)出的數(shù)據(jù) 獲取到
        List<Employee> list = employeeService.queryAll(query);
        //主要是為了顯示頭像
        //拿到項(xiàng)目的運(yùn)行路徑-----【絕對(duì)路徑】
        String realPath = request.getServletContext().getRealPath("");//拿到運(yùn)行然后拼接
        //進(jìn)行拼接,把頭像的路徑e.getHeadImage()拼接出來(lái)----【遍歷導(dǎo)出的數(shù)據(jù)list】
        list.forEach(e->System.out.println(realPath + e.getHeadImage()));
        //設(shè)置導(dǎo)出的Excel的一些參數(shù),表頭、頁(yè)名、版本
        ExportParams exportParams = new ExportParams("title", "sheetName", ExcelType.XSSF);
        //這個(gè)就是導(dǎo)出來(lái)的數(shù)據(jù) 鎖定多少列。不可以動(dòng)
        exportParams.setFreezeCol(1);
        //數(shù)據(jù)集合
        map.put(NormalExcelConstants.DATA_LIST,list );
        //導(dǎo)出實(shí)體
        map.put(NormalExcelConstants.CLASS,Employee.class);
        //文件名稱(chēng)
        map.put(NormalExcelConstants.FILE_NAME,"employee");
        //參數(shù)
        map.put(NormalExcelConstants.PARAMS,exportParams);
        return NormalExcelConstants.EASYPOI_EXCEL_VIEW;
    }
}
???1.1.4?當(dāng)點(diǎn)擊導(dǎo)出的時(shí)候,出現(xiàn)報(bào)錯(cuò)
404--視圖解析器 自動(dòng)加了前綴后綴
????在配置一個(gè)視圖解析器【applicationController-mvc.xml】
    <!--新搞一個(gè)視圖解析器【但是現(xiàn)在兩個(gè)視圖器。所以要配置優(yōu)先級(jí)】-->
    <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
        <property name="order" value="1"/>
    </bean>

導(dǎo)出現(xiàn)在沒(méi)有頭像,因?yàn)轭^像找得是絕對(duì)路徑。他現(xiàn)在無(wú)法定位到,他找的是盤(pán)符。

  • EmployeeController中加上----拿到頭像路徑【把真實(shí)路徑拼接出來(lái)】
        //主要是為了顯示頭像
        //拿到項(xiàng)目的運(yùn)行路徑-----【絕對(duì)路徑】
        String realPath = request.getServletContext().getRealPath("");//拿到運(yùn)行然后拼接
        //進(jìn)行拼接,把頭像的路徑e.getHeadImage()拼接出來(lái)----【遍歷導(dǎo)出的數(shù)據(jù)list】
        list.forEach(e->System.out.println(realPath + e.getHeadImage()));
???1.1.5?根據(jù)查詢(xún)條件導(dǎo)出

把<a>標(biāo)簽 改成<button>
<button>----是直接提交表單 把路徑直接填到from表單上面
后臺(tái)在接收一下,在參數(shù)加上EmployeeQuery的參數(shù)。查詢(xún)的時(shí)候改成Query的根據(jù)條件查詢(xún)方法

?1.2?導(dǎo)入

???1.2.1?新建Controller
@Controller
@RequestMapping("/uploading")
public class uploadingController {
    @Autowired
    private IDepartmentService departmentService;
    @Autowired
    private IEmployeeService employeeService;

    @RequestMapping("/index")
    public String index(){
        return "uploading";
    }
}
???1.2.2?在WEB-INF/views/下面加一個(gè)頁(yè)面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <%@ include file="/WEB-INF/views/head.jsp"%>
</head>
<body>
<form action="/uploading/employeeJudge" method="post" enctype="multipart/form-data">
    <%--enctype="multipart/form-data ---【上傳就要加這個(gè)屬性】--%>
    <input class="easyui-filebox" name="empFile" style="width:80%"
           data-options="prompt:'選擇一個(gè)文件...',buttonText: '選擇文件'" />
    <button class="easyui-linkbutton">上傳</button>
</form>
</body>
</html>
上傳必須要加enctype="multipart/form-data"
???1.2.3?接收文件里面的數(shù)據(jù)
  • 在Controller中在加方法--拿到數(shù)據(jù)
    @RequestMapping("/employeeJudge")
    public String employeeJudge(MultipartFile empFile)throws Exception{
        ImportParams params = new ImportParams();
        params.setHeadRows(1);//不要第0行
        List<Employee> list = ExcelImportUtil.importExcel(empFile.getInputStream(), Employee.class, params);
        list.forEach(e->{
            Department department = e.getDepartment();//拿部門(mén)
            if (department!=null){
                String name = e.getDepartment().getName();//拿到部門(mén)名稱(chēng)
                Department byName = departmentService.findByName(name);//根據(jù)部門(mén)名稱(chēng)拿到對(duì)應(yīng)部門(mén)
                e.setDepartment(byName);//把部門(mén)放到員工對(duì)象去
            }
            employeeService.save(e);//把員工保存到數(shù)據(jù)庫(kù)
        });
        return "uploading";
    }
  • DepartmentRepository-----------Department findByName(String name);
  • IDepartmentService ----------- Department findByName(String name);
  • DepartmentServiceImpl
    @Autowired
    private DepartmentRepository departmentRepository;

    @Override
    public Department findByName(String name) {
        return departmentRepository.findByName(name);
    }
???1.2.4?在EmployeeServiceImpl的判斷里面加一句判斷

傳的時(shí)候會(huì)報(bào)錯(cuò)空指針,因?yàn)槟阍诒4娴臅r(shí)候加了密碼加密的方法。傳過(guò)去的時(shí)候沒(méi)有密碼,密碼為空 就報(bào)500空指針
我們?cè)贓mployeeServiceImpl設(shè)一個(gè)初始密碼

  • 就是一個(gè)三目運(yùn)算,如果有密碼就用它的,如果沒(méi)有密碼就設(shè)置初始密碼。。。。
//這里加一句代碼,設(shè)置初始面。因?yàn)樯蟼鲿r(shí)如果沒(méi)有密碼會(huì)報(bào)錯(cuò)---[三目運(yùn)算 如果有就用他的,沒(méi)有就默認(rèn)]
String password = StringUtils.isNotBlank(employee.getPassword())?employee.getPassword():"123456";

?1.3?Excel導(dǎo)入校驗(yàn)

導(dǎo)入的時(shí)候想要做一些驗(yàn)證。比如用戶(hù)名不能為空、年齡大于18小于60、郵件不能為空、用戶(hù)名不能重復(fù)

  • 我們要做的就是 導(dǎo)入---成功的話(huà)就不管,如果失敗的話(huà)就自動(dòng)下載一個(gè)文件,這個(gè)文件里面寫(xiě)著失敗的某條,并且把失敗原因?qū)懺诶锩?/li>
???1.3.1?導(dǎo)入規(guī)范包JSR 303
        <!--JSR 303  規(guī)范包-->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.2.4.Final</version>
        </dependency>
???1.3.2?Employee
    @Excel(name = "用戶(hù)名")//一定要和Excel表上面對(duì)應(yīng)上
    @NotNull//該字段不能為空
    private String username;
    private String password;
    @Excel(name = "郵件")
    @NotNull
    private String email;
    @Excel(name = "年齡")
    @Max(value = 60,message = "年齡不能超過(guò)60")
    @Min(value = 18,message = "年齡不能小于18")
    private Integer age;
???1.3.3?在Controller的方法中添加上驗(yàn)證
    //注入閘門(mén)寫(xiě)的工具類(lèi)  專(zhuān)門(mén)自定義的驗(yàn)證
    @Autowired
    private EmployeeExcelVerifyHandler handler;
    ...
      @RequestMapping("/employeeJudge")
    public String employeeJudge(MultipartFile empFile, HttpServletResponse response)throws Exception{
        ImportParams params = new ImportParams();
        params.setHeadRows(1);//不要第0行
        params.setNeedVerfiy(true);//讓他支持驗(yàn)證
        params.setVerifyHandler(handler);//加上咋們自己定義的驗(yàn)證
        //拿到導(dǎo)入的數(shù)據(jù)
        ExcelImportResult<Employee> result= ExcelImportUtil.importExcelMore(empFile.getInputStream(), Employee.class, params);
        //成功數(shù)據(jù)保存
        result.getList().forEach(e->{
            Department department = e.getDepartment();//拿部門(mén)
            if (department!=null){
                String name = e.getDepartment().getName();//拿到部門(mén)名稱(chēng)
                Department byName = departmentService.findByName(name);//根據(jù)部門(mén)名稱(chēng)拿到對(duì)應(yīng)部門(mén)
                e.setDepartment(byName);//把部門(mén)放到員工對(duì)象去
            }
            employeeService.save(e);//把員工保存到數(shù)據(jù)庫(kù)
        });

        //上面是正確了就保存,下面是錯(cuò)誤了,導(dǎo)出來(lái)
        boolean verfiyFail = result.isVerfiyFail();//確認(rèn)是否有錯(cuò)誤數(shù)據(jù)
        if (verfiyFail) {//判斷如果有錯(cuò)誤信息就。。執(zhí)行下面方法
            Workbook failWorkbook = result.getFailWorkbook();//當(dāng)判斷有就用流導(dǎo)出來(lái)
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setHeader("Content-disposition", "attachment;filename=employee.xlsx");
            response.setHeader("Pragma", "No-cache");//設(shè)置不要緩存
            OutputStream ouputStream = response.getOutputStream();
            failWorkbook.write(ouputStream);
            ouputStream.flush();
            ouputStream.close();
        }
        return "uploading";
    }
???1.3.4?唯一性校驗(yàn)
  • 上面只是判斷了不為空可年齡范圍,下面來(lái)規(guī)范用戶(hù)名不重復(fù)(唯一性校驗(yàn))

  • 新建接口----【工具類(lèi)EmployeeExcelVerifyHandler 】

/**
 * 自定義驗(yàn)證
 */
@Component//不知道什么層 的注解
public class EmployeeExcelVerifyHandler implements IExcelVerifyHandler<Employee>{

    @Autowired
    private IEmployeeService employeeService;

    @Override
    public ExcelVerifyHandlerResult verifyHandler(Employee employee) {
        ExcelVerifyHandlerResult excelVerifyHandlerResult = new ExcelVerifyHandlerResult(true);

        //通過(guò)用戶(hù)名獲取用戶(hù)
        Employee byUsername = employeeService.findByUsername(employee.getUsername());

        if (byUsername!=null){
            //excelVerifyHandlerResult不為空,就代表這個(gè)用戶(hù)是存在的,就應(yīng)該添加失敗
            excelVerifyHandlerResult = new ExcelVerifyHandlerResult(false,"用戶(hù)名重復(fù)");
        }
        return excelVerifyHandlerResult;
    }
}

掃描之后就可以加入注入

  • 成功之后直接接入
  • 如果有錯(cuò)誤數(shù)據(jù)---導(dǎo)出打印


    SpringMVC掃描

2、數(shù)據(jù)字典

  • 對(duì)于相同的表的抽取,注:沒(méi)有什么業(yè)務(wù)意義的


EasyUIPOI官方文檔:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,657評(píng)論 1 32
  • 手動(dòng)不易,轉(zhuǎn)發(fā)請(qǐng)注明出處 --Trance 數(shù)據(jù)庫(kù)系統(tǒng)命令: (1).查看存儲(chǔ)過(guò)程狀態(tài):show pro...
    Trance_b54c閱讀 1,828評(píng)論 0 8
  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說(shuō)明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常。 O...
    我想起個(gè)好名字閱讀 5,971評(píng)論 0 9
  • 1. 組件版本和配置策略 組件版本: Kubernetes 1.10.4 Docker 18.03.1-ce Et...
    Anson前行閱讀 5,951評(píng)論 0 11
  • CloudJavaBackendSummaries1、開(kāi)發(fā)環(huán)境eclipse工程,引入jw倉(cāng)庫(kù)的jw-base,3...
    燕京博士閱讀 1,507評(píng)論 0 0

友情鏈接更多精彩內(nèi)容