Explorar el Código

Update 统一获取App配置接口,前端统一获取

YueYunyun hace 1 año
padre
commit
0925fa1a75

+ 0 - 1
SERVER/VberAdminPlusV3/vber-admin/src/main/java/com/vber/web/controller/CaptchaController.java

@@ -107,7 +107,6 @@ public class CaptchaController {
         CaptchaVo captchaVo = new CaptchaVo();
         boolean captchaEnabled = captchaProperties.getEnable();
         if (!captchaEnabled) {
-            captchaVo.setCaptchaEnabled(false);
             return R.ok(captchaVo);
         }
         // 保存验证码信息

+ 18 - 0
SERVER/VberAdminPlusV3/vber-admin/src/main/java/com/vber/web/controller/IndexController.java

@@ -2,7 +2,11 @@ package com.vber.web.controller;
 
 import cn.dev33.satoken.annotation.SaIgnore;
 import com.vber.common.core.config.VbConfig;
+import com.vber.common.core.domain.R;
 import com.vber.common.core.utils.StringUtils;
+import com.vber.common.tenant.helper.TenantHelper;
+import com.vber.common.web.config.properties.CaptchaProperties;
+import com.vber.web.domain.vo.AppConfigVo;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -21,6 +25,7 @@ public class IndexController {
      * 系统基础配置
      */
     private final VbConfig vbConfig;
+    private final CaptchaProperties captchaProperties;
 
     /**
      * 访问首页,提示语
@@ -29,4 +34,17 @@ public class IndexController {
     public String index() {
         return StringUtils.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", vbConfig.getName(), vbConfig.getVersion());
     }
+
+    @GetMapping("/config")
+    public R<AppConfigVo> appConfig() {
+        AppConfigVo configVo = new AppConfigVo();
+        configVo.setName(vbConfig.getName());
+        configVo.setVersion(vbConfig.getVersion());
+        configVo.setCopyrightYear(vbConfig.getCopyrightYear());
+        configVo.setTenantEnabled(TenantHelper.isEnable());
+        configVo.setCaptchaEnabled(!"dev".equals(vbConfig.getMode()) && captchaProperties.getEnable());
+        configVo.setRegisterEnabled(vbConfig.getRegisterEnabled());
+        configVo.setWorkflowEnabled(vbConfig.getWorkflowEnabled());
+        return R.ok(configVo);
+    }
 }

+ 40 - 0
SERVER/VberAdminPlusV3/vber-admin/src/main/java/com/vber/web/domain/vo/AppConfigVo.java

@@ -0,0 +1,40 @@
+package com.vber.web.domain.vo;
+
+import lombok.Data;
+
+/**
+ * @author Yue
+ */
+@Data
+public class AppConfigVo {
+
+    /**
+     * 项目名称
+     */
+    private String name;
+    /**
+     * 版本
+     */
+    private String version;
+    /**
+     * 是否开启租户
+     */
+    private Boolean tenantEnabled;
+    /**
+     * 是否开启验证码
+     */
+    private Boolean captchaEnabled;
+    /**
+     * 是否开启注册
+     */
+    private Boolean registerEnabled;
+    /**
+     * 是否开启工作流
+     */
+    private Boolean workflowEnabled;
+    /**
+     * 版权年份
+     */
+    private String copyrightYear;
+
+}

+ 0 - 4
SERVER/VberAdminPlusV3/vber-admin/src/main/java/com/vber/web/domain/vo/CaptchaVo.java

@@ -10,10 +10,6 @@ import lombok.Data;
 @Data
 public class CaptchaVo {
 
-    /**
-     * 是否开启验证码
-     */
-    private Boolean captchaEnabled = true;
 
     private String uuid;
 

+ 2 - 0
SERVER/VberAdminPlusV3/vber-admin/src/main/resources/application-dev.yml

@@ -1,5 +1,7 @@
 vb:
   mode: dev
+  workflowEnabled: false
+
 --- # 监控中心配置
 spring.boot.admin.client:
   # 增加客户端开关

+ 3 - 1
SERVER/VberAdminPlusV3/vber-admin/src/main/resources/application.yml

@@ -6,7 +6,9 @@ vb:
   version: ${revision}
   # 版权年份
   copyrightYear: 2023
-  profile:
+  profile: ./vber/profile/
+  workflowEnabled: true
+  registerEnabled: false
 
 captcha:
   enable: true

+ 8 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/config/VbConfig.java

@@ -34,6 +34,14 @@ public class VbConfig {
      * 版权年份
      */
     private String copyrightYear;
+    /**
+     * 是否开启注册
+     */
+    private Boolean registerEnabled;
+    /**
+     * 是否开启工作流
+     */
+    private Boolean workflowEnabled;
 
     /**
      * 上传路径
@@ -54,7 +62,6 @@ public class VbConfig {
         VbConfig.profile = profile;
     }
 
-
     /**
      * 获取导入上传路径
      */

+ 3 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/impl/SysMenuServiceImpl.java

@@ -217,6 +217,9 @@ public class SysMenuServiceImpl implements ISysMenuService {
             if (!"dev".equals(vbConfig.getMode()) && devMenuPath.contains(menu.getPath())) {
                 continue;
             }
+            if (!vbConfig.getWorkflowEnabled() && "workflow".equals(menu.getPath())) {
+                continue;
+            }
             RouterVo router = new RouterVo();
             router.setHidden("1".equals(menu.getVisible()));
             router.setName(menu.getRouteName());

+ 7 - 0
UI/VAP_V3.VUE/src/api/_login.ts

@@ -5,6 +5,13 @@ import type { LoginData } from "@@/types/Account"
 const clientId = import.meta.env.VITE_APP_CLIENT_ID
 
 class loginApi {
+	getAppConfig = () => {
+		return Rs.get({
+			url: "/config",
+			isToken: false,
+			timeout: 20000
+		})
+	}
 	getCodeImg = () => {
 		return Rs.get({
 			url: "/auth/code",

+ 0 - 1
UI/VAP_V3.VUE/src/core/services/RequestService.ts

@@ -51,7 +51,6 @@ Rs.interceptors.request.use(
 		config = Object.assign({}, defaultOption, config)
 		config.headers["Content-Language"] = getLanguage()
 		config.headers["TenantId"] = appStore.tenantStore.getTenantId()
-		console.log("TenantId-" + config.url, appStore.tenantStore.getTenantId())
 		if (!config.url) {
 			console.log("请求URL不能为空", config)
 			throw new Error("请求URL不能为空")

+ 12 - 0
UI/VAP_V3.VUE/src/core/types/AppConfig.ts

@@ -0,0 +1,12 @@
+/**
+ * appConfig
+ */
+export type AppConfig = {
+	name: string
+	version: string
+	copyrightYear: string
+	tenantEnabled: boolean
+	captchaEnabled: boolean
+	registerEnabled: boolean
+	workflowEnabled: boolean
+}

+ 55 - 0
UI/VAP_V3.VUE/src/stores/_app.ts

@@ -0,0 +1,55 @@
+import type { AppConfig } from "@@/types/AppConfig"
+import apis from "@a"
+
+export const LS_APP_CONFIG_NAME_KEY = `app_config_${import.meta.env.VITE_APP_NAME}_${
+	import.meta.env.VITE_APP_VERSION
+}`
+
+export const useAppConfigStore = defineStore("appConfig", () => {
+	const config = ref<AppConfig>(
+		localCache.getJSON(LS_APP_CONFIG_NAME_KEY) ?? {
+			registerEnabled: false,
+			captchaEnabled: true,
+			workflowEnabled: true
+		}
+	)
+
+	function loadConfig() {
+		return new Promise((resolve) => {
+			apis.loginApi.getAppConfig().then((res: any) => {
+				config.value = res.data
+				localCache.setJSON(LS_APP_CONFIG_NAME_KEY, res.data)
+				resolve(true)
+			})
+		})
+	}
+
+	function getConfig(): AppConfig {
+		return config.value
+	}
+
+	function isTenant() {
+		return getConfig().tenantEnabled
+	}
+
+	function isRegister() {
+		return getConfig().registerEnabled
+	}
+
+	function isCaptcha() {
+		return getConfig().captchaEnabled
+	}
+
+	function isWorkflow() {
+		return getConfig().workflowEnabled
+	}
+
+	return {
+		loadConfig,
+		getConfig,
+		isTenant,
+		isRegister,
+		isCaptcha,
+		isWorkflow
+	}
+})

+ 3 - 0
UI/VAP_V3.VUE/src/stores/index.ts

@@ -8,10 +8,12 @@ import { useMenuStore } from "./_menu"
 import { useDictStore } from "./_dict"
 import { useTagViewStore } from "./_tagView"
 import { useFlowModelerStore } from "./_flowModeler"
+import { useAppConfigStore } from "./_app"
 
 const store = createPinia()
 
 export interface IAppStore {
+	appConfigStore: ReturnType<typeof useAppConfigStore>
 	bodyConfigStore: ReturnType<typeof useBodyConfigStore>
 	authStore: ReturnType<typeof useAuthStore>
 	tenantStore: ReturnType<typeof useTenantStore>
@@ -26,6 +28,7 @@ export const appStore: IAppStore = {} as IAppStore
  * 注册app状态库
  */
 export const registerStore = () => {
+	appStore.appConfigStore = useAppConfigStore()
 	appStore.bodyConfigStore = useBodyConfigStore()
 	appStore.authStore = useAuthStore()
 	appStore.tenantStore = useTenantStore()

+ 38 - 15
UI/VAP_V3.VUE/src/views/account/login.vue

@@ -7,15 +7,21 @@ import type { LoginData, TenantVO } from "@@/types/Account"
 
 const userStore = appStore.authStore
 const router = useRouter()
-const loginRef = ref<HTMLFormElement>()
+const loginFormRef = ref<HTMLFormElement>()
+const show = ref(false)
+const copyright = computed(() => {
+	return appStore.appConfigStore.getConfig().copyrightYear || "2020"
+})
+
 const title = ref(import.meta.env.VITE_APP_TITLE || "后台管理系统")
+
 const tenantOptions = ref<TenantVO[]>([])
 const loginForm = ref<LoginData>({
 	tenantId: "000000",
 	username: "admin",
 	password: "123iwb",
 	rememberMe: false,
-	code: "1",
+	code: "",
 	uuid: ""
 })
 
@@ -29,16 +35,16 @@ const loginRules = {
 const codeUrl = ref("")
 const loading = ref(false)
 // 租户开关
-const tenantEnabled = ref(true)
+const tenantEnabled = ref(false)
 // 验证码开关
-const captchaEnabled = ref(true)
+const captchaEnabled = ref(false)
 // 注册开关
 const register = ref(false)
 
 const redirect = ref(undefined)
 
 function handleLogin() {
-	loginRef.value?.validate((valid: boolean) => {
+	loginFormRef.value?.validate((valid: boolean) => {
 		if (valid) {
 			loading.value = true
 			//勾选了需要记住密码设置在 cookie 中设置记住用户名和密码
@@ -93,7 +99,6 @@ const doSocialLogin = (type: string) => {
 
 function getCode() {
 	apis.loginApi.getCodeImg().then(({ data }) => {
-		captchaEnabled.value = data.captchaEnabled === undefined ? true : data.captchaEnabled
 		if (captchaEnabled.value) {
 			codeUrl.value = "data:image/gif;base64," + data.img
 			loginForm.value.uuid = data.uuid
@@ -124,21 +129,32 @@ const initTenant = async () => {
 	appStore.tenantStore
 		.initTenant()
 		.then((res: any) => {
-			tenantEnabled.value = true
 			tenantOptions.value = res
-			if (tenantOptions.value != null && tenantOptions.value.length !== 0) {
-				loginForm.value.tenantId = tenantOptions.value[0].tenantId
-			}
 		})
 		.catch(() => {
 			tenantOptions.value = []
-			tenantEnabled.value = false
 		})
 }
 function init() {
-	getCode()
+	appStore.appConfigStore
+		.loadConfig()
+		.then(() => {
+			console.log("---", appStore.appConfigStore.getConfig())
+			title.value = appStore.appConfigStore.getConfig().name
+			register.value = appStore.appConfigStore.isRegister()
+			if (appStore.appConfigStore.isTenant()) {
+				tenantEnabled.value = true
+				initTenant()
+			}
+			if (appStore.appConfigStore.isCaptcha()) {
+				captchaEnabled.value = true
+				getCode()
+			}
+		})
+		.finally(() => {
+			show.value = true
+		})
 	getCookie()
-	initTenant()
 }
 
 onMounted(init)
@@ -153,7 +169,12 @@ watch(
 
 <template>
 	<div class="login">
-		<el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
+		<el-form
+			v-if="show"
+			ref="loginFormRef"
+			:model="loginForm"
+			:rules="loginRules"
+			class="login-form">
 			<h3 class="title">{{ title }}</h3>
 			<el-form-item prop="tenantId" v-if="tenantEnabled">
 				<el-select
@@ -249,7 +270,9 @@ watch(
 		</el-form>
 		<!--  底部  -->
 		<div class="el-login-footer">
-			<span>Copyright ©2018-{{ new Date().getFullYear() }} VAP All Rights Reserved.</span>
+			<span>
+				Copyright ©{{ copyright }}-{{ new Date().getFullYear() }} VAP All Rights Reserved.
+			</span>
 		</div>
 	</div>
 </template>