- getRouters returns a menu with path='/' and component='Layout'
- This conflicts with the constant '/' route that redirects to '/index'
- Flatten such menus to their children to preserve the original root redirect
- This fixes the issue where getRouters success was followed by another /login call
- RuoYi /getInfo returns user/roles/permissions at top level, not nested in data
- Support both formats: {data:{user,roles,permissions}} and {user,roles,permissions}
- This fixes the silent exception in navigation guard that redirected back to login
- Add isSubmitting guard to prevent multiple concurrent login requests
- Set loading and submitting flags before validation to avoid race conditions
- This fixes the issue where multiple /login requests were fired simultaneously
- Replace validate(async callback) with await validate() Promise API
- Use window.location.replace('/') for cleaner redirect
- Unify form submission via @submit.prevent and native-type submit
- Remove duplicate click and keyup.enter handlers
- Change selectCaptchaOnOff() default from true to false
- Compatible with new frontend (ruoyi-ui-next) which has no captcha input
- Existing explicit config still takes effect
- Add request interceptor to inject Authorization Bearer token
- Add response interceptor to handle AjaxResult format uniformly
- Fix getInfo() response parsing to read nested data.user/roles/permissions
- Ensure login token is correctly extracted and stored
Root cause: apiClient had no interceptors, so getInfo() sent requests
without token after login, causing 401 and redirect back to login.
- Fix login page background and button styles using fixed color values
- Add ElMessage success/error feedback for login attempts
- Replace window.location.href with router.push for proper navigation
- Improve input field styles for dark theme
- Add Caffeine local cache dependency for high-frequency access scenarios
- Configure Spring Cache with Caffeine as primary CacheManager and Redis as secondary
- Add @Cacheable/@CacheEvict annotations to SysDictTypeServiceImpl
- Add @Cacheable/@CacheEvict annotations to SysConfigServiceImpl
- Add @Cacheable/@CacheEvict annotations to SysUserServiceImpl
- Create CacheUtils utility class for programmatic cache operations
- Extend CacheController with cache management endpoints (list, clear)
- Add JUnit 5 and Mockito test dependencies to root pom.xml
- Add maven-surefire-plugin configuration for test execution
- Create BaseTest abstract class for Spring + Mockito support
- Add SysUserServiceImplTest with 7 test cases (CRUD operations, username uniqueness)
- Add AccountServiceImplTest with 5 test cases (CRUD operations)
- Add StringUtilsTest with 10 test cases (string utility methods)
- Total: 22 test cases, all passing
- Fix 48 TypeScript errors across all view and component files
- Fix SCSS :global syntax causing build failures
- Update vite.config.ts port to 5173
- Add global type declarations for missing modules
- Fix API response type access patterns (res.data.rows)
- Fix Element Plus component type mismatches
- Update README with project documentation
- Run Prettier code formatting
- Vue Router 4 with navigation guards and dynamic route loading
- Pinia stores for user, permission, and app state management
- Axios API layer with request/response interceptors
- Permission control (v-hasPermi, v-hasRole directives)
- Utility functions (auth, validate, permission)
- Layout component with sidebar, navbar, and breadcrumbs
- Error pages (401, 404) and redirect view
- Login API integration with user store