• vue搭建项目、创建登录页面和后台交互之引入axios


    目录

    1. 搭建项目

    1.1 使用vue-cli创建项目

    1.2 通过npm安装element-ui

    1.3 导入组件

    2 创建登录页面

    2.1 创建登录组件

    2.2 引入css(css.txt)

    2.3 配置路由

    2.4 在Login组件中将提交按键调整为100%宽度

    2.5 运行效果

    3. 后台交互

    3.1 引入axios

    3.2 axios/qs/vue-axios安装与使用

    3.2.1 安装axios

    3.2.2 发送get请求:

    3.2.3 发送post请求:

    3.2.4解决方法一

     3.2.5运行结果

    3.2.6解决方法二

    3.2.4 简化axios使用

    4.全部代码

    4.1 idea的pom文件代码

    4.2 登录界面的代码


    1. 搭建项目


    工程方式搭建项目,请将测试需要用的后台web服务程序事先准备好。

    具体搭建项目可以查看我上一篇文章

    1.1 使用vue-cli创建项目


    在命令行,到自己的vue工程存放的目录,运行一下命令,前提是vue-cli先安装好。

    vue init webpack vuepro
    

    1.2 通过npm安装element-ui


    npm install element-ui -S
    

     

    如果安装成功就会有此配置 

    1.3 导入组件


    打开 src目录下的main.js,该文件是项目的入口文件,所以在这里导入,其他组件均可使用,不用再导入。

    1. import Vue from 'vue'
    2. //新添
    3. import ElementUI from 'element-ui'
    4. //新增
    5. import 'element-ui/lib/theme-chalk/index.css'
    6. //新增
    7. Vue.use(ElementUI)
    8. 。。。

    此‘element-ui’就是图中的这个名称

    2 创建登录页面


    2.1 创建登录组件


    1) 新建views目录,在目录上右击,选择新建vue(简单模块)创建Login

    1. <template>
    2. </template>
    3. <script>
    4. </script>
    5. <style>
    6. </style>

    2)在element-ui组件,在form组件中找到与登录页面类似的组件,拷贝代码到刚新建的Login组件中,修改为自己需要的登录页面,页面包含:账户,密码, 提交按钮

    1. <template>
    2. <div>
    3. <el-form >
    4. <el-form-item label="账户" >
    5. <el-input type="password" v-model="userName" autocomplete="off"></el-input>
    6. </el-form-item>
    7. <el-form-item label="密码" >
    8. <el-input type="password" v-model="passWord" autocomplete="off"></el-input>
    9. </el-form-item>
    10. <el-form-item>
    11. <el-button type="primary" @click="submitForm('ruleForm')">提交</el-button>
    12. </el-form-item>
    13. </el-form>
    14. </div>
    15. </template>
    16. <script>
    17. export default {
    18. name: 'Login',
    19. data: function() {
    20. return {
    21. userName: null,
    22. passWord: null,
    23. }
    24. },
    25. methods: {
    26. submitForm: function() {
    27. console.log("fdfdd");
    28. }
    29. }
    30. }
    31. </script>
    32. <style>
    33. </style>

    2.2 引入css(css.txt)


    按照css.txt中的说明进行引入,用于控制样式,加入样式

     

    base64编码:
    基于64个可打印字符来表示二进制数据,用于传输8Bit字节代码,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。

    2.3 配置路由


    router/index.js

    1. import Vue from 'vue'
    2. import Router from 'vue-router'
    3. import HelloWorld from '@/components/HelloWorld'
    4. //首先导入组件
    5. import Login from '@/views/Login'
    6. Vue.use(Router)
    7. export default new Router({
    8. routes: [
    9. {
    10. //配置路由,根路径访问Login组件
    11. path: '/',
    12. name: 'Login',
    13. component: Login
    14. }
    15. ]
    16. })

    2.4 在Login组件中将提交按键调整为100%宽度


    <el-button type="primary" @click="submitForm('ruleForm')" style="width:100%">提交</el-button>
    

    2.5 运行效果


    在项目目录,运行一下命令,启动服务:

    npm run dev
    

    界面效果:

     

    3. 后台交互


    3.1 引入axios


    axios是vue2提倡使用的轻量版的ajax。它是基于promise的HTTP库。它会从浏览器中创建XMLHttpRequests,与Vue配合使用非常好。
    vue.js有著名的全家桶系列:vue-router,vuex, vue-resource,再加上构建工具vue-cli,就是一个完整的vue项目的核心构成。其中vue-resource是Vue.js的一款插件,它可以通过XMLHttpRequest或JSONP发起请求并处理响应,但在vue更新到2.0之后,作者就宣告不再对vue-resource更新,而是推荐的axios

     安装成功后可以在此配置中查看

    3.2 axios/qs/vue-axios安装与使用


    注:
    qs.js它是一个url参数转化的js库。用法就两个:

    1. var obj = qs.parse('a=b&c=d'); //将URL解析成对象的形式:{a:'b',c:'d'}
    2. var str = qs.stringify(obj); //将对象 序列化成URL的形式,以&进行拼接:a=b&c=d'

    vue-axios是在axios基础上扩展的插件,在Vue.prototype原型上扩展了$http等属性,可以更加方便的使用axios

    3.2.1 安装axios


    npm install axios -S
    

    2)在Login组件中导入axios

    1. import axios from 'axios'
    2. export default {
    3. ......

    3.2.2 发送get请求:


    在提交按钮的监听函数中加入发送get请求的代码:

    1. //请求url,需要保证服务可用
    2. let url = 'http://localhost:8080/webserver/userMsg/userAction!login.action';
    3. //注意数据是保存到json对象的params属性
    4. axios.get(url, {
    5. params: {
    6. userNo: this.userNo,
    7. userPwd: this.userPwd
    8. }
    9. }).then(function(response) {
    10. console.log(response);
    11. }).catch(function(error) {
    12. console.log(error);
    13. });

    请注意下面图上的错误信息,请求发生了跨域错误问题:

     

    跨域请求问题:
    因为我们采用的是前后端分离的方式进行开发,前端和后端分别泡在不同的服务器上,基于安全性考虑,浏览器有同源策略,所以出现了跨域问题。
    同源策略[same origin policy]是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。 同源策略是浏览器安全的基石。

    4)跨域问题的处理
    在filter中处理跨域问题,关键代码:

    1. // Access-Control-Allow-Origin就是我们需要设置的域名
    2. // Access-Control-Allow-Headers跨域允许包含的头。
    3. // Access-Control-Allow-Methods是允许的请求方式
    4. httpResponse.setHeader("Access-Control-Allow-Origin", "*");// *,任何域名
    5. httpResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    6. httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE");
    7. filterChain.doFilter(servletRequest, servletResponse);

     

    在课件资料中提供了CorsFilter,配置到web.xml中,对所以请求进行拦截处理,可解决跨域问题。注意:请配置在struts中央控制器之前

    3.2.3 发送post请求:


    1. //注意数据是直接保存到json对象
    2. axios.post(url, {
    3. userNo: 'admin',
    4. userPwd: '123'
    5. }).then(function(response) {
    6. console.log(response);
    7. }).catch(function(error) {
    8. console.log(error);
    9. });

     

    输入的测试账号和密码均正确,使用get发送请求获取的响应为“密码正确”,但post方式发送的请求获取的响应为“密码不正确”!

     

    预检请求代码 

    原因:上图所示,因为使用app/json的方式用post,那么会提交两次

     

    第一次是有值

     第二次是空值

     


    原因分析:通过观察控制台可以发现,post发送请求时,请求参数是以json格式通过request payload进行传送的,的struts的并没有处理这种方式传递的参数(起码是我们使用的struts版本),所以传递到服务器的参数并没有得到有效的解析。

    3.2.4解决方法一


     加个@RequestBody 

     3.2.5运行结果


     

     但是还是提交了两次,第一次还是预检请求,第二次i才是真正的提交

    3.2.6解决方法二


     

    导入qs 

    写一个params和paramStr 

     

     

     

     只有提交一次了,但是不是json的格式提交了,现在是表单的方式提交了(也就是qs库改的)

    也就是这里,使用qs将json转换成了表单的方式提交了

    问题处理:
    第一种方式: 在服务端编码实现request payload参数解析。在BaseAction中加入一个方法,该方法从request payload中获取json数据,并转化为指定的类。

    1. public Object getRequestBody(Class clazz) {   
    2.         BufferedReader br;
    3.         HttpServletRequest request = ServletActionContext.getRequest();
    4.         try {
    5.             br = request.getReader();
    6.             String str, aStr = "";
    7.             while((str = br.readLine()) != null){
    8.                 aStr += str;
    9.             }
    10.             System.out.println(aStr);
    11.             Object obj = JSONObject.parseObject(aStr, clazz);
    12.             return obj;
    13.         } catch (IOException e) {
    14.            throw new RuntimeException("获取请求参数异常: " + e);
    15.         }
    16.     }

    获取参数时调用该方法获取

    User user = (User)this.getRequestBody(User.class);
    

    第二种方式:使用qs.js库,将{a:'b',c:'d'}转换成'a=b&c=d'。
    1) 安装qs和vue-axios

    1. npm install qs -S
    2. npm install vue-axios -S

     

    再此配置可查看         

    安装成功后会在package.json中“dependencies”中会看到安装的新库。
    在提交请求时使用qs对json对象进行转换

    1. //注意数据是直接保存到json对象
    2. let params = {
    3. userNo: 'admin',
    4. userPwd: '123'
    5. };
    6. //参数格式转换
    7. let paramStr = qs.stringify(params);
    8. console.log(paramStr);
    9. //提交时使用转换之后的参数
    10. axios.post(url, paramStr).then(function(response) {
    11. console.log(response);
    12. }).catch(function(error) {
    13. console.log(error);
    14. });

    观察控制台中的输出,已经将json格式转化为&连接的格式。查看返回结果是否是预期值。

    3.2.4 简化axios使用


    为简化axios使用,还可以使用axios全局配置及拦截器

    1) 安装vue-axios

    npm install vue-axios -S
    

     

    在这可查看 

    2) 将随课件提供的api目录考到src根路径下

     

    现在可以将在Login组件中的导入axios和qs语句删除, action.js和http.js的配置详见代码中的注释。

    3)将action中的配置修改为自己的后台服务配置

    1. export default {
    2. 'SERVER': 'http://localhost:8080/webserver', //服务器
    3. 'SYSTEM_USER_DOLOGIN': '/userMsg/userAction!login.action', //登陆
    4. 'SYSTEM_USER_DOREG': '/userAction.action', //注册
    5. //获取完整的请求地址
    6. 'getFullPath': k => { //获得请求的完整地址,用于mockjs测试时使用
    7. return this.SERVER + this[k];
    8. }
    9. }

    4)配置main.js

    1. import Vue from 'vue'
    2. //vue项目对axios的全局配置(增加配置)
    3. import axios from '@/api/http'
    4. import VueAxios from 'vue-axios'
    5. Vue.use(VueAxios,axios)
    6. ......

    5) 在提交时不需要手动处理转换,全局配置进行转换。

    1. //修改url的获取方式,url已经配置在了action.js中,这里只要指定action路径
    2. //服务地址和服务上下文已经在http.js中设置了axios.defaults.baseURL,
    3. //axios会根据配置自动获取。
    4. let url = this.axios.urls.SYSTEM_USER_DOLOGIN;
    5. this.axios.post(url, params).then(resp => {
    6. console.log(resp);
    7. }).catch(resp => {});

    6)发生post请求,测试

    作业:
    1、全局方式配置要配出来,后续需要使用axios的拦截器处理token。
    2、搭建基于ssh2的后台框架,后面的课程会用到。

    4.全部代码


    4.1 idea的pom文件代码


    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <groupId>com.zkinggroupId>
    6. <artifactId>vueserverartifactId>
    7. <version>1.0-SNAPSHOTversion>
    8. <packaging>warpackaging>
    9. <name>vueserver Maven Webappname>
    10. <url>http://www.example.comurl>
    11. <properties>
    12. <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    13. <maven.compiler.source>1.8maven.compiler.source>
    14. <maven.compiler.target>1.8maven.compiler.target>
    15. <shiro-version>1.2.5shiro-version>
    16. <spring-version>5.3.18spring-version>
    17. properties>
    18. <dependencies>
    19. <dependency>
    20. <groupId>org.springframeworkgroupId>
    21. <artifactId>spring-contextartifactId>
    22. <version>${spring-version}version>
    23. dependency>
    24. <dependency>
    25. <groupId>org.springframeworkgroupId>
    26. <artifactId>spring-webartifactId>
    27. <version>${spring-version}version>
    28. dependency>
    29. <dependency>
    30. <groupId>org.springframeworkgroupId>
    31. <artifactId>spring-webmvcartifactId>
    32. <version>${spring-version}version>
    33. dependency>
    34. <dependency>
    35. <groupId>org.springframeworkgroupId>
    36. <artifactId>spring-ormartifactId>
    37. <version>${spring-version}version>
    38. dependency>
    39. <dependency>
    40. <groupId>org.springframeworkgroupId>
    41. <artifactId>spring-testartifactId>
    42. <version>${spring-version}version>
    43. dependency>
    44. <dependency>
    45. <groupId>org.springframeworkgroupId>
    46. <artifactId>spring-aspectsartifactId>
    47. <version>${spring-version}version>
    48. dependency>
    49. <dependency>
    50. <groupId>junitgroupId>
    51. <artifactId>junitartifactId>
    52. <version>4.12version>
    53. <scope>testscope>
    54. dependency>
    55. <dependency>
    56. <groupId>jstlgroupId>
    57. <artifactId>jstlartifactId>
    58. <version>1.2version>
    59. dependency>
    60. <dependency>
    61. <groupId>taglibsgroupId>
    62. <artifactId>standardartifactId>
    63. <version>1.1.2version>
    64. dependency>
    65. <dependency>
    66. <groupId>org.apache.commonsgroupId>
    67. <artifactId>commons-dbcp2artifactId>
    68. <version>2.1.1version>
    69. <exclusions>
    70. <exclusion>
    71. <artifactId>commons-pool2artifactId>
    72. <groupId>org.apache.commonsgroupId>
    73. exclusion>
    74. exclusions>
    75. dependency>
    76. <dependency>
    77. <groupId>org.apache.commonsgroupId>
    78. <artifactId>commons-pool2artifactId>
    79. <version>2.4.3version>
    80. dependency>
    81. <dependency>
    82. <groupId>org.mybatisgroupId>
    83. <artifactId>mybatisartifactId>
    84. <version>3.5.6version>
    85. dependency>
    86. <dependency>
    87. <groupId>org.mybatisgroupId>
    88. <artifactId>mybatis-springartifactId>
    89. <version>2.0.6version>
    90. dependency>
    91. <dependency>
    92. <groupId>com.belerwebgroupId>
    93. <artifactId>pinyin4jartifactId>
    94. <version>2.5.0version>
    95. dependency>
    96. <dependency>
    97. <groupId>org.projectlombokgroupId>
    98. <artifactId>lombokartifactId>
    99. <version>1.18.22version>
    100. <scope>providedscope>
    101. dependency>
    102. <dependency>
    103. <groupId>org.slf4jgroupId>
    104. <artifactId>slf4j-apiartifactId>
    105. <version>1.7.36version>
    106. dependency>
    107. <dependency>
    108. <groupId>ch.qos.logbackgroupId>
    109. <artifactId>logback-classicartifactId>
    110. <version>1.2.10version>
    111. <exclusions>
    112. <exclusion>
    113. <artifactId>slf4j-apiartifactId>
    114. <groupId>org.slf4jgroupId>
    115. exclusion>
    116. exclusions>
    117. dependency>
    118. <dependency>
    119. <groupId>mysqlgroupId>
    120. <artifactId>mysql-connector-javaartifactId>
    121. <version>5.1.44version>
    122. dependency>
    123. <dependency>
    124. <groupId>com.github.pagehelpergroupId>
    125. <artifactId>pagehelperartifactId>
    126. <version>5.1.2version>
    127. dependency>
    128. <dependency>
    129. <groupId>javax.servletgroupId>
    130. <artifactId>javax.servlet-apiartifactId>
    131. <version>4.0.1version>
    132. <scope>providedscope>
    133. dependency>
    134. <dependency>
    135. <groupId>commons-fileuploadgroupId>
    136. <artifactId>commons-fileuploadartifactId>
    137. <version>1.3.3version>
    138. dependency>
    139. <dependency>
    140. <groupId>org.hibernategroupId>
    141. <artifactId>hibernate-validatorartifactId>
    142. <version>6.0.7.Finalversion>
    143. dependency>
    144. <dependency>
    145. <groupId>com.fasterxml.jackson.coregroupId>
    146. <artifactId>jackson-databindartifactId>
    147. <version>2.13.1version>
    148. dependency>
    149. <dependency>
    150. <groupId>org.apache.shirogroupId>
    151. <artifactId>shiro-coreartifactId>
    152. <version>${shiro-version}version>
    153. <exclusions>
    154. <exclusion>
    155. <artifactId>slf4j-apiartifactId>
    156. <groupId>org.slf4jgroupId>
    157. exclusion>
    158. exclusions>
    159. dependency>
    160. <dependency>
    161. <groupId>org.apache.shirogroupId>
    162. <artifactId>shiro-webartifactId>
    163. <version>${shiro-version}version>
    164. dependency>
    165. <dependency>
    166. <groupId>org.apache.shirogroupId>
    167. <artifactId>shiro-springartifactId>
    168. <version>${shiro-version}version>
    169. dependency>
    170. <dependency>
    171. <groupId>org.apache.shirogroupId>
    172. <artifactId>shiro-ehcacheartifactId>
    173. <version>${shiro-version}version>
    174. dependency>
    175. <dependency>
    176. <groupId>org.springframeworkgroupId>
    177. <artifactId>spring-context-supportartifactId>
    178. <version>${spring-version}version>
    179. dependency>
    180. dependencies>
    181. <build>
    182. <finalName>vueserverfinalName>
    183. <pluginManagement>
    184. <plugins>
    185. <plugin>
    186. <artifactId>maven-clean-pluginartifactId>
    187. <version>3.1.0version>
    188. plugin>
    189. <plugin>
    190. <artifactId>maven-resources-pluginartifactId>
    191. <version>3.0.2version>
    192. plugin>
    193. <plugin>
    194. <artifactId>maven-compiler-pluginartifactId>
    195. <version>3.8.0version>
    196. plugin>
    197. <plugin>
    198. <artifactId>maven-surefire-pluginartifactId>
    199. <version>2.22.1version>
    200. plugin>
    201. <plugin>
    202. <artifactId>maven-war-pluginartifactId>
    203. <version>3.2.2version>
    204. plugin>
    205. <plugin>
    206. <artifactId>maven-install-pluginartifactId>
    207. <version>2.5.2version>
    208. plugin>
    209. <plugin>
    210. <artifactId>maven-deploy-pluginartifactId>
    211. <version>2.8.2version>
    212. plugin>
    213. plugins>
    214. pluginManagement>
    215. build>
    216. project>

    4.2 登录界面的代码


    1. <template>
    2. <div class="login-wrap">
    3. <el-form class="login-container">
    4. <h1 class="title">用户登录h1>
    5. <el-form-item label="账户">
    6. <el-input type="text" v-model="userNo" autocomplete="off">el-input>
    7. el-form-item>
    8. <el-form-item label="密码">
    9. <el-input type="password" v-model="passWord" autocomplete="off">el-input>
    10. el-form-item>
    11. <el-form-item>
    12. <el-button type="primary" @click="submitForm()" style="width: 100%;">提交el-button>
    13. el-form-item>
    14. <el-row style="text-align:center;margin-top: -5px;">
    15. <el-link type="primary" style="margin-right: 40px;">忘记密码el-link>
    16. <el-link type="primary" @click="toRegister">用户注册el-link>
    17. el-row>
    18. el-form>
    19. div>
    20. template>
    21. <script>
    22. import axios from 'axios'
    23. import qs from 'qs'
    24. export default {
    25. name: 'Login',
    26. data() {
    27. return {
    28. userNo: '',
    29. passWord: ''
    30. }
    31. },
    32. methods: {
    33. submitForm() {
    34. //请求url,需要保证服务可用
    35. let url = this.axios.urls.SYSTEM_USER_DOLOGIN;
    36. //注意数据是保存到json对象的params属性
    37. let params = {
    38. userNo: this.userNo,
    39. userPwd: this.passWord
    40. };
    41. // let paramStr = qs.stringify(params);
    42. this.axios.post(url,params ).then(function(response) {
    43. console.log(response);
    44. }).catch(function(error) {
    45. console.log(error);
    46. });
    47. },
    48. toRegister: function() {
    49. this.$router.push("/Register");
    50. }
    51. }
    52. }
    53. script>
    54. <style>
    55. .login-wrap {
    56. box-sizing: border-box;
    57. width: 100%;
    58. height: 100%;
    59. padding-top: 10%;
    60. background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjEzNjFweCIgaGVpZ2h0PSI2MDlweCIgdmlld0JveD0iMCAwIDEzNjEgNjA5IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0Ni4yICg0NDQ5NikgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+R3JvdXAgMjE8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz48L2RlZnM+CiAgICA8ZyBpZD0iQW50LURlc2lnbi1Qcm8tMy4wIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0i6LSm5oi35a+G56CB55m75b2VLeagoemqjCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTc5LjAwMDAwMCwgLTgyLjAwMDAwMCkiPgogICAgICAgICAgICA8ZyBpZD0iR3JvdXAtMjEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDc3LjAwMDAwMCwgNzMuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8ZyBpZD0iR3JvdXAtMTgiIG9wYWNpdHk9IjAuOCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzQuOTAxNDE2LCA1NjkuNjk5MTU4KSByb3RhdGUoLTcuMDAwMDAwKSB0cmFuc2xhdGUoLTc0LjkwMTQxNiwgLTU2OS42OTkxNTgpIHRyYW5zbGF0ZSg0LjkwMTQxNiwgNTI1LjE5OTE1OCkiPgogICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIGlkPSJPdmFsLTExIiBmaWxsPSIjQ0ZEQUU2IiBvcGFjaXR5PSIwLjI1IiBjeD0iNjMuNTc0ODc5MiIgY3k9IjMyLjQ2ODM2NyIgcng9IjIxLjc4MzA0NzkiIHJ5PSIyMS43NjYwMDgiPjwvZWxsaXBzZT4KICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBpZD0iT3ZhbC0zIiBmaWxsPSIjQ0ZEQUU2IiBvcGFjaXR5PSIwLjU5OTk5OTk2NCIgY3g9IjUuOTg3NDY0NzkiIGN5PSIxMy44NjY4NjAxIiByeD0iNS4yMTczOTEzIiByeT0iNS4yMTMzMDk5NyI+PC9lbGxpcHNlPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0zOC4xMzU0NTE0LDg4LjM1MjAyMTUgQzQzLjg5ODQyMjcsODguMzUyMDIxNSA0OC41NzAyMzQsODMuNjgzODY0NyA0OC41NzAyMzQsNzcuOTI1NDAxNSBDNDguNTcwMjM0LDcyLjE2NjkzODMgNDMuODk4NDIyNyw2Ny40OTg3ODE2IDM4LjEzNTQ1MTQsNjcuNDk4NzgxNiBDMzIuMzcyNDgwMSw2Ny40OTg3ODE2IDI3LjcwMDY2ODgsNzIuMTY2OTM4MyAyNy43MDA2Njg4LDc3LjkyNTQwMTUgQzI3LjcwMDY2ODgsODMuNjgzODY0NyAzMi4zNzI0ODAxLDg4LjM1MjAyMTUgMzguMTM1NDUxNCw4OC4zNTIwMjE1IFoiIGlkPSJPdmFsLTMtQ29weSIgZmlsbD0iI0NGREFFNiIgb3BhY2l0eT0iMC40NSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02NC4yNzc1NTgyLDMzLjE3MDQ5NjMgTDExOS4xODU4MzYsMTYuNTY1NDkxNSIgaWQ9IlBhdGgtMTIiIHN0cm9rZT0iI0NGREFFNiIgc3Ryb2tlLXdpZHRoPSIxLjczOTEzMDQzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNDIuMTQzMTcwOCwyNi41MDAyNjgxIEw3LjcxMTkwMTYyLDE0LjU2NDA3MDIiIGlkPSJQYXRoLTE2IiBzdHJva2U9IiNFMEI0QjciIHN0cm9rZS13aWR0aD0iMC43MDI2Nzg5NjQiIG9wYWNpdHk9IjAuNyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2UtZGFzaGFycmF5PSIxLjQwNTM1Nzg5OTg3MzE1MywyLjEwODAzNjk1MzQ2OTk4MSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02My45MjYyMTg3LDMzLjUyMTU2MSBMNDMuNjcyMTMyNiw2OS4zMjUwOTUxIiBpZD0iUGF0aC0xNSIgc3Ryb2tlPSIjQkFDQUQ5IiBzdHJva2Utd2lkdGg9IjAuNzAyNjc4OTY0IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1kYXNoYXJyYXk9IjEuNDA1MzU3ODk5ODczMTUzLDIuMTA4MDM2OTUzNDY5OTgxIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwLTE3IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMjYuODUwOTIyLCAxMy41NDM2NTQpIHJvdGF0ZSgzMC4wMDAwMDApIHRyYW5zbGF0ZSgtMTI2Ljg1MDkyMiwgLTEzLjU0MzY1NCkgdHJhbnNsYXRlKDExNy4yODU3MDUsIDQuMzgxODg5KSIgZmlsbD0iI0NGREFFNiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIGlkPSJPdmFsLTQiIG9wYWNpdHk9IjAuNDUiIGN4PSI5LjEzNDgyNjUzIiBjeT0iOS4xMjc2ODA3NiIgcng9IjkuMTM0ODI2NTMiIHJ5PSI5LjEyNzY4MDc2Ij48L2VsbGlwc2U+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xOC4yNjk2NTMxLDE4LjI1NTM2MTUgQzE4LjI2OTY1MzEsMTMuMjE0MjgyNiAxNC4xNzk4NTE5LDkuMTI3NjgwNzYgOS4xMzQ4MjY1Myw5LjEyNzY4MDc2IEM0LjA4OTgwMTE0LDkuMTI3NjgwNzYgMCwxMy4yMTQyODI2IDAsMTguMjU1MzYxNSBMMTguMjY5NjUzMSwxOC4yNTUzNjE1IFoiIGlkPSJPdmFsLTQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDkuMTM0ODI3LCAxMy42OTE1MjEpIHNjYWxlKC0xLCAtMSkgdHJhbnNsYXRlKC05LjEzNDgyNywgLTEzLjY5MTUyMSkgIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwLTE0IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMTYuMjk0NzAwLCAxMjMuNzI1NjAwKSByb3RhdGUoLTUuMDAwMDAwKSB0cmFuc2xhdGUoLTIxNi4yOTQ3MDAsIC0xMjMuNzI1NjAwKSB0cmFuc2xhdGUoMTA2LjI5NDcwMCwgMzUuMjI1NjAwKSI+CiAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgaWQ9Ik92YWwtMiIgZmlsbD0iI0NGREFFNiIgb3BhY2l0eT0iMC4yNSIgY3g9IjI5LjExNzY0NzEiIGN5PSIyOS4xNDAyNDM5IiByeD0iMjkuMTE3NjQ3MSIgcnk9IjI5LjE0MDI0MzkiPjwvZWxsaXBzZT4KICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBpZD0iT3ZhbC0yIiBmaWxsPSIjQ0ZEQUU2IiBvcGFjaXR5PSIwLjMiIGN4PSIyOS4xMTc2NDcxIiBjeT0iMjkuMTQwMjQzOSIgcng9IjIxLjU2ODYyNzUiIHJ5PSIyMS41ODUzNjU5Ij48L2VsbGlwc2U+CiAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgaWQ9Ik92YWwtMi1Db3B5IiBzdHJva2U9IiNDRkRBRTYiIG9wYWNpdHk9IjAuNCIgY3g9IjE3OS4wMTk2MDgiIGN5PSIxMzguMTQ2MzQxIiByeD0iMjMuNzI1NDkwMiIgcnk9IjIzLjc0MzkwMjQiPjwvZWxsaXBzZT4KICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBpZD0iT3ZhbC0yIiBmaWxsPSIjQkFDQUQ5IiBvcGFjaXR5PSIwLjUiIGN4PSIyOS4xMTc2NDcxIiBjeT0iMjkuMTQwMjQzOSIgcng9IjEwLjc4NDMxMzciIHJ5PSIxMC43OTI2ODI5Ij48L2VsbGlwc2U+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTI5LjExNzY0NzEsMzkuOTMyOTI2OCBMMjkuMTE3NjQ3MSwxOC4zNDc1NjEgQzIzLjE2MTYzNTEsMTguMzQ3NTYxIDE4LjMzMzMzMzMsMjMuMTc5NjA5NyAxOC4zMzMzMzMzLDI5LjE0MDI0MzkgQzE4LjMzMzMzMzMsMzUuMTAwODc4MSAyMy4xNjE2MzUxLDM5LjkzMjkyNjggMjkuMTE3NjQ3MSwzOS45MzI5MjY4IFoiIGlkPSJPdmFsLTIiIGZpbGw9IiNCQUNBRDkiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8ZyBpZD0iR3JvdXAtOSIgb3BhY2l0eT0iMC40NSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTcyLjAwMDAwMCwgMTMxLjAwMDAwMCkiIGZpbGw9IiNFNkExQTYiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBpZD0iT3ZhbC0yLUNvcHktMiIgY3g9IjcuMDE5NjA3ODQiIGN5PSI3LjE0NjM0MTQ2IiByeD0iNi40NzA1ODgyNCIgcnk9IjYuNDc1NjA5NzYiPjwvZWxsaXBzZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTAuNTQ5MDE5NjA4LDEzLjYyMTk1MTIgQzQuMTIyNjI2ODEsMTMuNjIxOTUxMiA3LjAxOTYwNzg0LDEwLjcyMjcyMiA3LjAxOTYwNzg0LDcuMTQ2MzQxNDYgQzcuMDE5NjA3ODQsMy41Njk5NjA5NSA0LjEyMjYyNjgxLDAuNjcwNzMxNzA3IDAuNTQ5MDE5NjA4LDAuNjcwNzMxNzA3IEwwLjU0OTAxOTYwOCwxMy42MjE5NTEyIFoiIGlkPSJPdmFsLTItQ29weS0yIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzLjc4NDMxNCwgNy4xNDYzNDEpIHNjYWxlKC0xLCAxKSB0cmFuc2xhdGUoLTMuNzg0MzE0LCAtNy4xNDYzNDEpICI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBpZD0iT3ZhbC0xMCIgZmlsbD0iI0NGREFFNiIgY3g9IjIxOC4zODIzNTMiIGN5PSIxMzguNjg1OTc2IiByeD0iMS42MTc2NDcwNiIgcnk9IjEuNjE4OTAyNDQiPjwvZWxsaXBzZT4KICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBpZD0iT3ZhbC0xMC1Db3B5LTIiIGZpbGw9IiNFMEI0QjciIG9wYWNpdHk9IjAuMzUiIGN4PSIxNzkuNTU4ODI0IiBjeT0iMTc1LjM4MTA5OCIgcng9IjEuNjE3NjQ3MDYiIHJ5PSIxLjYxODkwMjQ0Ij48L2VsbGlwc2U+CiAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgaWQ9Ik92YWwtMTAtQ29weSIgZmlsbD0iI0UwQjRCNyIgb3BhY2l0eT0iMC4zNSIgY3g9IjE4MC4wOTgwMzkiIGN5PSIxMDIuNTMwNDg4IiByeD0iMi4xNTY4NjI3NSIgcnk9IjIuMTU4NTM2NTkiPjwvZWxsaXBzZT4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMjguOTk4NTM4MSwyOS45NjcxNTk4IEwxNzEuMTUxMDE4LDEzMi44NzYwMjQiIGlkPSJQYXRoLTExIiBzdHJva2U9IiNDRkRBRTYiIG9wYWNpdHk9IjAuOCI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwLTEwIiBvcGFjaXR5PSIwLjc5OTk5OTk1MiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTA1NC4xMDA2MzUsIDM2LjY1OTMxNykgcm90YXRlKC0xMS4wMDAwMDApIHRyYW5zbGF0ZSgtMTA1NC4xMDA2MzUsIC0zNi42NTkzMTcpIHRyYW5zbGF0ZSgxMDI2LjYwMDYzNSwgNC42NTkzMTcpIj4KICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBpZD0iT3ZhbC03IiBzdHJva2U9IiNDRkRBRTYiIHN0cm9rZS13aWR0aD0iMC45NDExNzY0NzEiIGN4PSI0My44MTM1NTkzIiBjeT0iMzIiIHJ4PSIxMS4xODY0NDA3IiByeT0iMTEuMjk0MTE3NiI+PC9lbGxpcHNlPgogICAgICAgICAgICAgICAgICAgIDxnIGlkPSJHcm91cC0xMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzQuNTk2Nzc0LCAyMy4xMTExMTEpIiBmaWxsPSIjQkFDQUQ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgaWQ9Ik92YWwtNyIgb3BhY2l0eT0iMC40NSIgY3g9IjkuMTg1MzQ3MTgiIGN5PSI4Ljg4ODg4ODg5IiByeD0iOC40NzQ1NzYyNyIgcnk9IjguNTU2MTQ5NzMiPjwvZWxsaXBzZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTkuMTg1MzQ3MTgsMTcuNDQ1MDM4NiBDMTMuODY1NzI2NCwxNy40NDUwMzg2IDE3LjY1OTkyMzUsMTMuNjE0MzE5OSAxNy42NTk5MjM1LDguODg4ODg4ODkgQzE3LjY1OTkyMzUsNC4xNjM0NTc4NyAxMy44NjU3MjY0LDAuMzMyNzM5MTU2IDkuMTg1MzQ3MTgsMC4zMzI3MzkxNTYgTDkuMTg1MzQ3MTgsMTcuNDQ1MDM4NiBaIiBpZD0iT3ZhbC03Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0zNC42NTk3Mzg1LDI0LjgwOTY5NCBMNS43MTY2NjA4NCw0Ljc2ODc4OTQ1IiBpZD0iUGF0aC0yIiBzdHJva2U9IiNDRkRBRTYiIHN0cm9rZS13aWR0aD0iMC45NDExNzY0NzEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBpZD0iT3ZhbCIgc3Ryb2tlPSIjQ0ZEQUU2IiBzdHJva2Utd2lkdGg9IjAuOTQxMTc2NDcxIiBjeD0iMy4yNjI3MTE4NiIgY3k9IjMuMjk0MTE3NjUiIHJ4PSIzLjI2MjcxMTg2IiByeT0iMy4yOTQxMTc2NSI+PC9lbGxpcHNlPgogICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIGlkPSJPdmFsLUNvcHkiIGZpbGw9IiNGN0UxQUQiIGN4PSIyLjc5NjYxMDE3IiBjeT0iNjEuMTc2NDcwNiIgcng9IjIuNzk2NjEwMTciIHJ5PSIyLjgyMzUyOTQxIj48L2VsbGlwc2U+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTM0LjYzMTI0NDMsMzkuMjkyMjcxMiBMNS4wNjM2NjY2Myw1OS43ODUwODIiIGlkPSJQYXRoLTEwIiBzdHJva2U9IiNDRkRBRTYiIHN0cm9rZS13aWR0aD0iMC45NDExNzY0NzEiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDxnIGlkPSJHcm91cC0xOSIgb3BhY2l0eT0iMC4zMyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTI4Mi41MzcyMTksIDQ0Ni41MDI4NjcpIHJvdGF0ZSgtMTAuMDAwMDAwKSB0cmFuc2xhdGUoLTEyODIuNTM3MjE5LCAtNDQ2LjUwMjg2NykgdHJhbnNsYXRlKDExNDIuNTM3MjE5LCAzMjcuNTAyODY3KSI+CiAgICAgICAgICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwLTE3IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNDEuMzMzNTM5LCAxMDQuNTAyNzQyKSByb3RhdGUoMjc1LjAwMDAwMCkgdHJhbnNsYXRlKC0xNDEuMzMzNTM5LCAtMTA0LjUwMjc0MikgdHJhbnNsYXRlKDEyOS4zMzM1MzksIDkyLjUwMjc0MikiIGZpbGw9IiNCQUNBRDkiPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsLTQiIG9wYWNpdHk9IjAuNDUiIGN4PSIxMS42NjY2NjY3IiBjeT0iMTEuNjY2NjY2NyIgcj0iMTEuNjY2NjY2NyI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMy4zMzMzMzMzLDIzLjMzMzMzMzMgQzIzLjMzMzMzMzMsMTYuODkwMDExMyAxOC4xMDk5ODg3LDExLjY2NjY2NjcgMTEuNjY2NjY2NywxMS42NjY2NjY3IEM1LjIyMzM0NDU5LDExLjY2NjY2NjcgMCwxNi44OTAwMTEzIDAsMjMuMzMzMzMzMyBMMjMuMzMzMzMzMywyMy4zMzMzMzMzIFoiIGlkPSJPdmFsLTQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDExLjY2NjY2NywgMTcuNTAwMDAwKSBzY2FsZSgtMSwgLTEpIHRyYW5zbGF0ZSgtMTEuNjY2NjY3LCAtMTcuNTAwMDAwKSAiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC01LUNvcHktNiIgZmlsbD0iI0NGREFFNiIgY3g9IjIwMS44MzMzMzMiIGN5PSI4Ny41IiByPSI1LjgzMzMzMzMzIj48L2NpcmNsZT4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTQzLjUsODguODEyNjY4NSBMMTU1LjA3MDUwMSwxNy42MDM4NTQ0IiBpZD0iUGF0aC0xNyIgc3Ryb2tlPSIjQkFDQUQ5IiBzdHJva2Utd2lkdGg9IjEuMTY2NjY2NjciPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTcuNSwzNy4zMzMzMzMzIEwxMjcuNDY2MjUyLDk3LjY0NDk3MzUiIGlkPSJQYXRoLTE4IiBzdHJva2U9IiNCQUNBRDkiIHN0cm9rZS13aWR0aD0iMS4xNjY2NjY2NyI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwb2x5bGluZSBpZD0iUGF0aC0xOSIgc3Ryb2tlPSIjQ0ZEQUU2IiBzdHJva2Utd2lkdGg9IjEuMTY2NjY2NjciIHBvaW50cz0iMTQzLjkwMjU5NyAxMjAuMzAyMjgxIDE3NC45MzU0NTUgMjMxLjU3MTM0MiAzOC41IDE0Ny41MTA4NDcgMTI2LjM2Njk0MSAxMTAuODMzMzMzIj48L3BvbHlsaW5lPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNTkuODMzMzMzLDk5Ljc0NTM4NDIgTDE5NS40MTY2NjcsODkuMjUiIGlkPSJQYXRoLTIwIiBzdHJva2U9IiNFMEI0QjciIHN0cm9rZS13aWR0aD0iMS4xNjY2NjY2NyIgb3BhY2l0eT0iMC42Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTIwNS4zMzMzMzMsODIuMTM3MjEwNSBMMjM4LjcxOTQwNiwzNi4xNjY2NjY3IiBpZD0iUGF0aC0yNCIgc3Ryb2tlPSIjQkFDQUQ5IiBzdHJva2Utd2lkdGg9IjEuMTY2NjY2NjciPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMjY2LjcyMzQyNCwxMzIuMjMxOTg4IEwyMDcuMDgzMzMzLDkwLjQxNjY2NjciIGlkPSJQYXRoLTI1IiBzdHJva2U9IiNDRkRBRTYiIHN0cm9rZS13aWR0aD0iMS4xNjY2NjY2NyI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwtNSIgZmlsbD0iI0MxRDFFMCIgY3g9IjE1Ni45MTY2NjciIGN5PSI4Ljc1IiByPSI4Ljc1Ij48L2NpcmNsZT4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsLTUtQ29weS0zIiBmaWxsPSIjQzFEMUUwIiBjeD0iMzkuMDgzMzMzMyIgY3k9IjE0OC43NSIgcj0iNS4yNSI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC01LUNvcHktMiIgZmlsbC1vcGFjaXR5PSIwLjYiIGZpbGw9IiNEMURFRUQiIGN4PSI4Ljc1IiBjeT0iMzMuMjUiIHI9IjguNzUiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwtNS1Db3B5LTQiIGZpbGwtb3BhY2l0eT0iMC42IiBmaWxsPSIjRDFERUVEIiBjeD0iMjQzLjgzMzMzMyIgY3k9IjMwLjMzMzMzMzMiIHI9IjUuODMzMzMzMzMiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwtNS1Db3B5LTUiIGZpbGw9IiNFMEI0QjciIGN4PSIxNzUuNTgzMzMzIiBjeT0iMjMyLjc1IiByPSI1LjI1Ij48L2NpcmNsZT4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+);
    61. /* background-color: #112346; */
    62. background-repeat: no-repeat;
    63. background-position: center right;
    64. background-size: 100%;
    65. }
    66. .login-container {
    67. border-radius: 10px;
    68. margin: 0px auto;
    69. width: 350px;
    70. padding: 30px 35px 15px 35px;
    71. background: #fff;
    72. border: 1px solid #eaeaea;
    73. text-align: left;
    74. box-shadow: 0 0 20px 2px rgba(0, 0, 0, 0.1);
    75. }
    76. .title {
    77. margin: 0px auto 40px auto;
    78. text-align: center;
    79. color: #505458;
    80. }
    81. .remember {
    82. margin: 0px 0px 35px 0px;
    83. }
    84. .code-box {
    85. text-align: right;
    86. }
    87. .codeimg {
    88. height: 40px;
    89. }
    90. .title {
    91. text-align: center;
    92. }
    93. style>

    4.3 applicationContext-base.xml代码


    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    4. xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    6. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
    7. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
    8. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
    9. <context:component-scan base-package="com.zking">
    10. <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    11. context:component-scan>
    12. <context:property-placeholder location="classpath:jdbc.properties"/>
    13. <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
    14. destroy-method="close">
    15. <property name="driverClassName" value="${jdbc.driver}"/>
    16. <property name="url" value="${jdbc.url}"/>
    17. <property name="username" value="${jdbc.username}"/>
    18. <property name="password" value="${jdbc.password}"/>
    19. <property name="initialSize" value="10"/>
    20. <property name="maxTotal" value="100"/>
    21. <property name="maxIdle" value="50"/>
    22. <property name="minIdle" value="10"/>
    23. <property name="maxWaitMillis" value="-1"/>
    24. <property name="testWhileIdle" value="true">property>
    25. <property name="validationQuery" value="select 1">property>
    26. bean>
    27. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    28. <property name="dataSource" ref="dataSource"/>
    29. <property name="mapperLocations" value="classpath:/mapper/**/*.xml"/>
    30. <property name="plugins">
    31. <array>
    32. <bean class="com.github.pagehelper.PageInterceptor">
    33. <property name="properties">
    34. <value>
    35. helperDialect=mysql
    36. value>
    37. property>
    38. bean>
    39. array>
    40. property>
    41. bean>
    42. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    43. <property name="basePackage" value="com/zking/**/mapper"/>
    44. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    45. bean>
    46. <aop:aspectj-autoproxy/>
    47. <bean id="transactionManager"
    48. class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    49. <property name="dataSource" ref="dataSource"/>
    50. bean>
    51. <tx:annotation-driven transaction-manager="transactionManager"/>
    52. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    53. <property name="defaultEncoding" value="UTF-8">property>
    54. <property name="maxUploadSize" value="52428800">property>
    55. <property name="resolveLazily" value="true"/>
    56. bean>
    57. beans>

    4.4 spring-mvc代码

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:mvc="http://www.springframework.org/schema/mvc"
    6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    7. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    8. <context:component-scan base-package="com.zking" use-default-filters="false">
    9. <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    10. context:component-scan>
    11. <mvc:annotation-driven>mvc:annotation-driven>
    12. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    13. <property name="viewClass"
    14. value="org.springframework.web.servlet.view.JstlView">property>
    15. <property name="prefix" value="/WEB-INF/page/"/>
    16. <property name="suffix" value=".jsp"/>
    17. bean>
    18. <mvc:resources location="/static/" mapping="/static/**" cache-period="31536000"/>
    19. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    20. <property name="messageConverters">
    21. <list>
    22. <ref bean="mappingJackson2HttpMessageConverter"/>
    23. list>
    24. property>
    25. bean>
    26. <bean id="mappingJackson2HttpMessageConverter"
    27. class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    28. <property name="supportedMediaTypes">
    29. <list>
    30. <value>text/html;charset=UTF-8value>
    31. <value>text/json;charset=UTF-8value>
    32. <value>application/json;charset=UTF-8value>
    33. list>
    34. property>
    35. bean>
    36. beans>

    4.5 防止post请求提交两次的过滤器


    1. package com.zking.vueserver.util;
    2. import java.io.IOException;
    3. import javax.servlet.Filter;
    4. import javax.servlet.FilterChain;
    5. import javax.servlet.FilterConfig;
    6. import javax.servlet.ServletException;
    7. import javax.servlet.ServletRequest;
    8. import javax.servlet.ServletResponse;
    9. import javax.servlet.http.HttpServletRequest;
    10. import javax.servlet.http.HttpServletResponse;
    11. /**
    12. * 配置tomcat允许跨域访问
    13. *
    14. * @author Administrator
    15. *
    16. */
    17. public class CorsFilter implements Filter {
    18. @Override
    19. public void init(FilterConfig filterConfig) throws ServletException {
    20. }
    21. @Override
    22. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
    23. throws IOException, ServletException {
    24. HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
    25. HttpServletRequest req = (HttpServletRequest) servletRequest;
    26. // Access-Control-Allow-Origin就是我们需要设置的域名
    27. // Access-Control-Allow-Headers跨域允许包含的头。
    28. // Access-Control-Allow-Methods是允许的请求方式
    29. httpResponse.setHeader("Access-Control-Allow-Origin", "*");// *,任何域名
    30. httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE");
    31. httpResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept,jwt");
    32. //允许客户端,处理一个新的响应头jwt
    33. httpResponse.setHeader("Access-Control-Expose-Headers", "jwt");
    34. // axios的ajax会发两次请求,第一次提交方式为:option,直接返回即可
    35. if ("OPTIONS".equals(req.getMethod())) {
    36. return;
    37. }
    38. filterChain.doFilter(servletRequest, servletResponse);
    39. }
    40. @Override
    41. public void destroy() {
    42. }
    43. }
    1. <filter>
    2. <filter-name>corsFilterfilter-name>
    3. <filter-class>com.zking.vueserver.util.CorsFilterfilter-class>
    4. filter>
    5. <filter-mapping>
    6. <filter-name>corsFilterfilter-name>
    7. <url-pattern>/*url-pattern>
    8. filter-mapping>

    web.xml中过滤器的配置

     

  • 相关阅读:
    Python中跨越多个文件使用全局变量
    C++的8个基础语法
    Pytorch入门(3)—— 构造网络模型
    代码随想录笔记_动态规划_494目标和
    MATLAB向量化编程基础精讲教程
    ELK安装、部署、调试(五)filebeat的安装与配置
    元宇宙简介
    数学建模不会 LaTex 排版 | 教你如何在 Word 中优雅地使用漂亮的 LaTex 公式
    [CISCN2019 华北赛区 Day1 Web1]Dropbox
    入门学习XSS漏洞,这一篇就够了
  • 原文地址:https://blog.csdn.net/qq_62881798/article/details/127094475