@ -0,0 +1,16 @@ |
|||||
|
###################################################################### |
||||
|
# Build Tools |
||||
|
|
||||
|
/unpackage/* |
||||
|
/node_modules/* |
||||
|
|
||||
|
###################################################################### |
||||
|
# Development Tools |
||||
|
|
||||
|
/.idea/* |
||||
|
/.vscode/* |
||||
|
/.hbuilderx/* |
||||
|
|
||||
|
package-lock.json |
||||
|
yarn.lock |
||||
|
|
After Width: | Height: | Size: 112 KiB |
After Width: | Height: | Size: 142 KiB |
After Width: | Height: | Size: 152 KiB |
After Width: | Height: | Size: 68 KiB |
After Width: | Height: | Size: 65 KiB |
After Width: | Height: | Size: 95 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 9.7 KiB |
After Width: | Height: | Size: 56 KiB |
After Width: | Height: | Size: 8.6 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 7.0 KiB |
After Width: | Height: | Size: 27 KiB |
After Width: | Height: | Size: 238 KiB |
After Width: | Height: | Size: 139 KiB |
After Width: | Height: | Size: 69 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 201 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 130 KiB |
After Width: | Height: | Size: 89 KiB |
After Width: | Height: | Size: 89 KiB |
After Width: | Height: | Size: 160 KiB |
After Width: | Height: | Size: 150 KiB |
After Width: | Height: | Size: 124 KiB |
After Width: | Height: | Size: 83 KiB |
After Width: | Height: | Size: 73 KiB |
After Width: | Height: | Size: 53 KiB |
After Width: | Height: | Size: 109 KiB |
After Width: | Height: | Size: 69 KiB |
After Width: | Height: | Size: 78 KiB |
After Width: | Height: | Size: 126 KiB |
After Width: | Height: | Size: 74 KiB |
After Width: | Height: | Size: 80 KiB |
After Width: | Height: | Size: 93 KiB |
After Width: | Height: | Size: 93 KiB |
After Width: | Height: | Size: 55 KiB |
After Width: | Height: | Size: 176 KiB |
After Width: | Height: | Size: 91 KiB |
After Width: | Height: | Size: 87 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 41 KiB |
After Width: | Height: | Size: 98 KiB |
After Width: | Height: | Size: 208 KiB |
After Width: | Height: | Size: 47 KiB |
After Width: | Height: | Size: 97 KiB |
After Width: | Height: | Size: 74 KiB |
After Width: | Height: | Size: 114 KiB |
After Width: | Height: | Size: 116 KiB |
After Width: | Height: | Size: 84 KiB |
After Width: | Height: | Size: 173 KiB |
After Width: | Height: | Size: 125 KiB |
After Width: | Height: | Size: 125 KiB |
After Width: | Height: | Size: 148 KiB |
After Width: | Height: | Size: 128 KiB |
After Width: | Height: | Size: 82 KiB |
After Width: | Height: | Size: 112 KiB |
After Width: | Height: | Size: 93 KiB |
After Width: | Height: | Size: 77 KiB |
After Width: | Height: | Size: 41 KiB |
After Width: | Height: | Size: 248 KiB |
After Width: | Height: | Size: 80 KiB |
After Width: | Height: | Size: 96 KiB |
After Width: | Height: | Size: 115 KiB |
After Width: | Height: | Size: 91 KiB |
After Width: | Height: | Size: 129 KiB |
After Width: | Height: | Size: 102 KiB |
After Width: | Height: | Size: 85 KiB |
After Width: | Height: | Size: 73 KiB |
After Width: | Height: | Size: 92 KiB |
After Width: | Height: | Size: 77 KiB |
After Width: | Height: | Size: 109 KiB |
After Width: | Height: | Size: 89 KiB |
After Width: | Height: | Size: 80 KiB |
After Width: | Height: | Size: 110 KiB |
After Width: | Height: | Size: 131 KiB |
After Width: | Height: | Size: 62 KiB |
@ -0,0 +1,35 @@ |
|||||
|
<script> |
||||
|
import config from './config' |
||||
|
import store from '@/store' |
||||
|
import { getAccessToken } from '@/utils/auth' |
||||
|
|
||||
|
export default { |
||||
|
onLaunch: function() { |
||||
|
this.initApp() |
||||
|
}, |
||||
|
methods: { |
||||
|
// 初始化应用 |
||||
|
initApp() { |
||||
|
// 初始化应用配置 |
||||
|
this.initConfig() |
||||
|
// 检查用户登录状态 |
||||
|
//#ifdef H5 |
||||
|
this.checkLogin() |
||||
|
//#endif |
||||
|
}, |
||||
|
initConfig() { |
||||
|
this.globalData.config = config |
||||
|
}, |
||||
|
checkLogin() { |
||||
|
if (!getAccessToken()) { |
||||
|
this.$tab.reLaunch('/pages/login') |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss"> |
||||
|
@import '@/static/scss/index.scss'; |
||||
|
@import "./uni_modules/vk-uview-ui/index.scss"; |
||||
|
</style> |
@ -0,0 +1,21 @@ |
|||||
|
MIT License |
||||
|
|
||||
|
Copyright (c) 2022 芋道 |
||||
|
|
||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||
|
of this software and associated documentation files (the "Software"), to deal |
||||
|
in the Software without restriction, including without limitation the rights |
||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||
|
copies of the Software, and to permit persons to whom the Software is |
||||
|
furnished to do so, subject to the following conditions: |
||||
|
|
||||
|
The above copyright notice and this permission notice shall be included in all |
||||
|
copies or substantial portions of the Software. |
||||
|
|
||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||
|
SOFTWARE. |
@ -0,0 +1,52 @@ |
|||||
|
**严肃声明:现在、未来都不会有商业版本,所有代码全部开源!!** |
||||
|
|
||||
|
**「我喜欢写代码,乐此不疲」** |
||||
|
**「我喜欢做开源,以此为乐」** |
||||
|
|
||||
|
我 🐶 在上海艰苦奋斗,早中晚在 top3 大厂认真搬砖,夜里为开源做贡献。 |
||||
|
|
||||
|
如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 |
||||
|
|
||||
|
## 🐶 新手必读 |
||||
|
|
||||
|
* 演示地址【Vue3 + element-plus】:<http://dashboard-vue3.yudao.iocoder.cn> |
||||
|
* 演示地址【Vue3 + vben(ant-design-vue)】:<http://dashboard-vben.yudao.iocoder.cn> |
||||
|
* 演示地址【Vue2 + element-ui】:<http://dashboard.yudao.iocoder.cn> |
||||
|
* 启动文档:<https://doc.iocoder.cn/quick-start/> |
||||
|
* 视频教程:<https://doc.iocoder.cn/video/> |
||||
|
|
||||
|
## 🐯 平台简介 |
||||
|
|
||||
|
**芋道**,以开发者为中心,打造中国第一流的快速开发平台,全部开源,个人与企业可 100% 免费使用。 |
||||
|
|
||||
|
![](/.image/admin-uniapp/02.png) |
||||
|
|
||||
|
* 采用 uni-app 框架,一套代码多端适配,支持 App、小程序、H5! |
||||
|
* 已经实现登录、我的、工作台、编辑资料、头像修改、密码修改、常见问题、关于我们等基础功能。 |
||||
|
|
||||
|
## 技术栈 |
||||
|
|
||||
|
| 框架 | 说明 | 版本 | |
||||
|
|-------------------------------------------------|--------------------|--------| |
||||
|
| [uni-app](hhttps://github.com/dcloudio/uni-app) | 跨平台框架 | 2.0.0 | |
||||
|
| [uni-ui](https://github.com/dcloudio/uni-ui) | 基于 uni-app 的 UI 框架 | 1.4.20 | |
||||
|
|
||||
|
## 🔥 后端架构 |
||||
|
|
||||
|
支持 Spring Boot、Spring Cloud 两种架构: |
||||
|
|
||||
|
① Spring Boot 单体架构:<https://github.com/YunaiV/ruoyi-vue-pro> |
||||
|
|
||||
|
![架构图](/.image/common/ruoyi-vue-pro-architecture.png) |
||||
|
|
||||
|
② Spring Cloud 微服务架构:<https://github.com/YunaiV/yudao-cloud> |
||||
|
|
||||
|
![架构图](/.image/common/yudao-cloud-architecture.png) |
||||
|
|
||||
|
## 🐷 演示图 |
||||
|
|
||||
|
| biu | biu | biu | |
||||
|
|----------------------------------|----------------------------------|----------------------------------| |
||||
|
| ![](/.image/admin-uniapp/01.png) | ![](/.image/admin-uniapp/02.png) | ![](/.image/admin-uniapp/03.png) | |
||||
|
| ![](/.image/admin-uniapp/04.png) | ![](/.image/admin-uniapp/05.png) | ![](/.image/admin-uniapp/06.png) | |
||||
|
| ![](/.image/admin-uniapp/07.png) | ![](/.image/admin-uniapp/08.png) | ![](/.image/admin-uniapp/09.png) | |
@ -0,0 +1,34 @@ |
|||||
|
import request from '@/utils/request' |
||||
|
|
||||
|
// 登录方法
|
||||
|
export function login(username, password, captchaVerification) { |
||||
|
const data = { |
||||
|
username, |
||||
|
password, |
||||
|
captchaVerification |
||||
|
} |
||||
|
return request({ |
||||
|
url: '/system/auth/login', |
||||
|
headers: { |
||||
|
isToken: false |
||||
|
}, |
||||
|
'method': 'POST', |
||||
|
'data': data |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
// 获取用户详细信息
|
||||
|
export function getInfo() { |
||||
|
return request({ |
||||
|
url: '/system/auth/get-permission-info', |
||||
|
'method': 'GET' |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
// 退出方法
|
||||
|
export function logout() { |
||||
|
return request({ |
||||
|
url: '/system/auth/logout', |
||||
|
'method': 'POST' |
||||
|
}) |
||||
|
} |
@ -0,0 +1,42 @@ |
|||||
|
import upload from '@/utils/upload' |
||||
|
import request from '@/utils/request' |
||||
|
|
||||
|
// 用户密码重置
|
||||
|
export function updateUserPwd(oldPassword, newPassword) { |
||||
|
const data = { |
||||
|
oldPassword, |
||||
|
newPassword |
||||
|
} |
||||
|
return request({ |
||||
|
url: '/system/user/profile/update-password', |
||||
|
method: 'PUT', |
||||
|
params: data |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
// 查询用户个人信息
|
||||
|
export function getUserProfile() { |
||||
|
return request({ |
||||
|
url: '/system/user/profile/get', |
||||
|
method: 'GET' |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
// 修改用户个人信息
|
||||
|
export function updateUserProfile(data) { |
||||
|
return request({ |
||||
|
url: '/system/user/profile/update', |
||||
|
method: 'PUT', |
||||
|
data: data |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
// 用户头像上传
|
||||
|
export function uploadAvatar(data) { |
||||
|
return upload({ |
||||
|
url: '/system/user/profile/update-avatar', |
||||
|
method: 'PUT', |
||||
|
name: data.name, |
||||
|
filePath: data.filePath |
||||
|
}) |
||||
|
} |
@ -0,0 +1,550 @@ |
|||||
|
<template> |
||||
|
<view class="form-content"> |
||||
|
<view class="form"> |
||||
|
<u-form |
||||
|
:model="data" |
||||
|
ref="form" |
||||
|
:rules="form.rules" |
||||
|
:error-type='form.errorType' |
||||
|
:border='form.border' |
||||
|
:label-position='form.labelPosition' |
||||
|
:label-width='form.labelWidth' |
||||
|
:label-style='form.labelStyle' |
||||
|
:label-align='form.labelAlign' |
||||
|
> |
||||
|
|
||||
|
<u-form-item |
||||
|
:label="item.label" |
||||
|
:prop="item.field" |
||||
|
:required='item.required' |
||||
|
:border-bottom="item.borderBottom" |
||||
|
:label-position='item.labelPosition' |
||||
|
:label-width='item.labelWidth' |
||||
|
:label-style='item.labelStyle' |
||||
|
:label-align='item.labelAlign' |
||||
|
:right-icon='item.rightIcon' |
||||
|
:left-icon='item.leftIcon' |
||||
|
:left-icon-style='item.leftIconStyle' |
||||
|
:right-icon-style='item.rightIconStyle' |
||||
|
v-for="(item,index) in form.formData" |
||||
|
:key="index" |
||||
|
> |
||||
|
<u-input |
||||
|
:type="item.type ||'text'" |
||||
|
v-model="data[item.field]" |
||||
|
:clearable='item.clearable' |
||||
|
:input-align='item.inputAlign' |
||||
|
:placeholder="item.placeholder ? item.placeholder : `请输入${item.label}`" |
||||
|
:disabled='item.disabled' |
||||
|
:maxlength='item.maxlength' |
||||
|
placeholder-style='font-size:28rpx' |
||||
|
:confirm-type='item.confirmType' |
||||
|
:confirm-style='item.confirmStyle' |
||||
|
:focus='item.focus' |
||||
|
:fixed='item.fixed' |
||||
|
:password-icon='item.passwordIcon' |
||||
|
:border='item.border' |
||||
|
:border-color='item.borderColor' |
||||
|
:auto-height='item.autoHeight' |
||||
|
:height='item.height' |
||||
|
:cursor-spacing='item.cursorSpacing' |
||||
|
:selection-start='item.selectionStart' |
||||
|
:selection-end='item.selectionEnd' |
||||
|
:trim='item.trim' |
||||
|
:show-confirmbar='item.showConfirmbar' |
||||
|
:adjust-position='item.adjustPosition' |
||||
|
v-if="item.type == 'text'||item.type == 'number'||item.type == 'idcard'||item.type == 'digit'||item.type == 'tel'||item.type == 'safePassword'||item.type == 'nickname'" |
||||
|
/> |
||||
|
<view class="range" v-if="item.type == 'range'"> |
||||
|
<u-input |
||||
|
type="number" |
||||
|
v-model="data[item.field]" |
||||
|
:clearable='item.clearable' |
||||
|
:input-align='item.inputAlign' |
||||
|
:placeholder="item.placeholder ? item.placeholder : `请输入${item.label}`" |
||||
|
:disabled='item.disabled' |
||||
|
:maxlength='item.maxlength' |
||||
|
placeholder-style='font-size:28rpx' |
||||
|
:confirm-type='item.confirmType' |
||||
|
:confirm-style='item.confirmStyle' |
||||
|
:focus='item.focus' |
||||
|
:fixed='item.fixed' |
||||
|
:password-icon='item.passwordIcon' |
||||
|
:border='item.border' |
||||
|
:border-color='item.borderColor' |
||||
|
:auto-height='item.autoHeight' |
||||
|
:height='item.height' |
||||
|
:cursor-spacing='item.cursorSpacing' |
||||
|
:selection-start='item.selectionStart' |
||||
|
:selection-end='item.selectionEnd' |
||||
|
:trim='item.trim' |
||||
|
:show-confirmbar='item.showConfirmbar' |
||||
|
:adjust-position='item.adjustPosition' |
||||
|
style="flex: 1;" |
||||
|
/> |
||||
|
<span style="padding: 0px 20rpx;">-</span> |
||||
|
<u-input |
||||
|
:type="item.type" |
||||
|
v-model="data[item.field]" |
||||
|
:clearable='item.clearable' |
||||
|
:input-align='item.inputAlign' |
||||
|
:placeholder="item.placeholder ? item.placeholder : `请输入${item.label}`" |
||||
|
:disabled='item.disabled' |
||||
|
:maxlength='item.maxlength' |
||||
|
placeholder-style='font-size:28rpx' |
||||
|
:confirm-type='item.confirmType' |
||||
|
:confirm-style='item.confirmStyle' |
||||
|
:focus='item.focus' |
||||
|
:fixed='item.fixed' |
||||
|
:password-icon='item.passwordIcon' |
||||
|
:border='item.border' |
||||
|
:border-color='item.borderColor' |
||||
|
:auto-height='item.autoHeight' |
||||
|
:height='item.height' |
||||
|
:cursor-spacing='item.cursorSpacing' |
||||
|
:selection-start='item.selectionStart' |
||||
|
:selection-end='item.selectionEnd' |
||||
|
:trim='item.trim' |
||||
|
:show-confirmbar='item.showConfirmbar' |
||||
|
:adjust-position='item.adjustPosition' |
||||
|
style="flex: 1;" |
||||
|
/> |
||||
|
</view> |
||||
|
<u-radio-group |
||||
|
v-model="data[item.field]" |
||||
|
:disabled='item.disabled' |
||||
|
:label-disabled='item.labelDisabled' |
||||
|
:shape='item.shape' |
||||
|
:icon-size='item.iconSize' |
||||
|
:active-color='item.activeColor' |
||||
|
:size='item.size' |
||||
|
:width='item.width' |
||||
|
:wrap='item.wrap' |
||||
|
@change="radioGroupChange($event,item.field)" |
||||
|
v-else-if="item.type == 'radio'" |
||||
|
> |
||||
|
<u-radio |
||||
|
:name="cur.value" |
||||
|
:icon-size='cur.iconSize' |
||||
|
:label-size='cur.labelSize' |
||||
|
:shape='cur.shape' |
||||
|
:disabled='cur.disabled' |
||||
|
:label-disabled='cur.labelDisabled' |
||||
|
:active-color='cur.activeColor' |
||||
|
v-for="(cur, key) in item.list" :key="key" |
||||
|
@change="radioChange($event,item.field)" |
||||
|
> |
||||
|
{{cur.label}} |
||||
|
</u-radio> |
||||
|
</u-radio-group> |
||||
|
|
||||
|
<u-checkbox-group |
||||
|
:max='item.max' |
||||
|
:disabled='item.disabled' |
||||
|
:label-disabled='item.labelDisabled' |
||||
|
:shape='item.shape' |
||||
|
:icon-size='item.iconSize' |
||||
|
:active-color='item.activeColor' |
||||
|
:size='item.size' |
||||
|
:width='item.width' |
||||
|
:wrap='item.wrap' |
||||
|
@change="checkboxGroupChange($event,item.field)" |
||||
|
v-else-if="item.type == 'checkbox'" |
||||
|
> |
||||
|
<u-checkbox |
||||
|
v-model="cur.checked" |
||||
|
:size='cur.size' |
||||
|
:label-size='cur.labelSize' |
||||
|
:icon-size='cur.iconSize' |
||||
|
:name="cur.value" |
||||
|
:shape='cur.shape' |
||||
|
:disabled='cur.disabled' |
||||
|
:active-color='cur.activeColor' |
||||
|
v-for="(cur, key) in item.list" :key="key" |
||||
|
@change="checkboxChange($event,item.field)" |
||||
|
> |
||||
|
{{cur.label}} |
||||
|
</u-checkbox> |
||||
|
</u-checkbox-group> |
||||
|
<u-input |
||||
|
:type="item.type" |
||||
|
v-model="data[item.field]" |
||||
|
:clearable='item.clearable' |
||||
|
:input-align='item.inputAlign' |
||||
|
:placeholder="item.placeholder ? item.placeholder : `请输入${item.label}`" |
||||
|
:disabled='item.disabled' |
||||
|
:maxlength='item.maxlength' |
||||
|
placeholder-style='font-size:28rpx' |
||||
|
:confirm-type='item.confirmType' |
||||
|
:confirm-style='item.confirmStyle' |
||||
|
:focus='item.focus' |
||||
|
:fixed='item.fixed' |
||||
|
:password-icon='item.passwordIcon' |
||||
|
:border='item.border' |
||||
|
:border-color='item.borderColor' |
||||
|
:auto-height='item.autoHeight' |
||||
|
:height='item.height' |
||||
|
:cursor-spacing='item.cursorSpacing' |
||||
|
:selection-start='item.selectionStart' |
||||
|
:selection-end='item.selectionEnd' |
||||
|
:trim='item.trim' |
||||
|
:show-confirmbar='item.showConfirmbar' |
||||
|
:adjust-position='item.adjustPosition' |
||||
|
v-else-if="item.type == 'textarea'" |
||||
|
|
||||
|
/> |
||||
|
<u-switch |
||||
|
v-model="data[item.field]" |
||||
|
:loading='item.loading' |
||||
|
:disabled='item.disabled' |
||||
|
:size='item.size' |
||||
|
:active-color='item.activeColor' |
||||
|
:inactive-color='item.inactiveColor' |
||||
|
:vibrate-short='item.vibrateShort' |
||||
|
:active-value='item.activeValue' |
||||
|
:inactive-value='item.inactiveValue' |
||||
|
@change ='switchChange($event,item.field)' |
||||
|
v-else-if="item.type == 'switch'" |
||||
|
/> |
||||
|
<u-slider |
||||
|
v-model="data[item.field]" |
||||
|
:min='item.min' |
||||
|
:max='item.max' |
||||
|
:step='item.step' |
||||
|
:block-width='item.blockWidth' |
||||
|
:height='item.height' |
||||
|
:inactive-color='item.inactiveColor' |
||||
|
:active-color='item.activeColor' |
||||
|
:block-color='item.blockColor' |
||||
|
:block-style='item.blockStyle' |
||||
|
:disabled='item.disabled' |
||||
|
:use-slot='item.useSlot' |
||||
|
v-else-if="item.type == 'slider'" |
||||
|
/> |
||||
|
<view class="select" v-else-if="item.type == 'singleColumn'" @click="openSingleColumn(item.field,data[item.field],item.list)"> |
||||
|
<view class="input" v-if='data[item.field]'> |
||||
|
{{selectFormat(data[item.field],item.list)}} |
||||
|
</view> |
||||
|
<view class="placeholder" v-else> |
||||
|
{{item.placeholder ? item.placeholder : `请选择${item.label}`}} |
||||
|
</view> |
||||
|
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
||||
|
</view> |
||||
|
<view class="select" v-else-if="item.type == 'datetime'" @click="openDatetime(item.field,data[item.field],item.params,item.formatValue)"> |
||||
|
<view class="input" v-if='data[item.field]'> |
||||
|
{{data[item.field]}} |
||||
|
</view> |
||||
|
<view class="placeholder" v-else> |
||||
|
{{item.placeholder ? item.placeholder : `请选择${item.label}`}} |
||||
|
</view> |
||||
|
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
||||
|
</view> |
||||
|
<view class="select" v-else-if="item.type == 'region'" @click="openRegion(item.field,data[item.field],item.params,item.formatValue)"> |
||||
|
<view class="input" v-if='data[item.field]'> |
||||
|
{{regionText}} |
||||
|
</view> |
||||
|
<view class="placeholder" v-else> |
||||
|
{{item.placeholder ? item.placeholder : `请选择${item.label}`}} |
||||
|
</view> |
||||
|
<u-icon name="arrow-right" color="#aaaaaa" size="28"></u-icon> |
||||
|
</view> |
||||
|
<template v-slot:right v-if="item.isRightButton || item.isRightText "> |
||||
|
<view class="right-button" v-if="item.isRightButton"> |
||||
|
{{item.isRightButton}} |
||||
|
</view> |
||||
|
<view class="right-text" v-if="item.isRightText"> |
||||
|
{{item.isRightText}} |
||||
|
</view> |
||||
|
</template> |
||||
|
</u-form-item> |
||||
|
</u-form> |
||||
|
<view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
|
||||
|
<u-select v-model="singleColumnShow" mode="single-column" :default-value='singleColumnDefaultValue' :list="singleColumnList" @confirm="chooseSingleColumn"></u-select> |
||||
|
<u-select v-model="mutilColumnShow" mode="mutil-column" :default-value='mutilColumnDefaultValue' :list="mutilColumnList" @confirm="chooseMutilColumn"></u-select> |
||||
|
<u-picker mode="time" v-model="datetimeShow" :default-time='datetimeDefaultValue' :params="params" @confirm='chooseDatetime'></u-picker> |
||||
|
<u-picker mode="region" v-model="regionShow" :area-code='regionDefaultValue' @confirm='chooseRegion'></u-picker> |
||||
|
<view style="height: constant(safe-area-inset-bottom); height: env(safe-area-inset-bottom);"></view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import sparePartsCard from '@/components/sparePartsCard/index.vue' |
||||
|
export default { |
||||
|
components:{ |
||||
|
sparePartsCard |
||||
|
}, |
||||
|
props: {
form: {
type: Object,
default: {},
require: true
},
data: {
type: Object,
default: {},
require: true
},
}, |
||||
|
data() { |
||||
|
return { |
||||
|
// 单列模式参数 |
||||
|
singleColumnList:[], |
||||
|
singleColumnShow:false, |
||||
|
singleColumnDefaultValue:[], |
||||
|
// 多列模式参数 |
||||
|
mutilColumnList:[], |
||||
|
mutilColumnShow:false, |
||||
|
mutilColumnDefaultValue:[], |
||||
|
field:'', |
||||
|
// 时间参数 |
||||
|
datetimeShow:false, |
||||
|
params:{ |
||||
|
year: true, |
||||
|
month: true, |
||||
|
day: true, |
||||
|
hour: true, |
||||
|
minute: true, |
||||
|
second: true |
||||
|
}, |
||||
|
datetimeDefaultValue:'', |
||||
|
// 地区 |
||||
|
regionShow:false, |
||||
|
regionDefaultValue:[], |
||||
|
regionText:'' |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
// 单列模式 |
||||
|
openSingleColumn(field,val,list){ |
||||
|
this.singleColumnList = list |
||||
|
this.field = field |
||||
|
// this.data[this.field] = val ? val :'' |
||||
|
// if(val){ |
||||
|
// this.singleColumnDefaultValue = [list.findIndex(item=>item.value==val)] |
||||
|
// }else{ |
||||
|
// this.singleColumnDefaultValue = [] |
||||
|
// } |
||||
|
this.singleColumnShow = true |
||||
|
}, |
||||
|
// 单列模式点击确定之后 |
||||
|
chooseSingleColumn(e){ |
||||
|
console.log(e) |
||||
|
this.$forceUpdate() |
||||
|
this.data[this.field] = e[0].value |
||||
|
console.log(this.data) |
||||
|
this.singleColumnShow = false |
||||
|
this.$emit('singleColumn',this.field,this.data[this.field]) |
||||
|
}, |
||||
|
// 多列模式 |
||||
|
openMutilColumn(field,val,list){ |
||||
|
this.mutilColumnList = list |
||||
|
this.field = field |
||||
|
this.data[this.field] = val ? val :'' |
||||
|
this.mutilColumnDefaultValue = [list.findIndex(item=>item.value==val)] |
||||
|
this.mutilColumnShow = true |
||||
|
}, |
||||
|
// 多列模式点击确定之后 |
||||
|
chooseMutilColumn(e){ |
||||
|
this.data[this.field] = e[0].value |
||||
|
this.mutilColumnShow = false |
||||
|
this.$forceUpdate() |
||||
|
}, |
||||
|
// 日期模式 |
||||
|
openDatetime(field,val,params,formatValue){ |
||||
|
this.params = params |
||||
|
this.formatValue =formatValue |
||||
|
this.field = field |
||||
|
this.data[this.field] = val ? val :'' |
||||
|
this.datetimeDefaultValue = val ? val :'' |
||||
|
this.datetimeShow = true |
||||
|
}, |
||||
|
// 日期模式点击确定之后 |
||||
|
chooseDatetime(e){ |
||||
|
let array1 = [] |
||||
|
let array2 = [] |
||||
|
if(this.formatValue.indexOf('YYYY')>-1){ |
||||
|
array1.push(e.year) |
||||
|
} |
||||
|
if(this.formatValue.indexOf('MM')>-1){ |
||||
|
array1.push(e.month) |
||||
|
} |
||||
|
if(this.formatValue.indexOf('DD')>-1){ |
||||
|
array1.push(e.day) |
||||
|
} |
||||
|
if(this.formatValue.indexOf('hh')>-1){ |
||||
|
array2.push(e.hour) |
||||
|
} |
||||
|
if(this.formatValue.indexOf('mm')>-1){ |
||||
|
array2.push(e.month) |
||||
|
} |
||||
|
if(this.formatValue.indexOf('ss')>-1){ |
||||
|
array2.push(e.second) |
||||
|
} |
||||
|
let str = array1.join('-') + ' ' + array2.join(':') |
||||
|
this.data[this.field] = str |
||||
|
this.$emit('datetime',this.field,this.data[this.field]) |
||||
|
}, |
||||
|
// 地区 |
||||
|
openRegion(field,val){ |
||||
|
console.log(val) |
||||
|
this.field = field |
||||
|
this.data[this.field] = val ? val :[] |
||||
|
if(val){ |
||||
|
this.regionDefaultValue = this.data[this.field] |
||||
|
}else{ |
||||
|
this.regionDefaultValue = [] |
||||
|
} |
||||
|
this.regionShow = true |
||||
|
}, |
||||
|
chooseRegion(e){ |
||||
|
console.log(e) |
||||
|
this.data[this.field] = [e.province.code,e.city.code,e.area.code] |
||||
|
this.regionText = `${e.province.name}-${e.city.name}-${e.area.name}` |
||||
|
this.$emit('region',this.field,this.data[this.field]) |
||||
|
}, |
||||
|
selectFormat(val,array){ |
||||
|
let str = array.filter(item=>item.value == val)[0].label |
||||
|
return str |
||||
|
}, |
||||
|
//单选 |
||||
|
radioGroupChange(e,field){ |
||||
|
this.$emit('radioGroupChange',e,field) |
||||
|
}, |
||||
|
//单选 |
||||
|
radioChange(e,field){ |
||||
|
this.$emit('radioChange',e,field) |
||||
|
}, |
||||
|
// 选中某个复选框时,由checkbox时触发 |
||||
|
checkboxChange(e,field) { |
||||
|
this.$emit('checkboxChange',e,field) |
||||
|
}, |
||||
|
// 选中任一checkbox时,由checkbox-group触发 |
||||
|
checkboxGroupChange(e,field) { |
||||
|
this.$emit('checkboxGroupChange',e,field) |
||||
|
}, |
||||
|
switchChange(e,field) { |
||||
|
this.$emit('switchChange',e,field) |
||||
|
}, |
||||
|
}, |
||||
|
mounted() { |
||||
|
this.$refs.form.setRules(this.form.rules) |
||||
|
this.form.formData.forEach((item,index)=>{ |
||||
|
if(!this.data[item.field]){ |
||||
|
this.data[item.field] = item.value ? item.value : '' |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
|
||||
|
.form { |
||||
|
} |
||||
|
|
||||
|
::v-deep .uni-searchbar__box { |
||||
|
border: 1px solid #E4E4E4; |
||||
|
justify-content: start; |
||||
|
} |
||||
|
|
||||
|
::v-deep .uni-forms-item { |
||||
|
padding: 10px 0px; |
||||
|
// border-bottom: 1px solid #E4E4E4; |
||||
|
margin: 0px; |
||||
|
} |
||||
|
::v-deep .uni-data-checklist{ |
||||
|
margin-top: 10rpx!important; |
||||
|
} |
||||
|
::v-deep .uni-forms-item__content{ |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
} |
||||
|
|
||||
|
.input { |
||||
|
height: 72rpx; |
||||
|
line-height: 72rpx; |
||||
|
} |
||||
|
|
||||
|
.footer { |
||||
|
position: fixed; |
||||
|
bottom: 0px; |
||||
|
left: 0px; |
||||
|
width: 100%; |
||||
|
} |
||||
|
|
||||
|
.btns { |
||||
|
display: flex; |
||||
|
|
||||
|
|
||||
|
button { |
||||
|
flex: 1; |
||||
|
} |
||||
|
|
||||
|
.sure { |
||||
|
background: #409eff; |
||||
|
color: white; |
||||
|
border-radius: 0px; |
||||
|
|
||||
|
&::after { |
||||
|
border: 1px solid #409eff; |
||||
|
border-radius: 0px; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.reset { |
||||
|
background: #F5F5F5; |
||||
|
border-radius: 0px; |
||||
|
|
||||
|
&::after { |
||||
|
border-radius: 0px; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
.select{ |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
height: 72rpx; |
||||
|
width: 100%; |
||||
|
.input{ |
||||
|
flex: 1; |
||||
|
font-size: 28rpx; |
||||
|
color: #000000; |
||||
|
} |
||||
|
.placeholder{ |
||||
|
flex: 1; |
||||
|
font-size: 28rpx; |
||||
|
color: #828282; |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
.select-popup{ |
||||
|
background: white; |
||||
|
border-radius: 30rpx 30rpx 0px 0px; |
||||
|
max-height: 80vh; |
||||
|
overflow-y: auto; |
||||
|
.popup-item{ |
||||
|
padding: 32rpx 30rpx; |
||||
|
border-bottom: 1px solid #eeeeee; |
||||
|
text-align: center; |
||||
|
font-size: 30rpx; |
||||
|
} |
||||
|
.line{ |
||||
|
background: #F5F5F5; |
||||
|
height: 20rpx; |
||||
|
} |
||||
|
.cancle{ |
||||
|
padding: 32rpx 30rpx; |
||||
|
text-align: center; |
||||
|
font-size: 30rpx; |
||||
|
color: red; |
||||
|
} |
||||
|
} |
||||
|
.active{ |
||||
|
color: #409eff; |
||||
|
} |
||||
|
.right-button{ |
||||
|
background: #409eff; |
||||
|
color: white; |
||||
|
padding:0rpx 30rpx; |
||||
|
border-radius: 16rpx; |
||||
|
text-align: center; |
||||
|
font-size: 28rpx; |
||||
|
} |
||||
|
.range{ |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,77 @@ |
|||||
|
<template> |
||||
|
<view class="content"> |
||||
|
<view class="screen-input"> |
||||
|
<u-search |
||||
|
:show-action='false' |
||||
|
:bg-color="search.bgBolor ||'white'" |
||||
|
:border-color="search.borderColor ||'#E4E4E4'" |
||||
|
:shape="search.shape ||'square'" |
||||
|
:height="search.height || 80" |
||||
|
:placeholder="search.placeholder ||'请输入设备编码或设备名称'" |
||||
|
:clearabled="true"> |
||||
|
</u-search> |
||||
|
</view> |
||||
|
<view class="screen-btn" @click="screen" v-if="isShowScreen"> |
||||
|
<image src="../../static/icon/screen.png" mode="widthFix"></image> |
||||
|
<view>筛选</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
props: { |
||||
|
searchData:{ |
||||
|
type: Object, |
||||
|
default:()=>{return {}}, |
||||
|
require:false |
||||
|
}, |
||||
|
isShowScreen: { |
||||
|
type: Boolean, |
||||
|
default:()=>{return true}, |
||||
|
require:false |
||||
|
}, |
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
keyWord: '', |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
// 搜索 |
||||
|
search() { |
||||
|
this.$emit('search', this.keyWord) |
||||
|
}, |
||||
|
// 筛选 |
||||
|
screen() { |
||||
|
this.$emit('screen') |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
.content { |
||||
|
padding: 20rpx; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
background: white; |
||||
|
|
||||
|
.screen-input { |
||||
|
flex: 1; |
||||
|
width: 0px; |
||||
|
} |
||||
|
|
||||
|
.screen-btn { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
margin-left:20rpx; |
||||
|
|
||||
|
image { |
||||
|
width: 30rpx; |
||||
|
margin-right: 6rpx; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
</style> |
@ -0,0 +1,97 @@ |
|||||
|
<template> |
||||
|
<view class="content"> |
||||
|
<view class="list"> |
||||
|
<view class="item" v-for="(item,index) in data.list" :key="index"> |
||||
|
<view class="title"> |
||||
|
<view class="title-txt"> |
||||
|
{{item.title}} |
||||
|
</view> |
||||
|
<view class="time" v-if="data.isShowTime"> |
||||
|
2023-12-12 08:00:00 |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="dec" v-for="(cur,key) in labelList" :key="key"> |
||||
|
{{cur.label}}:<span>{{item[cur.field]}}</span> |
||||
|
</view> |
||||
|
<view class="bottom" v-if="data.isShowStatus"> |
||||
|
<view class="status"> |
||||
|
<u-tag text="待领取" v-if="item.status==1" bg-color='rgba(255,255,255,0)' color='#fe8463' border-color='#fe8463' type="primary" shape='circle'/> |
||||
|
<u-tag text="撤单" v-else-if="item.status==2" bg-color='rgba(255,255,255,0)' color='#d7d7d7' border-color='#d7d7d7 ' type="warning" shape='circle'/> |
||||
|
<u-tag text="待执行" v-else-if="item.status==3" bg-color='rgba(255,255,255,0)' color='#e01f54' border-color='#e01f54' type="success" shape='circle'/> |
||||
|
<u-tag text="维修中" v-else-if="item.status==4" bg-color='rgba(255,255,255,0)' color='#005eaa' border-color='#005eaa ' type="error" shape='circle'/> |
||||
|
<u-tag text="待验证" v-else-if="item.status==5" bg-color='rgba(255,255,255,0)' color='#2EC7C9' border-color='#2EC7C9' type="info" shape='circle'/> |
||||
|
<u-tag text="已完成" v-else-if="item.status==6" bg-color='rgba(255,255,255,0)' color='#2ba471' border-color='#2ba471' type="info" shape='circle'/> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
props: { |
||||
|
labelList:{ |
||||
|
type: Array, |
||||
|
default:()=>{return []}, |
||||
|
}, |
||||
|
data:{ |
||||
|
type: Object, |
||||
|
default:()=>{return {}}, |
||||
|
}, |
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
|
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
|
||||
|
.list{ |
||||
|
background: #f5f5f5; |
||||
|
margin-top: 20rpx; |
||||
|
.item{ |
||||
|
padding: 30rpx 30rpx 0px 30rpx; |
||||
|
margin-top: 20rpx; |
||||
|
background: white; |
||||
|
position: relative; |
||||
|
.title{ |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
padding-bottom: 20rpx; |
||||
|
.title-txt{ |
||||
|
color: #409eff; |
||||
|
font-weight: bold; |
||||
|
font-size: 36rpx; |
||||
|
width: 0px; |
||||
|
flex: 1; |
||||
|
} |
||||
|
.time{ |
||||
|
color: #919191; |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
.dec{ |
||||
|
padding-bottom: 20rpx; |
||||
|
span{ |
||||
|
color: #999999; |
||||
|
} |
||||
|
} |
||||
|
.last{ |
||||
|
padding-bottom: 30rpx; |
||||
|
} |
||||
|
.bottom{ |
||||
|
position: absolute; |
||||
|
right: 30rpx; |
||||
|
bottom:40rpx; |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,114 @@ |
|||||
|
<template> |
||||
|
<view class=""> |
||||
|
<view class="title" v-if="subForm.formLabel"> |
||||
|
<span v-if="subForm.required">*</span>{{subForm.formLabel}} |
||||
|
</view> |
||||
|
<view class="list"> |
||||
|
<view class="item" v-for="(item,index) in data[subForm.formField]" :key="index"> |
||||
|
<view class="item-box"> |
||||
|
<view class="spare-title"> |
||||
|
<view class="title-txt"> |
||||
|
{{item.name}} |
||||
|
</view> |
||||
|
</view> |
||||
|
<u-row gutter="16"> |
||||
|
<u-col :span="cur.span || 12" v-for="(cur,key) in subForm.formData" :key="key"> |
||||
|
<view class="dec"> |
||||
|
<view class="" v-if="cur.isList"> |
||||
|
{{cur.label}}:{{item[cur.field]}} |
||||
|
</view> |
||||
|
</view> |
||||
|
</u-col> |
||||
|
</u-row> |
||||
|
</view> |
||||
|
<u-icon name="minus-circle" color="#aaaaaa" size="60" v-if="subForm.isShowButton"></u-icon> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="add-btn"> |
||||
|
<u-button type="primary" @click="addSubForm"><u-icon name="plus-circle" color="#ffffff" size="36" |
||||
|
v-if="subForm.isShowButton"></u-icon>添加</u-button> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
props: { |
||||
|
subForm: { |
||||
|
type: Object, |
||||
|
default: () => { |
||||
|
return {} |
||||
|
}, |
||||
|
}, |
||||
|
data: { |
||||
|
type: Object, |
||||
|
default: () => { |
||||
|
return {} |
||||
|
}, |
||||
|
}, |
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
|
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
addSubForm() { |
||||
|
console.log(444) |
||||
|
this.$emit('addSubForm', this.subForm.formLabel) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
.title { |
||||
|
padding: 32rpx 0px; |
||||
|
position: relative; |
||||
|
|
||||
|
span { |
||||
|
position: absolute; |
||||
|
left: -16rpx; |
||||
|
color: #fa3534; |
||||
|
padding-top: 6rpx; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.list { |
||||
|
.item { |
||||
|
display: flex; |
||||
|
margin-bottom: 20rpx; |
||||
|
|
||||
|
.item-box { |
||||
|
background: #F5F5F5; |
||||
|
border-radius: 12rpx; |
||||
|
flex: 1; |
||||
|
width: 0rpx; |
||||
|
} |
||||
|
|
||||
|
.spare-title { |
||||
|
padding: 20rpx 30rpx; |
||||
|
border-bottom: 1px solid #e4e4e4; |
||||
|
|
||||
|
.title-txt { |
||||
|
color: #409eff; |
||||
|
font-size: 30rpx; |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.dec { |
||||
|
color: #9c9c9c; |
||||
|
padding: 0rpx 30rpx 20rpx; |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.add-btn { |
||||
|
display: flex; |
||||
|
justify-content: flex-start; |
||||
|
align-items: center; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,167 @@ |
|||||
|
<template> |
||||
|
<view class="uni-section"> |
||||
|
<view class="uni-section-header" @click="onClick"> |
||||
|
<view class="uni-section-header__decoration" v-if="type" :class="type" /> |
||||
|
<slot v-else name="decoration"></slot> |
||||
|
|
||||
|
<view class="uni-section-header__content"> |
||||
|
<text :style="{'font-size':titleFontSize,'color':titleColor}" class="uni-section__content-title" :class="{'distraction':!subTitle}">{{ title }}</text> |
||||
|
<text v-if="subTitle" :style="{'font-size':subTitleFontSize,'color':subTitleColor}" class="uni-section-header__content-sub">{{ subTitle }}</text> |
||||
|
</view> |
||||
|
|
||||
|
<view class="uni-section-header__slot-right"> |
||||
|
<slot name="right"></slot> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<view class="uni-section-content" :style="{padding: _padding}"> |
||||
|
<slot /> |
||||
|
</view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
|
||||
|
/** |
||||
|
* Section 标题栏 |
||||
|
* @description 标题栏 |
||||
|
* @property {String} type = [line|circle|square] 标题装饰类型 |
||||
|
* @value line 竖线 |
||||
|
* @value circle 圆形 |
||||
|
* @value square 正方形 |
||||
|
* @property {String} title 主标题 |
||||
|
* @property {String} titleFontSize 主标题字体大小 |
||||
|
* @property {String} titleColor 主标题字体颜色 |
||||
|
* @property {String} subTitle 副标题 |
||||
|
* @property {String} subTitleFontSize 副标题字体大小 |
||||
|
* @property {String} subTitleColor 副标题字体颜色 |
||||
|
* @property {String} padding 默认插槽 padding |
||||
|
*/ |
||||
|
|
||||
|
export default { |
||||
|
name: 'UniSection', |
||||
|
emits:['click'], |
||||
|
props: { |
||||
|
type: { |
||||
|
type: String, |
||||
|
default: '' |
||||
|
}, |
||||
|
title: { |
||||
|
type: String, |
||||
|
required: true, |
||||
|
default: '' |
||||
|
}, |
||||
|
titleFontSize: { |
||||
|
type: String, |
||||
|
default: '14px' |
||||
|
}, |
||||
|
titleColor:{ |
||||
|
type: String, |
||||
|
default: '#333' |
||||
|
}, |
||||
|
subTitle: { |
||||
|
type: String, |
||||
|
default: '' |
||||
|
}, |
||||
|
subTitleFontSize: { |
||||
|
type: String, |
||||
|
default: '12px' |
||||
|
}, |
||||
|
subTitleColor: { |
||||
|
type: String, |
||||
|
default: '#999' |
||||
|
}, |
||||
|
padding: { |
||||
|
type: [Boolean, String], |
||||
|
default: false |
||||
|
} |
||||
|
}, |
||||
|
computed:{ |
||||
|
_padding(){ |
||||
|
if(typeof this.padding === 'string'){ |
||||
|
return this.padding |
||||
|
} |
||||
|
|
||||
|
return this.padding?'10px':'' |
||||
|
} |
||||
|
}, |
||||
|
watch: { |
||||
|
title(newVal) { |
||||
|
if (uni.report && newVal !== '') { |
||||
|
uni.report('title', newVal) |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
onClick() { |
||||
|
this.$emit('click') |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
<style lang="scss" > |
||||
|
$uni-primary: #2979ff !default; |
||||
|
|
||||
|
.uni-section { |
||||
|
background-color: #fff; |
||||
|
.uni-section-header { |
||||
|
position: relative; |
||||
|
/* #ifndef APP-NVUE */ |
||||
|
display: flex; |
||||
|
/* #endif */ |
||||
|
flex-direction: row; |
||||
|
align-items: center; |
||||
|
padding: 12px 10px; |
||||
|
font-weight: normal; |
||||
|
|
||||
|
&__decoration{ |
||||
|
margin-right: 6px; |
||||
|
background-color: $uni-primary; |
||||
|
&.line { |
||||
|
width: 4px; |
||||
|
height: 12px; |
||||
|
border-radius: 10px; |
||||
|
} |
||||
|
|
||||
|
&.circle { |
||||
|
width: 8px; |
||||
|
height: 8px; |
||||
|
border-top-right-radius: 50px; |
||||
|
border-top-left-radius: 50px; |
||||
|
border-bottom-left-radius: 50px; |
||||
|
border-bottom-right-radius: 50px; |
||||
|
} |
||||
|
|
||||
|
&.square { |
||||
|
width: 8px; |
||||
|
height: 8px; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
&__content { |
||||
|
/* #ifndef APP-NVUE */ |
||||
|
display: flex; |
||||
|
/* #endif */ |
||||
|
flex-direction: column; |
||||
|
flex: 1; |
||||
|
color: #333; |
||||
|
|
||||
|
.distraction { |
||||
|
flex-direction: row; |
||||
|
align-items: center; |
||||
|
} |
||||
|
&-sub { |
||||
|
margin-top: 2px; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
&__slot-right{ |
||||
|
font-size: 14px; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.uni-section-content{ |
||||
|
font-size: 14px; |
||||
|
} |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,14 @@ |
|||||
|
import CryptoJS from 'crypto-js' |
||||
|
/** |
||||
|
* @word 要加密的内容 |
||||
|
* @keyWord String 服务器随机返回的关键字 |
||||
|
* */ |
||||
|
export function aesEncrypt(word, keyWord = "XwKsGlMcdPMEhR1B") { |
||||
|
var key = CryptoJS.enc.Utf8.parse(keyWord); |
||||
|
var srcs = CryptoJS.enc.Utf8.parse(word); |
||||
|
var encrypted = CryptoJS.AES.encrypt(srcs, key, { |
||||
|
mode: CryptoJS.mode.ECB, |
||||
|
padding: CryptoJS.pad.Pkcs7 |
||||
|
}); |
||||
|
return encrypted.toString(); |
||||
|
} |
@ -0,0 +1,17 @@ |
|||||
|
import config from '@/config' |
||||
|
const baseUrl = config.baseUrl |
||||
|
export const myRequest = (option = {}) => { |
||||
|
return new Promise((reslove, reject) => { |
||||
|
uni.request({ |
||||
|
url: baseUrl + option.url, |
||||
|
data: option.data, |
||||
|
method: option.method || "GET", |
||||
|
success: (result) => { |
||||
|
reslove(result) |
||||
|
}, |
||||
|
fail: (error) => { |
||||
|
reject(error) |
||||
|
} |
||||
|
}) |
||||
|
}) |
||||
|
} |
@ -0,0 +1,103 @@ |
|||||
|
<template> |
||||
|
<view class="content"> |
||||
|
<view class="list"> |
||||
|
<view class="item" v-for="(item,index) in data.list" :key="index" @click="itemClick(item,index)"> |
||||
|
<view class="title"> |
||||
|
<view class="title-txt"> |
||||
|
{{item.title}} |
||||
|
</view> |
||||
|
<view class="time" v-if="data.isShowTime"> |
||||
|
2023-12-12 08:00:00 |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="dec" v-for="(cur,key) in labelList" :key="key"> |
||||
|
{{cur.label}}:<span>{{item[cur.field]}}</span> |
||||
|
</view> |
||||
|
<view class="bottom" v-if="data.isShowStatus"> |
||||
|
<view class="time"> |
||||
|
{{item.time}} |
||||
|
</view> |
||||
|
<view class="status"> |
||||
|
<u-tag text="待领取" v-if="item.status==1" bg-color='rgba(255,255,255,0)' color='#fe8463' border-color='#fe8463' type="primary" shape='circle'/> |
||||
|
<u-tag text="撤单" v-else-if="item.status==2" bg-color='rgba(255,255,255,0)' color='#d7d7d7' border-color='#d7d7d7 ' type="warning" shape='circle'/> |
||||
|
<u-tag text="待执行" v-else-if="item.status==3" bg-color='rgba(255,255,255,0)' color='#e01f54' border-color='#e01f54' type="success" shape='circle'/> |
||||
|
<u-tag text="维修中" v-else-if="item.status==4" bg-color='rgba(255,255,255,0)' color='#005eaa' border-color='#005eaa ' type="error" shape='circle'/> |
||||
|
<u-tag text="待验证" v-else-if="item.status==5" bg-color='rgba(255,255,255,0)' color='#2EC7C9' border-color='#2EC7C9' type="info" shape='circle'/> |
||||
|
<u-tag text="已完成" v-else-if="item.status==6" bg-color='rgba(255,255,255,0)' color='#2ba471' border-color='#2ba471' type="info" shape='circle'/> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
props: { |
||||
|
labelList:{ |
||||
|
type: Array, |
||||
|
default:()=>{return []}, |
||||
|
}, |
||||
|
data:{ |
||||
|
type: Object, |
||||
|
default:()=>{return {}}, |
||||
|
}, |
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
|
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
itemClick(item,index){ |
||||
|
this.$emit('itemClick',item,index) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
|
||||
|
.list{ |
||||
|
background: #f5f5f5; |
||||
|
margin-top: 20rpx; |
||||
|
.item{ |
||||
|
padding: 30rpx 30rpx 0px 30rpx; |
||||
|
margin-top: 20rpx; |
||||
|
background: white; |
||||
|
.title{ |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
padding-bottom: 20rpx; |
||||
|
.title-txt{ |
||||
|
color: #409eff; |
||||
|
font-weight: bold; |
||||
|
font-size: 36rpx; |
||||
|
width: 0px; |
||||
|
flex: 1; |
||||
|
} |
||||
|
.time{ |
||||
|
color: #919191; |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
.dec{ |
||||
|
padding-bottom: 20rpx; |
||||
|
span{ |
||||
|
color: #999999; |
||||
|
} |
||||
|
} |
||||
|
.last{ |
||||
|
padding-bottom: 30rpx; |
||||
|
} |
||||
|
.bottom{ |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
border-top: 1px solid #E4E4E4; |
||||
|
padding: 20rpx 0px; |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,26 @@ |
|||||
|
// 应用全局配置
|
||||
|
module.exports = { |
||||
|
baseUrl: process.env.NODE_ENV === 'development' ? 'http://localhost:12080' : 'http://api-dashboard.yudao.iocoder.cn', |
||||
|
baseApi:process.env.NODE_ENV === 'development' ? '/admin-api' : '/api/admin-api', |
||||
|
// 应用信息
|
||||
|
appInfo: { |
||||
|
// 应用名称
|
||||
|
name: "yudao-app", |
||||
|
// 应用版本
|
||||
|
version: "1.0.0", |
||||
|
// 应用logo
|
||||
|
logo: "/static/logo.png", |
||||
|
// 官方网站
|
||||
|
site_url: "https://iocoder.cn", |
||||
|
// 政策协议
|
||||
|
agreements: [{ |
||||
|
title: "隐私政策", |
||||
|
url: "https://iocoder.cn" |
||||
|
}, |
||||
|
{ |
||||
|
title: "用户服务协议", |
||||
|
url: "https://iocoder.cn" |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
} |