提交登录,与老人信息列表页

This commit is contained in:
边枭-前端开发 2024-08-24 15:01:53 +08:00
parent 0c04e9fc08
commit 68b2d7ec79
23 changed files with 6455 additions and 226 deletions

5387
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

299
src/RTInfo/pages/index.vue Normal file
View File

@ -0,0 +1,299 @@
<template>
<view style="width: 100%">
<view class="u-page">
<u-loading-page :loading="loading" bg-color="#e8e8e8"></u-loading-page>
<u-row customStyle="margin: 5px">
<u-col span="9">
<u-search style="z-index: 999" :disabled="true" bgColor="rgb(255 255 255)" placeholder="搜索"
shape="round" @click="handle_SearchBox_click" :showAction="false" :animation="true"></u-search>
</u-col>
<u-col span="3">
<u-button type="primary"
@click="handel_plus_click"
size="small" shape="circle"
class="custom-style"
plain text="创建">
</u-button>
</u-col>
</u-row>
<u-popup :show="show" @close="close" @open="open">
<view style="width: 93%; align-self: center">
<u--form labelWidth="auto" labelPosition="left" :model="queryParamsForm" :rules="rules" ref="form1">
<u-form-item label="长者姓名" prop="name" borderBottom ref="item1">
<u--input inputAlign="center" shape="square" border="none" v-model="queryParamsForm.name">
</u--input>
</u-form-item>
<u-form-item label="身份证号码" prop="idNumber" borderBottom ref="item1">
<u--input inputAlign="center" shape="square" border="none"
v-model="queryParamsForm.idNumber">
</u--input>
</u-form-item>
</u--form>
<u-row customStyle="margin:10px">
<u-col span="12">
<u-button class="custom-style" type="primary" size="small" @click="handel_search_click">搜索
</u-button>
</u-col>
</u-row>
<u-row customStyle="margin:10px">
<u-col span="12">
<u-button class="custom-style" type="primary" size="small" @click="handel_reset_click">重置
</u-button>
</u-col>
</u-row>
</view>
</u-popup>
<u-row customStyle="margin-bottom: 10px ">
<u-col span="12">
<u-empty v-if="DataList.length == 0" mode="list"></u-empty>
<u-cell-group customStyle="background-color: white;" v-else>
<u-cell v-for="(item, index) in DataList" size="large" isLink clickable
:title="getItemTitle(item)" :label="getItemLabel(item)" :name="item.id"
@click="handel_cell_click">
</u-cell>
</u-cell-group>
<uni-load-more :status="status" :contentText="loadText" @clickLoadMore="MyonLoad" />
</u-col>
</u-row>
</view>
</view>
</template>
<script setup>
import {
transformPostBody,
transformRequestURL,
} from "@/utils/requestParams.js";
import {
GetAgeByIdCard
} from "@/utils/stringFormat.js";
import {
QueryRTInfoList
} from "@/api/elder/RTInfo.js";
import mixin from "@/mixins/myLoadMore";
import {
onLoad,
onShow,
onHide,
onReady
} from '@dcloudio/uni-app'
import {
computed,
ref,
reactive,
onMounted
} from 'vue';
// let {status,
// finished,
// DataList,
// total,
// loadText,
// MyonLoad} = mixin()
onShow(() => {
queryParams.pageNum = 1
getList();
console.log('111setup中的onShow', queryParams);
})
onHide(() => {
console.log('setup中的onHide');
})
onReady(() => {
console.log('setup中的onReady');
})
let finished = ref(false)
let loadText = reactive({
contentdown: "点击加载更多",
contentrefresh: "正在加载",
contentnomore: "没有更多数据了",
})
let MyonLoad = (e) => {
if (status.value == "more") {
fetch();
finished.value = true;
e.detail = {
status: "loading",
};
}
return e;
}
let DataList = ref([])
let total = ref(0)
let queryParams = reactive({
pageNum: 1,
pageSize: 20, //
startAge: undefined,
endAge: undefined,
areaCode: undefined,
});
let queryParamsForm = reactive({
idNumber: undefined,
name: undefined,
sex: undefined,
currentState: undefined,
selfCareAbility: undefined,
urbanRural: undefined,
capabilityAssess: undefined,
livingStatus: undefined,
pensionMode: undefined,
childStatus: undefined,
});
let rules = reactive({});
let loading = ref(false);
let show = ref(false);
let chartData = reactive({});
//
let status = computed(() => {
if (DataList.value.length < total.value) {
return "more";
} else {
finished.value = true;
return "nomore";
}
});
onMounted(() => {
getServerData()
});
//
function handle_SearchBox_click() {
show.value = true;
}
function open() {}
function close() {
show.value = false;
}
//
function handel_search_click() {
finished.value = false; //
queryParams.pageNum = 1; //
DataList.value = []; //
getList();
show.value = false; //
}
//
function handel_reset_click() {
queryParams = {
pageNum: 1,
pageSize: 15, //
startAge: undefined,
endAge: undefined,
areaCode: undefined,
};
queryParamsForm = {
idNumber: undefined,
name: undefined,
sex: undefined,
currentState: undefined,
selfCareAbility: undefined,
urbanRural: undefined,
capabilityAssess: undefined,
livingStatus: undefined,
pensionMode: undefined,
childStatus: undefined,
};
handel_search_click();
}
//
function handel_plus_click() {
// this.$tab.navigateTo("/pages/RTInfo/add");
}
//
function handel_cell_click(id) {
// this.$tab.navigateTo("/pages/RTInfo/detail?id=" + id.name);
}
//
function fetch() {
queryParams.pageNum = queryParams.pageNum + 1; //
QueryRTInfoList(queryParams, queryParamsForm).then(
(res) => {
if (res.code == 200) {
let list = [...DataList.value]
let list2 = res.rows.filter(
(item) => !list.some((i) => i.id === item.id)
)
// DataList =list.concat(
// res.rows.filter(
// (item) => !list.some((i) => i.id === item.id)
// )
// );
DataList.value=[...list,...list2]
total.value = res.total;
}
}
);
}
//
function getList() {
loading.value = true;
QueryRTInfoList(queryParams, queryParamsForm).then(
(res) => {
if (res.code == 200) {
DataList.value = res.rows;
total.value = res.total;
}
loading.value = false;
}
);
}
//
function getItemTitle(item) {
let result = "";
// "name": "",
// "sex": "",
// "age": "87",
if (item.name) result += item.name + " ";
if (item.sex) result += item.sex + " ";
if (item.idNumber) result += GetAgeByIdCard(item.idNumber) + "岁";
return result;
}
//
// "permanentProvince": "西",
// "permanentCity": "",
// "permanentDistrict": "",
// "permanentTown": "",
// "permanentVillage": "",
// "permanentStreet": "",
// "permanentResidenceAdd": "54",
function getItemLabel(item) {
let result = "";
//if (item.permanentProvince) result += item.permanentProvince
//if (item.permanentCity) result += item.permanentCity
if (item.permanentDistrict) result += item.permanentDistrict;
// if (item.permanentTown) result += item.permanentTown
if (item.permanentStreet) result += item.permanentStreet;
if (item.permanentVillage) result += item.permanentVillage;
if (item.permanentResidenceAdd) result += item.permanentResidenceAdd;
return result;
}
function getServerData() {
//
setTimeout(() => {
let res = {
categories: ['2016', '2017', '2018', '2019', '2020', '2021'],
series: [{
name: '目标值',
data: [35, 36, 31, 33, 13, 34],
},
{
name: '完成量',
data: [18, 27, 21, 24, 6, 28],
},
],
};
chartData.value = JSON.parse(JSON.stringify(res));
}, 500);
}
</script>
<style>
</style>

85
src/api/elder/RTInfo.js Normal file
View File

@ -0,0 +1,85 @@
import request from '@/utils/request'
import store from '@/store/index.ts' // store
import auth from '@/plugins/auth.ts'
import {
transformPostBody,
transformRequestURL
} from "@/utils/requestParams.js";
// 查询老人信息列表
export function QueryRTInfoList_Role(UrlParams, body) {
if (!auth.hasRole("admin")) { //没有admin权限的情况下添加请求条件
body.queryParam.permanentDistrict = store.state.user.user.remark
}
return request({
url: '/elder/rtInfo/page',
method: 'post',
params: transformRequestURL(UrlParams),
data: transformPostBody(body)
})
}
export function QueryRTInfoList(UrlParams, body) {
return request({
url: '/elder/rtInfo/page',
method: 'post',
params: transformRequestURL(UrlParams),
data: transformPostBody(body)
})
}
// 查询指定老人详细信息
export function getRTInfo(Id) {
return request({
url: '/elder/rtInfo/' + Id,
method: 'get'
})
}
// 新增老人信息
export function addRTInfo(data) {
// console.log('addRTInfo',{
// url: '/elder/rtInfo/save',
// method: 'post',
// data: data
// });
return request({
url: '/elder/rtInfo/save',
method: 'post',
data: data
})
}
// 修改老人信息
export function updateRTInfo(data) {
// console.log('updateRTInfo',{
// url: '/elder/rtInfo/update',
// method: 'post',
// data: data
// });
return request({
url: '/elder/rtInfo/update',
method: 'post',
data: data
})
}
// 删除老人信息
export function delRTInfo(Ids) {
return request({
url: '/elder/rtInfo/delete',
method: 'delete',
data: Ids
})
}
//dev-api/system/administrativeDivisions/getAdministrativeDivisions
// 查询分级行政区域
export function getAdministrativeDivisions(UrlParams) {
return request({
url: '/system/administrativeDivisions/getAdministrativeDivisions',
method: 'get',
params: UrlParams,
data: null
})
}

View File

@ -11,7 +11,7 @@ export function login(data) {
grantType: data.grantType || 'password'
};
return request({
url: '/auth/login',
url: '/login',
headers: {
isToken: false,
isEncrypt: true
@ -52,7 +52,7 @@ export function register(data) {
// 获取用户详细信息
export function getInfo() {
return request({
url: '/system/user/getInfo',
url: '/getInfo',
method: 'get'
})
}
@ -60,7 +60,7 @@ export function getInfo() {
// 退出方法
export function logout() {
return request({
url: '/auth/logout',
url: '/logout',
method: 'post'
})
}
@ -68,7 +68,7 @@ export function logout() {
// 获取验证码
export function getCodeImg() {
return request({
url: '/auth/code',
url: '/captchaImage',
headers: {
isToken: false
},

13
src/config/hengshui.js Normal file
View File

@ -0,0 +1,13 @@
module.exports = {
HengShui: {
name: '衡水',
baseUrl: 'http://121.17.30.201:10075',
// baseUrl: 'http://localhost:10200',
title: '衡水市居家和社区管理系统',
enableRememberPassword: true, //是否显示记住密码勾选框
requireCheckinPhoto: false, //签到时,是否需要拍照
addCheckinWatermark: false, //签到时,是否给照片加水印
watermark_before_after_GZSG: false, //改造施工前后,照片加水印
watermark_before_after_SMFW: false, //上门服务前后,照片加水印
}
}

7
src/config/index.js Normal file
View File

@ -0,0 +1,7 @@
export * from './lvliang'
export * from './wendeng'
export * from './hengshui'
export * from './loudi'
export * from './weinan'
export * from './qujing'
export * from './ziyang'

14
src/config/loudi.js Normal file
View File

@ -0,0 +1,14 @@
module.exports = {
LouDi: {
name: '娄底',
// baseUrl: 'http://116.162.216.63:10075',//旧的
baseUrl: 'http://122.9.137.144:10075',
// baseUrl: 'http://localhost:10200',
title: '娄底市居家和社区管理系统',
enableRememberPassword: true, //是否显示记住密码勾选框
requireCheckinPhoto: true, //签到时,是否需要拍照
addCheckinWatermark: true, //签到时,是否给照片加水印
watermark_before_after_GZSG: true, //改造施工前后,照片加水印
watermark_before_after_SMFW: true, //上门服务前后,照片加水印
}
}

12
src/config/lvliang.js Normal file
View File

@ -0,0 +1,12 @@
module.exports = {
LvLiang: {
name: '吕梁',
baseUrl: 'http://114.116.112.154:8080',
title: '吕梁市居家和社区管理系统',
enableRememberPassword: true, //是否显示记住密码勾选框
requireCheckinPhoto: false, //签到时,是否需要拍照
addCheckinWatermark: false, //签到时,是否给照片加水印
watermark_before_after_GZSG: false, //改造施工前后,照片加水印
watermark_before_after_SMFW: false, //上门服务前后,照片加水印
}
}

12
src/config/qujing.js Normal file
View File

@ -0,0 +1,12 @@
module.exports = {
QuJing: {
name: '曲靖',
baseUrl: 'http://114.116.112.154:10140',
title: '曲靖市居家和社区管理系统',
enableRememberPassword: true, //是否显示记住密码勾选框
requireCheckinPhoto: false, //签到时,是否需要拍照
addCheckinWatermark: false, //签到时,是否给照片加水印
watermark_before_after_GZSG: false, //改造施工前后,照片加水印
watermark_before_after_SMFW: false, //上门服务前后,照片加水印
}
}

12
src/config/weinan.js Normal file
View File

@ -0,0 +1,12 @@
module.exports = {
WeiNan: {
name: '渭南',
baseUrl: 'http://114.116.112.154:10125',
title: '渭南市居家和社区管理系统',
enableRememberPassword: true, //是否显示记住密码勾选框
requireCheckinPhoto: false, //签到时,是否需要拍照
addCheckinWatermark: false, //签到时,是否给照片加水印
watermark_before_after_GZSG: false, //改造施工前后,照片加水印
watermark_before_after_SMFW: false, //上门服务前后,照片加水印
}
}

14
src/config/wendeng.js Normal file
View File

@ -0,0 +1,14 @@
module.exports = {
WenDeng: {
name: '文登',
baseUrl: 'http://114.116.112.154:10200',
// baseUrl: 'http://192.168.1.7:10200', //真机调试
// baseUrl: 'http://localhost:10200',
title: '威海文登市居家和社区管理系统',
enableRememberPassword: true, //是否显示记住密码勾选框
requireCheckinPhoto: false, //签到时,是否需要拍照
addCheckinWatermark: false, //签到时,是否给照片加水印
watermark_before_after_GZSG: false, //改造施工前后,照片加水印
watermark_before_after_SMFW: false, //上门服务前后,照片加水印
}
}

14
src/config/ziyang.js Normal file
View File

@ -0,0 +1,14 @@
module.exports = {
ZiYang: {
name: '资阳',
baseUrl: 'http://101.205.145.234:10001',
// baseUrl: 'http://122.9.137.144:10150',
// baseUrl: 'http://101.205.145.234:6379',
title: '资阳市居家和社区管理系统',
enableRememberPassword: true, //是否显示记住密码勾选框
requireCheckinPhoto: false, //签到时,是否需要拍照
addCheckinWatermark: false, //签到时,是否给照片加水印
watermark_before_after_GZSG: false, //改造施工前后,照片加水印
watermark_before_after_SMFW: false, //上门服务前后,照片加水印
}
}

42
src/mixins/myLoadMore.js Normal file
View File

@ -0,0 +1,42 @@
import {
ref,reactive,computed
} from 'vue'
export default function() {
let finished = ref(false)
let DataList = ref([])
let total = ref(0)
let loadText = reactive({
contentdown: "点击加载更多",
contentrefresh: "正在加载",
contentnomore: "没有更多数据了",
})
// 计算属性
let status = computed(() => {
console.log(222,DataList,DataList.value.length < total.value,DataList.value.length ,total.value)
if (DataList.value.length < total.value) {
return "more";
} else {
finished.value = true;
return "nomore";
}
});
let MyonLoad = (e) => {
if (status.value == "more") {
fetch();
finished.value = true;
e.detail = {
status: "loading",
};
}
return e;
}
return {
status,
finished,
DataList,
total,
loadText,
MyonLoad
}
}

View File

@ -237,7 +237,18 @@
"path": "code/index"
}
]
}
},
{
"root": "RTInfo/pages",
"pages": [
{
"path": "index",
"style": {
"navigationBarTitleText": "老人信息"
}
}
]
}
],
"tabBar": {
"color": "#000000",

View File

@ -0,0 +1,75 @@
<template>
<view class="content">
<image class="logo" src="@/static/logo.png"></image>
<view class="text-area">
<text class="title">Hello RuoYi-Vue</text>
</view>
<view class="text-area">
<up-text type="primary" text="uview-plus"></up-text>
</view>
<view class="charts-box">
<qiun-data-charts type="column" :chartData="chartData" />
</view>
</view>
</template>
<script setup>
import { ref, onMounted } from 'vue';
const chartData = ref({});
onMounted(() => { getServerData() });
function getServerData() {
//
setTimeout(() => {
let res = {
categories: ['2016', '2017', '2018', '2019', '2020', '2021'],
series: [
{
name: '目标值',
data: [35, 36, 31, 33, 13, 34],
},
{
name: '完成量',
data: [18, 27, 21, 24, 6, 28],
},
],
};
chartData.value = JSON.parse(JSON.stringify(res));
}, 500);
}
</script>
<style scoped>
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
}
.text-area {
display: flex;
justify-content: center;
}
.title {
font-size: 36rpx;
color: #8f8f94;
}
.charts-box {
width: 100%;
height: 300px;
}
</style>

View File

@ -1,18 +1,17 @@
<template>
<view class="normal-login-container">
<view class="logo-content align-center justify-center flex">
<image style="width: 100rpx;height: 100rpx;" :src="globalConfig.appInfo.logo" mode="widthFix">
</image>
<text class="title">移动端登录</text>
<!-- <image style="width: 100rpx;height: 100rpx;" :src="globalConfig.appInfo.logo" mode="widthFix">
</image> -->
<text class="title">{{ areaConfig.title }}</text>
</view>
<view class="login-form-content">
<view class="input-item flex align-center" v-if="tenantEnabled">
<!-- <view class="input-item flex align-center" v-if="tenantEnabled">
<view class="iconfont icon-friendfill icon"></view>
<select v-model="loginForm.tenantId" class="downlist">
<option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName" :value="item.tenantId"></option>
</select>
<!-- <input v-model="loginForm.username" class="input" type="text" placeholder="请输入账号" maxlength="30" /> -->
</view>
</view> -->
<view class="input-item flex align-center">
<view class="iconfont icon-user icon"></view>
<input v-model="loginForm.username" class="input" type="text" placeholder="请输入账号" maxlength="30" />
@ -44,17 +43,22 @@
<script setup>
import modal from '@/plugins/modal'
import {getCodeImg,getTenantList} from '@/api/login'
import {ref} from "vue";
import {ref,computed} from "vue";
import config from '@/config.js'
import store from '@/store'
const codeUrl = ref("");
const captchaEnabled = ref(true);
const tenantEnabled = ref(true);
const globalConfig = ref(config);
//
const areaConfig = computed(() => {
return store.state.config.areaConfig;
});
const loginForm = ref({
tenantId: '000000',
username: "admin",
password: "admin123",
password: "EdqD*W^n9mOw#9E",
code: "",
uuid: ''
});
@ -67,26 +71,26 @@
const {
data
} = res;
captchaEnabled.value = data.captchaEnabled === undefined ? true : data.captchaEnabled;
// captchaEnabled.value = data.captchaEnabled === undefined ? true : data.captchaEnabled;
// captchaEnabled.value = res.captchaEnabled === undefined ? true : res.captchaEnabled
if (captchaEnabled.value) {
codeUrl.value = 'data:image/gif;base64,' + data.img
loginForm.value.uuid = data.uuid
}
// if (captchaEnabled.value) {
codeUrl.value = 'data:image/gif;base64,' + res.img
loginForm.value.uuid = res.uuid
// }
})
};
function getTenant() {
getTenantList().then(res => {
const data = res.data;
tenantEnabled.value = data.tenantEnabled === undefined ? true : data.tenantEnabled;
if (tenantEnabled.value) {
tenantList.value = data.voList;
if (tenantList.value != null && tenantList.value.length !== 0) {
loginForm.value.tenantId = tenantList.value[0].tenantId;
}
}
})
// getTenantList().then(res => {
// const data = res.data;
// tenantEnabled.value = data.tenantEnabled === undefined ? true : data.tenantEnabled;
// if (tenantEnabled.value) {
// tenantList.value = data.voList;
// if (tenantList.value != null && tenantList.value.length !== 0) {
// loginForm.value.tenantId = tenantList.value[0].tenantId;
// }
// }
// })
};
async function handleLogin() {
if (loginForm.value.username === "") {
@ -116,9 +120,8 @@
function loginSuccess(result) {
//
store.dispatch('GetInfo').then(res => {
uni.switchTab({
url: '/pages/index'
url: '/pages/work'
});
})
}

View File

@ -1,21 +1,21 @@
<template>
<view class="work-container">
<!-- 轮播图 -->
<uni-swiper-dot class="uni-swiper-dot-box" :info="data" :current="current" field="content">
<swiper class="swiper-box" :current="swiperDotIndex" @change="changeSwiper">
<swiper-item v-for="(item, index) in data" :key="index">
<view class="swiper-item" @click="clickBannerItem(item)">
<image :src="item.image" mode="aspectFill" :draggable="false" />
</view>
</swiper-item>
</swiper>
</uni-swiper-dot>
<view class="work-container">
<!-- 轮播图 -->
<uni-swiper-dot class="uni-swiper-dot-box" :info="data" :current="current" field="content">
<swiper class="swiper-box" :current="swiperDotIndex" @change="changeSwiper">
<swiper-item v-for="(item, index) in data" :key="index">
<view class="swiper-item" @click="clickBannerItem(item)">
<image :src="item.image" mode="aspectFill" :draggable="false" />
</view>
</swiper-item>
</swiper>
</uni-swiper-dot>
<!-- 宫格组件 -->
<uni-section title="系统管理" type="line"></uni-section>
<view class="grid-body">
<uni-grid :column="4" :showBorder="false" @change="changeGrid">
<uni-grid-item>
<!-- 宫格组件 -->
<uni-section title="系统管理" type="line"></uni-section>
<view class="grid-body">
<uni-grid :column="4" :showBorder="false" @change="changeGrid">
<!-- <uni-grid-item>
<view class="grid-item-box">
<uni-icons type="person-filled" size="30"></uni-icons>
<text class="text">用户管理</text>
@ -68,117 +68,133 @@
<uni-icons type="wallet-filled" size="30"></uni-icons>
<text class="text">日志管理</text>
</view>
</uni-grid-item>
</uni-grid>
</view>
</view>
</uni-grid-item> -->
<uni-grid-item>
<view class="grid-item-box">
<uni-icons type="wallet-filled" size="30"></uni-icons>
<text class="text">老人信息</text>
</view>
</uni-grid-item>
</uni-grid>
</view>
</view>
</template>
<script setup>
import { ref } from "vue";
import modal from "@/plugins/modal"
const current=ref(0);
const swiperDotIndex=ref(0);
const data=ref([{
image: '/static/images/banner/banner01.jpg'
},
{
image: '/static/images/banner/banner02.jpg'
},
{
image: '/static/images/banner/banner03.jpg'
}
]);
import {
ref
} from "vue";
import modal from "@/plugins/modal"
const current = ref(0);
const swiperDotIndex = ref(0);
const data = ref([{
image: '/static/images/banner/banner01.jpg'
},
{
image: '/static/images/banner/banner02.jpg'
},
{
image: '/static/images/banner/banner03.jpg'
}
]);
function clickBannerItem(item) {
console.info(item)
console.info(item)
};
function changeSwiper(e) {
current.value = e.detail.current
current.value = e.detail.current
}
function changeGrid(e) {
modal.showToast({
title: '模块建设中',
mask: false,
icon:'loading',
duration: 1000
});
if (e.detail.index === 0) {
uni.navigateTo({
url:'/RTInfo/pages/index'
})
} else {
modal.showToast({
title: '模块建设中',
mask: false,
icon: 'loading',
duration: 1000
});
}
}
</script>
<style lang="scss">
/* #ifndef APP-NVUE */
page {
display: flex;
flex-direction: column;
box-sizing: border-box;
background-color: #fff;
min-height: 100%;
height: auto;
}
/* #ifndef APP-NVUE */
page {
display: flex;
flex-direction: column;
box-sizing: border-box;
background-color: #fff;
min-height: 100%;
height: auto;
}
view {
font-size: 14px;
line-height: inherit;
}
view {
font-size: 14px;
line-height: inherit;
}
/* #endif */
/* #endif */
.text {
text-align: center;
font-size: 26rpx;
margin-top: 10rpx;
}
.text {
text-align: center;
font-size: 26rpx;
margin-top: 10rpx;
}
.grid-item-box {
flex: 1;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
align-items: center;
justify-content: center;
padding: 15px 0;
}
.grid-item-box {
flex: 1;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
align-items: center;
justify-content: center;
padding: 15px 0;
}
.uni-margin-wrap {
width: 690rpx;
width: 100%;
;
}
.uni-margin-wrap {
width: 690rpx;
width: 100%;
;
}
.swiper {
height: 300rpx;
}
.swiper {
height: 300rpx;
}
.swiper-box {
height: 150px;
}
.swiper-box {
height: 150px;
}
.swiper-item {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
justify-content: center;
align-items: center;
color: #fff;
height: 300rpx;
line-height: 300rpx;
}
.swiper-item {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
justify-content: center;
align-items: center;
color: #fff;
height: 300rpx;
line-height: 300rpx;
}
@media screen and (min-width: 500px) {
.uni-swiper-dot-box {
width: 400px;
/* #ifndef APP-NVUE */
margin: 0 auto;
/* #endif */
margin-top: 8px;
}
@media screen and (min-width: 500px) {
.uni-swiper-dot-box {
width: 400px;
/* #ifndef APP-NVUE */
margin: 0 auto;
/* #endif */
margin-top: 8px;
}
.image {
width: 100%;
}
}
</style>
.image {
width: 100%;
}
}
</style>

View File

@ -1,9 +1,11 @@
import user from '@/store/modules/user'
import config from '@/store/modules/config'
import getters from './getters'
import { createStore } from "vuex";
const store = createStore({
modules: {
user,
config
},
getters
});

View File

@ -0,0 +1,74 @@
import storage from '@/utils/storage';
import config from '@/config'
const state = {
totalConfig: config, //全部配置
areaConfig: {
name: '娄底',
// baseUrl: 'http://116.162.216.63:10075',//旧的
baseUrl: 'http://122.9.137.144:10075',
// baseUrl: 'http://localhost:10200',
title: '娄底市居家和社区管理系统',
enableRememberPassword: true, //是否显示记住密码勾选框
requireCheckinPhoto: true, //签到时,是否需要拍照
addCheckinWatermark: true, //签到时,是否给照片加水印
watermark_before_after_GZSG: true, //改造施工前后,照片加水印
watermark_before_after_SMFW: true, //上门服务前后,照片加水印
}, //当前选择的区域的配置
selectedArea: uni.getStorage('selectedArea'), //当前选择的区域
}
const mutations = {
SET_CONFIG(state, totalConfig) {
state.totalConfig = totalConfig
},
SET_SELECTED_AREA(state, key) {
state.selectedArea = key
},
SET_AREA_CONFIG(state, area) {
state.areaConfig = area;
},
}
const actions = {
//设置全部配置到state-config
setConfig({
commit
}, totalConfig) {
commit('SET_CONFIG', totalConfig)
},
//设置当前区域到state-selectedArea同时设置当前区域配置到state-areaConfig
setSelectedArea({
state,
commit
}, key) {
commit('SET_SELECTED_AREA', state.totalConfig[key], key)
commit('SET_AREA_CONFIG', state.totalConfig[key])
},
initAreaConfig({
state,
commit
}, key) {
commit('SET_AREA_CONFIG', state.totalConfig[key])
},
//切换区域
selectArea({
dispatch,
state
}, key, isSaveStorage = true) {
if (state.totalConfig[key]) {
dispatch('setSelectedArea', key)
if (isSaveStorage) {
storage.set('selectedArea', key) //保存到本地
}
} else {
console.log('没有找到该区域配置');
}
}
}
export default {
state,
mutations,
actions
}

View File

@ -5,97 +5,117 @@ import { login, logout, getInfo } from '@/api/login'
import { getToken, setToken, removeToken } from '@/utils/auth'
import { UserState, UserForm } from '@/types/store'
import { Module } from 'vuex'
import store from '@/store'
const baseUrl = config.baseUrl
const user: Module<UserState, UserState> = {
state: {
token: getToken(),
name: storage.get(constant.name),
avatar: storage.get(constant.avatar),
roles: storage.get(constant.roles),
permissions: storage.get(constant.permissions)
},
mutations: {
SET_TOKEN: (state, token: string) => {
state.token = token
},
SET_NAME: (state, name: string) => {
state.name = name
storage.set(constant.name, name)
},
SET_AVATAR: (state, avatar: string) => {
state.avatar = avatar
storage.set(constant.avatar, avatar)
},
SET_ROLES: (state, roles: Array<string>) => {
state.roles = roles
storage.set(constant.roles, roles)
},
SET_PERMISSIONS: (state, permissions: Array<string>) => {
state.permissions = permissions
storage.set(constant.permissions, permissions)
}
},
const user : Module<UserState, UserState> = {
state: {
token: getToken(),
name: storage.get(constant.name),
user: storage.get(constant.user),
avatar: storage.get(constant.avatar),
roles: storage.get(constant.roles),
permissions: storage.get(constant.permissions),
addRoutes: storage.get(constant.addRoutes), //动态路由
},
mutations: {
SET_TOKEN: (state, token : string) => {
state.token = token
},
SET_NAME: (state, name : string) => {
state.name = name
storage.set(constant.name, name)
},
SET_USER: (state, user) => {
state.user = user
storage.set(constant.user, user)
},
SET_AVATAR: (state, avatar : string) => {
state.avatar = avatar
storage.set(constant.avatar, avatar)
},
SET_ROLES: (state, roles : Array<string>) => {
state.roles = roles
storage.set(constant.roles, roles)
},
SET_PERMISSIONS: (state, permissions : Array<string>) => {
state.permissions = permissions
storage.set(constant.permissions, permissions)
},
SET_ROUTES: (state, routes) => {
state.addRoutes = routes
storage.set(constant.addRoutes, routes)
},
},
actions: {
// 登录
Login({ commit }, userInfo: UserForm) {
// const username = userInfo.username
// const password = userInfo.password
// const code = userInfo.code
// const uuid = userInfo.uuid
return new Promise((resolve, reject) => {
login(userInfo).then((res: any) => {
const data = res.data;
setToken(data.access_token)
commit('SET_TOKEN', data.access_token)
resolve(data)
}).catch(error => {
reject(error)
})
})
},
actions: {
// 登录
Login({ commit }, userInfo : UserForm) {
// const username = userInfo.username
// const password = userInfo.password
// const code = userInfo.code
// const uuid = userInfo.uuid
return new Promise((resolve, reject) => {
login(userInfo).then((res : any) => {
console.log(777)
if (res.code != 200) {
reject(res.msg)
} else {
setToken(res.token)
commit('SET_TOKEN', res.token)
resolve()
}
}).catch(error => {
console.log(666)
reject(error)
})
})
},
// 获取用户信息
GetInfo({ commit }) {
return new Promise((resolve, reject) => {
getInfo().then((res: any) => {
const data=res.data;
const user = data.user
const avatar = (user == null || user.avatar == "" || user.avatar == null) ? "/static/images/profile.jpg" : baseUrl + user.avatar
const username = (user == null || user.userName == "" || user.userName == null) ? "" : user.userName
if (data.roles && data.roles.length > 0) {
commit('SET_ROLES', data.roles)
commit('SET_PERMISSIONS', data.permissions)
} else {
commit('SET_ROLES', ['ROLE_DEFAULT'])
}
commit('SET_NAME', username)
commit('SET_AVATAR', avatar)
resolve(res)
}).catch(error => {
reject(error)
})
})
},
// 获取用户信息
GetInfo({ commit }) {
return new Promise((resolve, reject) => {
getInfo().then((res : any) => {
//console.log('res', res)
const user = res.user
const avatar = (user == null || user.avatar == "" || user.avatar == null) ?
require("@/static/images/profile.jpg") : store.state.config.areaConfig
.baseUrl + user.avatar
const username = (user == null || user.userName == "" || user.userName ==
null) ? "" : user.userName
if (res.roles && res.roles.length > 0) {
commit('SET_ROLES', res.roles)
commit('SET_PERMISSIONS', res.permissions)
} else {
commit('SET_ROLES', ['ROLE_DEFAULT'])
}
commit('SET_NAME', username)
commit('SET_AVATAR', avatar)
commit('SET_USER', user)
resolve(res)
}).catch(error => {
reject(error)
})
})
},
// 退出系统
LogOut({ commit, state }) {
return new Promise((resolve, reject) => {
logout().then((res) => {
commit('SET_TOKEN', '')
commit('SET_ROLES', [])
commit('SET_PERMISSIONS', [])
removeToken()
storage.clean()
resolve(res)
}).catch(error => {
reject(error)
})
})
}
}
// 退出系统
LogOut({ commit, state }) {
return new Promise((resolve, reject) => {
logout(state.token).then((res) => {
commit('SET_TOKEN', '')
commit('SET_ROLES', [])
commit('SET_PERMISSIONS', [])
commit('SET_ROUTES', null)
removeToken()
storage.clean()
resolve(res)
}).catch(error => {
reject(error)
})
})
}
}
}
export default user
export default user

View File

@ -26,7 +26,7 @@ const request = <T>(config:RequestConfig):Promise<ResponseData<T>> => {
uni.request({
method: config.method || 'GET',
timeout: config.timeout || timeout,
url: config.baseUrl || baseUrl + config.url,
url: store.state.config.areaConfig.baseUrl+ config.url,
data: config.data,
header: config.header,
dataType: 'json'

View File

@ -0,0 +1,47 @@
//组合后端需要的QueryBody
export function transformPostBody(params) {
let template = {
"queryParam": {},
//"order": "ascending",
"sort": "updateTime"
}
if (params) {
for (const item in params) {
if (params[item]) {
template.queryParam[item] = params[item]
}
}
}
return template;
}
export function transformPostBody_Device(params) {
let template = {
"queryParam": {},
//"order": "ascending",
"sort": "updateTime"
}
for (const item in params) {
if (params[item]) {
template.queryParam[item] = params[item]
}
}
return template;
}
//组合后端需要的QueryURL
export function transformRequestURL(params) {
let template = {}
if (!params) { //默认
params = {
pageNum: 1,
pageSize: 10,
}
}
for (const item in params) {
if (params[item]) {
template[item] = params[item]
}
}
return template;
}

70
src/utils/stringFormat.js Normal file
View File

@ -0,0 +1,70 @@
//获取datetime 格式为2018-01-01 00:00:00
export function GetDatetime() {
var date = new Date();
var year = date.getFullYear();
var month = date.getMonth() + 1;
var day = date.getDate();
var hour = date.getHours();
var minute = date.getMinutes();
var second = date.getSeconds();
if (month >= 1 && month <= 9) {
month = "0" + month;
}
if (day >= 0 && day <= 9) {
day = "0" + day;
}
if (hour >= 0 && hour <= 9) {
hour = "0" + hour;
}
if (minute >= 0 && minute <= 9) {
minute = "0" + minute;
}
if (second >= 0 && second <= 9) {
second = "0" + second;
}
return year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' +
second;
}
// 通过生日获取年龄
export function GetAgeByBirthday(birthday) {
const today = new Date();
const birthDate = new Date(birthday);
let age = today.getFullYear() - birthDate.getFullYear();
const monthDifference = today.getMonth() - birthDate.getMonth();
if (monthDifference < 0 || (monthDifference === 0 && today.getDate() < birthDate.getDate())) {
age--;
}
return age;
}
// 通过身份证号获取年龄
export function GetAgeByIdCard(idCard) {
if (!idCard) {
return "无效的身份证号";
}
const birthYear = idCard.substring(6, 10);
const birthMonth = idCard.substring(10, 12);
const birthDay = idCard.substring(12, 14);
if (!birthYear || !birthMonth || !birthDay) {
return "无效的身份证号";
}
const today = new Date();
const birthDate = new Date(birthYear + "/" + birthMonth + "/" + birthDay);
if (isNaN(birthDate.getTime())) {
return "无效的身份证号";
}
let age = today.getFullYear() - birthDate.getFullYear();
const monthDifference = today.getMonth() - birthDate.getMonth();
if (monthDifference < 0 || (monthDifference === 0 && today.getDate() < birthDate.getDate())) {
age--;
}
return age;
}