Drew há 6 anos atrás
pai
commit
3ddb4a59cf
26 ficheiros alterados com 264 adições e 307 exclusões
  1. 6 0
      pom.xml
  2. 2 2
      src/main/java/com/izouma/ticketExchange/Application.java
  3. 2 2
      src/main/java/com/izouma/ticketExchange/config/WebMvcConfig.java
  4. 31 0
      src/main/java/com/izouma/ticketExchange/config/WxMaConfiguration.java
  5. 14 0
      src/main/java/com/izouma/ticketExchange/config/WxMaProperties.java
  6. 1 1
      src/main/java/com/izouma/ticketExchange/repo/MenuRepo.java
  7. 4 3
      src/main/java/com/izouma/ticketExchange/security/Authority.java
  8. 93 6
      src/main/java/com/izouma/ticketExchange/service/UserService.java
  9. 1 12
      src/main/java/com/izouma/ticketExchange/utils/ObjUtils.java
  10. 20 6
      src/main/java/com/izouma/ticketExchange/web/AuthenticationController.java
  11. 19 8
      src/main/java/com/izouma/ticketExchange/web/UserController.java
  12. 4 2
      src/main/java/com/izouma/ticketExchange/web/WxController.java
  13. 3 3
      src/main/resources/application.yaml
  14. 1 1
      src/main/resources/templates/ControllerTemplate.ftl
  15. 1 1
      src/main/vue/public/index.html
  16. 0 1
      src/main/vue/src/App.vue
  17. 3 6
      src/main/vue/src/components/SysMenu.vue
  18. 1 1
      src/main/vue/src/main.js
  19. 6 1
      src/main/vue/src/router.js
  20. 1 1
      src/main/vue/src/styles/app.less
  21. 0 44
      src/main/vue/src/styles/operation.less
  22. 47 181
      src/main/vue/src/views/Admin.vue
  23. 1 2
      src/main/vue/src/views/Menus.vue
  24. 0 20
      src/main/vue/src/views/UserEdit.vue
  25. 1 1
      src/test/java/com/izouma/ticketExchange/ApplicationTests.java
  26. 2 2
      src/test/java/com/izouma/ticketExchange/service/sms/SmsServiceTest.java

+ 6 - 0
pom.xml

@@ -136,6 +136,12 @@
             <version>${javawx.version}</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-miniapp</artifactId>
+            <version>${javawx.version}</version>
+        </dependency>
+
         <dependency>
             <groupId>com.github.binarywang</groupId>
             <artifactId>weixin-java-pay</artifactId>

+ 2 - 2
src/main/java/com/izouma/ticketExchange/TicketExchangeApplication.java → src/main/java/com/izouma/ticketExchange/Application.java

@@ -8,10 +8,10 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2;
 @SpringBootApplication
 @EnableJpaAuditing
 @EnableSwagger2
-public class TicketExchangeApplication {
+public class Application {
 
     public static void main(String[] args) {
-        SpringApplication.run(TicketExchangeApplication.class, args);
+        SpringApplication.run(Application.class, args);
     }
 
 }

+ 2 - 2
src/main/java/com/izouma/ticketExchange/config/WebMvcConfig.java

@@ -30,10 +30,10 @@ public class WebMvcConfig implements WebMvcConfigurer {
     public Docket createApi() {
         return new Docket(DocumentationType.SWAGGER_2)
                 .apiInfo(new ApiInfoBuilder()
-                                 .title("筑梦居接口文档")
+                                 .title("接口文档")
                                  .version("1.0.0")
                                  .termsOfServiceUrl("#")
-                                 .description("筑梦居接口文档")
+                                 .description("接口文档")
                                  .build())
                 .select()
                 .apis(RequestHandlerSelectors.basePackage("com.izouma.ticketExchange.web"))

+ 31 - 0
src/main/java/com/izouma/ticketExchange/config/WxMaConfiguration.java

@@ -0,0 +1,31 @@
+package com.izouma.ticketExchange.config;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
+import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
+import com.izouma.ticketExchange.mpHandler.LogHandler;
+import lombok.AllArgsConstructor;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@AllArgsConstructor
+@Configuration
+@EnableConfigurationProperties(WxMaProperties.class)
+public class WxMaConfiguration {
+    private final WxMaProperties properties;
+
+    @Bean
+    public WxMaService wxMaService() {
+        WxMaService service = new WxMaServiceImpl();
+        WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
+        config.setAppid(properties.getAppId());
+        config.setSecret(properties.getAppSecret());
+        config.setToken(properties.getMsgToken());
+        config.setAesKey(properties.getMsgAesKey());
+        config.setMsgDataFormat(properties.getMsgFormat());
+        service.setWxMaConfig(config);
+        return service;
+    }
+
+}

+ 14 - 0
src/main/java/com/izouma/ticketExchange/config/WxMaProperties.java

@@ -0,0 +1,14 @@
+package com.izouma.ticketExchange.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "wx.ma")
+public class WxMaProperties {
+    private String appId;
+    private String appSecret;
+    private String msgToken;
+    private String msgAesKey;
+    private String msgFormat;
+}

+ 1 - 1
src/main/java/com/izouma/ticketExchange/repo/MenuRepo.java

@@ -13,6 +13,6 @@ public interface MenuRepo extends JpaRepository<Menu, Long> {
     @Where(clause = "enabled = 1")
     List<Menu> findByNameAndRootTrue(String name);
 
-    @Query(nativeQuery = true, value = "SELECT max(sort + 1) FROM menu")
+    @Query(nativeQuery = true, value = "SELECT ifnull(max(sort + 1),1) FROM menu")
     int nextSort();
 }

+ 4 - 3
src/main/java/com/izouma/ticketExchange/security/Authority.java

@@ -18,12 +18,13 @@ import java.util.Objects;
 @Builder
 public class Authority implements Serializable {
     public enum NAMES {
-        ROLE_USER,ROLE_DEV, ROLE_ADMIN
+        ROLE_USER, ROLE_DEV, ROLE_ADMIN
     }
 
     @Id
     @Size(max = 50)
     @NotNull
+    @Column(length = 50)
     private String name;
 
     @Override
@@ -48,7 +49,7 @@ public class Authority implements Serializable {
     @Override
     public String toString() {
         return "Authority{" +
-               "name='" + name + '\'' +
-               "}";
+                "name='" + name + '\'' +
+                "}";
     }
 }

+ 93 - 6
src/main/java/com/izouma/ticketExchange/service/UserService.java

@@ -1,30 +1,45 @@
 package com.izouma.ticketExchange.service;
 
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
+import com.izouma.ticketExchange.config.Constants;
 import com.izouma.ticketExchange.domain.User;
 import com.izouma.ticketExchange.exception.BusinessException;
 import com.izouma.ticketExchange.repo.UserRepo;
 import com.izouma.ticketExchange.security.Authority;
 import com.izouma.ticketExchange.service.sms.SmsService;
+import com.izouma.ticketExchange.service.storage.StorageService;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
 import me.chanjar.weixin.mp.bean.result.WxMpUser;
+import org.apache.commons.lang3.RandomStringUtils;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
 import java.util.Collections;
+import java.util.Date;
 import java.util.UUID;
 
 @Service
 @Slf4j
 @AllArgsConstructor
 public class UserService {
-    private UserRepo    userRepo;
-    private WxMpService wxMpService;
-    private SmsService  smsService;
+    private UserRepo       userRepo;
+    private WxMaService    wxMaService;
+    private WxMpService    wxMpService;
+    private SmsService     smsService;
+    private StorageService storageService;
 
-    public User loginByCode(String code) throws WxErrorException {
+    public User loginByPhone(String phone) {
+        return userRepo.findByPhone(phone);
+    }
+
+    public User loginMp(String code) throws WxErrorException {
         WxMpOAuth2AccessToken accessToken = wxMpService.oauth2getAccessToken(code);
         WxMpUser wxMpUser = wxMpService.oauth2getUserInfo(accessToken, null);
         User user = userRepo.findByOpenId(wxMpUser.getOpenId());
@@ -47,7 +62,79 @@ public class UserService {
         return user;
     }
 
-    public User loginByPhone(String phone) {
-        return userRepo.findByPhone(phone);
+    public User loginMa(String code) {
+        try {
+            WxMaJscode2SessionResult result = wxMaService.jsCode2SessionInfo(code);
+            String openId = result.getOpenid();
+            String sessionKey = result.getSessionKey();
+            User userInfo = userRepo.findByOpenId(openId);
+            if (userInfo != null) {
+                return userInfo;
+            }
+            userInfo = User.builder()
+                           .username(UUID.randomUUID().toString())
+                           .nickname("用户" + RandomStringUtils.randomAlphabetic(6))
+                           .openId(openId)
+                           .avatar(Constants.DEFAULT_AVATAR)
+                           .enabled(true)
+                           .authorities(Collections.singletonList(Authority.builder().name("ROLE_USER").build()))
+                           .build();
+            userInfo = userRepo.save(userInfo);
+            return userInfo;
+        } catch (WxErrorException e) {
+            e.printStackTrace();
+        }
+        throw new BusinessException("登录失败");
+    }
+
+    public User getMaUserInfo(String sessionKey, String rawData, String signature,
+                              String encryptedData, String iv) {
+        // 用户信息校验
+        if (!wxMaService.getUserService().checkUserInfo(sessionKey, rawData, signature)) {
+            throw new BusinessException("获取用户信息失败");
+        }
+
+        // 解密用户信息
+        WxMaUserInfo wxUserInfo = wxMaService.getUserService().getUserInfo(sessionKey, encryptedData, iv);
+        User user = userRepo.findByOpenId(wxUserInfo.getOpenId());
+
+        String avatarUrl = Constants.DEFAULT_AVATAR;
+        try {
+            String path = "image/avatar/" +
+                    new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) +
+                    RandomStringUtils.randomAlphabetic(8) +
+                    ".jpg";
+            avatarUrl = storageService.uploadFromUrl(wxUserInfo.getAvatarUrl(), path);
+        } catch (Exception e) {
+            log.error("获取头像失败", e);
+        }
+
+        if (user == null) {
+
+            user = User.builder()
+                       .username(UUID.randomUUID().toString())
+                       .nickname(wxUserInfo.getNickName())
+                       .openId(wxUserInfo.getOpenId())
+                       .avatar(avatarUrl)
+                       .sex(wxUserInfo.getGender())
+                       .country(wxUserInfo.getCountry())
+                       .province(wxUserInfo.getProvince())
+                       .city(wxUserInfo.getCity())
+                       .enabled(true)
+                       .authorities(Collections.singletonList(Authority.builder().name("ROLE_USER").build()))
+                       .build();
+            user = userRepo.save(user);
+
+        } else {
+            user.setAvatar(avatarUrl);
+            user.setNickname(wxUserInfo.getNickName());
+            user.setSex(wxUserInfo.getGender());
+            user.setCountry(wxUserInfo.getCountry());
+            user.setProvince(wxUserInfo.getProvince());
+            user.setCity(wxUserInfo.getCity());
+            user = userRepo.save(user);
+        }
+
+        return user;
     }
 }

+ 1 - 12
src/main/java/com/izouma/ticketExchange/utils/ObjUtils.java

@@ -9,7 +9,7 @@ import java.lang.reflect.InvocationTargetException;
 import java.util.Objects;
 
 public class ObjUtils {
-    public static void merge(Object src, Object dst) {
+    public static void merge(Object dst, Object src) {
         Objects.requireNonNull(src);
         Objects.requireNonNull(dst);
         if (!dst.getClass().equals(src.getClass())) {
@@ -21,17 +21,6 @@ public class ObjUtils {
         } catch (IllegalAccessException | InvocationTargetException e) {
             e.printStackTrace();
         }
-        try {
-            BeanUtils.setProperty(dst, "modifiedAt", null);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        try {
-            BeanUtils.setProperty(dst, "modifiedBy", null);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
     }
 
     public static String[] getFields(Class clazz) {

+ 20 - 6
src/main/java/com/izouma/ticketExchange/web/AuthenticationController.java

@@ -6,6 +6,7 @@ import com.izouma.ticketExchange.security.JwtTokenUtil;
 import com.izouma.ticketExchange.security.JwtUserDetailsService;
 import com.izouma.ticketExchange.security.JwtUserFactory;
 import com.izouma.ticketExchange.service.UserService;
+import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.security.authentication.AuthenticationManager;
@@ -41,10 +42,23 @@ public class AuthenticationController {
         }
     }
 
+    @PostMapping("/phoneLogin")
+    @ApiOperation(value = "手机号登录")
+    public String phoneLogin(String phone) {
+        try {
+            User user = userService.loginByPhone(phone);
+            return jwtTokenUtil.generateToken(JwtUserFactory.create(user));
+        } catch (Exception e) {
+            log.error("loginByPhone", e);
+            throw new AuthenticationException("登陆错误", e);
+        }
+    }
+
     @PostMapping("/mpLogin")
+    @ApiOperation(value = "公众号登录")
     public String mpLogin(String code) {
         try {
-            User user = userService.loginByCode(code);
+            User user = userService.loginMp(code);
             return jwtTokenUtil.generateToken(JwtUserFactory.create(user));
         } catch (Exception e) {
             log.error("loginByCode", e);
@@ -52,18 +66,18 @@ public class AuthenticationController {
         }
     }
 
-    @PostMapping("/phoneLogin")
-    public String phoneLogin(String phone) {
+    @PostMapping("/maLogin")
+    @ApiOperation(value = "小程序登录")
+    public String maLogin(String code) {
         try {
-            User user = userService.loginByPhone(phone);
+            User user = userService.loginMa(code);
             return jwtTokenUtil.generateToken(JwtUserFactory.create(user));
         } catch (Exception e) {
-            log.error("loginByPhone", e);
+            log.error("loginByCode", e);
             throw new AuthenticationException("登陆错误", e);
         }
     }
 
-
     /**
      * Authenticates the user. If something is wrong, an {@link AuthenticationException} will be thrown
      */

+ 19 - 8
src/main/java/com/izouma/ticketExchange/web/UserController.java

@@ -9,6 +9,7 @@ import com.izouma.ticketExchange.service.UserService;
 import com.izouma.ticketExchange.utils.ObjUtils;
 import com.izouma.ticketExchange.utils.SecurityUtils;
 import com.izouma.ticketExchange.utils.excel.ExcelUtils;
+import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -24,7 +25,7 @@ import java.util.List;
 @RestController
 @RequestMapping("/user")
 public class UserController extends BaseController {
-    private UserRepo userRepo;
+    private UserRepo    userRepo;
     private UserService userService;
 
     @PostMapping("/register")
@@ -33,12 +34,12 @@ public class UserController extends BaseController {
         List<Authority> authorities = new ArrayList<>();
         authorities.add(new Authority(Authority.NAMES.ROLE_USER.name()));
         User user = User.builder()
-                .username(username)
-                .nickname(username)
-                .password(new BCryptPasswordEncoder().encode(password))
-                .enabled(true)
-                .authorities(authorities)
-                .build();
+                        .username(username)
+                        .nickname(username)
+                        .password(new BCryptPasswordEncoder().encode(password))
+                        .enabled(true)
+                        .authorities(authorities)
+                        .build();
         return userRepo.save(user);
     }
 
@@ -48,7 +49,7 @@ public class UserController extends BaseController {
         if (user.getId() != null) {
             User orig = userRepo.findById(user.getId()).orElseThrow(new BusinessException("无记录"));
             ObjUtils.merge(orig, user);
-            return userRepo.save(user);
+            return userRepo.save(orig);
         }
         return userRepo.save(user);
     }
@@ -77,4 +78,14 @@ public class UserController extends BaseController {
         ExcelUtils.export(response, data);
     }
 
+    @PostMapping("/getMaUserInfo")
+    @ApiOperation(value = "获取小程序用户信息")
+    public User getMaUserInfo(String sessionKey, String rawData, String signature, String encryptedData, String iv) {
+        User user = userService.getMaUserInfo(sessionKey, rawData, signature, encryptedData, iv);
+        if (user != null) {
+            return user;
+        }
+        throw new BusinessException("获取用户信息失败");
+    }
+
 }

+ 4 - 2
src/main/java/com/izouma/ticketExchange/web/WxController.java

@@ -6,6 +6,7 @@ import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
 import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyResult;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;
+import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.bean.WxJsapiSignature;
@@ -23,8 +24,8 @@ import java.io.IOException;
 @RestController
 @RequestMapping("/wx")
 public class WxController {
-    private WxMpService               wxMpService;
-    private WxPayService              wxPayService;
+    private WxMpService  wxMpService;
+    private WxPayService wxPayService;
 
     @GetMapping("/greet")
     public String greetUser(@RequestParam String code) {
@@ -71,6 +72,7 @@ public class WxController {
     }
 
     @GetMapping("/jsapiSign")
+    @ApiOperation(value = "jsapi签名")
     public WxJsapiSignature sign(@RequestParam String url) throws WxErrorException {
         return wxMpService.createJsapiSignature(url);
     }

+ 3 - 3
src/main/resources/application.yaml

@@ -9,7 +9,7 @@ spring:
     profiles:
         active: dev
     datasource:
-        url: jdbc:mysql://rdsave1o67m1ido6gwp6public.mysql.rds.aliyuncs.com/zhu_meng_ju?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2b8
+        url: jdbc:mysql://rdsave1o67m1ido6gwp6public.mysql.rds.aliyuncs.com/ticket_exchange?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2b8
         username: microball
         password: 2wsx@WSX#EDC
         hikari:
@@ -74,8 +74,8 @@ aliyun:
     access-key-id: PXzJyah5rZfWHIIH
     access-key-secret: e1MS6j0wypXJrw8CM0hObZu8qKbfah
     oss-end-point: oss-cn-hangzhou.aliyuncs.com
-    oss-bucket-name: zhumj
-    oss-domain: https://zhumj.oss-cn-hangzhou.aliyuncs.com
+    oss-bucket-name: ticket-exchange
+    oss-domain: https://ticket-exchange.oss-cn-hangzhou.aliyuncs.com
 ---
 
 spring:

+ 1 - 1
src/main/resources/templates/ControllerTemplate.ftl

@@ -42,7 +42,7 @@ public class ${model.className}Controller extends BaseController {
         if (record.getId() != null) {
             ${model.className} orig = ${model.className?uncap_first}Repo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
             ObjUtils.merge(orig, record);
-            return ${model.className?uncap_first}Repo.save(record);
+            return ${model.className?uncap_first}Repo.save(orig);
         }
         return ${model.className?uncap_first}Repo.save(record);
     }

+ 1 - 1
src/main/vue/public/index.html

@@ -6,7 +6,7 @@
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
     <link rel="icon" href="<%= BASE_URL %>favicon.ico">
     <script src="<%= BASE_URL %>fontawesome-v5.2.0.js"></script>
-    <title>筑梦居</title>
+    <title>管理后台</title>
   </head>
   <body>
     <noscript>

+ 0 - 1
src/main/vue/src/App.vue

@@ -4,5 +4,4 @@
 
 <style lang="less">
 @import url(./styles/app.less);
-@import url(./styles/operation.less);
 </style>

+ 3 - 6
src/main/vue/src/components/SysMenu.vue

@@ -1,14 +1,11 @@
 <template>
     <el-menu-item v-if="isLeaf" :index="''+menu.id" :route="{path:menu.path}">
-        <!-- <i class="fa-fw" :class="menu.icon" v-if="menu.icon"></i> -->
-        <!-- <span slot="title">{{menu.name}}</span> -->
-        {{menu.name}}
+        <i class="fa-fw" :class="menu.icon" v-if="menu.icon"></i><span slot="title">{{menu.name}}</span>
     </el-menu-item>
     <el-submenu v-else :index="''+menu.id">
         <template slot="title">
-            <!-- <i class="fa-fw" :class="menu.icon" v-if="menu.icon"></i> -->
-            <!-- <span slot="title">{{menu.name}}</span> -->
-            {{menu.name}}
+            <i class="fa-fw" :class="menu.icon" v-if="menu.icon"></i>
+            <span slot="title">{{menu.name}}</span>
         </template>
         <sys-menu v-for="item in menu.children" :menu="item" :key="item.id"></sys-menu>
     </el-submenu>

+ 1 - 1
src/main/vue/src/main.js

@@ -12,7 +12,7 @@ import RichText from '@/components/RichText';
 import CropUpload from '@/components/CropUpload';
 import Formatters from '@/mixins/formatters';
 import 'normalize.css/normalize.css';
-import '@/styles/element_theme/index.css';
+import 'element-ui/lib/theme-chalk/index.css';
 
 Vue.config.productionTip = false;
 Vue.use(ElementUI, { size: 'small' });

+ 6 - 1
src/main/vue/src/router.js

@@ -16,13 +16,18 @@ const router = new Router({
             children: [
                 {
                     path: '/',
-                    redirect: 'roomStatus',
+                    redirect: 'dashboard',
                 },
                 {
                     path: '/404',
                     name: '404',
                     component: () => import(/* webpackChunkName: "404" */ '@/views/404.vue'),
                 },
+                {
+                    path: '/dashboard',
+                    name: 'dashboard',
+                    component: () => import(/* webpackChunkName: "404" */ '@/views/Dashboard.vue'),
+                },
                 {
                     path: '/api',
                     name: 'api',

+ 1 - 1
src/main/vue/src/styles/app.less

@@ -57,7 +57,7 @@ li {
 
 .el-menu-item.is-active {
     background: #1f2d3d !important;
-    // border-left: 2px solid rgb(32, 160, 255);
+    border-left: 2px solid rgb(32, 160, 255);
 }
 
 .el-menu {

+ 0 - 44
src/main/vue/src/styles/operation.less

@@ -1,44 +0,0 @@
-::-webkit-scrollbar-track-piece {
-    background-color: transparent;
-}
-
-::-webkit-scrollbar {
-    width: 8px;
-    height: 8px;
-}
-
-::-webkit-scrollbar-thumb {
-    //滚动条的设置
-    background-color: #c7c7c7;
-    background-clip: padding-box;
-    border-radius: 4px;
-}
-
-::-webkit-scrollbar-thumb:hover {
-    background-color: shade(#c7c7c7, 20);
-}
-
-.room-drawer {
-    .el-drawer__open .el-drawer.rtl {
-        background-color: transparent;
-        box-shadow: 0 8px 10px -5px rgba(0, 0, 0, 0);
-        padding-left: 50px;
-        width: 404px;
-        .el-drawer__header {
-            height: 110px;
-            min-height: 110px;
-            margin-bottom: 0;
-            box-sizing: border-box;
-        }
-        .el-drawer__body {
-            background-color: #fff;
-            box-shadow: -10px 8px 16px 0px rgba(0, 0, 0, 0.18);
-            overflow: auto;
-        }
-    }
-}
-.room-status {
-    .v-modal {
-        background-color: transparent;
-    }
-}

+ 47 - 181
src/main/vue/src/views/Admin.vue

@@ -1,75 +1,52 @@
 <template>
     <el-container id="app">
-
-        <el-header class="header" height="110">
-            <!-- <div class="header-btn" @click="collapse=!collapse">
+        <el-aside :width="collapse ? '65px' : '200px'" class="aside">
+            <div class="logo-wrapper">Logo</div>
+            <el-menu :collapse="collapse" background-color="#324157"
+                text-color="#BFCBD9" active-text-color="#20A0FF"
+                :unique-opened="true" :router="true"
+                :default-active="activeMenu"
+                style="border-right: 1px solid #545c64"
+                class="el-menu-vertical-demo">
+                <sys-menu v-for="item in menus" :menu="item" :key="item.id">
+                </sys-menu>
+            </el-menu>
+        </el-aside>
+        <el-container>
+            <el-header class="header">
+                <div class="header-btn" @click="collapse=!collapse">
                     <div :style="{transform: collapse ? 'rotate(90deg)' : ''}">
                         <i class="fas fa-bars" style="font-size: 20px;"></i>
                     </div>
-                </div> -->
-            <div class="logo-content">
-                <img src="../assets/logo.png" alt="" class="logo-text">
-            </div>
-
-            <div class="menu">
-                <el-menu :collapse="collapse" mode="horizontal"
-                    :unique-opened="true" :router="true"
-                    background-color='#232E3B' text-color='#fff'
-                    active-text-color='#F7931D' :default-active="activeMenu">
-                    <sys-menu v-for="item in menus" :menu="item" :key="item.id">
-                    </sys-menu>
-                </el-menu>
-            </div>
-
-            <div class="header-right">
-
-                <el-select v-model="chooseStore" placeholder="请选择店铺"
-                    size="small" class="store-select">
-                    <el-option label="区域一" value="shanghai"></el-option>
-                    <el-option label="区域二" value="beijing"></el-option>
-                </el-select>
+                </div>
+                <div style="flex-grow: 1; margin-left: 20px;">
+                    <router-link :to="{name:'dashboard'}">管理后台
+                    </router-link>
+                </div>
 
-                <!-- <el-tooltip effect="dark"
-                        :content="isFullscreen ? '退出全屏' : '全屏'"
-                        placement="bottom" :open-delay="1000">
-                        <div class="header-btn" @click="toggleFullScreen"
-                            ref="fullscreen">
-                            <i class="fas fa-expand"
-                                style="font-size: 20px;"></i>
-                        </div>
-                    </el-tooltip> -->
+                <el-tooltip effect="dark"
+                    :content="isFullscreen ? '退出全屏' : '全屏'" placement="bottom"
+                    :open-delay="1000">
+                    <div class="header-btn" @click="toggleFullScreen"
+                        ref="fullscreen">
+                        <i class="fas fa-expand" style="font-size: 20px;"></i>
+                    </div>
+                </el-tooltip>
 
-                <el-dropdown @command="onCommand" class="avatar-content">
+                <el-dropdown @command="onCommand" style="margin-left: 20px;">
                     <img :src="userInfo ? userInfo.avatar || '' : ''"
                         class="avatar" />
-                    <img class="avatar-icon"
-                        src="../assets/images/Icon_down.png" alt="">
                     <el-dropdown-menu slot="dropdown">
                         <el-dropdown-item command="logout">退出登录
                         </el-dropdown-item>
                     </el-dropdown-menu>
                 </el-dropdown>
-
-                <div class="bars" @click.stop="showMenuDrawer=true">
-                    <i class="fas fa-bars"></i>
-                </div>
-            </div>
-
-        </el-header>
-        <el-container class="main">
-            <el-main class="main-contianer">
+            </el-header>
+            <el-main style="background: #f2f4f5;">
                 <router-view></router-view>
             </el-main>
-            <el-drawer :show-close="false" :visible.sync="showMenuDrawer"
-                direction="rtl" custom-class="menu-drawer">
-                <el-menu :collapse="collapse" :unique-opened="true"
-                    :router="true" background-color='#232E3B' text-color='#fff'
-                    active-text-color='#F7931D' :default-active="activeMenu">
-                    <sys-menu v-for="item in menus" :menu="item" :key="item.id">
-                    </sys-menu>
-                </el-menu>
-            </el-drawer>
         </el-container>
+
     </el-container>
 </template>
 
@@ -99,9 +76,7 @@ export default {
             activeMenu: "",
             menuPath: [],
             collapse: false,
-            isFullscreen: false,
-            chooseStore: "",
-            showMenuDrawer: false
+            isFullscreen: false
         };
     },
     computed: {
@@ -203,27 +178,14 @@ export default {
 #app {
     height: 100%;
 }
-.main {
-    display: flex;
-    flex-direction: column;
-}
-.main-contianer {
-    background-color: #f2f4f5;
-    transition: all ease-in-out 0.3s;
-    flex-basis: 0;
-    flex-grow: 1;
-}
 
 .header {
-    color: #fff;
-    background: #232e3b;
+    color: #303133;
+    background: #fff;
     display: flex;
     align-items: center;
     padding-left: 0;
     border-bottom: 1px solid #dcdfe6;
-    padding: 10px;
-    box-sizing: border-box;
-    height: 110px;
     .header-btn {
         width: 60px;
         height: 60px;
@@ -239,22 +201,11 @@ export default {
             background: fade(black, 10%);
         }
     }
-    .avatar-content {
-        display: flex;
-        align-items: center;
-        margin-left: 20px;
-    }
     .avatar {
         width: 40px;
         height: 40px;
         border-radius: 50%;
     }
-
-    .avatar-icon {
-        width: 16px;
-        height: 16px;
-        margin-left: 5px;
-    }
     a {
         &:visited {
             color: #303133;
@@ -263,107 +214,22 @@ export default {
 }
 
 .aside {
-    background: #232e3b;
+    background: #324157;
     transition: all 0.4s ease;
-    margin-top: -1px;
-    display: none;
-    // -ms-overflow-style: none;
-    // .logo-wrapper {
-    //     display: flex;
-    //     align-items: center;
-    //     justify-content: center;
-    //     height: 60px;
-    //     color: white;
-    //     font-size: 20px;
-    //     font-weight: 700;
-    //     background: fade(black, 20%);
-
-    // }
-    position: relative;
-    z-index: 201;
-}
-.modal-box {
-    position: fixed;
-    left: 0;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    background-color: transparent;
-    z-index: 200;
-    display: none;
-}
-
-.aside::-webkit-scrollbar {
-    display: none;
-}
-
-.logo-content {
-    // padding: 20px;
-    min-width: 220px;
-    padding: 20px 13px;
-    .logo-text {
-        width: 194px;
-        height: 68px;
-        display: block;
-    }
-}
-
-.menu {
-    flex-grow: 1;
-    align-self: flex-end;
-    .el-menu {
-        border-bottom: none;
-    }
-}
-
-.header-right {
-    padding: 0 10px;
-    align-self: flex-end;
-    display: flex;
-    align-items: center;
-
-    .store-select {
-        width: 200px;
-    }
-
-    .bars {
-        margin: 0 20px;
+    -ms-overflow-style: none;
+    .logo-wrapper {
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        height: 60px;
+        color: white;
         font-size: 20px;
-        cursor: pointer;
-        display: none;
+        font-weight: 700;
+        background: fade(black, 20%);
     }
 }
 
-@media screen and(max-width:1350px) {
-    .header-right {
-        .bars {
-            display: block;
-        }
-    }
-    .aside {
-        display: block;
-    }
-
-    .modal-box {
-        display: block;
-    }
-
-    .menu {
-        .el-menu {
-            display: none;
-        }
-    }
+.aside::-webkit-scrollbar {
+    display: none;
 }
 </style>
-<style lang="less"  >
-.menu-drawer {
-    background: #232e3b !important;
-    overflow: auto;
-    ::-webkit-scrollbar {
-        display: none;
-    }
-    .el-menu {
-        border-right: none !important;
-    }
-}
-</style> 

+ 1 - 2
src/main/vue/src/views/Menus.vue

@@ -1,6 +1,5 @@
-<!--suppress ALL -->
 <template>
-    <div style="">
+    <div class="edit-view">
         <el-tree :data="menus" :render-content="renderContent"
             :highlight-current="true" :expand-on-click-node="true" node-key="id"
             default-expand-all v-loading="loading">

+ 0 - 20
src/main/vue/src/views/UserEdit.vue

@@ -29,14 +29,6 @@
                     </el-option>
                 </el-select>
             </el-form-item>
-            <el-form-item prop="stores" label="门店">
-                <el-select v-model="formData.stores" multiple
-                           placeholder="请选择" value-key="id">
-                    <el-option v-for="item in stores" :key="item.id"
-                               :label="item.storeName" :value="item">
-                    </el-option>
-                </el-select>
-            </el-form-item>
             <el-form-item>
                 <el-button @click="onSave" :loading="$store.state.fetchingData"
                            type="primary">保存</el-button>
@@ -70,17 +62,6 @@ export default {
             .catch(e => {
                 console.log(e);
             });
-        this.$http
-            .get('/storeInfo/all', {
-                page: 0,
-                size: 1000,
-            })
-            .then(res => {
-                this.stores = res.content;
-            })
-            .catch(e => {
-                console.log(e);
-            });
     },
     data() {
         return {
@@ -119,7 +100,6 @@ export default {
                 ],
             },
             authorities: [],
-            stores: [],
         };
     },
     methods: {

+ 1 - 1
src/test/java/com/izouma/ticketExchange/TicketExchangeApplicationTests.java → src/test/java/com/izouma/ticketExchange/ApplicationTests.java

@@ -7,7 +7,7 @@ import org.springframework.test.context.junit4.SpringRunner;
 
 @RunWith(SpringRunner.class)
 @SpringBootTest
-public class TicketExchangeApplicationTests {
+public class ApplicationTests {
 
     @Test
     public void contextLoads() {

+ 2 - 2
src/test/java/com/izouma/ticketExchange/service/sms/SmsServiceTest.java

@@ -1,10 +1,10 @@
 package com.izouma.ticketExchange.service.sms;
 
-import com.izouma.ticketExchange.TicketExchangeApplicationTests;
+import com.izouma.ticketExchange.ApplicationTests;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
-public class SmsServiceTest extends TicketExchangeApplicationTests {
+public class SmsServiceTest extends ApplicationTests {
     @Autowired
     private SmsService smsService;