添加后注册流程

This commit is contained in:
yangjun 2025-04-09 14:22:13 +08:00
parent 906e4c7318
commit 17d2fa5e33
13 changed files with 282 additions and 132 deletions

3
.env
View File

@ -19,4 +19,7 @@ VITE_GLOB_APP_OPEN_QIANKUN=true
# 文件预览地址
VITE_GLOB_ONLINE_VIEW_URL=http://fileview.jeecg.com/onlinePreview
# 运维服务器接口地址
VITE_GLOB_INSTITUTIONS_URL=http://192.168.2.19:8080/nursing-unit/

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

View File

@ -15,4 +15,6 @@ export enum PageEnum {
TOKEN_LOGIN = '/tokenLogin',
// h5白名单
H5_ADVISORYINFO = '/h5/advisoryInfo',
// h5白名单
H5_REGISTER_ADVISORY = '/h5/registerAdvisory',
}

View File

@ -13,6 +13,7 @@ export const useGlobSetting = (): Readonly<GlobConfig> => {
VITE_GLOB_APP_OPEN_QIANKUN,
VITE_GLOB_DOMAIN_URL,
VITE_GLOB_ONLINE_VIEW_URL,
VITE_GLOB_INSTITUTIONS_URL,
// 【JEECG作为乾坤子应用】
VITE_GLOB_QIANKUN_MICRO_APP_NAME,
@ -40,6 +41,7 @@ export const useGlobSetting = (): Readonly<GlobConfig> => {
urlPrefix: VITE_GLOB_API_URL_PREFIX,
uploadUrl: VITE_GLOB_DOMAIN_URL,
viewUrl: VITE_GLOB_ONLINE_VIEW_URL,
institutionsUrl:VITE_GLOB_INSTITUTIONS_URL,
// 【JEECG作为乾坤子应用】是否以乾坤子应用模式启动
isQiankunMicro: VITE_GLOB_QIANKUN_MICRO_APP_NAME != null && VITE_GLOB_QIANKUN_MICRO_APP_NAME !== '',

View File

@ -24,12 +24,13 @@ const SYS_FILES_PATH = PageEnum.SYS_FILES_PATH;
// 邮件中的跳转地址,对应此路由,携带token免登录直接去办理页面
const TOKEN_LOGIN = PageEnum.TOKEN_LOGIN;
const H5_ADVISORYINFO = PageEnum.H5_ADVISORYINFO;
const H5_REGISTER_ADVISORY = PageEnum.H5_REGISTER_ADVISORY;
const ROOT_PATH = RootRoute.path;
//update-begin---author:wangshuai ---date:20220629 for[issues/I5BG1I]vue3不支持auth2登录------------
//update-begin---author:wangshuai ---date:20221111 for: [VUEN-2472]分享免登录------------
const whitePathList: PageEnum[] = [LOGIN_PATH, OAUTH2_LOGIN_PAGE_PATH,SYS_FILES_PATH, TOKEN_LOGIN, H5_ADVISORYINFO ];
const whitePathList: PageEnum[] = [LOGIN_PATH, OAUTH2_LOGIN_PAGE_PATH,SYS_FILES_PATH, TOKEN_LOGIN, H5_ADVISORYINFO,H5_REGISTER_ADVISORY ];
//update-end---author:wangshuai ---date:20221111 for: [VUEN-2472]分享免登录------------
//update-end---author:wangshuai ---date:20220629 for[issues/I5BG1I]vue3不支持auth2登录------------

View File

@ -65,14 +65,24 @@ export const TokenLoginRoute: AppRouteRecordRaw = {
},
};
//h5页面首页
export const H5_REGISTER_ADVISORY: AppRouteRecordRaw = {
path: '/h5/registerAdvisory',
name: 'registerAdvisory',
component: () => import('../../views/biz/NuBizAdvisoryInfo/h5/RegisterAdvisoryInfo.vue'),
meta: {
title: "选择入住",
},
};
//h5页面首页
export const H5_ADVISORYINFO: AppRouteRecordRaw = {
path: '/h5/advisoryInfo',
name: 'advisoryInfo',
component: () => import('/@/views/biz/NuBizAdvisoryInfo/h5/NuBizAdvisoryInfoList.vue'),
component: () => import('../../views/biz/NuBizAdvisoryInfo/h5/AdvisoryInfo.vue'),
meta: {
title: "选择入住",
},
};
// Basic routing without permission
export const basicRoutes = [LoginRoute, RootRoute, ...mainOutRoutes, REDIRECT_ROUTE, PAGE_NOT_FOUND_ROUTE, TokenLoginRoute, Oauth2LoginRoute,H5_ADVISORYINFO];
export const basicRoutes = [LoginRoute, RootRoute, ...mainOutRoutes, REDIRECT_ROUTE, PAGE_NOT_FOUND_ROUTE, TokenLoginRoute, Oauth2LoginRoute,H5_REGISTER_ADVISORY,H5_ADVISORYINFO];

View File

@ -36,6 +36,7 @@ export function getAppEnvConfig() {
VITE_GLOB_APP_CAS_BASE_URL,
VITE_GLOB_DOMAIN_URL,
VITE_GLOB_ONLINE_VIEW_URL,
VITE_GLOB_INSTITUTIONS_URL,
// 【JEECG作为乾坤子应用】
VITE_GLOB_QIANKUN_MICRO_APP_NAME,
@ -59,6 +60,7 @@ export function getAppEnvConfig() {
VITE_GLOB_APP_CAS_BASE_URL,
VITE_GLOB_DOMAIN_URL,
VITE_GLOB_ONLINE_VIEW_URL,
VITE_GLOB_INSTITUTIONS_URL,
// 【JEECG作为乾坤子应用】
VITE_GLOB_QIANKUN_MICRO_APP_NAME,

View File

@ -1,12 +1,18 @@
<template>
<a-spin :spinning="confirmLoading">
<JFormContainer >
<JFormContainer class="advisoryClass">
<template #detail>
<a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol" name="NuBizAdvisoryInfoForm">
<a-row>
<a-col :span="24">
<a-form-item label="选择机构" v-bind="validateInfos.sysOrgCode" id="NuBizAdvisoryInfoForm-sysOrgCode" name="sysOrgCode">
<j-dict-select-tag type='radio' v-model:value="formData.sysOrgCode" dictCode="advisory_type" placeholder="请选择机构" allow-clear />
<a-radio-group v-model:value="formData.sysOrgCode" @change="handleChangeRadio">
<template v-for="item in institutionsSource" :key="`${item.id}`">
<a-radio :value="item.id">
{{ item.departName }}
</a-radio>
</template>
</a-radio-group>
</a-form-item>
</a-col>
<a-col :span="24">
@ -30,7 +36,7 @@
</a-form-item>
</a-col>
<a-col :span="24" style="text-align: center;">
<a-button type="primary">提交</a-button>
<a-button type="primary" @click="handleSubmit()">提交</a-button>
</a-col>
</a-row>
</a-form>
@ -47,6 +53,8 @@
import { getValueType } from '/@/utils';
import { Form } from 'ant-design-vue';
import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
import { useGlobSetting } from "/@/hooks/setting";
import axios from 'axios';
const props = defineProps({
formDisabled: { type: Boolean, default: false },
formData: { type: Object, default: () => ({})},
@ -55,6 +63,8 @@
const formRef = ref();
const useForm = Form.useForm;
const emit = defineEmits(['register', 'ok']);
const glob = useGlobSetting()
const institutionsSource = ref([]);
const formData = reactive<Record<string, any>>({
id: '',
name: '',
@ -64,6 +74,9 @@
advisoryType: '1',
status: '1',
content: '',
serverUrl: '',
openId: '',
wechatName: '',
});
const { createMessage } = useMessage();
const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });
@ -74,14 +87,70 @@
name: [{ required: true, message: '请输入姓名!' }],
sysOrgCode: [{ required: true, message: '请选择入住机构!' }],
advisoryType: [{ required: true, message: '请选择咨询类型!' }],
tel: [{ required: true, message: '请输入联系电话!' }],
tel: [{ required: true, message: '请输入联系电话!' }, { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '联系电话错误!' }],
sex: [{ required: true, message: '请选择性别!' }],
});
const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });
//serverUrl
function handleChangeRadio(item){
const checkId = item.target.value;
const checkData = institutionsSource.value.filter(item => item.id === checkId);
if(checkData.length>0){
const serverUrl = checkData[0].serverUrl;
formData.serverUrl = serverUrl;
}
console.log('formData--->',formData);
}
//
async function handleSubmit() {
try {
//
await validate();
} catch ({ errorFields }) {
if (errorFields) {
const firstField = errorFields[0];
if (firstField) {
formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });
}
}
return Promise.reject(errorFields);
}
//
let model = formData;
//
for (let data in model) {
//
if (model[data] instanceof Array) {
let valueType = getValueType(formRef.value.getProps, data);
//
if (valueType === 'string') {
model[data] = model[data].join(',');
}
}
}
model.openId = "公众号openId";
model.wechatName = "公众号姓名";
console.log('model--->',model);
const serverUrl = formData.serverUrl;
axios.post(serverUrl+"/h5Api/nuBizAdvisoryInfo/add",model).then(response => {
var data = response.data;
if(data.code === 200){
createMessage.success("操作成功");
}
}).catch(error => {
console.error(error);
});
}
onMounted(() => {
const institutionsUrl = glob.institutionsUrl+"/sys/sysDepart/queryInstitutionsList";
axios.get(institutionsUrl).then(response => {
institutionsSource.value = response.data;
}).catch(error => {
console.error(error);
});
});
</script>
@ -90,4 +159,9 @@
.antd-modal-form {
padding: 14px;
}
.advisoryClass{
background-image: url(/@/assets/images/advisory.jpg);
width: 100%;
height: 100%;
}
</style>

View File

@ -1,113 +0,0 @@
<template>
<view>
<!--标题和返回-->
<cu-custom :bgColor="NavBarColor" isBack :backRouterName="backRouteName">
<block slot="backText">返回</block>
<block slot="content">咨询信息</block>
</cu-custom>
<!--表单区域-->
<view>
<form>
<view class="cu-form-group">
<view class="flex align-center">
<view class="title"><text space="ensp">咨询人姓名</text></view>
<input placeholder="请输入咨询人姓名" v-model="model.name"/>
</view>
</view>
<view class="cu-form-group">
<view class="flex align-center">
<view class="title"><text space="ensp">性别</text></view>
<input placeholder="请输入性别" v-model="model.sex"/>
</view>
</view>
<view class="cu-form-group">
<view class="flex align-center">
<view class="title"><text space="ensp">联系电话</text></view>
<input placeholder="请输入联系电话" v-model="model.tel"/>
</view>
</view>
<view class="cu-form-group">
<view class="flex align-center">
<view class="title"><text space="ensp">咨询类型 1入住nu 2入驻机构 3我要加盟</text></view>
<input placeholder="请输入咨询类型 1入住nu 2入驻机构 3我要加盟" v-model="model.advisoryType"/>
</view>
</view>
<view class="cu-form-group">
<view class="flex align-center">
<view class="title"><text space="ensp">状态 1审核中 2审核完成 3驳回</text></view>
<input placeholder="请输入状态 1审核中 2审核完成 3驳回" v-model="model.status"/>
</view>
</view>
<view class="cu-form-group">
<view class="flex align-center">
<view class="title"><text space="ensp">审核备注</text></view>
<input placeholder="请输入审核备注" v-model="model.content"/>
</view>
</view>
<view class="padding">
<button class="cu-btn block bg-blue margin-tb-sm lg" @click="onSubmit">
<text v-if="loading" class="cuIcon-loading2 cuIconfont-spin"></text>提交
</button>
</view>
</form>
</view>
</view>
</template>
<script>
// import myDate from '@/components/my-componets/my-date.vue'
export default {
name: "NuBizAdvisoryInfoForm",
// components:{ myDate },
props:{
formData:{
type:Object,
default:()=>{},
required:false
}
},
data(){
return {
CustomBar: this.CustomBar,
NavBarColor: this.NavBarColor,
loading:false,
model: {},
backRouteName:'index',
url: {
queryById: "/NuBizAdvisoryInfo/nuBizAdvisoryInfo/queryById",
add: "/NuBizAdvisoryInfo/nuBizAdvisoryInfo/add",
edit: "/NuBizAdvisoryInfo/nuBizAdvisoryInfo/edit",
},
}
},
created(){
this.initFormData();
},
methods:{
initFormData(){
if(this.formData){
let dataId = this.formData.dataId;
this.$http.get(this.url.queryById,{params:{id:dataId}}).then((res)=>{
if(res.data.success){
console.log("表单数据",res);
this.model = res.data.result;
}
})
}
},
onSubmit() {
let myForm = {...this.model};
this.loading = true;
let url = myForm.id?this.url.edit:this.url.add;
this.$http.post(url,myForm).then(res=>{
console.log("res",res)
this.loading = false
this.$Router.push({name:this.backRouteName})
}).catch(()=>{
this.loading = false
});
}
}
}
</script>

View File

@ -0,0 +1,167 @@
<template>
<a-spin :spinning="confirmLoading">
<JFormContainer class="advisoryClass">
<template #detail>
<a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol" name="NuBizAdvisoryInfoForm">
<a-row>
<a-col :span="24">
<a-form-item label="选择机构" v-bind="validateInfos.sysOrgCode" id="NuBizAdvisoryInfoForm-sysOrgCode" name="sysOrgCode">
<a-radio-group v-model:value="formData.sysOrgCode" @change="handleChangeRadio">
<template v-for="item in institutionsSource" :key="`${item.id}`">
<a-radio :value="item.id">
{{ item.departName }}
</a-radio>
</template>
</a-radio-group>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="咨询类型" v-bind="validateInfos.advisoryType" id="NuBizAdvisoryInfoForm-advisoryType" name="advisoryType">
<j-dict-select-tag type='radio' v-model:value="formData.advisoryType" dictCode="advisory_type" placeholder="请选择咨询类型" allow-clear />
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="咨询人姓名" v-bind="validateInfos.name" id="NuBizAdvisoryInfoForm-name" name="name">
<a-input v-model:value="formData.name" placeholder="请输入咨询人姓名" allow-clear ></a-input>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="性别" v-bind="validateInfos.sex" id="NuBizAdvisoryInfoForm-sex" name="sex">
<j-dict-select-tag type='radio' v-model:value="formData.sex" dictCode="sex" placeholder="请选择性别" allow-clear />
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="联系电话" v-bind="validateInfos.tel" id="NuBizAdvisoryInfoForm-tel" name="tel">
<a-input v-model:value="formData.tel" placeholder="请输入联系电话" allow-clear ></a-input>
</a-form-item>
</a-col>
<a-col :span="24" style="text-align: center;">
<a-button type="primary" @click="handleSubmit()">提交</a-button>
</a-col>
</a-row>
</a-form>
</template>
</JFormContainer>
</a-spin>
</template>
<script lang="ts" setup>
import { ref, reactive, defineExpose, nextTick, defineProps, computed, onMounted } from 'vue';
import { defHttp } from '/@/utils/http/axios';
import { useMessage } from '/@/hooks/web/useMessage';
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
import { getValueType } from '/@/utils';
import { Form } from 'ant-design-vue';
import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
import { useGlobSetting } from "/@/hooks/setting";
import axios from 'axios';
const props = defineProps({
formDisabled: { type: Boolean, default: false },
formData: { type: Object, default: () => ({})},
formBpm: { type: Boolean, default: true }
});
const formRef = ref();
const useForm = Form.useForm;
const emit = defineEmits(['register', 'ok']);
const glob = useGlobSetting()
const institutionsSource = ref([]);
const formData = reactive<Record<string, any>>({
id: '',
name: '',
sex: '1',
sysOrgCode: '',
tel: '',
advisoryType: '1',
status: '1',
content: '',
serverUrl: '',
openId: '',
wechatName: '',
});
const { createMessage } = useMessage();
const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });
const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
const confirmLoading = ref<boolean>(false);
//
const validatorRules = reactive({
name: [{ required: true, message: '请输入姓名!' }],
sysOrgCode: [{ required: true, message: '请选择入住机构!' }],
advisoryType: [{ required: true, message: '请选择咨询类型!' }],
tel: [{ required: true, message: '请输入联系电话!' }, { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '联系电话错误!' }],
sex: [{ required: true, message: '请选择性别!' }],
});
const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });
//serverUrl
function handleChangeRadio(item){
const checkId = item.target.value;
const checkData = institutionsSource.value.filter(item => item.id === checkId);
if(checkData.length>0){
const serverUrl = checkData[0].serverUrl;
formData.serverUrl = serverUrl;
}
console.log('formData--->',formData);
}
//
async function handleSubmit() {
try {
//
await validate();
} catch ({ errorFields }) {
if (errorFields) {
const firstField = errorFields[0];
if (firstField) {
formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });
}
}
return Promise.reject(errorFields);
}
//
let model = formData;
//
for (let data in model) {
//
if (model[data] instanceof Array) {
let valueType = getValueType(formRef.value.getProps, data);
//
if (valueType === 'string') {
model[data] = model[data].join(',');
}
}
}
model.openId = "公众号openId";
model.wechatName = "公众号姓名";
console.log('model--->',model);
const serverUrl = formData.serverUrl;
axios.post(serverUrl+"/h5Api/nuBizAdvisoryInfo/add",model).then(response => {
var data = response.data;
if(data.code === 200){
createMessage.success("操作成功");
}
}).catch(error => {
console.error(error);
});
}
onMounted(() => {
const institutionsUrl = glob.institutionsUrl+"/sys/sysDepart/queryInstitutionsList";
axios.get(institutionsUrl).then(response => {
institutionsSource.value = response.data;
}).catch(error => {
console.error(error);
});
});
</script>
<style lang="less" scoped>
.antd-modal-form {
padding: 14px;
}
.advisoryClass{
background-image: url(/@/assets/images/advisory.jpg);
width: 100%;
height: 100%;
}
</style>

View File

@ -6,27 +6,27 @@
<a-row>
<a-col :span="24">
<a-form-item label="咨询人姓名" v-bind="validateInfos.name" id="NuBizAdvisoryInfoForm-name" name="name">
<a-input v-model:value="formData.name" placeholder="请输入咨询人姓名" allow-clear ></a-input>
<a-input v-model:value="formData.name" placeholder="请输入咨询人姓名" allow-clear disabled></a-input>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="性别" v-bind="validateInfos.sex" id="NuBizAdvisoryInfoForm-sex" name="sex">
<j-dict-select-tag type='radio' v-model:value="formData.sex" dictCode="sex" placeholder="请选择性别" allow-clear />
<j-dict-select-tag type='radio' v-model:value="formData.sex" dictCode="sex" disabled placeholder="请选择性别" allow-clear />
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="联系电话" v-bind="validateInfos.tel" id="NuBizAdvisoryInfoForm-tel" name="tel">
<a-input v-model:value="formData.tel" placeholder="请输入联系电话" allow-clear ></a-input>
<a-input v-model:value="formData.tel" placeholder="请输入联系电话" allow-clear disabled></a-input>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="咨询类型 1入住nu 2入驻机构 3我要加盟" v-bind="validateInfos.advisoryType" id="NuBizAdvisoryInfoForm-advisoryType" name="advisoryType">
<j-dict-select-tag type='radio' v-model:value="formData.advisoryType" dictCode="advisory_type" placeholder="请选择咨询类型 1入住nu 2入驻机构 3我要加盟" allow-clear />
<a-form-item label="咨询类型" v-bind="validateInfos.advisoryType" id="NuBizAdvisoryInfoForm-advisoryType" name="advisoryType">
<j-dict-select-tag type='radio' v-model:value="formData.advisoryType" dictCode="advisory_type" placeholder="请选择咨询类型" allow-clear disabled/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="状态 1审核中 2审核完成 3驳回" v-bind="validateInfos.status" id="NuBizAdvisoryInfoForm-status" name="status">
<j-dict-select-tag type='radio' v-model:value="formData.status" dictCode="advisory_approval" placeholder="请选择状态 1审核中 2审核完成 3驳回" allow-clear />
<a-form-item label="审核状态" v-bind="validateInfos.status" id="NuBizAdvisoryInfoForm-status" name="status">
<j-dict-select-tag type='radio' v-model:value="formData.status" dictCode="advisory_approval" placeholder="请选择状态" allow-clear />
</a-form-item>
</a-col>
<a-col :span="24">

View File

@ -44,15 +44,14 @@
</a></template>
<!-- 人员信息 -->
<a-row>
<a-col :span="12">
<a-col :span="8" style="padding: 0 8px;">
<img
width="150px"
height="150px"
width="100%"
:src="handleHeadPath(item.headPath)"
@error="setDefaultImage"
/>
</a-col>
<a-col :span="12">
<a-col :span="16">
<p>入职日期: {{item.entryTime}}</p>
<p>身份证号: {{item.idCard}}</p>
<p>联系电话: {{item.tel}}</p>

3
types/config.d.ts vendored
View File

@ -165,6 +165,7 @@ export interface GlobConfig {
isQiankunMicro: boolean;
// 【JEECG作为乾坤子应用】乾坤子应用入口
qiankunMicroAppEntry?: string;
institutionsUrl: string;
}
export interface GlobEnvConfig {
// Site title
@ -187,6 +188,8 @@ export interface GlobEnvConfig {
VITE_GLOB_UPLOAD_URL?: string;
// view url
VITE_GLOB_ONLINE_VIEW_URL?: string;
// institutions url
VITE_GLOB_INSTITUTIONS_URL : string;
// 【JEECG作为乾坤子应用】填写后将作为乾坤子应用启动主应用注册时AppName需保持一致
VITE_GLOB_QIANKUN_MICRO_APP_NAME?: string;