parent
9ba3b104f4
commit
9952cabc8f
4
.env
4
.env
|
@ -1,5 +1,5 @@
|
||||||
# 标题
|
# 标题
|
||||||
VITE_APP_TITLE=芋道管理系统
|
VITE_APP_TITLE=自贸区管理系统
|
||||||
|
|
||||||
# 项目本地运行端口号
|
# 项目本地运行端口号
|
||||||
VITE_PORT=80
|
VITE_PORT=80
|
||||||
|
@ -8,7 +8,7 @@ VITE_PORT=80
|
||||||
VITE_OPEN=true
|
VITE_OPEN=true
|
||||||
|
|
||||||
# 租户开关
|
# 租户开关
|
||||||
VITE_APP_TENANT_ENABLE=true
|
VITE_APP_TENANT_ENABLE=false
|
||||||
|
|
||||||
# 验证码的开关
|
# 验证码的开关
|
||||||
VITE_APP_CAPTCHA_ENABLE=true
|
VITE_APP_CAPTCHA_ENABLE=true
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 128 KiB |
|
@ -114,7 +114,7 @@ export default {
|
||||||
},
|
},
|
||||||
login: {
|
login: {
|
||||||
welcome: '欢迎使用本系统',
|
welcome: '欢迎使用本系统',
|
||||||
message: '开箱即用的中后台管理系统',
|
message: '江苏新元素数字科技有限公司',
|
||||||
tenantname: '租户名称',
|
tenantname: '租户名称',
|
||||||
username: '用户名',
|
username: '用户名',
|
||||||
password: '密码',
|
password: '密码',
|
||||||
|
|
|
@ -58,9 +58,6 @@
|
||||||
{{ t('login.remember') }}
|
{{ t('login.remember') }}
|
||||||
</el-checkbox>
|
</el-checkbox>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :offset="6" :span="12">
|
|
||||||
<el-link style="float: right" type="primary">{{ t('login.forgetPassword') }}</el-link>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
</el-row>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
@ -82,64 +79,6 @@
|
||||||
mode="pop"
|
mode="pop"
|
||||||
@success="handleLogin"
|
@success="handleLogin"
|
||||||
/>
|
/>
|
||||||
<el-col :span="24" style="padding-right: 10px; padding-left: 10px">
|
|
||||||
<el-form-item>
|
|
||||||
<el-row :gutter="5" justify="space-between" style="width: 100%">
|
|
||||||
<el-col :span="8">
|
|
||||||
<XButton
|
|
||||||
:title="t('login.btnMobile')"
|
|
||||||
class="w-[100%]"
|
|
||||||
@click="setLoginState(LoginStateEnum.MOBILE)"
|
|
||||||
/>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="8">
|
|
||||||
<XButton
|
|
||||||
:title="t('login.btnQRCode')"
|
|
||||||
class="w-[100%]"
|
|
||||||
@click="setLoginState(LoginStateEnum.QR_CODE)"
|
|
||||||
/>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="8">
|
|
||||||
<XButton
|
|
||||||
:title="t('login.btnRegister')"
|
|
||||||
class="w-[100%]"
|
|
||||||
@click="setLoginState(LoginStateEnum.REGISTER)"
|
|
||||||
/>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-divider content-position="center">{{ t('login.otherLogin') }}</el-divider>
|
|
||||||
<el-col :span="24" style="padding-right: 10px; padding-left: 10px">
|
|
||||||
<el-form-item>
|
|
||||||
<div class="w-[100%] flex justify-between">
|
|
||||||
<Icon
|
|
||||||
v-for="(item, key) in socialList"
|
|
||||||
:key="key"
|
|
||||||
:icon="item.icon"
|
|
||||||
:size="30"
|
|
||||||
class="anticon cursor-pointer"
|
|
||||||
color="#999"
|
|
||||||
@click="doSocialLogin(item.type)"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-divider content-position="center">萌新必读</el-divider>
|
|
||||||
<el-col :span="24" style="padding-right: 10px; padding-left: 10px">
|
|
||||||
<el-form-item>
|
|
||||||
<div class="w-[100%] flex justify-between">
|
|
||||||
<el-link href="https://doc.iocoder.cn/" target="_blank">📚开发指南</el-link>
|
|
||||||
<el-link href="https://doc.iocoder.cn/video/" target="_blank">🔥视频教程</el-link>
|
|
||||||
<el-link href="https://www.iocoder.cn/Interview/good-collection/" target="_blank">
|
|
||||||
⚡面试手册
|
|
||||||
</el-link>
|
|
||||||
<el-link href="http://static.yudao.iocoder.cn/mp/Aix9975.jpeg" target="_blank">
|
|
||||||
🤝外包咨询
|
|
||||||
</el-link>
|
|
||||||
</div>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
</el-row>
|
||||||
</el-form>
|
</el-form>
|
||||||
</template>
|
</template>
|
||||||
|
@ -158,13 +97,12 @@ import { LoginStateEnum, useFormValid, useLoginState } from './useLogin'
|
||||||
defineOptions({ name: 'LoginForm' })
|
defineOptions({ name: 'LoginForm' })
|
||||||
|
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
const message = useMessage()
|
|
||||||
const iconHouse = useIcon({ icon: 'ep:house' })
|
const iconHouse = useIcon({ icon: 'ep:house' })
|
||||||
const iconAvatar = useIcon({ icon: 'ep:avatar' })
|
const iconAvatar = useIcon({ icon: 'ep:avatar' })
|
||||||
const iconLock = useIcon({ icon: 'ep:lock' })
|
const iconLock = useIcon({ icon: 'ep:lock' })
|
||||||
const formLogin = ref()
|
const formLogin = ref()
|
||||||
const { validForm } = useFormValid(formLogin)
|
const { validForm } = useFormValid(formLogin)
|
||||||
const { setLoginState, getLoginState } = useLoginState()
|
const { getLoginState } = useLoginState()
|
||||||
const { currentRoute, push } = useRouter()
|
const { currentRoute, push } = useRouter()
|
||||||
const permissionStore = usePermissionStore()
|
const permissionStore = usePermissionStore()
|
||||||
const redirect = ref<string>('')
|
const redirect = ref<string>('')
|
||||||
|
@ -192,13 +130,6 @@ const loginData = reactive({
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const socialList = [
|
|
||||||
{ icon: 'ant-design:wechat-filled', type: 30 },
|
|
||||||
{ icon: 'ant-design:dingtalk-circle-filled', type: 20 },
|
|
||||||
{ icon: 'ant-design:github-filled', type: 0 },
|
|
||||||
{ icon: 'ant-design:alipay-circle-filled', type: 0 }
|
|
||||||
]
|
|
||||||
|
|
||||||
// 获取验证码
|
// 获取验证码
|
||||||
const getCode = async () => {
|
const getCode = async () => {
|
||||||
// 情况一,未开启:则直接登录
|
// 情况一,未开启:则直接登录
|
||||||
|
@ -280,42 +211,6 @@ const handleLogin = async (params) => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 社交登录
|
|
||||||
const doSocialLogin = async (type: number) => {
|
|
||||||
if (type === 0) {
|
|
||||||
message.error('此方式未配置')
|
|
||||||
} else {
|
|
||||||
loginLoading.value = true
|
|
||||||
if (loginData.tenantEnable === 'true') {
|
|
||||||
// 尝试先通过 tenantName 获取租户
|
|
||||||
await getTenantId()
|
|
||||||
// 如果获取不到,则需要弹出提示,进行处理
|
|
||||||
if (!authUtil.getTenantId()) {
|
|
||||||
try {
|
|
||||||
const data = await message.prompt('请输入租户名称', t('common.reminder'))
|
|
||||||
if (data?.action !== 'confirm') throw 'cancel'
|
|
||||||
const res = await LoginApi.getTenantIdByName(data.value)
|
|
||||||
authUtil.setTenantId(res)
|
|
||||||
} catch (error) {
|
|
||||||
if (error === 'cancel') return
|
|
||||||
} finally {
|
|
||||||
loginLoading.value = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 计算 redirectUri
|
|
||||||
// tricky: type、redirect需要先encode一次,否则钉钉回调会丢失。
|
|
||||||
// 配合 Login/SocialLogin.vue#getUrlValue() 使用
|
|
||||||
const redirectUri =
|
|
||||||
location.origin +
|
|
||||||
'/social-login?' +
|
|
||||||
encodeURIComponent(`type=${type}&redirect=${redirect.value || '/'}`)
|
|
||||||
|
|
||||||
// 进行跳转
|
|
||||||
const res = await LoginApi.socialAuthRedirect(type, encodeURIComponent(redirectUri))
|
|
||||||
window.location.href = res
|
|
||||||
}
|
|
||||||
}
|
|
||||||
watch(
|
watch(
|
||||||
() => currentRoute.value,
|
() => currentRoute.value,
|
||||||
(route: RouteLocationNormalizedLoaded) => {
|
(route: RouteLocationNormalizedLoaded) => {
|
||||||
|
|
|
@ -22,9 +22,6 @@
|
||||||
<el-tab-pane :label="t('profile.info.resetPwd')" name="resetPwd">
|
<el-tab-pane :label="t('profile.info.resetPwd')" name="resetPwd">
|
||||||
<ResetPwd />
|
<ResetPwd />
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
<el-tab-pane :label="t('profile.info.userSocial')" name="userSocial">
|
|
||||||
<UserSocial v-model:activeName="activeName" />
|
|
||||||
</el-tab-pane>
|
|
||||||
</el-tabs>
|
</el-tabs>
|
||||||
</div>
|
</div>
|
||||||
</el-card>
|
</el-card>
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
<template>
|
<template>
|
||||||
<doc-alert title="工作流手册" url="https://doc.iocoder.cn/bpm/" />
|
|
||||||
|
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<el-form
|
<el-form
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
<template>
|
<template>
|
||||||
<doc-alert title="工作流手册" url="https://doc.iocoder.cn/bpm/" />
|
|
||||||
|
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<el-table v-loading="loading" :data="list">
|
<el-table v-loading="loading" :data="list">
|
||||||
<el-table-column label="定义编号" align="center" prop="id" width="400" />
|
<el-table-column label="定义编号" align="center" prop="id" width="400" />
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
<template>
|
<template>
|
||||||
<doc-alert title="审批接入(流程表单)" url="https://doc.iocoder.cn/bpm/use-bpm-form/" />
|
|
||||||
|
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<el-form
|
<el-form
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
<template>
|
<template>
|
||||||
<doc-alert title="工作流手册" url="https://doc.iocoder.cn/bpm/" />
|
|
||||||
|
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<el-form
|
<el-form
|
||||||
|
|
|
@ -1,12 +1,4 @@
|
||||||
<template>
|
<template>
|
||||||
<doc-alert title="流程设计器(BPMN)" url="https://doc.iocoder.cn/bpm/model-designer-dingding/" />
|
|
||||||
<doc-alert
|
|
||||||
title="流程设计器(钉钉、飞书)"
|
|
||||||
url="https://doc.iocoder.cn/bpm/model-designer-bpmn/"
|
|
||||||
/>
|
|
||||||
<doc-alert title="选择审批人、发起人自选" url="https://doc.iocoder.cn/bpm/assignee/" />
|
|
||||||
<doc-alert title="会签、或签、依次审批" url="https://doc.iocoder.cn/bpm/multi-instance/" />
|
|
||||||
|
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<el-form
|
<el-form
|
||||||
|
@ -150,7 +142,7 @@
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作" align="center" width="240" fixed="right">
|
<el-table-column label="操作" align="center" fixed="right">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button
|
<el-button
|
||||||
link
|
link
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
<template>
|
<template>
|
||||||
<doc-alert title="审批接入(业务表单)" url="https://doc.iocoder.cn/bpm/use-business-form/" />
|
|
||||||
|
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<el-form
|
<el-form
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
<template>
|
<template>
|
||||||
<doc-alert title="流程表达式" url="https://doc.iocoder.cn/bpm/expression/" />
|
|
||||||
|
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<el-form
|
<el-form
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
<template>
|
<template>
|
||||||
<doc-alert title="流程发起、取消、重新发起" url="https://doc.iocoder.cn/bpm/process-instance/" />
|
|
||||||
|
|
||||||
<!-- 第一步,通过流程定义的列表,选择对应的流程 -->
|
<!-- 第一步,通过流程定义的列表,选择对应的流程 -->
|
||||||
<ContentWrap v-if="!selectProcessDefinition" v-loading="loading">
|
<ContentWrap v-if="!selectProcessDefinition" v-loading="loading">
|
||||||
<el-tabs tab-position="left" v-model="categoryActive">
|
<el-tabs tab-position="left" v-model="categoryActive">
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
<template>
|
<template>
|
||||||
<doc-alert title="流程发起、取消、重新发起" url="https://doc.iocoder.cn/bpm/process-instance/" />
|
|
||||||
|
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<el-form
|
<el-form
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
<template>
|
<template>
|
||||||
<doc-alert title="工作流手册" url="https://doc.iocoder.cn/bpm/" />
|
|
||||||
|
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<el-form
|
<el-form
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
<template>
|
<template>
|
||||||
<doc-alert title="公众号粉丝" url="https://doc.iocoder.cn/mp/user/" />
|
|
||||||
|
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<el-form
|
<el-form
|
||||||
|
|
|
@ -60,6 +60,7 @@ const formData = ref({
|
||||||
})
|
})
|
||||||
const formRules = reactive({
|
const formRules = reactive({
|
||||||
name: [{ required: true, message: '岗位标题不能为空', trigger: 'blur' }],
|
name: [{ required: true, message: '岗位标题不能为空', trigger: 'blur' }],
|
||||||
|
sort: [{ required: true, message: '岗位顺序不能为空', trigger: 'blur' }],
|
||||||
code: [{ required: true, message: '岗位编码不能为空', trigger: 'change' }],
|
code: [{ required: true, message: '岗位编码不能为空', trigger: 'change' }],
|
||||||
status: [{ required: true, message: '岗位状态不能为空', trigger: 'change' }],
|
status: [{ required: true, message: '岗位状态不能为空', trigger: 'change' }],
|
||||||
remark: [{ required: false, message: '岗位内容不能为空', trigger: 'blur' }]
|
remark: [{ required: false, message: '岗位内容不能为空', trigger: 'blur' }]
|
||||||
|
|
Loading…
Reference in New Issue