1
0
Fork 0
master
panliang 2023-08-31 14:00:46 +08:00
parent e36a4223ff
commit 410e3ad799
10 changed files with 400 additions and 47 deletions

View File

@ -126,7 +126,7 @@ devDependencies:
version: 5.0.0(@vue/cli-service@5.0.1)(core-js@3.8.3)(vue@2.6.14)
'@vue/cli-service':
specifier: ~5.0.0
version: 5.0.1(sass-loader@10.4.1)(vue-template-compiler@2.6.14)(vue@2.6.14)
version: 5.0.1(sass-loader@10.0.0)(vue-template-compiler@2.6.14)(vue@2.6.14)
babel-plugin-import:
specifier: ^1.11.0
version: 1.11.0
@ -144,7 +144,7 @@ devDependencies:
version: 1.66.1
sass-loader:
specifier: '10'
version: 10.4.1(sass@1.66.1)(webpack@4.46.0)
version: 10.0.0(sass@1.66.1)(webpack@4.46.0)
vue-template-compiler:
specifier: '>= 2.6.14 < 2.7'
version: 2.6.14
@ -2908,7 +2908,7 @@ packages:
dependencies:
'@babel/core': 7.22.11
'@vue/babel-preset-app': 5.0.8(@babel/core@7.22.11)(core-js@3.8.3)(vue@2.6.14)
'@vue/cli-service': 5.0.1(sass-loader@10.4.1)(vue-template-compiler@2.6.14)(vue@2.6.14)
'@vue/cli-service': 5.0.1(sass-loader@10.0.0)(vue-template-compiler@2.6.14)(vue@2.6.14)
'@vue/cli-shared-utils': 5.0.8
babel-loader: 8.3.0(@babel/core@7.22.11)(webpack@5.88.2)
thread-loader: 3.0.4(webpack@5.88.2)
@ -2929,7 +2929,7 @@ packages:
peerDependencies:
'@vue/cli-service': ^3.0.0 || ^4.0.0 || ^5.0.0-0
dependencies:
'@vue/cli-service': 5.0.1(sass-loader@10.4.1)(vue-template-compiler@2.6.14)(vue@2.6.14)
'@vue/cli-service': 5.0.1(sass-loader@10.0.0)(vue-template-compiler@2.6.14)(vue@2.6.14)
'@vue/cli-shared-utils': 5.0.8
transitivePeerDependencies:
- encoding
@ -2940,10 +2940,10 @@ packages:
peerDependencies:
'@vue/cli-service': ^3.0.0 || ^4.0.0 || ^5.0.0-0
dependencies:
'@vue/cli-service': 5.0.1(sass-loader@10.4.1)(vue-template-compiler@2.6.14)(vue@2.6.14)
'@vue/cli-service': 5.0.1(sass-loader@10.0.0)(vue-template-compiler@2.6.14)(vue@2.6.14)
dev: true
/@vue/cli-service@5.0.1(sass-loader@10.4.1)(vue-template-compiler@2.6.14)(vue@2.6.14):
/@vue/cli-service@5.0.1(sass-loader@10.0.0)(vue-template-compiler@2.6.14)(vue@2.6.14):
resolution: {integrity: sha512-lhTW1d8waZv1VaRSvhE5pWWfkdmAgRTRSluDfyxkehZHMAWi//rd7a9zppN3k9Zr4X3oYVii+u7wR/RcTlr9cQ==}
engines: {node: ^12.0.0 || >= 14.0.0}
hasBin: true
@ -3017,7 +3017,7 @@ packages:
postcss: 8.4.29
postcss-loader: 6.2.1(postcss@8.4.29)(webpack@5.88.2)
progress-webpack-plugin: 1.0.16(webpack@5.88.2)
sass-loader: 10.4.1(sass@1.66.1)(webpack@4.46.0)
sass-loader: 10.0.0(sass@1.66.1)(webpack@4.46.0)
ssri: 8.0.1
terser-webpack-plugin: 5.3.9(webpack@5.88.2)
thread-loader: 3.0.4(webpack@5.88.2)
@ -7796,6 +7796,11 @@ packages:
engines: {node: '>=6'}
dev: true
/klona@1.1.2:
resolution: {integrity: sha512-xf88rTeHiXk+XE2Vhi6yj8Wm3gMZrygGdKjJqN8HkV+PwF/t50/LdAKHoHpPcxFAlmQszTZ1CugrK25S7qDRLA==}
engines: {node: '>= 8'}
dev: true
/klona@2.0.6:
resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==}
engines: {node: '>= 8'}
@ -10118,12 +10123,12 @@ packages:
- supports-color
dev: true
/sass-loader@10.4.1(sass@1.66.1)(webpack@4.46.0):
resolution: {integrity: sha512-aX/iJZTTpNUNx/OSYzo2KsjIUQHqvWsAhhUijFjAPdZTEhstjZI9zTNvkTTwsx+uNUJqUwOw5gacxQMx4hJxGQ==}
/sass-loader@10.0.0(sass@1.66.1)(webpack@4.46.0):
resolution: {integrity: sha512-DEIrVJIXf2P6jtY3fpJu+uWetALCds2PwRA2iwbpzmHvtFmX5j0aX5Uz+YZSeJpjKrpgqWNKngcVxmwVfqxMow==}
engines: {node: '>= 10.13.0'}
peerDependencies:
fibers: '>= 3.1.0'
node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0
node-sass: ^4.0.0
sass: ^1.3.0
webpack: ^4.36.0 || ^5.0.0
peerDependenciesMeta:
@ -10134,11 +10139,11 @@ packages:
sass:
optional: true
dependencies:
klona: 2.0.6
klona: 1.1.2
loader-utils: 2.0.4
neo-async: 2.6.2
sass: 1.66.1
schema-utils: 3.3.0
schema-utils: 2.7.1
semver: 7.5.4
webpack: 4.46.0
dev: true

View File

@ -0,0 +1,54 @@
<template>
<u-popup :show="show" mode="right" @close="close" @open="open">
<u-cell-group>
<u-cell
v-for="(item, index) in list"
:key="item.id"
:title="item.name"
:icon="item.avatar"
:name="index"
isLink
@click="click"
/>
</u-cell-group>
</u-popup>
</template>
<script>
export default {
name: "SelectAdminUser",
data () {
return {
show: false,
list: []
}
},
created() {
this.load()
},
methods: {
open() {
this.show = true
},
close() {
this.show = false
},
click(e) {
this.$emit('select', this.list[e.name])
},
load() {
this.$ajax.get('/admin-api/system/admin_users', {_action: 'getData'}).then(res => {
if (res.status == 0) {
this.list = res.data.items
}
}).catch(error => {
})
}
}
}
</script>
<style scoped>
.u-cell-group {
margin-top: 20px;
}
</style>

View File

@ -0,0 +1,16 @@
const gender = {
none: { value: 0, text: '未知' },
male: { value: 1, text: '男' },
female: { value: 2, text: '女' },
}
gender.options = []
gender.map = {}
Object.keys(gender).forEach(key => {
if (gender[key] !== undefined && gender[key].value !== undefined) {
gender.options.push({ name: gender[key].text, value: gender[key].value })
gender.map[key] = gender[key].value
}
})
export default gender

View File

@ -3,12 +3,19 @@ import App from './App'
import './uni.promisify.adaptor'
import ajax from '@/utils/ajax'
import uView from "uview-ui"
import { formatDate } from './utils/index'
Vue.config.productionTip = false
Vue.prototype.$ajax = ajax
Vue.use(uView);
Vue.filter('date', function (value, format) {
if (!format) {
format = 'yyyy-MM-dd HH:mm:ss'
}
return formatDate(value, format)
})
App.mpType = 'app'

View File

@ -24,6 +24,12 @@
"style": {
"navigationBarTitleText": "病人详细"
}
},
{
"path": "pages/patient/form",
"style": {
"navigationBarTitleText": "病人表单"
}
}
],
"globalStyle": {

View File

@ -2,7 +2,7 @@
<view class="page">
<u-grid align="center" :border="true" :col="2">
<u-grid-item v-for="item in list" :key="item.id" :name="item.id" @click="itemClick">
<u-image :src="`/static/${item.key}.png`" width="40" height="40" />
<u-image :src="`../../static/${item.key}.png`" width="40" height="40" />
<text class="grid-text">{{item.name}}</text>
</u-grid-item>
</u-grid>
@ -13,8 +13,7 @@
export default {
data() {
return {
list: [
]
list: []
}
},
onReady() {
@ -34,8 +33,10 @@
}
}
</script>
<style lang="scss" scoped>
.page {
margin-top: 200px
<style scoped>
.u-grid {
margin-top: 200px;
background: white;
padding: 10px 0;
}
</style>

View File

@ -0,0 +1,197 @@
<template>
<view class="page">
<u--form :model="form" ref="form" labelWidth="70">
<u-form-item prop="name" label="姓名" :required="true">
<u--input v-model="form.name" border="bottom" placeholder="请输入姓名" />
</u-form-item>
<u-form-item prop="sex" label="性别" @click="toggleGender">
<view class="input-text">
<text>{{ genderSelect }}</text>
<u-icon name="arrow-right" />
</view>
</u-form-item>
<u-form-item prop="phone" label="联系方式">
<u--input v-model="form.phone" border="bottom" placeholder="请输入联系方式" />
</u-form-item>
<u-form-item prop="address" label="地址">
<u--input v-model="form.address" border="bottom" placeholder="请输入地址" />
</u-form-item>
<u-form-item prop="birthday" label="出生年月" @click="toggleBirthday('birthday')">
<view class="input-text">
<text v-if="form.birthday">{{ form.birthday | date('yyy-MM-dd') }}</text>
<text v-else class="input-placeholder">请选择出生日期</text>
<u-icon name="arrow-right" />
</view>
</u-form-item>
<u-form-item prop="treat_at" label="初诊日期" @click="toggleBirthday('treat_at')">
<view class="input-text">
<text v-if="form.treat_at">{{ form.treat_at | date('yyy-MM-dd') }}</text>
<text v-else class="input-placeholder">请选择初诊日期</text>
<u-icon name="arrow-right" />
</view>
</u-form-item>
<u-form-item prop="doctor_id" label="坐诊医生" @click="opendDoctor">
<view class="input-text">
<text v-if="form.doctor_id">{{ doctor.text }}</text>
<text v-else class="input-placeholder">请选择坐诊医生</text>
<u-icon name="arrow-right" />
</view>
</u-form-item>
<u-form-item prop="illness">
<u--textarea v-model="form.illness" :showConfirmBar="false" placeholder="请输入病情描述" />
</u-form-item>
<view class="button">
<u-button text="提交" type="primary" @click="submit"></u-button>
</view>
</u--form>
<u-datetime-picker
v-model="datePicker.value"
mode="date"
:show="datePicker.show"
:closeOnClickOverlay="true"
:minDate="datePicker.minDate"
@close="toggleBirthday"
@cancel="toggleBirthday"
@confirm="selectBirthday"
/>
<select-admin-user ref="select-admin-user" @select="selectDoctor" />
<u-action-sheet
:show="genderShow"
:actions="gender.options"
:closeOnClickOverlay="true"
@close="toggleGender"
@select="selectGender"
/>
</view>
</template>
<script>
import gender from '../../enums/gender'
import SelectAdminUser from '../../components/select-admin-user'
export default {
components: {SelectAdminUser},
data() {
return {
form: {
name: '',
sex: gender.none.value,
phone: '',
birthday: '',
address: '',
treat_at: '',
doctor_id: '',
illness: ''
},
rules: {
name: {
required: true,
message: '姓名必填',
trigger: ['blur', 'change']
}
},
gender: gender,
genderShow: false,
genderSelect: gender.none.text,
datePicker: {
show: false,
name: '',
value: (new Date).getTime(),
minDate: (new Date('1900-1-1')).getTime()
},
doctor: {
text: '',
value: '',
}
}
},
onLoad(e) {
if (!e.id) {
uni.setNavigationBarTitle({
title: '添加病人'
})
}
},
onReady() {
this.$refs['form'].setRules(this.rules)
},
methods: {
toggleGender() {
this.genderShow = !this.genderShow
},
toggleBirthday(name) {
if (name) {
this.datePicker.name = name
this.datePicker.value = this.form[name] ? Math.floor(this.form[name] * 1000) : (new Date).getTime()
}
this.datePicker.show = !this.datePicker.show
},
selectGender(e) {
this.genderSelect = e.name
this.form.sex = e.value
},
selectBirthday(e) {
this.form[this.datePicker.name] = Math.floor(e.value / 1000)
this.toggleBirthday()
},
opendDoctor() {
this.$refs['select-admin-user'].open()
},
closeDoctor() {
this.$refs['select-admin-user'].close()
},
selectDoctor(e) {
this.form.doctor_id = e.id
this.doctor = {
value: e.id,
text: e.name
}
this.closeDoctor()
},
submit() {
this.$refs['form'].validate().then(res => {
uni.showLoading()
this.$ajax.post('/admin-api/patient', this.form).then(res => {
uni.hideLoading()
if (res.status == 0) {
uni.showToast({
title: '提交成功',
icon: 'success'
})
setTimeout(() => {
uni.navigateBack()
}, 1500);
}
})
}).catch(error => {})
},
}
}
</script>
<style scoped>
.page {
padding: 0 20px;
background: white;
position: absolute;
height: 100%;
width: 100%;
box-sizing: border-box;
}
.input-text {
color: #303133;
font-size: 15px;
padding: 6px 9px;
border-bottom: 1px solid #dadbde;
width: 100%;
display: flex;
justify-content: space-between;
}
.input-placeholder {
color: #c0c0c0;
}
.button {
width: 100%;
margin-top: 20px;
}
</style>

View File

@ -1,28 +1,35 @@
<template>
<view class="page">
<u-sticky>
<u-search
v-model="search"
bgColor="white"
:showAction="false"
margin="10px 0"
placeholder="姓名/联系方式"
@search="loadData(true)"
@clear="loadData(true)"
@change="changeSearch"
/>
</u-sticky>
<u-list>
<u-list-item v-for="item in list" :key="item.id">
<u-cell
:title="`${item.name}(${item.age})`"
:label="item.phone"
:url="`/pages/patient/detail?id=${item.id}`"
:clickable="true"
:isLink="true"
/>
</u-list-item>
</u-list>
<u-search
v-model="search"
bgColor="white"
:showAction="false"
margin="10px 0"
placeholder="姓名/联系方式"
@search="loadData(true)"
@clear="loadData(true)"
@change="changeSearch"
/>
<view class="add-button">
<u-button type="primary" icon="plus" shape="circle" size="large" @click="add" />
</view>
<view class="list">
<u-list>
<u-swipe-action>
<u-list-item v-for="item in list" :key="item.id">
<u-swipe-action-item :options="options" :name="item.id" @click="swipeAction">
<u-cell
:title="item.name + (item.age != '' ? `(${item.age})` : '')"
:label="item.phone ? item.phone : '暂无联系方式'"
:url="`/pages/patient/detail?id=${item.id}`"
:clickable="true"
:isLink="false"
/>
</u-swipe-action-item>
</u-list-item>
</u-swipe-action>
</u-list>
</view>
</view>
</template>
@ -32,12 +39,16 @@ export default {
return {
list: [],
page: 1,
perPage: 10,
perPage: 20,
total: 0,
search: ''
search: '',
options: [
{text: '修改', style: { backgroundColor: '#007aff' }},
{text: '删除', style: { backgroundColor: '#dd524d' }}
],
}
},
onReady() {
onShow() {
this.loadData(true)
},
onPullDownRefresh() {
@ -70,12 +81,27 @@ export default {
if (!value) {
this.loadData(true)
}
},
add() {
uni.navigateTo({
url: '/pages/patient/form'
})
},
swipeAction(e) {
console.log(e)
}
}
}
</script>
<style scoped lang="scss">
.u-list {
<style scoped>
.list {
background-color: white;
padding-bottom: 20px;
}
.add-button {
position: absolute;
bottom: 100px;
right: 50px;
z-index: 999;
}
</style>

View File

@ -27,7 +27,8 @@ instance.interceptors.response.use(
const res = response.data
if (res.status != 0 && res.doNotDisplayToast == 0) {
uni.showModal({
title: res.message
title: res.msg,
showCancel: false
})
}
if (res.code == 401) {

40
src/utils/index.js 100644
View File

@ -0,0 +1,40 @@
export function formatDate(dateTime = null, formatStr = 'yyyy-MM-dd HH:mm:ss') {
if (!dateTime) return ''
let date
// 若传入时间为假值,则取当前时间
if (!dateTime) {
date = new Date()
} else if (/^\d{10}$/.test(dateTime.toString().trim())) {
date = new Date(dateTime * 1000)
} else if (typeof dateTime === 'string' && /^\d+$/.test(dateTime.trim())) {
date = new Date(Number(dateTime))
} else {
date = new Date(
typeof dateTime === 'string' ?
dateTime.replace(/-/g, '/') :
dateTime
)
}
const timeSource = {
'y': date.getFullYear().toString(), // 年
'M': (date.getMonth() + 1).toString().padStart(2, '0'), // 月
'd': date.getDate().toString().padStart(2, '0'), // 日
'H': date.getHours().toString().padStart(2, '0'), // 时
'm': date.getMinutes().toString().padStart(2, '0'), // 分
's': date.getSeconds().toString().padStart(2, '0') // 秒
}
for (const key in timeSource) {
const [ret] = new RegExp(`${key}+`).exec(formatStr) || []
if (ret) {
const beginIndex = key === 'y' && ret.length === 2 ? 2 : 0
formatStr = formatStr.replace(ret, timeSource[key].slice(beginIndex))
}
}
return formatStr
}
export default {formatDate}