Bladeren bron

1.添加用户认证功能

1 4 uur geleden
bovenliggende
commit
8c2cb0bc82
26 gewijzigde bestanden met toevoegingen van 513 en 40 verwijderingen
  1. 3 2
      imwork-commons/imwork-commons-security/pom.xml
  2. 4 0
      imwork-windows/imwork-silos/pom.xml
  3. 15 0
      imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/controller/login/LoginController.java
  4. 3 0
      imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/dao/SysRoleDao.java
  5. 9 0
      imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/dao/SysUserDao.java
  6. 23 0
      imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/exception/AccountFoundMoreException.java
  7. 149 0
      imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/security/config/SecurityConfig.java
  8. 135 0
      imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/security/details/SecurityUserDetails.java
  9. 64 0
      imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/security/details/SecurityUserDetailsService.java
  10. 28 0
      imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/security/handler/SecurityAuthenticationFailureHandler.java
  11. 29 0
      imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/security/handler/SecurityAuthenticationSuccessHandler.java
  12. 6 0
      imwork-windows/imwork-silos/src/main/resources/mapper/upms/SysRoleDao.xml
  13. 7 0
      imwork-windows/imwork-silos/src/main/resources/mapper/upms/SysUserDao.xml
  14. 1 1
      imwork-windows/imwork-silos/src/main/resources/static/business/cms/base/pagination.js
  15. 1 1
      imwork-windows/imwork-silos/src/main/resources/static/business/cms/book/category/edit.js
  16. 2 2
      imwork-windows/imwork-silos/src/main/resources/static/business/cms/book/category/list.js
  17. 2 2
      imwork-windows/imwork-silos/src/main/resources/static/business/cms/book/chapter/chapter.js
  18. 1 1
      imwork-windows/imwork-silos/src/main/resources/static/business/cms/book/contents/edit.js
  19. 2 2
      imwork-windows/imwork-silos/src/main/resources/static/business/cms/book/contents/list.js
  20. 1 1
      imwork-windows/imwork-silos/src/main/resources/static/business/cms/book/info/edit.js
  21. 5 5
      imwork-windows/imwork-silos/src/main/resources/static/business/cms/book/info/list.js
  22. 5 5
      imwork-windows/imwork-silos/src/main/resources/static/business/upms/role/list.js
  23. 1 1
      imwork-windows/imwork-silos/src/main/resources/static/business/upms/user/edit.js
  24. 5 5
      imwork-windows/imwork-silos/src/main/resources/static/business/upms/user/list.js
  25. 1 1
      imwork-windows/imwork-silos/src/main/resources/templates/login/login.html
  26. 11 11
      imwork-windows/imwork-silos/src/main/resources/templates/main/index.html

+ 3 - 2
imwork-commons/imwork-commons-security/pom.xml

@@ -29,6 +29,7 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-security</artifactId>
         </dependency>
+        <!-- 密码加密工具 -->
         <dependency>
             <groupId>org.springframework.security</groupId>
             <artifactId>spring-security-crypto</artifactId>
@@ -36,10 +37,10 @@
         <!--<dependency>
             <groupId>org.springframework.security</groupId>
             <artifactId>spring-security-cas</artifactId>
-        </dependency>-->
+        </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-oauth2-authorization-server</artifactId>
-        </dependency>
+        </dependency>-->
     </dependencies>
 </project>

+ 4 - 0
imwork-windows/imwork-silos/pom.xml

@@ -24,6 +24,10 @@
             <groupId>com.alibaba</groupId>
             <artifactId>easyexcel</artifactId>
         </dependency>
+        <dependency>
+            <groupId>top.imwork</groupId>
+            <artifactId>imwork-commons-security</artifactId>
+        </dependency>
         <dependency>
             <groupId>top.imwork</groupId>
             <artifactId>imwork-commons-core</artifactId>

+ 15 - 0
imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/controller/login/LoginController.java

@@ -0,0 +1,15 @@
+package top.imwork.window.silos.controller.login;
+
+/**
+ * Copyright (C), 2015-2025
+ * FileName: LoginController
+ * Author<作者姓名>:   stars
+ * CreateTime<创建时间>:   2025/12/10 13:29
+ * UpdateTime<修改时间>:   2025/12/10 13:29
+ * Description〈功能简述〉: 登录控制器
+ * History<历史描述>:
+ * Since<版本号>: 1.0.0
+ */
+public class LoginController {
+
+}

+ 3 - 0
imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/dao/SysRoleDao.java

@@ -3,6 +3,8 @@ package top.imwork.window.silos.dao;
 import top.imwork.commons.dao.base.BaseDao;
 import top.imwork.window.silos.entity.SysRole;
 
+import java.util.List;
+
 /**
  * 角色信息
  *
@@ -11,4 +13,5 @@ import top.imwork.window.silos.entity.SysRole;
  * date: 2025-12-09 16:29:22
  */
 public interface SysRoleDao extends BaseDao<SysRole> {
+    List<SysRole> getRolesByUserId(Long uid);
 }

+ 9 - 0
imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/dao/SysUserDao.java

@@ -3,6 +3,8 @@ package top.imwork.window.silos.dao;
 import top.imwork.commons.dao.base.BaseDao;
 import top.imwork.window.silos.entity.SysUser;
 
+import java.util.List;
+
 /**
  * 用户信息
  *
@@ -11,4 +13,11 @@ import top.imwork.window.silos.entity.SysUser;
  * date: 2025-12-09 16:29:22
  */
 public interface SysUserDao extends BaseDao<SysUser> {
+    /**
+     * 根据用户账号查询用户信息
+     *
+     * @param account 账号
+     * @return List   用户信息列表
+     */
+    List<SysUser> getUserByAccount(String account);
 }

+ 23 - 0
imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/exception/AccountFoundMoreException.java

@@ -0,0 +1,23 @@
+package top.imwork.window.silos.exception;
+
+import org.springframework.security.core.AuthenticationException;
+
+/**
+ * Copyright (C), 2015-2021
+ * FileName: AccountFoundMoreException
+ * Author:   imwork
+ * Date:     2021/3/23 16:46
+ * Description: 发现多账户异常
+ * History:
+ * <p>
+ * 作者姓名           修改时间           版本号              描述
+ */
+public class AccountFoundMoreException extends AuthenticationException {
+    public AccountFoundMoreException(String msg) {
+        super(msg);
+    }
+
+    public AccountFoundMoreException(String msg, Throwable t) {
+        super(msg, t);
+    }
+}

+ 149 - 0
imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/security/config/SecurityConfig.java

@@ -0,0 +1,149 @@
+package top.imwork.window.silos.security.config;
+
+import jakarta.annotation.Resource;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration;
+import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.web.SecurityFilterChain;
+import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.CorsConfigurationSource;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import top.imwork.window.silos.security.details.SecurityUserDetailsService;
+import top.imwork.window.silos.security.handler.SecurityAuthenticationFailureHandler;
+import top.imwork.window.silos.security.handler.SecurityAuthenticationSuccessHandler;
+
+/**
+ * Copyright (C), 2015-2025
+ * FileName: SecurityConfig
+ * Author<作者姓名>:   stars
+ * CreateTime<创建时间>:   2025/12/10 13:31
+ * UpdateTime<修改时间>:   2025/12/10 13:31
+ * Description〈功能简述〉: 配置类
+ * History<历史描述>:   注意:security底层就是使用过滤器,一共有16个过滤器,称为过滤器链;
+ * Since<版本号>: 1.0.0
+ */
+@Configuration
+@EnableWebSecurity
+@EnableMethodSecurity(prePostEnabled = true)
+public class SecurityConfig{
+    @Resource
+    private SecurityUserDetailsService userDetailsService;
+    @Resource
+    private SecurityAuthenticationSuccessHandler authenticationSuccessHandler;
+    @Resource
+    private SecurityAuthenticationFailureHandler authenticationFailureHandler;
+
+    @Bean
+    public PasswordEncoder passwordEncoder() {
+        return new BCryptPasswordEncoder();
+    }
+    /**
+     * 配置跨源访问(CORS)
+     *
+     * @return CorsConfigurationSource
+     */
+    @Bean
+    public CorsConfigurationSource corsConfigurationSource() {
+        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+        source.registerCorsConfiguration("/**", new CorsConfiguration().applyPermitDefaultValues());
+        return source;
+    }
+    @Bean
+    SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+        http.authorizeHttpRequests(authorize -> authorize
+                        //需要放行的地址
+                        // 静态资源
+                        .requestMatchers("/static/**", "/assets/**", "/business/**").permitAll()
+                        //登录/注册页面
+                        .requestMatchers("/login", "/login.html", "/silos/login.html", "/auth/login", "/", "/register").permitAll()
+                        // 公开访问的API
+                        .requestMatchers("/api/public/**").permitAll()
+                        // Swagger文档
+                        .requestMatchers("/swagger-ui/**", "/v3/api-docs/**", "/swagger-resources/**").permitAll()
+                        // 其他所有请求都需要认证
+                        .anyRequest().authenticated()
+                )
+                .headers(headers -> headers
+                        .frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin)
+                )
+                .formLogin(form -> form
+                        .loginPage("/login.html")  // 登录页面
+                        .loginProcessingUrl("/auth/login")  // 登录处理URL
+                        .usernameParameter("username")
+                        .passwordParameter("password")
+                        .successHandler(authenticationSuccessHandler)
+                        .failureHandler(authenticationFailureHandler)
+                        .permitAll())
+                // 其他配置
+                /*.csrf(csrf -> csrf
+                        .ignoringRequestMatchers("/api/public/**")
+                )*/
+                .csrf(csrf -> csrf
+                        .disable()
+                )
+                .logout(logout -> logout
+                        .logoutUrl("/api/auth/logout")
+                        .logoutSuccessHandler(logoutSuccessHandler())
+                        .invalidateHttpSession(true)
+                        .deleteCookies("JSESSIONID")
+                        .permitAll()
+                )
+                .sessionManagement(session -> session
+                        .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
+                        .maximumSessions(1)
+                        .maxSessionsPreventsLogin(false)
+                )
+                .rememberMe(remember -> remember
+                        .key("uniqueAndSecret")
+                        .tokenValiditySeconds(86400) // 24小时
+                        .userDetailsService(userDetailsService)
+                )
+                .exceptionHandling(exceptions -> exceptions
+                        .accessDeniedPage("/access-denied")
+                )
+                .authenticationProvider(authenticationProvider());
+        return http.build();
+    }
+
+    @Bean
+    public LogoutSuccessHandler logoutSuccessHandler() {
+        return (request, response, authentication) -> {
+            response.setContentType("application/json;charset=UTF-8");
+            response.getWriter().write("{\"success\": true, \"message\": \"退出成功\"}");
+        };
+    }
+
+    @Bean
+    public AuthenticationProvider authenticationProvider() {
+        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
+        authProvider.setUserDetailsService(userDetailsService);
+        authProvider.setPasswordEncoder(passwordEncoder());
+        return authProvider;
+    }
+
+    @Bean
+    public AuthenticationManager authenticationManager(
+            HttpSecurity http, PasswordEncoder passwordEncoder) throws Exception {
+
+        AuthenticationManagerBuilder authenticationManagerBuilder =
+                http.getSharedObject(AuthenticationManagerBuilder.class);
+
+        authenticationManagerBuilder
+                .userDetailsService(userDetailsService)
+                .passwordEncoder(passwordEncoder);
+
+        return authenticationManagerBuilder.build();
+    }
+}

+ 135 - 0
imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/security/details/SecurityUserDetails.java

@@ -0,0 +1,135 @@
+package top.imwork.window.silos.security.details;
+
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+import top.imwork.window.silos.entity.SysRole;
+import top.imwork.window.silos.entity.SysUser;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Copyright (C), 2015-2025
+ * FileName: SecurityUserDetails
+ * Author<作者姓名>:   stars
+ * CreateTime<创建时间>:   2025/12/10 13:06
+ * UpdateTime<修改时间>:   2025/12/10 13:06
+ * Description〈功能简述〉: 封装用户登录信息 SecurityUserDetails 一定要有一个类,实现UserDetails接口,供程序调用
+ * History<历史描述>:
+ * Since<版本号>: 1.0.0
+ */
+public class SecurityUserDetails implements UserDetails {
+    private String username;
+
+    private String password;
+
+    private SysUser sysUser;
+
+    //包含着用户对应的所有角色 Role,在使用时调用者给对象注入roles
+    private List<SysRole>  sysRoles;
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public SysUser getSysUser() {
+        return sysUser;
+    }
+
+    public void setSysUser(SysUser sysUser) {
+        this.sysUser = sysUser;
+    }
+
+    public List<SysRole> getSysRoles() {
+        return sysRoles;
+    }
+
+    public void setSysRoles(List<SysRole> sysRoles) {
+        this.sysRoles = sysRoles;
+    }
+
+    //无参构造
+    private SecurityUserDetails() {}
+    //SysUser构造
+    public SecurityUserDetails(SysUser sysUser) {
+        this.username = sysUser.getLoginName();
+        this.password = sysUser.getLoginPassword();
+        this.sysUser = sysUser;
+    }
+    //用User和List<Role>构造
+    public SecurityUserDetails(SysUser user, List<SysRole> roles) {
+        this.username = user.getLoginName();
+        this.password = user.getLoginPassword();
+        this.sysUser = user;
+        this.sysRoles = roles;
+    }
+
+    public static SecurityUserDetails createSecurityUserDetails() {
+        return new SecurityUserDetails();
+    }
+
+    //返回用户所有角色的封装,一个Role对应一个GrantedAuthority
+    @Override
+    public Collection<? extends GrantedAuthority> getAuthorities() {
+        List<GrantedAuthority> authorities = new ArrayList<>();
+        for(SysRole role : sysRoles) {
+            authorities.add(new SimpleGrantedAuthority(role.getRoleName()));
+        }
+        return authorities;
+    }
+
+    @Override
+    public String getPassword() {
+        return password;
+    }
+
+    @Override
+    public String getUsername() {
+        return username;
+    }
+    //判断账号是否已经过期,默认没有过期
+    @Override
+    public boolean isAccountNonExpired() {
+        return UserDetails.super.isAccountNonExpired();
+    }
+    //判断账号是否被锁定,默认没有锁定
+    @Override
+    public boolean isAccountNonLocked() {
+        return UserDetails.super.isAccountNonLocked();
+    }
+    //判断信用凭证是否过期,默认没有过期
+    @Override
+    public boolean isCredentialsNonExpired() {
+        return UserDetails.super.isCredentialsNonExpired();
+    }
+    //判断账号是否可用,默认可用
+    @Override
+    public boolean isEnabled() {
+        return UserDetails.super.isEnabled();
+    }
+
+    @Override
+    public String toString() {
+        return this.username;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        SecurityUserDetails that = (SecurityUserDetails) o;
+        return username.equals(that.username);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(username);
+    }
+}

+ 64 - 0
imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/security/details/SecurityUserDetailsService.java

@@ -0,0 +1,64 @@
+package top.imwork.window.silos.security.details;
+
+import jakarta.annotation.Resource;
+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.Component;
+import org.springframework.util.ObjectUtils;
+import top.imwork.commons.core.exception.BusinessException;
+import top.imwork.window.silos.dao.SysRoleDao;
+import top.imwork.window.silos.dao.SysUserDao;
+import top.imwork.window.silos.entity.SysRole;
+import top.imwork.window.silos.entity.SysUser;
+import top.imwork.window.silos.exception.AccountFoundMoreException;
+
+import java.util.List;
+
+/**
+ * Copyright (C), 2015-2025
+ * FileName: SecurityUserDetailsService
+ * Author<作者姓名>:   stars
+ * CreateTime<创建时间>:   2025/12/10 13:19
+ * UpdateTime<修改时间>:   2025/12/10 13:19
+ * Description〈功能简述〉: SecurityUserDetailsService用于认证用户名、密码、授权等
+ * History<历史描述>:
+ * Since<版本号>: 1.0.0
+ */
+@Component
+public class SecurityUserDetailsService implements UserDetailsService {
+    @Resource
+    private SysUserDao userDao;
+    @Resource
+    private SysRoleDao roleDao;
+    /**
+     * 重写UserDetailsService接口里面的抽象方法
+     * 根据用户名 返回一个UserDetails的实现类的实例
+     * 查到User后将其封装为UserDetails的实现类的实例供程序调用
+     * 用该User和它对应的Role实体们构造UserDetails的实现类
+     * <p>
+     * 账号密码登录方式
+     *
+     * @param username 用户登录名称
+     * @return UserDetails 用户详情
+     * @throws UsernameNotFoundException 用户信息不存在异常
+     */
+    @Override
+    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+        List<SysUser> users = userDao.getUserByAccount(username);
+
+        if (ObjectUtils.isEmpty(users)) {
+            throw new UsernameNotFoundException("账户信息不存在!");
+        } else if (users.size() > 1) {
+            throw new AccountFoundMoreException("账户信息异常,查询出多用户!");
+        } else {
+            SysUser user = users.getFirst();
+            List<SysRole> roles = roleDao.getRolesByUserId(user.getId());
+            if (ObjectUtils.isEmpty(roles)) {
+                throw new BusinessException("用户角色未分配,请联系管理员!");
+            } else {
+                return new SecurityUserDetails(user, roles);
+            }
+        }
+    }
+}

+ 28 - 0
imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/security/handler/SecurityAuthenticationFailureHandler.java

@@ -0,0 +1,28 @@
+package top.imwork.window.silos.security.handler;
+
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.authentication.AuthenticationFailureHandler;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+
+/**
+ * Copyright (C), 2015-2025
+ * FileName: SecurityAuthenticationFailureHandler
+ * Author<作者姓名>:   stars
+ * CreateTime<创建时间>:   2025/12/10 14:18
+ * UpdateTime<修改时间>:   2025/12/10 14:18
+ * Description〈功能简述〉: 登录失败处理器
+ * History<历史描述>:
+ * Since<版本号>: 1.0.0
+ */
+@Component
+public class SecurityAuthenticationFailureHandler implements AuthenticationFailureHandler {
+    @Override
+    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
+        response.sendRedirect("/login");
+    }
+}

+ 29 - 0
imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/security/handler/SecurityAuthenticationSuccessHandler.java

@@ -0,0 +1,29 @@
+package top.imwork.window.silos.security.handler;
+
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+
+/**
+ * Copyright (C), 2015-2025
+ * FileName: SecurityAuthenticationSuccessHandler
+ * Author<作者姓名>:   stars
+ * CreateTime<创建时间>:   2025/12/10 14:15
+ * UpdateTime<修改时间>:   2025/12/10 14:15
+ * Description〈功能简述〉: 登录成功处理器
+ * History<历史描述>:
+ * Since<版本号>: 1.0.0
+ */
+@Component
+public class SecurityAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
+    @Override
+    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
+        // 可以在这里添加自定义逻辑,例如重定向到某个页面
+        response.sendRedirect("/index.html"); // 重定向到首页
+    }
+}

+ 6 - 0
imwork-windows/imwork-silos/src/main/resources/mapper/upms/SysRoleDao.xml

@@ -67,4 +67,10 @@
         select *
         from sys_role ${ew.customSqlSegment}
     </select>
+
+    <select id="getRolesByUserId" resultMap="BaseResultMap" parameterType="long">
+        select * from sys_role sr
+        where sr.id in
+              (select sur.role_id from sys_user_role sur where sur.user_id = #{uid,jdbcType=BIGINT}) and sr.del_flag = '0'
+    </select>
 </mapper>

+ 7 - 0
imwork-windows/imwork-silos/src/main/resources/mapper/upms/SysUserDao.xml

@@ -97,4 +97,11 @@
         select *
         from sys_user ${ew.customSqlSegment}
     </select>
+    <select id="getUserByAccount" resultMap="BaseResultMap" parameterType="string">
+        select *
+        from sys_user
+        where 1 = 1
+          and (login_name = #{account,jdbcType=VARCHAR} or user_email = #{account,jdbcType=VARCHAR} or
+               user_mobil_phone = #{account,jdbcType=VARCHAR})
+    </select>
 </mapper>

+ 1 - 1
imwork-windows/imwork-silos/src/main/resources/static/business/cms/base/pagination.js

@@ -3,7 +3,7 @@ document.addEventListener('DOMContentLoaded', function () {
     const allOptions = [];
 
     $.ajax({
-        url: "/silos/cms/book/info/queryPage",
+        url: "/cms/book/info/queryPage",
         type: "POST",
         dataType: "json",
         contentType: 'application/json;charset=UTF-8',

+ 1 - 1
imwork-windows/imwork-silos/src/main/resources/static/business/cms/book/category/edit.js

@@ -8,7 +8,7 @@ layui.use(['form', 'layer'], function () {
         const index = top.layer.msg('数据提交中,请稍候', {icon: 16, time: false, shade: 0.8});
         //实际使用时的提交信息
         $.ajax( {
-            url : "/silos/cms/books/categories/save",
+            url : "/cms/books/categories/save",
             type : "POST",
             dataType:"json",
             contentType:'application/json;charset=UTF-8',

+ 2 - 2
imwork-windows/imwork-silos/src/main/resources/static/business/cms/book/category/list.js

@@ -11,7 +11,7 @@ layui.config({
     //用户列表
     var tableIns = table.render({
         elem: '#list',
-        url: '/silos/cms/book/categories/queryPage',
+        url: '/cms/book/categories/queryPage',
         method: 'POST',
         dataType: 'json',
         contentType: 'application/json;charset=utf-8',
@@ -192,7 +192,7 @@ layui.config({
     function renderCategoriesGrid() {
         const categoriesGrid = document.getElementById('categoriesGrid');
         $.ajax({
-            url: "/silos/cms/book/categories/queryPage",
+            url: "/cms/book/categories/queryPage",
             type: "POST",
             dataType: "json",
             async: false,

+ 2 - 2
imwork-windows/imwork-silos/src/main/resources/static/business/cms/book/chapter/chapter.js

@@ -24,7 +24,7 @@ layui.config({
     const CONFIG = {
         table: {
             elem: '#list',
-            url: '/silos/cms/book/contents/queryPage',
+            url: '/cms/book/contents/queryPage',
             method: 'POST',
             contentType: 'application/json;charset=utf-8',
             page: true,
@@ -116,7 +116,7 @@ layui.config({
 
             return new Promise((resolve, reject) => {
                 $.ajax({
-                    url: "/silos/cms/book/contents/queryPage",
+                    url: "/cms/book/contents/queryPage",
                     type: "POST",
                     dataType: "json",
                     contentType: 'application/json;charset=UTF-8',

+ 1 - 1
imwork-windows/imwork-silos/src/main/resources/static/business/cms/book/contents/edit.js

@@ -45,7 +45,7 @@ layui.use(['form', 'layer'], function () {
         const contentText= tinymce.activeEditor.getContent({ format: 'text' });
         //实际使用时的提交信息
         $.ajax( {
-            url : "/silos/cms/books/contents/save",
+            url : "/cms/books/contents/save",
             type : "POST",
             dataType:"json",
             contentType:'application/json;charset=UTF-8',

+ 2 - 2
imwork-windows/imwork-silos/src/main/resources/static/business/cms/book/contents/list.js

@@ -10,7 +10,7 @@ layui.config({
     //用户列表
     var tableIns = table.render({
         elem: '#list',
-        url: '/silos/cms/book/contents/queryPage',
+        url: '/cms/book/contents/queryPage',
         method: 'POST',
         dataType: 'json',
         contentType: 'application/json;charset=utf-8',
@@ -121,7 +121,7 @@ layui.config({
         const index = layui.layer.open({
             title: title,
             type: 2,
-            content: "/silos/cms/book/contents/edit.html",
+            content: "/cms/book/contents/edit.html",
             scrollbar: false,
             success: function (layero, index) {
                 var body = layui.layer.getChildFrame('body', index);

+ 1 - 1
imwork-windows/imwork-silos/src/main/resources/static/business/cms/book/info/edit.js

@@ -8,7 +8,7 @@ layui.use(['form', 'layer'], function () {
         const index = top.layer.msg('数据提交中,请稍候', {icon: 16, time: false, shade: 0.8});
         //实际使用时的提交信息
         $.ajax( {
-            url : "/silos/cms/book/info/save",
+            url : "/cms/book/info/save",
             type : "POST",
             dataType:"json",
             contentType:'application/json;charset=UTF-8',

+ 5 - 5
imwork-windows/imwork-silos/src/main/resources/static/business/cms/book/info/list.js

@@ -21,7 +21,7 @@ layui.config({
     const CONFIG = {
         table: {
             elem: '#list',
-            url: '/silos/cms/book/info/queryPage',
+            url: '/cms/book/info/queryPage',
             method: 'POST',
             contentType: 'application/json;charset=utf-8',
             page: true,
@@ -52,7 +52,7 @@ layui.config({
         var index = layui.layer.open({
             title: title,
             type: 2,
-            content: "/silos/cms/book/info/edit.html",
+            content: "/cms/book/info/edit.html",
             area: ['95%', '95%'],
             maxmin: true,
             success: function (layero, index) {
@@ -83,7 +83,7 @@ layui.config({
         });
 
         $.ajax({
-            url: "/silos/cms/book/info/queryPage",
+            url: "/cms/book/info/queryPage",
             type: "POST",
             dataType: "json",
             contentType: 'application/json;charset=UTF-8',
@@ -152,7 +152,7 @@ layui.config({
     function initCategory() {
         var requestData = $.extend({}, CONFIG.grid);
         $.ajax({
-            url: "/silos/cms/book/categories/queryPage",
+            url: "/cms/book/categories/queryPage",
             type: "POST",
             dataType: "json",
             contentType: 'application/json;charset=UTF-8',
@@ -283,7 +283,7 @@ layui.config({
             shadeClose: true,
             shade: 0.8,
             area: ['100%', '100%'],
-            content: '/silos/cms/book/chapter/chapter.html/'+bookId
+            content: '/cms/book/chapter/chapter.html/'+bookId
         });
     }
 

+ 5 - 5
imwork-windows/imwork-silos/src/main/resources/static/business/upms/role/list.js

@@ -9,7 +9,7 @@ layui.use(['form','layer','table','laytpl'],function(){
     var tableIns = table.render({
         elem: '#list',
         /*url : '../../json/userList.json',*/
-        url : '/silos/upms/sysrole/queryPage',
+        url : '/upms/sysrole/queryPage',
         method: 'POST',
         dataType: 'json',
         contentType: 'application/json;charset=utf-8',
@@ -92,7 +92,7 @@ layui.use(['form','layer','table','laytpl'],function(){
         var index = layui.layer.open({
             title : "添加信息",
             type : 2,
-            content : "/silos/upms/sysrole/update",
+            content : "/upms/sysrole/update",
             success : function(layero, index){
                 var body = layui.layer.getChildFrame('body', index);
                 if(edit){
@@ -135,7 +135,7 @@ layui.use(['form','layer','table','laytpl'],function(){
             layer.confirm('确定删除选中的条目?', {icon: 3, title: '提示信息'}, function (index) {
 
                 $.ajax( {
-                    url : "/silos/upms/sysrole/deleteInfoByIds/"+ids,
+                    url : "/upms/sysrole/deleteInfoByIds/"+ids,
                     type : "POST",
                     dataType:"json",
                     async : false,
@@ -186,7 +186,7 @@ layui.use(['form','layer','table','laytpl'],function(){
         }else if(layEvent === 'del'){ //删除
             layer.confirm('确定删除?', {icon: 3, title: '提示信息'}, function (index) {
                 $.ajax({
-                    url: "/silos/upms/sysrole/deleteInfoByIds/" + data.id,
+                    url: "/upms/sysrole/deleteInfoByIds/" + data.id,
                     type: "POST",
                     dataType: "json",
                     async: false,
@@ -224,7 +224,7 @@ layui.use(['form','layer','table','laytpl'],function(){
                 shadeClose: true,
                 shade: 0.8,
                 area: ['380px', '80%'],
-                content: "/silos/upms/sysrole/allot?ids="+ids,
+                content: "/upms/sysrole/allot?ids="+ids,
                 success : function(layero, index){
                     var body = layui.layer.getChildFrame('body', index);
 

+ 1 - 1
imwork-windows/imwork-silos/src/main/resources/static/business/upms/user/edit.js

@@ -8,7 +8,7 @@ layui.use(['form', 'layer'], function () {
         const index = top.layer.msg('数据提交中,请稍候', {icon: 16, time: false, shade: 0.8});
         //实际使用时的提交信息
         $.ajax( {
-            url : "/silos/upms/sysuser/save",
+            url : "/upms/sysuser/save",
             type : "POST",
             dataType:"json",
             contentType:'application/json;charset=UTF-8',

+ 5 - 5
imwork-windows/imwork-silos/src/main/resources/static/business/upms/user/list.js

@@ -11,7 +11,7 @@ layui.config({
     //用户列表
     var tableIns = table.render({
         elem: '#list',
-        url: '/silos/upms/sysuser/queryPage',
+        url: '/upms/sysuser/queryPage',
         method: 'POST',
         dataType: 'json',
         contentType: 'application/json;charset=utf-8',
@@ -159,7 +159,7 @@ layui.config({
         const index = layui.layer.open({
             title: title,
             type: 2,
-            content: "/silos/upms/sysuser/edit.html",
+            content: "/upms/sysuser/edit.html",
             success: function (layero, index) {
                 var body = layui.layer.getChildFrame('body', index);
                 if (edit) {
@@ -197,7 +197,7 @@ layui.config({
             }
             layer.confirm('确定删除选中的用户?', {icon: 3, title: '提示信息'}, function (index) {
                 $.ajax({
-                    url: "/silos/upms/sysuser/deleteByIds",
+                    url: "/upms/sysuser/deleteByIds",
                     type: "POST",
                     dataType: "json",
                     async: false,
@@ -250,7 +250,7 @@ layui.config({
         } else if (layEvent === 'del') { //删除
             let id = data.id
             layer.confirm('确定删除此用户?', {icon: 3, title: '提示信息'}, function (index) {
-                $.get("/silos/upms/sysuser/delete", {
+                $.get("/upms/sysuser/delete", {
                     id: id  //将需要删除的newsId作为参数传入
                 }, function (data) {
                     tableIns.reload();
@@ -273,7 +273,7 @@ layui.config({
             var index = layui.layer.open({
                 title: "分配角色",
                 type: 2,
-                content: "/silos/upms/sysuser/allot?ids=" + ids,
+                content: "/upms/sysuser/allot?ids=" + ids,
                 success: function (layero, index) {
                     var body = layui.layer.getChildFrame('body', index);
 

+ 1 - 1
imwork-windows/imwork-silos/src/main/resources/templates/login/login.html

@@ -29,7 +29,7 @@
         <strong>Silos-Admin管理系统后台</strong>
         <em>Management System</em>
     </h1>
-    <form method="post" action="../silos/index.html">
+    <form method="post" action="../auth/login">
         <div class="layui-form-item">
             <input type="username" name="username" placeholder="用户名" class="layui-input">
             <i class="layui-icon input-icon">&#xe66f;</i>

+ 11 - 11
imwork-windows/imwork-silos/src/main/resources/templates/main/index.html

@@ -41,32 +41,32 @@
             <li class="canvas-nav-item">
                 <a href="javascript:;"><i class="fa fa-cogs icons"></i><span>系统管理</span><i class="layui-icon layui-icon-right icon-right"></i></a>
                 <ul>
-                    <li><a href="/silos/upms/organization/list.html" id="2" class="tabs"><span>组织管理</span></a></li>
+                    <li><a href="/upms/organization/list.html" id="2" class="tabs"><span>组织管理</span></a></li>
                 </ul>
             </li>
             <li class="canvas-nav-item">
                 <a href="javascript:;"><i class="fa fa-users icons"></i><span>权限管理</span><i class="layui-icon layui-icon-right icon-right"></i></a>
                 <ul>
-                    <li><a href="/silos/upms/user/list.html" class="tabs" id="3" icons="fa fa-user-o"><span>用户管理</span></a></li>
-                    <li><a href="/silos/upms/permission/list.html" class="tabs" id="4"><span>权限管理</span></a></li>
-                    <li><a href="/silos/upms/role/list.html" class="tabs" id="5"><span>角色管理</span></a></li>
+                    <li><a href="/upms/user/list.html" class="tabs" id="3" icons="fa fa-user-o"><span>用户管理</span></a></li>
+                    <li><a href="/upms/permission/list.html" class="tabs" id="4"><span>权限管理</span></a></li>
+                    <li><a href="/upms/role/list.html" class="tabs" id="5"><span>角色管理</span></a></li>
                 </ul>
             </li>
             <li class="canvas-nav-item">
                 <a href="javascript:;"><i class="fa fa-database icons"></i><span>内容管理</span><i class="layui-icon layui-icon-right icon-right"></i></a>
                 <ul>
-                    <li><a href="/silos/cms/book/info/list.html" class="tabs" id="6"><span>图书管理</span></a></li>
-                    <li><a href="/silos/cms/book/contents/list.html" class="tabs" id="10"><span>章节管理</span></a></li>
-                    <li><a href="/silos/cms/book/category/list.html" class="tabs" id="7"><span>分类管理</span></a></li>
+                    <li><a href="/cms/book/info/list.html" class="tabs" id="6"><span>图书管理</span></a></li>
+                    <li><a href="/cms/book/contents/list.html" class="tabs" id="10"><span>章节管理</span></a></li>
+                    <li><a href="/cms/book/category/list.html" class="tabs" id="7"><span>分类管理</span></a></li>
                 </ul>
             </li>
             <li class="canvas-nav-item">
                 <a href="javascript:;" id="hah"><i class="fa fa-database icons"></i><span>数据管理</span><i class="layui-icon layui-icon-right icon-right"></i></a>
                 <ul>
-                    <li><a href="/silos/generator/generator.html" class="tabs"><span>代码生成</span></a></li>
-                    <li><a href="/admin/welcome.html" class="tabs"><span>网站设置</span></a></li>
-                    <li><a href="/admin/login/login.html" class="tabs"><span>友情链接</span></a></li>
-                    <li><a href="/admin/cms/article/article-detail.html" class="tabs"><span>分类管理</span></a></li>
+                    <li><a href="/generator/generator.html" class="tabs"><span>代码生成</span></a></li>
+                    <li><a href="/welcome.html" class="tabs"><span>网站设置</span></a></li>
+                    <li><a href="/login/login.html" class="tabs"><span>友情链接</span></a></li>
+                    <li><a href="/cms/article/article-detail.html" class="tabs"><span>分类管理</span></a></li>
                     <li><a href="javascript:;" class="tabs"><span>系统日志</span></a></li>
                 </ul>
             </li>