提交 f5623fb0 authored 作者: lidongxu's avatar lidongxu

feat(login): 登录功能完成

登录功能包含工号和密码登录,飞书网页授权登录,飞书客户端静默授权登录
上级 cbaaba4d
...@@ -14,5 +14,5 @@ VITE_APP_ENV = 'development' ...@@ -14,5 +14,5 @@ VITE_APP_ENV = 'development'
VITE_APP_PUBLIC_PATH = '/' VITE_APP_PUBLIC_PATH = '/'
# 第三方服务回调地址 # 第三方服务回调地址
VITE_APP_RedirectURL = 'http://localhost:81/' VITE_APP_REDIRECT_URL = 'http://localhost:81/'
...@@ -11,5 +11,5 @@ VITE_APP_ENV = 'production' ...@@ -11,5 +11,5 @@ VITE_APP_ENV = 'production'
VITE_APP_PUBLIC_PATH = './' VITE_APP_PUBLIC_PATH = './'
# 第三方服务回调地址 # 第三方服务回调地址
VITE_APP_RedirectURL = 'http://sfa.wxl66.cn:86/link/' VITE_APP_REDIRECT_URL = 'http://111.198.15.68:86/link/'
...@@ -5,10 +5,10 @@ VITE_APP_TITLE = 王小卤-链路中心 ...@@ -5,10 +5,10 @@ VITE_APP_TITLE = 王小卤-链路中心
VITE_APP_BASE_API = '/api' VITE_APP_BASE_API = '/api'
# 开发环境配置 # 开发环境配置
VITE_APP_NODE_ENV = 'staging' VITE_APP_ENV = 'staging'
# 公共资源前缀地址 # 公共资源前缀地址
VITE_APP_PUBLIC_PATH = './' VITE_APP_PUBLIC_PATH = './'
# 第三方服务回调地址 # 第三方服务回调地址
VITE_APP_REDIRECT_URL = 'http://sfa.test.wxl66.cn:85/link/' VITE_APP_REDIRECT_URL = 'http://111.198.15.68:85/link/'
import request from '@/utils/request'
// 竞品分析
// 蝉妈妈-各大竞品直播间数据集合
export function getCmmListAPI(params) {
return request({
url: '/bi/oppo/cmm/zbj',
params
})
}
// 生意参谋-各大竞品直播间数据集合
export function getSycmListAPI(params) {
return request({
url: '/bi/oppo/sycm/list',
params
})
}
\ No newline at end of file
import request from '@/utils/request'
// 获取系列数据列表(左侧树)
export const getSeriesListAPI = () => {
return request({
url: '/bi/prd/query/series'
})
}
// 获取商品列表
export const getProductListAPI = (params) => {
return request({
url: '/bi/prd/query',
params
})
}
// 创建商品标签集合
export function createSeriesGoodsTagAPI(data) {
return request({
url: '/bi/prd_tage/core',
method: 'post',
data
})
}
// 查询商品标签集合列表
export function getSeriesGoodsTagListAPI(params) {
return request({
url: '/bi/prd_tage/query/page',
params
})
}
// 查询商品标签详情
export function getPrdTagDetailAPI(params) {
return request({
url: '/bi/prd_tage/query/infos',
params
})
}
// 删除商品标签
export function deleteSeriesGoodsTagAPI(tagId) {
return request({
url: '/bi/prd_tage/core/' + tagId,
method: 'delete'
})
}
\ No newline at end of file
// 电商销售分析数据
import request from '@/utils/request'
// 电商平台明细表
export const getSaleListAPI = (params) => {
return request({
url: '/bi/market/detail/sum_d',
method: 'get',
params
})
}
// export const getQueryList = (params) => {
// return axios({
// url: '/my/search_list',
// method: 'get',
// params
// })
// }
// 电商货需上传表格
export const uploadDemandImportAPI = (data) => {
return request({
url: '/bi/demand/core/import',
method: 'post',
data,
headers: {
'Content-Type': 'multipart/form-data'
}
})
}
\ No newline at end of file
import request from '@/utils/request'
// 查询电商-店铺列表
export function listStore(query) {
return request({
url: '/bi/store/query/list',
method: 'get',
params: query
})
}
// 新增电商-店铺
export function addStore(data) {
return request({
url: '/bi/store/core',
method: 'post',
data: data
})
}
// 修改电商-店铺
export function updateStore(data) {
return request({
url: '/bi/store/core',
method: 'put',
data: data
})
}
import request from '@/utils/request'
import { FS_APPID } from '@/config'
/****************** 飞书相关业务接口 ******************/
// 浏览器端授权飞书登录,回调地址 URL 上带回 code
export const fsOAuthUrl = `https://accounts.feishu.cn/open-apis/authen/v1/authorize?client_id=${FS_APPID}&state=fs&redirect_uri=${import.meta.env.VITE_APP_REDIRECT_URL}`
/**
* 飞书客户端-静默授权获取 code
* @returns {Promise}
*/
export function fsClientAuth() {
return new Promise((resolve, reject) => {
// 客户端内
window.h5sdk.ready(async () => {
if (window.tt?.requestAccess) {
window.tt.requestAccess({
scopeList: [],
appID: FS_APPID,
success: async ({ code }) => {
resolve(code)
}
})
}
})
})
}
/**
* 飞书登录
* @param {*} data { code: 授权码 }
* @returns
*/
export function fsLogin(data) {
return request({
url: '/auth/fs/login',
method: 'POST',
data
})
}
// 账号密码登录
export function login(data) {
return request({
url: '/auth/login',
method: 'post',
data
})
}
// 获取用户详细信息
export function getInfo() {
return request({
url: '/system/user/getInfo'
})
}
// 退出方法
export function logout() {
return request({
url: '/auth/logout',
method: 'delete'
})
}
\ No newline at end of file
import request from '@/utils/request' import request from '@/utils/request'
// 获取路由 // 获取路由列表
export const getRouters = () => { export const getRouters = () => {
return request({ return request({
url: '/system/menu/getRouters', url: '/system/menu/getRouters'
method: 'get'
}) })
} }
\ No newline at end of file
// 项目所有表单开窗查询接口
import request from '@/utils/request'
// 表单开窗查询固定接口(包含查询表单结构和表格对应数据)
const openQueryURL = '/system/general/query/window'
// 获取"考勤配置"开窗+考勤规则数据
export const attendanceOpenFQAPI = (wheres = {}) => {
return request({
url: openQueryURL,
method: 'POST',
data: {
queryId: 3, // (3 号)是和后台约定好的固定类型数字
wheres // wherers 查询条件
}
})
}
import request from '@/utils/request' import request from '@/utils/request'
// 获取服务信息 // 省市区查询
export function getServer() { export const getProCityAPI = (params) => {
return request({ return request({
url: '/monitor/server', url: '/system/site/query/region',
method: 'get' params
}) })
} }
\ No newline at end of file
export * from './common/login'
export * from './common/menu'
export * from './common/region'
export * from './common/openQuery'
// export * from './bi/competitor'
\ No newline at end of file
import request from '@/utils/request'
// 登录方法
export function login(username, password, code, uuid) {
const data = {
username,
password,
code,
uuid
}
return request({
url: '/login',
headers: {
isToken: false,
repeatSubmit: false
},
method: 'post',
data: data
})
}
// 注册方法
export function register(data) {
return request({
url: '/register',
headers: {
isToken: false
},
method: 'post',
data: data
})
}
// 获取用户详细信息
export function getInfo() {
return request({
url: '/system/user/getInfo',
method: 'get'
})
}
// 退出方法
export function logout() {
return request({
url: '/logout',
method: 'post'
})
}
// 获取验证码
export function getCodeImg() {
return request({
url: '/captchaImage',
headers: {
isToken: false
},
method: 'get',
timeout: 20000
})
}
\ No newline at end of file
import request from '@/utils/request'
// 查询缓存详细
export function getCache() {
return request({
url: '/monitor/cache',
method: 'get'
})
}
// 查询缓存名称列表
export function listCacheName() {
return request({
url: '/monitor/cache/getNames',
method: 'get'
})
}
// 查询缓存键名列表
export function listCacheKey(cacheName) {
return request({
url: '/monitor/cache/getKeys/' + cacheName,
method: 'get'
})
}
// 查询缓存内容
export function getCacheValue(cacheName, cacheKey) {
return request({
url: '/monitor/cache/getValue/' + cacheName + '/' + cacheKey,
method: 'get'
})
}
// 清理指定名称缓存
export function clearCacheName(cacheName) {
return request({
url: '/monitor/cache/clearCacheName/' + cacheName,
method: 'delete'
})
}
// 清理指定键名缓存
export function clearCacheKey(cacheKey) {
return request({
url: '/monitor/cache/clearCacheKey/' + cacheKey,
method: 'delete'
})
}
// 清理全部缓存
export function clearCacheAll() {
return request({
url: '/monitor/cache/clearCacheAll',
method: 'delete'
})
}
...@@ -3,7 +3,7 @@ import request from '@/utils/request' ...@@ -3,7 +3,7 @@ import request from '@/utils/request'
// 查询定时任务调度列表 // 查询定时任务调度列表
export function listJob(query) { export function listJob(query) {
return request({ return request({
url: '/monitor/job/list', url: '/schedule/job/list',
method: 'get', method: 'get',
params: query params: query
}) })
...@@ -12,7 +12,7 @@ export function listJob(query) { ...@@ -12,7 +12,7 @@ export function listJob(query) {
// 查询定时任务调度详细 // 查询定时任务调度详细
export function getJob(jobId) { export function getJob(jobId) {
return request({ return request({
url: '/monitor/job/' + jobId, url: '/schedule/job/' + jobId,
method: 'get' method: 'get'
}) })
} }
...@@ -20,7 +20,7 @@ export function getJob(jobId) { ...@@ -20,7 +20,7 @@ export function getJob(jobId) {
// 新增定时任务调度 // 新增定时任务调度
export function addJob(data) { export function addJob(data) {
return request({ return request({
url: '/monitor/job', url: '/schedule/job',
method: 'post', method: 'post',
data: data data: data
}) })
...@@ -29,7 +29,7 @@ export function addJob(data) { ...@@ -29,7 +29,7 @@ export function addJob(data) {
// 修改定时任务调度 // 修改定时任务调度
export function updateJob(data) { export function updateJob(data) {
return request({ return request({
url: '/monitor/job', url: '/schedule/job',
method: 'put', method: 'put',
data: data data: data
}) })
...@@ -38,7 +38,7 @@ export function updateJob(data) { ...@@ -38,7 +38,7 @@ export function updateJob(data) {
// 删除定时任务调度 // 删除定时任务调度
export function delJob(jobId) { export function delJob(jobId) {
return request({ return request({
url: '/monitor/job/' + jobId, url: '/schedule/job/' + jobId,
method: 'delete' method: 'delete'
}) })
} }
...@@ -50,7 +50,7 @@ export function changeJobStatus(jobId, status) { ...@@ -50,7 +50,7 @@ export function changeJobStatus(jobId, status) {
status status
} }
return request({ return request({
url: '/monitor/job/changeStatus', url: '/schedule/job/changeStatus',
method: 'put', method: 'put',
data: data data: data
}) })
...@@ -64,7 +64,7 @@ export function runJob(jobId, jobGroup) { ...@@ -64,7 +64,7 @@ export function runJob(jobId, jobGroup) {
jobGroup jobGroup
} }
return request({ return request({
url: '/monitor/job/run', url: '/schedule/job/run',
method: 'put', method: 'put',
data: data data: data
}) })
......
...@@ -3,7 +3,7 @@ import request from '@/utils/request' ...@@ -3,7 +3,7 @@ import request from '@/utils/request'
// 查询调度日志列表 // 查询调度日志列表
export function listJobLog(query) { export function listJobLog(query) {
return request({ return request({
url: '/monitor/jobLog/list', url: '/schedule/job/log/list',
method: 'get', method: 'get',
params: query params: query
}) })
...@@ -12,7 +12,7 @@ export function listJobLog(query) { ...@@ -12,7 +12,7 @@ export function listJobLog(query) {
// 删除调度日志 // 删除调度日志
export function delJobLog(jobLogId) { export function delJobLog(jobLogId) {
return request({ return request({
url: '/monitor/jobLog/' + jobLogId, url: '/schedule/job/log/' + jobLogId,
method: 'delete' method: 'delete'
}) })
} }
...@@ -20,7 +20,7 @@ export function delJobLog(jobLogId) { ...@@ -20,7 +20,7 @@ export function delJobLog(jobLogId) {
// 清空调度日志 // 清空调度日志
export function cleanJobLog() { export function cleanJobLog() {
return request({ return request({
url: '/monitor/jobLog/clean', url: '/schedule/job/log/clean',
method: 'delete' method: 'delete'
}) })
} }
...@@ -3,7 +3,7 @@ import request from '@/utils/request' ...@@ -3,7 +3,7 @@ import request from '@/utils/request'
// 查询在线用户列表 // 查询在线用户列表
export function list(query) { export function list(query) {
return request({ return request({
url: '/monitor/online/list', url: '/system/online/list',
method: 'get', method: 'get',
params: query params: query
}) })
...@@ -12,7 +12,7 @@ export function list(query) { ...@@ -12,7 +12,7 @@ export function list(query) {
// 强退用户 // 强退用户
export function forceLogout(tokenId) { export function forceLogout(tokenId) {
return request({ return request({
url: '/monitor/online/' + tokenId, url: '/system/online/' + tokenId,
method: 'delete' method: 'delete'
}) })
} }
...@@ -3,7 +3,7 @@ import request from '@/utils/request' ...@@ -3,7 +3,7 @@ import request from '@/utils/request'
// 查询登录日志列表 // 查询登录日志列表
export function list(query) { export function list(query) {
return request({ return request({
url: '/monitor/logininfor/list', url: '/system/logininfor/list',
method: 'get', method: 'get',
params: query params: query
}) })
...@@ -12,7 +12,7 @@ export function list(query) { ...@@ -12,7 +12,7 @@ export function list(query) {
// 删除登录日志 // 删除登录日志
export function delLogininfor(infoId) { export function delLogininfor(infoId) {
return request({ return request({
url: '/monitor/logininfor/' + infoId, url: '/system/logininfor/' + infoId,
method: 'delete' method: 'delete'
}) })
} }
...@@ -20,15 +20,14 @@ export function delLogininfor(infoId) { ...@@ -20,15 +20,14 @@ export function delLogininfor(infoId) {
// 解锁用户登录状态 // 解锁用户登录状态
export function unlockLogininfor(userName) { export function unlockLogininfor(userName) {
return request({ return request({
url: '/monitor/logininfor/unlock/' + userName, url: '/system/logininfor/unlock/' + userName,
method: 'get' method: 'get'
}) })
} }
// 清空登录日志 // 清空登录日志
export function cleanLogininfor() { export function cleanLogininfor() {
return request({ return request({
url: '/monitor/logininfor/clean', url: '/system/logininfor/clean',
method: 'delete' method: 'delete'
}) })
} }
...@@ -3,7 +3,7 @@ import request from '@/utils/request' ...@@ -3,7 +3,7 @@ import request from '@/utils/request'
// 查询操作日志列表 // 查询操作日志列表
export function list(query) { export function list(query) {
return request({ return request({
url: '/monitor/operlog/list', url: '/system/operlog/list',
method: 'get', method: 'get',
params: query params: query
}) })
...@@ -12,7 +12,7 @@ export function list(query) { ...@@ -12,7 +12,7 @@ export function list(query) {
// 删除操作日志 // 删除操作日志
export function delOperlog(operId) { export function delOperlog(operId) {
return request({ return request({
url: '/monitor/operlog/' + operId, url: '/system/operlog/' + operId,
method: 'delete' method: 'delete'
}) })
} }
...@@ -20,7 +20,7 @@ export function delOperlog(operId) { ...@@ -20,7 +20,7 @@ export function delOperlog(operId) {
// 清空操作日志 // 清空操作日志
export function cleanOperlog() { export function cleanOperlog() {
return request({ return request({
url: '/monitor/operlog/clean', url: '/system/operlog/clean',
method: 'delete' method: 'delete'
}) })
} }
...@@ -68,7 +68,8 @@ export function delRole(roleId) { ...@@ -68,7 +68,8 @@ export function delRole(roleId) {
// 查询角色已授权用户列表 // 查询角色已授权用户列表
export function allocatedUserList(query) { export function allocatedUserList(query) {
return request({ return request({
url: '/system/role/authUser/allocatedList', // url: '/system/role/authUser/allocatedList',
url: '/system/user/list',
method: 'get', method: 'get',
params: query params: query
}) })
...@@ -77,9 +78,12 @@ export function allocatedUserList(query) { ...@@ -77,9 +78,12 @@ export function allocatedUserList(query) {
// 查询角色未授权用户列表 // 查询角色未授权用户列表
export function unallocatedUserList(query) { export function unallocatedUserList(query) {
return request({ return request({
url: '/system/role/authUser/unallocatedList', url: '/system/user/list',
method: 'get', method: 'get',
params: query params: {
...query,
existRole: false
}
}) })
} }
......
import request from '@/utils/request'
// 考勤规则-列表
export function listRule(query) {
return request({
url: '/system/kq_rule/list',
method: 'get',
params: query
})
}
// 考勤规则-详细
export function getRule(ruleId) {
return request({
url: '/system/kq_rule/' + ruleId,
method: 'get'
})
}
// 新增考勤规则
export function addRule(data) {
return request({
url: '/system/kq_rule/add',
method: 'post',
data: data
})
}
// 修改考勤规则
export function updateRule(data) {
return request({
url: '/system/kq_rule/put',
method: 'put',
data: data
})
}
// 删除考勤规则
export function delRule(ruleId) {
return request({
url: '/system/kq_rule/' + ruleId,
method: 'delete'
})
}
import request from '@/utils/request' import request from '@/utils/request'
import { parseStrEmpty } from "@/utils/ruoyi"; import { parseStrEmpty } from "@/utils";
// 查询用户列表 // 查询用户列表
export function listUser(query) { export function listUser(query) {
...@@ -96,7 +96,7 @@ export function updateUserPwd(oldPassword, newPassword) { ...@@ -96,7 +96,7 @@ export function updateUserPwd(oldPassword, newPassword) {
return request({ return request({
url: '/system/user/profile/updatePwd', url: '/system/user/profile/updatePwd',
method: 'put', method: 'put',
data: data params: data
}) })
} }
......
import request from '@/utils/request' import request from "@/utils/request";
// 查询生成表数据 // 查询生成表数据
export function listTable(query) { export function listTable(query) {
return request({ return request({
url: '/tool/gen/list', url: "/code/gen/list",
method: 'get', method: "get",
params: query params: query,
}) });
} }
// 查询db数据库列表 // 查询db数据库列表
export function listDbTable(query) { export function listDbTable(query) {
return request({ return request({
url: '/tool/gen/db/list', url: "/code/gen/db/list",
method: 'get', method: "get",
params: query params: query,
}) });
} }
// 查询表详细信息 // 查询表详细信息
export function getGenTable(tableId) { export function getGenTable(tableId) {
return request({ return request({
url: '/tool/gen/' + tableId, url: "/code/gen/" + tableId,
method: 'get' method: "get",
}) });
} }
// 修改代码生成信息 // 修改代码生成信息
export function updateGenTable(data) { export function updateGenTable(data) {
return request({ return request({
url: '/tool/gen', url: "/code/gen",
method: 'put', method: "put",
data: data data: data,
}) });
} }
// 导入表 // 导入表
export function importTable(data) { export function importTable(data) {
return request({ return request({
url: '/tool/gen/importTable', url: "/code/gen/importTable",
method: 'post', method: "post",
params: data params: data,
}) });
}
// 创建表
export function createTable(data) {
return request({
url: '/tool/gen/createTable',
method: 'post',
params: data
})
} }
// 预览生成代码 // 预览生成代码
export function previewTable(tableId) { export function previewTable(tableId) {
return request({ return request({
url: '/tool/gen/preview/' + tableId, url: "/code/gen/preview/" + tableId,
method: 'get' method: "get",
}) });
} }
// 删除表数据 // 删除表数据
export function delTable(tableId) { export function delTable(tableId) {
return request({ return request({
url: '/tool/gen/' + tableId, url: "/code/gen/" + tableId,
method: 'delete' method: "delete",
}) });
} }
// 生成代码(自定义路径) // 生成代码(自定义路径)
export function genCode(tableName) { export function genCode(tableName) {
return request({ return request({
url: '/tool/gen/genCode/' + tableName, url: "/code/gen/genCode/" + tableName,
method: 'get' method: "get",
}) });
} }
// 同步数据库 // 同步数据库
export function synchDb(tableName) { export function synchDb(tableName) {
return request({ return request({
url: '/tool/gen/synchDb/' + tableName, url: "/code/gen/synchDb/" + tableName,
method: 'get' method: "get",
}) });
}
// 创建表
export function createTable(data) {
return request({
url: "/tool/gen/createTable",
method: "post",
params: data,
});
} }
src/assets/images/login-background.jpg

509.1 KB | W: | H:

src/assets/images/login-background.jpg

140.4 KB | W: | H:

src/assets/images/login-background.jpg
src/assets/images/login-background.jpg
src/assets/images/login-background.jpg
src/assets/images/login-background.jpg
  • 2-up
  • Swipe
  • Onion skin
src/assets/logo/logo.png

5.5 KB | W: | H:

src/assets/logo/logo.png

183.4 KB | W: | H:

src/assets/logo/logo.png
src/assets/logo/logo.png
src/assets/logo/logo.png
src/assets/logo/logo.png
  • 2-up
  • Swipe
  • Onion skin
export const FS_APPID = 'cli_a7dbe3ec7d9e5013'
\ No newline at end of file
import { createWebHistory, createRouter } from 'vue-router' import { createWebHashHistory, createRouter } from 'vue-router'
/* Layout */ /* Layout */
import Layout from '@/layout' import Layout from '@/layout'
...@@ -161,7 +161,7 @@ export const dynamicRoutes = [ ...@@ -161,7 +161,7 @@ export const dynamicRoutes = [
] ]
const router = createRouter({ const router = createRouter({
history: createWebHistory(), history: createWebHashHistory(),
routes: constantRoutes, routes: constantRoutes,
scrollBehavior(to, from, savedPosition) { scrollBehavior(to, from, savedPosition) {
if (savedPosition) { if (savedPosition) {
......
// 仅仅用作 store 里初始值
export default { export default {
/** /**
* 网页标题 * 网页标题
......
import auth from '@/plugins/auth' import auth from '@/plugins/auth'
import router, { constantRoutes, dynamicRoutes } from '@/router' import router, { constantRoutes, dynamicRoutes } from '@/router'
import { getRouters } from '@/api/menu' import { getRouters } from '@/api'
import Layout from '@/layout/index' import Layout from '@/layout/index'
import ParentView from '@/components/ParentView' import ParentView from '@/components/ParentView'
import InnerLink from '@/layout/components/InnerLink' import InnerLink from '@/layout/components/InnerLink'
......
import { login, logout, getInfo } from '@/api/login' import { login, fsLogin, getInfo } from '@/api'
import { getToken, setToken, removeToken } from '@/utils/auth' import { getToken, setToken, removeToken } from '@/utils/auth'
import { isHttp, isEmpty } from "@/utils/validate" import { isHttp, isEmpty } from "@/utils/validate"
import defAva from '@/assets/images/profile.jpg' import defAva from '@/assets/images/profile.jpg'
const useUserStore = defineStore( export default defineStore(
'user', 'user',
{ {
state: () => ({ state: () => ({
...@@ -15,20 +15,31 @@ const useUserStore = defineStore( ...@@ -15,20 +15,31 @@ const useUserStore = defineStore(
permissions: [] permissions: []
}), }),
actions: { actions: {
// 登录 /**
login(userInfo) { * 登录
const username = userInfo.username.trim() * @param {*} param { type: 登录方式 data: 登录数据,code / 工号密码 }
const password = userInfo.password * @returns {Promise}
const code = userInfo.code */
const uuid = userInfo.uuid login({ type, data }) {
const { username, password, code } = data
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
login(username, password, code, uuid).then(res => { if (type === 'upass') {
login({ username, password }).then(res => {
setToken(res.token) setToken(res.token)
this.token = res.token this.token = res.token
resolve() resolve()
}).catch(error => { }).catch(error => {
reject(error) reject(error)
}) })
} else if (type === 'fs') {
fsLogin({ code }).then(res => {
setToken(res.access_token)
this.token = res.access_token
resolve()
}).catch(error => {
reject(error)
})
}
}) })
}, },
// 获取用户信息 // 获取用户信息
...@@ -58,18 +69,17 @@ const useUserStore = defineStore( ...@@ -58,18 +69,17 @@ const useUserStore = defineStore(
// 退出系统 // 退出系统
logOut() { logOut() {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
logout(this.token).then(() => { // logout(this.token).then(() => {
this.token = '' this.token = ''
this.roles = [] this.roles = []
this.permissions = [] this.permissions = []
removeToken() removeToken()
resolve() resolve()
}).catch(error => { // }).catch(error => {
reject(error) // reject(error)
}) // })
}) })
} }
} }
}) })
export default useUserStore
import { parseTime } from './ruoyi' import { parseTime } from './ruoyi'
export * from './jsencrypt.js'
/** /**
* 表格时间格式化 * 表格时间格式化
......
...@@ -87,7 +87,7 @@ service.interceptors.response.use(res => { ...@@ -87,7 +87,7 @@ service.interceptors.response.use(res => {
ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => { ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
isRelogin.show = false; isRelogin.show = false;
useUserStore().logOut().then(() => { useUserStore().logOut().then(() => {
location.href = '/index'; location.href = '#/index';
}) })
}).catch(() => { }).catch(() => {
isRelogin.show = false; isRelogin.show = false;
......
<template> <template>
<div class="login"> <div class="login"
<el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form"> v-if="isShowLogin">
<h3 class="title">若依后台管理系统</h3> <el-form ref="loginRef"
:model="loginForm"
:rules="loginRules"
class="login-form">
<div class="logo">
<img src="@/assets/logo/logo.png" />
</div>
<el-form-item prop="username"> <el-form-item prop="username">
<el-input <el-input v-model="loginForm.username"
v-model="loginForm.username"
type="text" type="text"
size="large" size="large"
auto-complete="off" auto-complete="off"
placeholder="账号" placeholder="工号">
> <template #prefix>
<template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template> <svg-icon icon-class="user"
class="el-input__icon input-icon" />
</template>
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item prop="password"> <el-form-item prop="password">
<el-input <el-input v-model="loginForm.password"
v-model="loginForm.password"
type="password" type="password"
size="large" size="large"
auto-complete="off" auto-complete="off"
placeholder="密码" placeholder="密码"
@keyup.enter="handleLogin" @keyup.enter="handleLogin">
> <template #prefix>
<template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template> <svg-icon icon-class="password"
class="el-input__icon input-icon" />
</template>
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item prop="code" v-if="captchaEnabled"> <el-checkbox v-model="loginForm.rememberMe">记住密码</el-checkbox>
<el-input <el-form-item>
v-model="loginForm.code" <el-button :loading="loading"
size="large"
auto-complete="off"
placeholder="验证码"
style="width: 63%"
@keyup.enter="handleLogin"
>
<template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template>
</el-input>
<div class="login-code">
<img :src="codeUrl" @click="getCode" class="login-code-img"/>
</div>
</el-form-item>
<el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">记住密码</el-checkbox>
<el-form-item style="width:100%;">
<el-button
:loading="loading"
size="large" size="large"
type="primary" type="primary"
style="width:100%;"
@click.prevent="handleLogin" @click.prevent="handleLogin"
> class="login_btn">
<span v-if="!loading">登 录</span> <span v-if="!loading">登 录</span>
<span v-else>登 录 中...</span> <span v-else>登 录 中...</span>
</el-button> </el-button>
<div style="float: right;" v-if="register"> <div class="auth_wrap">
<router-link class="link-type" :to="'/register'">立即注册</router-link> <p>
<span>其他登录方式</span>
</p>
<div class="group">
<a :href="fsOAuthUrl">
<img src="@/assets/logo/feishu.png"
alt=""
class="item">
</a>
</div>
</div> </div>
</el-form-item> </el-form-item>
</el-form> </el-form>
<!-- 底部 --> <!-- 底部 -->
<div class="el-login-footer"> <div class="el-login-footer">
<span>Copyright © 2018-2024 ruoyi.vip All Rights Reserved.</span> <span>Copyright © 2016-{{ (new Date()).getFullYear() }} 王小卤 All Rights Reserved.</span>
</div> </div>
</div> </div>
<div class="auth_wait"
v-else
v-loading="!isShowLogin"
element-loading-text="授权登录中...">
</div>
</template> </template>
<script setup> <script setup>
import { getCodeImg } from "@/api/login"; import { fsOAuthUrl, fsClientAuth } from "@/api";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { encrypt, decrypt } from "@/utils/jsencrypt"; import { encrypt, decrypt } from "@/utils";
import useUserStore from '@/store/modules/user' import useUserStore from '@/store/modules/user'
const userStore = useUserStore() const userStore = useUserStore()
...@@ -76,31 +81,74 @@ const router = useRouter(); ...@@ -76,31 +81,74 @@ const router = useRouter();
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const loginForm = ref({ const loginForm = ref({
username: "admin", username: "",
password: "admin123", password: "",
rememberMe: false, rememberMe: false
code: "",
uuid: ""
}); });
const loginRules = { const loginRules = {
username: [{ required: true, trigger: "blur", message: "请输入您的账号" }], username: [{ required: true, trigger: "blur", message: "请输入您的工号" }],
password: [{ required: true, trigger: "blur", message: "请输入您的密码" }], password: [{ required: true, trigger: "blur", message: "请输入您的密码" }]
code: [{ required: true, trigger: "change", message: "请输入验证码" }]
}; };
const codeUrl = ref("");
const loading = ref(false); const loading = ref(false);
// 验证码开关 const isShowLogin = ref(false);
const captchaEnabled = ref(true);
// 注册开关
const register = ref(false);
const redirect = ref(undefined); const redirect = ref(undefined);
watch(route, (newRoute) => { watch(route, (newRoute) => {
redirect.value = newRoute.query && newRoute.query.redirect; redirect.value = newRoute.query?.redirect;
}, { immediate: true }); }, { immediate: true });
// 回显账号密码
function getCookie() {
const username = Cookies.get("username");
const password = Cookies.get("password");
const rememberMe = Cookies.get("rememberMe");
loginForm.value = {
username: username === undefined ? loginForm.value.username : username,
password: password === undefined ? loginForm.value.password : decrypt(password),
rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
};
}
getCookie();
// code 登录
const loginByType = async (type, data) => {
// 登录
userStore.login({
type,
data
}).then(() => {
const query = route.query;
router.push({ path: redirect.value || "/" });
}).catch(() => {
loading.value = false;
});
}
// 飞书授权登录
const getOAuthState = () => {
const params = new URLSearchParams(window.location.search);
const code = params.get('code');
const state = params.get('state');
if (state === 'fs') {
loginByType('fs', { code })
}
}
getOAuthState()
// 飞书客户端登录
const checkLoginAuth = async () => {
if (window.h5sdk) {
const code = await fsClientAuth()
loginByType('fs', { code })
} else {
isShowLogin.value = true
}
}
checkLoginAuth()
// 工号密码登录
function handleLogin() { function handleLogin() {
proxy.$refs.loginRef.validate(valid => { proxy.$refs.loginRef.validate(valid => {
if (valid) { if (valid) {
...@@ -117,98 +165,103 @@ function handleLogin() { ...@@ -117,98 +165,103 @@ function handleLogin() {
Cookies.remove("rememberMe"); Cookies.remove("rememberMe");
} }
// 调用action的登录方法 // 调用action的登录方法
userStore.login(loginForm.value).then(() => { loginByType('upass', loginForm.value)
const query = route.query;
const otherQueryParams = Object.keys(query).reduce((acc, cur) => {
if (cur !== "redirect") {
acc[cur] = query[cur];
}
return acc;
}, {});
router.push({ path: redirect.value || "/", query: otherQueryParams });
}).catch(() => {
loading.value = false;
// 重新获取验证码
if (captchaEnabled.value) {
getCode();
}
});
} }
}); });
} }
function getCode() {
getCodeImg().then(res => {
captchaEnabled.value = res.captchaEnabled === undefined ? true : res.captchaEnabled;
if (captchaEnabled.value) {
codeUrl.value = "data:image/gif;base64," + res.img;
loginForm.value.uuid = res.uuid;
}
});
}
function getCookie() {
const username = Cookies.get("username");
const password = Cookies.get("password");
const rememberMe = Cookies.get("rememberMe");
loginForm.value = {
username: username === undefined ? loginForm.value.username : username,
password: password === undefined ? loginForm.value.password : decrypt(password),
rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
};
}
getCode();
getCookie();
</script> </script>
<style lang='scss' scoped> <style lang='scss'
.login { scoped>
.login {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
height: 100%; height: 100%;
background-image: url("../assets/images/login-background.jpg"); background-image: url("../assets/images/login-background.jpg");
background-size: cover; background-size: cover;
}
.title {
margin: 0px auto 30px auto;
text-align: center;
color: #707070;
}
.login-form { .login-form {
border-radius: 6px; border-radius: 6px;
background: #ffffff; background: #ffffff;
width: 400px; width: 400px;
padding: 25px 25px 5px 25px; padding: 25px 25px 5px 25px;
.logo {
text-align: center;
margin-bottom: 20px;
img {
width: 150px;
}
}
.el-input { .el-input {
height: 40px; height: 40px;
input { input {
height: 40px; height: 40px;
} }
} }
.input-icon { .input-icon {
height: 39px; height: 39px;
width: 14px; width: 14px;
margin-left: 0px; margin-left: 0px;
} }
}
.login-tip { .login_btn {
font-size: 13px; width: 100%;
border-radius: 20px;
}
// 其他登录方式
.auth_wrap {
width: 100%;
margin-top: 20px;
p {
width: 100%;
padding: 0 20px;
margin: 0;
position: relative;
text-align: center; text-align: center;
color: #bfbfbf;
} span {
.login-code { position: relative;
width: 33%; background: white;
height: 40px; color: gray;
float: right; z-index: 2;
img { padding: 0 20px;
cursor: pointer;
vertical-align: middle;
} }
}
.el-login-footer { &:after {
content: '';
display: block;
width: 100%;
height: 1px;
background: rgb(192, 191, 191);
position: absolute;
left: 0;
top: 50%;
z-index: 0;
transform: translate(0, -50%);
}
}
.group {
display: flex;
justify-content: center;
.item {
width: 50px;
}
}
}
}
// 网页底部标题
.el-login-footer {
height: 40px; height: 40px;
line-height: 40px; line-height: 40px;
position: fixed; position: fixed;
...@@ -219,9 +272,11 @@ getCookie(); ...@@ -219,9 +272,11 @@ getCookie();
font-family: Arial; font-family: Arial;
font-size: 12px; font-size: 12px;
letter-spacing: 1px; letter-spacing: 1px;
} }
.login-code-img { }
height: 40px;
padding-left: 12px; // 授权登录等待容器
} .auth_wait {
height: 100%;
}
</style> </style>
...@@ -17,7 +17,7 @@ export default defineConfig(({ mode, command }) => { ...@@ -17,7 +17,7 @@ export default defineConfig(({ mode, command }) => {
}, },
// vite 相关配置 // vite 相关配置
server: { server: {
port: 80, port: 8080,
host: true, host: true,
open: true, open: true,
proxy: { proxy: {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论