- 本人建立了資料庫和後端部分,並根據業務邏輯前端專案進行了更改和改進,使其更適應我的資料庫
- 專案已部署至雲端:學生選課系統
- 第一次使用vue-cli開發項目,如果詳項目代碼存在不嚴謹或錯誤的地方,歡迎各位指出,共同討論
- 如果這個專案對您有幫助,請各位為本專案點一點star 、關註一下作者
Spring+SpringMVC+Mybatis+Mybatis-Plus(SSM)
Spring是一個開源框架,它是為了解決企業應用開發的複雜性而創建的。框架的主要優勢之一就是其分層架構,分層架構允許使用者選擇使用哪一個元件,同時為J2EE 應用程式開發提供整合的框架。 Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限於伺服器端的開發。從簡單性、可測試性和鬆散耦合的角度而言,任何Java應用都可以從Spring中受益。 Spring的核心是控制反轉(IoC)和麵向切面(AOP)。簡單來說,Spring是一個分層的JavaSE/EE一站式輕量級開源框架。
SpringMVC是spring框架的一個模組,SpringMVC和Spring無需透過中間整合層進行整合,SpringMVC是一個基於MVC的web框架,SpringMVC 擁有控制器,作用跟Struts類似,接收外部請求,解析參數傳給服務層。
MyBatis 是一款優秀的持久層框架,它支援自訂SQL、預存程序以及進階映射。 MyBatis 幾乎免除了幾乎所有的JDBC 程式碼以及設定參數和取得結果集的工作。 MyBatis 可以透過簡單的XML 或註解來配置和映射原始類型、介面和Java POJO(Plain Old Java Objects,普通老式Java 物件)為資料庫中的記錄。 MyBatis-Plus (簡稱MP)是一個MyBatis 的增強工具,在MyBatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。
持久層(Entity)+資料存取層(Dao)+業務邏輯層(Service)+控制層(Controller)
粗略的理解就是對一個或多個DAO進行的再次封裝,封裝成一個服務,封裝後就不會是一個原子操作了,需要事物控制,負責管理具體的功能
這裡根據需求編寫了管理員、課程、教師和學生的業務接口,在業務實現類別中根據上述Dao層編寫程式碼實現具體業務
<? xml version = " 1.0 " encoding = " UTF-8 " ?>
< beans xmlns = " http://www.springframework.org/schema/beans "
xmlns : context = " http://www.springframework.org/schema/context "
xmlns : aop = " http://www.springframework.org/schema/aop "
xmlns : tx = " http://www.springframework.org/schema/tx "
xmlns : xsi = " http://www.w3.org/2001/XMLSchema-instance "
xsi : schemaLocation = "
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd " >
<!-- IoC注解解析器 -->
< context : component-scan base-package = " com.gendml " />
<!-- DI注解解析器 -->
< context : annotation-config />
<!-- 加载数据库配置信息 -->
< context : property-placeholder location = " classpath:config/druid.properties " system-properties-mode = " NEVER " />
<!-- 连接池对象 -->
< bean id = " dataSource " class = " com.alibaba.druid.pool.DruidDataSource "
init-method = " init " destroy-method = " close " >
< property name = " driverClassName " value = " ${driverClassName} " />
< property name = " username " value = " ${username} " />
< property name = " password " value = " ${password} " />
< property name = " url " value = " ${url} " />
< property name = " initialSize " value = " ${initialSize} " />
< property name = " minIdle " value = " ${minIdle} " />
< property name = " maxActive " value = " ${maxActive} " />
<!--配置获取连接等待超时的时间-->
< property name = " maxWait " value = " ${maxWait} " />
<!--配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒-->
< property name = " timeBetweenEvictionRunsMillis " value = " ${timeBetweenEvictionRunsMillis} " />
<!--配置一个连接在池中最小生存的时间,单位是毫秒-->
< property name = " minEvictableIdleTimeMillis " value = " ${timeBetweenEvictionRunsMillis} " />
</ bean >
<!--配置sqlSessionFactory -->
< bean id = " sqlSessionFactory "
class = " com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean " >
< property name = " dataSource " ref = " dataSource " />
<!-- 加载xxMapper.xml -->
< property name = " mapperLocations " >
< array >
< value >classpath:mapper/*Mapper.xml</ value >
</ array >
</ property >
<!-- 配置分页插件 -->
< property name = " plugins " >
< array >
<!--传入分页拦截器-->
< bean class = " com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor " >
< property name = " interceptors " ref = " paginationInnerInterceptor " />
</ bean >
</ array >
</ property >
</ bean >
<!--分页拦截器-->
< bean id = " paginationInnerInterceptor " class = " com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor " >
< property name = " dbType " value = " MYSQL " />
</ bean >
<!-- Mapper接口代理扫描器-->
< bean class = " org.mybatis.spring.mapper.MapperScannerConfigurer " >
<!-- 需要生成代理类对象的mapper接口包 -->
< property name = " basePackage " value = " com.gendml.mapper " />
<!-- sqlSessionFactory 的name 用于为代理类中生成SqlSession -->
< property name = " sqlSessionFactoryBeanName " value = " sqlSessionFactory " />
</ bean >
<!-- MP 全局配置 -->
< bean id = " globalConfig " class = " com.baomidou.mybatisplus.core.config.GlobalConfig " >
<!-- 全局的主键策略 -->
< property name = " dbConfig " ref = " dbConfig " />
</ bean >
< bean id = " dbConfig " class = " com.baomidou.mybatisplus.core.config.GlobalConfig.DbConfig " >
<!--映射数据库下划线字段名到数据库实体类的驼峰命名的映射-->
< property name = " tableUnderline " value = " false " />
</ bean >
<!-- 配置事务 -->
< bean id = " txManager "
class = " org.springframework.jdbc.datasource.DataSourceTransactionManager " >
< property name = " dataSource " ref = " dataSource " />
</ bean >
</ beans >
<? xml version = " 1.0 " encoding = " UTF-8 " ?>
< beans xmlns = " http://www.springframework.org/schema/beans "
xmlns : xsi = " http://www.w3.org/2001/XMLSchema-instance " xmlns : p = " http://www.springframework.org/schema/p "
xmlns : context = " http://www.springframework.org/schema/context "
xmlns : mvc = " http://www.springframework.org/schema/mvc "
xsi : schemaLocation = " http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd " >
<!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->
< context : component-scan base-package = " com.gendml " />
<!--测试的时候把mvc注解掉-->
< mvc : annotation-driven >
< mvc : message-converters >
<!-- 处理响应中文内容乱码 -->
< bean class = " org.springframework.http.converter.StringHttpMessageConverter " >
< property name = " defaultCharset " value = " UTF-8 " />
< property name = " supportedMediaTypes " >
< list >
< value >text/html</ value >
< value >application/json</ value >
</ list >
</ property >
</ bean >
<!-- 配置Fastjson支持 -->
< bean class = " com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter " >
< property name = " charset " value = " UTF-8 " />
< property name = " supportedMediaTypes " >
< list >
< value >application/json</ value >
< value >text/html;charset=UTF-8</ value >
</ list >
</ property >
< property name = " features " >
< list >
< value >QuoteFieldNames</ value >
< value >WriteMapNullValue</ value >
< value >WriteDateUseDateFormat</ value >
< value >WriteEnumUsingToString</ value >
< value >DisableCircularReferenceDetect</ value >
</ list >
</ property >
</ bean >
</ mvc : message-converters >
</ mvc : annotation-driven >
</ beans >
Vue2.x+ElementUI+V-Charts
Vue.js是一款流行的JavaScript前端框架,是一個用於創建使用者介面的開源JavaScript框架,也是一個創建單頁應用的網頁應用框架。 Vue框架輕量、簡單易學、雙向資料綁定、組件化、資料和結構的分離、虛擬DOM、運行速度快,且Vue有著強大的生態圈。
Element是餓了嗎公司開發的一套為開發者、設計師和產品經理準備的基於Vue 2.0 的桌面端元件庫。
v-charts是基於Vue2.0 和Echarts 封裝的圖示元件,只需要統一提供對前後端都友善的資料格式設定簡單的配置項,就可以產生常見的圖表。
為了方便主頁間元件的跳轉,將登入註冊元件放在了一個單獨的vue子項目,同時配置登入和主頁的入口html文件,方便登陸的vue項目向主頁的vue項目的切換
由於我在完成後端開發時遇到跨域現象,所以配置了網絡代理,在axios中每次發出請求前加上“/api”前綴,這裡代理監聽“/api”前綴的請求,將請求代理到後端伺服器,並將原來的"/api"替換為空
將符合不到的路由統一轉送到noFound元件
首頁
學生頁面使用巢狀路由,student元件是父元件,四個子元件分別是四個功能:課表查詢(studentCourse)、選課(chooseClass)、成績管理(studentGrade)和個人資料修改(studentInfo)
教師頁面使用巢狀路由,teacher元件是父元件,六個子元件分別是六個功能:課表查詢(teacherCourse)、新增課程(addCourse)、新增上課時間(addClass)、成績管理(manageGrade)、輸入某個課程成績(manageGrade/:cid,參數cid表示課程id)和個人資訊修改(teacherInfo)
管理員頁面使用巢狀路由,admin元件是父元件,五個子元件分別是五個功能:概況(schoolInfo)、管理學生(manageStudent)、管理教師(manageTeacher)和管理系(manageFaculity)
路由鉤子函數beforeEach,我在編寫後端登入介面時,回應了一段uuid字串傳入sessionStorage,作為登入token驗證使用者是否處於登陸狀態,這裡的功能是每次在做路由轉送前檢查sessionStorage儲存的token ,如果存在那麼放行,如果不存在那麼透過上述配置的html入口檔案重定向到login元件
登陸完成會跳到主頁的Vue項目,我在主頁項目的父組件(App.vue)中在元素掛起前通過axios和讀取本地sessionStorage獲取用戶姓名、角色和id並將其放入state對象中(自訂的JSON物件),再將state物件和token存入sessionStorage中
在Vuex中定義state對象,由於Vuex裡定義的變數相當於頁面的局部變量,當頁面做刷新操作就會消失,所以這裡的state每次在消失後從session中取,保證了Vuex的持續且動態地使用