Commit 5323a0b0 authored by Zhang Xiaojie's avatar Zhang Xiaojie

fix:发布贷款产品

parent 7f979919
This image diff could not be displayed because it is too large. You can view the blob instead.
...@@ -2,7 +2,7 @@ import Vue from 'vue' ...@@ -2,7 +2,7 @@ import Vue from 'vue'
import App from './App.vue' import App from './App.vue'
import router from './router' import router from './router'
import store from './store' import store from './store'
import 'ant-design-vue/dist/antd.css' import 'ant-design-vue/dist/antd.less'
import 'tailwindcss/tailwind.css' import 'tailwindcss/tailwind.css'
import 'element-ui/lib/theme-chalk/index.css' import 'element-ui/lib/theme-chalk/index.css'
import filter from './filter' import filter from './filter'
......
<template> <template>
<div class="min-h-screen bg-color-primary flex items-center"> <div
<div class="w-96 h-80 bg-white mx-auto border border-gray-500 py-9"> class="
<p class="font-extrabold text-xl text-center">登录</p> login_background
<div class="w-60 mx-auto text-center"> min-h-screen
<a-tabs default-active-key="1" @change="toggleLoginWay"> bg-center bg-cover
<!-- 账号登录 --> flex flex-col
<a-tab-pane key="1" tab="密码登录"> justify-center
<a-form-model "
v-if="!loading" >
:model="loginByPwdForm" <p class="text-3xl semi-bold text-white text-center mb-10">
:rules="loginByPwdForm.rule" 中小企业普惠金融管理平台
ref="loginByPwdForm" </p>
> <div class="flex items-center">
<a-form-model-item prop="username"> <div
<a-input class="
placeholder="请输入账号" w-96
v-model="loginByPwdForm.username" bg-white
/> mx-auto
</a-form-model-item> py-9
<a-form-model-item prop="password"> rounded-lg
<a-input ring-15 ring-white ring-opacity-40
placeholder="请输入密码" "
type="password" >
v-model="loginByPwdForm.password" <div class="w-60 mx-auto text-center">
/> <a-tabs default-active-key="1" @change="toggleLoginWay">
</a-form-model-item> <!-- 账号登录 -->
</a-form-model> <a-tab-pane key="1" tab="密码登录">
<div v-else class="example"> <a-form-model
<a-spin size="large" /> v-if="!loading"
</div> :model="loginByPwdForm"
</a-tab-pane> :rules="loginByPwdForm.rule"
<!-- 验证码登录 --> ref="loginByPwdForm"
<a-tab-pane key="2" tab="验证码登录" force-render> >
<a-form-model <a-form-model-item prop="username">
v-if="!loading" <a-input
:model="loginBySmsForm" placeholder="请输入账号"
:rules="loginBySmsForm.rule" v-model="loginByPwdForm.username"
ref="loginBySmsForm" >
> <a-icon slot="prefix" type="user" />
<a-form-model-item prop="phoneNumber"> </a-input>
<div class="w-full flex justify-between"> </a-form-model-item>
<a-form-model-item prop="password">
<a-input-password
placeholder="请输入密码"
type="password"
v-model="loginByPwdForm.password"
>
<a-icon slot="prefix" type="lock" />
</a-input-password>
</a-form-model-item>
</a-form-model>
<div v-else class="example">
<a-spin size="large" />
</div>
</a-tab-pane>
<!-- 验证码登录 -->
<a-tab-pane key="2" tab="验证码登录" force-render>
<a-form-model
v-if="!loading"
:model="loginBySmsForm"
:rules="loginBySmsForm.rule"
ref="loginBySmsForm"
>
<a-form-model-item prop="phoneNumber">
<a-input <a-input
placeholder="请输入手机号" placeholder="请输入手机号"
style="width: 60%; margin-right: 10px"
v-model="loginBySmsForm.phoneNumber" v-model="loginBySmsForm.phoneNumber"
/>
<a-button
type="primary"
v-if="smsCount === 60"
@click="handleClickSendSms"
> >
获取验证码 <a-icon slot="prefix" type="phone" />
</a-button> </a-input>
<a-button v-else type="primary" disabled> </a-form-model-item>
已发送 {{ smsCount }} S <a-form-model-item prop="validation">
</a-button> <div class="w-full flex justify-between">
</div> <a-input
</a-form-model-item> style="width: 60%; margin-right: 10px"
<a-form-model-item prop="validation"> placeholder="请输入验证码"
<a-input v-model="loginBySmsForm.validation"
placeholder="请输入验证码" />
v-model="loginBySmsForm.validation" <a-button
/> v-if="smsCount === 60"
</a-form-model-item> @click="handleClickSendSms"
</a-form-model> >
<div v-else class="example"> 获取验证码
<a-spin size="large" /> </a-button>
</div> <a-button v-else type="primary" disabled>
</a-tab-pane> 已发送 {{ smsCount }} S
</a-tabs> </a-button>
<a-button v-if="!loading" type="primary" @click="handleClickLogin"> </div>
确定 </a-form-model-item>
</a-button> </a-form-model>
<div v-else class="example">
<a-spin size="large" />
</div>
</a-tab-pane>
</a-tabs>
<a-button
v-if="!loading"
type="primary"
@click="handleClickLogin"
style="width: 100%; margin-bottom: 30px"
>
登录
</a-button>
</div>
</div> </div>
</div> </div>
</div> </div>
...@@ -82,13 +113,13 @@ import { eNewRoleRelatedToBackEnd, eRole } from "@/types/role"; ...@@ -82,13 +113,13 @@ import { eNewRoleRelatedToBackEnd, eRole } from "@/types/role";
import { setUserMsg } from "@/utils/userMsg/userMsg"; import { setUserMsg } from "@/utils/userMsg/userMsg";
import { eLoginWay } from "./type"; import { eLoginWay } from "./type";
import { phoneValid } from "./const"; import { phoneValid } from "./const";
import { isPhoneValid } from '@/utils/phone/index'; import { isPhoneValid } from "@/utils/phone/index";
import { Tabs, FormModel, message } from "ant-design-vue"; import { Tabs, FormModel, message, Icon } from "ant-design-vue";
import Vue from "vue"; import Vue from "vue";
import UserService from "@/service/UserManagementService"; import UserService from "@/service/UserManagementService";
import VerifyCodeService, { eSmsType } from "@/service/VerifyCodeService"; import VerifyCodeService, { eSmsType } from "@/service/VerifyCodeService";
Vue.use(Tabs); Vue.use(Tabs).use(Icon);
export default Vue.extend({ export default Vue.extend({
props: { props: {
...@@ -202,11 +233,13 @@ export default Vue.extend({ ...@@ -202,11 +233,13 @@ export default Vue.extend({
const { accessToken, level, phone, role, userType } = ret.data; const { accessToken, level, phone, role, userType } = ret.data;
setUserMsg({ setUserMsg({
token: accessToken, token: accessToken,
newRole: this.adminLogin ? eNewRoleRelatedToBackEnd.PlatformAdmin : role, newRole: this.adminLogin
? eNewRoleRelatedToBackEnd.PlatformAdmin
: role,
level: level, level: level,
phone, phone,
userType, userType,
}) });
this.$router.push({ this.$router.push({
name: "home", name: "home",
}); });
...@@ -223,16 +256,18 @@ export default Vue.extend({ ...@@ -223,16 +256,18 @@ export default Vue.extend({
pwd, pwd,
}); });
console.log(ret); console.log(ret);
if (ret.code === 200) { if (ret.code === 200) {
const { accessToken, level, phone, role, userType } = ret.data; const { accessToken, level, phone, role, userType } = ret.data;
setUserMsg({ setUserMsg({
token: accessToken, token: accessToken,
newRole: this.adminLogin ? eNewRoleRelatedToBackEnd.PlatformAdmin : role, newRole: this.adminLogin
? eNewRoleRelatedToBackEnd.PlatformAdmin
: role,
level: level, level: level,
phone, phone,
userType, userType,
}) });
this.$router.push({ this.$router.push({
name: "home", name: "home",
}); });
...@@ -270,4 +305,8 @@ export default Vue.extend({ ...@@ -270,4 +305,8 @@ export default Vue.extend({
padding: 30px 50px; padding: 30px 50px;
margin: 20px 0; margin: 20px 0;
} }
.login_background {
background-image: url(../../assets/login_background.png);
}
</style> </style>
\ No newline at end of file
<template> <template>
<div> <div>
<a-card :title="title" style="width: 400px; border-radius: 0.75rem"> <a-card :title="title" style="width: 400px; border-radius: 0.75rem;">
<p class="text-blue-400 text-3xl font-medium mb-0 mt-4">{{ total }}</p> <p class=" text-color-primary text-3xl font-bold mb-0 mt-4">{{ total }} <span class=" text-base"></span></p>
</a-card> </a-card>
</div> </div>
</template> </template>
...@@ -27,5 +27,10 @@ export default Vue.extend({ ...@@ -27,5 +27,10 @@ export default Vue.extend({
</script> </script>
<style> <style lang="less" scoped>
/deep/.ant-card-body{
background-image: url(../../../assets/statics_bg.png);
background-size: cover;
background-position: center;
}
</style> </style>
\ No newline at end of file
...@@ -14,16 +14,16 @@ ...@@ -14,16 +14,16 @@
</a-row> </a-row>
<p class="text-2xl font-bold my-5">日活折线图</p> <p class="text-2xl font-bold my-5">日活折线图</p>
<!-- 数据源 --> <!-- 数据源 -->
<span>统计</span> <span>数据</span>
<a-radio-group <a-radio-group
@change="handleChangeSource" @change="handleChangeSource"
:default-value="eBarChart.login_dau" v-model="chartType"
> >
<a-radio-button :value="eBarChart.not_login_dau"> 全局日活 </a-radio-button> <a-radio-button :value="eBarChart.not_login_dau"> 全局日活 </a-radio-button>
<a-radio-button :value="eBarChart.login_dau"> 注册日活 </a-radio-button> <a-radio-button :value="eBarChart.login_dau"> 注册日活 </a-radio-button>
</a-radio-group> </a-radio-group>
<!-- 日期范围 --> <!-- 日期范围 -->
<span class="ml-7">统计</span> <span class="ml-7">日期区间</span>
<a-radio-group @change="handleChangeTimeRange" default-value="10"> <a-radio-group @change="handleChangeTimeRange" default-value="10">
<a-radio-button value="10"> 10天 </a-radio-button> <a-radio-button value="10"> 10天 </a-radio-button>
<a-radio-button value="15"> 15天 </a-radio-button> <a-radio-button value="15"> 15天 </a-radio-button>
...@@ -40,6 +40,7 @@ import { Row, Col, Radio } from "ant-design-vue"; ...@@ -40,6 +40,7 @@ import { Row, Col, Radio } from "ant-design-vue";
import * as echarts from "echarts"; import * as echarts from "echarts";
import { eBarChart } from "./const"; import { eBarChart } from "./const";
import DashboardService from "@/service/DashboardService/index"; import DashboardService from "@/service/DashboardService/index";
import { getPastDaysUtilYesterday } from "@/utils/days/index";
Vue.use(Row).use(Col).use(Radio); Vue.use(Row).use(Col).use(Radio);
export default Vue.extend({ export default Vue.extend({
...@@ -54,25 +55,31 @@ export default Vue.extend({ ...@@ -54,25 +55,31 @@ export default Vue.extend({
data() { data() {
return { return {
option: { option: {
color: "#60A5FA", color: "#3E4FAF",
xAxis: { xAxis: {
type: "category", type: "category",
data: [0], // mock
data: [] as Array<any>
// data: [] as Array<number>,
}, },
yAxis: { yAxis: {
type: "value", type: "value",
}, },
series: [ series: [
{ {
data: [100], // data: [] as Array<number>,
type: "bar", // mock
data: [820, 932, 901, 934, 1290, 1330, 1320,934, 1290, 1330, 1320,820, 932, 901, 934, 1290, 1330, 1320,934, 1290, 1330, 1320],
type: "line",
areaStyle: {color: "#F5F5FB"},
smooth: true,
showBackground: false, showBackground: false,
}, },
], ],
}, },
timeRange: 10, timeRange: 10,
myChart: undefined as undefined | echarts.ECharts, myChart: undefined as undefined | echarts.ECharts,
chartType:'', chartType:eBarChart.not_login_dau,
eBarChart, eBarChart,
type:'', type:'',
login_dau: 0, login_dau: 0,
...@@ -95,10 +102,17 @@ export default Vue.extend({ ...@@ -95,10 +102,17 @@ export default Vue.extend({
}, },
handleChangeSource(e: any) { handleChangeSource(e: any) {
let type = e.target!.value let type = e.target!.value
console.log(type);
this.chartType = type === eBarChart.login_dau? eBarChart.login_dau:eBarChart.not_login_dau this.chartType = type === eBarChart.login_dau? eBarChart.login_dau:eBarChart.not_login_dau
this.queryChart() this.queryChart()
}, },
initEchart(period: number) { initEchart(period: number) {
// mock
(this.option.xAxis.data as Array<String>) = getPastDaysUtilYesterday(
period
) as Array<String>;
//
(this.myChart as echarts.ECharts).setOption(this.option); (this.myChart as echarts.ECharts).setOption(this.option);
this.queryChart() this.queryChart()
}, },
...@@ -111,6 +125,8 @@ export default Vue.extend({ ...@@ -111,6 +125,8 @@ export default Vue.extend({
} }
}, },
async queryChart() { async queryChart() {
console.log(this.timeRange,this.chartType);
const ret = await DashboardService.getInstance().queryChart( const ret = await DashboardService.getInstance().queryChart(
{ {
days:this.timeRange, days:this.timeRange,
...@@ -120,8 +136,9 @@ export default Vue.extend({ ...@@ -120,8 +136,9 @@ export default Vue.extend({
if (ret.code === 200) { if (ret.code === 200) {
console.log(ret); console.log(ret);
ret.data.map((data)=>{ ret.data.map((data)=>{
this.option.series[0].data.push(data.value) // 真实数据
this.option.xAxis.data.push(data.time) // this.option.series[0].data.push(data.value)
// this.option.xAxis.data.push(data.time)
}) })
} }
}, },
......
...@@ -28,35 +28,54 @@ ...@@ -28,35 +28,54 @@
</a-form-model-item> </a-form-model-item>
<a-form-model-item label="贷款期限(月)"> <a-form-model-item label="贷款期限(月)">
<a-input-number <a-input-number
v-model="form.startTime" :value="form.startTime"
@change="(v) => (form.startTime = Math.floor(v))"
:step="1"
style="width: 20%" style="width: 20%"
:min="0" :min="0"
/> />
—— ——
<a-input-number
<a-input-number v-model="form.endTime" :min="0" style="width: 20%" /> :value="form.endTime"
@change="(v) => (form.endTime = Math.floor(v))"
:step="1"
:min="Math.floor(form.startTime + 1)"
style="width: 20%"
/>
</a-form-model-item> </a-form-model-item>
<a-form-model-item label="参考利率(%)"> <a-form-model-item label="参考利率(%)">
<a-input-number <a-input-number
v-model="form.interstMin" :value="isNaN(form.interstMin)? 0:form.interstMin"
placeholder="最多可输小数点后两位" @change="(v) => ( form.interstMin = Number.parseFloat(v).toFixed(2))"
placeholder="最多可输小数点后两位"
:step="0.01" :step="0.01"
:min="0" :min="0"
style="width: 20%" style="width: 20%"
/> />
—— ——
<a-input-number <a-input-number
v-model="form.interstMax" :value="isNaN(form.interstMax)? +Number.parseFloat(form.interstMin).toFixed(2)+0.01:form.interstMax"
@change="(v) => (form.interstMax = isNaN(v)? 0: Number.parseFloat(v).toFixed(2))"
placeholder="最多可输小数点后两位" placeholder="最多可输小数点后两位"
:step="0.01" :step="0.01"
:min="0" :min="+Number.parseFloat(form.interstMin).toFixed(2)+0.01"
style="width: 20%" style="width: 20%"
/> />
</a-form-model-item> </a-form-model-item>
<a-form-model-item label="贷款额度(万元)"> <a-form-model-item label="贷款额度(万元)">
<a-input-number v-model="form.limitMin" style="width: 20%" :min="0" /> <a-input-number
:value="form.limitMin"
@change="(v) => (form.limitMin = Math.floor(v))"
style="width: 20%"
:min="0"
/>
—— ——
<a-input-number style="width: 20%" v-model="form.limitMax" :min="0" /> <a-input-number
style="width: 20%"
:value="form.limitMax"
@change="(v) => (form.limitMax = Math.floor(v))"
:min="Math.floor(form.limitMin + 1)"
/>
</a-form-model-item> </a-form-model-item>
<a-form-model-item label="担保方式" :wrapper-col="{ span: 5 }"> <a-form-model-item label="担保方式" :wrapper-col="{ span: 5 }">
<a-select <a-select
...@@ -64,7 +83,11 @@ ...@@ -64,7 +83,11 @@
@change="changeGuarantee" @change="changeGuarantee"
v-model="form.guarantee" v-model="form.guarantee"
> >
<a-select-option v-for="(type,i) in guaranteeType" :key="type" :value="i+1"> <a-select-option
v-for="(type, i) in guaranteeType"
:key="type"
:value="i + 1"
>
{{ type }} {{ type }}
</a-select-option> </a-select-option>
</a-select> </a-select>
...@@ -125,7 +148,7 @@ export default Vue.extend({ ...@@ -125,7 +148,7 @@ export default Vue.extend({
}, },
}, },
}, },
async mounted() { async created() {
this.isEditable = this.$route.name == "editLoanProduct" ? true : false; this.isEditable = this.$route.name == "editLoanProduct" ? true : false;
if (this.isEditable) { if (this.isEditable) {
const uuid = this.$route.params.uuid; const uuid = this.$route.params.uuid;
...@@ -157,10 +180,10 @@ export default Vue.extend({ ...@@ -157,10 +180,10 @@ export default Vue.extend({
name: "", name: "",
orgnization: "", orgnization: "",
startTime: 0, startTime: 0,
endTime: 0 , endTime: 0,
interstMax: 0, interstMax: 0,
interstMin: 0, interstMin: 0,
limitMax: 0 as number, limitMax: 0,
limitMin: 0, limitMin: 0,
guarantee: eGuaranteeType.credit, guarantee: eGuaranteeType.credit,
type: eProductType.company, type: eProductType.company,
...@@ -291,9 +314,9 @@ export default Vue.extend({ ...@@ -291,9 +314,9 @@ export default Vue.extend({
} }
}); });
} }
this.productSave({ this.productSave({
page: 1, page: 1,
}); });
} else { } else {
return false; return false;
} }
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue' import Vue from 'vue'
import { Cascader} from 'ant-design-vue' import { Cascader,Icon} from 'ant-design-vue'
import { options } from '@/mock/index' import { options } from '@/mock/index'
import { message } from 'ant-design-vue' import { message } from 'ant-design-vue'
import StaffService from "@/service/StaffService"; import StaffService from "@/service/StaffService";
...@@ -52,7 +52,8 @@ Vue.prototype.$message = message ...@@ -52,7 +52,8 @@ Vue.prototype.$message = message
export default Vue.extend({ export default Vue.extend({
components: { components: {
HeaderSelect HeaderSelect,
Icon
}, },
computed:{ computed:{
options(){ options(){
...@@ -122,7 +123,7 @@ export default Vue.extend({ ...@@ -122,7 +123,7 @@ export default Vue.extend({
} }
} }
if( levelList.length==0 && this.search.length == 0 ){ if( levelList.length==0 && this.search.length == 0 ){
this.$message.info('请通过选择或者输入详细地址搜索') this.$message.info({content:"请通过选择或者输入详细地址搜索",icon:()=>{return this.$createElement('Icon',{style:{color:'#3E4FAF'},props:{type:'exclamation-circle'}})}})
}else{ }else{
const search:string|Array<{value: number, name: string}> = levelList.length==0? this.search:levelList const search:string|Array<{value: number, name: string}> = levelList.length==0? this.search:levelList
console.log(search) console.log(search)
......
...@@ -127,6 +127,6 @@ export default Vue.extend({ ...@@ -127,6 +127,6 @@ export default Vue.extend({
<style lang="less" scoped> <style lang="less" scoped>
/deep/a { /deep/a {
color: #1890ff; color: #3E4FAF;
} }
</style> </style>
\ No newline at end of file
...@@ -8,9 +8,12 @@ module.exports = { ...@@ -8,9 +8,12 @@ module.exports = {
extend:{ extend:{
colors:{ colors:{
// 主题色 // 主题色
'color-primary':'#1890ff', 'color-primary':'#3E4FAF',
// 登录按钮 // 登录按钮
'btn-login':'#03CDFF' 'btn-login':'#03CDFF'
},
ringWidth: {
'15': '15px',
} }
}, },
screens: { screens: {
......
...@@ -3,6 +3,11 @@ module.exports = { ...@@ -3,6 +3,11 @@ module.exports = {
css: { css: {
loaderOptions: { loaderOptions: {
less: { less: {
modifyVars: {
'primary-color': '#3E4FAF',
// 'link-color': '#1DA57A',
// 'border-radius-base': '2px',
},
javascriptEnabled: true, // 加载LESS 需要把JS设置一下 javascriptEnabled: true, // 加载LESS 需要把JS设置一下
}, },
sass: { sass: {
......
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