Commit 6e4a2f36 authored by Step_by_step's avatar Step_by_step

feat: 融资意向 以及 自助服务

parent 059cdc62
......@@ -21,13 +21,13 @@ npm run dev 本地运行
### 子应用
1. 融资计算器
2. 融资意向
1. 融资计算器 🅰
2. 融资意向 ✅
3. 项目查询
4. 合同签约 (E签宝, 预览签署文件)
5. 还款计划 (支付)
6. 还款计划查询 (发票预览下载)
7. 自助服务
7. 自助服务 ✅
8. 客户信息变更
......
......@@ -3,10 +3,13 @@
"version": "0.1.0",
"scripts": {
"dev": "VITE_TARGET=ALL vite ",
"build": "vite build"
"build": "vite build",
"build:selfService": "VITE_TARGET=selfService vite build",
"build:intention": "VITE_TARGET=intention vite build"
},
"dependencies": {
"@hips/plugin-vue-jssdk": "^1.1.2",
"@vant/area-data": "^1.3.2",
"axios": "^1.2.0",
"moment": "^2.29.4",
"pinia": "^2.0.23",
......
......@@ -123,8 +123,8 @@ function placeHolder(value, type, item = {}) {
val = toPercent(item.value, false)
}
return item.disabled ? val
: val ? val : typeList[type]
return item.disabled ? val + ''
: val ? val + '' : typeList[type]
}
function chooser(formItem) {
......@@ -166,52 +166,66 @@ function getClass(item) {
}
</script>
<style scoped lang="stylus">
.cell-title
:deep(.van-cell__title span::before)
display inline-block;
height 50%;
width 3px;
background-color #3D59C0;
content "";
margin-right 5px;
<style scoped lang="less">
.cell-title {
:deep(.van-cell__title span::before) {
display: inline-block;
height: 50%;
width: 3px;
background-color: #3D59C0;
content: "";
margin-right: 5px;
}
:deep(.van-cell__value) {
color: black;
}
}
:deep(.van-cell__value)
color black
:deep(.van-field--disabled .van-field__label)
color black
:deep(.van-field--disabled .van-field__label) {
color: black;
}
:deep(.van-field__label)
color: rgb(50,50,51)
:deep(.van-field__label) {
color: rgb(50, 50, 51);
}
// 必须填写
:deep(.required .van-cell__title::before)
content: '*'
color: red
:deep(.required .van-cell__title::before) {
content: '*';
color: red;
}
// 检验失败后
:deep(.fail .van-cell__title)
color: red !important
:deep(.fail .van-cell__title) {
color: red !important;
}
:deep(.van-field__body .van-field__control--right)
color #969799 !important
:deep(.van-field__body .van-field__control--right) {
color: #969799 !important;
}
:deep(.van-field__label)
width auto
max-width 77%
:deep(.van-field__label) {
width: auto;
max-width: 77%;
}
.myformList + .myformList
margin-top 20px
.myformList+.myformList {
margin-top: 20px;
}
.myformList :deep(.van-field__control:disabled)
-webkit-text-fill-color unset
.myformList :deep(.van-field__control:disabled) {
-webkit-text-fill-color: unset;
}
// checkGroup
:deep(.van-checkbox__label--disabled )
color #323233
:deep(.van-checkbox )
flex: 1 1 45%
margin-bottom 3vw
:deep(.van-checkbox__label--disabled) {
color: #323233;
}
:deep(.van-checkbox) {
flex: 1 1 45%;
margin-bottom: 3vw;
}
</style>
\ No newline at end of file
<template>
<div class="box">
<template v-if="title">
<h1 class="title ">
{{ title }}
<span v-if="!!other_title" class="title-other">{{ other_title }}</span>
</h1>
<hr />
</template>
<table :class="{ only_two: values.length < 3 }">
<template v-for="(value, i ) in values">
<tr>
<th v-if="i === 0" v-for="text in value">{{ text }}</th>
<td v-else v-for="text in value">{{ text }}</td>
</tr>
</template>
</table>
</div>
</template>
<script setup>
defineProps({
title: {
type: String,
default: ''
},
other_title: {
type: String,
default: ''
},
values: {
type: Array,
default() { return [] }
}
})
</script>
<style scoped lang="less">
.box {
box-sizing: border-box;
height: auto;
background-color: white;
width: 90%;
margin: 0 auto;
border-left: 3px solid #019ae5;
padding: 8px 8px;
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
}
.box+.box {
margin-top: 20px;
}
.title {
font-weight: 600;
}
.title-other {
float: right;
color: gray;
}
hr {
border: 1px solid #f7f8f8;
background-color: #f7f8f8;
}
table {
width: 100%;
th {
color: gray;
}
td,
th {
text-align: center;
height: 25px;
line-height: 20px;
}
}
table.only_two tr>th:nth-child(1),
table.only_two tr>td:nth-child(1) {
text-align: left;
}
table.only_two tr>th:nth-child(2),
table.only_two tr>td:nth-child(2) {
text-align: left;
}
table.only_two tr>td:nth-child(2) {
color: orange
}
</style>
\ No newline at end of file
<template>
<section class="hint">
<p class="title">
<Icon class="icon" name="info" color="#7dc401" size="6vw" />
<span>温馨提示</span>
</p>
<div class="detail">{{ detail }}</div>
</section>
</template>
<script setup>
import { Icon } from "vant";
defineProps({
detail: {
type: String,
default: ''
}
})
</script>
<style lang="less" scoped>
.hint {
box-sizing: border-box;
height: 60px;
width: 95%;
margin: 5px auto 10px;
background-color: #f0f9e5;
padding: 6px 7px;
}
.title {
color: #7dc401;
font-weight: 600;
line-height: 6vw;
i {
vertical-align: middle;
margin-right: 8px;
}
}
.detail {
width: 100%;
text-align: center;
color: gray;
}
</style>
\ No newline at end of file
<template>
<div class="plus">
<Icon class="icon" name="plus" color="#fff" size="6vw" />
</div>
</template>
<script setup>
import { Icon } from 'vant'
</script>
<style lang="less" scoped>
.plus {
width: 40px;
height: 40px;
background-color: #019ae5;
border-radius: 50%;
position: absolute;
bottom: 70px;
right: 20px;
display: flex;
justify-content: center;
}
.icon {
line-height: 38px;
}
</style>
\ No newline at end of file
import { get, put, post, File, deleteReq } from '@/utils/http'
const baseURL = import.meta.env.VITE_HTTP_BASE_URL
const api = {
// getMakingList (data) { // 查询合同制作列表
// return get(
// `${baseURL}/hlct/v1/0/contracts/toMake`,
// {...data}
// )
// },
};
export default api;
<template>
<div class="box">
<template v-if="title">
<h1 class="title ">{{ title }}</h1>
<hr />
</template>
<table>
<template v-for="(value, i ) in values">
<tr v-if="i === 0">
<th>{{ value[0] }}</th>
<th>{{ value[1] }}</th>
<th>{{ value[2] }}</th>
</tr>
<tr v-else>
<td>{{ value[0] }}</td>
<td>{{ value[1] }}</td>
<td>{{ value[2] }}</td>
</tr>
</template>
</table>
</div>
</template>
<script setup>
defineProps({
title: {
type: String,
default: ''
},
values: {
type: Array,
default() { return [] }
}
})
</script>
<style scoped lang="less">
.box {
box-sizing: border-box;
height: auto;
background-color: white;
width: 90%;
margin: 0 auto;
border-left: 3px solid #019ae5;
padding: 5px 3px;
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
}
.box+.box {
margin-top: 20px;
}
.title {
font-weight: 600;
}
hr {
border: 1px solid #f7f8f8;
background-color: #f7f8f8;
}
table {
width: 100%;
th {
color: gray;
}
td,
th {
text-align: center;
height: 25px;
line-height: 20px;
}
}
</style>
\ No newline at end of file
<template>
<section class="hint">
<p class="title">
<Icon class="icon" name="info" color="#7dc401" size="6vw" />
<span>温馨提示</span>
</p>
<div class="detail">{{ detail }}</div>
</section>
</template>
<script setup>
import { Icon } from "vant";
defineProps({
detail: {
type: String,
default: ''
}
})
</script>
<style lang="less" scoped>
.hint {
box-sizing: border-box;
height: 60px;
width: 95%;
margin: 5px auto 10px;
background-color: #f0f9e5;
padding: 6px 7px;
}
.title {
color: #7dc401;
font-weight: 600;
line-height: 6vw;
i {
vertical-align: middle;
margin-right: 8px;
}
}
.detail {
width: 100%;
text-align: center;
color: gray;
}
</style>
\ No newline at end of file
<template>
<div class="plus">
<Icon class="icon" name="plus" color="#fff" size="6vw" />
</div>
</template>
<script setup>
import { Icon } from 'vant'
</script>
<style lang="less" scoped>
.plus {
width: 40px;
height: 40px;
background-color: #019ae5;
border-radius: 50%;
position: absolute;
bottom: 70px;
right: 20px;
display: flex;
justify-content: center;
}
.icon {
line-height: 38px;
}
</style>
\ No newline at end of file
const state = {};
export default {
namespaced: true,
state,
};
<template>
<div class="container">
<NavBar title="融资意向" left-arrow @click-left="goBack" />
<section class="list">
<PullRefresh v-model="refreshing" @refresh="onRefresh" class="scroll">
<List :finished="finished" finished-text="没有更多了" @load="loadApproval">
<ListItem v-for="item in listValue" :other_title="item.other_title" :title="item.title" :values="item.values"
@click="jump" />
</List>
</PullRefresh>
</section>
<Plus @click="jump" />
</div>
</template>
<script setup>
import { goBack } from "@/utils/globalFun"
import { NavBar, List, PullRefresh } from "vant";
import ListItem from '@/components/ListItem.vue'
import Plus from '@/components/Plus.vue'
import api from "../api";
import { useRouter } from "vue-router";
const listValue = $ref([
{
title: 'R00001',
other_title: "2022-07-18",
values: [["合同金额", "状态"], ["¥ 20,000.00", "受理中"]]
}
])
const refreshing = $ref(true);
const finished = $ref(true);
const onRefresh = () => {
// 下拉重置参数,重新加载
};
const loadApproval = () => {
}
const router = useRouter();
const jump = () => {
router.push({ name: 'intention-views-intentionForm' })
}
</script>
<style scoped lang="less">
.list {
box-sizing: border-box;
height: calc(100vh - var(--van-nav-bar-height));
display: flex;
flex-direction: column;
justify-content: space-between;
padding-top: 8px;
padding-bottom: 10px;
}
.scroll {
box-sizing: border-box;
height: 100%;
overflow-y: auto;
}
</style>
<route>
{
meta: {
title: '融资意向'
}
}
</route>
<template>
<div class="container">
<NavBar title="申请融资意向" left-arrow @click-left="goBack" />
<div class="content">
<section class="form-area">
<AuForm v-model="formConfig" :key="form" />
<Field v-model="message" rows="2" autosize label="备注说明" type="textarea" maxlength="200" placeholder="最多可编写200字"
show-word-limit />
</section>
<section class="sub">
<Button type="primary" block>确认</Button>
</section>
</div>
</div>
</template>
<script setup>
import { goBack } from "@/utils/globalFun"
import { NavBar, Button, Field } from "vant";
import AuForm from '@/components/AuForm.vue';
import AuFormClass from "@/components/useAuForm";
const form = $ref();
const formConfig = $ref(new AuFormClass([
{
title: '合同总额',
propName: 'paymentReqDate',
type: 'currency',
value: '',
isRequired: true
},
{
title: '融资租期(月)',
propName: 'paymentReqDat3e',
type: 'digit',
value: '',
isRequired: true
},
{
title: '首付款比例',
propName: 'paymentReqDat3e',
type: 'rate',
value: '',
isRequired: true
},
{
title: '首付款比例',
propName: 'paymentReqDat3e',
type: 'rate',
value: '',
isRequired: true
},
{
title: '首付款金额',
propName: 'paymentReqDat3e',
type: 'currency',
value: '',
isRequired: true
},
{
title: '代理店',
propName: 'paymentRe3qDat3e',
type: 'cell',
value: '',
isRequired: true,
select: []
},
{
title: '代理店联系电话',
propName: 'paymentRe3qDat3e',
type: 'digit',
value: '',
isRequired: true,
},
{
title: '您的姓名/公司名称',
propName: 'paymentRe3qDat3e',
type: 'input',
value: '',
isRequired: true,
},
{
title: '您的姓名/公司名称',
propName: 'paymentRe3qDat3e',
type: 'input',
value: '',
isRequired: true,
},
{
title: '您的电话号码',
propName: 'digit',
type: 'input',
value: '',
isRequired: true,
},
{
title: '联系地址',
propName: 'paymentRe3qDat3e',
type: 'cell',
value: '',
isRequired: true,
select: [],
},
]))
</script>
<style lang="less" scoped>
.sub {
width: 70%;
margin: 50px auto 5px;
}
.form-area {
padding: 10px;
}
.content {
height: calc(100% - var(--van-nav-bar-height));
overflow-y: auto;
}
</style>
\ No newline at end of file
<template>
<div class="contract-item">
<div class="item-title">
<div class="title-desc">
<div class="title-icon">
<slot name="icon" />
</div>
<div class="title-text">
<slot name="title" />
</div>
</div>
<div class="title-arrow">
<i class="arrow-right"></i>
</div>
</div>
<div class="item-warper">
<div class="item-info">
<div class="info-title">
<span>承租人</span>
</div>
<div class="info-value">
<span>{{ itemInfo.tenantName }}</span>
</div>
</div>
<div class="item-info">
<div class="info-title">
<span>业务部门</span>
</div>
<div class="info-value">
<span>{{ itemInfo.unitName }}</span>
</div>
</div>
<div class="item-info">
<div class="info-title">
<span>单据状态</span>
</div>
<div class="info-value">
<span>{{ itemInfo.contractStatusMeaning }}</span>
</div>
</div>
<div class="item-info">
<div class="info-title">
<span>项目经理</span>
</div>
<div class="info-value">
<span>{{ itemInfo.employeeName }}</span>
</div>
</div>
</div>
</div>
</template>
<script setup>
let props = defineProps({
itemInfo: {
type: Object,
default() {
return {}
}
}, //是否必输
});
</script>
<style lang="stylus" scoped>
.contract-item
display flex;
flex-flow column nowrap;
background-color #fff;
color: #646566
border-radius 5%;
padding 0.5rem;
margin-bottom: 20px
.item-title
display flex;
flex-flow row nowrap;
justify-content space-between;
height 10vw;
line-height 9vw;
.title-desc
display flex;
flex-flow row nowrap;
.title-text
font-size 4vw;
margin-left 2vw;
.title-icon
img
width 100%;
height 100%;
width 7vw;
height 7vw;
margin-top 1vw;
.title-arrow
margin-top 1vw;
.item-warper
display flex;
flex-flow row wrap;
justify-content space-around;
padding-left: 32px;
margin-top 1vw;
line-height 5vw;
font-size 3.5vw
.item-info
display flex;
flex-flow row nowrap;
width 50%;
// justify-content space-around;
.info-title
color #888;
min-width 60px;
text-align left
.info-value
margin-left 5px;
min-width 60px;
word-break break-all
.arrow-right
box-sizing border-box;
position relative;
display block;
width 12px;
height 12px;
color #888;
.arrow-rightafter
content "";
display block;
box-sizing border-box;
position absolute;
width 8px;
height 8px;
border-bottom 1px solid;
border-right 1px solid;
transform rotate(-45deg);
right 6px;
top 4px;
</style>
<template>
<div class="container">
<NavBar title="授权" left-arrow @click-left="goBack" />
<Noticce detail="授权该代理店后,该代理店可查看您的信息。" />
<section class="form">
<CellGroup inset>
<Field v-model="form.result3" readonly label="授权对象编码" input-align="right" />
<Field required v-model="form.result" is-link readonly label="所属地区" @click="showArea = true"
input-align="right" />
<Field required v-model="form.result2" is-link readonly label="代理店名称" @click="showPicker = true"
input-align="right" />
</CellGroup>
</section>
<section class="sub">
<Button type="primary" block>确认</Button>
</section>
<Popup v-model:show="showArea" position="bottom">
<Picker :columns="columns" @confirm="areaConfirm" @cancel="showArea = false" />
</Popup>
<Popup v-model:show="showPicker" position="bottom">
<Picker :columns="columns" @confirm="onConfirm" @cancel="showPicker = false" />
</Popup>
</div>
</template>
<script setup>
import { goBack } from "@/utils/globalFun"
import Noticce from "@/components/Notice.vue"
import { NavBar, Field, CellGroup, Popup, Picker, Button } from "vant";
const showArea = $ref(false)
const form = $ref({
result: '',
result2: '',
result3: '333'
})
const submit = () => {
}
const areaConfirm = (value) => {
form.result = value;
showArea = false
}
const showPicker = $ref(false);
const columns = ['华北', '东北', '华东', '西南', '西北', "华南", "国外"];
const onConfirm = (value) => {
form.result2 = value;
showPicker = false;
}
</script>
<style lang="less" scoped>
.sub {
width: 70%;
margin: 50px auto 5px;
}
</style>
\ No newline at end of file
<template>
<div class="business container">
<section class="header-board">
<div class="container">
<NavBar title="自助服务" left-arrow @click-left="goBack" />
<section class="list">
<PullRefresh v-model="refreshing" @refresh="onRefresh" class="scroll">
<List :finished="finished" finished-text="没有更多了" @load="loadApproval">
<ListItem v-for="item in listValue" :title="item.title" :values="item.values" @click="jump" />
</List>
</PullRefresh>
</section>
<Plus @click="jump" />
</div>
</template>
<script setup>
import { goBack } from "@/utils/globalFun"
import { NavBar } from "vant";
import { NavBar, List, PullRefresh } from "vant";
import ListItem from '@/components/ListItem.vue'
import Plus from '@/components/Plus.vue'
import api from "../api";
import { ref } from "vue";
import { useRoute, useRouter } from "vue-router";
import { useRouter } from "vue-router";
const listValue = $ref([
{
title: '2022-07-18',
values: [["授权对象编码", "授权对象名称", "所属区域"], ["DB001", "新疆田园技术有限公司", "西北"]]
}
])
const refreshing = $ref(true);
const finished = $ref(true);
const onRefresh = () => {
// 下拉重置参数,重新加载
};
let count = $ref(333)
console.log(count);
const loadApproval = () => {
}
const router = useRouter();
const jump = () => {
router.push({ name: 'selfService-views-authorize' })
}
</script>
<style scoped lang="less">
.list {
box-sizing: border-box;
height: calc(100vh - var(--van-nav-bar-height));
display: flex;
flex-direction: column;
justify-content: space-between;
padding-top: 8px;
padding-bottom: 10px;
}
.scroll {
box-sizing: border-box;
height: 100%;
overflow-y: auto;
}
</style>
<route>
......
......@@ -39,7 +39,7 @@ body {
width: 100%;
background-color: @background-color;
color: @text-color;
font-size: 3.74vw;
font-size: 3.74vw ;
}
......
......@@ -3,7 +3,7 @@
<template v-for="(moduleRoute, index) in modules" :key="index">
<p class="module" @click="moduleRoute.length === 1 ? $router.push(moduleRoute[0].path) : null">
{{ index }}
<span v-if="moduleRoute.length === 1">--{{ moduleRoute[0].meta.title }}</span>
<span v-if="moduleRoute.length === 1">-- {{ moduleRoute[0].meta.title }}</span>
</p>
<div class="module_content" v-if="moduleRoute.length !== 1">
<div class="module_item" v-for="(route, i) of moduleRoute" :key="route.path" @click="$router.push(route.path)">
......
......@@ -7,9 +7,10 @@ import Pages from 'vite-plugin-pages'
import styleImport, { VantResolve } from 'vite-plugin-style-import';
import pxtovw from 'postcss-px-to-viewport'
const loader_pxtovw = pxtovw({
unitToConvert: 'px',
viewportWidth: 320,
viewportWidth: 375,
unitPrecision: 5,
propList: ['*'],
viewportUnit: 'vw',
......
File added
......@@ -122,6 +122,11 @@
resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197"
integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==
"@vant/area-data@^1.3.2":
version "1.3.2"
resolved "https://registry.yarnpkg.com/@vant/area-data/-/area-data-1.3.2.tgz#1672dcbeaf9ef33ceaba602ecd4f3cb0456c7737"
integrity sha512-KHGvvIxApxCXDTzsh5hPsIVrF4ll5J3pNgYNL3lmNJxye7aWySK97EgXiprVee+FshVa1jVW4esJ7VyW0l94WQ==
"@vant/icons@^1.8.0":
version "1.8.0"
resolved "https://registry.yarnpkg.com/@vant/icons/-/icons-1.8.0.tgz#36b13f2e628b533f6523a93a168cf02f07056674"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment