配置更新
This commit is contained in:
parent
1e2f8984e2
commit
b07c3b769c
16
.eslintrc.js
Normal file
16
.eslintrc.js
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
module.exports = {
|
||||
root: true,
|
||||
env: {
|
||||
node: true,
|
||||
'vue/setup-compiler-macros': true,
|
||||
},
|
||||
extends: ['plugin:vue/vue3-essential', '@vue/eslint-config-prettier'],
|
||||
parserOptions: {
|
||||
ecmaVersion: 2020,
|
||||
},
|
||||
rules: {
|
||||
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
||||
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
||||
'vue/multi-word-component-names': 'off',
|
||||
},
|
||||
}
|
||||
4
.idea/.gitignore
vendored
4
.idea/.gitignore
vendored
|
|
@ -6,6 +6,6 @@
|
|||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
||||
unpackage/
|
||||
node_modules/
|
||||
/unpackage/
|
||||
/node_modules/
|
||||
|
||||
|
|
|
|||
6
.idea/inspectionProfiles/Project_Default.xml
Normal file
6
.idea/inspectionProfiles/Project_Default.xml
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
|
||||
</profile>
|
||||
</component>
|
||||
6
.idea/jsLinters/eslint.xml
Normal file
6
.idea/jsLinters/eslint.xml
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="EslintConfiguration">
|
||||
<option name="fix-on-save" value="true" />
|
||||
</component>
|
||||
</project>
|
||||
7
.idea/prettier.xml
Normal file
7
.idea/prettier.xml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="PrettierConfiguration">
|
||||
<option name="myConfigurationMode" value="AUTOMATIC" />
|
||||
<option name="myRunOnSave" value="true" />
|
||||
</component>
|
||||
</project>
|
||||
9
.prettierrc
Normal file
9
.prettierrc
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"semi": false,
|
||||
"singleQuote": true,
|
||||
"tabWidth": 2,
|
||||
"trailingComma": "es5",
|
||||
"printWidth": 100,
|
||||
"bracketSpacing": true,
|
||||
"arrowParens": "avoid"
|
||||
}
|
||||
6
App.vue
6
App.vue
|
|
@ -1,5 +1,5 @@
|
|||
<script>
|
||||
export default {
|
||||
export default {
|
||||
onLaunch: function () {
|
||||
console.log('App Launch')
|
||||
},
|
||||
|
|
@ -9,9 +9,9 @@
|
|||
onHide: function () {
|
||||
console.log('App Hide')
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
/*每个页面公共css */
|
||||
/*每个页面公共css */
|
||||
</style>
|
||||
|
|
|
|||
37
README.md
37
README.md
|
|
@ -18,10 +18,45 @@
|
|||
|
||||
## 技术栈
|
||||
|
||||
- **框架**:uni-app
|
||||
- **框架**:uni-app Vue3
|
||||
- **状态管理**:Vuex 4
|
||||
- **样式**:SCSS + CSS3
|
||||
- **图标**:SVG 矢量图标
|
||||
- **动画**:CSS3 动画效果
|
||||
- **代码规范**:ESLint + Prettier
|
||||
|
||||
## 依赖说明
|
||||
|
||||
### 核心依赖
|
||||
- `@dcloudio/uni-app`: uni-app 框架核心包
|
||||
- `vue`: Vue 3 框架
|
||||
- `vuex`: 状态管理库
|
||||
|
||||
### 开发依赖
|
||||
- `eslint`: 代码检查工具
|
||||
- `eslint-plugin-vue`: Vue 代码检查插件
|
||||
- `@vue/eslint-config-prettier`: ESLint 与 Prettier 集成
|
||||
- `prettier`: 代码格式化工具
|
||||
|
||||
### 安装依赖
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
### 开发命令
|
||||
```bash
|
||||
# 格式化代码
|
||||
npm run format
|
||||
|
||||
# 代码检查
|
||||
npm run lint
|
||||
|
||||
# 开发模式
|
||||
npm run dev
|
||||
|
||||
# 构建项目
|
||||
npm run build
|
||||
```
|
||||
|
||||
## 项目结构
|
||||
|
||||
|
|
|
|||
75
components/announcement-bar/announcement-bar.vue
Normal file
75
components/announcement-bar/announcement-bar.vue
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
<template>
|
||||
<view class="announcement-bar" @click="onAnnouncementClick">
|
||||
<image class="announcementIcon" :src="announcementIcon"></image>
|
||||
<view class="announcement-box">
|
||||
<text class="announcement-text">{{ announcementText }}</text>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'AnnouncementBar',
|
||||
props: {
|
||||
announcementText: {
|
||||
type: String,
|
||||
default: '暂无更多公告! 暂无更多公告! 暂无更多公告!',
|
||||
},
|
||||
announcementIcon: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
onAnnouncementClick() {
|
||||
this.$emit('announcement-click')
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.announcement-bar {
|
||||
background: white;
|
||||
opacity: 0.5;
|
||||
margin: 34rpx 19rpx 0 19rpx;
|
||||
padding: 15rpx 30rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 15rpx;
|
||||
overflow: hidden;
|
||||
height: 34rpx;
|
||||
border-radius: 100rpx;
|
||||
|
||||
.announcementIcon {
|
||||
height: 32rpx;
|
||||
width: 32rpx;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.announcement-box {
|
||||
flex: 1;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
|
||||
.announcement-text {
|
||||
font-size: 13px;
|
||||
opacity: 1;
|
||||
color: black;
|
||||
white-space: nowrap;
|
||||
animation: scroll-text 10s linear infinite;
|
||||
display: inline-block;
|
||||
padding-left: 100%;
|
||||
}
|
||||
|
||||
@keyframes scroll-text {
|
||||
0% {
|
||||
transform: translateX(0);
|
||||
}
|
||||
100% {
|
||||
transform: translateX(-100%);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
93
components/banner-swiper/banner-swiper.vue
Normal file
93
components/banner-swiper/banner-swiper.vue
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
<template>
|
||||
<view class="banner-section">
|
||||
<swiper
|
||||
:autoplay="autoplay"
|
||||
:duration="duration"
|
||||
:indicator-dots="indicatorDots"
|
||||
:interval="interval"
|
||||
circular
|
||||
class="swiper"
|
||||
indicator-active-color="#FFFFFF"
|
||||
indicator-color="rgba(255, 255, 255, 0.5)"
|
||||
>
|
||||
<swiper-item
|
||||
v-for="(item, index) in bannerList"
|
||||
:key="index"
|
||||
@click="onBannerClick(item, index)"
|
||||
>
|
||||
<image :src="item.image" mode="aspectFill"></image>
|
||||
</swiper-item>
|
||||
</swiper>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'BannerSwiper',
|
||||
props: {
|
||||
bannerList: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
indicatorDots: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
autoplay: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
interval: {
|
||||
type: Number,
|
||||
default: 2000,
|
||||
},
|
||||
duration: {
|
||||
type: Number,
|
||||
default: 500,
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
onSwiperChange(e) {
|
||||
this.$emit('change', e.detail.current)
|
||||
},
|
||||
onBannerClick(item, index) {
|
||||
this.$emit('banner-click', { item, index })
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.banner-section {
|
||||
padding: 30rpx;
|
||||
}
|
||||
|
||||
.swiper {
|
||||
height: 300rpx;
|
||||
/* 通用指示器样式 - 覆盖所有可能的类名 */
|
||||
|
||||
:deep([class*='swiper-dot']) {
|
||||
border-radius: 50% !important;
|
||||
transition: all 0.3s ease !important;
|
||||
}
|
||||
|
||||
:deep([class*='swiper-dot-active']) {
|
||||
width: 82rpx !important;
|
||||
height: 14rpx;
|
||||
/* 选中时稍大 */
|
||||
}
|
||||
|
||||
.swiper-item {
|
||||
display: block;
|
||||
height: 300rpx;
|
||||
line-height: 300rpx;
|
||||
text-align: center;
|
||||
|
||||
image {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-radius: 20rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
98
components/bottom-nav/bottom-nav.vue
Normal file
98
components/bottom-nav/bottom-nav.vue
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
<template>
|
||||
<view class="bottom-nav">
|
||||
<view
|
||||
v-for="(nav, index) in navItems"
|
||||
:key="index"
|
||||
class="nav-item"
|
||||
:class="{ active: index === activeIndex }"
|
||||
@click="onNavClick(index)"
|
||||
>
|
||||
<image class="nav-icon" :src="getNavIcon(index)" mode="aspectFit"></image>
|
||||
<text class="nav-text">{{ nav }}</text>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'BottomNav',
|
||||
props: {
|
||||
navItems: {
|
||||
type: Array,
|
||||
default: () => ['首页', '申请租赁', '个人中心'],
|
||||
},
|
||||
activeIndex: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
iconConfig: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
onNavClick(index) {
|
||||
this.$emit('nav-click', index)
|
||||
},
|
||||
|
||||
getNavIcon(index) {
|
||||
const isActive = index === this.activeIndex
|
||||
const icons = this.iconConfig
|
||||
|
||||
switch (index) {
|
||||
case 0: // 首页
|
||||
return isActive ? icons.HOME_ACTIVE : icons.HOME
|
||||
case 1: // 申请租赁
|
||||
return isActive ? icons.RENT_ACTIVE : icons.RENT
|
||||
case 2: // 个人中心
|
||||
return isActive ? icons.PERSONAL_CENTER_ACTIVE : icons.PERSONAL_CENTER
|
||||
default:
|
||||
return icons.HOME
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.bottom-nav {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
background: #fff;
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
padding: 20rpx 0;
|
||||
box-shadow: 0 -4rpx 20rpx rgba(0, 0, 0, 0.1);
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
.nav-item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 8rpx;
|
||||
padding: 10rpx;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.nav-item:active {
|
||||
transform: scale(0.95);
|
||||
}
|
||||
|
||||
.nav-icon {
|
||||
width: 48rpx;
|
||||
height: 48rpx;
|
||||
}
|
||||
|
||||
.nav-text {
|
||||
font-size: 20rpx;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.nav-item.active .nav-text {
|
||||
color: #ff9a9e;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -16,19 +16,28 @@
|
|||
<view
|
||||
class="navbar-left"
|
||||
@click="handleBack"
|
||||
:style="{ height: capsuleHeight + 'px', lineHeight: capsuleHeight + 'px' }"
|
||||
:style="{
|
||||
height: capsuleHeight + 'px',
|
||||
lineHeight: capsuleHeight + 'px',
|
||||
}"
|
||||
>
|
||||
<image :src="backIcon" mode="aspectFit" class="back-icon"></image>
|
||||
</view>
|
||||
<view
|
||||
class="navbar-title"
|
||||
:style="{ height: capsuleHeight + 'px', lineHeight: capsuleHeight + 'px' }"
|
||||
:style="{
|
||||
height: capsuleHeight + 'px',
|
||||
lineHeight: capsuleHeight + 'px',
|
||||
}"
|
||||
>
|
||||
{{ title }}
|
||||
</view>
|
||||
<view
|
||||
class="navbar-right"
|
||||
:style="{ height: capsuleHeight + 'px', lineHeight: capsuleHeight + 'px' }"
|
||||
:style="{
|
||||
height: capsuleHeight + 'px',
|
||||
lineHeight: capsuleHeight + 'px',
|
||||
}"
|
||||
>
|
||||
<slot name="right"></slot>
|
||||
</view>
|
||||
|
|
@ -37,9 +46,9 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import CommonEnum from '../../enum/common'
|
||||
import CommonEnum from '../../enum/common'
|
||||
|
||||
export default {
|
||||
export default {
|
||||
name: 'CustomNavbar',
|
||||
props: {
|
||||
title: {
|
||||
|
|
@ -120,12 +129,18 @@
|
|||
if (this.scrollTop > this.scrollThreshold) {
|
||||
if (!this.isScrolled) {
|
||||
this.isScrolled = true
|
||||
this.$emit('scroll-change', { isScrolled: true, scrollTop: this.scrollTop })
|
||||
this.$emit('scroll-change', {
|
||||
isScrolled: true,
|
||||
scrollTop: this.scrollTop,
|
||||
})
|
||||
}
|
||||
} else {
|
||||
if (this.isScrolled) {
|
||||
this.isScrolled = false
|
||||
this.$emit('scroll-change', { isScrolled: false, scrollTop: this.scrollTop })
|
||||
this.$emit('scroll-change', {
|
||||
isScrolled: false,
|
||||
scrollTop: this.scrollTop,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -144,18 +159,18 @@
|
|||
this.isScrolled = scrollTop > this.scrollThreshold
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
/* 填充区样式 */
|
||||
.navbar-placeholder {
|
||||
/* 填充区样式 */
|
||||
.navbar-placeholder {
|
||||
width: 100%;
|
||||
background-color: transparent;
|
||||
}
|
||||
}
|
||||
|
||||
/* 自定义导航栏样式 */
|
||||
.custom-navbar {
|
||||
/* 自定义导航栏样式 */
|
||||
.custom-navbar {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
|
|
@ -170,14 +185,14 @@
|
|||
padding-right: 30rpx;
|
||||
box-sizing: border-box;
|
||||
transition: background-color 0.3s ease; /* 添加过渡动画 */
|
||||
}
|
||||
}
|
||||
|
||||
/* 滚动状态样式 */
|
||||
.navbar-scrolled {
|
||||
/* 滚动状态样式 */
|
||||
.navbar-scrolled {
|
||||
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1); /* 滚动时添加阴影 */
|
||||
}
|
||||
}
|
||||
|
||||
.navbar-left {
|
||||
.navbar-left {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
|
@ -187,9 +202,9 @@
|
|||
width: 56rpx;
|
||||
height: 56rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.navbar-title {
|
||||
.navbar-title {
|
||||
font-size: 36rpx;
|
||||
font-weight: bold;
|
||||
color: #695347;
|
||||
|
|
@ -198,12 +213,12 @@
|
|||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
|
||||
.navbar-right {
|
||||
.navbar-right {
|
||||
width: 60rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
189
components/equipment-list/equipment-list.vue
Normal file
189
components/equipment-list/equipment-list.vue
Normal file
|
|
@ -0,0 +1,189 @@
|
|||
<template>
|
||||
<view class="equipment-section">
|
||||
<view class="section-title">{{ title }}</view>
|
||||
<view class="equipment-list">
|
||||
<view
|
||||
v-for="equipment in equipmentList"
|
||||
:key="equipment.id"
|
||||
class="equipment-item"
|
||||
@click="onEquipmentClick(equipment)"
|
||||
>
|
||||
<image class="equipment-image" :src="equipment.image" mode="aspectFit"></image>
|
||||
<view class="equipment-info">
|
||||
<view class="equipment-header">
|
||||
<text class="equipment-name">{{ equipment.name }}</text>
|
||||
<text class="status-badge" :class="equipment.status">
|
||||
{{ getStatusText(equipment.status) }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="equipment-details">
|
||||
<view class="detail-item-row">
|
||||
<text class="detail-item-time">租赁时间:</text>
|
||||
<text class="detail-item">{{ equipment.startTime }}</text>
|
||||
</view>
|
||||
<view class="detail-item-row">
|
||||
<text class="detail-item-time">到期时间:</text>
|
||||
<text class="detail-item">{{ equipment.endTime }}</text>
|
||||
</view>
|
||||
</view>
|
||||
<button class="renew-btn" @click.stop="onRenew(equipment)">去续费</button>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'EquipmentList',
|
||||
props: {
|
||||
title: {
|
||||
type: String,
|
||||
default: '我的租赁设备',
|
||||
},
|
||||
equipmentList: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
getStatusText(status) {
|
||||
const statusMap = {
|
||||
normal: '正常',
|
||||
warning: '警告',
|
||||
error: '异常',
|
||||
}
|
||||
return statusMap[status] || '未知'
|
||||
},
|
||||
|
||||
onEquipmentClick(equipment) {
|
||||
this.$emit('equipment-click', equipment)
|
||||
},
|
||||
|
||||
onRenew(equipment) {
|
||||
this.$emit('renew', equipment)
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.equipment-section {
|
||||
padding: 0 30rpx;
|
||||
}
|
||||
|
||||
.section-title {
|
||||
width: 180rpx;
|
||||
height: 33rpx;
|
||||
background: #ffffff;
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
color: #3d3d3d;
|
||||
margin-bottom: 20rpx;
|
||||
padding: 14rpx 20rpx;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.equipment-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 20rpx;
|
||||
}
|
||||
|
||||
.equipment-item {
|
||||
background: #fff;
|
||||
border-radius: 20rpx;
|
||||
padding: 30rpx;
|
||||
display: flex;
|
||||
gap: 30rpx;
|
||||
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.1);
|
||||
transition: all 0.3s ease;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
|
||||
.equipment-image {
|
||||
width: 160rpx;
|
||||
height: 106rpx;
|
||||
border-radius: 10rpx;
|
||||
background-color: #f8f9fa;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.equipment-item:active {
|
||||
transform: scale(0.98);
|
||||
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
|
||||
.equipment-info {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.equipment-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 15rpx;
|
||||
}
|
||||
|
||||
.equipment-name {
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
color: #3d3d3d;
|
||||
}
|
||||
|
||||
.status-badge {
|
||||
padding: 4rpx 26rpx;
|
||||
border-radius: 5rpx;
|
||||
font-size: 24rpx;
|
||||
color: #40c186;
|
||||
|
||||
&.normal {
|
||||
background-color: #ebfff6;
|
||||
}
|
||||
|
||||
&.warning {
|
||||
background-color: #faad14;
|
||||
}
|
||||
|
||||
&.error {
|
||||
background-color: #ff4d4f;
|
||||
}
|
||||
}
|
||||
|
||||
.equipment-details {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8rpx;
|
||||
margin-bottom: 15rpx;
|
||||
}
|
||||
|
||||
.detail-item-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
|
||||
.detail-item-time {
|
||||
color: #817f7f;
|
||||
font-size: 26rpx;
|
||||
}
|
||||
|
||||
.detail-item {
|
||||
font-size: 24rpx;
|
||||
color: #666;
|
||||
}
|
||||
}
|
||||
|
||||
.renew-btn {
|
||||
margin-right: 0;
|
||||
background: #f15a04;
|
||||
color: #fff;
|
||||
border-radius: 5px;
|
||||
padding: 0 57rpx;
|
||||
font-size: 32rpx;
|
||||
font-weight: 500;
|
||||
margin-top: 10rpx;
|
||||
}
|
||||
</style>
|
||||
64
components/home-header/home-header.vue
Normal file
64
components/home-header/home-header.vue
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
<template>
|
||||
<view class="header">
|
||||
<view class="location-info" @click="onLocationClick">
|
||||
<image class="location" :src="locationIcon"></image>
|
||||
<text class="company-name">{{ companyName }}</text>
|
||||
<text class="arrow">></text>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'HomeHeader',
|
||||
props: {
|
||||
companyName: {
|
||||
type: String,
|
||||
default: '福鼎创特物联科技有限公司',
|
||||
},
|
||||
locationIcon: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
onLocationClick() {
|
||||
this.$emit('location-click')
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.header {
|
||||
padding: 106rpx 30rpx 20rpx 30rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
background: #ffddca;
|
||||
z-index: 999;
|
||||
|
||||
.location-info {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10rpx;
|
||||
flex: 1;
|
||||
|
||||
.location {
|
||||
width: 27rpx;
|
||||
height: 31rpx;
|
||||
}
|
||||
|
||||
.company-name {
|
||||
color: #3d3d3d;
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.arrow {
|
||||
font-size: 24rpx;
|
||||
color: #666;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
3995
package-lock.json
generated
Normal file
3995
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
35
package.json
Normal file
35
package.json
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
{
|
||||
"name": "homelease",
|
||||
"version": "1.0.0",
|
||||
"description": "HomeLease - 房屋租赁应用",
|
||||
"main": "main.js",
|
||||
"scripts": {
|
||||
"dev": "uni",
|
||||
"build": "uni build",
|
||||
"format": "prettier --write \"**/*.{js,vue,json,scss,css}\"",
|
||||
"lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore"
|
||||
},
|
||||
"keywords": [
|
||||
"uni-app",
|
||||
"vue3",
|
||||
"房屋租赁",
|
||||
"小程序"
|
||||
],
|
||||
"author": "",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"@vue/eslint-config-prettier": "^8.0.0",
|
||||
"eslint": "^8.45.0",
|
||||
"eslint-plugin-vue": "^9.15.1",
|
||||
"prettier": "^3.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@dcloudio/uni-app": "3.0.0-4070520250711001",
|
||||
"vue": "^3.3.0",
|
||||
"vuex": "^4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16.0.0",
|
||||
"npm": ">=8.0.0"
|
||||
}
|
||||
}
|
||||
|
|
@ -44,14 +44,14 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import commonEnum from '../../enum/commonEnum'
|
||||
import HomeHeader from '../../components/home-header/home-header.vue'
|
||||
import AnnouncementBar from '../../components/announcement-bar/announcement-bar.vue'
|
||||
import BannerSwiper from '../../components/banner-swiper/banner-swiper.vue'
|
||||
import EquipmentList from '../../components/equipment-list/equipment-list.vue'
|
||||
import BottomNav from '../../components/bottom-nav/bottom-nav.vue'
|
||||
import commonEnum from '../../enum/commonEnum'
|
||||
import HomeHeader from '../../components/home-header/home-header.vue'
|
||||
import AnnouncementBar from '../../components/announcement-bar/announcement-bar.vue'
|
||||
import BannerSwiper from '../../components/banner-swiper/banner-swiper.vue'
|
||||
import EquipmentList from '../../components/equipment-list/equipment-list.vue'
|
||||
import BottomNav from '../../components/bottom-nav/bottom-nav.vue'
|
||||
|
||||
export default {
|
||||
export default {
|
||||
components: {
|
||||
HomeHeader,
|
||||
AnnouncementBar,
|
||||
|
|
@ -170,22 +170,16 @@
|
|||
})
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.home-container {
|
||||
background: linear-gradient(
|
||||
to bottom,
|
||||
#ffddca 0px,
|
||||
#ffddca 450rpx,
|
||||
#f5f5f5 450rpx,
|
||||
#f5f5f5 100%
|
||||
);
|
||||
.home-container {
|
||||
background: linear-gradient(to bottom, #ffddca 0px, #ffddca 450rpx, #f5f5f5 450rpx, #f5f5f5 100%);
|
||||
|
||||
padding-bottom: 120rpx; /* 为底部导航留出空间 */
|
||||
max-width: 750rpx;
|
||||
margin: 0 auto;
|
||||
z-index: -2;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -74,13 +74,13 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import { navigateToPage } from '@/utils/router.js'
|
||||
import { wxLogin } from '@/api/auth/auth.js'
|
||||
import { forceHideLoading, AutoLoadingManager } from '@/utils/request.js'
|
||||
import { getServiceTerms, getPrivacyPolicy } from '@/api/article/article.js'
|
||||
import { commonEnum } from '../../enum/commonEnum'
|
||||
import { navigateToPage } from '@/utils/router.js'
|
||||
import { wxLogin } from '@/api/auth/auth.js'
|
||||
import { forceHideLoading, AutoLoadingManager } from '@/utils/request.js'
|
||||
import { getServiceTerms, getPrivacyPolicy } from '@/api/article/article.js'
|
||||
import { commonEnum } from '../../enum/commonEnum'
|
||||
|
||||
export default {
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
loginLoading: false,
|
||||
|
|
@ -303,21 +303,21 @@
|
|||
navigateToPage('index')
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
page {
|
||||
page {
|
||||
background: #ffffff;
|
||||
}
|
||||
}
|
||||
|
||||
.login-container {
|
||||
.login-container {
|
||||
padding-bottom: 40rpx;
|
||||
max-width: 750rpx;
|
||||
background: #ffffff;
|
||||
}
|
||||
}
|
||||
|
||||
.logo-section {
|
||||
.logo-section {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
|
|
@ -326,14 +326,14 @@
|
|||
width: 100%;
|
||||
margin-top: 330rpx;
|
||||
//border:green 1px solid;
|
||||
}
|
||||
}
|
||||
|
||||
.logo-image {
|
||||
.logo-image {
|
||||
width: 276rpx;
|
||||
height: 276rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.main-content {
|
||||
.main-content {
|
||||
padding: 0 53rpx;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
|
@ -341,9 +341,9 @@
|
|||
justify-content: center;
|
||||
margin-top: 654rpx;
|
||||
//border: red 1px solid;
|
||||
}
|
||||
}
|
||||
|
||||
.login-btn {
|
||||
.login-btn {
|
||||
width: 100%;
|
||||
height: 98rpx;
|
||||
background: #f15a04;
|
||||
|
|
@ -354,25 +354,25 @@
|
|||
justify-content: center;
|
||||
transition: all 0.3s ease;
|
||||
box-shadow: 0 4rpx 12rpx rgba(255, 107, 53, 0.3);
|
||||
}
|
||||
}
|
||||
|
||||
.login-btn:active {
|
||||
.login-btn:active {
|
||||
transform: translateY(2rpx);
|
||||
box-shadow: 0 2rpx 8rpx rgba(255, 107, 53, 0.3);
|
||||
}
|
||||
}
|
||||
|
||||
.login-btn:disabled {
|
||||
.login-btn:disabled {
|
||||
background: #ccc;
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-text {
|
||||
.btn-text {
|
||||
font-size: 32rpx;
|
||||
font-weight: 600;
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
.agreement-section {
|
||||
.agreement-section {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
|
@ -380,14 +380,14 @@
|
|||
padding: 30rpx;
|
||||
margin-top: 40rpx;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
}
|
||||
|
||||
.agreement-checkbox {
|
||||
.agreement-checkbox {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
|
||||
.checkbox {
|
||||
.checkbox {
|
||||
width: 28rpx;
|
||||
height: 28rpx;
|
||||
border: 2rpx solid #ff6b35;
|
||||
|
|
@ -397,31 +397,31 @@
|
|||
justify-content: center;
|
||||
background: #fff;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
}
|
||||
|
||||
.checkbox.checked {
|
||||
.checkbox.checked {
|
||||
background: #ff6b35;
|
||||
border-color: #ff6b35;
|
||||
}
|
||||
}
|
||||
|
||||
.checkmark {
|
||||
.checkmark {
|
||||
color: #fff;
|
||||
font-size: 18rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
|
||||
.agreement-text {
|
||||
.agreement-text {
|
||||
font-size: 24rpx;
|
||||
color: #666;
|
||||
}
|
||||
}
|
||||
|
||||
.agreement-link {
|
||||
.agreement-link {
|
||||
font-size: 24rpx;
|
||||
color: #ff6b35;
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
|
||||
.popup-overlay {
|
||||
.popup-overlay {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
|
|
@ -434,9 +434,9 @@
|
|||
justify-content: center;
|
||||
padding: 40rpx;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
}
|
||||
|
||||
.popup-content {
|
||||
.popup-content {
|
||||
background: #fff;
|
||||
border-radius: 20rpx;
|
||||
overflow: hidden;
|
||||
|
|
@ -448,64 +448,64 @@
|
|||
max-height: 900rpx;
|
||||
min-height: 600rpx;
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.popup-header {
|
||||
.popup-header {
|
||||
padding: 30rpx;
|
||||
border-bottom: 1rpx solid #eee;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.popup-title {
|
||||
.popup-title {
|
||||
font-size: 32rpx;
|
||||
font-weight: 500;
|
||||
color: #333;
|
||||
}
|
||||
}
|
||||
|
||||
.popup-close {
|
||||
.popup-close {
|
||||
font-size: 40rpx;
|
||||
color: #999;
|
||||
cursor: pointer;
|
||||
padding: 10rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.popup-body {
|
||||
.popup-body {
|
||||
flex: 1;
|
||||
padding: 30rpx;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
height: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.terms-content {
|
||||
.terms-content {
|
||||
line-height: 1.8;
|
||||
font-size: 28rpx;
|
||||
color: #333;
|
||||
word-wrap: break-word;
|
||||
word-break: break-all;
|
||||
padding-bottom: 20rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.popup-footer {
|
||||
.popup-footer {
|
||||
padding: 30rpx;
|
||||
border-top: 1rpx solid #eee;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.popup-tip {
|
||||
.popup-tip {
|
||||
font-size: 24rpx;
|
||||
color: #999;
|
||||
margin-bottom: 20rpx;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
.popup-btn {
|
||||
.popup-btn {
|
||||
width: 200rpx;
|
||||
height: 70rpx;
|
||||
background: linear-gradient(135deg, #ff9a9e 0%, #fecfef 100%);
|
||||
|
|
@ -513,5 +513,5 @@
|
|||
font-size: 28rpx;
|
||||
color: #ffffff;
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"app.js","sources":["App.vue","main.js"],"sourcesContent":["<script>\n export default {\n onLaunch: function () {\n console.log('App Launch')\n },\n onShow: function () {\n console.log('App Show')\n },\n onHide: function () {\n console.log('App Hide')\n },\n }\n</script>\n\n<style>\n /*每个页面公共css */\n</style>\n","import App from './App'\n\n// #ifndef VUE3\nimport Vue from 'vue'\nimport './uni.promisify.adaptor'\nVue.config.productionTip = false\nApp.mpType = 'app'\nconst app = new Vue({\n ...App,\n})\napp.$mount()\n// #endif\n\n// #ifdef VUE3\nimport { createSSRApp } from 'vue'\nimport PageScrollMixin from './mixins/page-scroll-mixin.js'\n\nexport function createApp() {\n const app = createSSRApp(App)\n\n // 注册全局 mixin (Vue3 方式)\n app.mixin(PageScrollMixin)\n\n return {\n app,\n }\n}\n// #endif\n"],"names":["uni","createSSRApp","App","PageScrollMixin"],"mappings":";;;;;;;;AACE,MAAK,YAAU;AAAA,EACb,UAAU,WAAY;AACpBA,kBAAAA,MAAA,MAAA,OAAA,gBAAY,YAAY;AAAA,EACzB;AAAA,EACD,QAAQ,WAAY;AAClBA,kBAAAA,mCAAY,UAAU;AAAA,EACvB;AAAA,EACD,QAAQ,WAAY;AAClBA,kBAAAA,oCAAY,UAAU;AAAA,EACvB;AACH;ACMK,SAAS,YAAY;AAC1B,QAAM,MAAMC,cAAY,aAACC,SAAG;AAG5B,MAAI,MAAMC,sCAAe;AAEzB,SAAO;AAAA,IACL;AAAA,EACD;AACH;;;"}
|
||||
{"version":3,"file":"app.js","sources":["App.vue","main.js"],"sourcesContent":["<script>\nexport default {\n onLaunch: function () {\n console.log('App Launch')\n },\n onShow: function () {\n console.log('App Show')\n },\n onHide: function () {\n console.log('App Hide')\n },\n}\n</script>\n\n<style>\n/*每个页面公共css */\n</style>\n","import App from './App'\n\n// #ifndef VUE3\nimport Vue from 'vue'\nimport './uni.promisify.adaptor'\nVue.config.productionTip = false\nApp.mpType = 'app'\nconst app = new Vue({\n ...App,\n})\napp.$mount()\n// #endif\n\n// #ifdef VUE3\nimport { createSSRApp } from 'vue'\nimport PageScrollMixin from './mixins/page-scroll-mixin.js'\n\nexport function createApp() {\n const app = createSSRApp(App)\n\n // 注册全局 mixin (Vue3 方式)\n app.mixin(PageScrollMixin)\n\n return {\n app,\n }\n}\n// #endif\n"],"names":["uni","createSSRApp","App","PageScrollMixin"],"mappings":";;;;;;;;AACA,MAAK,YAAU;AAAA,EACb,UAAU,WAAY;AACpBA,kBAAAA,MAAY,MAAA,OAAA,gBAAA,YAAY;AAAA,EACzB;AAAA,EACD,QAAQ,WAAY;AAClBA,kBAAAA,MAAA,MAAA,OAAA,gBAAY,UAAU;AAAA,EACvB;AAAA,EACD,QAAQ,WAAY;AAClBA,kBAAAA,MAAA,MAAA,OAAA,iBAAY,UAAU;AAAA,EACvB;AACH;ACMO,SAAS,YAAY;AAC1B,QAAM,MAAMC,cAAY,aAACC,SAAG;AAG5B,MAAI,MAAMC,sCAAe;AAEzB,SAAO;AAAA,IACL;AAAA,EACD;AACH;;;"}
|
||||
1
unpackage/dist/dev/.sourcemap/mp-weixin/components/announcement-bar/announcement-bar.js.map
vendored
Normal file
1
unpackage/dist/dev/.sourcemap/mp-weixin/components/announcement-bar/announcement-bar.js.map
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"announcement-bar.js","sources":["components/announcement-bar/announcement-bar.vue","C:/Users/Administrator/Downloads/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd29yay9IQnVpbGRlclByb2plY3RzL0hvbWVMZWFzZS9jb21wb25lbnRzL2Fubm91bmNlbWVudC1iYXIvYW5ub3VuY2VtZW50LWJhci52dWU"],"sourcesContent":["<template>\n <view class=\"announcement-bar\" @click=\"onAnnouncementClick\">\n <image class=\"announcementIcon\" :src=\"announcementIcon\"></image>\n <view class=\"announcement-box\">\n <text class=\"announcement-text\">{{ announcementText }}</text>\n </view>\n </view>\n</template>\n\n<script>\nexport default {\n name: 'AnnouncementBar',\n props: {\n announcementText: {\n type: String,\n default: '暂无更多公告! 暂无更多公告! 暂无更多公告!',\n },\n announcementIcon: {\n type: String,\n required: true,\n },\n },\n methods: {\n onAnnouncementClick() {\n this.$emit('announcement-click')\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.announcement-bar {\n background: white;\n opacity: 0.5;\n margin: 34rpx 19rpx 0 19rpx;\n padding: 15rpx 30rpx;\n display: flex;\n align-items: center;\n gap: 15rpx;\n overflow: hidden;\n height: 34rpx;\n border-radius: 100rpx;\n\n .announcementIcon {\n height: 32rpx;\n width: 32rpx;\n flex-shrink: 0;\n }\n\n .announcement-box {\n flex: 1;\n overflow: hidden;\n position: relative;\n\n .announcement-text {\n font-size: 13px;\n opacity: 1;\n color: black;\n white-space: nowrap;\n animation: scroll-text 10s linear infinite;\n display: inline-block;\n padding-left: 100%;\n }\n\n @keyframes scroll-text {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(-100%);\n }\n }\n }\n}\n</style>\n","import Component from 'D:/work/HBuilderProjects/HomeLease/components/announcement-bar/announcement-bar.vue'\nwx.createComponent(Component)"],"names":[],"mappings":";;AAUA,MAAK,YAAU;AAAA,EACb,MAAM;AAAA,EACN,OAAO;AAAA,IACL,kBAAkB;AAAA,MAChB,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA,IACD,kBAAkB;AAAA,MAChB,MAAM;AAAA,MACN,UAAU;AAAA,IACX;AAAA,EACF;AAAA,EACD,SAAS;AAAA,IACP,sBAAsB;AACpB,WAAK,MAAM,oBAAoB;AAAA,IAChC;AAAA,EACF;AACH;;;;;;;;;AC1BA,GAAG,gBAAgB,SAAS;"}
|
||||
1
unpackage/dist/dev/.sourcemap/mp-weixin/components/banner-swiper/banner-swiper.js.map
vendored
Normal file
1
unpackage/dist/dev/.sourcemap/mp-weixin/components/banner-swiper/banner-swiper.js.map
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"banner-swiper.js","sources":["components/banner-swiper/banner-swiper.vue","C:/Users/Administrator/Downloads/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd29yay9IQnVpbGRlclByb2plY3RzL0hvbWVMZWFzZS9jb21wb25lbnRzL2Jhbm5lci1zd2lwZXIvYmFubmVyLXN3aXBlci52dWU"],"sourcesContent":["<template>\n <view class=\"banner-section\">\n <swiper\n :autoplay=\"autoplay\"\n :duration=\"duration\"\n :indicator-dots=\"indicatorDots\"\n :interval=\"interval\"\n circular\n class=\"swiper\"\n indicator-active-color=\"#FFFFFF\"\n indicator-color=\"rgba(255, 255, 255, 0.5)\"\n >\n <swiper-item\n v-for=\"(item, index) in bannerList\"\n :key=\"index\"\n @click=\"onBannerClick(item, index)\"\n >\n <image :src=\"item.image\" mode=\"aspectFill\"></image>\n </swiper-item>\n </swiper>\n </view>\n</template>\n\n<script>\nexport default {\n name: 'BannerSwiper',\n props: {\n bannerList: {\n type: Array,\n default: () => [],\n },\n indicatorDots: {\n type: Boolean,\n default: true,\n },\n autoplay: {\n type: Boolean,\n default: true,\n },\n interval: {\n type: Number,\n default: 2000,\n },\n duration: {\n type: Number,\n default: 500,\n },\n },\n methods: {\n onSwiperChange(e) {\n this.$emit('change', e.detail.current)\n },\n onBannerClick(item, index) {\n this.$emit('banner-click', { item, index })\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.banner-section {\n padding: 30rpx;\n}\n\n.swiper {\n height: 300rpx;\n /* 通用指示器样式 - 覆盖所有可能的类名 */\n\n :deep([class*='swiper-dot']) {\n border-radius: 50% !important;\n transition: all 0.3s ease !important;\n }\n\n :deep([class*='swiper-dot-active']) {\n width: 82rpx !important;\n height: 14rpx;\n /* 选中时稍大 */\n }\n\n .swiper-item {\n display: block;\n height: 300rpx;\n line-height: 300rpx;\n text-align: center;\n\n image {\n width: 100%;\n height: 100%;\n border-radius: 20rpx;\n }\n }\n}\n</style>\n","import Component from 'D:/work/HBuilderProjects/HomeLease/components/banner-swiper/banner-swiper.vue'\nwx.createComponent(Component)"],"names":[],"mappings":";;AAwBA,MAAK,YAAU;AAAA,EACb,MAAM;AAAA,EACN,OAAO;AAAA,IACL,YAAY;AAAA,MACV,MAAM;AAAA,MACN,SAAS,MAAM,CAAE;AAAA,IAClB;AAAA,IACD,eAAe;AAAA,MACb,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA,IACD,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA,IACD,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA,IACD,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA,EACF;AAAA,EACD,SAAS;AAAA,IACP,eAAe,GAAG;AAChB,WAAK,MAAM,UAAU,EAAE,OAAO,OAAO;AAAA,IACtC;AAAA,IACD,cAAc,MAAM,OAAO;AACzB,WAAK,MAAM,gBAAgB,EAAE,MAAM,OAAO;AAAA,IAC3C;AAAA,EACF;AACH;;;;;;;;;;;;;;;;;ACvDA,GAAG,gBAAgB,SAAS;"}
|
||||
1
unpackage/dist/dev/.sourcemap/mp-weixin/components/bottom-nav/bottom-nav.js.map
vendored
Normal file
1
unpackage/dist/dev/.sourcemap/mp-weixin/components/bottom-nav/bottom-nav.js.map
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"bottom-nav.js","sources":["components/bottom-nav/bottom-nav.vue","C:/Users/Administrator/Downloads/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd29yay9IQnVpbGRlclByb2plY3RzL0hvbWVMZWFzZS9jb21wb25lbnRzL2JvdHRvbS1uYXYvYm90dG9tLW5hdi52dWU"],"sourcesContent":["<template>\n <view class=\"bottom-nav\">\n <view\n v-for=\"(nav, index) in navItems\"\n :key=\"index\"\n class=\"nav-item\"\n :class=\"{ active: index === activeIndex }\"\n @click=\"onNavClick(index)\"\n >\n <image class=\"nav-icon\" :src=\"getNavIcon(index)\" mode=\"aspectFit\"></image>\n <text class=\"nav-text\">{{ nav }}</text>\n </view>\n </view>\n</template>\n\n<script>\nexport default {\n name: 'BottomNav',\n props: {\n navItems: {\n type: Array,\n default: () => ['首页', '申请租赁', '个人中心'],\n },\n activeIndex: {\n type: Number,\n default: 0,\n },\n iconConfig: {\n type: Object,\n required: true,\n },\n },\n methods: {\n onNavClick(index) {\n this.$emit('nav-click', index)\n },\n\n getNavIcon(index) {\n const isActive = index === this.activeIndex\n const icons = this.iconConfig\n\n switch (index) {\n case 0: // 首页\n return isActive ? icons.HOME_ACTIVE : icons.HOME\n case 1: // 申请租赁\n return isActive ? icons.RENT_ACTIVE : icons.RENT\n case 2: // 个人中心\n return isActive ? icons.PERSONAL_CENTER_ACTIVE : icons.PERSONAL_CENTER\n default:\n return icons.HOME\n }\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.bottom-nav {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n background: #fff;\n display: flex;\n justify-content: space-around;\n align-items: center;\n padding: 20rpx 0;\n box-shadow: 0 -4rpx 20rpx rgba(0, 0, 0, 0.1);\n z-index: 1000;\n}\n\n.nav-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8rpx;\n padding: 10rpx;\n transition: all 0.3s ease;\n}\n\n.nav-item:active {\n transform: scale(0.95);\n}\n\n.nav-icon {\n width: 48rpx;\n height: 48rpx;\n}\n\n.nav-text {\n font-size: 20rpx;\n color: #999;\n}\n\n.nav-item.active .nav-text {\n color: #ff9a9e;\n}\n</style>\n","import Component from 'D:/work/HBuilderProjects/HomeLease/components/bottom-nav/bottom-nav.vue'\nwx.createComponent(Component)"],"names":[],"mappings":";;AAgBA,MAAK,YAAU;AAAA,EACb,MAAM;AAAA,EACN,OAAO;AAAA,IACL,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS,MAAM,CAAC,MAAM,QAAQ,MAAM;AAAA,IACrC;AAAA,IACD,aAAa;AAAA,MACX,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA,IACD,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,IACX;AAAA,EACF;AAAA,EACD,SAAS;AAAA,IACP,WAAW,OAAO;AAChB,WAAK,MAAM,aAAa,KAAK;AAAA,IAC9B;AAAA,IAED,WAAW,OAAO;AAChB,YAAM,WAAW,UAAU,KAAK;AAChC,YAAM,QAAQ,KAAK;AAEnB,cAAQ,OAAK;AAAA,QACX,KAAK;AACH,iBAAO,WAAW,MAAM,cAAc,MAAM;AAAA,QAC9C,KAAK;AACH,iBAAO,WAAW,MAAM,cAAc,MAAM;AAAA,QAC9C,KAAK;AACH,iBAAO,WAAW,MAAM,yBAAyB,MAAM;AAAA,QACzD;AACE,iBAAO,MAAM;AAAA,MACjB;AAAA,IACD;AAAA,EACF;AACH;;;;;;;;;;;;;;;ACpDA,GAAG,gBAAgB,SAAS;"}
|
||||
1
unpackage/dist/dev/.sourcemap/mp-weixin/components/equipment-list/equipment-list.js.map
vendored
Normal file
1
unpackage/dist/dev/.sourcemap/mp-weixin/components/equipment-list/equipment-list.js.map
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"equipment-list.js","sources":["components/equipment-list/equipment-list.vue","C:/Users/Administrator/Downloads/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd29yay9IQnVpbGRlclByb2plY3RzL0hvbWVMZWFzZS9jb21wb25lbnRzL2VxdWlwbWVudC1saXN0L2VxdWlwbWVudC1saXN0LnZ1ZQ"],"sourcesContent":["<template>\n <view class=\"equipment-section\">\n <view class=\"section-title\">{{ title }}</view>\n <view class=\"equipment-list\">\n <view\n v-for=\"equipment in equipmentList\"\n :key=\"equipment.id\"\n class=\"equipment-item\"\n @click=\"onEquipmentClick(equipment)\"\n >\n <image class=\"equipment-image\" :src=\"equipment.image\" mode=\"aspectFit\"></image>\n <view class=\"equipment-info\">\n <view class=\"equipment-header\">\n <text class=\"equipment-name\">{{ equipment.name }}</text>\n <text class=\"status-badge\" :class=\"equipment.status\">\n {{ getStatusText(equipment.status) }}\n </text>\n </view>\n <view class=\"equipment-details\">\n <view class=\"detail-item-row\">\n <text class=\"detail-item-time\">租赁时间:</text>\n <text class=\"detail-item\">{{ equipment.startTime }}</text>\n </view>\n <view class=\"detail-item-row\">\n <text class=\"detail-item-time\">到期时间:</text>\n <text class=\"detail-item\">{{ equipment.endTime }}</text>\n </view>\n </view>\n <button class=\"renew-btn\" @click.stop=\"onRenew(equipment)\">去续费</button>\n </view>\n </view>\n </view>\n </view>\n</template>\n\n<script>\nexport default {\n name: 'EquipmentList',\n props: {\n title: {\n type: String,\n default: '我的租赁设备',\n },\n equipmentList: {\n type: Array,\n default: () => [],\n },\n },\n methods: {\n getStatusText(status) {\n const statusMap = {\n normal: '正常',\n warning: '警告',\n error: '异常',\n }\n return statusMap[status] || '未知'\n },\n\n onEquipmentClick(equipment) {\n this.$emit('equipment-click', equipment)\n },\n\n onRenew(equipment) {\n this.$emit('renew', equipment)\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.equipment-section {\n padding: 0 30rpx;\n}\n\n.section-title {\n width: 180rpx;\n height: 33rpx;\n background: #ffffff;\n font-size: 14px;\n font-weight: 400;\n color: #3d3d3d;\n margin-bottom: 20rpx;\n padding: 14rpx 20rpx;\n border-radius: 4px;\n}\n\n.equipment-list {\n display: flex;\n flex-direction: column;\n gap: 20rpx;\n}\n\n.equipment-item {\n background: #fff;\n border-radius: 20rpx;\n padding: 30rpx;\n display: flex;\n gap: 30rpx;\n box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.1);\n transition: all 0.3s ease;\n justify-content: center;\n align-items: center;\n\n .equipment-image {\n width: 160rpx;\n height: 106rpx;\n border-radius: 10rpx;\n background-color: #f8f9fa;\n flex-shrink: 0;\n }\n}\n\n.equipment-item:active {\n transform: scale(0.98);\n box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.15);\n}\n\n.equipment-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n}\n\n.equipment-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 15rpx;\n}\n\n.equipment-name {\n font-size: 16px;\n font-weight: 500;\n color: #3d3d3d;\n}\n\n.status-badge {\n padding: 4rpx 26rpx;\n border-radius: 5rpx;\n font-size: 24rpx;\n color: #40c186;\n\n &.normal {\n background-color: #ebfff6;\n }\n\n &.warning {\n background-color: #faad14;\n }\n\n &.error {\n background-color: #ff4d4f;\n }\n}\n\n.equipment-details {\n display: flex;\n flex-direction: column;\n gap: 8rpx;\n margin-bottom: 15rpx;\n}\n\n.detail-item-row {\n display: flex;\n justify-content: space-between;\n\n .detail-item-time {\n color: #817f7f;\n font-size: 26rpx;\n }\n\n .detail-item {\n font-size: 24rpx;\n color: #666;\n }\n}\n\n.renew-btn {\n margin-right: 0;\n background: #f15a04;\n color: #fff;\n border-radius: 5px;\n padding: 0 57rpx;\n font-size: 32rpx;\n font-weight: 500;\n margin-top: 10rpx;\n}\n</style>\n","import Component from 'D:/work/HBuilderProjects/HomeLease/components/equipment-list/equipment-list.vue'\nwx.createComponent(Component)"],"names":[],"mappings":";;AAoCA,MAAK,YAAU;AAAA,EACb,MAAM;AAAA,EACN,OAAO;AAAA,IACL,OAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA,IACD,eAAe;AAAA,MACb,MAAM;AAAA,MACN,SAAS,MAAM,CAAE;AAAA,IAClB;AAAA,EACF;AAAA,EACD,SAAS;AAAA,IACP,cAAc,QAAQ;AACpB,YAAM,YAAY;AAAA,QAChB,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AACA,aAAO,UAAU,MAAM,KAAK;AAAA,IAC7B;AAAA,IAED,iBAAiB,WAAW;AAC1B,WAAK,MAAM,mBAAmB,SAAS;AAAA,IACxC;AAAA,IAED,QAAQ,WAAW;AACjB,WAAK,MAAM,SAAS,SAAS;AAAA,IAC9B;AAAA,EACF;AACH;;;;;;;;;;;;;;;;;;;;ACjEA,GAAG,gBAAgB,SAAS;"}
|
||||
1
unpackage/dist/dev/.sourcemap/mp-weixin/components/home-header/home-header.js.map
vendored
Normal file
1
unpackage/dist/dev/.sourcemap/mp-weixin/components/home-header/home-header.js.map
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"home-header.js","sources":["components/home-header/home-header.vue","C:/Users/Administrator/Downloads/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd29yay9IQnVpbGRlclByb2plY3RzL0hvbWVMZWFzZS9jb21wb25lbnRzL2hvbWUtaGVhZGVyL2hvbWUtaGVhZGVyLnZ1ZQ"],"sourcesContent":["<template>\n <view class=\"header\">\n <view class=\"location-info\" @click=\"onLocationClick\">\n <image class=\"location\" :src=\"locationIcon\"></image>\n <text class=\"company-name\">{{ companyName }}</text>\n <text class=\"arrow\">></text>\n </view>\n </view>\n</template>\n\n<script>\nexport default {\n name: 'HomeHeader',\n props: {\n companyName: {\n type: String,\n default: '福鼎创特物联科技有限公司',\n },\n locationIcon: {\n type: String,\n required: true,\n },\n },\n methods: {\n onLocationClick() {\n this.$emit('location-click')\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.header {\n padding: 106rpx 30rpx 20rpx 30rpx;\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: #ffddca;\n z-index: 999;\n\n .location-info {\n display: flex;\n align-items: center;\n gap: 10rpx;\n flex: 1;\n\n .location {\n width: 27rpx;\n height: 31rpx;\n }\n\n .company-name {\n color: #3d3d3d;\n font-size: 16px;\n font-weight: 500;\n }\n\n .arrow {\n font-size: 24rpx;\n color: #666;\n }\n }\n}\n</style>\n","import Component from 'D:/work/HBuilderProjects/HomeLease/components/home-header/home-header.vue'\nwx.createComponent(Component)"],"names":[],"mappings":";;AAWA,MAAK,YAAU;AAAA,EACb,MAAM;AAAA,EACN,OAAO;AAAA,IACL,aAAa;AAAA,MACX,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA,IACD,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,UAAU;AAAA,IACX;AAAA,EACF;AAAA,EACD,SAAS;AAAA,IACP,kBAAkB;AAChB,WAAK,MAAM,gBAAgB;AAAA,IAC5B;AAAA,EACF;AACH;;;;;;;;;AC3BA,GAAG,gBAAgB,SAAS;"}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
5
unpackage/dist/dev/mp-weixin/app.json
vendored
5
unpackage/dist/dev/mp-weixin/app.json
vendored
|
|
@ -1,8 +1,5 @@
|
|||
{
|
||||
"pages": [
|
||||
"pages/index/index",
|
||||
"pages/login/login"
|
||||
],
|
||||
"pages": ["pages/index/index", "pages/login/login"],
|
||||
"window": {
|
||||
"navigationBarTextStyle": "black",
|
||||
"navigationBarTitleText": "设备租赁",
|
||||
|
|
|
|||
2
unpackage/dist/dev/mp-weixin/app.wxss
vendored
2
unpackage/dist/dev/mp-weixin/app.wxss
vendored
|
|
@ -1,3 +1,3 @@
|
|||
|
||||
/*每个页面公共css */
|
||||
/*每个页面公共css */
|
||||
page{--status-bar-height:25px;--top-window-height:0px;--window-top:0px;--window-bottom:0px;--window-left:0px;--window-right:0px;--window-magin:0px}[data-c-h="true"]{display: none !important;}
|
||||
30
unpackage/dist/dev/mp-weixin/components/announcement-bar/announcement-bar.js
vendored
Normal file
30
unpackage/dist/dev/mp-weixin/components/announcement-bar/announcement-bar.js
vendored
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
"use strict";
|
||||
const common_vendor = require("../../common/vendor.js");
|
||||
const _sfc_main = {
|
||||
name: "AnnouncementBar",
|
||||
props: {
|
||||
announcementText: {
|
||||
type: String,
|
||||
default: "暂无更多公告! 暂无更多公告! 暂无更多公告!"
|
||||
},
|
||||
announcementIcon: {
|
||||
type: String,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onAnnouncementClick() {
|
||||
this.$emit("announcement-click");
|
||||
}
|
||||
}
|
||||
};
|
||||
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
||||
return {
|
||||
a: $props.announcementIcon,
|
||||
b: common_vendor.t($props.announcementText),
|
||||
c: common_vendor.o((...args) => $options.onAnnouncementClick && $options.onAnnouncementClick(...args))
|
||||
};
|
||||
}
|
||||
const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-3c038241"]]);
|
||||
wx.createComponent(Component);
|
||||
//# sourceMappingURL=../../../.sourcemap/mp-weixin/components/announcement-bar/announcement-bar.js.map
|
||||
4
unpackage/dist/dev/mp-weixin/components/announcement-bar/announcement-bar.json
vendored
Normal file
4
unpackage/dist/dev/mp-weixin/components/announcement-bar/announcement-bar.json
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"component": true,
|
||||
"usingComponents": {}
|
||||
}
|
||||
1
unpackage/dist/dev/mp-weixin/components/announcement-bar/announcement-bar.wxml
vendored
Normal file
1
unpackage/dist/dev/mp-weixin/components/announcement-bar/announcement-bar.wxml
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
<view class="announcement-bar data-v-3c038241" bindtap="{{c}}"><image class="announcementIcon data-v-3c038241" src="{{a}}"></image><view class="announcement-box data-v-3c038241"><text class="announcement-text data-v-3c038241">{{b}}</text></view></view>
|
||||
64
unpackage/dist/dev/mp-weixin/components/announcement-bar/announcement-bar.wxss
vendored
Normal file
64
unpackage/dist/dev/mp-weixin/components/announcement-bar/announcement-bar.wxss
vendored
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
/**
|
||||
* 这里是uni-app内置的常用样式变量
|
||||
*
|
||||
* uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
|
||||
* 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
|
||||
*
|
||||
* 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
|
||||
*/
|
||||
/* 颜色变量 */
|
||||
/* 行为相关颜色 */
|
||||
/* 文字基本颜色 */
|
||||
/* 背景颜色 */
|
||||
/* 边框颜色 */
|
||||
/* 尺寸变量 */
|
||||
/* 文字尺寸 */
|
||||
/* 图片尺寸 */
|
||||
/* Border Radius */
|
||||
/* 水平间距 */
|
||||
/* 垂直间距 */
|
||||
/* 透明度 */
|
||||
/* 文章场景相关 */
|
||||
.announcement-bar.data-v-3c038241 {
|
||||
background: white;
|
||||
opacity: 0.5;
|
||||
margin: 34rpx 19rpx 0 19rpx;
|
||||
padding: 15rpx 30rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 15rpx;
|
||||
overflow: hidden;
|
||||
height: 34rpx;
|
||||
border-radius: 100rpx;
|
||||
}
|
||||
.announcement-bar .announcementIcon.data-v-3c038241 {
|
||||
height: 32rpx;
|
||||
width: 32rpx;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.announcement-bar .announcement-box.data-v-3c038241 {
|
||||
flex: 1;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
}
|
||||
.announcement-bar .announcement-box .announcement-text.data-v-3c038241 {
|
||||
font-size: 13px;
|
||||
opacity: 1;
|
||||
color: black;
|
||||
white-space: nowrap;
|
||||
animation: scroll-text-3c038241 10s linear infinite;
|
||||
display: inline-block;
|
||||
padding-left: 100%;
|
||||
}
|
||||
@keyframes scroll-text-3c038241 {
|
||||
0% {
|
||||
transform: translateX(0);
|
||||
}
|
||||
100% {
|
||||
transform: translateX(-100%);
|
||||
}
|
||||
}
|
||||
53
unpackage/dist/dev/mp-weixin/components/banner-swiper/banner-swiper.js
vendored
Normal file
53
unpackage/dist/dev/mp-weixin/components/banner-swiper/banner-swiper.js
vendored
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
"use strict";
|
||||
const common_vendor = require("../../common/vendor.js");
|
||||
const _sfc_main = {
|
||||
name: "BannerSwiper",
|
||||
props: {
|
||||
bannerList: {
|
||||
type: Array,
|
||||
default: () => []
|
||||
},
|
||||
indicatorDots: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
autoplay: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
interval: {
|
||||
type: Number,
|
||||
default: 2e3
|
||||
},
|
||||
duration: {
|
||||
type: Number,
|
||||
default: 500
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onSwiperChange(e) {
|
||||
this.$emit("change", e.detail.current);
|
||||
},
|
||||
onBannerClick(item, index) {
|
||||
this.$emit("banner-click", { item, index });
|
||||
}
|
||||
}
|
||||
};
|
||||
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
||||
return {
|
||||
a: common_vendor.f($props.bannerList, (item, index, i0) => {
|
||||
return {
|
||||
a: item.image,
|
||||
b: index,
|
||||
c: common_vendor.o(($event) => $options.onBannerClick(item, index), index)
|
||||
};
|
||||
}),
|
||||
b: $props.autoplay,
|
||||
c: $props.duration,
|
||||
d: $props.indicatorDots,
|
||||
e: $props.interval
|
||||
};
|
||||
}
|
||||
const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-f6b62634"]]);
|
||||
wx.createComponent(Component);
|
||||
//# sourceMappingURL=../../../.sourcemap/mp-weixin/components/banner-swiper/banner-swiper.js.map
|
||||
4
unpackage/dist/dev/mp-weixin/components/banner-swiper/banner-swiper.json
vendored
Normal file
4
unpackage/dist/dev/mp-weixin/components/banner-swiper/banner-swiper.json
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"component": true,
|
||||
"usingComponents": {}
|
||||
}
|
||||
1
unpackage/dist/dev/mp-weixin/components/banner-swiper/banner-swiper.wxml
vendored
Normal file
1
unpackage/dist/dev/mp-weixin/components/banner-swiper/banner-swiper.wxml
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
<view class="banner-section data-v-f6b62634"><swiper autoplay="{{b}}" duration="{{c}}" indicator-dots="{{d}}" interval="{{e}}" circular class="swiper data-v-f6b62634" indicator-active-color="#FFFFFF" indicator-color="rgba(255, 255, 255, 0.5)"><swiper-item wx:for="{{a}}" wx:for-item="item" wx:key="b" class="data-v-f6b62634" bindtap="{{item.c}}"><image class="data-v-f6b62634" src="{{item.a}}" mode="aspectFill"></image></swiper-item></swiper></view>
|
||||
52
unpackage/dist/dev/mp-weixin/components/banner-swiper/banner-swiper.wxss
vendored
Normal file
52
unpackage/dist/dev/mp-weixin/components/banner-swiper/banner-swiper.wxss
vendored
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
/**
|
||||
* 这里是uni-app内置的常用样式变量
|
||||
*
|
||||
* uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
|
||||
* 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
|
||||
*
|
||||
* 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
|
||||
*/
|
||||
/* 颜色变量 */
|
||||
/* 行为相关颜色 */
|
||||
/* 文字基本颜色 */
|
||||
/* 背景颜色 */
|
||||
/* 边框颜色 */
|
||||
/* 尺寸变量 */
|
||||
/* 文字尺寸 */
|
||||
/* 图片尺寸 */
|
||||
/* Border Radius */
|
||||
/* 水平间距 */
|
||||
/* 垂直间距 */
|
||||
/* 透明度 */
|
||||
/* 文章场景相关 */
|
||||
.banner-section.data-v-f6b62634 {
|
||||
padding: 30rpx;
|
||||
}
|
||||
.swiper.data-v-f6b62634 {
|
||||
height: 300rpx;
|
||||
/* 通用指示器样式 - 覆盖所有可能的类名 */
|
||||
}
|
||||
.swiper.data-v-f6b62634 [class*="swiper-dot"] {
|
||||
border-radius: 50% !important;
|
||||
transition: all 0.3s ease !important;
|
||||
}
|
||||
.swiper.data-v-f6b62634 [class*="swiper-dot-active"] {
|
||||
width: 82rpx !important;
|
||||
height: 14rpx;
|
||||
/* 选中时稍大 */
|
||||
}
|
||||
.swiper .swiper-item.data-v-f6b62634 {
|
||||
display: block;
|
||||
height: 300rpx;
|
||||
line-height: 300rpx;
|
||||
text-align: center;
|
||||
}
|
||||
.swiper .swiper-item image.data-v-f6b62634 {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-radius: 20rpx;
|
||||
}
|
||||
54
unpackage/dist/dev/mp-weixin/components/bottom-nav/bottom-nav.js
vendored
Normal file
54
unpackage/dist/dev/mp-weixin/components/bottom-nav/bottom-nav.js
vendored
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
"use strict";
|
||||
const common_vendor = require("../../common/vendor.js");
|
||||
const _sfc_main = {
|
||||
name: "BottomNav",
|
||||
props: {
|
||||
navItems: {
|
||||
type: Array,
|
||||
default: () => ["首页", "申请租赁", "个人中心"]
|
||||
},
|
||||
activeIndex: {
|
||||
type: Number,
|
||||
default: 0
|
||||
},
|
||||
iconConfig: {
|
||||
type: Object,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onNavClick(index) {
|
||||
this.$emit("nav-click", index);
|
||||
},
|
||||
getNavIcon(index) {
|
||||
const isActive = index === this.activeIndex;
|
||||
const icons = this.iconConfig;
|
||||
switch (index) {
|
||||
case 0:
|
||||
return isActive ? icons.HOME_ACTIVE : icons.HOME;
|
||||
case 1:
|
||||
return isActive ? icons.RENT_ACTIVE : icons.RENT;
|
||||
case 2:
|
||||
return isActive ? icons.PERSONAL_CENTER_ACTIVE : icons.PERSONAL_CENTER;
|
||||
default:
|
||||
return icons.HOME;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
||||
return {
|
||||
a: common_vendor.f($props.navItems, (nav, index, i0) => {
|
||||
return {
|
||||
a: $options.getNavIcon(index),
|
||||
b: common_vendor.t(nav),
|
||||
c: index,
|
||||
d: index === $props.activeIndex ? 1 : "",
|
||||
e: common_vendor.o(($event) => $options.onNavClick(index), index)
|
||||
};
|
||||
})
|
||||
};
|
||||
}
|
||||
const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-55d8123a"]]);
|
||||
wx.createComponent(Component);
|
||||
//# sourceMappingURL=../../../.sourcemap/mp-weixin/components/bottom-nav/bottom-nav.js.map
|
||||
4
unpackage/dist/dev/mp-weixin/components/bottom-nav/bottom-nav.json
vendored
Normal file
4
unpackage/dist/dev/mp-weixin/components/bottom-nav/bottom-nav.json
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"component": true,
|
||||
"usingComponents": {}
|
||||
}
|
||||
1
unpackage/dist/dev/mp-weixin/components/bottom-nav/bottom-nav.wxml
vendored
Normal file
1
unpackage/dist/dev/mp-weixin/components/bottom-nav/bottom-nav.wxml
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
<view class="bottom-nav data-v-55d8123a"><view wx:for="{{a}}" wx:for-item="nav" wx:key="c" class="{{['nav-item', 'data-v-55d8123a', nav.d && 'active']}}" bindtap="{{nav.e}}"><image class="nav-icon data-v-55d8123a" src="{{nav.a}}" mode="aspectFit"></image><text class="nav-text data-v-55d8123a">{{nav.b}}</text></view></view>
|
||||
60
unpackage/dist/dev/mp-weixin/components/bottom-nav/bottom-nav.wxss
vendored
Normal file
60
unpackage/dist/dev/mp-weixin/components/bottom-nav/bottom-nav.wxss
vendored
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
/**
|
||||
* 这里是uni-app内置的常用样式变量
|
||||
*
|
||||
* uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
|
||||
* 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
|
||||
*
|
||||
* 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
|
||||
*/
|
||||
/* 颜色变量 */
|
||||
/* 行为相关颜色 */
|
||||
/* 文字基本颜色 */
|
||||
/* 背景颜色 */
|
||||
/* 边框颜色 */
|
||||
/* 尺寸变量 */
|
||||
/* 文字尺寸 */
|
||||
/* 图片尺寸 */
|
||||
/* Border Radius */
|
||||
/* 水平间距 */
|
||||
/* 垂直间距 */
|
||||
/* 透明度 */
|
||||
/* 文章场景相关 */
|
||||
.bottom-nav.data-v-55d8123a {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
background: #fff;
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
padding: 20rpx 0;
|
||||
box-shadow: 0 -4rpx 20rpx rgba(0, 0, 0, 0.1);
|
||||
z-index: 1000;
|
||||
}
|
||||
.nav-item.data-v-55d8123a {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 8rpx;
|
||||
padding: 10rpx;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
.nav-item.data-v-55d8123a:active {
|
||||
transform: scale(0.95);
|
||||
}
|
||||
.nav-icon.data-v-55d8123a {
|
||||
width: 48rpx;
|
||||
height: 48rpx;
|
||||
}
|
||||
.nav-text.data-v-55d8123a {
|
||||
font-size: 20rpx;
|
||||
color: #999;
|
||||
}
|
||||
.nav-item.active .nav-text.data-v-55d8123a {
|
||||
color: #ff9a9e;
|
||||
}
|
||||
52
unpackage/dist/dev/mp-weixin/components/equipment-list/equipment-list.js
vendored
Normal file
52
unpackage/dist/dev/mp-weixin/components/equipment-list/equipment-list.js
vendored
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
"use strict";
|
||||
const common_vendor = require("../../common/vendor.js");
|
||||
const _sfc_main = {
|
||||
name: "EquipmentList",
|
||||
props: {
|
||||
title: {
|
||||
type: String,
|
||||
default: "我的租赁设备"
|
||||
},
|
||||
equipmentList: {
|
||||
type: Array,
|
||||
default: () => []
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
getStatusText(status) {
|
||||
const statusMap = {
|
||||
normal: "正常",
|
||||
warning: "警告",
|
||||
error: "异常"
|
||||
};
|
||||
return statusMap[status] || "未知";
|
||||
},
|
||||
onEquipmentClick(equipment) {
|
||||
this.$emit("equipment-click", equipment);
|
||||
},
|
||||
onRenew(equipment) {
|
||||
this.$emit("renew", equipment);
|
||||
}
|
||||
}
|
||||
};
|
||||
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
||||
return {
|
||||
a: common_vendor.t($props.title),
|
||||
b: common_vendor.f($props.equipmentList, (equipment, k0, i0) => {
|
||||
return {
|
||||
a: equipment.image,
|
||||
b: common_vendor.t(equipment.name),
|
||||
c: common_vendor.t($options.getStatusText(equipment.status)),
|
||||
d: common_vendor.n(equipment.status),
|
||||
e: common_vendor.t(equipment.startTime),
|
||||
f: common_vendor.t(equipment.endTime),
|
||||
g: common_vendor.o(($event) => $options.onRenew(equipment), equipment.id),
|
||||
h: equipment.id,
|
||||
i: common_vendor.o(($event) => $options.onEquipmentClick(equipment), equipment.id)
|
||||
};
|
||||
})
|
||||
};
|
||||
}
|
||||
const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-401af284"]]);
|
||||
wx.createComponent(Component);
|
||||
//# sourceMappingURL=../../../.sourcemap/mp-weixin/components/equipment-list/equipment-list.js.map
|
||||
4
unpackage/dist/dev/mp-weixin/components/equipment-list/equipment-list.json
vendored
Normal file
4
unpackage/dist/dev/mp-weixin/components/equipment-list/equipment-list.json
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"component": true,
|
||||
"usingComponents": {}
|
||||
}
|
||||
1
unpackage/dist/dev/mp-weixin/components/equipment-list/equipment-list.wxml
vendored
Normal file
1
unpackage/dist/dev/mp-weixin/components/equipment-list/equipment-list.wxml
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
<view class="equipment-section data-v-401af284"><view class="section-title data-v-401af284">{{a}}</view><view class="equipment-list data-v-401af284"><view wx:for="{{b}}" wx:for-item="equipment" wx:key="h" class="equipment-item data-v-401af284" bindtap="{{equipment.i}}"><image class="equipment-image data-v-401af284" src="{{equipment.a}}" mode="aspectFit"></image><view class="equipment-info data-v-401af284"><view class="equipment-header data-v-401af284"><text class="equipment-name data-v-401af284">{{equipment.b}}</text><text class="{{['status-badge', 'data-v-401af284', equipment.d]}}">{{equipment.c}}</text></view><view class="equipment-details data-v-401af284"><view class="detail-item-row data-v-401af284"><text class="detail-item-time data-v-401af284">租赁时间:</text><text class="detail-item data-v-401af284">{{equipment.e}}</text></view><view class="detail-item-row data-v-401af284"><text class="detail-item-time data-v-401af284">到期时间:</text><text class="detail-item data-v-401af284">{{equipment.f}}</text></view></view><button class="renew-btn data-v-401af284" catchtap="{{equipment.g}}">去续费</button></view></view></view></view>
|
||||
126
unpackage/dist/dev/mp-weixin/components/equipment-list/equipment-list.wxss
vendored
Normal file
126
unpackage/dist/dev/mp-weixin/components/equipment-list/equipment-list.wxss
vendored
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
/**
|
||||
* 这里是uni-app内置的常用样式变量
|
||||
*
|
||||
* uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
|
||||
* 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
|
||||
*
|
||||
* 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
|
||||
*/
|
||||
/* 颜色变量 */
|
||||
/* 行为相关颜色 */
|
||||
/* 文字基本颜色 */
|
||||
/* 背景颜色 */
|
||||
/* 边框颜色 */
|
||||
/* 尺寸变量 */
|
||||
/* 文字尺寸 */
|
||||
/* 图片尺寸 */
|
||||
/* Border Radius */
|
||||
/* 水平间距 */
|
||||
/* 垂直间距 */
|
||||
/* 透明度 */
|
||||
/* 文章场景相关 */
|
||||
.equipment-section.data-v-401af284 {
|
||||
padding: 0 30rpx;
|
||||
}
|
||||
.section-title.data-v-401af284 {
|
||||
width: 180rpx;
|
||||
height: 33rpx;
|
||||
background: #ffffff;
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
color: #3d3d3d;
|
||||
margin-bottom: 20rpx;
|
||||
padding: 14rpx 20rpx;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.equipment-list.data-v-401af284 {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 20rpx;
|
||||
}
|
||||
.equipment-item.data-v-401af284 {
|
||||
background: #fff;
|
||||
border-radius: 20rpx;
|
||||
padding: 30rpx;
|
||||
display: flex;
|
||||
gap: 30rpx;
|
||||
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.1);
|
||||
transition: all 0.3s ease;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
.equipment-item .equipment-image.data-v-401af284 {
|
||||
width: 160rpx;
|
||||
height: 106rpx;
|
||||
border-radius: 10rpx;
|
||||
background-color: #f8f9fa;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.equipment-item.data-v-401af284:active {
|
||||
transform: scale(0.98);
|
||||
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
.equipment-info.data-v-401af284 {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
}
|
||||
.equipment-header.data-v-401af284 {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 15rpx;
|
||||
}
|
||||
.equipment-name.data-v-401af284 {
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
color: #3d3d3d;
|
||||
}
|
||||
.status-badge.data-v-401af284 {
|
||||
padding: 4rpx 26rpx;
|
||||
border-radius: 5rpx;
|
||||
font-size: 24rpx;
|
||||
color: #40c186;
|
||||
}
|
||||
.status-badge.normal.data-v-401af284 {
|
||||
background-color: #ebfff6;
|
||||
}
|
||||
.status-badge.warning.data-v-401af284 {
|
||||
background-color: #faad14;
|
||||
}
|
||||
.status-badge.error.data-v-401af284 {
|
||||
background-color: #ff4d4f;
|
||||
}
|
||||
.equipment-details.data-v-401af284 {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8rpx;
|
||||
margin-bottom: 15rpx;
|
||||
}
|
||||
.detail-item-row.data-v-401af284 {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
.detail-item-row .detail-item-time.data-v-401af284 {
|
||||
color: #817f7f;
|
||||
font-size: 26rpx;
|
||||
}
|
||||
.detail-item-row .detail-item.data-v-401af284 {
|
||||
font-size: 24rpx;
|
||||
color: #666;
|
||||
}
|
||||
.renew-btn.data-v-401af284 {
|
||||
margin-right: 0;
|
||||
background: #f15a04;
|
||||
color: #fff;
|
||||
border-radius: 5px;
|
||||
padding: 0 57rpx;
|
||||
font-size: 32rpx;
|
||||
font-weight: 500;
|
||||
margin-top: 10rpx;
|
||||
}
|
||||
30
unpackage/dist/dev/mp-weixin/components/home-header/home-header.js
vendored
Normal file
30
unpackage/dist/dev/mp-weixin/components/home-header/home-header.js
vendored
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
"use strict";
|
||||
const common_vendor = require("../../common/vendor.js");
|
||||
const _sfc_main = {
|
||||
name: "HomeHeader",
|
||||
props: {
|
||||
companyName: {
|
||||
type: String,
|
||||
default: "福鼎创特物联科技有限公司"
|
||||
},
|
||||
locationIcon: {
|
||||
type: String,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onLocationClick() {
|
||||
this.$emit("location-click");
|
||||
}
|
||||
}
|
||||
};
|
||||
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
||||
return {
|
||||
a: $props.locationIcon,
|
||||
b: common_vendor.t($props.companyName),
|
||||
c: common_vendor.o((...args) => $options.onLocationClick && $options.onLocationClick(...args))
|
||||
};
|
||||
}
|
||||
const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-e1c5b648"]]);
|
||||
wx.createComponent(Component);
|
||||
//# sourceMappingURL=../../../.sourcemap/mp-weixin/components/home-header/home-header.js.map
|
||||
4
unpackage/dist/dev/mp-weixin/components/home-header/home-header.json
vendored
Normal file
4
unpackage/dist/dev/mp-weixin/components/home-header/home-header.json
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"component": true,
|
||||
"usingComponents": {}
|
||||
}
|
||||
1
unpackage/dist/dev/mp-weixin/components/home-header/home-header.wxml
vendored
Normal file
1
unpackage/dist/dev/mp-weixin/components/home-header/home-header.wxml
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
<view class="header data-v-e1c5b648"><view class="location-info data-v-e1c5b648" bindtap="{{c}}"><image class="location data-v-e1c5b648" src="{{a}}"></image><text class="company-name data-v-e1c5b648">{{b}}</text><text class="arrow data-v-e1c5b648">></text></view></view>
|
||||
52
unpackage/dist/dev/mp-weixin/components/home-header/home-header.wxss
vendored
Normal file
52
unpackage/dist/dev/mp-weixin/components/home-header/home-header.wxss
vendored
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
/**
|
||||
* 这里是uni-app内置的常用样式变量
|
||||
*
|
||||
* uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
|
||||
* 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
|
||||
*
|
||||
* 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
|
||||
*/
|
||||
/* 颜色变量 */
|
||||
/* 行为相关颜色 */
|
||||
/* 文字基本颜色 */
|
||||
/* 背景颜色 */
|
||||
/* 边框颜色 */
|
||||
/* 尺寸变量 */
|
||||
/* 文字尺寸 */
|
||||
/* 图片尺寸 */
|
||||
/* Border Radius */
|
||||
/* 水平间距 */
|
||||
/* 垂直间距 */
|
||||
/* 透明度 */
|
||||
/* 文章场景相关 */
|
||||
.header.data-v-e1c5b648 {
|
||||
padding: 106rpx 30rpx 20rpx 30rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
background: #ffddca;
|
||||
z-index: 999;
|
||||
}
|
||||
.header .location-info.data-v-e1c5b648 {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10rpx;
|
||||
flex: 1;
|
||||
}
|
||||
.header .location-info .location.data-v-e1c5b648 {
|
||||
width: 27rpx;
|
||||
height: 31rpx;
|
||||
}
|
||||
.header .location-info .company-name.data-v-e1c5b648 {
|
||||
color: #3d3d3d;
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
}
|
||||
.header .location-info .arrow.data-v-e1c5b648 {
|
||||
font-size: 24rpx;
|
||||
color: #666;
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user