集成师傅服务经销端

main
小鱼干 1 month ago
parent 53c5d1a4e3
commit deffebdb27

@ -1,7 +1,7 @@
# \u6570\u636E\u5E93\u914D\u7F6E
spring.datasource.url=jdbc:mysql://192.168.10.14:23306/fuint-db?useUnicode=true&characterEncoding=UTF8&useSSL=false
spring.datasource.url=jdbc:mysql://221.176.140.236:6666/fuint-db?useUnicode=true&characterEncoding=UTF8&useSSL=false
spring.datasource.username=root
spring.datasource.password=hmkj@2023
spring.datasource.password=ee62c1ec01cc5a26
# Redis\u914D\u7F6E
spring.session.store-type=redis

@ -0,0 +1,16 @@
######################################################################
# Build Tools
/unpackage/*
/node_modules/*
######################################################################
# Development Tools
/.idea/*
/.vscode/*
/.hbuilderx/*
package-lock.json
yarn.lock

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

@ -0,0 +1,65 @@
<!-- <template>
<view class="content">
<router-view></router-view>
<view class="text-area">
<text class="title">Hello 芋道</text>
</view>
</view>
</template> -->
<script>
import config from './config'
import store from '@/store'
import {
getAccessToken,
getAccessTokensacacas
} 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 "uview-ui/index.scss";
@import '@/static/scss/index.scss';
</style>
<style>
.gradient-background {
/* 设置渐变背景,从上到下,从浅蓝色到白色 */
background: linear-gradient(to bottom, #0d74d2 0%, #FFFFFF 25%);
width: 100%;
height: 100vh;
/* 如果需要模糊效果,可以添加 backdrop-filter */
backdrop-filter: none;
}
.gradient-backgroundTwo {
/* 设置渐变背景,从上到下,从浅蓝色到白色 */
background: linear-gradient(to bottom, #0d74d2 0%, #ececec 25%);
width: 100%;
height: 100%;
/* 如果需要模糊效果,可以添加 backdrop-filter */
backdrop-filter: none;
}
</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,134 @@
import request from '@/utils/request'
const homeApi = {
DeviceCustomer: () => { //累计收益
return request({
url: '/AppServerController/statisticMoneyDeviceCustomer',
'method': 'GET',
})
},
myTicket: (parms) => {
return request({ //我的工单
url: `/AppServerController/myTicket?pageNo=${parms.pageNo}&pageSize=10&worderType=&worderStatus=${parms.worderStatus}&worderContent=${parms.worderContent || ''}`,
'method': 'GET',
})
},
myTicketsh: (parms) => {
return request({ //师傅端我的工单
url: `/AppServerController/myTicketsh?pageNo=${parms.pageNo}&pageSize=10&worderType=&worderStatus=${parms.worderStatus}&worderContent=${parms.worderContent || ''}`,
'method': 'GET',
})
},
myTicketStatistics: () => {
return request({ //我的统计工单
url: '/AppServerController/myTicketStatistics',
'method': 'GET',
})
},
getUserPage: (params) => { //用户分页查询
return request({
url: '/AppServerController/getUserPage',
'method': 'GET',
params:params
})
},
monthOrders: (params) => { //工单列表
return request({
url: '/AppServerController/monthOrders',
'method': 'GET',
params
})
},
myTicketDay: (parms) => { //按日期查询我的工单统计
return request({
url: `/AppServerController/myTicketDayStatistics?day=${parms}`,
'method': 'GET',
})
},
appListMaster: (parms) => { //派单时查询师傅分页
return request({
url: `/AppServerController/appListMaster?pageNo=${parms.page}&pageSize=10&customerName=${parms.customerName}&customerPhone=${parms.customerPhone}&customerAreaId=${parms.customerAreaId}&worderId=${parms.worderId}`,
'method': 'GET',
})
},
appDistributeMaster: (data) => { //派单
return request({
url: `/AppServerController/appDistributeMaster`,
'method': 'POST',
data,
})
},
reschedulingTime: (data) => { //改约时间
return request({
url: `/AppServerController/reschedulingTime`,
'method': 'PUT',
data,
})
},
getDeviceMgmtTab: (parms) => { //获得设备管理分页
return request({
url: `/AppServerController/getDeviceMgmtTab?pageNo=${parms.page}&pageSize=10&id=${parms.id}`,
'method': 'GET',
})
},
getUserProduct: (parms) => { //设备详情
return request({
url: `/userClient2/getUserProduct?id=${parms}`,
'method': 'GET',
})
},
getFilterDetailsByDeviceId: (parms) => { //滤芯详情
return request({
url: `/userClient2/getFilterDetailsByDeviceId?deviceId=${parms}`,
'method': 'GET',
})
},
restFilterS: (parms) => { //滤芯重置
return request({
url: `/tdproduct/td-product/restFilterS?filterId=${parms[0]}&deviceId=${parms[1]}&filterRestFlow=${parms[2]}&filterMaxFlow=${parms[3]}`,
'method': 'GET',
})
},
create: (data) => { //设备充值
return request({
url: `/dproductrecharge/D-product-recharge/create`,
'method': 'POST',
data,
})
},
unbindTheDevice: (data) => { //解绑设备
return request({
url: `/AppServerController/unbindTheDevice?id=${data}`,
'method': 'GET',
})
},
pushUserOrder: (params) => { //设备报修
return request({
url: `/userClient2/pushUserOrder`,
'method': 'GET',
params:params,
})
},
notice: (dada) => { //公告列表
return request({
url: `/AppServerController/getNoticePage?pageNo=${dada}&pageSize=10`,
'method': 'GET',
})
},
getNotice: (dada) => { //公告详情
return request({
url: `/AppServerController/getNotice?id=${dada}`,
'method': 'GET',
})
},
// 师傅管理
getMasterList: (data) => {
return request({
url: `/system/user/masterManage`,
method: 'get',
data,
})
},
}
export default homeApi

@ -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/logins',
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,124 @@
import request from '@/utils/request'
import upload from '@/utils/upload'
const MasterApi = {
// 获得工单
getWorkOrderNum: () => {
return request({
url: '/AppMasterController/masterHomeStatistics',
method: 'GET',
})
},
getAnnouncements: () => {
return request({
url: '/AppMasterController/intervalOrder',
method: 'GET',
})
},
getMasterOrderList: (data) => {
return request({
url: '/AppMasterController/queryCoverageArea',
method: 'GET',
data: data,
})
},
// 查询字典数据
// dictData
//字典
dictData: (params) => {
return request({
url: '/userClient2/getDictDataList',
method: 'GET',
params: params,
})
},
// 工单详情
getWorderById: (data) => {
return request({
url: '/userClient2/getWorderById',
method: 'get',
data: data,
})
},
// 接单、退单
updateOrder: (params) => {
return request({
url: '/AppMasterController/acceptRejectOrder',
method: 'get',
params: params,
})
},
// 完结工单上传
uploadFile: (data) => {
return upload({
url: '/admin-api/infra/file/upload',
method: 'post',
filePath: data,
})
},
// 评价
evaluateApi: (data) => {
return request({
url: '/userClient2/savefeedBack',
method: 'get',
data: data,
})
},
// 收益明细
getProfitList: (data) => {
return request({
url: '/AppUserBalanceController/getUserBalance',
method: 'get',
data: data,
})
},
// 收益分析
getProfitAnalyseList: (data) => {
return request({
url: '/earningsAnalysisController/earningsAnalysiHome',
method: 'get',
data: data,
})
},
// 修改密码
updatePassword: (data) => {
return request({
url: '/userClient2/updatePassword',
method: 'get',
data: data,
})
},
// 我的总资产
getMyInfo: (data) => {
return request({
url: '/earningsAnalysisController/myInfo',
method: 'get',
data: data,
})
},
// 提现记录
getWithdrawList: (data) => {
return request({
url: '/duserbalancewithdraw/D-user-balance-withdraw/pageWithdrawSuccess',
method: 'get',
data: data,
})
},
// 提现/AppUserBalanceController/applyWithdraw
withdrawDeposit: (data) => {
return request({
url: '/AppUserBalanceController/applyWithdraw',
method: 'post',
data: data,
})
},
}
export default MasterApi

@ -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,241 @@
<template>
<view class="tabbar-container safe-padding">
<!-- <view class="tabbar-item" v-for="(item, index) in tabbarList" :key="index" :class="[item.centerItem ? 'center-item' : '']" @click="changeItem(item)"> -->
<view class="tabbar-item" v-for="(item, index) in tabbarList" :key="index" @click="changeItem(item)">
<view class="item-top">
<image :src="currentItem == item.id ? item.selectedIconPath : item.iconPath"></image>
</view>
<view class="item-bottom" :class="[currentItem == item.id ? 'item-active' : '']">
<text>{{ item.text }}</text>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
tabbarList: [],
tabbarAll: [
// rolesId 1 2 3
{
id: 1,
rolesId: 1,
pagePath: '/pages_sf/index',
iconPath: '../../static/images/tabbar/gongdan_.png',
selectedIconPath: '../../static/images/tabbar/gongdan.png',
text: '工单',
centerItem: false
},
{
id: 2,
rolesId: 1,
pagePath: '/pages_sf/sfUser',
iconPath: '../../static/images/tabbar/wode_.png',
selectedIconPath: '../../static/images/tabbar/wode.png',
text: '我的',
centerItem: false
},
// --------------------------------2---------------------------
{
id: 3,
rolesId: 2,
pagePath: '/pages_zhd/index',
iconPath: '../../static/images/tabbar/jxsdsy_h.png',
selectedIconPath: '../../static/images/tabbar/jxsdsy.png',
text: '首页',
centerItem: false
},
{
id: 4,
rolesId: 2,
pagePath: '/pages_zhd/client',
iconPath: '../../static/images/tabbar/jxskh_h.png',
selectedIconPath: '../../static/images/tabbar/jxskh.png',
text: '客户',
centerItem: false
},
{
id: 5,
rolesId: 2,
pagePath: '/pages_zhd/statistics',
iconPath: '../../static/images/tabbar/jxstj_h.png',
selectedIconPath: '../../static/images/tabbar/jxstj.png',
text: '统计',
centerItem: false
},
{
id: 6,
rolesId: 2,
pagePath: '/pages_zhd/zhUser',
iconPath: '../../static/images/tabbar/jxswd_h.png',
selectedIconPath: '../../static/images/tabbar/jxswd.png',
text: '我的',
centerItem: false
},
// ----------------------------------------------------
{
id: 7,
rolesId: 3,
pagePath: '/pages_sf/index',
iconPath: '../../static/images/tabbar/home.png',
selectedIconPath: '../../static/images/tabbar/home_.png',
text: '首页',
centerItem: false
},
{
id: 8,
rolesId: 3,
pagePath: '/pages_fwsd/client',
iconPath: '../../static/images/tabbar/mine.png',
selectedIconPath: '../../static/images/tabbar/mine_.png',
text: '客户',
centerItem: false
},
{
id: 9,
rolesId: 3,
pagePath: '/pages_fwsd/work',
iconPath: '../../static/images/tabbar/gongdan_.png',
selectedIconPath: '../../static/images/tabbar/gongdan.png',
text: '工单',
centerItem: false
},
{
id: 10,
rolesId: 3,
pagePath: '/pages_sf/sfUser',
iconPath: '../../static/images/tabbar/mine.png',
selectedIconPath: '../../static/images/tabbar/mine_.png',
text: '我的',
centerItem: false
},
]
}
},
created() {
const rolesId = uni.getStorageSync('rolesId')
let tabData = this.tabbarAll.filter((item) => item.rolesId == rolesId)
this.tabbarList = tabData || this.tabbarAll
},
onShow() {
uni.hideTabBar({
animation: false
})
},
computed: {
currentItem() {
let pages = getCurrentPages(); //
let prevPage = pages[pages.length - 1]
return this.tabbarList.find(item => {
return item.pagePath.includes(prevPage.route);
}).id;
}
},
methods: {
// changeItem
changeItem(item) {
console.log(item.pagePath, '跳转')
uni.reLaunch({
url: item.pagePath
});
}
}
}
</script>
<style>
/* 匹配ios 底部安全距离 */
.safe-padding {
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
box-sizing: content-box;
}
view {
padding: 0;
margin: 0;
box-sizing: border-box;
}
.tabbar-container {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
height: 120rpx;
/* box-shadow: 0 0 5px #999; */
box-shadow: 0px 3px 20px rgba(0, 0, 0, 0.16);
border-top: 1px;
display: flex;
align-items: center;
/* padding: 5rpx 0; */
color: #262827;
z-index: 200;
background-color: #fff;
/* padding-bottom: 20rpx; */
}
.tabbar-container .tabbar-item {
padding-top: 16rpx;
flex: 1;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
}
.tabbar-container .item-active {
color: #4376f5;
}
.tabbar-container .center-item {
display: block;
position: relative;
}
.tabbar-container .tabbar-item .item-top {
width: 36rpx;
height: 36rpx;
/* padding: 10rpx; */
}
.tabbar-container .center-item .item-top {
flex-shrink: 0;
width: 120rpx;
height: 120rpx;
position: absolute;
top: -50rpx;
left: calc(50% - 60rpx);
border-radius: 50%;
box-shadow: 0px 3px 20px rgba(0, 0, 0, 0.16);
/* box-shadow: 0 0 5px #999; */
/* background: url('/static/icon_scan.png') no-repeat; */
background-size: contain;
}
.tabbar-container .tabbar-item .item-top image {
width: 36rpx;
height: 36rpx;
}
/* tabbar-container .tabbar-item:nth-child(3) .item-top image {
background: #ff0000;
} */
.tabbar-container .tabbar-item .item-bottom {
margin-top: 14rpx;
font-size: 20rpx;
width: 100%;
}
.tabbar-container .center-item .item-bottom {
position: absolute;
bottom: 5rpx;
}
</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>

File diff suppressed because one or more lines are too long

@ -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)
}
})
})
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,29 @@
// 应用全局配置
module.exports = {
// baseUrl: 'http://221.176.140.236:48080',
baseUrl: 'http://192.168.10.64:48080',
baseApi: '/admin-api',
NewBaseApi: '/app-api',
tenantId: 179,
// 应用信息
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',
},
],
},
}

@ -0,0 +1,22 @@
import Vue from 'vue'
import App from './App'
import store from './store' // store
import plugins from './plugins' // plugins
import './permission' // permission
import uView from 'uview-ui'
import VueCompositionAPI from '@vue/composition-api'
Vue.use(uView)
Vue.use(plugins)
Vue.config.productionTip = false
Vue.prototype.$store = store
Vue.use(VueCompositionAPI)
App.mpType = 'app'
const app = new Vue({
...App,
})
app.$mount()

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save