瀏覽代碼

结构调整

xusl 2 年之前
父節點
當前提交
8b48a4a281

+ 1 - 1
backend/src/main/java/com/jiayue/ssi/config/security/InterfaceLimit.java → backend/src/main/java/com/jiayue/ssi/annotation/InterfaceLimit.java

@@ -1,4 +1,4 @@
-package com.jiayue.ssi.config.security;
+package com.jiayue.ssi.annotation;
 /**
 * 接口访问频率注解,默认一分钟只能访问5次
 *

+ 12 - 10
backend/src/main/java/com/jiayue/ssi/config/security/InterfaceLimitAspect.java → backend/src/main/java/com/jiayue/ssi/aspectj/InterfaceLimitAspect.java

@@ -1,23 +1,25 @@
-package com.jiayue.ssi.config.security;
+package com.jiayue.ssi.aspectj;
 
-import com.jiayue.ssi.util.IPUtils;
-import com.jiayue.ssi.util.ResponseVO;
-import lombok.extern.slf4j.Slf4j;
-import net.jodah.expiringmap.ExpirationPolicy;
-import net.jodah.expiringmap.ExpiringMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.jiayue.ssi.annotation.InterfaceLimit;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Aspect;
 import org.aspectj.lang.annotation.Pointcut;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.web.context.request.RequestAttributes;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
+import com.jiayue.ssi.util.IPUtils;
+import com.jiayue.ssi.util.ResponseVO;
 
-import javax.servlet.http.HttpServletRequest;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.TimeUnit;
+import lombok.extern.slf4j.Slf4j;
+import net.jodah.expiringmap.ExpirationPolicy;
+import net.jodah.expiringmap.ExpiringMap;
 
 /**
  * 接口限制实现

+ 11 - 7
backend/src/main/java/com/jiayue/ssi/config/security/WebSecurityConfig.java → backend/src/main/java/com/jiayue/ssi/config/WebSecurityConfig.java

@@ -1,5 +1,13 @@
-package com.jiayue.ssi.config.security;
+package com.jiayue.ssi.config;
 
+import com.jiayue.ssi.filter.JwtAuthenticationTokenFilter;
+import com.jiayue.ssi.filter.MailCodeFilter;
+import com.jiayue.ssi.filter.VerifyCodeFilter;
+import com.jiayue.ssi.handler.CustomAuthenticationFailureHandler;
+import com.jiayue.ssi.handler.CustomAuthenticationSuccessHandler;
+import com.jiayue.ssi.handler.EntryPointUnauthorizedHandler;
+import com.jiayue.ssi.handler.RestAccessDeniedHandler;
+import com.jiayue.ssi.service.impl.UserServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -15,6 +23,7 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
 
+
 /**
 * WebSecurityConfig
 * @author xsl
@@ -32,14 +41,9 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
     EntryPointUnauthorizedHandler entryPointUnauthorizedHandler;
     @Autowired
     CustomAuthenticationSuccessHandler customAuthenticationSuccessHandler;
-//    @Autowired
-//    JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;
     @Autowired
     RestAccessDeniedHandler restAccessDeniedHandler;
-//    @Autowired
-//    VerifyCodeFilter verifyCodeFilter;
-//    @Autowired
-//    MailCodeFilter mailCodeFilter;
+
 
     @Bean
     public PasswordEncoder passwordEncoder() {

+ 0 - 3
backend/src/main/java/com/jiayue/ssi/controller/UserLoginController.java

@@ -1,6 +1,5 @@
 package com.jiayue.ssi.controller;
 
-import com.jiayue.ssi.config.security.InterfaceLimit;
 import com.jiayue.ssi.constant.CacheConstants;
 import com.jiayue.ssi.entity.SysUser;
 import com.jiayue.ssi.service.SysUserService;
@@ -46,7 +45,6 @@ public class UserLoginController {
      * @param httpServletResponse
      * @throws IOException
      */
-    @InterfaceLimit
     @GetMapping("/getVerifyCode")
     public ResponseVO getVerifyCode(HttpServletResponse httpServletResponse) throws IOException {
         // gif类型
@@ -93,7 +91,6 @@ public class UserLoginController {
      * @param httpServletResponse
      * @throws IOException
      */
-    @InterfaceLimit(time = 2000)
     @PostMapping("/getMailCode")
     public ResponseVO getMailCode(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
         throws Exception {

+ 11 - 9
backend/src/main/java/com/jiayue/ssi/config/security/JwtAuthenticationTokenFilter.java → backend/src/main/java/com/jiayue/ssi/filter/JwtAuthenticationTokenFilter.java

@@ -1,22 +1,24 @@
-package com.jiayue.ssi.config.security;
+package com.jiayue.ssi.filter;
 
-import com.jiayue.ssi.util.JwtTokenUtil;
-import lombok.RequiredArgsConstructor;
+import java.io.IOException;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.jiayue.ssi.service.impl.UserServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.annotation.Order;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
-import org.springframework.stereotype.Component;
 import org.springframework.util.StringUtils;
 import org.springframework.web.filter.OncePerRequestFilter;
+import com.jiayue.ssi.util.JwtTokenUtil;
 
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
+import lombok.RequiredArgsConstructor;
 
 /**
  * @description:

+ 15 - 19
backend/src/main/java/com/jiayue/ssi/config/security/MailCodeFilter.java → backend/src/main/java/com/jiayue/ssi/filter/MailCodeFilter.java

@@ -1,21 +1,20 @@
-package com.jiayue.ssi.config.security;
+package com.jiayue.ssi.filter;
 
-import com.jiayue.ssi.constant.CacheConstants;
-import com.jiayue.ssi.util.LocalCache;
-import lombok.RequiredArgsConstructor;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.core.annotation.Order;
-import org.springframework.security.authentication.AuthenticationServiceException;
-import org.springframework.stereotype.Component;
-import org.springframework.web.filter.GenericFilterBean;
+import java.io.IOException;
 
 import javax.servlet.FilterChain;
 import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.core.annotation.Order;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import com.jiayue.ssi.constant.CacheConstants;
+import com.jiayue.ssi.util.LocalCache;
+
+import lombok.RequiredArgsConstructor;
 
 /**
 * 邮箱口令过滤器
@@ -25,14 +24,11 @@ import java.io.IOException;
 */
 @RequiredArgsConstructor
 @Order(2)
-public class MailCodeFilter extends GenericFilterBean {
+public class MailCodeFilter extends OncePerRequestFilter {
     private String defaultFilterProcessUrl = "/user/login";
 
     @Override
-    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
-            throws IOException, ServletException {
-        HttpServletRequest request = (HttpServletRequest) req;
-        HttpServletResponse response = (HttpServletResponse) res;
+    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
         if ("POST".equalsIgnoreCase(request.getMethod()) && defaultFilterProcessUrl.equals(request.getServletPath())) {
             // 验证码验证
             String username = request.getParameter("username");
@@ -43,7 +39,7 @@ public class MailCodeFilter extends GenericFilterBean {
                 response.addHeader("Access-Control-Allow-Origin", "*");
                 response.setContentType("text/html;charset=UTF-8");
                 response.setStatus(401);
-                response.getWriter().write("邮箱口令无效!");
+                response.getWriter().write("邮箱口令无效,需要重新获取!");
                 return;
             }
             // 页面录入的邮箱口令
@@ -72,6 +68,6 @@ public class MailCodeFilter extends GenericFilterBean {
                 return;
             }
         }
-        chain.doFilter(request, response);
+        filterChain.doFilter(request, response);
     }
 }

+ 15 - 19
backend/src/main/java/com/jiayue/ssi/config/security/VerifyCodeFilter.java → backend/src/main/java/com/jiayue/ssi/filter/VerifyCodeFilter.java

@@ -1,21 +1,20 @@
-package com.jiayue.ssi.config.security;
+package com.jiayue.ssi.filter;
 
-import com.jiayue.ssi.constant.CacheConstants;
-import com.jiayue.ssi.util.LocalCache;
-import lombok.RequiredArgsConstructor;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.core.annotation.Order;
-import org.springframework.security.authentication.AuthenticationServiceException;
-import org.springframework.stereotype.Component;
-import org.springframework.web.filter.GenericFilterBean;
+import java.io.IOException;
 
 import javax.servlet.FilterChain;
 import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.core.annotation.Order;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import com.jiayue.ssi.constant.CacheConstants;
+import com.jiayue.ssi.util.LocalCache;
+
+import lombok.RequiredArgsConstructor;
 
 /**
 * 验证码过滤器
@@ -25,14 +24,11 @@ import java.io.IOException;
 */
 @RequiredArgsConstructor
 @Order(1)
-public class VerifyCodeFilter extends GenericFilterBean {
+public class VerifyCodeFilter extends OncePerRequestFilter {
     private String defaultFilterProcessUrl = "/user/login";
 
     @Override
-    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
-            throws IOException, ServletException {
-        HttpServletRequest request = (HttpServletRequest) req;
-        HttpServletResponse response = (HttpServletResponse) res;
+    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
         if ("POST".equalsIgnoreCase(request.getMethod()) && defaultFilterProcessUrl.equals(request.getServletPath())) {
             // 验证码验证
             String requestCaptcha = request.getParameter("code");
@@ -43,7 +39,7 @@ public class VerifyCodeFilter extends GenericFilterBean {
                 response.addHeader("Access-Control-Allow-Origin", "*");
                 response.setContentType("text/html;charset=UTF-8");
                 response.setStatus(401);
-                response.getWriter().write("验证码无效!");
+                response.getWriter().write("验证码无效,需要重新获取!");
                 return;
             }
             // 校验页面验证码
@@ -69,6 +65,6 @@ public class VerifyCodeFilter extends GenericFilterBean {
                 return;
             }
         }
-        chain.doFilter(request, response);
+        filterChain.doFilter(request, response);
     }
 }

+ 6 - 5
backend/src/main/java/com/jiayue/ssi/config/security/CustomAuthenticationFailureHandler.java → backend/src/main/java/com/jiayue/ssi/handler/CustomAuthenticationFailureHandler.java

@@ -1,13 +1,14 @@
-package com.jiayue.ssi.config.security;
+package com.jiayue.ssi.handler;
 
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
-import org.springframework.stereotype.Component;
+import java.io.IOException;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
+
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
+import org.springframework.stereotype.Component;
 
 /**
 * 失败认证处理

+ 12 - 9
backend/src/main/java/com/jiayue/ssi/config/security/CustomAuthenticationSuccessHandler.java → backend/src/main/java/com/jiayue/ssi/handler/CustomAuthenticationSuccessHandler.java

@@ -1,19 +1,22 @@
-package com.jiayue.ssi.config.security;
+package com.jiayue.ssi.handler;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
-import cn.hutool.json.JSONUtil;
-import com.jiayue.ssi.entity.SysUser;
-import com.jiayue.ssi.util.JwtTokenUtil;
-import com.jiayue.ssi.util.ResponseVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
 import org.springframework.stereotype.Component;
 
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
+import com.jiayue.ssi.entity.SysUser;
+import com.jiayue.ssi.util.JwtTokenUtil;
+import com.jiayue.ssi.util.ResponseVO;
+
+import cn.hutool.json.JSONUtil;
 
 /**
 * 成功认证处理

+ 6 - 5
backend/src/main/java/com/jiayue/ssi/config/security/EntryPointUnauthorizedHandler.java → backend/src/main/java/com/jiayue/ssi/handler/EntryPointUnauthorizedHandler.java

@@ -1,13 +1,14 @@
-package com.jiayue.ssi.config.security;
+package com.jiayue.ssi.handler;
 
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.web.AuthenticationEntryPoint;
-import org.springframework.stereotype.Service;
+import java.io.IOException;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
+
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.AuthenticationEntryPoint;
+import org.springframework.stereotype.Service;
 
 /**
  * 登录失败:解决匿名用户访问无权限资源时的异常

+ 4 - 4
backend/src/main/java/com/jiayue/ssi/config/security/RestAccessDeniedHandler.java → backend/src/main/java/com/jiayue/ssi/handler/RestAccessDeniedHandler.java

@@ -1,12 +1,12 @@
-package com.jiayue.ssi.config.security;
+package com.jiayue.ssi.handler;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
 import org.springframework.security.access.AccessDeniedException;
 import org.springframework.security.web.access.AccessDeniedHandler;
 import org.springframework.stereotype.Service;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 /**
  * 权限不足:认证过的用户访问无权限资源时的异常
  *

+ 5 - 4
backend/src/main/java/com/jiayue/ssi/config/security/UserServiceImpl.java → backend/src/main/java/com/jiayue/ssi/service/impl/UserServiceImpl.java

@@ -1,14 +1,15 @@
-package com.jiayue.ssi.config.security;
+package com.jiayue.ssi.service.impl;
 
-import com.jiayue.ssi.entity.SysUser;
-import com.jiayue.ssi.mapper.SysUserMapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.stereotype.Service;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.jiayue.ssi.entity.SysUser;
+import com.jiayue.ssi.mapper.SysUserMapper;
+
 /**
  * TODO
  *

+ 0 - 183
ui/src/views/history/index.vue

@@ -1,183 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-card class="box-carde">
-      <el-row>
-        <el-col :span="1"><span style="font-weight: bold;font-size: 14px">红号:</span></el-col>
-        <el-col :span="23">
-          <el-checkbox-group v-model="redCodeList">
-            <el-checkbox label="01"></el-checkbox>
-            <el-checkbox label="02"></el-checkbox>
-            <el-checkbox label="03"></el-checkbox>
-            <el-checkbox label="04"></el-checkbox>
-            <el-checkbox label="05"></el-checkbox>
-            <el-checkbox label="06"></el-checkbox>
-            <el-checkbox label="07"></el-checkbox>
-            <el-checkbox label="08"></el-checkbox>
-            <el-checkbox label="09"></el-checkbox>
-            <el-checkbox label="10"></el-checkbox>
-            <el-checkbox label="11"></el-checkbox>
-            <el-checkbox label="12"></el-checkbox>
-            <el-checkbox label="13"></el-checkbox>
-            <el-checkbox label="14"></el-checkbox>
-            <el-checkbox label="15"></el-checkbox>
-            <el-checkbox label="16"></el-checkbox>
-            <el-checkbox label="17"></el-checkbox>
-            <el-checkbox label="18"></el-checkbox>
-            <el-checkbox label="19"></el-checkbox>
-            <el-checkbox label="20"></el-checkbox>
-            <el-checkbox label="21"></el-checkbox>
-            <el-checkbox label="22"></el-checkbox>
-            <el-checkbox label="23"></el-checkbox>
-            <el-checkbox label="24"></el-checkbox>
-            <el-checkbox label="25"></el-checkbox>
-            <el-checkbox label="26"></el-checkbox>
-            <el-checkbox label="27"></el-checkbox>
-            <el-checkbox label="28"></el-checkbox>
-            <el-checkbox label="29"></el-checkbox>
-            <el-checkbox label="30"></el-checkbox>
-            <el-checkbox label="31"></el-checkbox>
-            <el-checkbox label="32"></el-checkbox>
-            <el-checkbox label="33"></el-checkbox>
-          </el-checkbox-group>
-        </el-col>
-      </el-row>
-      <el-divider></el-divider>
-      <el-row>
-        <el-col :span="1"><span style="font-weight: bold;font-size: 14px">蓝号:</span></el-col>
-        <el-col :span="2">
-          <el-select v-model="blueCode" clearable size="small">
-            <el-option
-              v-for="item in blueCodeList"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            />
-          </el-select>
-        </el-col>
-      </el-row>
-      <el-divider></el-divider>
-      <el-button
-        type="primary"
-        size="small"
-        style="round-clip: 10px"
-        :loading="btnLonding"
-        @click="getHistoryData"
-      >查询
-      </el-button>
-      <el-button
-        type="primary"
-        size="small"
-        style="round-clip: 10px"
-        :loading="btnLonding"
-        @click="reset"
-      >重置
-      </el-button>
-      <div style="padding-top: 10px">
-        <vxe-table
-          ref="sTable"
-          align="center"
-          :loading="loading"
-          class="mytable-style"
-          auto-resize
-          border
-          resizable
-          export-config
-          highlight-current-row
-          show-overflow
-          max-height="700"
-          :data="tableData"
-        >
-
-            <vxe-table-column field="issue" title="期数" width="10%"/>
-            <vxe-table-column field="rb1" title="红1" width="6%" />
-            <vxe-table-column field="rb2" title="红2" width="6%" />
-            <vxe-table-column field="rb3" title="红3" width="6%"/>
-            <vxe-table-column field="rb4" title="红4" width="6%"/>
-            <vxe-table-column field="rb5" title="红5" width="6%"/>
-            <vxe-table-column field="rb6" title="红6" width="6%"/>
-            <vxe-table-column field="bb" title="蓝" width="6%"/>
-            <vxe-table-column field="pfScale" title="红球奇偶比" width="6%"/>
-            <vxe-table-column field="intervalScale" title="区间比" width="6%"/>
-        </vxe-table>
-        <vxe-pager
-          v-show="showTable"
-          perfect
-          :current-page.sync="currentPage"
-          :page-size.sync="pageSize"
-          :total="total"
-          :page-sizes="[10,50,100]"
-          :layouts="['PrevJump', 'PrevPage','JumpNumber', 'NextPage', 'NextJump', 'Sizes', 'FullJump', 'Total']"
-          @page-change="handlePageChange"
-        ><!--v-show="!btnLonding"-->
-        </vxe-pager>
-      </div>
-
-    </el-card>
-  </div>
-</template>
-<script>
-
-export default {
-  data() {
-    return {
-      redCodeList:[],
-      blueCode:'',
-      blueCodeList: [{ value: '01', label: '01' }, { value: '02', label: '02' }, { value: '03', label: '03' }, { value: '04', label: '04' }, { value: '05', label: '05' }, { value: '06', label: '06' }, { value: '07', label: '07' }, { value: '08', label: '08' }, { value: '09', label: '09' }, { value: '10', label: '10' }, { value: '11', label: '11' }, { value: '12', label: '12' }, { value: '13', label: '13' }, { value: '14', label: '14' }, { value: '15', label: '15' }, { value: '16', label: '16' }],
-      loading: false,
-      showTable: true,
-      btnLonding: false,
-      tableData: [],
-      currentPage: 1,
-      pageSize: 10,
-      total: 0
-    }
-  },
-  created() {
-    // this.getHistoryData()
-  },
-  methods: {
-    reset(){
-      this.redCodeList = []
-      this.blueCode = ''
-    },
-    getHistoryData() {
-      if (this.redCodeList.length>0 && this.redCodeList.length!=6){
-        this.$message.warning('请选择6个红球')
-      }
-      else{
-        this.loading = true
-        this.saveLoding = false
-
-        this.$axios.post('/ssqDataController/' + this.currentPage + '/' + this.pageSize+'?redCodeList='+this.redCodeList+'&blueCode='+this.blueCode).then((res) => {
-          this.tableData = res.data.records
-          this.total = res.data.total
-          console.log('获取数据成功')
-          if (res.data.records == '') {
-            this.showTable = false
-          } else {
-            this.showTable = true
-          }
-          this.loading = false
-        }).catch((error) => {
-          this.$message.error('获取数据出错' + error)
-        })
-      }
-    },
-    handlePageChange({currentPage, pageSize}) {
-      this.currentPage = currentPage
-      this.pageSize = pageSize
-      this.getHistoryData()
-    },
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.app-container {
-}
-
-.pagination {
-  margin: 20px 0;
-  text-align: right;
-}
-</style>